@sentry/wizard 6.1.2 → 6.2.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 +20 -0
- package/dist/e2e-tests/tests/flutter.test.js +16 -2
- package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
- package/dist/e2e-tests/tests/remix.test.js +3 -2
- package/dist/e2e-tests/tests/remix.test.js.map +1 -1
- package/dist/lib/Steps/Integrations/Electron.js +4 -0
- package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
- package/dist/src/apple/apple-wizard.js +10 -0
- package/dist/src/apple/apple-wizard.js.map +1 -1
- package/dist/src/apple/code-tools.d.ts +1 -1
- package/dist/src/apple/code-tools.js +3 -3
- package/dist/src/apple/code-tools.js.map +1 -1
- package/dist/src/apple/inject-code-snippet.d.ts +2 -1
- package/dist/src/apple/inject-code-snippet.js +2 -2
- package/dist/src/apple/inject-code-snippet.js.map +1 -1
- package/dist/src/apple/templates.d.ts +2 -2
- package/dist/src/apple/templates.js +22 -6
- package/dist/src/apple/templates.js.map +1 -1
- package/dist/src/flutter/code-tools.d.ts +1 -0
- package/dist/src/flutter/code-tools.js +6 -0
- package/dist/src/flutter/code-tools.js.map +1 -1
- package/dist/src/flutter/templates.d.ts +1 -0
- package/dist/src/flutter/templates.js +5 -0
- package/dist/src/flutter/templates.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +11 -7
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/utils.d.ts +8 -0
- package/dist/src/nextjs/utils.js +36 -1
- package/dist/src/nextjs/utils.js.map +1 -1
- package/dist/src/react-native/expo-metro.d.ts +2 -2
- package/dist/src/react-native/expo-metro.js +32 -27
- package/dist/src/react-native/expo-metro.js.map +1 -1
- package/dist/src/react-native/metro.d.ts +4 -4
- package/dist/src/react-native/metro.js +39 -17
- package/dist/src/react-native/metro.js.map +1 -1
- package/dist/src/remix/codemods/root.d.ts +1 -0
- package/dist/src/remix/codemods/root.js +30 -2
- package/dist/src/remix/codemods/root.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/apple/code-tools.test.js +62 -14
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/apple/templates.test.js +68 -2
- package/dist/test/apple/templates.test.js.map +1 -1
- package/dist/test/flutter/code-tools.test.js +1 -0
- package/dist/test/flutter/code-tools.test.js.map +1 -1
- package/dist/test/flutter/templates.test.js +28 -1
- package/dist/test/flutter/templates.test.js.map +1 -1
- package/dist/test/nextjs/wizard-double-wrap-prevention.test.d.ts +1 -0
- package/dist/test/nextjs/wizard-double-wrap-prevention.test.js +266 -0
- package/dist/test/nextjs/wizard-double-wrap-prevention.test.js.map +1 -0
- package/dist/test/react-native/expo-metro.test.js +3 -3
- package/dist/test/react-native/expo-metro.test.js.map +1 -1
- package/dist/test/react-native/metro.test.js +73 -15
- package/dist/test/react-native/metro.test.js.map +1 -1
- package/dist/test/remix/root.test.js +226 -0
- package/dist/test/remix/root.test.js.map +1 -1
- package/package.json +1 -9
|
@@ -642,7 +642,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
642
642
|
(0, vitest_1.describe)('app delegate file is not found', () => {
|
|
643
643
|
(0, vitest_1.it)('should return false', () => {
|
|
644
644
|
// -- Act --
|
|
645
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)(['AppDelegate.swift'], 'https://example.com/sentry-dsn');
|
|
645
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)(['AppDelegate.swift'], 'https://example.com/sentry-dsn', false);
|
|
646
646
|
// -- Assert --
|
|
647
647
|
(0, vitest_1.expect)(result).toBeFalsy();
|
|
648
648
|
});
|
|
@@ -666,7 +666,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
666
666
|
});
|
|
667
667
|
(0, vitest_1.it)('should add the code snippet', () => {
|
|
668
668
|
// -- Act --
|
|
669
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
669
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
670
670
|
// -- Assert --
|
|
671
671
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
672
672
|
const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
|
|
@@ -674,14 +674,14 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
674
674
|
});
|
|
675
675
|
(0, vitest_1.it)("should set tag 'code-language'", () => {
|
|
676
676
|
// -- Act --
|
|
677
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
677
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
678
678
|
// -- Assert --
|
|
679
679
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
680
680
|
(0, vitest_1.expect)(Sentry.setTag).toHaveBeenCalledWith('code-language', 'swift');
|
|
681
681
|
});
|
|
682
682
|
(0, vitest_1.it)("should set tag 'ui-engine'", () => {
|
|
683
683
|
// -- Act --
|
|
684
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
684
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
685
685
|
// -- Assert --
|
|
686
686
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
687
687
|
(0, vitest_1.expect)(Sentry.setTag).toHaveBeenCalledWith('ui-engine', 'uikit');
|
|
@@ -693,7 +693,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
693
693
|
const tempDir = prepareTempDir();
|
|
694
694
|
const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwiftWithSentry, 'swift');
|
|
695
695
|
// -- Act --
|
|
696
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
696
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
697
697
|
// -- Assert --
|
|
698
698
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
699
699
|
const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
|
|
@@ -710,7 +710,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
710
710
|
});
|
|
711
711
|
(0, vitest_1.it)('should add the code snippet', () => {
|
|
712
712
|
// -- Act --
|
|
713
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
713
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
714
714
|
// -- Assert --
|
|
715
715
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
716
716
|
const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
|
|
@@ -718,14 +718,14 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
718
718
|
});
|
|
719
719
|
(0, vitest_1.it)("should set tag 'code-language'", () => {
|
|
720
720
|
// -- Act --
|
|
721
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
721
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
722
722
|
// -- Assert --
|
|
723
723
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
724
724
|
(0, vitest_1.expect)(Sentry.setTag).toHaveBeenNthCalledWith(1, 'code-language', 'swift');
|
|
725
725
|
});
|
|
726
726
|
(0, vitest_1.it)("should set tag 'ui-engine'", () => {
|
|
727
727
|
// -- Act --
|
|
728
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
728
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
729
729
|
// -- Assert --
|
|
730
730
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
731
731
|
(0, vitest_1.expect)(Sentry.setTag).toHaveBeenNthCalledWith(2, 'ui-engine', 'swiftui');
|
|
@@ -737,7 +737,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
737
737
|
const tempDir = prepareTempDir();
|
|
738
738
|
const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwiftUIWithSentry, 'swift');
|
|
739
739
|
// -- Act --
|
|
740
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
740
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
741
741
|
// -- Assert --
|
|
742
742
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
743
743
|
const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
|
|
@@ -751,7 +751,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
751
751
|
const tempDir = prepareTempDir();
|
|
752
752
|
const filePath = prepareAppDelegateFile(tempDir, invalidAppDelegateSwiftUI, 'swift');
|
|
753
753
|
// -- Act --
|
|
754
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
754
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
755
755
|
// -- Assert --
|
|
756
756
|
(0, vitest_1.expect)(result).toBeFalsy();
|
|
757
757
|
});
|
|
@@ -764,7 +764,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
764
764
|
const tempDir = prepareTempDir();
|
|
765
765
|
const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
|
|
766
766
|
// -- Act --
|
|
767
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
767
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
768
768
|
// -- Assert --
|
|
769
769
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
770
770
|
const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
|
|
@@ -780,7 +780,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
780
780
|
});
|
|
781
781
|
(0, vitest_1.it)('should not add the code snippet', () => {
|
|
782
782
|
// -- Act --
|
|
783
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
783
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
784
784
|
// -- Assert --
|
|
785
785
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
786
786
|
const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
|
|
@@ -788,7 +788,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
788
788
|
});
|
|
789
789
|
(0, vitest_1.it)('should log info', () => {
|
|
790
790
|
// -- Act --
|
|
791
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
791
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
792
792
|
// -- Assert --
|
|
793
793
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
794
794
|
(0, vitest_1.expect)(clack.log.info).toHaveBeenCalledWith('Sentry is already initialized in your AppDelegate. Skipping adding the code snippet.');
|
|
@@ -799,13 +799,61 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
|
799
799
|
const tempDir = prepareTempDir();
|
|
800
800
|
const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
|
|
801
801
|
// -- Act --
|
|
802
|
-
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
|
|
802
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
803
803
|
// -- Assert --
|
|
804
804
|
(0, vitest_1.expect)(result).toBeTruthy();
|
|
805
805
|
(0, vitest_1.expect)(Sentry.setTag).toHaveBeenCalledWith('code-language', 'objc');
|
|
806
806
|
});
|
|
807
807
|
});
|
|
808
808
|
});
|
|
809
|
+
(0, vitest_1.describe)('with logs enabled', () => {
|
|
810
|
+
(0, vitest_1.it)('should add logs option to Swift file', () => {
|
|
811
|
+
// -- Arrange --
|
|
812
|
+
const tempDir = prepareTempDir();
|
|
813
|
+
const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
|
|
814
|
+
// -- Act --
|
|
815
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, true);
|
|
816
|
+
// -- Assert --
|
|
817
|
+
(0, vitest_1.expect)(result).toBeTruthy();
|
|
818
|
+
const fileContent = fs.readFileSync(filePath, 'utf8');
|
|
819
|
+
(0, vitest_1.expect)(fileContent).toContain('options.experimental.enableLogs = true');
|
|
820
|
+
});
|
|
821
|
+
(0, vitest_1.it)('should add logs option to Objective-C file', () => {
|
|
822
|
+
// -- Arrange --
|
|
823
|
+
const tempDir = prepareTempDir();
|
|
824
|
+
const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
|
|
825
|
+
// -- Act --
|
|
826
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, true);
|
|
827
|
+
// -- Assert --
|
|
828
|
+
(0, vitest_1.expect)(result).toBeTruthy();
|
|
829
|
+
const fileContent = fs.readFileSync(filePath, 'utf8');
|
|
830
|
+
(0, vitest_1.expect)(fileContent).toContain('options.experimental.enableLogs = YES;');
|
|
831
|
+
});
|
|
832
|
+
});
|
|
833
|
+
(0, vitest_1.describe)('with logs disabled', () => {
|
|
834
|
+
(0, vitest_1.it)('should not add logs option to Swift file', () => {
|
|
835
|
+
// -- Arrange --
|
|
836
|
+
const tempDir = prepareTempDir();
|
|
837
|
+
const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
|
|
838
|
+
// -- Act --
|
|
839
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
840
|
+
// -- Assert --
|
|
841
|
+
(0, vitest_1.expect)(result).toBeTruthy();
|
|
842
|
+
const fileContent = fs.readFileSync(filePath, 'utf8');
|
|
843
|
+
(0, vitest_1.expect)(fileContent).not.toContain('options.experimental.enableLogs = true');
|
|
844
|
+
});
|
|
845
|
+
(0, vitest_1.it)('should not add logs option to Objective-C file', () => {
|
|
846
|
+
// -- Arrange --
|
|
847
|
+
const tempDir = prepareTempDir();
|
|
848
|
+
const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
|
|
849
|
+
// -- Act --
|
|
850
|
+
const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
|
|
851
|
+
// -- Assert --
|
|
852
|
+
(0, vitest_1.expect)(result).toBeTruthy();
|
|
853
|
+
const fileContent = fs.readFileSync(filePath, 'utf8');
|
|
854
|
+
(0, vitest_1.expect)(fileContent).not.toContain('options.experimental.enableLogs = YES;');
|
|
855
|
+
});
|
|
856
|
+
});
|
|
809
857
|
});
|
|
810
858
|
});
|
|
811
859
|
//# sourceMappingURL=code-tools.test.js.map
|
|
@@ -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\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"]}
|
|
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 false,\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, false);\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, false);\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, false);\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, false);\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, false);\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, false);\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, false);\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, false);\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, false);\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, false);\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, false);\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, false);\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, false);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenCalledWith('code-language', 'objc');\n });\n });\n });\n\n describe('with logs enabled', () => {\n it('should add logs option to Swift file', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn, true);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const fileContent = fs.readFileSync(filePath, 'utf8');\n expect(fileContent).toContain('options.experimental.enableLogs = true');\n });\n\n it('should add logs option to Objective-C file', () => {\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, true);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const fileContent = fs.readFileSync(filePath, 'utf8');\n expect(fileContent).toContain('options.experimental.enableLogs = YES;');\n });\n });\n\n describe('with logs disabled', () => {\n it('should not add logs option to Swift file', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject([filePath], dsn, false);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const fileContent = fs.readFileSync(filePath, 'utf8');\n expect(fileContent).not.toContain(\n 'options.experimental.enableLogs = true',\n );\n });\n\n it('should not add logs option to Objective-C file', () => {\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, false);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const fileContent = fs.readFileSync(filePath, 'utf8');\n expect(fileContent).not.toContain(\n 'options.experimental.enableLogs = YES;',\n );\n });\n });\n });\n});\n"]}
|
|
@@ -97,7 +97,7 @@ fi
|
|
|
97
97
|
(0, vitest_1.describe)('getSwiftSnippet', () => {
|
|
98
98
|
(0, vitest_1.it)('should return the correct snippet', () => {
|
|
99
99
|
// -- Arrange --
|
|
100
|
-
const snippet = (0, templates_1.getSwiftSnippet)('test-dsn');
|
|
100
|
+
const snippet = (0, templates_1.getSwiftSnippet)('test-dsn', false);
|
|
101
101
|
// -- Assert --
|
|
102
102
|
(0, vitest_1.expect)(snippet).toBe(` SentrySDK.start { options in
|
|
103
103
|
options.dsn = "test-dsn"
|
|
@@ -123,13 +123,76 @@ fi
|
|
|
123
123
|
}
|
|
124
124
|
// Remove the next line after confirming that your Sentry integration is working.
|
|
125
125
|
SentrySDK.capture(message: "This app uses Sentry! :)")
|
|
126
|
+
`);
|
|
127
|
+
});
|
|
128
|
+
(0, vitest_1.it)('should return the correct snippet with logs enabled', () => {
|
|
129
|
+
// -- Arrange --
|
|
130
|
+
const snippet = (0, templates_1.getSwiftSnippet)('test-dsn', true);
|
|
131
|
+
// -- Assert --
|
|
132
|
+
(0, vitest_1.expect)(snippet).toBe(` SentrySDK.start { options in
|
|
133
|
+
options.dsn = "test-dsn"
|
|
134
|
+
options.debug = true // Enabled debug when first installing is always helpful
|
|
135
|
+
|
|
136
|
+
// Adds IP for users.
|
|
137
|
+
// For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/
|
|
138
|
+
options.sendDefaultPii = true
|
|
139
|
+
|
|
140
|
+
// Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
|
|
141
|
+
// We recommend adjusting this value in production.
|
|
142
|
+
options.tracesSampleRate = 1.0
|
|
143
|
+
|
|
144
|
+
// Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more.
|
|
145
|
+
options.configureProfiling = {
|
|
146
|
+
$0.sessionSampleRate = 1.0 // We recommend adjusting this value in production.
|
|
147
|
+
$0.lifecycle = .trace
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Uncomment the following lines to add more data to your events
|
|
151
|
+
// options.attachScreenshot = true // This adds a screenshot to the error events
|
|
152
|
+
// options.attachViewHierarchy = true // This adds the view hierarchy to the error events
|
|
153
|
+
|
|
154
|
+
// Enable experimental logging features
|
|
155
|
+
options.experimental.enableLogs = true
|
|
156
|
+
}
|
|
157
|
+
// Remove the next line after confirming that your Sentry integration is working.
|
|
158
|
+
SentrySDK.capture(message: "This app uses Sentry! :)")
|
|
126
159
|
`);
|
|
127
160
|
});
|
|
128
161
|
});
|
|
129
162
|
(0, vitest_1.describe)('getObjcSnippet', () => {
|
|
130
163
|
(0, vitest_1.it)('should return the correct snippet', () => {
|
|
131
164
|
// -- Arrange --
|
|
132
|
-
const snippet = (0, templates_1.getObjcSnippet)('test-dsn');
|
|
165
|
+
const snippet = (0, templates_1.getObjcSnippet)('test-dsn', false);
|
|
166
|
+
// -- Assert --
|
|
167
|
+
(0, vitest_1.expect)(snippet).toBe(` [SentrySDK startWithConfigureOptions:^(SentryOptions * options) {
|
|
168
|
+
options.dsn = @"test-dsn";
|
|
169
|
+
options.debug = YES; // Enabled debug when first installing is always helpful
|
|
170
|
+
|
|
171
|
+
// Adds IP for users.
|
|
172
|
+
// For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/
|
|
173
|
+
options.sendDefaultPii = YES;
|
|
174
|
+
|
|
175
|
+
// Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
|
|
176
|
+
// We recommend adjusting this value in production.
|
|
177
|
+
options.tracesSampleRate = @1.0;
|
|
178
|
+
|
|
179
|
+
// Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more.
|
|
180
|
+
options.configureProfiling = ^(SentryProfileOptions *profiling) {
|
|
181
|
+
profiling.sessionSampleRate = 1.0; // We recommend adjusting this value in production.
|
|
182
|
+
profiling.lifecycle = SentryProfilingLifecycleTrace;
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
//Uncomment the following lines to add more data to your events
|
|
186
|
+
//options.attachScreenshot = YES; //This will add a screenshot to the error events
|
|
187
|
+
//options.attachViewHierarchy = YES; //This will add the view hierarchy to the error events
|
|
188
|
+
}];
|
|
189
|
+
//Remove the next line after confirming that your Sentry integration is working.
|
|
190
|
+
[SentrySDK captureMessage:@"This app uses Sentry!"];
|
|
191
|
+
`);
|
|
192
|
+
});
|
|
193
|
+
(0, vitest_1.it)('should return the correct snippet with logs enabled', () => {
|
|
194
|
+
// -- Arrange --
|
|
195
|
+
const snippet = (0, templates_1.getObjcSnippet)('test-dsn', true);
|
|
133
196
|
// -- Assert --
|
|
134
197
|
(0, vitest_1.expect)(snippet).toBe(` [SentrySDK startWithConfigureOptions:^(SentryOptions * options) {
|
|
135
198
|
options.dsn = @"test-dsn";
|
|
@@ -152,6 +215,9 @@ fi
|
|
|
152
215
|
//Uncomment the following lines to add more data to your events
|
|
153
216
|
//options.attachScreenshot = YES; //This will add a screenshot to the error events
|
|
154
217
|
//options.attachViewHierarchy = YES; //This will add the view hierarchy to the error events
|
|
218
|
+
|
|
219
|
+
// Enable experimental logging features
|
|
220
|
+
options.experimental.enableLogs = YES;
|
|
155
221
|
}];
|
|
156
222
|
//Remove the next line after confirming that your Sentry integration is working.
|
|
157
223
|
[SentrySDK captureMessage:@"This app uses Sentry!"];
|