mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-20 02:08:47 +00:00
@@ -338,23 +338,8 @@ export default tseslint.config(
|
||||
'src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts',
|
||||
'src/vs/workbench/contrib/tasks/browser/taskTerminalStatus.ts',
|
||||
'src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBufferProvider.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/chat/browser/terminal.initialHint.contribution.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/commandLineAutoApprover.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/taskHelpers.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/toolTerminalCreator.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/outputMonitor.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/commandGuide/browser/terminal.commandGuide.contribution.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/history/browser/terminalRunRecentQuickPick.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/links/test/browser/linkTestUtils.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/sendSequence/browser/terminal.sendSequence.contribution.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/sendSignal/browser/terminal.sendSignal.contribution.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts',
|
||||
'src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts',
|
||||
'src/vs/workbench/contrib/testing/browser/explorerProjections/listProjection.ts',
|
||||
'src/vs/workbench/contrib/testing/browser/explorerProjections/treeProjection.ts',
|
||||
'src/vs/workbench/contrib/testing/browser/testCoverageBars.ts',
|
||||
|
||||
@@ -19,7 +19,7 @@ import { ContextKeyExpr, IContextKeyService } from '../../../../../platform/cont
|
||||
import { IInstantiationService, ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js';
|
||||
import { KeybindingWeight } from '../../../../../platform/keybinding/common/keybindingsRegistry.js';
|
||||
import { ITerminalCommand, TerminalCapability } from '../../../../../platform/terminal/common/capabilities/capabilities.js';
|
||||
import { ICurrentPartialCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
|
||||
import { ICurrentPartialCommand, isFullTerminalCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
|
||||
import { TerminalSettingId } from '../../../../../platform/terminal/common/terminal.js';
|
||||
import { accessibleViewCurrentProviderId, accessibleViewIsShown } from '../../../accessibility/browser/accessibilityConfiguration.js';
|
||||
import { AccessibilityHelpAction, AccessibleViewAction } from '../../../accessibility/browser/accessibleViewActions.js';
|
||||
@@ -226,9 +226,9 @@ export class TerminalAccessibleViewContribution extends Disposable implements IT
|
||||
return;
|
||||
}
|
||||
let line: number | undefined;
|
||||
if ('marker' in command) {
|
||||
if (isFullTerminalCommand(command)) {
|
||||
line = command.marker?.line;
|
||||
} else if ('commandStartMarker' in command) {
|
||||
} else {
|
||||
line = command.commandStartMarker?.line;
|
||||
}
|
||||
if (line === undefined || line < 0) {
|
||||
|
||||
@@ -8,7 +8,7 @@ import { Disposable } from '../../../../../base/common/lifecycle.js';
|
||||
import { IAccessibleViewContentProvider, AccessibleViewProviderId, IAccessibleViewOptions, AccessibleViewType, IAccessibleViewSymbol } from '../../../../../platform/accessibility/browser/accessibleView.js';
|
||||
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
|
||||
import { TerminalCapability, ITerminalCommand } from '../../../../../platform/terminal/common/capabilities/capabilities.js';
|
||||
import { ICurrentPartialCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
|
||||
import { ICurrentPartialCommand, isFullTerminalCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
|
||||
import { AccessibilityVerbositySettingId } from '../../../accessibility/browser/accessibilityConfiguration.js';
|
||||
import { ITerminalInstance, ITerminalService } from '../../../terminal/browser/terminal.js';
|
||||
import { BufferContentTracker } from './bufferContentTracker.js';
|
||||
@@ -98,9 +98,9 @@ export class TerminalAccessibleBufferProvider extends Disposable implements IAcc
|
||||
}
|
||||
private _getEditorLineForCommand(command: ITerminalCommand | ICurrentPartialCommand): number | undefined {
|
||||
let line: number | undefined;
|
||||
if ('marker' in command) {
|
||||
if (isFullTerminalCommand(command)) {
|
||||
line = command.marker?.line;
|
||||
} else if ('commandStartMarker' in command) {
|
||||
} else {
|
||||
line = command.commandStartMarker?.line;
|
||||
}
|
||||
if (line === undefined || line < 0) {
|
||||
|
||||
@@ -30,6 +30,7 @@ import { TerminalInstance } from '../../../terminal/browser/terminalInstance.js'
|
||||
import { TerminalInitialHintSettingId } from '../common/terminalInitialHintConfiguration.js';
|
||||
import './media/terminalInitialHint.css';
|
||||
import { TerminalChatCommandId } from './terminalChat.js';
|
||||
import { hasKey } from '../../../../../base/common/types.js';
|
||||
|
||||
const $ = dom.$;
|
||||
|
||||
@@ -107,7 +108,7 @@ export class TerminalInitialHintContribution extends Disposable implements ITerm
|
||||
|
||||
xtermOpen(xterm: IXtermTerminal & { raw: RawXtermTerminal }): void {
|
||||
// Don't show is the terminal was launched by an extension or a feature like debug
|
||||
if ('shellLaunchConfig' in this._ctx.instance && (this._ctx.instance.shellLaunchConfig.isExtensionOwnedTerminal || this._ctx.instance.shellLaunchConfig.isFeatureTerminal)) {
|
||||
if (hasKey(this._ctx.instance, { shellLaunchConfig: true }) && (this._ctx.instance.shellLaunchConfig.isExtensionOwnedTerminal || this._ctx.instance.shellLaunchConfig.isFeatureTerminal)) {
|
||||
return;
|
||||
}
|
||||
// Don't show if disabled
|
||||
|
||||
@@ -54,19 +54,25 @@ registerActiveXtermAction({
|
||||
}
|
||||
|
||||
const contr = TerminalChatController.activeChatController || TerminalChatController.get(activeInstance);
|
||||
if (!contr) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (opts) {
|
||||
function isValidOptionsObject(obj: unknown): obj is { query: string; isPartialQuery?: boolean } {
|
||||
return typeof obj === 'object' && obj !== null && 'query' in obj && typeof obj.query === 'string';
|
||||
}
|
||||
opts = typeof opts === 'string' ? { query: opts } : opts;
|
||||
if (typeof opts === 'object' && opts !== null && 'query' in opts && typeof opts.query === 'string') {
|
||||
contr?.updateInput(opts.query, false);
|
||||
if (!('isPartialQuery' in opts && opts.isPartialQuery)) {
|
||||
contr?.terminalChatWidget?.acceptInput();
|
||||
if (isValidOptionsObject(opts)) {
|
||||
contr.updateInput(opts.query, false);
|
||||
if (opts.isPartialQuery) {
|
||||
contr.terminalChatWidget?.acceptInput();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
contr?.terminalChatWidget?.reveal();
|
||||
contr.terminalChatWidget?.reveal();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -187,13 +187,13 @@ export class CommandLineAutoApprover extends Disposable {
|
||||
const defaultValue = configInspectValue?.default?.value;
|
||||
const isDefaultRule = !!(
|
||||
isObject(defaultValue) &&
|
||||
key in defaultValue &&
|
||||
Object.prototype.hasOwnProperty.call(defaultValue, key) &&
|
||||
structuralEquals((defaultValue as Record<string, unknown>)[key], value)
|
||||
);
|
||||
function checkTarget(inspectValue: Readonly<unknown> | undefined): boolean {
|
||||
return (
|
||||
isObject(inspectValue) &&
|
||||
key in inspectValue &&
|
||||
Object.prototype.hasOwnProperty.call(inspectValue, key) &&
|
||||
structuralEquals((inspectValue as Record<string, unknown>)[key], value)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import { CancellationError } from '../../../../../base/common/errors.js';
|
||||
import { Event } from '../../../../../base/common/event.js';
|
||||
import { DisposableStore, MutableDisposable } from '../../../../../base/common/lifecycle.js';
|
||||
import { ThemeIcon } from '../../../../../base/common/themables.js';
|
||||
import { isNumber, isObject } from '../../../../../base/common/types.js';
|
||||
import { hasKey, isNumber, isObject } from '../../../../../base/common/types.js';
|
||||
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
|
||||
import { TerminalCapability } from '../../../../../platform/terminal/common/capabilities/capabilities.js';
|
||||
import { PromptInputState } from '../../../../../platform/terminal/common/capabilities/commandDetection/promptInputModel.js';
|
||||
@@ -63,7 +63,7 @@ export class ToolTerminalCreator {
|
||||
instance.processReady.then(() => processReadyTimestamp = Date.now()),
|
||||
Event.toPromise(instance.onExit),
|
||||
]);
|
||||
if (!isNumber(initResult) && isObject(initResult) && 'message' in initResult) {
|
||||
if (!isNumber(initResult) && isObject(initResult) && hasKey(initResult, { message: true })) {
|
||||
throw new Error(initResult.message);
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ import { PANEL_BORDER } from '../../../../common/theme.js';
|
||||
import { IDetachedTerminalInstance, ITerminalContribution, ITerminalInstance, IXtermTerminal } from '../../../terminal/browser/terminal.js';
|
||||
import { registerTerminalContribution, type IDetachedCompatibleTerminalContributionContext, type ITerminalContributionContext } from '../../../terminal/browser/terminalExtensions.js';
|
||||
import { terminalCommandGuideConfigSection, TerminalCommandGuideSettingId, type ITerminalCommandGuideConfiguration } from '../common/terminalCommandGuideConfiguration.js';
|
||||
import { isFullTerminalCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
|
||||
|
||||
// #region Terminal Contributions
|
||||
|
||||
@@ -80,7 +81,7 @@ class TerminalCommandGuideContribution extends Disposable implements ITerminalCo
|
||||
}
|
||||
const mouseCursorY = Math.floor((e.clientY - rect.top) / (rect.height / xterm.raw.rows));
|
||||
const command = this._ctx.instance.capabilities.get(TerminalCapability.CommandDetection)?.getCommandForLine(xterm.raw.buffer.active.viewportY + mouseCursorY);
|
||||
if (command && 'getOutput' in command) {
|
||||
if (command && isFullTerminalCommand(command)) {
|
||||
xterm.markTracker.showCommandGuide(command);
|
||||
} else {
|
||||
xterm.markTracker.showCommandGuide(undefined);
|
||||
|
||||
@@ -31,6 +31,7 @@ import { getCommandHistory, getDirectoryHistory, getShellFileHistory } from '../
|
||||
import { ResourceSet } from '../../../../../base/common/map.js';
|
||||
import { extUri, extUriIgnorePathCase } from '../../../../../base/common/resources.js';
|
||||
import { IPathService } from '../../../../services/path/common/pathService.js';
|
||||
import { isObject } from '../../../../../base/common/types.js';
|
||||
|
||||
export async function showRunRecentQuickPick(
|
||||
accessor: ServicesAccessor,
|
||||
@@ -325,7 +326,10 @@ export async function showRunRecentQuickPick(
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
if ('command' in item && item.command && item.command.marker) {
|
||||
function isItem(obj: unknown): obj is Item {
|
||||
return isObject(obj) && 'rawLabel' in obj;
|
||||
}
|
||||
if (isItem(item) && item.command && item.command.marker) {
|
||||
if (!terminalScrollStateSaved) {
|
||||
xterm.markTracker.saveScrollState();
|
||||
terminalScrollStateSaved = true;
|
||||
|
||||
@@ -20,6 +20,7 @@ import { ILabelService } from '../../../../../platform/label/common/label.js';
|
||||
import { basenameOrAuthority, dirname } from '../../../../../base/common/resources.js';
|
||||
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
|
||||
import { AccessibleViewProviderId, IAccessibleViewService } from '../../../../../platform/accessibility/browser/accessibleView.js';
|
||||
import { hasKey } from '../../../../../base/common/types.js';
|
||||
|
||||
export class TerminalLinkQuickpick extends DisposableStore {
|
||||
|
||||
@@ -167,7 +168,7 @@ export class TerminalLinkQuickpick extends DisposableStore {
|
||||
accepted = true;
|
||||
const event = new TerminalLinkQuickPickEvent(EventType.CLICK);
|
||||
const activeItem = pick.activeItems?.[0];
|
||||
if (activeItem && 'link' in activeItem) {
|
||||
if (activeItem && hasKey(activeItem, { link: true })) {
|
||||
activeItem.link.activate(event, activeItem.label);
|
||||
}
|
||||
disposables.dispose();
|
||||
@@ -193,7 +194,7 @@ export class TerminalLinkQuickpick extends DisposableStore {
|
||||
|
||||
// Add a consistently formatted resolved URI label to the description if applicable
|
||||
let description: string | undefined;
|
||||
if ('uri' in link && link.uri) {
|
||||
if (hasKey(link, { uri: true }) && link.uri) {
|
||||
// For local files and folders, mimic the presentation of go to file
|
||||
if (
|
||||
link.type === TerminalBuiltinLinkType.LocalFile ||
|
||||
@@ -234,7 +235,7 @@ export class TerminalLinkQuickpick extends DisposableStore {
|
||||
}
|
||||
|
||||
private _previewItem(item: ITerminalLinkQuickPickItem | IQuickPickItem) {
|
||||
if (!item || !('link' in item) || !item.link) {
|
||||
if (!item || !hasKey(item, { link: true }) || !item.link) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -242,7 +243,7 @@ export class TerminalLinkQuickpick extends DisposableStore {
|
||||
const link = item.link;
|
||||
this._previewItemInTerminal(link);
|
||||
|
||||
if (!('uri' in link) || !link.uri) {
|
||||
if (!hasKey(link, { uri: true }) || !link.uri) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import { deepStrictEqual } from 'assert';
|
||||
import { ITerminalLinkDetector, TerminalLinkType } from '../../browser/links.js';
|
||||
import { URI } from '../../../../../../base/common/uri.js';
|
||||
import type { IBufferLine } from '@xterm/xterm';
|
||||
import { hasKey } from '../../../../../../base/common/types.js';
|
||||
|
||||
export async function assertLinkHelper(
|
||||
text: string,
|
||||
@@ -40,7 +41,7 @@ export async function assertLinkHelper(
|
||||
const expectedLinks = expected.map(e => {
|
||||
return {
|
||||
type: expectedType,
|
||||
link: 'uri' in e ? e.uri.toString() : e.text,
|
||||
link: hasKey(e, { uri: true }) ? e.uri.toString() : e.text,
|
||||
bufferRange: {
|
||||
start: { x: e.range[0][0], y: e.range[0][1] },
|
||||
end: { x: e.range[1][0], y: e.range[1][1] },
|
||||
|
||||
@@ -33,7 +33,7 @@ import { CodeActionKind } from '../../../../../editor/contrib/codeAction/common/
|
||||
import { Codicon } from '../../../../../base/common/codicons.js';
|
||||
import { ThemeIcon } from '../../../../../base/common/themables.js';
|
||||
import { ICommandService } from '../../../../../platform/commands/common/commands.js';
|
||||
import type { SingleOrMany } from '../../../../../base/common/types.js';
|
||||
import { hasKey, type SingleOrMany } from '../../../../../base/common/types.js';
|
||||
|
||||
const enum QuickFixDecorationSelector {
|
||||
QuickFix = 'quick-fix'
|
||||
@@ -380,7 +380,7 @@ export async function getQuickFixesForCommand(
|
||||
if (quickFixes) {
|
||||
for (const quickFix of asArray(quickFixes)) {
|
||||
let action: ITerminalAction | undefined;
|
||||
if ('type' in quickFix) {
|
||||
if (hasKey(quickFix, { type: true })) {
|
||||
switch (quickFix.type) {
|
||||
case TerminalQuickFixType.TerminalCommand: {
|
||||
const fix = quickFix as ITerminalQuickFixTerminalCommandAction;
|
||||
@@ -536,7 +536,7 @@ function getQuickFixIcon(quickFix: TerminalQuickFixItem): ThemeIcon {
|
||||
}
|
||||
switch (quickFix.type) {
|
||||
case TerminalQuickFixType.Opener:
|
||||
if ('uri' in quickFix.action && quickFix.action.uri) {
|
||||
if (quickFix.action.uri) {
|
||||
const isUrl = (quickFix.action.uri.scheme === Schemas.http || quickFix.action.uri.scheme === Schemas.https);
|
||||
return isUrl ? Codicon.linkExternal : Codicon.goToFile;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,10 @@ export const terminalSendSequenceCommand = async (accessor: ServicesAccessor, ar
|
||||
|
||||
const instance = terminalService.activeInstance;
|
||||
if (instance) {
|
||||
let text = isObject(args) && 'text' in args ? toOptionalString(args.text) : undefined;
|
||||
function isTextArg(obj: unknown): obj is { text: string } {
|
||||
return isObject(obj) && 'text' in obj;
|
||||
}
|
||||
let text = isTextArg(args) ? toOptionalString(args.text) : undefined;
|
||||
|
||||
// If no text provided, prompt user for input and process special characters
|
||||
if (!text) {
|
||||
|
||||
@@ -45,7 +45,10 @@ registerTerminalAction({
|
||||
return;
|
||||
}
|
||||
|
||||
let signal = isObject(args) && 'signal' in args ? toOptionalString(args.signal) : undefined;
|
||||
function isSignalArg(obj: unknown): obj is { signal: string } {
|
||||
return isObject(obj) && 'signal' in obj;
|
||||
}
|
||||
let signal = isSignalArg(args) ? toOptionalString(args.signal) : undefined;
|
||||
|
||||
if (!signal) {
|
||||
const signalOptions: QuickPickItem[] = [
|
||||
|
||||
@@ -20,7 +20,7 @@ import { IContextKeyService } from '../../../../../platform/contextkey/common/co
|
||||
import { IContextMenuService } from '../../../../../platform/contextview/browser/contextView.js';
|
||||
import { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';
|
||||
import { ICommandDetectionCapability, ITerminalCommand } from '../../../../../platform/terminal/common/capabilities/capabilities.js';
|
||||
import { ICurrentPartialCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
|
||||
import { ICurrentPartialCommand, isFullTerminalCommand } from '../../../../../platform/terminal/common/capabilities/commandDetection/terminalCommand.js';
|
||||
import { IThemeService } from '../../../../../platform/theme/common/themeService.js';
|
||||
import { ITerminalConfigurationService, ITerminalInstance, IXtermColorProvider, IXtermTerminal } from '../../../terminal/browser/terminal.js';
|
||||
import { openContextMenu } from '../../../terminal/browser/terminalContextMenu.js';
|
||||
@@ -235,7 +235,7 @@ export class TerminalStickyScrollOverlay extends Disposable {
|
||||
}
|
||||
|
||||
// Partial command
|
||||
if (!('marker' in command)) {
|
||||
if (!isFullTerminalCommand(command)) {
|
||||
const partialCommand = this._commandDetection.currentCommand;
|
||||
if (partialCommand?.commandStartMarker && partialCommand.commandExecutedMarker) {
|
||||
this._updateContent(partialCommand, partialCommand.commandStartMarker);
|
||||
@@ -279,7 +279,7 @@ export class TerminalStickyScrollOverlay extends Disposable {
|
||||
// of the sticky overlay because we do not want to show any content above the bounds of the
|
||||
// original terminal. This is done because it seems like scrolling flickers more when a
|
||||
// partial line can be drawn on the top.
|
||||
const isPartialCommand = !('getOutput' in command);
|
||||
const isPartialCommand = !isFullTerminalCommand(command);
|
||||
const rowOffset = !isPartialCommand && command.endMarker ? Math.max(buffer.viewportY - command.endMarker.line + 1, 0) : 0;
|
||||
const maxLineCount = Math.min(this._rawMaxLineCount, Math.floor(xterm.rows * Constants.StickyScrollPercentageCap));
|
||||
const stickyScrollLineCount = Math.min(promptRowCount + commandRowCount - 1, maxLineCount) - rowOffset;
|
||||
|
||||
@@ -175,7 +175,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
|
||||
const providerConfig: { [key: string]: boolean } = this._configurationService.getValue(TerminalSuggestSettingId.Providers);
|
||||
return providers.filter(p => {
|
||||
const providerId = p.id;
|
||||
return providerId && (!(providerId in providerConfig) || providerConfig[providerId] !== false);
|
||||
return providerId && (!Object.prototype.hasOwnProperty.call(providerConfig, providerId) || providerConfig[providerId] !== false);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user