From 3f6e7823a79b0e4faef2bf30fd524affbf160b20 Mon Sep 17 00:00:00 2001 From: Alex Weininger Date: Wed, 30 Nov 2022 11:45:20 -0800 Subject: [PATCH 1/3] Add `isAzExtTreeItem` util --- utils/index.d.ts | 3 +++ utils/src/index.ts | 1 + utils/src/tree/AzExtParentTreeItem.ts | 3 ++- utils/src/tree/AzExtTreeDataProvider.ts | 3 ++- utils/src/tree/AzExtTreeItem.ts | 7 +++++-- utils/src/tree/InternalInterfaces.ts | 12 +++--------- utils/src/tree/isAzExtParentTreeItem.ts | 19 +++++++++++++++++++ 7 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 utils/src/tree/isAzExtParentTreeItem.ts diff --git a/utils/index.d.ts b/utils/index.d.ts index 3125e36b09..020ae5985f 100644 --- a/utils/index.d.ts +++ b/utils/index.d.ts @@ -464,6 +464,9 @@ export declare abstract class AzExtTreeItem implements IAzExtTreeItem { public resolveTooltip?(): Promise; } +export declare function isAzExtTreeItem(maybeTreeItem: unknown): maybeTreeItem is AzExtTreeItem; +export declare function isAzExtParentTreeItem(maybeParentTreeItem: unknown): maybeParentTreeItem is AzExtParentTreeItem; + export interface IGenericTreeItemOptions { id?: string; label: string; diff --git a/utils/src/index.ts b/utils/src/index.ts index 068bc7ab52..4b09abbf99 100644 --- a/utils/src/index.ts +++ b/utils/src/index.ts @@ -37,4 +37,5 @@ export * from './utils/contextUtils'; export * from './activityLog/activities/ExecuteActivity'; export * from './getAzExtResourceType'; export * from './AzExtResourceType'; +export * from './tree/isAzExtParentTreeItem'; // NOTE: The auto-fix action "source.organizeImports" does weird things with this file, but there doesn't seem to be a way to disable it on a per-file basis so we'll just let it happen diff --git a/utils/src/tree/AzExtParentTreeItem.ts b/utils/src/tree/AzExtParentTreeItem.ts index dd351ea0d2..2b29d6219a 100644 --- a/utils/src/tree/AzExtParentTreeItem.ts +++ b/utils/src/tree/AzExtParentTreeItem.ts @@ -11,7 +11,8 @@ import { localize } from '../localize'; import { randomUtils } from '../utils/randomUtils'; import { AzExtTreeItem } from './AzExtTreeItem'; import { GenericTreeItem } from './GenericTreeItem'; -import { IAzExtParentTreeItemInternal, isAzExtParentTreeItem } from './InternalInterfaces'; +import { IAzExtParentTreeItemInternal } from './InternalInterfaces'; +import { isAzExtParentTreeItem } from './isAzExtParentTreeItem'; import { runWithLoadingNotification } from './runWithLoadingNotification'; import { loadMoreLabel } from './treeConstants'; diff --git a/utils/src/tree/AzExtTreeDataProvider.ts b/utils/src/tree/AzExtTreeDataProvider.ts index 691a7bdb3a..927fecab2c 100644 --- a/utils/src/tree/AzExtTreeDataProvider.ts +++ b/utils/src/tree/AzExtTreeDataProvider.ts @@ -14,7 +14,8 @@ import { AzExtParentTreeItem, InvalidTreeItem } from './AzExtParentTreeItem'; import { AzExtTreeItem } from './AzExtTreeItem'; import { CollapsibleStateTracker } from './CollapsibleStateTracker'; import { GenericTreeItem } from './GenericTreeItem'; -import { IAzExtTreeDataProviderInternal, isAzExtParentTreeItem } from './InternalInterfaces'; +import { IAzExtTreeDataProviderInternal } from './InternalInterfaces'; +import { isAzExtParentTreeItem } from './isAzExtParentTreeItem'; import { runWithLoadingNotification } from './runWithLoadingNotification'; import { loadMoreLabel } from './treeConstants'; diff --git a/utils/src/tree/AzExtTreeItem.ts b/utils/src/tree/AzExtTreeItem.ts index 2c5703768e..111feabe59 100644 --- a/utils/src/tree/AzExtTreeItem.ts +++ b/utils/src/tree/AzExtTreeItem.ts @@ -8,11 +8,14 @@ import * as types from '../../index'; import { NotImplementedError } from '../errors'; import { localize } from '../localize'; import { nonNullProp } from '../utils/nonNull'; -import { IAzExtParentTreeItemInternal, IAzExtTreeDataProviderInternal, isAzExtParentTreeItem } from "./InternalInterfaces"; +import { IAzExtParentTreeItemInternal, IAzExtTreeDataProviderInternal } from "./InternalInterfaces"; import { settingUtils } from '../utils/settingUtils'; import { showContextValueSetting } from '../constants'; +import { isAzExtParentTreeItem } from './isAzExtParentTreeItem'; export abstract class AzExtTreeItem implements types.AzExtTreeItem { + public readonly _isAzExtTreeItem = true; + //#region Properties implemented by base class public abstract label: string; public abstract contextValue: string; @@ -120,7 +123,7 @@ export abstract class AzExtTreeItem implements types.AzExtTreeItem { } public get tooltip(): string | undefined { - if(process.env.DEBUGTELEMETRY === 'v' && !!settingUtils.getWorkspaceSetting(showContextValueSetting)) { + if (process.env.DEBUGTELEMETRY === 'v' && !!settingUtils.getWorkspaceSetting(showContextValueSetting)) { return `Context: "${this.contextValue}"`; } else { return this._tooltip; diff --git a/utils/src/tree/InternalInterfaces.ts b/utils/src/tree/InternalInterfaces.ts index e0318566f3..35fbaa74a9 100644 --- a/utils/src/tree/InternalInterfaces.ts +++ b/utils/src/tree/InternalInterfaces.ts @@ -5,13 +5,14 @@ import { EventEmitter } from 'vscode'; import * as types from '../../index'; -import { AzExtTreeItem } from './AzExtTreeItem'; +import { AzExtParentTreeItem } from './AzExtParentTreeItem'; +import type { AzExtTreeItem } from './AzExtTreeItem'; import { CollapsibleStateTracker } from './CollapsibleStateTracker'; // Interfaces for methods on the tree that aren't exposed outside of this package // We can't reference the classes directly because it would result in circular dependencies -export interface IAzExtParentTreeItemInternal extends types.AzExtParentTreeItem, AzExtTreeItem { +export interface IAzExtParentTreeItemInternal extends AzExtParentTreeItem { _isAzExtParentTreeItem: boolean; parent: IAzExtParentTreeItemInternal | undefined; treeDataProvider: IAzExtTreeDataProviderInternal; @@ -24,10 +25,3 @@ export interface IAzExtTreeDataProviderInternal extends types.AzExtTreeDataProvi refreshUIOnly(treeItem: AzExtTreeItem | undefined): void; readonly collapsibleStateTracker: CollapsibleStateTracker | undefined; } - -/** - * Using instanceof AzExtParentTreeItem causes issues whenever packages are linked for dev testing. Instead, check _isAzExtParentTreeItem - */ -export function isAzExtParentTreeItem(item: {}): boolean { - return !!(item)._isAzExtParentTreeItem; -} diff --git a/utils/src/tree/isAzExtParentTreeItem.ts b/utils/src/tree/isAzExtParentTreeItem.ts new file mode 100644 index 0000000000..0e6c52cc31 --- /dev/null +++ b/utils/src/tree/isAzExtParentTreeItem.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 type { AzExtParentTreeItem } from "./AzExtParentTreeItem"; +import type { AzExtTreeItem } from "./AzExtTreeItem"; +import type { IAzExtParentTreeItemInternal } from "./InternalInterfaces"; + +/** + * Using instanceof AzExtParentTreeItem causes issues since each extension has their own version of the utils. Instead, check _isAzExtParentTreeItem + */ +export function isAzExtParentTreeItem(maybeParentTreeItem: unknown): maybeParentTreeItem is AzExtParentTreeItem { + return typeof maybeParentTreeItem === 'object' && (maybeParentTreeItem as IAzExtParentTreeItemInternal)._isAzExtParentTreeItem === true; +} + +export function isAzExtTreeItem(maybeTreeItem: unknown): maybeTreeItem is AzExtTreeItem { + return typeof maybeTreeItem === 'object' && (maybeTreeItem as AzExtTreeItem)._isAzExtTreeItem === true; +} From 64a6ba4f9d21351a8d198907ca60c0e7f89b4445 Mon Sep 17 00:00:00 2001 From: Alex Weininger Date: Wed, 30 Nov 2022 11:56:32 -0800 Subject: [PATCH 2/3] Rename file --- utils/src/index.ts | 2 +- utils/src/tree/AzExtParentTreeItem.ts | 2 +- utils/src/tree/AzExtTreeDataProvider.ts | 2 +- utils/src/tree/AzExtTreeItem.ts | 2 +- .../tree/{isAzExtParentTreeItem.ts => isAzExtTreeItem.ts} | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) rename utils/src/tree/{isAzExtParentTreeItem.ts => isAzExtTreeItem.ts} (100%) diff --git a/utils/src/index.ts b/utils/src/index.ts index 4b09abbf99..425125d328 100644 --- a/utils/src/index.ts +++ b/utils/src/index.ts @@ -37,5 +37,5 @@ export * from './utils/contextUtils'; export * from './activityLog/activities/ExecuteActivity'; export * from './getAzExtResourceType'; export * from './AzExtResourceType'; -export * from './tree/isAzExtParentTreeItem'; +export * from './tree/isAzExtTreeItem'; // NOTE: The auto-fix action "source.organizeImports" does weird things with this file, but there doesn't seem to be a way to disable it on a per-file basis so we'll just let it happen diff --git a/utils/src/tree/AzExtParentTreeItem.ts b/utils/src/tree/AzExtParentTreeItem.ts index 2b29d6219a..114721d8f3 100644 --- a/utils/src/tree/AzExtParentTreeItem.ts +++ b/utils/src/tree/AzExtParentTreeItem.ts @@ -12,7 +12,7 @@ import { randomUtils } from '../utils/randomUtils'; import { AzExtTreeItem } from './AzExtTreeItem'; import { GenericTreeItem } from './GenericTreeItem'; import { IAzExtParentTreeItemInternal } from './InternalInterfaces'; -import { isAzExtParentTreeItem } from './isAzExtParentTreeItem'; +import { isAzExtParentTreeItem } from './isAzExtTreeItem'; import { runWithLoadingNotification } from './runWithLoadingNotification'; import { loadMoreLabel } from './treeConstants'; diff --git a/utils/src/tree/AzExtTreeDataProvider.ts b/utils/src/tree/AzExtTreeDataProvider.ts index 927fecab2c..91d326f9f1 100644 --- a/utils/src/tree/AzExtTreeDataProvider.ts +++ b/utils/src/tree/AzExtTreeDataProvider.ts @@ -15,7 +15,7 @@ import { AzExtTreeItem } from './AzExtTreeItem'; import { CollapsibleStateTracker } from './CollapsibleStateTracker'; import { GenericTreeItem } from './GenericTreeItem'; import { IAzExtTreeDataProviderInternal } from './InternalInterfaces'; -import { isAzExtParentTreeItem } from './isAzExtParentTreeItem'; +import { isAzExtParentTreeItem } from './isAzExtTreeItem'; import { runWithLoadingNotification } from './runWithLoadingNotification'; import { loadMoreLabel } from './treeConstants'; diff --git a/utils/src/tree/AzExtTreeItem.ts b/utils/src/tree/AzExtTreeItem.ts index 111feabe59..6eab7d0e57 100644 --- a/utils/src/tree/AzExtTreeItem.ts +++ b/utils/src/tree/AzExtTreeItem.ts @@ -11,7 +11,7 @@ import { nonNullProp } from '../utils/nonNull'; import { IAzExtParentTreeItemInternal, IAzExtTreeDataProviderInternal } from "./InternalInterfaces"; import { settingUtils } from '../utils/settingUtils'; import { showContextValueSetting } from '../constants'; -import { isAzExtParentTreeItem } from './isAzExtParentTreeItem'; +import { isAzExtParentTreeItem } from './isAzExtTreeItem'; export abstract class AzExtTreeItem implements types.AzExtTreeItem { public readonly _isAzExtTreeItem = true; diff --git a/utils/src/tree/isAzExtParentTreeItem.ts b/utils/src/tree/isAzExtTreeItem.ts similarity index 100% rename from utils/src/tree/isAzExtParentTreeItem.ts rename to utils/src/tree/isAzExtTreeItem.ts index 0e6c52cc31..042a47cd15 100644 --- a/utils/src/tree/isAzExtParentTreeItem.ts +++ b/utils/src/tree/isAzExtTreeItem.ts @@ -7,13 +7,13 @@ import type { AzExtParentTreeItem } from "./AzExtParentTreeItem"; import type { AzExtTreeItem } from "./AzExtTreeItem"; import type { IAzExtParentTreeItemInternal } from "./InternalInterfaces"; +export function isAzExtTreeItem(maybeTreeItem: unknown): maybeTreeItem is AzExtTreeItem { + return typeof maybeTreeItem === 'object' && (maybeTreeItem as AzExtTreeItem)._isAzExtTreeItem === true; +} + /** * Using instanceof AzExtParentTreeItem causes issues since each extension has their own version of the utils. Instead, check _isAzExtParentTreeItem */ export function isAzExtParentTreeItem(maybeParentTreeItem: unknown): maybeParentTreeItem is AzExtParentTreeItem { return typeof maybeParentTreeItem === 'object' && (maybeParentTreeItem as IAzExtParentTreeItemInternal)._isAzExtParentTreeItem === true; } - -export function isAzExtTreeItem(maybeTreeItem: unknown): maybeTreeItem is AzExtTreeItem { - return typeof maybeTreeItem === 'object' && (maybeTreeItem as AzExtTreeItem)._isAzExtTreeItem === true; -} From 8ff3262cb1a0d13b2eaf947e7885bdd243c6712e Mon Sep 17 00:00:00 2001 From: Alex Weininger Date: Wed, 30 Nov 2022 11:57:13 -0800 Subject: [PATCH 3/3] PR feedback --- utils/src/tree/isAzExtTreeItem.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/src/tree/isAzExtTreeItem.ts b/utils/src/tree/isAzExtTreeItem.ts index 042a47cd15..e2ba870ce5 100644 --- a/utils/src/tree/isAzExtTreeItem.ts +++ b/utils/src/tree/isAzExtTreeItem.ts @@ -15,5 +15,5 @@ export function isAzExtTreeItem(maybeTreeItem: unknown): maybeTreeItem is AzExtT * Using instanceof AzExtParentTreeItem causes issues since each extension has their own version of the utils. Instead, check _isAzExtParentTreeItem */ export function isAzExtParentTreeItem(maybeParentTreeItem: unknown): maybeParentTreeItem is AzExtParentTreeItem { - return typeof maybeParentTreeItem === 'object' && (maybeParentTreeItem as IAzExtParentTreeItemInternal)._isAzExtParentTreeItem === true; + return isAzExtTreeItem(maybeParentTreeItem) && (maybeParentTreeItem as IAzExtParentTreeItemInternal)._isAzExtParentTreeItem === true; }