@@ -102,19 +102,12 @@ export interface RuntimeDebugSettings {
102102// UI state sub-interface
103103export interface UIState {
104104 isCollapsed : boolean
105- showNameInput : boolean
106- payload : string
107105 extraRegionInfo : string
108106}
109107
110108// Payload/Event handling sub-interface
111109export interface PayloadData {
112- selectedSampleRequest : string
113110 sampleText : string
114- selectedFile : string
115- selectedFilePath : string
116- selectedTestEvent : string
117- newTestEventName : string
118111}
119112
120113export 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