@@ -130,6 +130,18 @@ export function registerExecution(
130130 { document, documentPath, position } : OperationLocation ,
131131 instance : InstanceType ,
132132 ) {
133+ analyticsLogger . logger . logUsage (
134+ instance === InstanceType . LOCAL
135+ ? DATA_CONNECT_EVENT_NAME . RUN_LOCAL
136+ : DATA_CONNECT_EVENT_NAME . RUN_PROD ,
137+ ) ;
138+ analyticsLogger . logger . logUsage (
139+ instance === InstanceType . LOCAL
140+ ? DATA_CONNECT_EVENT_NAME . RUN_LOCAL + `_${ ast . operation } `
141+ : DATA_CONNECT_EVENT_NAME . RUN_PROD + `_${ ast . operation } ` ,
142+ ) ;
143+ await vscode . window . activeTextEditor ?. document . save ( ) ;
144+
133145 // hold last execution in memory, and send operation name to webview
134146 lastExecutionInputSignal . value = {
135147 ast,
@@ -170,6 +182,7 @@ export function registerExecution(
170182 ! configs . get ( alwaysExecuteMutationsInProduction ) &&
171183 ast . operation === OperationTypeNode . MUTATION
172184 ) {
185+ analyticsLogger . logger . logUsage ( DATA_CONNECT_EVENT_NAME . RUN_PROD_MUTATION_WARNING ) ;
173186 const always = "Yes (always)" ;
174187 const yes = "Yes" ;
175188 const result = await vscode . window . showWarningMessage (
@@ -179,17 +192,28 @@ export function registerExecution(
179192 always ,
180193 ) ;
181194
182- if ( result !== always && result !== yes ) {
183- return ;
184- }
185-
186- // If the user selects "always", we update User settings.
187- if ( result === always ) {
188- configs . update (
189- alwaysExecuteMutationsInProduction ,
190- true ,
191- ConfigurationTarget . Global ,
192- ) ;
195+ switch ( result ) {
196+ case yes :
197+ analyticsLogger . logger . logUsage (
198+ DATA_CONNECT_EVENT_NAME . RUN_PROD_MUTATION_WARNING_ACKED
199+ ) ;
200+ break ;
201+ case always :
202+ // If the user selects "always", we update User settings.
203+ configs . update (
204+ alwaysExecuteMutationsInProduction ,
205+ true ,
206+ ConfigurationTarget . Global ,
207+ ) ;
208+ analyticsLogger . logger . logUsage (
209+ DATA_CONNECT_EVENT_NAME . RUN_PROD_MUTATION_WARNING_ACKED_ALWAYS
210+ ) ;
211+ break ;
212+ default :
213+ analyticsLogger . logger . logUsage (
214+ DATA_CONNECT_EVENT_NAME . RUN_PROD_MUTATION_WARNING_REJECTED
215+ ) ;
216+ return ;
193217 }
194218 }
195219
@@ -237,6 +261,7 @@ export function registerExecution(
237261
238262 // prompt user to continue execution or modify arguments
239263 if ( missingArgs . length > 0 ) {
264+ analyticsLogger . logger . logUsage ( DATA_CONNECT_EVENT_NAME . MISSING_VARIABLES ) ;
240265 // open a modal with option to run anyway or edit args
241266 const editArgs = { title : "Edit variables" } ;
242267 const continueExecution = { title : "Continue Execution" } ;
@@ -314,6 +339,7 @@ export function registerExecution(
314339 }
315340
316341 async function generateOperation ( arg : GenerateOperationInput ) {
342+ analyticsLogger . logger . logUsage ( DATA_CONNECT_EVENT_NAME . GENERATE_OPERATION ) ;
317343 if ( ! arg . projectId ) {
318344 vscode . window . showErrorMessage ( `Connect a Firebase project to use Gemini in Firebase features.` ) ;
319345 return ;
@@ -339,6 +365,7 @@ ${schema}
339365 }
340366
341367 async function showGiFToSModal ( projectId : string ) : Promise < boolean > {
368+ analyticsLogger . logger . logUsage ( DATA_CONNECT_EVENT_NAME . GIF_TOS_MODAL ) ;
342369 const tos = "Terms of Service" ;
343370 const enable = "Enable" ;
344371 const result = await vscode . window . showWarningMessage (
@@ -352,15 +379,20 @@ ${schema}
352379 ) ;
353380 switch ( result ) {
354381 case enable :
382+ analyticsLogger . logger . logUsage ( DATA_CONNECT_EVENT_NAME . GIF_TOS_MODAL_ACKED ) ;
355383 configstore . set ( "gemini" , true ) ;
356384 await ensureGIFApiTos ( projectId ) ;
357385 return true ;
358386 case tos :
387+ analyticsLogger . logger . logUsage ( DATA_CONNECT_EVENT_NAME . GIF_TOS_MODAL_CLICKED ) ;
359388 vscode . env . openExternal (
360389 vscode . Uri . parse (
361390 "https://firebase.google.com/docs/gemini-in-firebase#how-gemini-in-firebase-uses-your-data" ,
362391 ) ,
363392 ) ;
393+ default :
394+ analyticsLogger . logger . logUsage ( DATA_CONNECT_EVENT_NAME . GIF_TOS_MODAL_REJECTED ) ;
395+ break ;
364396 }
365397 return false ;
366398 }
@@ -390,21 +422,12 @@ ${schema}
390422 vscode . commands . registerCommand (
391423 "firebase.dataConnect.executeOperation" ,
392424 async ( ast , location , instanceType : InstanceType ) => {
393- analyticsLogger . logger . logUsage (
394- instanceType === InstanceType . LOCAL
395- ? DATA_CONNECT_EVENT_NAME . RUN_LOCAL
396- : DATA_CONNECT_EVENT_NAME . RUN_PROD ,
397- ) ;
398- await vscode . window . activeTextEditor ?. document . save ( ) ;
399425 await executeOperation ( ast , location , instanceType ) ;
400426 } ,
401427 ) ,
402428 vscode . commands . registerCommand (
403429 "firebase.dataConnect.generateOperation" ,
404430 async ( arg : GenerateOperationInput ) => {
405- analyticsLogger . logger . logUsage (
406- DATA_CONNECT_EVENT_NAME . GENERATE_OPERATION ,
407- ) ;
408431 await generateOperation ( arg ) ;
409432 } ,
410433 ) ,
@@ -493,14 +516,3 @@ function getDefaultArgs(args: TypedInput[]) {
493516 return acc ;
494517 } , { } ) ;
495518}
496-
497- // converts AST OperationDefinitionNode to a DocumentNode for schema validation
498- function operationDefinitionToDocument (
499- operationDefinition : OperationDefinitionNode ,
500- ) : DocumentNode {
501- return {
502- kind : Kind . DOCUMENT ,
503- definitions : [ operationDefinition ] ,
504- loc : operationDefinition . loc ,
505- } ;
506- }
0 commit comments