@finos/legend-application-studio 28.21.45 → 28.21.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/lib/__lib__/LegendStudioEvent.d.ts +55 -1
  2. package/lib/__lib__/LegendStudioEvent.d.ts.map +1 -1
  3. package/lib/__lib__/LegendStudioEvent.js +77 -0
  4. package/lib/__lib__/LegendStudioEvent.js.map +1 -1
  5. package/lib/__lib__/LegendStudioTelemetryHelper.d.ts +491 -1
  6. package/lib/__lib__/LegendStudioTelemetryHelper.d.ts.map +1 -1
  7. package/lib/__lib__/LegendStudioTelemetryHelper.js +594 -1
  8. package/lib/__lib__/LegendStudioTelemetryHelper.js.map +1 -1
  9. package/lib/components/editor/side-bar/WorkflowManager.d.ts.map +1 -1
  10. package/lib/components/editor/side-bar/WorkflowManager.js +15 -0
  11. package/lib/components/editor/side-bar/WorkflowManager.js.map +1 -1
  12. package/lib/index.css +1 -1
  13. package/lib/index.d.ts +1 -1
  14. package/lib/index.d.ts.map +1 -1
  15. package/lib/index.js +1 -1
  16. package/lib/index.js.map +1 -1
  17. package/lib/package.json +1 -1
  18. package/lib/stores/editor/EditorGraphState.d.ts.map +1 -1
  19. package/lib/stores/editor/EditorGraphState.js +17 -1
  20. package/lib/stores/editor/EditorGraphState.js.map +1 -1
  21. package/lib/stores/editor/EditorStore.d.ts.map +1 -1
  22. package/lib/stores/editor/EditorStore.js +10 -0
  23. package/lib/stores/editor/EditorStore.js.map +1 -1
  24. package/lib/stores/editor/EditorTabManagerState.d.ts +18 -1
  25. package/lib/stores/editor/EditorTabManagerState.d.ts.map +1 -1
  26. package/lib/stores/editor/EditorTabManagerState.js +90 -1
  27. package/lib/stores/editor/EditorTabManagerState.js.map +1 -1
  28. package/lib/stores/editor/EditorTabTelemetryHelper.d.ts +31 -0
  29. package/lib/stores/editor/EditorTabTelemetryHelper.d.ts.map +1 -0
  30. package/lib/stores/editor/EditorTabTelemetryHelper.js +55 -0
  31. package/lib/stores/editor/EditorTabTelemetryHelper.js.map +1 -0
  32. package/lib/stores/editor/GraphEditFormModeState.d.ts.map +1 -1
  33. package/lib/stores/editor/GraphEditFormModeState.js +11 -1
  34. package/lib/stores/editor/GraphEditFormModeState.js.map +1 -1
  35. package/lib/stores/editor/editor-state/GraphGenerationState.d.ts.map +1 -1
  36. package/lib/stores/editor/editor-state/GraphGenerationState.js +25 -0
  37. package/lib/stores/editor/editor-state/GraphGenerationState.js.map +1 -1
  38. package/lib/stores/editor/editor-state/ModelImporterState.d.ts.map +1 -1
  39. package/lib/stores/editor/editor-state/ModelImporterState.js +2 -1
  40. package/lib/stores/editor/editor-state/ModelImporterState.js.map +1 -1
  41. package/lib/stores/editor/editor-state/element-editor-state/ElementExternalFormatGenerationState.d.ts.map +1 -1
  42. package/lib/stores/editor/editor-state/element-editor-state/ElementExternalFormatGenerationState.js +14 -0
  43. package/lib/stores/editor/editor-state/element-editor-state/ElementExternalFormatGenerationState.js.map +1 -1
  44. package/lib/stores/editor/editor-state/element-editor-state/availability/testable/AvailabilityTestableState.d.ts +5 -0
  45. package/lib/stores/editor/editor-state/element-editor-state/availability/testable/AvailabilityTestableState.d.ts.map +1 -1
  46. package/lib/stores/editor/editor-state/element-editor-state/availability/testable/AvailabilityTestableState.js +13 -0
  47. package/lib/stores/editor/editor-state/element-editor-state/availability/testable/AvailabilityTestableState.js.map +1 -1
  48. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/testable/DataProductTestableState.d.ts +5 -0
  49. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/testable/DataProductTestableState.d.ts.map +1 -1
  50. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/testable/DataProductTestableState.js +13 -0
  51. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/testable/DataProductTestableState.js.map +1 -1
  52. package/lib/stores/editor/editor-state/element-editor-state/function-activator/testable/FunctionTestableState.d.ts +7 -0
  53. package/lib/stores/editor/editor-state/element-editor-state/function-activator/testable/FunctionTestableState.d.ts.map +1 -1
  54. package/lib/stores/editor/editor-state/element-editor-state/function-activator/testable/FunctionTestableState.js +19 -0
  55. package/lib/stores/editor/editor-state/element-editor-state/function-activator/testable/FunctionTestableState.js.map +1 -1
  56. package/lib/stores/editor/editor-state/element-editor-state/ingest/IngestTestableState.d.ts +5 -0
  57. package/lib/stores/editor/editor-state/element-editor-state/ingest/IngestTestableState.d.ts.map +1 -1
  58. package/lib/stores/editor/editor-state/element-editor-state/ingest/IngestTestableState.js +13 -0
  59. package/lib/stores/editor/editor-state/element-editor-state/ingest/IngestTestableState.js.map +1 -1
  60. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.d.ts +7 -0
  61. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.d.ts.map +1 -1
  62. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.js +34 -0
  63. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.js.map +1 -1
  64. package/lib/stores/editor/editor-state/element-editor-state/service/ServiceRegistrationState.d.ts.map +1 -1
  65. package/lib/stores/editor/editor-state/element-editor-state/service/ServiceRegistrationState.js +29 -0
  66. package/lib/stores/editor/editor-state/element-editor-state/service/ServiceRegistrationState.js.map +1 -1
  67. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.d.ts.map +1 -1
  68. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.js +2 -0
  69. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.js.map +1 -1
  70. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestEditorState.d.ts +3 -0
  71. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestEditorState.d.ts.map +1 -1
  72. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestEditorState.js +7 -0
  73. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestEditorState.js.map +1 -1
  74. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.d.ts.map +1 -1
  75. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.js +46 -17
  76. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.js.map +1 -1
  77. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.d.ts +7 -0
  78. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.d.ts.map +1 -1
  79. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.js +110 -16
  80. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.js.map +1 -1
  81. package/lib/stores/editor/editor-state/project-configuration-editor-state/ProjectConfigurationEditorState.d.ts +2 -1
  82. package/lib/stores/editor/editor-state/project-configuration-editor-state/ProjectConfigurationEditorState.d.ts.map +1 -1
  83. package/lib/stores/editor/editor-state/project-configuration-editor-state/ProjectConfigurationEditorState.js +10 -4
  84. package/lib/stores/editor/editor-state/project-configuration-editor-state/ProjectConfigurationEditorState.js.map +1 -1
  85. package/lib/stores/editor/sidebar-state/BulkServiceRegistrationState.d.ts.map +1 -1
  86. package/lib/stores/editor/sidebar-state/BulkServiceRegistrationState.js +11 -0
  87. package/lib/stores/editor/sidebar-state/BulkServiceRegistrationState.js.map +1 -1
  88. package/lib/stores/editor/sidebar-state/ProjectOverviewState.d.ts.map +1 -1
  89. package/lib/stores/editor/sidebar-state/ProjectOverviewState.js +51 -0
  90. package/lib/stores/editor/sidebar-state/ProjectOverviewState.js.map +1 -1
  91. package/lib/stores/editor/sidebar-state/WorkflowManagerState.d.ts +14 -0
  92. package/lib/stores/editor/sidebar-state/WorkflowManagerState.d.ts.map +1 -1
  93. package/lib/stores/editor/sidebar-state/WorkflowManagerState.js +141 -26
  94. package/lib/stores/editor/sidebar-state/WorkflowManagerState.js.map +1 -1
  95. package/lib/stores/editor/sidebar-state/WorkspaceReviewState.d.ts.map +1 -1
  96. package/lib/stores/editor/sidebar-state/WorkspaceReviewState.js +41 -0
  97. package/lib/stores/editor/sidebar-state/WorkspaceReviewState.js.map +1 -1
  98. package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.d.ts.map +1 -1
  99. package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.js +71 -9
  100. package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.js.map +1 -1
  101. package/lib/stores/project-reviewer/ProjectReviewerStore.d.ts.map +1 -1
  102. package/lib/stores/project-reviewer/ProjectReviewerStore.js +45 -0
  103. package/lib/stores/project-reviewer/ProjectReviewerStore.js.map +1 -1
  104. package/lib/stores/workspace-setup/WorkspaceSetupStore.d.ts.map +1 -1
  105. package/lib/stores/workspace-setup/WorkspaceSetupStore.js +48 -4
  106. package/lib/stores/workspace-setup/WorkspaceSetupStore.js.map +1 -1
  107. package/package.json +9 -9
  108. package/src/__lib__/LegendStudioEvent.ts +88 -0
  109. package/src/__lib__/LegendStudioTelemetryHelper.ts +1389 -204
  110. package/src/components/editor/side-bar/WorkflowManager.tsx +24 -0
  111. package/src/index.ts +4 -1
  112. package/src/stores/editor/EditorGraphState.ts +30 -1
  113. package/src/stores/editor/EditorStore.ts +19 -0
  114. package/src/stores/editor/EditorTabManagerState.ts +128 -1
  115. package/src/stores/editor/EditorTabTelemetryHelper.ts +70 -0
  116. package/src/stores/editor/GraphEditFormModeState.ts +19 -1
  117. package/src/stores/editor/editor-state/GraphGenerationState.ts +53 -0
  118. package/src/stores/editor/editor-state/ModelImporterState.ts +2 -0
  119. package/src/stores/editor/editor-state/element-editor-state/ElementExternalFormatGenerationState.ts +30 -0
  120. package/src/stores/editor/editor-state/element-editor-state/availability/testable/AvailabilityTestableState.ts +17 -0
  121. package/src/stores/editor/editor-state/element-editor-state/dataProduct/testable/DataProductTestableState.ts +17 -0
  122. package/src/stores/editor/editor-state/element-editor-state/function-activator/testable/FunctionTestableState.ts +25 -0
  123. package/src/stores/editor/editor-state/element-editor-state/ingest/IngestTestableState.ts +17 -0
  124. package/src/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.ts +57 -0
  125. package/src/stores/editor/editor-state/element-editor-state/service/ServiceRegistrationState.ts +56 -0
  126. package/src/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.ts +10 -0
  127. package/src/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestEditorState.ts +9 -0
  128. package/src/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.ts +78 -21
  129. package/src/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.ts +205 -18
  130. package/src/stores/editor/editor-state/project-configuration-editor-state/ProjectConfigurationEditorState.ts +38 -3
  131. package/src/stores/editor/sidebar-state/BulkServiceRegistrationState.ts +27 -0
  132. package/src/stores/editor/sidebar-state/ProjectOverviewState.ts +114 -0
  133. package/src/stores/editor/sidebar-state/WorkflowManagerState.ts +259 -29
  134. package/src/stores/editor/sidebar-state/WorkspaceReviewState.ts +84 -0
  135. package/src/stores/editor/sidebar-state/testable/GlobalTestRunnerState.ts +124 -17
  136. package/src/stores/project-reviewer/ProjectReviewerStore.ts +97 -0
  137. package/src/stores/workspace-setup/WorkspaceSetupStore.ts +87 -4
  138. package/tsconfig.json +1 -0
@@ -25,6 +25,11 @@ import {
25
25
  import type { EditorStore } from '../EditorStore.js';
26
26
  import type { EditorSDLCState } from '../EditorSDLCState.js';
27
27
  import { LEGEND_STUDIO_APP_EVENT } from '../../../__lib__/LegendStudioEvent.js';
28
+ import {
29
+ LegendStudioTelemetryHelper,
30
+ SDLC_REVIEW_ACTION,
31
+ SDLC_REVIEW_ROLE,
32
+ } from '../../../__lib__/LegendStudioTelemetryHelper.js';
28
33
  import { LegendStudioUserDataHelper } from '../../../__lib__/LegendStudioUserDataHelper.js';
29
34
  import {
30
35
  type GeneratorFn,
@@ -287,6 +292,22 @@ export class WorkspaceReviewState {
287
292
  return;
288
293
  }
289
294
  this.isClosingWorkspaceReview = true;
295
+ const startTime = Date.now();
296
+ const reviewId = this.workspaceReview.id;
297
+ const sourceInfo = this.editorStore.editorMode.getSourceInfo();
298
+ const identity = {
299
+ action: SDLC_REVIEW_ACTION.CLOSE,
300
+ role: SDLC_REVIEW_ROLE.AUTHOR,
301
+ projectId: this.sdlcState.activeProject.projectId,
302
+ patchReleaseVersionId:
303
+ this.sdlcState.activePatch?.patchReleaseVersionId.id,
304
+ reviewId,
305
+ };
306
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionLaunched(
307
+ this.editorStore.applicationStore.telemetryService,
308
+ sourceInfo,
309
+ identity,
310
+ );
290
311
  try {
291
312
  yield this.editorStore.sdlcServerClient.rejectReview(
292
313
  this.sdlcState.activeProject.projectId,
@@ -294,12 +315,22 @@ export class WorkspaceReviewState {
294
315
  this.workspaceReview.id,
295
316
  );
296
317
  this.workspaceReview = undefined;
318
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionSucceeded(
319
+ this.editorStore.applicationStore.telemetryService,
320
+ sourceInfo,
321
+ { ...identity, durationMs: Date.now() - startTime },
322
+ );
297
323
  } catch (error) {
298
324
  assertErrorThrown(error);
299
325
  this.editorStore.applicationStore.logService.error(
300
326
  LogEvent.create(LEGEND_STUDIO_APP_EVENT.SDLC_MANAGER_FAILURE),
301
327
  error,
302
328
  );
329
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionFailure(
330
+ this.editorStore.applicationStore.telemetryService,
331
+ sourceInfo,
332
+ { ...identity, errorMessage: error.message },
333
+ );
303
334
  this.editorStore.applicationStore.notificationService.notifyError(error);
304
335
  } finally {
305
336
  this.isClosingWorkspaceReview = false;
@@ -332,6 +363,20 @@ export class WorkspaceReviewState {
332
363
  return;
333
364
  }
334
365
  this.isCreatingWorkspaceReview = true;
366
+ const startTime = Date.now();
367
+ const sourceInfo = this.editorStore.editorMode.getSourceInfo();
368
+ const identity = {
369
+ action: SDLC_REVIEW_ACTION.CREATE,
370
+ role: SDLC_REVIEW_ROLE.AUTHOR,
371
+ projectId: this.sdlcState.activeProject.projectId,
372
+ patchReleaseVersionId:
373
+ this.sdlcState.activePatch?.patchReleaseVersionId.id,
374
+ };
375
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionLaunched(
376
+ this.editorStore.applicationStore.telemetryService,
377
+ sourceInfo,
378
+ identity,
379
+ );
335
380
  try {
336
381
  const description =
337
382
  reviewDescription ??
@@ -348,12 +393,26 @@ export class WorkspaceReviewState {
348
393
  },
349
394
  )) as PlainObject<Review>,
350
395
  );
396
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionSucceeded(
397
+ this.editorStore.applicationStore.telemetryService,
398
+ sourceInfo,
399
+ {
400
+ ...identity,
401
+ reviewId: this.workspaceReview.id,
402
+ durationMs: Date.now() - startTime,
403
+ },
404
+ );
351
405
  } catch (error) {
352
406
  assertErrorThrown(error);
353
407
  this.editorStore.applicationStore.logService.error(
354
408
  LogEvent.create(LEGEND_STUDIO_APP_EVENT.SDLC_MANAGER_FAILURE),
355
409
  error,
356
410
  );
411
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionFailure(
412
+ this.editorStore.applicationStore.telemetryService,
413
+ sourceInfo,
414
+ { ...identity, errorMessage: error.message },
415
+ );
357
416
  this.editorStore.applicationStore.notificationService.notifyError(error);
358
417
  } finally {
359
418
  this.isCreatingWorkspaceReview = false;
@@ -396,6 +455,21 @@ export class WorkspaceReviewState {
396
455
  return;
397
456
  }
398
457
 
458
+ const startTime = Date.now();
459
+ const sourceInfo = this.editorStore.editorMode.getSourceInfo();
460
+ const identity = {
461
+ action: SDLC_REVIEW_ACTION.COMMIT,
462
+ role: SDLC_REVIEW_ROLE.AUTHOR,
463
+ projectId: this.sdlcState.activeProject.projectId,
464
+ patchReleaseVersionId:
465
+ this.sdlcState.activePatch?.patchReleaseVersionId.id,
466
+ reviewId: review.id,
467
+ };
468
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionLaunched(
469
+ this.editorStore.applicationStore.telemetryService,
470
+ sourceInfo,
471
+ identity,
472
+ );
399
473
  try {
400
474
  yield this.editorStore.sdlcServerClient.commitReview(
401
475
  this.sdlcState.activeProject.projectId,
@@ -403,6 +477,11 @@ export class WorkspaceReviewState {
403
477
  review.id,
404
478
  { message: `${review.title} [review]` },
405
479
  );
480
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionSucceeded(
481
+ this.editorStore.applicationStore.telemetryService,
482
+ sourceInfo,
483
+ { ...identity, durationMs: Date.now() - startTime },
484
+ );
406
485
  // Committing a review deletes the workspace on SDLC. Drop it from
407
486
  // the recents cache so the workspace setup screen doesn't keep
408
487
  // offering a dead link. Patch workspaces are never cached.
@@ -452,6 +531,11 @@ export class WorkspaceReviewState {
452
531
  LogEvent.create(LEGEND_STUDIO_APP_EVENT.SDLC_MANAGER_FAILURE),
453
532
  error,
454
533
  );
534
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionFailure(
535
+ this.editorStore.applicationStore.telemetryService,
536
+ sourceInfo,
537
+ { ...identity, errorMessage: error.message },
538
+ );
455
539
  this.editorStore.applicationStore.notificationService.notifyError(error);
456
540
  } finally {
457
541
  this.isCommittingWorkspaceReview = false;
@@ -54,6 +54,14 @@ import type {
54
54
  } from '../../../LegendStudioApplicationPlugin.js';
55
55
  import { ServiceEditorState } from '../../editor-state/element-editor-state/service/ServiceEditorState.js';
56
56
  import { LegendStudioUserDataHelper } from '../../../../__lib__/LegendStudioUserDataHelper.js';
57
+ import {
58
+ GLOBAL_TEST_RUN_SCOPE,
59
+ LegendStudioTelemetryHelper,
60
+ TESTABLE_RUN_MODE,
61
+ getTestableKind,
62
+ getTestablePath,
63
+ summarizeTestResults,
64
+ } from '../../../../__lib__/LegendStudioTelemetryHelper.js';
57
65
 
58
66
  // Testable Metadata
59
67
  export interface TestableMetadata {
@@ -456,6 +464,10 @@ export class TestableState {
456
464
  this.isRunningTests.inProgress();
457
465
  let input: RunTestsTestableInput;
458
466
  let currentNode = node;
467
+ const testable = this.testableMetadata.testable;
468
+ let mode: TESTABLE_RUN_MODE = TESTABLE_RUN_MODE.RUN_TESTABLE;
469
+ let suiteId: string | undefined;
470
+ let testCount = 0;
459
471
  try {
460
472
  if (node instanceof AssertionTestTreeNodeData) {
461
473
  const atomicTest = guaranteeNonNullable(node.assertion.parentTest);
@@ -463,8 +475,11 @@ export class TestableState {
463
475
  atomicTest.__parent instanceof TestSuite
464
476
  ? atomicTest.__parent
465
477
  : undefined;
466
- input = new RunTestsTestableInput(this.testableMetadata.testable);
478
+ input = new RunTestsTestableInput(testable);
467
479
  input.unitTestIds = [new UniqueTestId(suite, atomicTest)];
480
+ mode = TESTABLE_RUN_MODE.RUN_TEST;
481
+ suiteId = suite?.id;
482
+ testCount = 1;
468
483
  const parentNode = Array.from(this.treeData.nodes.values())
469
484
  .filter(filterByType(AtomicTestTreeNodeData))
470
485
  .find((n) => n.atomicTest === atomicTest);
@@ -478,30 +493,74 @@ export class TestableState {
478
493
  atomicTest.__parent instanceof TestSuite
479
494
  ? atomicTest.__parent
480
495
  : undefined;
481
- input = new RunTestsTestableInput(this.testableMetadata.testable);
496
+ input = new RunTestsTestableInput(testable);
482
497
  input.unitTestIds = [new UniqueTestId(suite, atomicTest)];
498
+ mode = TESTABLE_RUN_MODE.RUN_TEST;
499
+ suiteId = suite?.id;
500
+ testCount = 1;
483
501
  node.isRunning = true;
484
502
  } else if (node instanceof TestSuiteTreeNodeData) {
485
- input = new RunTestsTestableInput(this.testableMetadata.testable);
503
+ input = new RunTestsTestableInput(testable);
486
504
  input.unitTestIds = node.testSuite.tests.map(
487
505
  (s) => new UniqueTestId(node.testSuite, s),
488
506
  );
507
+ mode = TESTABLE_RUN_MODE.RUN_SUITE;
508
+ suiteId = node.testSuite.id;
509
+ testCount = node.testSuite.tests.length;
489
510
  node.isRunning = true;
490
511
  } else if (node instanceof TestableTreeNodeData) {
491
- input = new RunTestsTestableInput(this.testableMetadata.testable);
512
+ input = new RunTestsTestableInput(testable);
513
+ mode = TESTABLE_RUN_MODE.RUN_TESTABLE;
514
+ suiteId = undefined;
515
+ testCount = testable.tests.reduce(
516
+ (acc, t) => acc + (t instanceof TestSuite ? t.tests.length : 1),
517
+ 0,
518
+ );
492
519
  node.isRunning = true;
493
520
  } else {
494
521
  throw new UnsupportedOperationError(
495
522
  `Unable to run tests for node ${node}`,
496
523
  );
497
524
  }
498
- const testResults =
499
- (yield this.editorStore.graphManagerState.graphManager.runTests(
500
- [input],
501
- this.editorStore.graphManagerState.graph,
502
- )) as TestResult[];
503
- this.globalTestRunnerState.handleResults(testResults);
504
- this.isRunningTests.complete();
525
+ const telemetryBase = {
526
+ testableKind: getTestableKind(testable),
527
+ testablePath: getTestablePath(testable),
528
+ suiteId,
529
+ mode,
530
+ testCount,
531
+ };
532
+ const startTime = Date.now();
533
+ LegendStudioTelemetryHelper.logEvent_TestableRunLaunched(
534
+ this.editorStore.applicationStore.telemetryService,
535
+ this.editorStore.editorMode.getSourceInfo(),
536
+ telemetryBase,
537
+ );
538
+ try {
539
+ const testResults =
540
+ (yield this.editorStore.graphManagerState.graphManager.runTests(
541
+ [input],
542
+ this.editorStore.graphManagerState.graph,
543
+ )) as TestResult[];
544
+ this.globalTestRunnerState.handleResults(testResults);
545
+ this.isRunningTests.complete();
546
+ LegendStudioTelemetryHelper.logEvent_TestableRunSucceeded(
547
+ this.editorStore.applicationStore.telemetryService,
548
+ this.editorStore.editorMode.getSourceInfo(),
549
+ {
550
+ ...telemetryBase,
551
+ durationMs: Date.now() - startTime,
552
+ ...summarizeTestResults(testResults),
553
+ },
554
+ );
555
+ } catch (error) {
556
+ assertErrorThrown(error);
557
+ LegendStudioTelemetryHelper.logEvent_TestableRunFailure(
558
+ this.editorStore.applicationStore.telemetryService,
559
+ this.editorStore.editorMode.getSourceInfo(),
560
+ { ...telemetryBase, errorMessage: error.message },
561
+ );
562
+ throw error;
563
+ }
505
564
  } catch (error) {
506
565
  assertErrorThrown(error);
507
566
  this.editorStore.applicationStore.notificationService.notifyError(error);
@@ -659,11 +718,21 @@ export class GlobalTestRunnerState {
659
718
  }
660
719
 
661
720
  *runAllTests(): GeneratorFn<void> {
721
+ const inputs = this.ownTestableStates.map(
722
+ (e) => new RunTestsTestableInput(e.testableMetadata.testable),
723
+ );
724
+ const telemetryBase = {
725
+ scope: GLOBAL_TEST_RUN_SCOPE.ALL,
726
+ testableCount: inputs.length,
727
+ };
728
+ const startTime = Date.now();
729
+ LegendStudioTelemetryHelper.logEvent_GlobalTestRunLaunched(
730
+ this.editorStore.applicationStore.telemetryService,
731
+ this.editorStore.editorMode.getSourceInfo(),
732
+ telemetryBase,
733
+ );
662
734
  try {
663
735
  this.isRunningTests.inProgress();
664
- const inputs = this.ownTestableStates.map(
665
- (e) => new RunTestsTestableInput(e.testableMetadata.testable),
666
- );
667
736
  const testResults =
668
737
  (yield this.editorStore.graphManagerState.graphManager.runTests(
669
738
  inputs,
@@ -671,10 +740,24 @@ export class GlobalTestRunnerState {
671
740
  )) as TestResult[];
672
741
  this.handleResults(testResults);
673
742
  this.isRunningTests.complete();
743
+ LegendStudioTelemetryHelper.logEvent_GlobalTestRunSucceeded(
744
+ this.editorStore.applicationStore.telemetryService,
745
+ this.editorStore.editorMode.getSourceInfo(),
746
+ {
747
+ ...telemetryBase,
748
+ durationMs: Date.now() - startTime,
749
+ ...summarizeTestResults(testResults),
750
+ },
751
+ );
674
752
  } catch (error) {
675
753
  assertErrorThrown(error);
676
754
  this.editorStore.applicationStore.notificationService.notifyError(error);
677
755
  this.isRunningTests.fail();
756
+ LegendStudioTelemetryHelper.logEvent_GlobalTestRunFailure(
757
+ this.editorStore.applicationStore.telemetryService,
758
+ this.editorStore.editorMode.getSourceInfo(),
759
+ { ...telemetryBase, errorMessage: error.message },
760
+ );
678
761
  }
679
762
  }
680
763
 
@@ -711,11 +794,21 @@ export class GlobalTestRunnerState {
711
794
  }
712
795
 
713
796
  *runDependenciesTests(): GeneratorFn<void> {
797
+ const inputs = this.allDependencyTestablesStates.map(
798
+ (e) => new RunTestsTestableInput(e.testableMetadata.testable),
799
+ );
800
+ const telemetryBase = {
801
+ scope: GLOBAL_TEST_RUN_SCOPE.DEPENDENCIES,
802
+ testableCount: inputs.length,
803
+ };
804
+ const startTime = Date.now();
805
+ LegendStudioTelemetryHelper.logEvent_GlobalTestRunLaunched(
806
+ this.editorStore.applicationStore.telemetryService,
807
+ this.editorStore.editorMode.getSourceInfo(),
808
+ telemetryBase,
809
+ );
714
810
  try {
715
811
  this.isRunningDependencyTests.inProgress();
716
- const inputs = this.allDependencyTestablesStates.map(
717
- (e) => new RunTestsTestableInput(e.testableMetadata.testable),
718
- );
719
812
  const testResults =
720
813
  (yield this.editorStore.graphManagerState.graphManager.runTests(
721
814
  inputs,
@@ -723,10 +816,24 @@ export class GlobalTestRunnerState {
723
816
  )) as TestResult[];
724
817
  this.handleResults(testResults);
725
818
  this.isRunningDependencyTests.complete();
819
+ LegendStudioTelemetryHelper.logEvent_GlobalTestRunSucceeded(
820
+ this.editorStore.applicationStore.telemetryService,
821
+ this.editorStore.editorMode.getSourceInfo(),
822
+ {
823
+ ...telemetryBase,
824
+ durationMs: Date.now() - startTime,
825
+ ...summarizeTestResults(testResults),
826
+ },
827
+ );
726
828
  } catch (error) {
727
829
  assertErrorThrown(error);
728
830
  this.editorStore.applicationStore.notificationService.notifyError(error);
729
831
  this.isRunningDependencyTests.fail();
832
+ LegendStudioTelemetryHelper.logEvent_GlobalTestRunFailure(
833
+ this.editorStore.applicationStore.telemetryService,
834
+ this.editorStore.editorMode.getSourceInfo(),
835
+ { ...telemetryBase, errorMessage: error.message },
836
+ );
730
837
  }
731
838
  }
732
839
  }
@@ -45,6 +45,11 @@ import {
45
45
  ReviewApproval,
46
46
  } from '@finos/legend-server-sdlc';
47
47
  import { LEGEND_STUDIO_APP_EVENT } from '../../__lib__/LegendStudioEvent.js';
48
+ import {
49
+ LegendStudioTelemetryHelper,
50
+ SDLC_REVIEW_ACTION,
51
+ SDLC_REVIEW_ROLE,
52
+ } from '../../__lib__/LegendStudioTelemetryHelper.js';
48
53
  import { LegendStudioUserDataHelper } from '../../__lib__/LegendStudioUserDataHelper.js';
49
54
  import { DEFAULT_TAB_SIZE } from '@finos/legend-application';
50
55
  import type { Entity } from '@finos/legend-storage';
@@ -431,6 +436,19 @@ export class ProjectReviewerStore {
431
436
 
432
437
  *approveReview(): GeneratorFn<void> {
433
438
  this.approveState.inProgress();
439
+ const startTime = Date.now();
440
+ const identity = {
441
+ action: SDLC_REVIEW_ACTION.APPROVE,
442
+ role: SDLC_REVIEW_ROLE.REVIEWER,
443
+ projectId: this.projectId,
444
+ patchReleaseVersionId: this.patchReleaseVersionId,
445
+ reviewId: this.review.id,
446
+ };
447
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionLaunched(
448
+ this.editorStore.applicationStore.telemetryService,
449
+ undefined,
450
+ identity,
451
+ );
434
452
  try {
435
453
  this.currentReview = Review.serialization.fromJson(
436
454
  (yield this.editorStore.sdlcServerClient.approveReview(
@@ -439,12 +457,22 @@ export class ProjectReviewerStore {
439
457
  this.review.id,
440
458
  )) as PlainObject<Review>,
441
459
  );
460
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionSucceeded(
461
+ this.editorStore.applicationStore.telemetryService,
462
+ undefined,
463
+ { ...identity, durationMs: Date.now() - startTime },
464
+ );
442
465
  } catch (error) {
443
466
  assertErrorThrown(error);
444
467
  this.editorStore.applicationStore.logService.error(
445
468
  LogEvent.create(LEGEND_STUDIO_APP_EVENT.SDLC_MANAGER_FAILURE),
446
469
  error,
447
470
  );
471
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionFailure(
472
+ this.editorStore.applicationStore.telemetryService,
473
+ undefined,
474
+ { ...identity, errorMessage: error.message },
475
+ );
448
476
  this.editorStore.applicationStore.notificationService.notifyError(error);
449
477
  } finally {
450
478
  this.approveState.complete();
@@ -453,6 +481,19 @@ export class ProjectReviewerStore {
453
481
 
454
482
  *commitReview(): GeneratorFn<void> {
455
483
  this.commitState.inProgress();
484
+ const startTime = Date.now();
485
+ const identity = {
486
+ action: SDLC_REVIEW_ACTION.COMMIT,
487
+ role: SDLC_REVIEW_ROLE.REVIEWER,
488
+ projectId: this.projectId,
489
+ patchReleaseVersionId: this.patchReleaseVersionId,
490
+ reviewId: this.review.id,
491
+ };
492
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionLaunched(
493
+ this.editorStore.applicationStore.telemetryService,
494
+ undefined,
495
+ identity,
496
+ );
456
497
  try {
457
498
  this.currentReview = Review.serialization.fromJson(
458
499
  (yield this.editorStore.sdlcServerClient.commitReview(
@@ -462,6 +503,11 @@ export class ProjectReviewerStore {
462
503
  { message: `${this.review.title} [review]` },
463
504
  )) as PlainObject<Review>,
464
505
  );
506
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionSucceeded(
507
+ this.editorStore.applicationStore.telemetryService,
508
+ undefined,
509
+ { ...identity, durationMs: Date.now() - startTime },
510
+ );
465
511
  // Committing a review deletes its workspace on SDLC. Drop the
466
512
  // matching entry from the local recents cache (no-op if it wasn't
467
513
  // there, e.g., the reviewer isn't the workspace author). Patch
@@ -482,6 +528,11 @@ export class ProjectReviewerStore {
482
528
  LogEvent.create(LEGEND_STUDIO_APP_EVENT.SDLC_MANAGER_FAILURE),
483
529
  error,
484
530
  );
531
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionFailure(
532
+ this.editorStore.applicationStore.telemetryService,
533
+ undefined,
534
+ { ...identity, errorMessage: error.message },
535
+ );
485
536
  this.editorStore.applicationStore.notificationService.notifyError(error);
486
537
  } finally {
487
538
  this.commitState.complete();
@@ -490,6 +541,19 @@ export class ProjectReviewerStore {
490
541
 
491
542
  *reOpenReview(): GeneratorFn<void> {
492
543
  this.reOpenState.inProgress();
544
+ const startTime = Date.now();
545
+ const identity = {
546
+ action: SDLC_REVIEW_ACTION.REOPEN,
547
+ role: SDLC_REVIEW_ROLE.REVIEWER,
548
+ projectId: this.projectId,
549
+ patchReleaseVersionId: this.patchReleaseVersionId,
550
+ reviewId: this.review.id,
551
+ };
552
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionLaunched(
553
+ this.editorStore.applicationStore.telemetryService,
554
+ undefined,
555
+ identity,
556
+ );
493
557
  try {
494
558
  this.currentReview = Review.serialization.fromJson(
495
559
  (yield this.editorStore.sdlcServerClient.reopenReview(
@@ -498,12 +562,22 @@ export class ProjectReviewerStore {
498
562
  this.review.id,
499
563
  )) as PlainObject<Review>,
500
564
  );
565
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionSucceeded(
566
+ this.editorStore.applicationStore.telemetryService,
567
+ undefined,
568
+ { ...identity, durationMs: Date.now() - startTime },
569
+ );
501
570
  } catch (error) {
502
571
  assertErrorThrown(error);
503
572
  this.editorStore.applicationStore.logService.error(
504
573
  LogEvent.create(LEGEND_STUDIO_APP_EVENT.SDLC_MANAGER_FAILURE),
505
574
  error,
506
575
  );
576
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionFailure(
577
+ this.editorStore.applicationStore.telemetryService,
578
+ undefined,
579
+ { ...identity, errorMessage: error.message },
580
+ );
507
581
  this.editorStore.applicationStore.notificationService.notifyError(error);
508
582
  } finally {
509
583
  this.reOpenState.complete();
@@ -512,6 +586,19 @@ export class ProjectReviewerStore {
512
586
 
513
587
  *closeReview(): GeneratorFn<void> {
514
588
  this.closeState.inProgress();
589
+ const startTime = Date.now();
590
+ const identity = {
591
+ action: SDLC_REVIEW_ACTION.CLOSE,
592
+ role: SDLC_REVIEW_ROLE.REVIEWER,
593
+ projectId: this.projectId,
594
+ patchReleaseVersionId: this.patchReleaseVersionId,
595
+ reviewId: this.review.id,
596
+ };
597
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionLaunched(
598
+ this.editorStore.applicationStore.telemetryService,
599
+ undefined,
600
+ identity,
601
+ );
515
602
  try {
516
603
  this.currentReview = Review.serialization.fromJson(
517
604
  (yield this.editorStore.sdlcServerClient.closeReview(
@@ -520,12 +607,22 @@ export class ProjectReviewerStore {
520
607
  this.review.id,
521
608
  )) as PlainObject<Review>,
522
609
  );
610
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionSucceeded(
611
+ this.editorStore.applicationStore.telemetryService,
612
+ undefined,
613
+ { ...identity, durationMs: Date.now() - startTime },
614
+ );
523
615
  } catch (error) {
524
616
  assertErrorThrown(error);
525
617
  this.editorStore.applicationStore.logService.error(
526
618
  LogEvent.create(LEGEND_STUDIO_APP_EVENT.SDLC_MANAGER_FAILURE),
527
619
  error,
528
620
  );
621
+ LegendStudioTelemetryHelper.logEvent_SdlcReviewActionFailure(
622
+ this.editorStore.applicationStore.telemetryService,
623
+ undefined,
624
+ { ...identity, errorMessage: error.message },
625
+ );
529
626
  this.editorStore.applicationStore.notificationService.notifyError(error);
530
627
  } finally {
531
628
  this.closeState.complete();