diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 087d6e838ab..af930a3a34d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -368,31 +368,28 @@ The `aws.dev.forceDevMode` setting enables or disables Toolkit "dev mode". Witho ``` tail -F ~/awstoolkit.log ``` -- Use the `AWS (Developer): Watch Logs` command to watch and filter Toolkit logs (including - telemetry) in VSCode. - - Only available if you enabled "dev mode" (`aws.dev.forceDevMode` setting, see above). - - Enter text in the Debug Console filter box to show only log messages with that text.
- VSCode Debug Console +- Use the Output panel to watch and filter Toolkit logs (including telemetry) in VSCode. + - Enter text in the Output panel filter box to show only log messages with that text. #### Enabling Debug Logs How to enable more detailed debug logs in the extensions. If you need to report an issue attach these to give the most detailed information. -1. Open the Command Palette (`cmd/ctrl` + `shift` + `p`), then search for "View Logs". Choose the correct option for the extension you want, eg: `AWS: View Logs` or `Amazon Q: View Logs` - ![](./docs/images/logsView.png) +1. Open the Command Palette (`cmd/ctrl` + `shift` + `p`), then search for "View Logs". Choose either `AWS: View Logs` or `Amazon Q: View Logs`. + - ![](./docs/images/logsView.png) 2. Click the gear icon on the bottom right and select `Debug` - ![](./docs/images/logsSetDebug.png) + - ![](./docs/images/logsSetDebug.png) 3. Click the gear icon again and select `Set As Default`. This will ensure we stay in `Debug` until explicitly changed - ![](./docs/images/logsSetDefault.png) + - ![](./docs/images/logsSetDefault.png) 4. Open the Command Palette again and select `Reload Window`. 5. Now you should see additional `[debug]` prefixed logs in the output. - ![](./docs/images/logsDebugLog.png) + - ![](./docs/images/logsDebugLog.png) ### Telemetry - See [docs/telemetry.md](./docs/telemetry.md) for guidelines on developing telemetry in this project. -- To watch Toolkit telemetry events, use the `AWS (Developer): Watch Logs` command (see [Logging](#logging) above) and enter "telemetry" in the Debug Console filter box. +- To watch Toolkit telemetry events, use the `Amazon Q: View Logs` command (see [Logging](#logging) above) and enter "telemetry" in the filter box. ### Service Endpoints diff --git a/docs/images/debug-console-filter.png b/docs/images/debug-console-filter.png deleted file mode 100644 index 06703ab4149..00000000000 Binary files a/docs/images/debug-console-filter.png and /dev/null differ diff --git a/packages/amazonq/.changes/next-release/Bug Fix-704d175a-a99f-4ce7-bf08-b94d6f7218c0.json b/packages/amazonq/.changes/next-release/Bug Fix-704d175a-a99f-4ce7-bf08-b94d6f7218c0.json new file mode 100644 index 00000000000..01d6ec7c8b0 --- /dev/null +++ b/packages/amazonq/.changes/next-release/Bug Fix-704d175a-a99f-4ce7-bf08-b94d6f7218c0.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "`Send to prompt` and other context menu options not sent if chat was closed" +} diff --git a/packages/amazonq/.changes/next-release/Feature-d86356a0-bc42-4187-a7f8-205afbc25d76.json b/packages/amazonq/.changes/next-release/Feature-d86356a0-bc42-4187-a7f8-205afbc25d76.json new file mode 100644 index 00000000000..510dd1c150d --- /dev/null +++ b/packages/amazonq/.changes/next-release/Feature-d86356a0-bc42-4187-a7f8-205afbc25d76.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "Amazon Q /dev: support `.hbs`, `.gjs`, `.gts`, `.astro`, `.mdx`, `.svelte`, `.erb`, `.rake` files" +} diff --git a/packages/amazonq/.changes/next-release/Feature-d9128dff-2867-4bf4-9046-2a52a36803d7.json b/packages/amazonq/.changes/next-release/Feature-d9128dff-2867-4bf4-9046-2a52a36803d7.json new file mode 100644 index 00000000000..add00c79b5e --- /dev/null +++ b/packages/amazonq/.changes/next-release/Feature-d9128dff-2867-4bf4-9046-2a52a36803d7.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "/transform: automatically download results when ready" +} diff --git a/packages/amazonq/test/e2e/inline/inline.test.ts b/packages/amazonq/test/e2e/inline/inline.test.ts new file mode 100644 index 00000000000..34463449cd2 --- /dev/null +++ b/packages/amazonq/test/e2e/inline/inline.test.ts @@ -0,0 +1,179 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import assert from 'assert' +import { + assertTelemetry, + closeAllEditors, + getTestWindow, + registerAuthHook, + resetCodeWhispererGlobalVariables, + TestFolder, + toTextEditor, + using, +} from 'aws-core-vscode/test' +import { RecommendationHandler, RecommendationService } from 'aws-core-vscode/codewhisperer' +import { Commands, globals, sleep, waitUntil } from 'aws-core-vscode/shared' +import { loginToIdC } from '../amazonq/utils/setup' + +describe('Amazon Q Inline', async function () { + let tempFolder: string + const waitOptions = { + interval: 500, + timeout: 10000, + retryOnFail: false, + } + + before(async function () { + await using(registerAuthHook('amazonq-test-account'), async () => { + await loginToIdC() + }) + }) + + beforeEach(async function () { + registerAuthHook('amazonq-test-account') + const folder = await TestFolder.create() + tempFolder = folder.path + await closeAllEditors() + await resetCodeWhispererGlobalVariables(false) + }) + + afterEach(async function () { + await closeAllEditors() + }) + + async function setupEditor({ name, contents }: { name?: string; contents?: string } = {}) { + const fileName = name ?? 'test.ts' + const textContents = + contents ?? + `function fib() { + + +}` + await toTextEditor(textContents, fileName, tempFolder, { + selection: new vscode.Range(new vscode.Position(1, 4), new vscode.Position(1, 4)), + }) + } + + async function waitForRecommendations() { + const ok = await waitUntil(async () => RecommendationHandler.instance.isSuggestionVisible(), waitOptions) + if (!ok) { + assert.fail('Suggestions failed to become visible') + } + } + + async function waitForTelemetry() { + const ok = await waitUntil( + async () => + globals.telemetry.logger.query({ + metricName: 'codewhisperer_userTriggerDecision', + }).length > 0, + waitOptions + ) + if (!ok) { + assert.fail('Telemetry failed to be emitted') + } + } + + for (const [name, invokeCompletion] of [ + ['automatic', async () => await vscode.commands.executeCommand('type', { text: '\n' })], + ['manual', async () => Commands.tryExecute('aws.amazonq.invokeInlineCompletion')], + ] as const) { + describe(`${name} invoke`, async function () { + let originalEditorContents: string | undefined + + describe('supported filetypes', () => { + beforeEach(async () => { + await setupEditor() + + /** + * Allow some time between when the editor is opened and when we start typing. + * If we don't do this then the time between the initial editor selection + * and invoking the "type" command is too low, causing completion to never + * activate. AFAICT there isn't anything we can use waitUntil on here. + * + * note: this number is entirely arbitrary + **/ + await sleep(1000) + + await invokeCompletion() + originalEditorContents = vscode.window.activeTextEditor?.document.getText() + + // wait until the ghost text appears + await waitForRecommendations() + }) + + it(`${name} invoke accept`, async function () { + /** + * keep accepting the suggestion until the text contents change + * this is required because we have no access to the inlineSuggest panel + **/ + const suggestionAccepted = await waitUntil(async () => { + // Accept the suggestion + await vscode.commands.executeCommand('editor.action.inlineSuggest.commit') + return vscode.window.activeTextEditor?.document.getText() !== originalEditorContents + }, waitOptions) + + assert.ok(suggestionAccepted, 'Editor contents should have changed') + + await waitForTelemetry() + assertTelemetry('codewhisperer_userTriggerDecision', { + codewhispererSuggestionState: 'Accept', + }) + }) + + it(`${name} invoke reject`, async function () { + // Reject the suggestion + await vscode.commands.executeCommand('aws.amazonq.rejectCodeSuggestion') + + // Contents haven't changed + assert.deepStrictEqual(vscode.window.activeTextEditor?.document.getText(), originalEditorContents) + + await waitForTelemetry() + assertTelemetry('codewhisperer_userTriggerDecision', { + codewhispererSuggestionState: 'Reject', + }) + }) + + it(`${name} invoke discard`, async function () { + // Discard the suggestion by moving it back to the original position + const position = new vscode.Position(1, 4) + const editor = vscode.window.activeTextEditor + if (!editor) { + assert.fail('Could not find text editor') + } + editor.selection = new vscode.Selection(position, position) + + // Contents are the same + assert.deepStrictEqual(vscode.window.activeTextEditor?.document.getText(), originalEditorContents) + }) + }) + + it(`${name} invoke on unsupported filetype`, async function () { + await setupEditor({ + name: 'test.zig', + contents: `fn doSomething() void { + + }`, + }) + + /** + * Add delay between editor loading and invoking completion + * @see beforeEach in supported filetypes for more information + */ + await sleep(1000) + await invokeCompletion() + + if (name === 'automatic') { + // It should never get triggered since its not a supported file type + assert.deepStrictEqual(RecommendationService.instance.isRunning, false) + } else { + await getTestWindow().waitForMessage('currently not supported by Amazon Q inline suggestions') + } + }) + }) + } +}) diff --git a/packages/core/src/amazonq/apps/initContext.ts b/packages/core/src/amazonq/apps/initContext.ts index e33fafca7c3..f8b06e4b46a 100644 --- a/packages/core/src/amazonq/apps/initContext.ts +++ b/packages/core/src/amazonq/apps/initContext.ts @@ -4,20 +4,20 @@ */ import { EventEmitter } from 'vscode' -import { MessagePublisher } from '../messages/messagePublisher' +import { MessagePublisher, UiMessagePublisher } from '../messages/messagePublisher' import { MessageListener } from '../messages/messageListener' import { TabType } from '../webview/ui/storages/tabsStorage' export interface AmazonQAppInitContext { registerWebViewToAppMessagePublisher(eventEmitter: MessagePublisher, tabType: TabType): void - getAppsToWebViewMessagePublisher(): MessagePublisher + getAppsToWebViewMessagePublisher(): UiMessagePublisher onDidChangeAmazonQVisibility: EventEmitter } export class DefaultAmazonQAppInitContext implements AmazonQAppInitContext { private readonly appsToWebViewEventEmitter = new EventEmitter() private readonly appsToWebViewMessageListener = new MessageListener(this.appsToWebViewEventEmitter) - private readonly appsToWebViewMessagePublisher = new MessagePublisher(this.appsToWebViewEventEmitter) + private readonly appsToWebViewMessagePublisher = new UiMessagePublisher(this.appsToWebViewEventEmitter) private readonly webViewToAppsMessagePublishers: Map> = new Map() public readonly onDidChangeAmazonQVisibility = new EventEmitter() @@ -41,7 +41,7 @@ export class DefaultAmazonQAppInitContext implements AmazonQAppInitContext { return this.appsToWebViewMessageListener } - getAppsToWebViewMessagePublisher(): MessagePublisher { + getAppsToWebViewMessagePublisher(): UiMessagePublisher { return this.appsToWebViewMessagePublisher } } diff --git a/packages/core/src/amazonq/messages/messagePublisher.ts b/packages/core/src/amazonq/messages/messagePublisher.ts index d2987a99536..7fa6976b9a9 100644 --- a/packages/core/src/amazonq/messages/messagePublisher.ts +++ b/packages/core/src/amazonq/messages/messagePublisher.ts @@ -12,3 +12,48 @@ export class MessagePublisher { this.eventEmitter.fire(event) } } + +/** + * Same as {@link MessagePublisher}, but will wait until the UI indicates it + * is ready to recieve messages, before the message is published. + * + * This solves a problem when running a right click menu option like + * "Send To Prompt" BUT chat is not opened yet, it would result in the prompt failing to + * be recieved by chat. + */ +export class UiMessagePublisher extends MessagePublisher { + private isUiReady: boolean = false + private buffer: T[] = [] + + constructor(eventEmitter: EventEmitter) { + super(eventEmitter) + } + + public override publish(event: T): void { + // immediately send if Chat UI is ready + if (this.isUiReady) { + super.publish(event) + return + } + + this.buffer.push(event) + } + + /** + * Indicate the Q Chat UI is ready to recieve messages. + */ + public setUiReady() { + this.isUiReady = true + this.flush() + } + + /** + * Publishes all blocked messages + */ + private flush() { + for (const msg of this.buffer) { + super.publish(msg) + } + this.buffer = [] + } +} diff --git a/packages/core/src/amazonq/webview/messages/messageDispatcher.ts b/packages/core/src/amazonq/webview/messages/messageDispatcher.ts index 8acd04e8953..fdd1584b767 100644 --- a/packages/core/src/amazonq/webview/messages/messageDispatcher.ts +++ b/packages/core/src/amazonq/webview/messages/messageDispatcher.ts @@ -13,6 +13,7 @@ import { telemetry } from '../../../shared/telemetry' import { AmazonQChatMessageDuration } from '../../messages/chatMessageDuration' import { globals, openUrl } from '../../../shared' import { isClickTelemetry, isOpenAgentTelemetry } from '../ui/telemetry/actions' +import { DefaultAmazonQAppInitContext } from '../../apps/initContext' export function dispatchWebViewMessagesToApps( webview: Webview, @@ -21,12 +22,12 @@ export function dispatchWebViewMessagesToApps( webview.onDidReceiveMessage((msg) => { switch (msg.command) { case 'ui-is-ready': { + DefaultAmazonQAppInitContext.instance.getAppsToWebViewMessagePublisher().setUiReady() /** * ui-is-ready isn't associated to any tab so just record the telemetry event and continue. * This would be equivalent of the duration between "user clicked open q" and "ui has become available" * NOTE: Amazon Q UI is only loaded ONCE. The state is saved between each hide/show of the webview. */ - telemetry.webview_load.emit({ webviewName: 'amazonq', duration: performance.measure(amazonqMark.uiReady, amazonqMark.open).duration, diff --git a/packages/core/src/codewhisperer/commands/startTransformByQ.ts b/packages/core/src/codewhisperer/commands/startTransformByQ.ts index 50be99b7fcf..cec513d4f58 100644 --- a/packages/core/src/codewhisperer/commands/startTransformByQ.ts +++ b/packages/core/src/codewhisperer/commands/startTransformByQ.ts @@ -775,6 +775,12 @@ export async function postTransformationJob() { if (transformByQState.getPayloadFilePath() !== '') { fs.rmSync(transformByQState.getPayloadFilePath(), { recursive: true, force: true }) // delete ZIP if it exists } + + // attempt download for user + // TODO: refactor as explained here https://github.com/aws/aws-toolkit-vscode/pull/6519/files#r1946873107 + if (transformByQState.isSucceeded() || transformByQState.isPartiallySucceeded()) { + await vscode.commands.executeCommand('aws.amazonq.transformationHub.reviewChanges.startReview') + } } export async function transformationJobErrorHandler(error: any) { diff --git a/packages/core/src/dev/activation.ts b/packages/core/src/dev/activation.ts index 0033eaa8548..15baf1bc294 100644 --- a/packages/core/src/dev/activation.ts +++ b/packages/core/src/dev/activation.ts @@ -199,20 +199,6 @@ export async function activate(ctx: vscode.ExtensionContext): Promise { .filter((e) => (opts.menuOptions ?? Object.keys(options)).includes(e[0])) .map((e) => e[1]) ) - }), - // "AWS (Developer): Watch Logs" - Commands.register('aws.dev.viewLogs', async () => { - // HACK: Use startDebugging() so we can use the DEBUG CONSOLE (which supports - // user-defined filtering, unlike the OUTPUT panel). - await vscode.debug.startDebugging(undefined, { - name: 'aws-dev-log', - request: 'launch', - type: 'node', // Nonsense, to force the debugger to start. - }) - getLogger().enableDebugConsole() - if (!getLogger().logLevelEnabled('debug')) { - getLogger().setLogLevel('debug') - } }) ) diff --git a/packages/core/src/shared/filetypes.ts b/packages/core/src/shared/filetypes.ts index 843397e6a17..9457592c8b2 100644 --- a/packages/core/src/shared/filetypes.ts +++ b/packages/core/src/shared/filetypes.ts @@ -155,6 +155,7 @@ export const codefileExtensions = new Set([ '.ads', '.apl', '.asm', + '.astro', '.awk', '.b', '.bas', @@ -195,6 +196,7 @@ export const codefileExtensions = new Set([ '.el', '.elm', '.env', + '.erb', '.erl', '.ex', '.exs', @@ -211,6 +213,7 @@ export const codefileExtensions = new Set([ '.fsx', '.gd', '.gitignore', + '.gjs', '.go', '.gql', '.gradle', @@ -220,9 +223,11 @@ export const codefileExtensions = new Set([ '.gsp', '.gst', '.gsx', + '.gts', '.gvy', '.h', '.hack', + '.hbs', '.hh', '.hpp', '.hrl', @@ -253,6 +258,7 @@ export const codefileExtensions = new Set([ '.mak', '.makefile', '.md', + '.mdx', '.mjs', '.ml', '.mli', @@ -289,6 +295,7 @@ export const codefileExtensions = new Set([ '.pyw', '.qs', '.r', + '.rake', '.raku', '.rakumod', '.rakutest', @@ -331,6 +338,7 @@ export const codefileExtensions = new Set([ '.ss', '.st', '.sv', + '.svelte', '.svg', '.swift', '.t', diff --git a/packages/core/src/shared/logger/logger.ts b/packages/core/src/shared/logger/logger.ts index de74bba3061..88e2e7abed2 100644 --- a/packages/core/src/shared/logger/logger.ts +++ b/packages/core/src/shared/logger/logger.ts @@ -12,6 +12,7 @@ export type LogTopic = | 'test' | 'childProcess' | 'unknown' + | 'chat' | 'stepfunctions' class ErrorLog { @@ -42,8 +43,6 @@ export interface Logger { /** Returns true if the given log level is being logged. */ logLevelEnabled(logLevel: LogLevel): boolean getLogById(logID: number, file: vscode.Uri): string | undefined - /** HACK: Enables logging to vscode Debug Console. */ - enableDebugConsole(): void sendToLog( logLevel: 'debug' | 'verbose' | 'info' | 'warn' | 'error', message: string | Error, @@ -81,8 +80,6 @@ export abstract class BaseLogger implements Logger { abstract setLogLevel(logLevel: LogLevel): void abstract logLevelEnabled(logLevel: LogLevel): boolean abstract getLogById(logID: number, file: vscode.Uri): string | undefined - /** HACK: Enables logging to vscode Debug Console. */ - abstract enableDebugConsole(): void } /** @@ -173,7 +170,6 @@ export class NullLogger extends BaseLogger { public getLogById(logID: number, file: vscode.Uri): string | undefined { return undefined } - public enableDebugConsole(): void {} override sendToLog( logLevel: 'error' | 'warn' | 'info' | 'verbose' | 'debug', message: string | Error, @@ -197,7 +193,6 @@ export class ConsoleLogger extends BaseLogger { public getLogById(logID: number, file: vscode.Uri): string | undefined { return undefined } - public enableDebugConsole(): void {} override sendToLog( logLevel: 'error' | 'warn' | 'info' | 'verbose' | 'debug', message: string | Error, @@ -251,10 +246,6 @@ export class TopicLogger extends BaseLogger implements vscode.Disposable { return this.logger.getLogById(logID, file) } - override enableDebugConsole(): void { - this.logger.enableDebugConsole() - } - override sendToLog(level: LogLevel, message: string | Error, ...meta: any[]): number { if (typeof message === 'string') { message = prependTopic(this.topic, message) as string diff --git a/packages/core/src/shared/logger/toolkitLogger.ts b/packages/core/src/shared/logger/toolkitLogger.ts index d525fb7cf20..0fdf58dc939 100644 --- a/packages/core/src/shared/logger/toolkitLogger.ts +++ b/packages/core/src/shared/logger/toolkitLogger.ts @@ -48,10 +48,6 @@ export class ToolkitLogger extends BaseLogger implements vscode.Disposable { }) } - public enableDebugConsole(): void { - this.logToConsole() - } - public setLogLevel(logLevel: LogLevel) { if (this.logger.level === logLevel) { return diff --git a/packages/core/src/shared/regions/regionProvider.ts b/packages/core/src/shared/regions/regionProvider.ts index 00d13942196..426e27d73c5 100644 --- a/packages/core/src/shared/regions/regionProvider.ts +++ b/packages/core/src/shared/regions/regionProvider.ts @@ -162,25 +162,30 @@ export class RegionProvider { remote: () => Endpoints | Promise }): RegionProvider { const instance = new this() + void instance.init(endpointsProvider) + return instance + } - async function load() { - getLogger().info('endpoints: retrieving AWS endpoints data') - instance.loadFromEndpoints(await endpointsProvider.local()) - - try { - instance.loadFromEndpoints(await endpointsProvider.remote()) - } catch (err) { - getLogger().warn( - `endpoints: failed to load from remote source, region data may appear outdated: %s`, - err - ) - } + async init(endpointsProvider: { + local: () => Endpoints | Promise + remote: () => Endpoints | Promise + }) { + getLogger().info('endpoints: retrieving AWS endpoints data') + + try { + this.loadFromEndpoints(await endpointsProvider.local()) + } catch (err) { + getLogger().warn(`endpoints: failed to load from local source: %s`, err) } - load().catch((err) => { - getLogger().error('Failure while loading Endpoints Manifest: %s', err) + try { + this.loadFromEndpoints(await endpointsProvider.remote()) + } catch (err) { + getLogger().warn(`endpoints: failed to load from remote source, region data may appear outdated: %s`, err) + } - return vscode.window.showErrorMessage( + if (this.getRegions().length === 0) { + void vscode.window.showErrorMessage( `${localize( 'AWS.error.endpoint.load.failure', 'The {0} Toolkit was unable to load endpoints data.', @@ -190,9 +195,7 @@ export class RegionProvider { 'Toolkit functionality may be impacted until VS Code is restarted.' )}` ) - }) - - return instance + } } } diff --git a/packages/core/src/test/codewhisperer/testUtil.ts b/packages/core/src/test/codewhisperer/testUtil.ts index e7e1971a77d..ce2b0e51aa8 100644 --- a/packages/core/src/test/codewhisperer/testUtil.ts +++ b/packages/core/src/test/codewhisperer/testUtil.ts @@ -28,14 +28,16 @@ import * as model from '../../codewhisperer/models/model' import { stub } from '../utilities/stubber' import { Dirent } from 'fs' // eslint-disable-line no-restricted-imports -export async function resetCodeWhispererGlobalVariables() { +export async function resetCodeWhispererGlobalVariables(clearGlobalState: boolean = true) { vsCodeState.isIntelliSenseActive = false vsCodeState.isCodeWhispererEditing = false CodeWhispererCodeCoverageTracker.instances.clear() globals.telemetry.logger.clear() const session = CodeWhispererSessionState.instance.getSession() session.reset() - await globals.globalState.clear() + if (clearGlobalState) { + await globals.globalState.clear() + } await CodeSuggestionsState.instance.setSuggestionsEnabled(true) await RecommendationHandler.instance.clearInlineCompletionStates() } diff --git a/packages/core/src/test/setupUtil.ts b/packages/core/src/test/setupUtil.ts index 538af7daa06..d0a4cd0b594 100644 --- a/packages/core/src/test/setupUtil.ts +++ b/packages/core/src/test/setupUtil.ts @@ -211,7 +211,7 @@ function maskArns(text: string) { */ export function registerAuthHook(secret: string, lambdaId = process.env['AUTH_UTIL_LAMBDA_ARN']) { return getTestWindow().onDidShowMessage((message) => { - if (message.items[0].title.match(new RegExp(proceedToBrowser))) { + if (message.items.length > 0 && message.items[0].title.match(new RegExp(proceedToBrowser))) { if (!lambdaId) { const baseMessage = 'Browser login flow was shown during testing without an authorizer function' if (process.env['AWS_TOOLKIT_AUTOMATION'] === 'local') { diff --git a/packages/core/src/test/testLogger.ts b/packages/core/src/test/testLogger.ts index db9d460652c..a2970c37d8b 100644 --- a/packages/core/src/test/testLogger.ts +++ b/packages/core/src/test/testLogger.ts @@ -23,8 +23,6 @@ export class TestLogger extends BaseLogger { super() } - public enableDebugConsole(): void {} - public getLoggedEntries(...logLevels: LogLevel[]): Loggable[] { return this.loggedEntries .filter((loggedEntry) => logLevels.length === 0 || logLevels.includes(loggedEntry.logLevel)) diff --git a/packages/core/src/testInteg/regionProvider.test.ts b/packages/core/src/testInteg/regionProvider.test.ts new file mode 100644 index 00000000000..a3486c2bac0 --- /dev/null +++ b/packages/core/src/testInteg/regionProvider.test.ts @@ -0,0 +1,37 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import assert from 'assert' +import { makeEndpointsProvider } from '../extension' +import { RegionProvider } from '../shared/regions/regionProvider' +import globals from '../shared/extensionGlobals' +import path from 'path' +import { TestFolder } from '../test/testUtil' + +describe('Region Provider', async function () { + let tempFolder: TestFolder + + before(async () => { + tempFolder = await TestFolder.create() + }) + + it('resolves from remote', async function () { + /** + * Make sure the local file doesn't resolve to any endpoints. + * That way we can make sure remote contents are fetched + */ + await tempFolder.write('foo.json', '{}') + globals.manifestPaths.endpoints = path.join(tempFolder.path, 'foo.json') + + await assert.doesNotReject(async () => { + const endpointProvider = makeEndpointsProvider() + const regionProvider = new RegionProvider() + await regionProvider.init(endpointProvider) + + // regions loaded from the remote + assert.ok(regionProvider.getRegions().length > 0) + }) + }) +}) diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index ab2a53003fe..6020b055cfe 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -3891,11 +3891,6 @@ "category": "AWS (Developer)", "enablement": "aws.isDevMode" }, - { - "command": "aws.dev.viewLogs", - "title": "Watch Logs", - "category": "AWS (Developer)" - }, { "command": "aws.openInApplicationComposerDialog", "title": "%AWS.command.applicationComposer.openDialog%",