Skip to content

Commit abf5d62

Browse files
authored
Merge branch 'master' into appbuilder_improve
2 parents 3536839 + 42a862a commit abf5d62

File tree

9 files changed

+803
-414
lines changed

9 files changed

+803
-414
lines changed

packages/core/src/lambda/remoteDebugging/ldkClient.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,10 @@ export class LdkClient {
302302
updatedEnv.ORIGINAL_AWS_LAMBDA_EXEC_WRAPPER = currentEnv['AWS_LAMBDA_EXEC_WRAPPER']
303303
}
304304

305+
if (getLogger().logLevelEnabled('debug')) {
306+
updatedEnv.RUST_LOG = 'debug'
307+
}
308+
305309
// Create Lambda client using AWS SDK
306310
const lambda = this.getLambdaClient(region)
307311

packages/core/src/lambda/remoteDebugging/ldkLayers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export const regionToAccount: RegionAccountMapping = {
3131
}
3232

3333
// Global layer version
34-
const globalLayerVersion = 1
34+
const globalLayerVersion = 2
3535

3636
export function getRemoteDebugLayerForArch(region: string, arch: string): string | undefined {
3737
const account = regionToAccount[region]

packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts

Lines changed: 157 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -102,19 +102,12 @@ export interface RuntimeDebugSettings {
102102
// UI state sub-interface
103103
export interface UIState {
104104
isCollapsed: boolean
105-
showNameInput: boolean
106-
payload: string
107105
extraRegionInfo: string
108106
}
109107

110108
// Payload/Event handling sub-interface
111109
export interface PayloadData {
112-
selectedSampleRequest: string
113110
sampleText: string
114-
selectedFile: string
115-
selectedFilePath: string
116-
selectedTestEvent: string
117-
newTestEventName: string
118111
}
119112

120113
export interface RemoteInvokeData {
@@ -377,7 +370,7 @@ export class RemoteInvokeWebview extends VueWebview {
377370
this.data.LambdaFunctionNode?.configuration.Handler
378371
)
379372
getLogger().warn(warning)
380-
void vscode.window.showWarningMessage(warning)
373+
void showMessage('warn', warning)
381374
}
382375
return fileLocations[0].fsPath
383376
}
@@ -447,22 +440,166 @@ export class RemoteInvokeWebview extends VueWebview {
447440
}
448441

449442
public async listRemoteTestEvents(functionArn: string, region: string): Promise<string[]> {
450-
const params: SamCliRemoteTestEventsParameters = {
451-
functionArn: functionArn,
452-
operation: TestEventsOperation.List,
453-
region: region,
443+
try {
444+
const params: SamCliRemoteTestEventsParameters = {
445+
functionArn: functionArn,
446+
operation: TestEventsOperation.List,
447+
region: region,
448+
}
449+
const result = await this.remoteTestEvents(params)
450+
return result.split('\n').filter((event) => event.trim() !== '')
451+
} catch (error) {
452+
// Suppress "lambda-testevent-schemas registry not found" error - this is normal when no test events exist
453+
const errorMessage = error instanceof Error ? error.message : String(error)
454+
if (
455+
errorMessage.includes('lambda-testevent-schemas registry not found') ||
456+
errorMessage.includes('There are no saved events')
457+
) {
458+
getLogger().debug('No remote test events found for function: %s', functionArn)
459+
return []
460+
}
461+
// Re-throw other errors
462+
throw error
463+
}
464+
}
465+
466+
public async selectRemoteTestEvent(functionArn: string, region: string): Promise<string | undefined> {
467+
let events: string[] = []
468+
469+
try {
470+
events = await this.listRemoteTestEvents(functionArn, region)
471+
} catch (error) {
472+
getLogger().error('Failed to list remote test events: %O', error)
473+
void showMessage(
474+
'error',
475+
localize('AWS.lambda.remoteInvoke.failedToListEvents', 'Failed to list remote test events')
476+
)
477+
return undefined
478+
}
479+
480+
if (events.length === 0) {
481+
void showMessage(
482+
'info',
483+
localize(
484+
'AWS.lambda.remoteInvoke.noRemoteEvents',
485+
'No remote test events found. You can create one using "Save as remote event".'
486+
)
487+
)
488+
return undefined
489+
}
490+
491+
const selected = await vscode.window.showQuickPick(events, {
492+
placeHolder: localize('AWS.lambda.remoteInvoke.selectRemoteEvent', 'Select a remote test event'),
493+
title: localize('AWS.lambda.remoteInvoke.loadRemoteEvent', 'Load Remote Test Event'),
494+
})
495+
496+
if (selected) {
497+
const eventData = {
498+
name: selected,
499+
region: region,
500+
arn: functionArn,
501+
}
502+
const resp = await this.getRemoteTestEvents(eventData)
503+
return resp
454504
}
455-
const result = await this.remoteTestEvents(params)
456-
return result.split('\n')
505+
506+
return undefined
457507
}
458508

459-
public async createRemoteTestEvents(putEvent: Event) {
509+
public async saveRemoteTestEvent(
510+
functionArn: string,
511+
region: string,
512+
eventContent: string
513+
): Promise<string | undefined> {
514+
let events: string[] = []
515+
516+
try {
517+
events = await this.listRemoteTestEvents(functionArn, region)
518+
} catch (error) {
519+
// Log error but continue - user can still create new events
520+
getLogger().debug('Failed to list existing remote test events (may not exist yet): %O', error)
521+
}
522+
523+
// Create options for quickpick
524+
const createNewOption = '$(add) Create new test event'
525+
const options = events.length > 0 ? [createNewOption, ...events] : [createNewOption]
526+
527+
const selected = await vscode.window.showQuickPick(options, {
528+
placeHolder: localize(
529+
'AWS.lambda.remoteInvoke.saveEventChoice',
530+
'Create new or overwrite existing test event'
531+
),
532+
title: localize('AWS.lambda.remoteInvoke.saveRemoteEvent', 'Save as Remote Event'),
533+
})
534+
535+
if (!selected) {
536+
return undefined
537+
}
538+
539+
let eventName: string | undefined
540+
541+
if (selected === createNewOption) {
542+
// Prompt for new event name
543+
eventName = await vscode.window.showInputBox({
544+
prompt: localize('AWS.lambda.remoteInvoke.enterEventName', 'Enter a name for the test event'),
545+
placeHolder: localize('AWS.lambda.remoteInvoke.eventNamePlaceholder', 'MyTestEvent'),
546+
validateInput: (value) => {
547+
if (!value || value.trim() === '') {
548+
return localize('AWS.lambda.remoteInvoke.eventNameRequired', 'Event name is required')
549+
}
550+
if (events.includes(value)) {
551+
return localize(
552+
'AWS.lambda.remoteInvoke.eventNameExists',
553+
'An event with this name already exists'
554+
)
555+
}
556+
return undefined
557+
},
558+
})
559+
} else {
560+
// Use selected existing event name
561+
const confirm = await showConfirmationMessage({
562+
prompt: localize(
563+
'AWS.lambda.remoteInvoke.overwriteEvent',
564+
'Overwrite existing test event "{0}"?',
565+
selected
566+
),
567+
confirm: localize('AWS.lambda.remoteInvoke.overwrite', 'Overwrite'),
568+
cancel: 'Cancel',
569+
type: 'warning',
570+
})
571+
572+
if (confirm) {
573+
eventName = selected
574+
}
575+
}
576+
577+
if (eventName) {
578+
// Use force flag when overwriting existing events
579+
const isOverwriting = selected !== createNewOption
580+
const params: SamCliRemoteTestEventsParameters = {
581+
functionArn: functionArn,
582+
operation: TestEventsOperation.Put,
583+
name: eventName,
584+
eventSample: eventContent,
585+
region: region,
586+
force: isOverwriting,
587+
}
588+
await this.remoteTestEvents(params)
589+
return eventName
590+
}
591+
592+
return undefined
593+
}
594+
595+
public async createRemoteTestEvents(putEvent: Event, force: boolean = false) {
460596
const params: SamCliRemoteTestEventsParameters = {
461597
functionArn: putEvent.arn,
462598
operation: TestEventsOperation.Put,
463599
name: putEvent.name,
464600
eventSample: putEvent.event,
465601
region: putEvent.region,
602+
force: force,
466603
}
467604
return await this.remoteTestEvents(params)
468605
}
@@ -553,7 +690,8 @@ export class RemoteInvokeWebview extends VueWebview {
553690
// this serves as a lock for invoke
554691
public checkReadyToInvoke(): boolean {
555692
if (this.isInvoking) {
556-
void vscode.window.showWarningMessage(
693+
void showMessage(
694+
'warn',
557695
localize(
558696
'AWS.lambda.remoteInvoke.invokeInProgress',
559697
'A remote invoke is already in progress, please wait for previous invoke, or remove debug setup'
@@ -562,12 +700,14 @@ export class RemoteInvokeWebview extends VueWebview {
562700
return false
563701
}
564702
if (this.isStartingDebug) {
565-
void vscode.window.showWarningMessage(
703+
void showMessage(
704+
'warn',
566705
localize(
567706
'AWS.lambda.remoteInvoke.debugSetupInProgress',
568707
'A debugger setup is already in progress, please wait for previous setup to complete, or remove debug setup'
569708
)
570709
)
710+
return false
571711
}
572712
return true
573713
}

0 commit comments

Comments
 (0)