@sentry/wizard 4.8.0 → 4.9.0

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 (102) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/e2e-tests/tests/angular-17.test.js +41 -41
  3. package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
  4. package/dist/e2e-tests/tests/angular-19.test.js +39 -39
  5. package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
  6. package/dist/e2e-tests/tests/expo.test.js +10 -2
  7. package/dist/e2e-tests/tests/expo.test.js.map +1 -1
  8. package/dist/e2e-tests/tests/react-native.test.js +38 -3
  9. package/dist/e2e-tests/tests/react-native.test.js.map +1 -1
  10. package/dist/e2e-tests/utils/index.js +14 -6
  11. package/dist/e2e-tests/utils/index.js.map +1 -1
  12. package/dist/lib/Helper/SentryCli.d.ts +0 -11
  13. package/dist/lib/Helper/SentryCli.js +0 -52
  14. package/dist/lib/Helper/SentryCli.js.map +1 -1
  15. package/dist/src/android/templates.js +2 -0
  16. package/dist/src/android/templates.js.map +1 -1
  17. package/dist/src/angular/angular-wizard.js +1 -1
  18. package/dist/src/angular/angular-wizard.js.map +1 -1
  19. package/dist/src/angular/sdk-setup.d.ts +1 -1
  20. package/dist/src/angular/sdk-setup.js +3 -3
  21. package/dist/src/angular/sdk-setup.js.map +1 -1
  22. package/dist/src/apple/code-tools.d.ts +4 -2
  23. package/dist/src/apple/code-tools.js +21 -11
  24. package/dist/src/apple/code-tools.js.map +1 -1
  25. package/dist/src/apple/inject-code-snippet.js +5 -3
  26. package/dist/src/apple/inject-code-snippet.js.map +1 -1
  27. package/dist/src/apple/macos-system-helper.d.ts +5 -0
  28. package/dist/src/apple/macos-system-helper.js +86 -0
  29. package/dist/src/apple/macos-system-helper.js.map +1 -0
  30. package/dist/src/apple/templates.js +10 -0
  31. package/dist/src/apple/templates.js.map +1 -1
  32. package/dist/src/apple/xcode-manager.d.ts +237 -11
  33. package/dist/src/apple/xcode-manager.js +736 -65
  34. package/dist/src/apple/xcode-manager.js.map +1 -1
  35. package/dist/src/apple/xcode-project-object-with-id.d.ts +5 -0
  36. package/dist/src/apple/xcode-project-object-with-id.js +3 -0
  37. package/dist/src/apple/xcode-project-object-with-id.js.map +1 -0
  38. package/dist/src/flutter/templates.js +7 -1
  39. package/dist/src/flutter/templates.js.map +1 -1
  40. package/dist/src/nextjs/nextjs-wizard.js +1 -3
  41. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  42. package/dist/src/nuxt/nuxt-wizard.js +1 -3
  43. package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
  44. package/dist/src/react-native/expo-env-file.js +5 -0
  45. package/dist/src/react-native/expo-env-file.js.map +1 -1
  46. package/dist/src/react-native/expo-metro.js +18 -5
  47. package/dist/src/react-native/expo-metro.js.map +1 -1
  48. package/dist/src/react-native/expo.js +6 -0
  49. package/dist/src/react-native/expo.js.map +1 -1
  50. package/dist/src/react-native/glob.js +14 -4
  51. package/dist/src/react-native/glob.js.map +1 -1
  52. package/dist/src/react-native/gradle.js +14 -4
  53. package/dist/src/react-native/gradle.js.map +1 -1
  54. package/dist/src/react-native/javascript.d.ts +9 -4
  55. package/dist/src/react-native/javascript.js +44 -22
  56. package/dist/src/react-native/javascript.js.map +1 -1
  57. package/dist/src/react-native/metro.d.ts +1 -1
  58. package/dist/src/react-native/metro.js +30 -4
  59. package/dist/src/react-native/metro.js.map +1 -1
  60. package/dist/src/react-native/react-native-wizard.d.ts +4 -0
  61. package/dist/src/react-native/react-native-wizard.js +32 -4
  62. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  63. package/dist/src/react-native/xcode.js +24 -9
  64. package/dist/src/react-native/xcode.js.map +1 -1
  65. package/dist/src/remix/remix-wizard.js +1 -3
  66. package/dist/src/remix/remix-wizard.js.map +1 -1
  67. package/dist/src/sveltekit/sveltekit-wizard.js +1 -3
  68. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  69. package/dist/src/utils/clack/index.d.ts +2 -12
  70. package/dist/src/utils/clack/index.js +8 -47
  71. package/dist/src/utils/clack/index.js.map +1 -1
  72. package/dist/src/utils/git.d.ts +11 -0
  73. package/dist/src/utils/git.js +69 -0
  74. package/dist/src/utils/git.js.map +1 -0
  75. package/dist/src/utils/sentrycli-utils.js +13 -4
  76. package/dist/src/utils/sentrycli-utils.js.map +1 -1
  77. package/dist/src/version.d.ts +1 -1
  78. package/dist/src/version.js +1 -1
  79. package/dist/src/version.js.map +1 -1
  80. package/dist/test/apple/code-tools.test.js +54 -35
  81. package/dist/test/apple/code-tools.test.js.map +1 -1
  82. package/dist/test/apple/configure-sentry-cli.test.d.ts +1 -0
  83. package/dist/test/apple/configure-sentry-cli.test.js +131 -0
  84. package/dist/test/apple/configure-sentry-cli.test.js.map +1 -0
  85. package/dist/test/apple/macos-system-helper-mocked.test.d.ts +1 -0
  86. package/dist/test/apple/macos-system-helper-mocked.test.js +46 -0
  87. package/dist/test/apple/macos-system-helper-mocked.test.js.map +1 -0
  88. package/dist/test/apple/macos-system-helper.test.d.ts +1 -0
  89. package/dist/test/apple/macos-system-helper.test.js +88 -0
  90. package/dist/test/apple/macos-system-helper.test.js.map +1 -0
  91. package/dist/test/apple/templates.test.js +10 -0
  92. package/dist/test/apple/templates.test.js.map +1 -1
  93. package/dist/test/apple/xcode-manager.test.js +745 -379
  94. package/dist/test/apple/xcode-manager.test.js.map +1 -1
  95. package/dist/test/flutter/templates.test.js +9 -0
  96. package/dist/test/flutter/templates.test.js.map +1 -1
  97. package/dist/test/react-native/javascript.test.js +119 -0
  98. package/dist/test/react-native/javascript.test.js.map +1 -1
  99. package/dist/test/utils/git.test.d.ts +1 -0
  100. package/dist/test/utils/git.test.js +70 -0
  101. package/dist/test/utils/git.test.js.map +1 -0
  102. package/package.json +1 -1
@@ -56,6 +56,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
56
56
  SentrySDK.start { options in
57
57
  options.dsn = "https://example.com/sentry-dsn"
58
58
  options.debug = true // Enabled debug when first installing is always helpful
59
+
60
+ // Adds IP for users.
61
+ // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/
62
+ options.sendDefaultPii = true
63
+
59
64
  // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
60
65
  // We recommend adjusting this value in production.
61
66
  options.tracesSampleRate = 1.0
@@ -110,6 +115,11 @@ const validAppDelegateObjCWithSentry = `@import Sentry;
110
115
  [SentrySDK startWithConfigureOptions:^(SentryOptions * options) {
111
116
  options.dsn = @"https://example.com/sentry-dsn";
112
117
  options.debug = YES; // Enabled debug when first installing is always helpful
118
+
119
+ // Adds IP for users.
120
+ // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/
121
+ options.sendDefaultPii = YES;
122
+
113
123
  // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
114
124
  // We recommend adjusting this value in production.
115
125
  options.tracesSampleRate = @1.0;
@@ -160,6 +170,11 @@ struct TestApp: App {
160
170
  SentrySDK.start { options in
161
171
  options.dsn = "https://example.com/sentry-dsn"
162
172
  options.debug = true // Enabled debug when first installing is always helpful
173
+
174
+ // Adds IP for users.
175
+ // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/
176
+ options.sendDefaultPii = true
177
+
163
178
  // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
164
179
  // We recommend adjusting this value in production.
165
180
  options.tracesSampleRate = 1.0
@@ -395,14 +410,14 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
395
410
  });
396
411
  });
397
412
  });
398
- (0, vitest_1.describe)('#findAppDidFinishLaunchingWithOptions', () => {
413
+ (0, vitest_1.describe)('#findAppDidFinishLaunchingWithOptionsInDirectory', () => {
399
414
  (0, vitest_1.describe)('no files given', () => {
400
415
  (0, vitest_1.it)('should check files in directory', () => {
401
416
  // -- Arrange --
402
417
  const tempDir = prepareTempDir();
403
418
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
404
419
  // -- Act --
405
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
420
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
406
421
  // -- Assert --
407
422
  (0, vitest_1.expect)(result).toBe(filePath);
408
423
  });
@@ -414,7 +429,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
414
429
  const tempDir = prepareTempDir();
415
430
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwiftUI, 'swift');
416
431
  // -- Act --
417
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
432
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
418
433
  // -- Assert --
419
434
  (0, vitest_1.expect)(result).toBe(filePath);
420
435
  });
@@ -425,7 +440,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
425
440
  const tempDir = prepareTempDir();
426
441
  prepareAppDelegateFile(tempDir, invalidAppDelegateSwiftUI, 'swift');
427
442
  // -- Act --
428
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
443
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
429
444
  // -- Assert --
430
445
  (0, vitest_1.expect)(result).toBeNull();
431
446
  });
@@ -438,7 +453,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
438
453
  const tempDir = prepareTempDir();
439
454
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
440
455
  // -- Act --
441
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
456
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
442
457
  // -- Assert --
443
458
  (0, vitest_1.expect)(result).toBe(filePath);
444
459
  });
@@ -449,7 +464,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
449
464
  const tempDir = prepareTempDir();
450
465
  prepareAppDelegateFile(tempDir, invalidAppDelegateSwift, 'swift');
451
466
  // -- Act --
452
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
467
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
453
468
  // -- Assert --
454
469
  (0, vitest_1.expect)(result).toBeNull();
455
470
  });
@@ -462,7 +477,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
462
477
  const tempDir = prepareTempDir();
463
478
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
464
479
  // -- Act --
465
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
480
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
466
481
  // -- Assert --
467
482
  (0, vitest_1.expect)(result).toBe(filePath);
468
483
  });
@@ -473,7 +488,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
473
488
  const tempDir = prepareTempDir();
474
489
  prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'm');
475
490
  // -- Act --
476
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
491
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
477
492
  // -- Assert --
478
493
  (0, vitest_1.expect)(result).toBeNull();
479
494
  });
@@ -486,7 +501,9 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
486
501
  const tempDir = prepareTempDir();
487
502
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'mm');
488
503
  // -- Act --
489
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir, [filePath]);
504
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions([
505
+ filePath,
506
+ ]);
490
507
  // -- Assert --
491
508
  (0, vitest_1.expect)(result).toBe(filePath);
492
509
  });
@@ -497,7 +514,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
497
514
  const tempDir = prepareTempDir();
498
515
  prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'mm');
499
516
  // -- Act --
500
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
517
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
501
518
  // -- Assert --
502
519
  (0, vitest_1.expect)(result).toBeNull();
503
520
  });
@@ -509,7 +526,9 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
509
526
  const tempDir = prepareTempDir();
510
527
  const filePath = prepareAppDelegateFile(tempDir, invalidAppDelegateSwift, 'swift');
511
528
  // -- Act --
512
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir, [filePath]);
529
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions([
530
+ filePath,
531
+ ]);
513
532
  // -- Assert --
514
533
  (0, vitest_1.expect)(result).toBeNull();
515
534
  });
@@ -520,7 +539,9 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
520
539
  const tempDir = prepareTempDir();
521
540
  const filePath = prepareAppDelegateFile(tempDir, invalidAppDelegateSwift, 'swift');
522
541
  // -- Act --
523
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir, [filePath]);
542
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions([
543
+ filePath,
544
+ ]);
524
545
  // -- Assert --
525
546
  (0, vitest_1.expect)(result).toBeNull();
526
547
  });
@@ -534,7 +555,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
534
555
  fs.mkdirSync(hiddenDir);
535
556
  prepareAppDelegateFile(hiddenDir, validAppDelegateSwift, 'swift');
536
557
  // -- Act --
537
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
558
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
538
559
  // -- Assert --
539
560
  (0, vitest_1.expect)(result).toBeNull();
540
561
  });
@@ -547,7 +568,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
547
568
  fs.mkdirSync(xcodeDir);
548
569
  prepareAppDelegateFile(xcodeDir, validAppDelegateSwift, 'swift');
549
570
  // -- Act --
550
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
571
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
551
572
  // -- Assert --
552
573
  (0, vitest_1.expect)(result).toBeNull();
553
574
  });
@@ -560,7 +581,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
560
581
  fs.mkdirSync(xcassetsDir);
561
582
  prepareAppDelegateFile(xcassetsDir, validAppDelegateSwift, 'swift');
562
583
  // -- Act --
563
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
584
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
564
585
  // -- Assert --
565
586
  (0, vitest_1.expect)(result).toBeNull();
566
587
  });
@@ -572,7 +593,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
572
593
  const filePath = path.join(tempDir, 'some-file');
573
594
  fs.writeFileSync(filePath, validAppDelegateSwift, 'utf8');
574
595
  // -- Act --
575
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
596
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
576
597
  // -- Assert --
577
598
  (0, vitest_1.expect)(result).toBeNull();
578
599
  });
@@ -585,7 +606,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
585
606
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
586
607
  prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
587
608
  // -- Act --
588
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
609
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
589
610
  // -- Assert --
590
611
  (0, vitest_1.expect)(result).toBe(filePath);
591
612
  });
@@ -601,7 +622,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
601
622
  fs.mkdirSync(nestedDir2);
602
623
  prepareAppDelegateFile(nestedDir2, validAppDelegateSwift, 'swift');
603
624
  // -- Act --
604
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
625
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
605
626
  // -- Assert --
606
627
  (0, vitest_1.expect)(result).toBe(nestedFilePath);
607
628
  });
@@ -611,7 +632,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
611
632
  // -- Arrange --
612
633
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));
613
634
  // -- Act --
614
- const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir, []);
635
+ const result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(tempDir);
615
636
  // -- Assert --
616
637
  (0, vitest_1.expect)(result).toBeNull();
617
638
  });
@@ -620,10 +641,8 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
620
641
  (0, vitest_1.describe)('#addCodeSnippetToProject', () => {
621
642
  (0, vitest_1.describe)('app delegate file is not found', () => {
622
643
  (0, vitest_1.it)('should return false', () => {
623
- // -- Arrange --
624
- const tempDir = prepareTempDir();
625
644
  // -- Act --
626
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, ['AppDelegate.swift'], 'https://example.com/sentry-dsn');
645
+ const result = (0, code_tools_1.addCodeSnippetToProject)(['AppDelegate.swift'], 'https://example.com/sentry-dsn');
627
646
  // -- Assert --
628
647
  (0, vitest_1.expect)(result).toBeFalsy();
629
648
  });
@@ -647,7 +666,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
647
666
  });
648
667
  (0, vitest_1.it)('should add the code snippet', () => {
649
668
  // -- Act --
650
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
669
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
651
670
  // -- Assert --
652
671
  (0, vitest_1.expect)(result).toBeTruthy();
653
672
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -655,14 +674,14 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
655
674
  });
656
675
  (0, vitest_1.it)("should set tag 'code-language'", () => {
657
676
  // -- Act --
658
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
677
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
659
678
  // -- Assert --
660
679
  (0, vitest_1.expect)(result).toBeTruthy();
661
680
  (0, vitest_1.expect)(Sentry.setTag).toHaveBeenCalledWith('code-language', 'swift');
662
681
  });
663
682
  (0, vitest_1.it)("should set tag 'ui-engine'", () => {
664
683
  // -- Act --
665
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
684
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
666
685
  // -- Assert --
667
686
  (0, vitest_1.expect)(result).toBeTruthy();
668
687
  (0, vitest_1.expect)(Sentry.setTag).toHaveBeenCalledWith('ui-engine', 'uikit');
@@ -674,7 +693,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
674
693
  const tempDir = prepareTempDir();
675
694
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwiftWithSentry, 'swift');
676
695
  // -- Act --
677
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
696
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
678
697
  // -- Assert --
679
698
  (0, vitest_1.expect)(result).toBeTruthy();
680
699
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -691,7 +710,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
691
710
  });
692
711
  (0, vitest_1.it)('should add the code snippet', () => {
693
712
  // -- Act --
694
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
713
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
695
714
  // -- Assert --
696
715
  (0, vitest_1.expect)(result).toBeTruthy();
697
716
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -699,14 +718,14 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
699
718
  });
700
719
  (0, vitest_1.it)("should set tag 'code-language'", () => {
701
720
  // -- Act --
702
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
721
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
703
722
  // -- Assert --
704
723
  (0, vitest_1.expect)(result).toBeTruthy();
705
724
  (0, vitest_1.expect)(Sentry.setTag).toHaveBeenNthCalledWith(1, 'code-language', 'swift');
706
725
  });
707
726
  (0, vitest_1.it)("should set tag 'ui-engine'", () => {
708
727
  // -- Act --
709
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
728
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
710
729
  // -- Assert --
711
730
  (0, vitest_1.expect)(result).toBeTruthy();
712
731
  (0, vitest_1.expect)(Sentry.setTag).toHaveBeenNthCalledWith(2, 'ui-engine', 'swiftui');
@@ -718,7 +737,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
718
737
  const tempDir = prepareTempDir();
719
738
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwiftUIWithSentry, 'swift');
720
739
  // -- Act --
721
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
740
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
722
741
  // -- Assert --
723
742
  (0, vitest_1.expect)(result).toBeTruthy();
724
743
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -732,7 +751,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
732
751
  const tempDir = prepareTempDir();
733
752
  const filePath = prepareAppDelegateFile(tempDir, invalidAppDelegateSwiftUI, 'swift');
734
753
  // -- Act --
735
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
754
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
736
755
  // -- Assert --
737
756
  (0, vitest_1.expect)(result).toBeFalsy();
738
757
  });
@@ -745,7 +764,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
745
764
  const tempDir = prepareTempDir();
746
765
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
747
766
  // -- Act --
748
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
767
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
749
768
  // -- Assert --
750
769
  (0, vitest_1.expect)(result).toBeTruthy();
751
770
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -761,7 +780,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
761
780
  });
762
781
  (0, vitest_1.it)('should not add the code snippet', () => {
763
782
  // -- Act --
764
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
783
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
765
784
  // -- Assert --
766
785
  (0, vitest_1.expect)(result).toBeTruthy();
767
786
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -769,7 +788,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
769
788
  });
770
789
  (0, vitest_1.it)('should log info', () => {
771
790
  // -- Act --
772
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
791
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
773
792
  // -- Assert --
774
793
  (0, vitest_1.expect)(result).toBeTruthy();
775
794
  (0, vitest_1.expect)(clack.log.info).toHaveBeenCalledWith('Sentry is already initialized in your AppDelegate. Skipping adding the code snippet.');
@@ -780,7 +799,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
780
799
  const tempDir = prepareTempDir();
781
800
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
782
801
  // -- Act --
783
- const result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
802
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
784
803
  // -- Assert --
785
804
  (0, vitest_1.expect)(result).toBeTruthy();
786
805
  (0, vitest_1.expect)(Sentry.setTag).toHaveBeenCalledWith('code-language', 'objc');
@@ -1 +1 @@
1
- {"version":3,"file":"code-tools.test.js","sourceRoot":"","sources":["../../../test/apple/code-tools.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport {\n addCodeSnippetToProject,\n exportForTesting,\n} from '../../src/apple/code-tools';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\n\n// Test Constants\nconst invalidAppDelegateSwift = `func application() {}`;\nconst validAppDelegateSwift = `\nimport UIKit\n\n@main\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n // Override point for customization after application launch.\n return true\n }\n}`;\nconst validAppDelegateSwiftWithSentry = `\nimport UIKit\nimport Sentry\n\n\n@main\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n SentrySDK.start { options in\n options.dsn = \"https://example.com/sentry-dsn\"\n options.debug = true // Enabled debug when first installing is always helpful\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = 1.0\n\n // Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more.\n options.configureProfiling = {\n $0.sessionSampleRate = 1.0 // We recommend adjusting this value in production.\n $0.lifecycle = .trace\n }\n\n // Uncomment the following lines to add more data to your events\n // options.attachScreenshot = true // This adds a screenshot to the error events\n // options.attachViewHierarchy = true // This adds the view hierarchy to the error events\n }\n // Remove the next line after confirming that your Sentry integration is working.\n SentrySDK.capture(message: \"This app uses Sentry! :)\")\n\n // Override point for customization after application launch.\n return true\n }\n}`;\nconst invalidAppDelegateObjC = `\n- (BOOL)application:(UIApplication *) {\n return NO;\n}`;\nconst validAppDelegateObjC = `\n#import \"AppDelegate.h\"\n\n@interface AppDelegate ()\n\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n // Override point for customization after application launch.\n return YES;\n}\n\n@end`;\nconst validAppDelegateObjCWithSentry = `@import Sentry;\n\n#import \"AppDelegate.h\"\n\n@interface AppDelegate ()\n\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n [SentrySDK startWithConfigureOptions:^(SentryOptions * options) {\n options.dsn = @\"https://example.com/sentry-dsn\";\n options.debug = YES; // Enabled debug when first installing is always helpful\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = @1.0;\n\n // Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more.\n options.configureProfiling = ^(SentryProfileOptions *profiling) {\n profiling.sessionSampleRate = 1.0; // We recommend adjusting this value in production.\n profiling.lifecycle = SentryProfilingLifecycleTrace;\n };\n\n //Uncomment the following lines to add more data to your events\n //options.attachScreenshot = YES; //This will add a screenshot to the error events\n //options.attachViewHierarchy = YES; //This will add the view hierarchy to the error events\n }];\n //Remove the next line after confirming that your Sentry integration is working.\n [SentrySDK captureMessage:@\"This app uses Sentry!\"];\n\n // Override point for customization after application launch.\n return YES;\n}\n\n@end`;\nconst invalidAppDelegateSwiftUI = `\nstruct MyApp: App {\n var body: some Scene {\n WindowGroup { Text(\"Hello, world!\") }\n }\n}`;\nconst validAppDelegateSwiftUI = `\nimport SwiftUI\n\n@main\nstruct TestApp: App {\n var body: some Scene {\n WindowGroup {\n ContentView()\n }\n }\n}`;\nconst validAppDelegateSwiftUIWithSentry = `\nimport SwiftUI\nimport Sentry\n\n\n@main\nstruct TestApp: App {\n init() {\n SentrySDK.start { options in\n options.dsn = \"https://example.com/sentry-dsn\"\n options.debug = true // Enabled debug when first installing is always helpful\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = 1.0\n\n // Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more.\n options.configureProfiling = {\n $0.sessionSampleRate = 1.0 // We recommend adjusting this value in production.\n $0.lifecycle = .trace\n }\n\n // Uncomment the following lines to add more data to your events\n // options.attachScreenshot = true // This adds a screenshot to the error events\n // options.attachViewHierarchy = true // This adds the view hierarchy to the error events\n }\n // Remove the next line after confirming that your Sentry integration is working.\n SentrySDK.capture(message: \"This app uses Sentry! :)\")\n }\n var body: some Scene {\n WindowGroup {\n ContentView()\n }\n }\n}`;\n\nconst prepareTempDir = (): string => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));\n return tempDir;\n};\n\nconst prepareAppDelegateFile = (\n dir: string,\n content: string,\n ext: 'm' | 'mm' | 'swift',\n): string => {\n const filePath = path.join(dir, `AppDelegate.${ext}`);\n fs.writeFileSync(filePath, content, 'utf8');\n return filePath;\n};\n\nconst dsn = 'https://example.com/sentry-dsn';\n\n// Mock Setup\n\nvi.mock('../../src/utils/bash');\nvi.spyOn(Sentry, 'setTag').mockImplementation(() => undefined);\nvi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');\n\n// Test Suite\n\ndescribe('code-tools', () => {\n beforeEach(() => {\n vi.spyOn(clack.log, 'info').mockImplementation(() => undefined);\n });\n\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n describe('#isAppDelegateFile', () => {\n const prepareTestFile = (\n content: string,\n ext: 'm' | 'mm' | 'swift',\n ): string => {\n const tempDir = prepareTempDir();\n return prepareAppDelegateFile(tempDir, content, ext);\n };\n\n describe('swift files', () => {\n describe('swift app launch regex', () => {\n describe('valid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'with underscores',\n code: 'func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {',\n },\n {\n name: 'with different dictionary type',\n code: 'func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {',\n },\n {\n name: 'with extra whitespace',\n code: ' func application ( _ application: UIApplication , didFinishLaunchingWithOptions launchOptions: [ NSObject : AnyObject ]? ) -> Bool { ',\n },\n {\n name: 'macOS notification variant',\n code: 'func applicationDidFinishLaunching(_ aNotification: Notification) {',\n },\n {\n name: 'macOS with extra whitespace',\n code: 'func applicationDidFinishLaunching ( _ aNotification: Notification ) {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it(`should return true`, () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n }\n\n describe('invalid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'missing application method',\n code: 'import UIKit',\n },\n {\n name: 'typo in method name',\n code: 'func applicatioM(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {',\n },\n {\n name: 'garbage input',\n code: 'asdf;jk23;uas()d{',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return false', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n }\n });\n });\n });\n });\n\n describe('objc files', () => {\n describe('valid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'basic',\n code: '- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {',\n },\n {\n name: 'with more whitespace',\n code: '- ( BOOL ) application: ( UIApplication * ) application didFinishLaunchingWithOptions: ( NSDictionary * ) launchOptions {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return true', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'm');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n }\n });\n\n describe('invalid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'missing application method',\n code: 'import UIKit',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return false', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'm');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n }\n });\n });\n\n describe('swiftui files', () => {\n describe('valid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'basic',\n code: '@main struct MyApp: App {',\n },\n {\n name: 'with more whitespace',\n code: '@main struct MyApp: App {',\n },\n {\n name: 'with SwiftUI namespace',\n code: '@main struct App: SwiftUI.App {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return true', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n }\n });\n\n describe('invalid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'missing @main',\n code: 'struct App: App {',\n },\n {\n name: 'missing super-type App',\n code: 'struct MyApp {',\n },\n {\n name: 'imported not from SwiftUI',\n code: '@main struct App: MySwiftyUI.App {',\n },\n {\n name: 'imported not from SwiftUI but similar',\n code: '@main struct App: MySwiftUI.App {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return false', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n }\n });\n });\n\n describe('file not found', () => {\n it('should throw an error', () => {\n // -- Arrange --\n const invalidPath = path.join(os.tmpdir(), 'invalid-path');\n\n // -- Act & Assert --\n expect(() => exportForTesting.isAppDelegateFile(invalidPath)).toThrow();\n });\n });\n });\n\n describe('#findAppDidFinishLaunchingWithOptions', () => {\n describe('no files given', () => {\n it('should check files in directory', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('SwiftUI file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftUI,\n 'swift',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateSwiftUI, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('Swift file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('Objective-C file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'm',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'm');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('Objective-C++ file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'mm',\n );\n\n // -- Act --\n const result = exportForTesting.findAppDidFinishLaunchingWithOptions(\n tempDir,\n [filePath],\n );\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'mm');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('file in list not found', () => {\n it('should return null', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n invalidAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result = exportForTesting.findAppDidFinishLaunchingWithOptions(\n tempDir,\n [filePath],\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('unrelated file found', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n invalidAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result = exportForTesting.findAppDidFinishLaunchingWithOptions(\n tempDir,\n [filePath],\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('directory in list', () => {\n describe('name starts with dot', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n\n const hiddenDir = path.join(tempDir, '.hidden');\n fs.mkdirSync(hiddenDir);\n\n prepareAppDelegateFile(hiddenDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('name ends with .xcodeproj', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const xcodeDir = path.join(tempDir, 'MyProject.xcodeproj');\n fs.mkdirSync(xcodeDir);\n\n prepareAppDelegateFile(xcodeDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('name ends with .xcassets', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const xcassetsDir = path.join(tempDir, 'MyProject.xcassets');\n fs.mkdirSync(xcassetsDir);\n\n prepareAppDelegateFile(xcassetsDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('is not a directory', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = path.join(tempDir, 'some-file');\n fs.writeFileSync(filePath, validAppDelegateSwift, 'utf8');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('multiple files could be app delegate', () => {\n it('should return the first one', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('multiple nested directories with app delegate', () => {\n it('should return the first one', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n\n const nestedDir = path.join(tempDir, 'nested');\n fs.mkdirSync(nestedDir);\n const nestedFilePath = prepareAppDelegateFile(\n nestedDir,\n validAppDelegateSwift,\n 'swift',\n );\n\n const nestedDir2 = path.join(tempDir, 'nested2');\n fs.mkdirSync(nestedDir2);\n prepareAppDelegateFile(nestedDir2, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(nestedFilePath);\n });\n });\n\n describe('no app delegate found', () => {\n it('should return null', () => {\n // -- Arrange --\n const tempDir = fs.mkdtempSync(\n path.join(os.tmpdir(), 'code-tools-test'),\n );\n\n // -- Act --\n const result = exportForTesting.findAppDidFinishLaunchingWithOptions(\n tempDir,\n [],\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('#addCodeSnippetToProject', () => {\n describe('app delegate file is not found', () => {\n it('should return false', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n\n // -- Act --\n const result = addCodeSnippetToProject(\n tempDir,\n ['AppDelegate.swift'],\n 'https://example.com/sentry-dsn',\n );\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n\n describe('app delegate file is found', () => {\n let tempDir: string;\n let appDelegatePath: string;\n\n beforeEach(() => {\n // -- Arrange --\n tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));\n appDelegatePath = path.join(tempDir, 'AppDelegate.swift');\n fs.writeFileSync(appDelegatePath, validAppDelegateSwift, 'utf8');\n });\n\n describe('is Swift file', () => {\n describe('Sentry is not initialized', () => {\n let tempDir: string;\n let filePath: string;\n\n beforeEach(() => {\n tempDir = prepareTempDir();\n filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n });\n\n it('should add the code snippet', () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateSwiftWithSentry);\n });\n\n it(\"should set tag 'code-language'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenCalledWith(\n 'code-language',\n 'swift',\n );\n });\n\n it(\"should set tag 'ui-engine'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenCalledWith('ui-engine', 'uikit');\n });\n });\n\n describe('Sentry is already initialized', () => {\n it('should not add the code snippet', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftWithSentry,\n 'swift',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateSwiftWithSentry);\n });\n });\n\n describe('is SwiftUI file', () => {\n describe('Sentry is not initialized', () => {\n let tempDir: string;\n let filePath: string;\n\n beforeEach(() => {\n tempDir = prepareTempDir();\n filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftUI,\n 'swift',\n );\n });\n\n it('should add the code snippet', () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(\n validAppDelegateSwiftUIWithSentry,\n );\n });\n\n it(\"should set tag 'code-language'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenNthCalledWith(\n 1,\n 'code-language',\n 'swift',\n );\n });\n\n it(\"should set tag 'ui-engine'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenNthCalledWith(\n 2,\n 'ui-engine',\n 'swiftui',\n );\n });\n });\n\n describe('Sentry is already initialized', () => {\n it('should not add the code snippet', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftUIWithSentry,\n 'swift',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(\n validAppDelegateSwiftUIWithSentry,\n );\n });\n });\n });\n\n describe('is not matching SwiftUI regex', () => {\n it('should not add the code snippet', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n invalidAppDelegateSwiftUI,\n 'swift',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n });\n\n describe('is Objective-C file', () => {\n describe('Sentry is not initialized', () => {\n it('should add the code snippet', () => {\n // -- Act --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'm',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateObjCWithSentry);\n });\n });\n\n describe('Sentry is already initialized', () => {\n let tempDir: string;\n let filePath: string;\n\n beforeEach(() => {\n tempDir = prepareTempDir();\n filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjCWithSentry,\n 'm',\n );\n });\n\n it('should not add the code snippet', () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateObjCWithSentry);\n });\n\n it('should log info', () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(clack.log.info).toHaveBeenCalledWith(\n 'Sentry is already initialized in your AppDelegate. Skipping adding the code snippet.',\n );\n });\n });\n\n it(\"should set tag 'code-language'\", () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'm',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenCalledWith('code-language', 'objc');\n });\n });\n });\n });\n});\n"]}
1
+ {"version":3,"file":"code-tools.test.js","sourceRoot":"","sources":["../../../test/apple/code-tools.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport {\n addCodeSnippetToProject,\n exportForTesting,\n} from '../../src/apple/code-tools';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\n\n// Test Constants\nconst invalidAppDelegateSwift = `func application() {}`;\nconst validAppDelegateSwift = `\nimport UIKit\n\n@main\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n // Override point for customization after application launch.\n return true\n }\n}`;\nconst validAppDelegateSwiftWithSentry = `\nimport UIKit\nimport Sentry\n\n\n@main\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n SentrySDK.start { options in\n options.dsn = \"https://example.com/sentry-dsn\"\n options.debug = true // Enabled debug when first installing is always helpful\n\n // Adds IP for users.\n // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/\n options.sendDefaultPii = true\n\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = 1.0\n\n // Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more.\n options.configureProfiling = {\n $0.sessionSampleRate = 1.0 // We recommend adjusting this value in production.\n $0.lifecycle = .trace\n }\n\n // Uncomment the following lines to add more data to your events\n // options.attachScreenshot = true // This adds a screenshot to the error events\n // options.attachViewHierarchy = true // This adds the view hierarchy to the error events\n }\n // Remove the next line after confirming that your Sentry integration is working.\n SentrySDK.capture(message: \"This app uses Sentry! :)\")\n\n // Override point for customization after application launch.\n return true\n }\n}`;\nconst invalidAppDelegateObjC = `\n- (BOOL)application:(UIApplication *) {\n return NO;\n}`;\nconst validAppDelegateObjC = `\n#import \"AppDelegate.h\"\n\n@interface AppDelegate ()\n\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n // Override point for customization after application launch.\n return YES;\n}\n\n@end`;\nconst validAppDelegateObjCWithSentry = `@import Sentry;\n\n#import \"AppDelegate.h\"\n\n@interface AppDelegate ()\n\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n [SentrySDK startWithConfigureOptions:^(SentryOptions * options) {\n options.dsn = @\"https://example.com/sentry-dsn\";\n options.debug = YES; // Enabled debug when first installing is always helpful\n\n // Adds IP for users.\n // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/\n options.sendDefaultPii = YES;\n\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = @1.0;\n\n // Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more.\n options.configureProfiling = ^(SentryProfileOptions *profiling) {\n profiling.sessionSampleRate = 1.0; // We recommend adjusting this value in production.\n profiling.lifecycle = SentryProfilingLifecycleTrace;\n };\n\n //Uncomment the following lines to add more data to your events\n //options.attachScreenshot = YES; //This will add a screenshot to the error events\n //options.attachViewHierarchy = YES; //This will add the view hierarchy to the error events\n }];\n //Remove the next line after confirming that your Sentry integration is working.\n [SentrySDK captureMessage:@\"This app uses Sentry!\"];\n\n // Override point for customization after application launch.\n return YES;\n}\n\n@end`;\nconst invalidAppDelegateSwiftUI = `\nstruct MyApp: App {\n var body: some Scene {\n WindowGroup { Text(\"Hello, world!\") }\n }\n}`;\nconst validAppDelegateSwiftUI = `\nimport SwiftUI\n\n@main\nstruct TestApp: App {\n var body: some Scene {\n WindowGroup {\n ContentView()\n }\n }\n}`;\nconst validAppDelegateSwiftUIWithSentry = `\nimport SwiftUI\nimport Sentry\n\n\n@main\nstruct TestApp: App {\n init() {\n SentrySDK.start { options in\n options.dsn = \"https://example.com/sentry-dsn\"\n options.debug = true // Enabled debug when first installing is always helpful\n\n // Adds IP for users.\n // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/\n options.sendDefaultPii = true\n\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = 1.0\n\n // Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more.\n options.configureProfiling = {\n $0.sessionSampleRate = 1.0 // We recommend adjusting this value in production.\n $0.lifecycle = .trace\n }\n\n // Uncomment the following lines to add more data to your events\n // options.attachScreenshot = true // This adds a screenshot to the error events\n // options.attachViewHierarchy = true // This adds the view hierarchy to the error events\n }\n // Remove the next line after confirming that your Sentry integration is working.\n SentrySDK.capture(message: \"This app uses Sentry! :)\")\n }\n var body: some Scene {\n WindowGroup {\n ContentView()\n }\n }\n}`;\n\nconst prepareTempDir = (): string => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));\n return tempDir;\n};\n\nconst prepareAppDelegateFile = (\n dir: string,\n content: string,\n ext: 'm' | 'mm' | 'swift',\n): string => {\n const filePath = path.join(dir, `AppDelegate.${ext}`);\n fs.writeFileSync(filePath, content, 'utf8');\n return filePath;\n};\n\nconst dsn = 'https://example.com/sentry-dsn';\n\n// Mock Setup\n\nvi.mock('../../src/utils/bash');\nvi.spyOn(Sentry, 'setTag').mockImplementation(() => undefined);\nvi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');\n\n// Test Suite\n\ndescribe('code-tools', () => {\n beforeEach(() => {\n vi.spyOn(clack.log, 'info').mockImplementation(() => undefined);\n });\n\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n describe('#isAppDelegateFile', () => {\n const prepareTestFile = (\n content: string,\n ext: 'm' | 'mm' | 'swift',\n ): string => {\n const tempDir = prepareTempDir();\n return prepareAppDelegateFile(tempDir, content, ext);\n };\n\n describe('swift files', () => {\n describe('swift app launch regex', () => {\n describe('valid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'with underscores',\n code: 'func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {',\n },\n {\n name: 'with different dictionary type',\n code: 'func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {',\n },\n {\n name: 'with extra whitespace',\n code: ' func application ( _ application: UIApplication , didFinishLaunchingWithOptions launchOptions: [ NSObject : AnyObject ]? ) -> Bool { ',\n },\n {\n name: 'macOS notification variant',\n code: 'func applicationDidFinishLaunching(_ aNotification: Notification) {',\n },\n {\n name: 'macOS with extra whitespace',\n code: 'func applicationDidFinishLaunching ( _ aNotification: Notification ) {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it(`should return true`, () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n }\n\n describe('invalid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'missing application method',\n code: 'import UIKit',\n },\n {\n name: 'typo in method name',\n code: 'func applicatioM(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {',\n },\n {\n name: 'garbage input',\n code: 'asdf;jk23;uas()d{',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return false', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n }\n });\n });\n });\n });\n\n describe('objc files', () => {\n describe('valid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'basic',\n code: '- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {',\n },\n {\n name: 'with more whitespace',\n code: '- ( BOOL ) application: ( UIApplication * ) application didFinishLaunchingWithOptions: ( NSDictionary * ) launchOptions {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return true', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'm');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n }\n });\n\n describe('invalid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'missing application method',\n code: 'import UIKit',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return false', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'm');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n }\n });\n });\n\n describe('swiftui files', () => {\n describe('valid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'basic',\n code: '@main struct MyApp: App {',\n },\n {\n name: 'with more whitespace',\n code: '@main struct MyApp: App {',\n },\n {\n name: 'with SwiftUI namespace',\n code: '@main struct App: SwiftUI.App {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return true', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n }\n });\n\n describe('invalid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'missing @main',\n code: 'struct App: App {',\n },\n {\n name: 'missing super-type App',\n code: 'struct MyApp {',\n },\n {\n name: 'imported not from SwiftUI',\n code: '@main struct App: MySwiftyUI.App {',\n },\n {\n name: 'imported not from SwiftUI but similar',\n code: '@main struct App: MySwiftUI.App {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return false', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n }\n });\n });\n\n describe('file not found', () => {\n it('should throw an error', () => {\n // -- Arrange --\n const invalidPath = path.join(os.tmpdir(), 'invalid-path');\n\n // -- Act & Assert --\n expect(() => exportForTesting.isAppDelegateFile(invalidPath)).toThrow();\n });\n });\n });\n\n describe('#findAppDidFinishLaunchingWithOptionsInDirectory', () => {\n describe('no files given', () => {\n it('should check files in directory', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('SwiftUI file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftUI,\n 'swift',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateSwiftUI, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('Swift file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('Objective-C file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'm',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'm');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('Objective-C++ file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'mm',\n );\n\n // -- Act --\n const result = exportForTesting.findAppDidFinishLaunchingWithOptions([\n filePath,\n ]);\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'mm');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('file in list not found', () => {\n it('should return null', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n invalidAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result = exportForTesting.findAppDidFinishLaunchingWithOptions([\n filePath,\n ]);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('unrelated file found', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n invalidAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result = exportForTesting.findAppDidFinishLaunchingWithOptions([\n filePath,\n ]);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('directory in list', () => {\n describe('name starts with dot', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n\n const hiddenDir = path.join(tempDir, '.hidden');\n fs.mkdirSync(hiddenDir);\n\n prepareAppDelegateFile(hiddenDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('name ends with .xcodeproj', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const xcodeDir = path.join(tempDir, 'MyProject.xcodeproj');\n fs.mkdirSync(xcodeDir);\n\n prepareAppDelegateFile(xcodeDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('name ends with .xcassets', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const xcassetsDir = path.join(tempDir, 'MyProject.xcassets');\n fs.mkdirSync(xcassetsDir);\n\n prepareAppDelegateFile(xcassetsDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('is not a directory', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = path.join(tempDir, 'some-file');\n fs.writeFileSync(filePath, validAppDelegateSwift, 'utf8');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('multiple files could be app delegate', () => {\n it('should return the first one', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('multiple nested directories with app delegate', () => {\n it('should return the first one', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n\n const nestedDir = path.join(tempDir, 'nested');\n fs.mkdirSync(nestedDir);\n const nestedFilePath = prepareAppDelegateFile(\n nestedDir,\n validAppDelegateSwift,\n 'swift',\n );\n\n const nestedDir2 = path.join(tempDir, 'nested2');\n fs.mkdirSync(nestedDir2);\n prepareAppDelegateFile(nestedDir2, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBe(nestedFilePath);\n });\n });\n\n describe('no app delegate found', () => {\n it('should return null', () => {\n // -- Arrange --\n const tempDir = fs.mkdtempSync(\n path.join(os.tmpdir(), 'code-tools-test'),\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptionsInDirectory(\n tempDir,\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('#addCodeSnippetToProject', () => {\n describe('app delegate file is not found', () => {\n it('should return false', () => {\n // -- Act --\n const result = addCodeSnippetToProject(\n ['AppDelegate.swift'],\n 'https://example.com/sentry-dsn',\n );\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n\n describe('app delegate file is found', () => {\n let tempDir: string;\n let appDelegatePath: string;\n\n beforeEach(() => {\n // -- Arrange --\n tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));\n appDelegatePath = path.join(tempDir, 'AppDelegate.swift');\n fs.writeFileSync(appDelegatePath, validAppDelegateSwift, 'utf8');\n });\n\n describe('is Swift file', () => {\n describe('Sentry is not initialized', () => {\n let tempDir: string;\n let filePath: string;\n\n beforeEach(() => {\n tempDir = prepareTempDir();\n filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n });\n\n it('should add the code snippet', () => {\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateSwiftWithSentry);\n });\n\n it(\"should set tag 'code-language'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenCalledWith(\n 'code-language',\n 'swift',\n );\n });\n\n it(\"should set tag 'ui-engine'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenCalledWith('ui-engine', 'uikit');\n });\n });\n\n describe('Sentry is already initialized', () => {\n it('should not add the code snippet', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftWithSentry,\n 'swift',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateSwiftWithSentry);\n });\n });\n\n describe('is SwiftUI file', () => {\n describe('Sentry is not initialized', () => {\n let tempDir: string;\n let filePath: string;\n\n beforeEach(() => {\n tempDir = prepareTempDir();\n filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftUI,\n 'swift',\n );\n });\n\n it('should add the code snippet', () => {\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(\n validAppDelegateSwiftUIWithSentry,\n );\n });\n\n it(\"should set tag 'code-language'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenNthCalledWith(\n 1,\n 'code-language',\n 'swift',\n );\n });\n\n it(\"should set tag 'ui-engine'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenNthCalledWith(\n 2,\n 'ui-engine',\n 'swiftui',\n );\n });\n });\n\n describe('Sentry is already initialized', () => {\n it('should not add the code snippet', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftUIWithSentry,\n 'swift',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(\n validAppDelegateSwiftUIWithSentry,\n );\n });\n });\n });\n\n describe('is not matching SwiftUI regex', () => {\n it('should not add the code snippet', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n invalidAppDelegateSwiftUI,\n 'swift',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n });\n\n describe('is Objective-C file', () => {\n describe('Sentry is not initialized', () => {\n it('should add the code snippet', () => {\n // -- Act --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'm',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateObjCWithSentry);\n });\n });\n\n describe('Sentry is already initialized', () => {\n let tempDir: string;\n let filePath: string;\n\n beforeEach(() => {\n tempDir = prepareTempDir();\n filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjCWithSentry,\n 'm',\n );\n });\n\n it('should not add the code snippet', () => {\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateObjCWithSentry);\n });\n\n it('should log info', () => {\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(clack.log.info).toHaveBeenCalledWith(\n 'Sentry is already initialized in your AppDelegate. Skipping adding the code snippet.',\n );\n });\n });\n\n it(\"should set tag 'code-language'\", () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'm',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenCalledWith('code-language', 'objc');\n });\n });\n });\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ export {};