@@ -102,19 +102,12 @@ export interface RuntimeDebugSettings {
102
102
// UI state sub-interface
103
103
export interface UIState {
104
104
isCollapsed : boolean
105
- showNameInput : boolean
106
- payload : string
107
105
extraRegionInfo : string
108
106
}
109
107
110
108
// Payload/Event handling sub-interface
111
109
export interface PayloadData {
112
- selectedSampleRequest : string
113
110
sampleText : string
114
- selectedFile : string
115
- selectedFilePath : string
116
- selectedTestEvent : string
117
- newTestEventName : string
118
111
}
119
112
120
113
export interface RemoteInvokeData {
@@ -377,7 +370,7 @@ export class RemoteInvokeWebview extends VueWebview {
377
370
this . data . LambdaFunctionNode ?. configuration . Handler
378
371
)
379
372
getLogger ( ) . warn ( warning )
380
- void vscode . window . showWarningMessage ( warning )
373
+ void showMessage ( 'warn' , warning )
381
374
}
382
375
return fileLocations [ 0 ] . fsPath
383
376
}
@@ -443,22 +436,166 @@ export class RemoteInvokeWebview extends VueWebview {
443
436
}
444
437
445
438
public async listRemoteTestEvents ( functionArn : string , region : string ) : Promise < string [ ] > {
446
- const params : SamCliRemoteTestEventsParameters = {
447
- functionArn : functionArn ,
448
- operation : TestEventsOperation . List ,
449
- region : region ,
439
+ try {
440
+ const params : SamCliRemoteTestEventsParameters = {
441
+ functionArn : functionArn ,
442
+ operation : TestEventsOperation . List ,
443
+ region : region ,
444
+ }
445
+ const result = await this . remoteTestEvents ( params )
446
+ return result . split ( '\n' ) . filter ( ( event ) => event . trim ( ) !== '' )
447
+ } catch ( error ) {
448
+ // Suppress "lambda-testevent-schemas registry not found" error - this is normal when no test events exist
449
+ const errorMessage = error instanceof Error ? error . message : String ( error )
450
+ if (
451
+ errorMessage . includes ( 'lambda-testevent-schemas registry not found' ) ||
452
+ errorMessage . includes ( 'There are no saved events' )
453
+ ) {
454
+ getLogger ( ) . debug ( 'No remote test events found for function: %s' , functionArn )
455
+ return [ ]
456
+ }
457
+ // Re-throw other errors
458
+ throw error
459
+ }
460
+ }
461
+
462
+ public async selectRemoteTestEvent ( functionArn : string , region : string ) : Promise < string | undefined > {
463
+ let events : string [ ] = [ ]
464
+
465
+ try {
466
+ events = await this . listRemoteTestEvents ( functionArn , region )
467
+ } catch ( error ) {
468
+ getLogger ( ) . error ( 'Failed to list remote test events: %O' , error )
469
+ void showMessage (
470
+ 'error' ,
471
+ localize ( 'AWS.lambda.remoteInvoke.failedToListEvents' , 'Failed to list remote test events' )
472
+ )
473
+ return undefined
474
+ }
475
+
476
+ if ( events . length === 0 ) {
477
+ void showMessage (
478
+ 'info' ,
479
+ localize (
480
+ 'AWS.lambda.remoteInvoke.noRemoteEvents' ,
481
+ 'No remote test events found. You can create one using "Save as remote event".'
482
+ )
483
+ )
484
+ return undefined
485
+ }
486
+
487
+ const selected = await vscode . window . showQuickPick ( events , {
488
+ placeHolder : localize ( 'AWS.lambda.remoteInvoke.selectRemoteEvent' , 'Select a remote test event' ) ,
489
+ title : localize ( 'AWS.lambda.remoteInvoke.loadRemoteEvent' , 'Load Remote Test Event' ) ,
490
+ } )
491
+
492
+ if ( selected ) {
493
+ const eventData = {
494
+ name : selected ,
495
+ region : region ,
496
+ arn : functionArn ,
497
+ }
498
+ const resp = await this . getRemoteTestEvents ( eventData )
499
+ return resp
450
500
}
451
- const result = await this . remoteTestEvents ( params )
452
- return result . split ( '\n' )
501
+
502
+ return undefined
453
503
}
454
504
455
- public async createRemoteTestEvents ( putEvent : Event ) {
505
+ public async saveRemoteTestEvent (
506
+ functionArn : string ,
507
+ region : string ,
508
+ eventContent : string
509
+ ) : Promise < string | undefined > {
510
+ let events : string [ ] = [ ]
511
+
512
+ try {
513
+ events = await this . listRemoteTestEvents ( functionArn , region )
514
+ } catch ( error ) {
515
+ // Log error but continue - user can still create new events
516
+ getLogger ( ) . debug ( 'Failed to list existing remote test events (may not exist yet): %O' , error )
517
+ }
518
+
519
+ // Create options for quickpick
520
+ const createNewOption = '$(add) Create new test event'
521
+ const options = events . length > 0 ? [ createNewOption , ...events ] : [ createNewOption ]
522
+
523
+ const selected = await vscode . window . showQuickPick ( options , {
524
+ placeHolder : localize (
525
+ 'AWS.lambda.remoteInvoke.saveEventChoice' ,
526
+ 'Create new or overwrite existing test event'
527
+ ) ,
528
+ title : localize ( 'AWS.lambda.remoteInvoke.saveRemoteEvent' , 'Save as Remote Event' ) ,
529
+ } )
530
+
531
+ if ( ! selected ) {
532
+ return undefined
533
+ }
534
+
535
+ let eventName : string | undefined
536
+
537
+ if ( selected === createNewOption ) {
538
+ // Prompt for new event name
539
+ eventName = await vscode . window . showInputBox ( {
540
+ prompt : localize ( 'AWS.lambda.remoteInvoke.enterEventName' , 'Enter a name for the test event' ) ,
541
+ placeHolder : localize ( 'AWS.lambda.remoteInvoke.eventNamePlaceholder' , 'MyTestEvent' ) ,
542
+ validateInput : ( value ) => {
543
+ if ( ! value || value . trim ( ) === '' ) {
544
+ return localize ( 'AWS.lambda.remoteInvoke.eventNameRequired' , 'Event name is required' )
545
+ }
546
+ if ( events . includes ( value ) ) {
547
+ return localize (
548
+ 'AWS.lambda.remoteInvoke.eventNameExists' ,
549
+ 'An event with this name already exists'
550
+ )
551
+ }
552
+ return undefined
553
+ } ,
554
+ } )
555
+ } else {
556
+ // Use selected existing event name
557
+ const confirm = await showConfirmationMessage ( {
558
+ prompt : localize (
559
+ 'AWS.lambda.remoteInvoke.overwriteEvent' ,
560
+ 'Overwrite existing test event "{0}"?' ,
561
+ selected
562
+ ) ,
563
+ confirm : localize ( 'AWS.lambda.remoteInvoke.overwrite' , 'Overwrite' ) ,
564
+ cancel : 'Cancel' ,
565
+ type : 'warning' ,
566
+ } )
567
+
568
+ if ( confirm ) {
569
+ eventName = selected
570
+ }
571
+ }
572
+
573
+ if ( eventName ) {
574
+ // Use force flag when overwriting existing events
575
+ const isOverwriting = selected !== createNewOption
576
+ const params : SamCliRemoteTestEventsParameters = {
577
+ functionArn : functionArn ,
578
+ operation : TestEventsOperation . Put ,
579
+ name : eventName ,
580
+ eventSample : eventContent ,
581
+ region : region ,
582
+ force : isOverwriting ,
583
+ }
584
+ await this . remoteTestEvents ( params )
585
+ return eventName
586
+ }
587
+
588
+ return undefined
589
+ }
590
+
591
+ public async createRemoteTestEvents ( putEvent : Event , force : boolean = false ) {
456
592
const params : SamCliRemoteTestEventsParameters = {
457
593
functionArn : putEvent . arn ,
458
594
operation : TestEventsOperation . Put ,
459
595
name : putEvent . name ,
460
596
eventSample : putEvent . event ,
461
597
region : putEvent . region ,
598
+ force : force ,
462
599
}
463
600
return await this . remoteTestEvents ( params )
464
601
}
@@ -549,7 +686,8 @@ export class RemoteInvokeWebview extends VueWebview {
549
686
// this serves as a lock for invoke
550
687
public checkReadyToInvoke ( ) : boolean {
551
688
if ( this . isInvoking ) {
552
- void vscode . window . showWarningMessage (
689
+ void showMessage (
690
+ 'warn' ,
553
691
localize (
554
692
'AWS.lambda.remoteInvoke.invokeInProgress' ,
555
693
'A remote invoke is already in progress, please wait for previous invoke, or remove debug setup'
@@ -558,12 +696,14 @@ export class RemoteInvokeWebview extends VueWebview {
558
696
return false
559
697
}
560
698
if ( this . isStartingDebug ) {
561
- void vscode . window . showWarningMessage (
699
+ void showMessage (
700
+ 'warn' ,
562
701
localize (
563
702
'AWS.lambda.remoteInvoke.debugSetupInProgress' ,
564
703
'A debugger setup is already in progress, please wait for previous setup to complete, or remove debug setup'
565
704
)
566
705
)
706
+ return false
567
707
}
568
708
return true
569
709
}
0 commit comments