@sentry/wizard 3.39.0 → 3.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/CHANGELOG.md +12 -1
  2. package/README.md +21 -21
  3. package/bin.ts +5 -0
  4. package/codecov.yml +15 -0
  5. package/dist/bin.js +4 -0
  6. package/dist/bin.js.map +1 -1
  7. package/dist/e2e-tests/jest.config.d.ts +1 -0
  8. package/dist/e2e-tests/jest.config.js +1 -0
  9. package/dist/e2e-tests/jest.config.js.map +1 -1
  10. package/dist/e2e-tests/tests/flutter.test.d.ts +1 -0
  11. package/dist/e2e-tests/tests/flutter.test.js +190 -0
  12. package/dist/e2e-tests/tests/flutter.test.js.map +1 -0
  13. package/dist/e2e-tests/utils/index.d.ts +11 -0
  14. package/dist/e2e-tests/utils/index.js +36 -1
  15. package/dist/e2e-tests/utils/index.js.map +1 -1
  16. package/dist/lib/Constants.d.ts +1 -0
  17. package/dist/lib/Constants.js +5 -0
  18. package/dist/lib/Constants.js.map +1 -1
  19. package/dist/package.json +3 -2
  20. package/dist/src/apple/apple-wizard.js +2 -3
  21. package/dist/src/apple/apple-wizard.js.map +1 -1
  22. package/dist/src/apple/code-tools.d.ts +10 -0
  23. package/dist/src/apple/code-tools.js +16 -12
  24. package/dist/src/apple/code-tools.js.map +1 -1
  25. package/dist/src/apple/fastlane.d.ts +23 -0
  26. package/dist/src/apple/fastlane.js +11 -7
  27. package/dist/src/apple/fastlane.js.map +1 -1
  28. package/dist/src/apple/templates.d.ts +1 -1
  29. package/dist/src/apple/templates.js +0 -2
  30. package/dist/src/apple/templates.js.map +1 -1
  31. package/dist/src/apple/xcode-manager.d.ts +13 -9
  32. package/dist/src/apple/xcode-manager.js +146 -61
  33. package/dist/src/apple/xcode-manager.js.map +1 -1
  34. package/dist/src/flutter/code-tools.d.ts +17 -0
  35. package/dist/src/flutter/code-tools.js +263 -0
  36. package/dist/src/flutter/code-tools.js.map +1 -0
  37. package/dist/src/flutter/flutter-wizard.d.ts +2 -0
  38. package/dist/src/flutter/flutter-wizard.js +171 -0
  39. package/dist/src/flutter/flutter-wizard.js.map +1 -0
  40. package/dist/src/flutter/templates.d.ts +9 -0
  41. package/dist/src/flutter/templates.js +40 -0
  42. package/dist/src/flutter/templates.js.map +1 -0
  43. package/dist/src/nextjs/nextjs-wizard.js +5 -3
  44. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  45. package/dist/src/nuxt/nuxt-wizard.js +6 -4
  46. package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
  47. package/dist/src/nuxt/sdk-setup.d.ts +1 -1
  48. package/dist/src/nuxt/sdk-setup.js +2 -1
  49. package/dist/src/nuxt/sdk-setup.js.map +1 -1
  50. package/dist/src/react-native/react-native-wizard.js +5 -3
  51. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  52. package/dist/src/remix/remix-wizard.js +5 -3
  53. package/dist/src/remix/remix-wizard.js.map +1 -1
  54. package/dist/src/run.d.ts +2 -1
  55. package/dist/src/run.js +40 -32
  56. package/dist/src/run.js.map +1 -1
  57. package/dist/src/sveltekit/sveltekit-wizard.js +5 -3
  58. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  59. package/dist/src/utils/clack-utils.d.ts +4 -2
  60. package/dist/src/utils/clack-utils.js +18 -12
  61. package/dist/src/utils/clack-utils.js.map +1 -1
  62. package/dist/src/utils/package-manager.d.ts +1 -0
  63. package/dist/src/utils/package-manager.js +5 -0
  64. package/dist/src/utils/package-manager.js.map +1 -1
  65. package/dist/src/utils/types.d.ts +9 -0
  66. package/dist/src/utils/types.js.map +1 -1
  67. package/dist/test/apple/cocoapod.test.d.ts +1 -0
  68. package/dist/test/apple/cocoapod.test.js +409 -0
  69. package/dist/test/apple/cocoapod.test.js.map +1 -0
  70. package/dist/test/apple/code-tools.test.d.ts +1 -0
  71. package/dist/test/apple/code-tools.test.js +673 -0
  72. package/dist/test/apple/code-tools.test.js.map +1 -0
  73. package/dist/test/apple/fastfile.test.d.ts +1 -0
  74. package/dist/test/apple/fastfile.test.js +431 -0
  75. package/dist/test/apple/fastfile.test.js.map +1 -0
  76. package/dist/test/apple/templates.test.d.ts +1 -0
  77. package/dist/test/apple/templates.test.js +73 -0
  78. package/dist/test/apple/templates.test.js.map +1 -0
  79. package/dist/test/apple/xcode-manager.test.d.ts +1 -0
  80. package/dist/test/apple/xcode-manager.test.js +834 -0
  81. package/dist/test/apple/xcode-manager.test.js.map +1 -0
  82. package/dist/test/flutter/code-tools.test.d.ts +1 -0
  83. package/dist/test/flutter/code-tools.test.js +84 -0
  84. package/dist/test/flutter/code-tools.test.js.map +1 -0
  85. package/dist/test/flutter/templates.test.d.ts +1 -0
  86. package/dist/test/flutter/templates.test.js +41 -0
  87. package/dist/test/flutter/templates.test.js.map +1 -0
  88. package/dist/test/utils/clack-utils.test.js +89 -0
  89. package/dist/test/utils/clack-utils.test.js.map +1 -1
  90. package/e2e-tests/README.md +5 -1
  91. package/e2e-tests/jest.config.ts +1 -0
  92. package/e2e-tests/test-applications/apple/damaged-missing-configuration-list/Project.xcodeproj/project.pbxproj +52 -0
  93. package/e2e-tests/test-applications/apple/damaged-missing-configuration-list/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +78 -0
  94. package/e2e-tests/test-applications/apple/no-targets/Project.xcodeproj/project.pbxproj +62 -0
  95. package/e2e-tests/test-applications/apple/no-targets/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +78 -0
  96. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project.xcodeproj/project.pbxproj +470 -0
  97. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +78 -0
  98. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project1/ContentView.swift +7 -0
  99. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project1/Project1App.swift +10 -0
  100. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project2/ContentView.swift +7 -0
  101. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project2/Project2App.swift +10 -0
  102. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Project.xcodeproj/project.pbxproj +382 -0
  103. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Project.xcodeproj/xcshareddata/xcschemes/Project.xcscheme +78 -0
  104. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Sources/ContentView.swift +7 -0
  105. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Sources/MainApp.swift +10 -0
  106. package/e2e-tests/test-applications/flutter-test-app/.metadata +45 -0
  107. package/e2e-tests/test-applications/flutter-test-app/README.md +16 -0
  108. package/e2e-tests/test-applications/flutter-test-app/analysis_options.yaml +28 -0
  109. package/e2e-tests/test-applications/flutter-test-app/android/app/build.gradle +44 -0
  110. package/e2e-tests/test-applications/flutter-test-app/android/app/src/debug/AndroidManifest.xml +7 -0
  111. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/AndroidManifest.xml +45 -0
  112. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/kotlin/com/example/flutter_magic/MainActivity.kt +5 -0
  113. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/drawable/launch_background.xml +12 -0
  114. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/drawable-v21/launch_background.xml +12 -0
  115. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  116. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  117. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  118. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  119. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  120. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/values/styles.xml +18 -0
  121. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/values-night/styles.xml +18 -0
  122. package/e2e-tests/test-applications/flutter-test-app/android/app/src/profile/AndroidManifest.xml +7 -0
  123. package/e2e-tests/test-applications/flutter-test-app/android/build.gradle +18 -0
  124. package/e2e-tests/test-applications/flutter-test-app/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  125. package/e2e-tests/test-applications/flutter-test-app/android/gradle.properties +3 -0
  126. package/e2e-tests/test-applications/flutter-test-app/android/settings.gradle +25 -0
  127. package/e2e-tests/test-applications/flutter-test-app/lib/main.dart +125 -0
  128. package/e2e-tests/test-applications/flutter-test-app/linux/CMakeLists.txt +145 -0
  129. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/CMakeLists.txt +88 -0
  130. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugin_registrant.cc +11 -0
  131. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugin_registrant.h +15 -0
  132. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugins.cmake +23 -0
  133. package/e2e-tests/test-applications/flutter-test-app/linux/main.cc +6 -0
  134. package/e2e-tests/test-applications/flutter-test-app/linux/my_application.cc +124 -0
  135. package/e2e-tests/test-applications/flutter-test-app/linux/my_application.h +18 -0
  136. package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/Flutter-Debug.xcconfig +2 -0
  137. package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/Flutter-Release.xcconfig +2 -0
  138. package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/GeneratedPluginRegistrant.swift +10 -0
  139. package/e2e-tests/test-applications/flutter-test-app/macos/Podfile +43 -0
  140. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/AppDelegate.swift +9 -0
  141. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +68 -0
  142. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png +0 -0
  143. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png +0 -0
  144. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png +0 -0
  145. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png +0 -0
  146. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png +0 -0
  147. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png +0 -0
  148. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png +0 -0
  149. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Base.lproj/MainMenu.xib +343 -0
  150. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/AppInfo.xcconfig +14 -0
  151. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Debug.xcconfig +2 -0
  152. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Release.xcconfig +2 -0
  153. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Warnings.xcconfig +13 -0
  154. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/DebugProfile.entitlements +12 -0
  155. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Info.plist +32 -0
  156. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/MainFlutterWindow.swift +15 -0
  157. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Release.entitlements +8 -0
  158. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/project.pbxproj +705 -0
  159. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  160. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +98 -0
  161. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcworkspace/contents.xcworkspacedata +7 -0
  162. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  163. package/e2e-tests/test-applications/flutter-test-app/macos/RunnerTests/RunnerTests.swift +12 -0
  164. package/e2e-tests/test-applications/flutter-test-app/pubspec.lock +213 -0
  165. package/e2e-tests/test-applications/flutter-test-app/pubspec.yaml +89 -0
  166. package/e2e-tests/test-applications/flutter-test-app/test/widget_test.dart +30 -0
  167. package/e2e-tests/test-applications/flutter-test-app/web/favicon.png +0 -0
  168. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-192.png +0 -0
  169. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-512.png +0 -0
  170. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-maskable-192.png +0 -0
  171. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-maskable-512.png +0 -0
  172. package/e2e-tests/test-applications/flutter-test-app/web/index.html +38 -0
  173. package/e2e-tests/test-applications/flutter-test-app/web/manifest.json +35 -0
  174. package/e2e-tests/test-applications/flutter-test-app/windows/CMakeLists.txt +108 -0
  175. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/CMakeLists.txt +109 -0
  176. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugin_registrant.cc +11 -0
  177. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugin_registrant.h +15 -0
  178. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugins.cmake +23 -0
  179. package/e2e-tests/test-applications/flutter-test-app/windows/runner/CMakeLists.txt +40 -0
  180. package/e2e-tests/test-applications/flutter-test-app/windows/runner/Runner.rc +121 -0
  181. package/e2e-tests/test-applications/flutter-test-app/windows/runner/flutter_window.cpp +71 -0
  182. package/e2e-tests/test-applications/flutter-test-app/windows/runner/flutter_window.h +33 -0
  183. package/e2e-tests/test-applications/flutter-test-app/windows/runner/main.cpp +43 -0
  184. package/e2e-tests/test-applications/flutter-test-app/windows/runner/resource.h +16 -0
  185. package/e2e-tests/test-applications/flutter-test-app/windows/runner/resources/app_icon.ico +0 -0
  186. package/e2e-tests/test-applications/flutter-test-app/windows/runner/runner.exe.manifest +14 -0
  187. package/e2e-tests/test-applications/flutter-test-app/windows/runner/utils.cpp +65 -0
  188. package/e2e-tests/test-applications/flutter-test-app/windows/runner/utils.h +19 -0
  189. package/e2e-tests/test-applications/flutter-test-app/windows/runner/win32_window.cpp +288 -0
  190. package/e2e-tests/test-applications/flutter-test-app/windows/runner/win32_window.h +102 -0
  191. package/e2e-tests/tests/flutter.test.ts +127 -0
  192. package/e2e-tests/utils/index.ts +33 -0
  193. package/lib/Constants.ts +5 -0
  194. package/package.json +3 -2
  195. package/src/apple/apple-wizard.ts +2 -3
  196. package/src/apple/code-tools.ts +21 -6
  197. package/src/apple/fastlane.ts +18 -2
  198. package/src/apple/templates.ts +2 -2
  199. package/src/apple/xcode-manager.ts +186 -99
  200. package/src/flutter/code-tools.ts +284 -0
  201. package/src/flutter/flutter-wizard.ts +164 -0
  202. package/src/flutter/templates.ts +90 -0
  203. package/src/nextjs/nextjs-wizard.ts +5 -2
  204. package/src/nuxt/nuxt-wizard.ts +6 -3
  205. package/src/nuxt/sdk-setup.ts +2 -0
  206. package/src/react-native/react-native-wizard.ts +5 -2
  207. package/src/remix/remix-wizard.ts +5 -2
  208. package/src/run.ts +9 -0
  209. package/src/sveltekit/sveltekit-wizard.ts +5 -2
  210. package/src/utils/clack-utils.ts +16 -4
  211. package/src/utils/package-manager.ts +6 -0
  212. package/src/utils/types.ts +10 -0
  213. package/test/apple/cocoapod.test.ts +306 -0
  214. package/test/apple/code-tools.test.ts +1042 -0
  215. package/test/apple/fastfile.test.ts +550 -0
  216. package/test/apple/templates.test.ts +191 -0
  217. package/test/apple/xcode-manager.test.ts +1066 -0
  218. package/test/flutter/code-tools.test.ts +212 -0
  219. package/test/flutter/templates.test.ts +100 -0
  220. package/test/utils/clack-utils.test.ts +92 -0
  221. package/types/xcode.d.ts +526 -0
@@ -0,0 +1,673 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ var Sentry = __importStar(require("@sentry/node"));
27
+ var fs = __importStar(require("fs"));
28
+ var os = __importStar(require("os"));
29
+ var path = __importStar(require("path"));
30
+ var code_tools_1 = require("../../src/apple/code-tools");
31
+ // @ts-ignore - clack is ESM and TS complains about that. It works though
32
+ var clack = __importStar(require("@clack/prompts"));
33
+ // Test Constants
34
+ var invalidAppDelegateSwift = "func application() {}";
35
+ var 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}";
36
+ var 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 // Sample rate for profiling, applied on top of TracesSampleRate.\n // We recommend adjusting this value in production.\n options.profilesSampleRate = 1.0 \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}";
37
+ var invalidAppDelegateObjC = "\n- (BOOL)application:(UIApplication *) {\n return NO;\n}";
38
+ var 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";
39
+ var 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 // Sample rate for profiling, applied on top of TracesSampleRate.\n // We recommend adjusting this value in production.\n options.profilesSampleRate = @1.0;\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";
40
+ var invalidAppDelegateSwiftUI = "\nstruct MyApp: App {\n var body: some Scene {\n WindowGroup { Text(\"Hello, world!\") }\n }\n}";
41
+ var validAppDelegateSwiftUI = "\nimport SwiftUI\n\n@main\nstruct TestApp: App {\n var body: some Scene {\n WindowGroup {\n ContentView()\n }\n }\n}";
42
+ var 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 // Sample rate for profiling, applied on top of TracesSampleRate.\n // We recommend adjusting this value in production.\n options.profilesSampleRate = 1.0 \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}";
43
+ var prepareTempDir = function () {
44
+ var tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));
45
+ return tempDir;
46
+ };
47
+ var prepareAppDelegateFile = function (dir, content, ext) {
48
+ var filePath = path.join(dir, "AppDelegate.".concat(ext));
49
+ fs.writeFileSync(filePath, content, 'utf8');
50
+ return filePath;
51
+ };
52
+ var dsn = 'https://example.com/sentry-dsn';
53
+ // Mock Setup
54
+ jest.mock('../../src/utils/bash');
55
+ jest.spyOn(Sentry, 'setTag').mockImplementation();
56
+ jest.spyOn(Sentry, 'captureException').mockImplementation();
57
+ // Test Suite
58
+ describe('code-tools', function () {
59
+ beforeEach(function () {
60
+ jest.spyOn(clack.log, 'info').mockImplementation();
61
+ });
62
+ afterEach(function () {
63
+ jest.clearAllMocks();
64
+ });
65
+ describe('#isAppDelegateFile', function () {
66
+ var prepareTestFile = function (content, ext) {
67
+ var tempDir = prepareTempDir();
68
+ return prepareAppDelegateFile(tempDir, content, ext);
69
+ };
70
+ describe('swift files', function () {
71
+ describe('swift app launch regex', function () {
72
+ describe('valid cases', function () {
73
+ var variations = [
74
+ {
75
+ name: 'with underscores',
76
+ code: 'func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {',
77
+ },
78
+ {
79
+ name: 'with different dictionary type',
80
+ code: 'func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {',
81
+ },
82
+ {
83
+ name: 'with extra whitespace',
84
+ code: ' func application ( _ application: UIApplication , didFinishLaunchingWithOptions launchOptions: [ NSObject : AnyObject ]? ) -> Bool { ',
85
+ },
86
+ {
87
+ name: 'macOS notification variant',
88
+ code: 'func applicationDidFinishLaunching(_ aNotification: Notification) {',
89
+ },
90
+ {
91
+ name: 'macOS with extra whitespace',
92
+ code: 'func applicationDidFinishLaunching ( _ aNotification: Notification ) {',
93
+ },
94
+ ];
95
+ var _loop_1 = function (variation) {
96
+ describe("".concat(variation.name), function () {
97
+ it("should return true", function () {
98
+ // -- Arrange --
99
+ var filePath = prepareTestFile(variation.code, 'swift');
100
+ // -- Act --
101
+ var result = code_tools_1.exportForTesting.isAppDelegateFile(filePath);
102
+ // -- Assert --
103
+ expect(result).toBeTruthy();
104
+ });
105
+ });
106
+ };
107
+ for (var _i = 0, variations_1 = variations; _i < variations_1.length; _i++) {
108
+ var variation = variations_1[_i];
109
+ _loop_1(variation);
110
+ }
111
+ describe('invalid cases', function () {
112
+ var variations = [
113
+ {
114
+ name: 'missing application method',
115
+ code: 'import UIKit',
116
+ },
117
+ {
118
+ name: 'typo in method name',
119
+ code: 'func applicatioM(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {',
120
+ },
121
+ {
122
+ name: 'garbage input',
123
+ code: 'asdf;jk23;uas()d{',
124
+ },
125
+ ];
126
+ var _loop_2 = function (variation) {
127
+ describe("".concat(variation.name), function () {
128
+ it('should return false', function () {
129
+ // -- Arrange --
130
+ var filePath = prepareTestFile(variation.code, 'swift');
131
+ // -- Act --
132
+ var result = code_tools_1.exportForTesting.isAppDelegateFile(filePath);
133
+ // -- Assert --
134
+ expect(result).toBeFalsy();
135
+ });
136
+ });
137
+ };
138
+ for (var _i = 0, variations_2 = variations; _i < variations_2.length; _i++) {
139
+ var variation = variations_2[_i];
140
+ _loop_2(variation);
141
+ }
142
+ });
143
+ });
144
+ });
145
+ });
146
+ describe('objc files', function () {
147
+ describe('valid cases', function () {
148
+ var variations = [
149
+ {
150
+ name: 'basic',
151
+ code: '- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {',
152
+ },
153
+ {
154
+ name: 'with more whitespace',
155
+ code: '- ( BOOL ) application: ( UIApplication * ) application didFinishLaunchingWithOptions: ( NSDictionary * ) launchOptions {',
156
+ },
157
+ ];
158
+ var _loop_3 = function (variation) {
159
+ describe("".concat(variation.name), function () {
160
+ it('should return true', function () {
161
+ // -- Arrange --
162
+ var filePath = prepareTestFile(variation.code, 'm');
163
+ // -- Act --
164
+ var result = code_tools_1.exportForTesting.isAppDelegateFile(filePath);
165
+ // -- Assert --
166
+ expect(result).toBeTruthy();
167
+ });
168
+ });
169
+ };
170
+ for (var _i = 0, variations_3 = variations; _i < variations_3.length; _i++) {
171
+ var variation = variations_3[_i];
172
+ _loop_3(variation);
173
+ }
174
+ });
175
+ describe('invalid cases', function () {
176
+ var variations = [
177
+ {
178
+ name: 'missing application method',
179
+ code: 'import UIKit',
180
+ },
181
+ ];
182
+ var _loop_4 = function (variation) {
183
+ describe("".concat(variation.name), function () {
184
+ it('should return false', function () {
185
+ // -- Arrange --
186
+ var filePath = prepareTestFile(variation.code, 'm');
187
+ // -- Act --
188
+ var result = code_tools_1.exportForTesting.isAppDelegateFile(filePath);
189
+ // -- Assert --
190
+ expect(result).toBeFalsy();
191
+ });
192
+ });
193
+ };
194
+ for (var _i = 0, variations_4 = variations; _i < variations_4.length; _i++) {
195
+ var variation = variations_4[_i];
196
+ _loop_4(variation);
197
+ }
198
+ });
199
+ });
200
+ describe('swiftui files', function () {
201
+ describe('valid cases', function () {
202
+ var variations = [
203
+ {
204
+ name: 'basic',
205
+ code: '@main struct MyApp: App {',
206
+ },
207
+ {
208
+ name: 'with more whitespace',
209
+ code: '@main struct MyApp: App {',
210
+ },
211
+ {
212
+ name: 'with SwiftUI namespace',
213
+ code: '@main struct App: SwiftUI.App {',
214
+ },
215
+ ];
216
+ var _loop_5 = function (variation) {
217
+ describe("".concat(variation.name), function () {
218
+ it('should return true', function () {
219
+ // -- Arrange --
220
+ var filePath = prepareTestFile(variation.code, 'swift');
221
+ // -- Act --
222
+ var result = code_tools_1.exportForTesting.isAppDelegateFile(filePath);
223
+ // -- Assert --
224
+ expect(result).toBeTruthy();
225
+ });
226
+ });
227
+ };
228
+ for (var _i = 0, variations_5 = variations; _i < variations_5.length; _i++) {
229
+ var variation = variations_5[_i];
230
+ _loop_5(variation);
231
+ }
232
+ });
233
+ describe('invalid cases', function () {
234
+ var variations = [
235
+ {
236
+ name: 'missing @main',
237
+ code: 'struct App: App {',
238
+ },
239
+ {
240
+ name: 'missing super-type App',
241
+ code: 'struct MyApp {',
242
+ },
243
+ {
244
+ name: 'imported not from SwiftUI',
245
+ code: '@main struct App: MySwiftyUI.App {',
246
+ },
247
+ {
248
+ name: 'imported not from SwiftUI but similar',
249
+ code: '@main struct App: MySwiftUI.App {',
250
+ },
251
+ ];
252
+ var _loop_6 = function (variation) {
253
+ describe("".concat(variation.name), function () {
254
+ it('should return false', function () {
255
+ // -- Arrange --
256
+ var filePath = prepareTestFile(variation.code, 'swift');
257
+ // -- Act --
258
+ var result = code_tools_1.exportForTesting.isAppDelegateFile(filePath);
259
+ // -- Assert --
260
+ expect(result).toBeFalsy();
261
+ });
262
+ });
263
+ };
264
+ for (var _i = 0, variations_6 = variations; _i < variations_6.length; _i++) {
265
+ var variation = variations_6[_i];
266
+ _loop_6(variation);
267
+ }
268
+ });
269
+ });
270
+ describe('file not found', function () {
271
+ it('should throw an error', function () {
272
+ // -- Arrange --
273
+ var invalidPath = path.join(os.tmpdir(), 'invalid-path');
274
+ // -- Act & Assert --
275
+ expect(function () { return code_tools_1.exportForTesting.isAppDelegateFile(invalidPath); }).toThrow();
276
+ });
277
+ });
278
+ });
279
+ describe('#findAppDidFinishLaunchingWithOptions', function () {
280
+ describe('no files given', function () {
281
+ it('should check files in directory', function () {
282
+ // -- Arrange --
283
+ var tempDir = prepareTempDir();
284
+ var filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
285
+ // -- Act --
286
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
287
+ // -- Assert --
288
+ expect(result).toBe(filePath);
289
+ });
290
+ });
291
+ describe('SwiftUI file found', function () {
292
+ describe('is app delegate', function () {
293
+ it('should return the file path', function () {
294
+ // -- Arrange --
295
+ var tempDir = prepareTempDir();
296
+ var filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwiftUI, 'swift');
297
+ // -- Act --
298
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
299
+ // -- Assert --
300
+ expect(result).toBe(filePath);
301
+ });
302
+ });
303
+ describe('is not app delegate', function () {
304
+ it('should be ignored', function () {
305
+ // -- Arrange --
306
+ var tempDir = prepareTempDir();
307
+ prepareAppDelegateFile(tempDir, invalidAppDelegateSwiftUI, 'swift');
308
+ // -- Act --
309
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
310
+ // -- Assert --
311
+ expect(result).toBeNull();
312
+ });
313
+ });
314
+ });
315
+ describe('Swift file found', function () {
316
+ describe('is app delegate', function () {
317
+ it('should return the file path', function () {
318
+ // -- Arrange --
319
+ var tempDir = prepareTempDir();
320
+ var filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
321
+ // -- Act --
322
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
323
+ // -- Assert --
324
+ expect(result).toBe(filePath);
325
+ });
326
+ });
327
+ describe('is not app delegate', function () {
328
+ it('should be ignored', function () {
329
+ // -- Arrange --
330
+ var tempDir = prepareTempDir();
331
+ prepareAppDelegateFile(tempDir, invalidAppDelegateSwift, 'swift');
332
+ // -- Act --
333
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
334
+ // -- Assert --
335
+ expect(result).toBeNull();
336
+ });
337
+ });
338
+ });
339
+ describe('Objective-C file found', function () {
340
+ describe('is app delegate', function () {
341
+ it('should return the file path', function () {
342
+ // -- Arrange --
343
+ var tempDir = prepareTempDir();
344
+ var filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
345
+ // -- Act --
346
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
347
+ // -- Assert --
348
+ expect(result).toBe(filePath);
349
+ });
350
+ });
351
+ describe('is not app delegate', function () {
352
+ it('should be ignored', function () {
353
+ // -- Arrange --
354
+ var tempDir = prepareTempDir();
355
+ prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'm');
356
+ // -- Act --
357
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
358
+ // -- Assert --
359
+ expect(result).toBeNull();
360
+ });
361
+ });
362
+ });
363
+ describe('Objective-C++ file found', function () {
364
+ describe('is app delegate', function () {
365
+ it('should return the file path', function () {
366
+ // -- Arrange --
367
+ var tempDir = prepareTempDir();
368
+ var filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'mm');
369
+ // -- Act --
370
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir, [filePath]);
371
+ // -- Assert --
372
+ expect(result).toBe(filePath);
373
+ });
374
+ });
375
+ describe('is not app delegate', function () {
376
+ it('should be ignored', function () {
377
+ // -- Arrange --
378
+ var tempDir = prepareTempDir();
379
+ prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'mm');
380
+ // -- Act --
381
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
382
+ // -- Assert --
383
+ expect(result).toBeNull();
384
+ });
385
+ });
386
+ });
387
+ describe('file in list not found', function () {
388
+ it('should return null', function () {
389
+ // -- Arrange --
390
+ var tempDir = prepareTempDir();
391
+ var filePath = prepareAppDelegateFile(tempDir, invalidAppDelegateSwift, 'swift');
392
+ // -- Act --
393
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir, [filePath]);
394
+ // -- Assert --
395
+ expect(result).toBeNull();
396
+ });
397
+ });
398
+ describe('unrelated file found', function () {
399
+ it('should be ignored', function () {
400
+ // -- Arrange --
401
+ var tempDir = prepareTempDir();
402
+ var filePath = prepareAppDelegateFile(tempDir, invalidAppDelegateSwift, 'swift');
403
+ // -- Act --
404
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir, [filePath]);
405
+ // -- Assert --
406
+ expect(result).toBeNull();
407
+ });
408
+ });
409
+ describe('directory in list', function () {
410
+ describe('name starts with dot', function () {
411
+ it('should be ignored', function () {
412
+ // -- Arrange --
413
+ var tempDir = prepareTempDir();
414
+ var hiddenDir = path.join(tempDir, '.hidden');
415
+ fs.mkdirSync(hiddenDir);
416
+ prepareAppDelegateFile(hiddenDir, validAppDelegateSwift, 'swift');
417
+ // -- Act --
418
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
419
+ // -- Assert --
420
+ expect(result).toBeNull();
421
+ });
422
+ });
423
+ describe('name ends with .xcodeproj', function () {
424
+ it('should be ignored', function () {
425
+ // -- Arrange --
426
+ var tempDir = prepareTempDir();
427
+ var xcodeDir = path.join(tempDir, 'MyProject.xcodeproj');
428
+ fs.mkdirSync(xcodeDir);
429
+ prepareAppDelegateFile(xcodeDir, validAppDelegateSwift, 'swift');
430
+ // -- Act --
431
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
432
+ // -- Assert --
433
+ expect(result).toBeNull();
434
+ });
435
+ });
436
+ describe('name ends with .xcassets', function () {
437
+ it('should be ignored', function () {
438
+ // -- Arrange --
439
+ var tempDir = prepareTempDir();
440
+ var xcassetsDir = path.join(tempDir, 'MyProject.xcassets');
441
+ fs.mkdirSync(xcassetsDir);
442
+ prepareAppDelegateFile(xcassetsDir, validAppDelegateSwift, 'swift');
443
+ // -- Act --
444
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
445
+ // -- Assert --
446
+ expect(result).toBeNull();
447
+ });
448
+ });
449
+ describe('is not a directory', function () {
450
+ it('should be ignored', function () {
451
+ // -- Arrange --
452
+ var tempDir = prepareTempDir();
453
+ var filePath = path.join(tempDir, 'some-file');
454
+ fs.writeFileSync(filePath, validAppDelegateSwift, 'utf8');
455
+ // -- Act --
456
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
457
+ // -- Assert --
458
+ expect(result).toBeNull();
459
+ });
460
+ });
461
+ });
462
+ describe('multiple files could be app delegate', function () {
463
+ it('should return the first one', function () {
464
+ // -- Arrange --
465
+ var tempDir = prepareTempDir();
466
+ var filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
467
+ prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
468
+ // -- Act --
469
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
470
+ // -- Assert --
471
+ expect(result).toBe(filePath);
472
+ });
473
+ });
474
+ describe('multiple nested directories with app delegate', function () {
475
+ it('should return the first one', function () {
476
+ // -- Arrange --
477
+ var tempDir = prepareTempDir();
478
+ var nestedDir = path.join(tempDir, 'nested');
479
+ fs.mkdirSync(nestedDir);
480
+ var nestedFilePath = prepareAppDelegateFile(nestedDir, validAppDelegateSwift, 'swift');
481
+ var nestedDir2 = path.join(tempDir, 'nested2');
482
+ fs.mkdirSync(nestedDir2);
483
+ prepareAppDelegateFile(nestedDir2, validAppDelegateSwift, 'swift');
484
+ // -- Act --
485
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
486
+ // -- Assert --
487
+ expect(result).toBe(nestedFilePath);
488
+ });
489
+ });
490
+ describe('no app delegate found', function () {
491
+ it('should return null', function () {
492
+ // -- Arrange --
493
+ var tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));
494
+ // -- Act --
495
+ var result = code_tools_1.exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir, []);
496
+ // -- Assert --
497
+ expect(result).toBeNull();
498
+ });
499
+ });
500
+ });
501
+ describe('#addCodeSnippetToProject', function () {
502
+ describe('app delegate file is not found', function () {
503
+ it('should return false', function () {
504
+ // -- Arrange --
505
+ var tempDir = prepareTempDir();
506
+ // -- Act --
507
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, ['AppDelegate.swift'], 'https://example.com/sentry-dsn');
508
+ // -- Assert --
509
+ expect(result).toBeFalsy();
510
+ });
511
+ });
512
+ describe('app delegate file is found', function () {
513
+ var tempDir;
514
+ var appDelegatePath;
515
+ beforeEach(function () {
516
+ // -- Arrange --
517
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));
518
+ appDelegatePath = path.join(tempDir, 'AppDelegate.swift');
519
+ fs.writeFileSync(appDelegatePath, validAppDelegateSwift, 'utf8');
520
+ });
521
+ describe('is Swift file', function () {
522
+ describe('Sentry is not initialized', function () {
523
+ var tempDir;
524
+ var filePath;
525
+ beforeEach(function () {
526
+ tempDir = prepareTempDir();
527
+ filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
528
+ });
529
+ it('should add the code snippet', function () {
530
+ // -- Act --
531
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
532
+ // -- Assert --
533
+ expect(result).toBeTruthy();
534
+ var modifiedFileContent = fs.readFileSync(filePath, 'utf8');
535
+ expect(modifiedFileContent).toBe(validAppDelegateSwiftWithSentry);
536
+ });
537
+ it("should set tag 'code-language'", function () {
538
+ // -- Act --
539
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
540
+ // -- Assert --
541
+ expect(result).toBeTruthy();
542
+ expect(Sentry.setTag).toHaveBeenCalledWith('code-language', 'swift');
543
+ });
544
+ it("should set tag 'ui-engine'", function () {
545
+ // -- Act --
546
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
547
+ // -- Assert --
548
+ expect(result).toBeTruthy();
549
+ expect(Sentry.setTag).toHaveBeenCalledWith('ui-engine', 'uikit');
550
+ });
551
+ });
552
+ describe('Sentry is already initialized', function () {
553
+ it('should not add the code snippet', function () {
554
+ // -- Arrange --
555
+ var tempDir = prepareTempDir();
556
+ var filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwiftWithSentry, 'swift');
557
+ // -- Act --
558
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
559
+ // -- Assert --
560
+ expect(result).toBeTruthy();
561
+ var modifiedFileContent = fs.readFileSync(filePath, 'utf8');
562
+ expect(modifiedFileContent).toBe(validAppDelegateSwiftWithSentry);
563
+ });
564
+ });
565
+ describe('is SwiftUI file', function () {
566
+ describe('Sentry is not initialized', function () {
567
+ var tempDir;
568
+ var filePath;
569
+ beforeEach(function () {
570
+ tempDir = prepareTempDir();
571
+ filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwiftUI, 'swift');
572
+ });
573
+ it('should add the code snippet', function () {
574
+ // -- Act --
575
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
576
+ // -- Assert --
577
+ expect(result).toBeTruthy();
578
+ var modifiedFileContent = fs.readFileSync(filePath, 'utf8');
579
+ expect(modifiedFileContent).toBe(validAppDelegateSwiftUIWithSentry);
580
+ });
581
+ it("should set tag 'code-language'", function () {
582
+ // -- Act --
583
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
584
+ // -- Assert --
585
+ expect(result).toBeTruthy();
586
+ expect(Sentry.setTag).toHaveBeenNthCalledWith(1, 'code-language', 'swift');
587
+ });
588
+ it("should set tag 'ui-engine'", function () {
589
+ // -- Act --
590
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
591
+ // -- Assert --
592
+ expect(result).toBeTruthy();
593
+ expect(Sentry.setTag).toHaveBeenNthCalledWith(2, 'ui-engine', 'swiftui');
594
+ });
595
+ });
596
+ describe('Sentry is already initialized', function () {
597
+ it('should not add the code snippet', function () {
598
+ // -- Arrange --
599
+ var tempDir = prepareTempDir();
600
+ var filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwiftUIWithSentry, 'swift');
601
+ // -- Act --
602
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
603
+ // -- Assert --
604
+ expect(result).toBeTruthy();
605
+ var modifiedFileContent = fs.readFileSync(filePath, 'utf8');
606
+ expect(modifiedFileContent).toBe(validAppDelegateSwiftUIWithSentry);
607
+ });
608
+ });
609
+ });
610
+ describe('is not matching SwiftUI regex', function () {
611
+ it('should not add the code snippet', function () {
612
+ // -- Arrange --
613
+ var tempDir = prepareTempDir();
614
+ var filePath = prepareAppDelegateFile(tempDir, invalidAppDelegateSwiftUI, 'swift');
615
+ // -- Act --
616
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
617
+ // -- Assert --
618
+ expect(result).toBeFalsy();
619
+ });
620
+ });
621
+ });
622
+ describe('is Objective-C file', function () {
623
+ describe('Sentry is not initialized', function () {
624
+ it('should add the code snippet', function () {
625
+ // -- Act --
626
+ var tempDir = prepareTempDir();
627
+ var filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
628
+ // -- Act --
629
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
630
+ // -- Assert --
631
+ expect(result).toBeTruthy();
632
+ var modifiedFileContent = fs.readFileSync(filePath, 'utf8');
633
+ expect(modifiedFileContent).toBe(validAppDelegateObjCWithSentry);
634
+ });
635
+ });
636
+ describe('Sentry is already initialized', function () {
637
+ var tempDir;
638
+ var filePath;
639
+ beforeEach(function () {
640
+ tempDir = prepareTempDir();
641
+ filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjCWithSentry, 'm');
642
+ });
643
+ it('should not add the code snippet', function () {
644
+ // -- Act --
645
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
646
+ // -- Assert --
647
+ expect(result).toBeTruthy();
648
+ var modifiedFileContent = fs.readFileSync(filePath, 'utf8');
649
+ expect(modifiedFileContent).toBe(validAppDelegateObjCWithSentry);
650
+ });
651
+ it('should log info', function () {
652
+ // -- Act --
653
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
654
+ // -- Assert --
655
+ expect(result).toBeTruthy();
656
+ expect(clack.log.info).toHaveBeenCalledWith('Sentry is already initialized in your AppDelegate. Skipping adding the code snippet.');
657
+ });
658
+ });
659
+ it("should set tag 'code-language'", function () {
660
+ // -- Arrange --
661
+ var tempDir = prepareTempDir();
662
+ var filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
663
+ // -- Act --
664
+ var result = (0, code_tools_1.addCodeSnippetToProject)(tempDir, [filePath], dsn);
665
+ // -- Assert --
666
+ expect(result).toBeTruthy();
667
+ expect(Sentry.setTag).toHaveBeenCalledWith('code-language', 'objc');
668
+ });
669
+ });
670
+ });
671
+ });
672
+ });
673
+ //# sourceMappingURL=code-tools.test.js.map