@sentry/wizard 4.7.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.
- package/CHANGELOG.md +19 -0
- package/README.md +19 -19
- package/dist/e2e-tests/tests/angular-17.test.d.ts +1 -0
- package/dist/e2e-tests/tests/angular-17.test.js +196 -0
- package/dist/e2e-tests/tests/angular-17.test.js.map +1 -0
- package/dist/e2e-tests/tests/angular-19.test.d.ts +1 -0
- package/dist/e2e-tests/tests/angular-19.test.js +194 -0
- package/dist/e2e-tests/tests/angular-19.test.js.map +1 -0
- package/dist/e2e-tests/tests/expo.test.d.ts +1 -0
- package/dist/e2e-tests/tests/expo.test.js +103 -0
- package/dist/e2e-tests/tests/expo.test.js.map +1 -0
- package/dist/e2e-tests/tests/help-message.test.js +2 -2
- package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-native.test.d.ts +1 -0
- package/dist/e2e-tests/tests/react-native.test.js +132 -0
- package/dist/e2e-tests/tests/react-native.test.js.map +1 -0
- package/dist/e2e-tests/tests/remix.test.js +4 -4
- package/dist/e2e-tests/tests/remix.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit.test.js +2 -2
- package/dist/e2e-tests/tests/sveltekit.test.js.map +1 -1
- package/dist/e2e-tests/utils/index.d.ts +7 -0
- package/dist/e2e-tests/utils/index.js +32 -7
- package/dist/e2e-tests/utils/index.js.map +1 -1
- package/dist/lib/Constants.d.ts +1 -0
- package/dist/lib/Constants.js +3 -0
- package/dist/lib/Constants.js.map +1 -1
- package/dist/lib/Helper/SentryCli.d.ts +0 -11
- package/dist/lib/Helper/SentryCli.js +0 -52
- package/dist/lib/Helper/SentryCli.js.map +1 -1
- package/dist/src/android/templates.js +2 -0
- package/dist/src/android/templates.js.map +1 -1
- package/dist/src/angular/angular-wizard.d.ts +3 -0
- package/dist/src/angular/angular-wizard.js +186 -0
- package/dist/src/angular/angular-wizard.js.map +1 -0
- package/dist/src/angular/codemods/app-config.d.ts +3 -0
- package/dist/src/angular/codemods/app-config.js +211 -0
- package/dist/src/angular/codemods/app-config.js.map +1 -0
- package/dist/src/angular/codemods/main.d.ts +20 -0
- package/dist/src/angular/codemods/main.js +62 -0
- package/dist/src/angular/codemods/main.js.map +1 -0
- package/dist/src/angular/codemods/sourcemaps.d.ts +21 -0
- package/dist/src/angular/codemods/sourcemaps.js +94 -0
- package/dist/src/angular/codemods/sourcemaps.js.map +1 -0
- package/dist/src/angular/example-component.d.ts +8 -0
- package/dist/src/angular/example-component.js +286 -0
- package/dist/src/angular/example-component.js.map +1 -0
- package/dist/src/angular/sdk-setup.d.ts +6 -0
- package/dist/src/angular/sdk-setup.js +99 -0
- package/dist/src/angular/sdk-setup.js.map +1 -0
- package/dist/src/apple/code-tools.d.ts +4 -2
- package/dist/src/apple/code-tools.js +21 -11
- package/dist/src/apple/code-tools.js.map +1 -1
- package/dist/src/apple/inject-code-snippet.js +5 -3
- package/dist/src/apple/inject-code-snippet.js.map +1 -1
- package/dist/src/apple/macos-system-helper.d.ts +5 -0
- package/dist/src/apple/macos-system-helper.js +86 -0
- package/dist/src/apple/macos-system-helper.js.map +1 -0
- package/dist/src/apple/templates.js +10 -0
- package/dist/src/apple/templates.js.map +1 -1
- package/dist/src/apple/xcode-manager.d.ts +237 -11
- package/dist/src/apple/xcode-manager.js +736 -65
- package/dist/src/apple/xcode-manager.js.map +1 -1
- package/dist/src/apple/xcode-project-object-with-id.d.ts +5 -0
- package/dist/src/apple/xcode-project-object-with-id.js +3 -0
- package/dist/src/apple/xcode-project-object-with-id.js.map +1 -0
- package/dist/src/flutter/flutter-wizard.js +10 -2
- package/dist/src/flutter/flutter-wizard.js.map +1 -1
- package/dist/src/flutter/templates.js +7 -1
- package/dist/src/flutter/templates.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +27 -15
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.js +56 -7
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/nuxt/nuxt-wizard.js +1 -3
- package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
- package/dist/src/nuxt/templates.js +30 -0
- package/dist/src/nuxt/templates.js.map +1 -1
- package/dist/src/react-native/expo-env-file.js +5 -0
- package/dist/src/react-native/expo-env-file.js.map +1 -1
- package/dist/src/react-native/expo-metro.js +22 -6
- package/dist/src/react-native/expo-metro.js.map +1 -1
- package/dist/src/react-native/expo.js +11 -1
- package/dist/src/react-native/expo.js.map +1 -1
- package/dist/src/react-native/glob.js +14 -4
- package/dist/src/react-native/glob.js.map +1 -1
- package/dist/src/react-native/gradle.js +14 -4
- package/dist/src/react-native/gradle.js.map +1 -1
- package/dist/src/react-native/javascript.d.ts +9 -4
- package/dist/src/react-native/javascript.js +52 -23
- package/dist/src/react-native/javascript.js.map +1 -1
- package/dist/src/react-native/metro.d.ts +1 -1
- package/dist/src/react-native/metro.js +36 -4
- package/dist/src/react-native/metro.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.d.ts +4 -0
- package/dist/src/react-native/react-native-wizard.js +32 -4
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-native/xcode.js +29 -10
- package/dist/src/react-native/xcode.js.map +1 -1
- package/dist/src/remix/remix-wizard.js +1 -3
- package/dist/src/remix/remix-wizard.js.map +1 -1
- package/dist/src/remix/sdk-example.js +30 -1
- package/dist/src/remix/sdk-example.js.map +1 -1
- package/dist/src/remix/sdk-setup.js +11 -5
- package/dist/src/remix/sdk-setup.js.map +1 -1
- package/dist/src/run.d.ts +1 -1
- package/dist/src/run.js +5 -0
- package/dist/src/run.js.map +1 -1
- package/dist/src/sourcemaps/sourcemaps-wizard.d.ts +1 -1
- package/dist/src/sourcemaps/sourcemaps-wizard.js +35 -20
- package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
- package/dist/src/sourcemaps/tools/angular.d.ts +1 -0
- package/dist/src/sourcemaps/tools/angular.js +7 -7
- package/dist/src/sourcemaps/tools/angular.js.map +1 -1
- package/dist/src/sourcemaps/tools/sentry-cli.d.ts +5 -1
- package/dist/src/sourcemaps/tools/sentry-cli.js +6 -3
- package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
- package/dist/src/sourcemaps/tools/tsc.js +5 -1
- package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
- package/dist/src/sourcemaps/tools/vite.js +4 -1
- package/dist/src/sourcemaps/tools/vite.js.map +1 -1
- package/dist/src/sourcemaps/tools/webpack.js +4 -1
- package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
- package/dist/src/sveltekit/sdk-example.js +1 -1
- package/dist/src/sveltekit/sdk-example.js.map +1 -1
- package/dist/src/sveltekit/sveltekit-wizard.js +3 -5
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
- package/dist/src/sveltekit/templates.js +28 -1
- package/dist/src/sveltekit/templates.js.map +1 -1
- package/dist/src/utils/clack/index.d.ts +13 -15
- package/dist/src/utils/clack/index.js +17 -50
- package/dist/src/utils/clack/index.js.map +1 -1
- package/dist/src/utils/git.d.ts +11 -0
- package/dist/src/utils/git.js +69 -0
- package/dist/src/utils/git.js.map +1 -0
- package/dist/src/utils/sentrycli-utils.js +13 -4
- package/dist/src/utils/sentrycli-utils.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/test/angular/angular-wizard.test.d.ts +1 -0
- package/dist/test/angular/angular-wizard.test.js +27 -0
- package/dist/test/angular/angular-wizard.test.js.map +1 -0
- package/dist/test/angular/codemods/sourcemaps.test.d.ts +1 -0
- package/dist/test/angular/codemods/sourcemaps.test.js +237 -0
- package/dist/test/angular/codemods/sourcemaps.test.js.map +1 -0
- package/dist/test/angular/example-component.test.d.ts +1 -0
- package/dist/test/angular/example-component.test.js +105 -0
- package/dist/test/angular/example-component.test.js.map +1 -0
- package/dist/test/apple/code-tools.test.js +54 -35
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/apple/configure-sentry-cli.test.d.ts +1 -0
- package/dist/test/apple/configure-sentry-cli.test.js +131 -0
- package/dist/test/apple/configure-sentry-cli.test.js.map +1 -0
- package/dist/test/apple/macos-system-helper-mocked.test.d.ts +1 -0
- package/dist/test/apple/macos-system-helper-mocked.test.js +46 -0
- package/dist/test/apple/macos-system-helper-mocked.test.js.map +1 -0
- package/dist/test/apple/macos-system-helper.test.d.ts +1 -0
- package/dist/test/apple/macos-system-helper.test.js +88 -0
- package/dist/test/apple/macos-system-helper.test.js.map +1 -0
- package/dist/test/apple/templates.test.js +10 -0
- package/dist/test/apple/templates.test.js.map +1 -1
- package/dist/test/apple/xcode-manager.test.js +745 -379
- package/dist/test/apple/xcode-manager.test.js.map +1 -1
- package/dist/test/flutter/templates.test.js +9 -0
- package/dist/test/flutter/templates.test.js.map +1 -1
- package/dist/test/react-native/javascript.test.js +119 -0
- package/dist/test/react-native/javascript.test.js.map +1 -1
- package/dist/test/react-native/metro.test.js +113 -0
- package/dist/test/react-native/metro.test.js.map +1 -1
- package/dist/test/remix/client-entry.test.js +10 -10
- package/dist/test/remix/client-entry.test.js.map +1 -1
- package/dist/test/utils/git.test.d.ts +1 -0
- package/dist/test/utils/git.test.js +70 -0
- package/dist/test/utils/git.test.js.map +1 -0
- 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)('#
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
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.
|
|
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(
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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)(
|
|
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 {};
|