@sentry/wizard 4.0.0 → 4.0.1

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 (307) hide show
  1. package/CHANGELOG.md +6 -2
  2. package/dist/lib/Steps/Integrations/Electron.js +1 -1
  3. package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
  4. package/package.json +5 -2
  5. package/.node-cache/node-v22.14.0-darwin-arm64 +0 -0
  6. package/.node-cache/node-v22.14.0-darwin-x64 +0 -0
  7. package/.node-cache/node-v22.14.0-linux-arm64 +0 -0
  8. package/.node-cache/node-v22.14.0-linux-x64 +0 -0
  9. package/.node-cache/node-v22.14.0-win-x64.exe +0 -0
  10. package/COPYING +0 -3575
  11. package/bin.ts +0 -143
  12. package/codecov.yml +0 -15
  13. package/e2e-tests/.env.example +0 -11
  14. package/e2e-tests/README.md +0 -63
  15. package/e2e-tests/jest.config.ts +0 -22
  16. package/e2e-tests/package.json +0 -14
  17. package/e2e-tests/run.sh +0 -15
  18. package/e2e-tests/test-applications/apple/damaged-missing-configuration-list/Project.xcodeproj/project.pbxproj +0 -52
  19. package/e2e-tests/test-applications/apple/damaged-missing-configuration-list/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +0 -78
  20. package/e2e-tests/test-applications/apple/no-targets/Project.xcodeproj/project.pbxproj +0 -62
  21. package/e2e-tests/test-applications/apple/no-targets/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +0 -78
  22. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project.xcodeproj/project.pbxproj +0 -470
  23. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +0 -78
  24. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project1/ContentView.swift +0 -7
  25. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project1/Project1App.swift +0 -10
  26. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project2/ContentView.swift +0 -7
  27. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project2/Project2App.swift +0 -10
  28. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Project.xcodeproj/project.pbxproj +0 -382
  29. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Project.xcodeproj/xcshareddata/xcschemes/Project.xcscheme +0 -78
  30. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Sources/ContentView.swift +0 -7
  31. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Sources/MainApp.swift +0 -10
  32. package/e2e-tests/test-applications/flutter-test-app/.metadata +0 -45
  33. package/e2e-tests/test-applications/flutter-test-app/README.md +0 -16
  34. package/e2e-tests/test-applications/flutter-test-app/analysis_options.yaml +0 -28
  35. package/e2e-tests/test-applications/flutter-test-app/android/app/build.gradle +0 -44
  36. package/e2e-tests/test-applications/flutter-test-app/android/app/src/debug/AndroidManifest.xml +0 -7
  37. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/AndroidManifest.xml +0 -45
  38. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/kotlin/com/example/flutter_magic/MainActivity.kt +0 -5
  39. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/drawable/launch_background.xml +0 -12
  40. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/drawable-v21/launch_background.xml +0 -12
  41. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  42. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  43. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  44. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  45. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  46. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/values/styles.xml +0 -18
  47. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/values-night/styles.xml +0 -18
  48. package/e2e-tests/test-applications/flutter-test-app/android/app/src/profile/AndroidManifest.xml +0 -7
  49. package/e2e-tests/test-applications/flutter-test-app/android/build.gradle +0 -18
  50. package/e2e-tests/test-applications/flutter-test-app/android/gradle/wrapper/gradle-wrapper.properties +0 -5
  51. package/e2e-tests/test-applications/flutter-test-app/android/gradle.properties +0 -3
  52. package/e2e-tests/test-applications/flutter-test-app/android/settings.gradle +0 -25
  53. package/e2e-tests/test-applications/flutter-test-app/lib/main.dart +0 -125
  54. package/e2e-tests/test-applications/flutter-test-app/linux/CMakeLists.txt +0 -145
  55. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/CMakeLists.txt +0 -88
  56. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugin_registrant.cc +0 -11
  57. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugin_registrant.h +0 -15
  58. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugins.cmake +0 -23
  59. package/e2e-tests/test-applications/flutter-test-app/linux/main.cc +0 -6
  60. package/e2e-tests/test-applications/flutter-test-app/linux/my_application.cc +0 -124
  61. package/e2e-tests/test-applications/flutter-test-app/linux/my_application.h +0 -18
  62. package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/Flutter-Debug.xcconfig +0 -2
  63. package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/Flutter-Release.xcconfig +0 -2
  64. package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/GeneratedPluginRegistrant.swift +0 -10
  65. package/e2e-tests/test-applications/flutter-test-app/macos/Podfile +0 -43
  66. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/AppDelegate.swift +0 -9
  67. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -68
  68. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png +0 -0
  69. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png +0 -0
  70. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png +0 -0
  71. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png +0 -0
  72. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png +0 -0
  73. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png +0 -0
  74. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png +0 -0
  75. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Base.lproj/MainMenu.xib +0 -343
  76. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/AppInfo.xcconfig +0 -14
  77. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Debug.xcconfig +0 -2
  78. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Release.xcconfig +0 -2
  79. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Warnings.xcconfig +0 -13
  80. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/DebugProfile.entitlements +0 -12
  81. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Info.plist +0 -32
  82. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/MainFlutterWindow.swift +0 -15
  83. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Release.entitlements +0 -8
  84. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/project.pbxproj +0 -705
  85. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  86. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +0 -98
  87. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcworkspace/contents.xcworkspacedata +0 -7
  88. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  89. package/e2e-tests/test-applications/flutter-test-app/macos/RunnerTests/RunnerTests.swift +0 -12
  90. package/e2e-tests/test-applications/flutter-test-app/pubspec.lock +0 -213
  91. package/e2e-tests/test-applications/flutter-test-app/pubspec.yaml +0 -89
  92. package/e2e-tests/test-applications/flutter-test-app/test/widget_test.dart +0 -30
  93. package/e2e-tests/test-applications/flutter-test-app/web/favicon.png +0 -0
  94. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-192.png +0 -0
  95. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-512.png +0 -0
  96. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-maskable-192.png +0 -0
  97. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-maskable-512.png +0 -0
  98. package/e2e-tests/test-applications/flutter-test-app/web/index.html +0 -38
  99. package/e2e-tests/test-applications/flutter-test-app/web/manifest.json +0 -35
  100. package/e2e-tests/test-applications/flutter-test-app/windows/CMakeLists.txt +0 -108
  101. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/CMakeLists.txt +0 -109
  102. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugin_registrant.cc +0 -11
  103. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugin_registrant.h +0 -15
  104. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugins.cmake +0 -23
  105. package/e2e-tests/test-applications/flutter-test-app/windows/runner/CMakeLists.txt +0 -40
  106. package/e2e-tests/test-applications/flutter-test-app/windows/runner/Runner.rc +0 -121
  107. package/e2e-tests/test-applications/flutter-test-app/windows/runner/flutter_window.cpp +0 -71
  108. package/e2e-tests/test-applications/flutter-test-app/windows/runner/flutter_window.h +0 -33
  109. package/e2e-tests/test-applications/flutter-test-app/windows/runner/main.cpp +0 -43
  110. package/e2e-tests/test-applications/flutter-test-app/windows/runner/resource.h +0 -16
  111. package/e2e-tests/test-applications/flutter-test-app/windows/runner/resources/app_icon.ico +0 -0
  112. package/e2e-tests/test-applications/flutter-test-app/windows/runner/runner.exe.manifest +0 -14
  113. package/e2e-tests/test-applications/flutter-test-app/windows/runner/utils.cpp +0 -65
  114. package/e2e-tests/test-applications/flutter-test-app/windows/runner/utils.h +0 -19
  115. package/e2e-tests/test-applications/flutter-test-app/windows/runner/win32_window.cpp +0 -288
  116. package/e2e-tests/test-applications/flutter-test-app/windows/runner/win32_window.h +0 -102
  117. package/e2e-tests/test-applications/nextjs-test-app/next.config.mjs +0 -4
  118. package/e2e-tests/test-applications/nextjs-test-app/package.json +0 -22
  119. package/e2e-tests/test-applications/nextjs-test-app/src/app/layout.tsx +0 -20
  120. package/e2e-tests/test-applications/nextjs-test-app/src/app/page.tsx +0 -90
  121. package/e2e-tests/test-applications/nuxt-3-test-app/README.md +0 -75
  122. package/e2e-tests/test-applications/nuxt-3-test-app/nuxt.config.ts +0 -5
  123. package/e2e-tests/test-applications/nuxt-3-test-app/package.json +0 -18
  124. package/e2e-tests/test-applications/nuxt-3-test-app/public/favicon.ico +0 -0
  125. package/e2e-tests/test-applications/nuxt-3-test-app/public/robots.txt +0 -1
  126. package/e2e-tests/test-applications/nuxt-4-test-app/README.md +0 -75
  127. package/e2e-tests/test-applications/nuxt-4-test-app/nuxt.config.ts +0 -6
  128. package/e2e-tests/test-applications/nuxt-4-test-app/package.json +0 -18
  129. package/e2e-tests/test-applications/nuxt-4-test-app/public/favicon.ico +0 -0
  130. package/e2e-tests/test-applications/nuxt-4-test-app/public/robots.txt +0 -1
  131. package/e2e-tests/test-applications/remix-test-app/app/entry.client.tsx +0 -18
  132. package/e2e-tests/test-applications/remix-test-app/app/entry.server.tsx +0 -140
  133. package/e2e-tests/test-applications/remix-test-app/app/root.tsx +0 -30
  134. package/e2e-tests/test-applications/remix-test-app/app/routes/_index.tsx +0 -48
  135. package/e2e-tests/test-applications/remix-test-app/app/tailwind.css +0 -3
  136. package/e2e-tests/test-applications/remix-test-app/package.json +0 -37
  137. package/e2e-tests/test-applications/remix-test-app/postcss.config.js +0 -6
  138. package/e2e-tests/test-applications/remix-test-app/tailwind.config.ts +0 -9
  139. package/e2e-tests/test-applications/remix-test-app/vite.config.ts +0 -16
  140. package/e2e-tests/test-applications/sveltekit-test-app/package.json +0 -21
  141. package/e2e-tests/test-applications/sveltekit-test-app/src/app.d.ts +0 -13
  142. package/e2e-tests/test-applications/sveltekit-test-app/src/app.html +0 -11
  143. package/e2e-tests/test-applications/sveltekit-test-app/src/lib/index.ts +0 -1
  144. package/e2e-tests/test-applications/sveltekit-test-app/src/routes/+page.svelte +0 -2
  145. package/e2e-tests/test-applications/sveltekit-test-app/svelte.config.js +0 -18
  146. package/e2e-tests/test-applications/sveltekit-test-app/vite.config.ts +0 -6
  147. package/e2e-tests/tests/flutter.test.ts +0 -127
  148. package/e2e-tests/tests/nextjs.test.ts +0 -161
  149. package/e2e-tests/tests/nuxt-3.test.ts +0 -189
  150. package/e2e-tests/tests/nuxt-4.test.ts +0 -188
  151. package/e2e-tests/tests/remix.test.ts +0 -277
  152. package/e2e-tests/tests/sveltekit.test.ts +0 -284
  153. package/e2e-tests/utils/index.ts +0 -456
  154. package/index.ts +0 -2
  155. package/lib/Constants.ts +0 -118
  156. package/lib/Helper/BottomBar.ts +0 -28
  157. package/lib/Helper/Env.ts +0 -7
  158. package/lib/Helper/File.ts +0 -65
  159. package/lib/Helper/Git.ts +0 -39
  160. package/lib/Helper/Logging.ts +0 -44
  161. package/lib/Helper/MergeConfig.ts +0 -19
  162. package/lib/Helper/Package.ts +0 -80
  163. package/lib/Helper/SentryCli.ts +0 -139
  164. package/lib/Helper/Wizard.ts +0 -58
  165. package/lib/Helper/__tests__/File.ts +0 -15
  166. package/lib/Helper/__tests__/MergeConfig.ts +0 -98
  167. package/lib/Helper/__tests__/SentryCli.ts +0 -86
  168. package/lib/Helper/test-fixtures/next.config.1-merged.js +0 -18
  169. package/lib/Helper/test-fixtures/next.config.1.js +0 -6
  170. package/lib/Helper/test-fixtures/next.config.2.js +0 -8
  171. package/lib/Helper/test-fixtures/next.config.3-merged.js +0 -21
  172. package/lib/Helper/test-fixtures/next.config.3.js +0 -9
  173. package/lib/Helper/test-fixtures/next.config.4-merged.js +0 -21
  174. package/lib/Helper/test-fixtures/next.config.4.js +0 -9
  175. package/lib/Setup.ts +0 -40
  176. package/lib/Steps/BaseStep.ts +0 -25
  177. package/lib/Steps/ChooseIntegration.ts +0 -144
  178. package/lib/Steps/ConfigureProject.ts +0 -10
  179. package/lib/Steps/Initial.ts +0 -35
  180. package/lib/Steps/Integrations/BaseIntegration.ts +0 -42
  181. package/lib/Steps/Integrations/Cordova.ts +0 -283
  182. package/lib/Steps/Integrations/Electron.ts +0 -164
  183. package/lib/Steps/Integrations/MobileProject.ts +0 -72
  184. package/lib/Steps/OpenSentry.ts +0 -80
  185. package/lib/Steps/PromptForParameters.ts +0 -200
  186. package/lib/Steps/Result.ts +0 -22
  187. package/lib/Steps/SentryProjectSelector.ts +0 -83
  188. package/lib/Steps/ShouldConfigure.ts +0 -10
  189. package/lib/Steps/WaitForSentry.ts +0 -56
  190. package/lib/Steps/Welcome.ts +0 -21
  191. package/lib/Steps/index.ts +0 -10
  192. package/lib/__tests__/Env.ts +0 -29
  193. package/scripts/NextJs/configs/_error.js +0 -39
  194. package/scripts/NextJs/configs/next.config.js +0 -36
  195. package/scripts/NextJs/configs/next.config.template.js +0 -12
  196. package/scripts/NextJs/configs/sentry.client.config.js +0 -17
  197. package/scripts/NextJs/configs/sentry.edge.config.js +0 -17
  198. package/scripts/NextJs/configs/sentry.server.config.js +0 -17
  199. package/scripts/NextJs/sentry_sample_error.js +0 -47
  200. package/scripts/craft-pre-release.sh +0 -10
  201. package/src/android/android-wizard.ts +0 -192
  202. package/src/android/code-tools.ts +0 -170
  203. package/src/android/gradle.ts +0 -250
  204. package/src/android/manifest.ts +0 -180
  205. package/src/android/templates.ts +0 -86
  206. package/src/apple/apple-wizard.ts +0 -269
  207. package/src/apple/cocoapod.ts +0 -73
  208. package/src/apple/code-tools.ts +0 -147
  209. package/src/apple/fastlane.ts +0 -170
  210. package/src/apple/templates.ts +0 -65
  211. package/src/apple/xcode-manager.ts +0 -404
  212. package/src/flutter/code-tools.ts +0 -284
  213. package/src/flutter/flutter-wizard.ts +0 -164
  214. package/src/flutter/templates.ts +0 -90
  215. package/src/nextjs/nextjs-wizard.ts +0 -1007
  216. package/src/nextjs/templates.ts +0 -525
  217. package/src/nextjs/utils.ts +0 -21
  218. package/src/nuxt/nuxt-wizard.ts +0 -188
  219. package/src/nuxt/sdk-example.ts +0 -135
  220. package/src/nuxt/sdk-setup.ts +0 -352
  221. package/src/nuxt/templates.ts +0 -303
  222. package/src/nuxt/types.ts +0 -8
  223. package/src/nuxt/utils.ts +0 -42
  224. package/src/react-native/expo-env-file.ts +0 -55
  225. package/src/react-native/expo-metro.ts +0 -212
  226. package/src/react-native/expo.ts +0 -175
  227. package/src/react-native/git.ts +0 -25
  228. package/src/react-native/glob.ts +0 -13
  229. package/src/react-native/gradle.ts +0 -26
  230. package/src/react-native/javascript.ts +0 -103
  231. package/src/react-native/metro.ts +0 -599
  232. package/src/react-native/options.ts +0 -5
  233. package/src/react-native/react-native-wizard.ts +0 -512
  234. package/src/react-native/uninstall.ts +0 -109
  235. package/src/react-native/xcode.ts +0 -302
  236. package/src/remix/codemods/express-server.ts +0 -44
  237. package/src/remix/codemods/handle-error.ts +0 -118
  238. package/src/remix/codemods/root-common.ts +0 -63
  239. package/src/remix/codemods/root-v1.ts +0 -41
  240. package/src/remix/codemods/root-v2.ts +0 -153
  241. package/src/remix/remix-wizard.ts +0 -261
  242. package/src/remix/sdk-example.ts +0 -120
  243. package/src/remix/sdk-setup.ts +0 -546
  244. package/src/remix/templates.ts +0 -11
  245. package/src/remix/utils.ts +0 -96
  246. package/src/run.ts +0 -211
  247. package/src/sourcemaps/sourcemaps-wizard.ts +0 -364
  248. package/src/sourcemaps/tools/angular.ts +0 -42
  249. package/src/sourcemaps/tools/create-react-app.ts +0 -19
  250. package/src/sourcemaps/tools/esbuild.ts +0 -65
  251. package/src/sourcemaps/tools/nextjs.ts +0 -114
  252. package/src/sourcemaps/tools/remix.ts +0 -90
  253. package/src/sourcemaps/tools/rollup.ts +0 -67
  254. package/src/sourcemaps/tools/sentry-cli.ts +0 -287
  255. package/src/sourcemaps/tools/tsc.ts +0 -144
  256. package/src/sourcemaps/tools/types.ts +0 -11
  257. package/src/sourcemaps/tools/vite.ts +0 -300
  258. package/src/sourcemaps/tools/webpack.ts +0 -383
  259. package/src/sourcemaps/utils/detect-tool.ts +0 -46
  260. package/src/sourcemaps/utils/other-wizards.ts +0 -167
  261. package/src/sourcemaps/utils/sdk-version.ts +0 -266
  262. package/src/sveltekit/sdk-example.ts +0 -56
  263. package/src/sveltekit/sdk-setup.ts +0 -667
  264. package/src/sveltekit/sveltekit-wizard.ts +0 -192
  265. package/src/sveltekit/templates.ts +0 -185
  266. package/src/sveltekit/utils.ts +0 -50
  267. package/src/telemetry.ts +0 -144
  268. package/src/utils/ast-utils.ts +0 -270
  269. package/src/utils/bash.ts +0 -57
  270. package/src/utils/clack-utils.ts +0 -1536
  271. package/src/utils/debug.ts +0 -20
  272. package/src/utils/package-json.ts +0 -51
  273. package/src/utils/package-manager.ts +0 -172
  274. package/src/utils/release-registry.ts +0 -19
  275. package/src/utils/semver.ts +0 -33
  276. package/src/utils/sentrycli-utils.ts +0 -24
  277. package/src/utils/string.ts +0 -7
  278. package/src/utils/types.ts +0 -77
  279. package/src/utils/url.ts +0 -27
  280. package/src/utils/vendor/is-unicorn-supported.ts +0 -29
  281. package/test/android/code-tools.test.ts +0 -49
  282. package/test/apple/cocoapod.test.ts +0 -310
  283. package/test/apple/code-tools.test.ts +0 -1042
  284. package/test/apple/fastfile.test.ts +0 -555
  285. package/test/apple/templates.test.ts +0 -191
  286. package/test/apple/xcode-manager.test.ts +0 -1068
  287. package/test/flutter/code-tools.test.ts +0 -212
  288. package/test/flutter/templates.test.ts +0 -100
  289. package/test/nextjs/templates.test.ts +0 -429
  290. package/test/nuxt/templates.test.ts +0 -255
  291. package/test/react-native/expo-metro.test.ts +0 -81
  292. package/test/react-native/expo.test.ts +0 -86
  293. package/test/react-native/gradle.test.ts +0 -310
  294. package/test/react-native/javascript.test.ts +0 -134
  295. package/test/react-native/metro.test.ts +0 -396
  296. package/test/react-native/xcode.test.ts +0 -401
  297. package/test/remix/client-entry.test.ts +0 -122
  298. package/test/remix/server-instrumentation.test.ts +0 -36
  299. package/test/sourcemaps/tools/sentry-cli.test.ts +0 -57
  300. package/test/sourcemaps/tools/tsc.test.ts +0 -181
  301. package/test/sourcemaps/tools/vite.test.ts +0 -149
  302. package/test/sourcemaps/tools/webpack.test.ts +0 -303
  303. package/test/sveltekit/templates.test.ts +0 -152
  304. package/test/utils/ast-utils.test.ts +0 -264
  305. package/test/utils/clack-utils.test.ts +0 -224
  306. package/types/read-env.d.ts +0 -3
  307. package/types/xcode.d.ts +0 -527
@@ -1,1042 +0,0 @@
1
- import * as Sentry from '@sentry/node';
2
- import * as fs from 'fs';
3
- import * as os from 'os';
4
- import * as path from 'path';
5
- import {
6
- addCodeSnippetToProject,
7
- exportForTesting,
8
- } from '../../src/apple/code-tools';
9
- // @ts-ignore - clack is ESM and TS complains about that. It works though
10
- import * as clack from '@clack/prompts';
11
-
12
- // Test Constants
13
- const invalidAppDelegateSwift = `func application() {}`;
14
- const validAppDelegateSwift = `
15
- import UIKit
16
-
17
- @main
18
- class AppDelegate: UIResponder, UIApplicationDelegate {
19
-
20
- func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
21
- // Override point for customization after application launch.
22
- return true
23
- }
24
- }`;
25
- const validAppDelegateSwiftWithSentry = `
26
- import UIKit
27
- import Sentry
28
-
29
-
30
- @main
31
- class AppDelegate: UIResponder, UIApplicationDelegate {
32
-
33
- func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
34
- SentrySDK.start { options in
35
- options.dsn = "https://example.com/sentry-dsn"
36
- options.debug = true // Enabled debug when first installing is always helpful
37
- // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
38
- // We recommend adjusting this value in production.
39
- options.tracesSampleRate = 1.0
40
-
41
- // Sample rate for profiling, applied on top of TracesSampleRate.
42
- // We recommend adjusting this value in production.
43
- options.profilesSampleRate = 1.0
44
-
45
- // Uncomment the following lines to add more data to your events
46
- // options.attachScreenshot = true // This adds a screenshot to the error events
47
- // options.attachViewHierarchy = true // This adds the view hierarchy to the error events
48
- }
49
- // Remove the next line after confirming that your Sentry integration is working.
50
- SentrySDK.capture(message: "This app uses Sentry! :)")
51
-
52
- // Override point for customization after application launch.
53
- return true
54
- }
55
- }`;
56
- const invalidAppDelegateObjC = `
57
- - (BOOL)application:(UIApplication *) {
58
- return NO;
59
- }`;
60
- const validAppDelegateObjC = `
61
- #import "AppDelegate.h"
62
-
63
- @interface AppDelegate ()
64
-
65
- @end
66
-
67
- @implementation AppDelegate
68
-
69
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
70
- // Override point for customization after application launch.
71
- return YES;
72
- }
73
-
74
- @end`;
75
- const validAppDelegateObjCWithSentry = `@import Sentry;
76
-
77
- #import "AppDelegate.h"
78
-
79
- @interface AppDelegate ()
80
-
81
- @end
82
-
83
- @implementation AppDelegate
84
-
85
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
86
- [SentrySDK startWithConfigureOptions:^(SentryOptions * options) {
87
- options.dsn = @"https://example.com/sentry-dsn";
88
- options.debug = YES; // Enabled debug when first installing is always helpful
89
- // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
90
- // We recommend adjusting this value in production.
91
- options.tracesSampleRate = @1.0;
92
-
93
- // Sample rate for profiling, applied on top of TracesSampleRate.
94
- // We recommend adjusting this value in production.
95
- options.profilesSampleRate = @1.0;
96
-
97
- //Uncomment the following lines to add more data to your events
98
- //options.attachScreenshot = YES; //This will add a screenshot to the error events
99
- //options.attachViewHierarchy = YES; //This will add the view hierarchy to the error events
100
- }];
101
- //Remove the next line after confirming that your Sentry integration is working.
102
- [SentrySDK captureMessage:@"This app uses Sentry!"];
103
-
104
- // Override point for customization after application launch.
105
- return YES;
106
- }
107
-
108
- @end`;
109
- const invalidAppDelegateSwiftUI = `
110
- struct MyApp: App {
111
- var body: some Scene {
112
- WindowGroup { Text("Hello, world!") }
113
- }
114
- }`;
115
- const validAppDelegateSwiftUI = `
116
- import SwiftUI
117
-
118
- @main
119
- struct TestApp: App {
120
- var body: some Scene {
121
- WindowGroup {
122
- ContentView()
123
- }
124
- }
125
- }`;
126
- const validAppDelegateSwiftUIWithSentry = `
127
- import SwiftUI
128
- import Sentry
129
-
130
-
131
- @main
132
- struct TestApp: App {
133
- init() {
134
- SentrySDK.start { options in
135
- options.dsn = "https://example.com/sentry-dsn"
136
- options.debug = true // Enabled debug when first installing is always helpful
137
- // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
138
- // We recommend adjusting this value in production.
139
- options.tracesSampleRate = 1.0
140
-
141
- // Sample rate for profiling, applied on top of TracesSampleRate.
142
- // We recommend adjusting this value in production.
143
- options.profilesSampleRate = 1.0
144
-
145
- // Uncomment the following lines to add more data to your events
146
- // options.attachScreenshot = true // This adds a screenshot to the error events
147
- // options.attachViewHierarchy = true // This adds the view hierarchy to the error events
148
- }
149
- // Remove the next line after confirming that your Sentry integration is working.
150
- SentrySDK.capture(message: "This app uses Sentry! :)")
151
- }
152
- var body: some Scene {
153
- WindowGroup {
154
- ContentView()
155
- }
156
- }
157
- }`;
158
-
159
- const prepareTempDir = (): string => {
160
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));
161
- return tempDir;
162
- };
163
-
164
- const prepareAppDelegateFile = (
165
- dir: string,
166
- content: string,
167
- ext: 'm' | 'mm' | 'swift',
168
- ): string => {
169
- const filePath = path.join(dir, `AppDelegate.${ext}`);
170
- fs.writeFileSync(filePath, content, 'utf8');
171
- return filePath;
172
- };
173
-
174
- const dsn = 'https://example.com/sentry-dsn';
175
-
176
- // Mock Setup
177
-
178
- jest.mock('../../src/utils/bash');
179
- jest.spyOn(Sentry, 'setTag').mockImplementation();
180
- jest.spyOn(Sentry, 'captureException').mockImplementation();
181
-
182
- // Test Suite
183
-
184
- describe('code-tools', () => {
185
- beforeEach(() => {
186
- jest.spyOn(clack.log, 'info').mockImplementation();
187
- });
188
-
189
- afterEach(() => {
190
- jest.clearAllMocks();
191
- });
192
-
193
- describe('#isAppDelegateFile', () => {
194
- const prepareTestFile = (
195
- content: string,
196
- ext: 'm' | 'mm' | 'swift',
197
- ): string => {
198
- const tempDir = prepareTempDir();
199
- return prepareAppDelegateFile(tempDir, content, ext);
200
- };
201
-
202
- describe('swift files', () => {
203
- describe('swift app launch regex', () => {
204
- describe('valid cases', () => {
205
- const variations: {
206
- name: string;
207
- code: string;
208
- }[] = [
209
- {
210
- name: 'with underscores',
211
- code: 'func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {',
212
- },
213
- {
214
- name: 'with different dictionary type',
215
- code: 'func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {',
216
- },
217
- {
218
- name: 'with extra whitespace',
219
- code: ' func application ( _ application: UIApplication , didFinishLaunchingWithOptions launchOptions: [ NSObject : AnyObject ]? ) -> Bool { ',
220
- },
221
- {
222
- name: 'macOS notification variant',
223
- code: 'func applicationDidFinishLaunching(_ aNotification: Notification) {',
224
- },
225
- {
226
- name: 'macOS with extra whitespace',
227
- code: 'func applicationDidFinishLaunching ( _ aNotification: Notification ) {',
228
- },
229
- ];
230
-
231
- for (const variation of variations) {
232
- describe(`${variation.name}`, () => {
233
- it(`should return true`, () => {
234
- // -- Arrange --
235
- const filePath = prepareTestFile(variation.code, 'swift');
236
-
237
- // -- Act --
238
- const result = exportForTesting.isAppDelegateFile(filePath);
239
-
240
- // -- Assert --
241
- expect(result).toBeTruthy();
242
- });
243
- });
244
- }
245
-
246
- describe('invalid cases', () => {
247
- const variations: {
248
- name: string;
249
- code: string;
250
- }[] = [
251
- {
252
- name: 'missing application method',
253
- code: 'import UIKit',
254
- },
255
- {
256
- name: 'typo in method name',
257
- code: 'func applicatioM(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {',
258
- },
259
- {
260
- name: 'garbage input',
261
- code: 'asdf;jk23;uas()d{',
262
- },
263
- ];
264
-
265
- for (const variation of variations) {
266
- describe(`${variation.name}`, () => {
267
- it('should return false', () => {
268
- // -- Arrange --
269
- const filePath = prepareTestFile(variation.code, 'swift');
270
-
271
- // -- Act --
272
- const result = exportForTesting.isAppDelegateFile(filePath);
273
-
274
- // -- Assert --
275
- expect(result).toBeFalsy();
276
- });
277
- });
278
- }
279
- });
280
- });
281
- });
282
- });
283
-
284
- describe('objc files', () => {
285
- describe('valid cases', () => {
286
- const variations: {
287
- name: string;
288
- code: string;
289
- }[] = [
290
- {
291
- name: 'basic',
292
- code: '- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {',
293
- },
294
- {
295
- name: 'with more whitespace',
296
- code: '- ( BOOL ) application: ( UIApplication * ) application didFinishLaunchingWithOptions: ( NSDictionary * ) launchOptions {',
297
- },
298
- ];
299
-
300
- for (const variation of variations) {
301
- describe(`${variation.name}`, () => {
302
- it('should return true', () => {
303
- // -- Arrange --
304
- const filePath = prepareTestFile(variation.code, 'm');
305
-
306
- // -- Act --
307
- const result = exportForTesting.isAppDelegateFile(filePath);
308
-
309
- // -- Assert --
310
- expect(result).toBeTruthy();
311
- });
312
- });
313
- }
314
- });
315
-
316
- describe('invalid cases', () => {
317
- const variations: {
318
- name: string;
319
- code: string;
320
- }[] = [
321
- {
322
- name: 'missing application method',
323
- code: 'import UIKit',
324
- },
325
- ];
326
-
327
- for (const variation of variations) {
328
- describe(`${variation.name}`, () => {
329
- it('should return false', () => {
330
- // -- Arrange --
331
- const filePath = prepareTestFile(variation.code, 'm');
332
-
333
- // -- Act --
334
- const result = exportForTesting.isAppDelegateFile(filePath);
335
-
336
- // -- Assert --
337
- expect(result).toBeFalsy();
338
- });
339
- });
340
- }
341
- });
342
- });
343
-
344
- describe('swiftui files', () => {
345
- describe('valid cases', () => {
346
- const variations: {
347
- name: string;
348
- code: string;
349
- }[] = [
350
- {
351
- name: 'basic',
352
- code: '@main struct MyApp: App {',
353
- },
354
- {
355
- name: 'with more whitespace',
356
- code: '@main struct MyApp: App {',
357
- },
358
- {
359
- name: 'with SwiftUI namespace',
360
- code: '@main struct App: SwiftUI.App {',
361
- },
362
- ];
363
-
364
- for (const variation of variations) {
365
- describe(`${variation.name}`, () => {
366
- it('should return true', () => {
367
- // -- Arrange --
368
- const filePath = prepareTestFile(variation.code, 'swift');
369
-
370
- // -- Act --
371
- const result = exportForTesting.isAppDelegateFile(filePath);
372
-
373
- // -- Assert --
374
- expect(result).toBeTruthy();
375
- });
376
- });
377
- }
378
- });
379
-
380
- describe('invalid cases', () => {
381
- const variations: {
382
- name: string;
383
- code: string;
384
- }[] = [
385
- {
386
- name: 'missing @main',
387
- code: 'struct App: App {',
388
- },
389
- {
390
- name: 'missing super-type App',
391
- code: 'struct MyApp {',
392
- },
393
- {
394
- name: 'imported not from SwiftUI',
395
- code: '@main struct App: MySwiftyUI.App {',
396
- },
397
- {
398
- name: 'imported not from SwiftUI but similar',
399
- code: '@main struct App: MySwiftUI.App {',
400
- },
401
- ];
402
-
403
- for (const variation of variations) {
404
- describe(`${variation.name}`, () => {
405
- it('should return false', () => {
406
- // -- Arrange --
407
- const filePath = prepareTestFile(variation.code, 'swift');
408
-
409
- // -- Act --
410
- const result = exportForTesting.isAppDelegateFile(filePath);
411
-
412
- // -- Assert --
413
- expect(result).toBeFalsy();
414
- });
415
- });
416
- }
417
- });
418
- });
419
-
420
- describe('file not found', () => {
421
- it('should throw an error', () => {
422
- // -- Arrange --
423
- const invalidPath = path.join(os.tmpdir(), 'invalid-path');
424
-
425
- // -- Act & Assert --
426
- expect(() => exportForTesting.isAppDelegateFile(invalidPath)).toThrow();
427
- });
428
- });
429
- });
430
-
431
- describe('#findAppDidFinishLaunchingWithOptions', () => {
432
- describe('no files given', () => {
433
- it('should check files in directory', () => {
434
- // -- Arrange --
435
- const tempDir = prepareTempDir();
436
- const filePath = prepareAppDelegateFile(
437
- tempDir,
438
- validAppDelegateSwift,
439
- 'swift',
440
- );
441
-
442
- // -- Act --
443
- const result =
444
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
445
-
446
- // -- Assert --
447
- expect(result).toBe(filePath);
448
- });
449
- });
450
-
451
- describe('SwiftUI file found', () => {
452
- describe('is app delegate', () => {
453
- it('should return the file path', () => {
454
- // -- Arrange --
455
- const tempDir = prepareTempDir();
456
- const filePath = prepareAppDelegateFile(
457
- tempDir,
458
- validAppDelegateSwiftUI,
459
- 'swift',
460
- );
461
-
462
- // -- Act --
463
- const result =
464
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
465
-
466
- // -- Assert --
467
- expect(result).toBe(filePath);
468
- });
469
- });
470
-
471
- describe('is not app delegate', () => {
472
- it('should be ignored', () => {
473
- // -- Arrange --
474
- const tempDir = prepareTempDir();
475
- prepareAppDelegateFile(tempDir, invalidAppDelegateSwiftUI, 'swift');
476
-
477
- // -- Act --
478
- const result =
479
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
480
-
481
- // -- Assert --
482
- expect(result).toBeNull();
483
- });
484
- });
485
- });
486
-
487
- describe('Swift file found', () => {
488
- describe('is app delegate', () => {
489
- it('should return the file path', () => {
490
- // -- Arrange --
491
- const tempDir = prepareTempDir();
492
- const filePath = prepareAppDelegateFile(
493
- tempDir,
494
- validAppDelegateSwift,
495
- 'swift',
496
- );
497
-
498
- // -- Act --
499
- const result =
500
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
501
-
502
- // -- Assert --
503
- expect(result).toBe(filePath);
504
- });
505
- });
506
-
507
- describe('is not app delegate', () => {
508
- it('should be ignored', () => {
509
- // -- Arrange --
510
- const tempDir = prepareTempDir();
511
- prepareAppDelegateFile(tempDir, invalidAppDelegateSwift, 'swift');
512
-
513
- // -- Act --
514
- const result =
515
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
516
-
517
- // -- Assert --
518
- expect(result).toBeNull();
519
- });
520
- });
521
- });
522
-
523
- describe('Objective-C file found', () => {
524
- describe('is app delegate', () => {
525
- it('should return the file path', () => {
526
- // -- Arrange --
527
- const tempDir = prepareTempDir();
528
- const filePath = prepareAppDelegateFile(
529
- tempDir,
530
- validAppDelegateObjC,
531
- 'm',
532
- );
533
-
534
- // -- Act --
535
- const result =
536
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
537
-
538
- // -- Assert --
539
- expect(result).toBe(filePath);
540
- });
541
- });
542
-
543
- describe('is not app delegate', () => {
544
- it('should be ignored', () => {
545
- // -- Arrange --
546
- const tempDir = prepareTempDir();
547
- prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'm');
548
-
549
- // -- Act --
550
- const result =
551
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
552
-
553
- // -- Assert --
554
- expect(result).toBeNull();
555
- });
556
- });
557
- });
558
-
559
- describe('Objective-C++ file found', () => {
560
- describe('is app delegate', () => {
561
- it('should return the file path', () => {
562
- // -- Arrange --
563
- const tempDir = prepareTempDir();
564
- const filePath = prepareAppDelegateFile(
565
- tempDir,
566
- validAppDelegateObjC,
567
- 'mm',
568
- );
569
-
570
- // -- Act --
571
- const result = exportForTesting.findAppDidFinishLaunchingWithOptions(
572
- tempDir,
573
- [filePath],
574
- );
575
-
576
- // -- Assert --
577
- expect(result).toBe(filePath);
578
- });
579
- });
580
-
581
- describe('is not app delegate', () => {
582
- it('should be ignored', () => {
583
- // -- Arrange --
584
- const tempDir = prepareTempDir();
585
- prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'mm');
586
-
587
- // -- Act --
588
- const result =
589
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
590
-
591
- // -- Assert --
592
- expect(result).toBeNull();
593
- });
594
- });
595
- });
596
-
597
- describe('file in list not found', () => {
598
- it('should return null', () => {
599
- // -- Arrange --
600
- const tempDir = prepareTempDir();
601
- const filePath = prepareAppDelegateFile(
602
- tempDir,
603
- invalidAppDelegateSwift,
604
- 'swift',
605
- );
606
-
607
- // -- Act --
608
- const result = exportForTesting.findAppDidFinishLaunchingWithOptions(
609
- tempDir,
610
- [filePath],
611
- );
612
-
613
- // -- Assert --
614
- expect(result).toBeNull();
615
- });
616
- });
617
-
618
- describe('unrelated file found', () => {
619
- it('should be ignored', () => {
620
- // -- Arrange --
621
- const tempDir = prepareTempDir();
622
- const filePath = prepareAppDelegateFile(
623
- tempDir,
624
- invalidAppDelegateSwift,
625
- 'swift',
626
- );
627
-
628
- // -- Act --
629
- const result = exportForTesting.findAppDidFinishLaunchingWithOptions(
630
- tempDir,
631
- [filePath],
632
- );
633
-
634
- // -- Assert --
635
- expect(result).toBeNull();
636
- });
637
- });
638
-
639
- describe('directory in list', () => {
640
- describe('name starts with dot', () => {
641
- it('should be ignored', () => {
642
- // -- Arrange --
643
- const tempDir = prepareTempDir();
644
-
645
- const hiddenDir = path.join(tempDir, '.hidden');
646
- fs.mkdirSync(hiddenDir);
647
-
648
- prepareAppDelegateFile(hiddenDir, validAppDelegateSwift, 'swift');
649
-
650
- // -- Act --
651
- const result =
652
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
653
-
654
- // -- Assert --
655
- expect(result).toBeNull();
656
- });
657
- });
658
-
659
- describe('name ends with .xcodeproj', () => {
660
- it('should be ignored', () => {
661
- // -- Arrange --
662
- const tempDir = prepareTempDir();
663
- const xcodeDir = path.join(tempDir, 'MyProject.xcodeproj');
664
- fs.mkdirSync(xcodeDir);
665
-
666
- prepareAppDelegateFile(xcodeDir, validAppDelegateSwift, 'swift');
667
-
668
- // -- Act --
669
- const result =
670
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
671
-
672
- // -- Assert --
673
- expect(result).toBeNull();
674
- });
675
- });
676
-
677
- describe('name ends with .xcassets', () => {
678
- it('should be ignored', () => {
679
- // -- Arrange --
680
- const tempDir = prepareTempDir();
681
- const xcassetsDir = path.join(tempDir, 'MyProject.xcassets');
682
- fs.mkdirSync(xcassetsDir);
683
-
684
- prepareAppDelegateFile(xcassetsDir, validAppDelegateSwift, 'swift');
685
-
686
- // -- Act --
687
- const result =
688
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
689
-
690
- // -- Assert --
691
- expect(result).toBeNull();
692
- });
693
- });
694
-
695
- describe('is not a directory', () => {
696
- it('should be ignored', () => {
697
- // -- Arrange --
698
- const tempDir = prepareTempDir();
699
- const filePath = path.join(tempDir, 'some-file');
700
- fs.writeFileSync(filePath, validAppDelegateSwift, 'utf8');
701
-
702
- // -- Act --
703
- const result =
704
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
705
-
706
- // -- Assert --
707
- expect(result).toBeNull();
708
- });
709
- });
710
- });
711
-
712
- describe('multiple files could be app delegate', () => {
713
- it('should return the first one', () => {
714
- // -- Arrange --
715
- const tempDir = prepareTempDir();
716
- const filePath = prepareAppDelegateFile(
717
- tempDir,
718
- validAppDelegateSwift,
719
- 'swift',
720
- );
721
- prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
722
-
723
- // -- Act --
724
- const result =
725
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
726
-
727
- // -- Assert --
728
- expect(result).toBe(filePath);
729
- });
730
- });
731
-
732
- describe('multiple nested directories with app delegate', () => {
733
- it('should return the first one', () => {
734
- // -- Arrange --
735
- const tempDir = prepareTempDir();
736
-
737
- const nestedDir = path.join(tempDir, 'nested');
738
- fs.mkdirSync(nestedDir);
739
- const nestedFilePath = prepareAppDelegateFile(
740
- nestedDir,
741
- validAppDelegateSwift,
742
- 'swift',
743
- );
744
-
745
- const nestedDir2 = path.join(tempDir, 'nested2');
746
- fs.mkdirSync(nestedDir2);
747
- prepareAppDelegateFile(nestedDir2, validAppDelegateSwift, 'swift');
748
-
749
- // -- Act --
750
- const result =
751
- exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);
752
-
753
- // -- Assert --
754
- expect(result).toBe(nestedFilePath);
755
- });
756
- });
757
-
758
- describe('no app delegate found', () => {
759
- it('should return null', () => {
760
- // -- Arrange --
761
- const tempDir = fs.mkdtempSync(
762
- path.join(os.tmpdir(), 'code-tools-test'),
763
- );
764
-
765
- // -- Act --
766
- const result = exportForTesting.findAppDidFinishLaunchingWithOptions(
767
- tempDir,
768
- [],
769
- );
770
-
771
- // -- Assert --
772
- expect(result).toBeNull();
773
- });
774
- });
775
- });
776
-
777
- describe('#addCodeSnippetToProject', () => {
778
- describe('app delegate file is not found', () => {
779
- it('should return false', () => {
780
- // -- Arrange --
781
- const tempDir = prepareTempDir();
782
-
783
- // -- Act --
784
- const result = addCodeSnippetToProject(
785
- tempDir,
786
- ['AppDelegate.swift'],
787
- 'https://example.com/sentry-dsn',
788
- );
789
-
790
- // -- Assert --
791
- expect(result).toBeFalsy();
792
- });
793
- });
794
-
795
- describe('app delegate file is found', () => {
796
- let tempDir: string;
797
- let appDelegatePath: string;
798
-
799
- beforeEach(() => {
800
- // -- Arrange --
801
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));
802
- appDelegatePath = path.join(tempDir, 'AppDelegate.swift');
803
- fs.writeFileSync(appDelegatePath, validAppDelegateSwift, 'utf8');
804
- });
805
-
806
- describe('is Swift file', () => {
807
- describe('Sentry is not initialized', () => {
808
- let tempDir: string;
809
- let filePath: string;
810
-
811
- beforeEach(() => {
812
- tempDir = prepareTempDir();
813
- filePath = prepareAppDelegateFile(
814
- tempDir,
815
- validAppDelegateSwift,
816
- 'swift',
817
- );
818
- });
819
-
820
- it('should add the code snippet', () => {
821
- // -- Act --
822
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
823
-
824
- // -- Assert --
825
- expect(result).toBeTruthy();
826
- const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
827
- expect(modifiedFileContent).toBe(validAppDelegateSwiftWithSentry);
828
- });
829
-
830
- it("should set tag 'code-language'", () => {
831
- // -- Act --
832
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
833
-
834
- // -- Assert --
835
- expect(result).toBeTruthy();
836
- expect(Sentry.setTag).toHaveBeenCalledWith(
837
- 'code-language',
838
- 'swift',
839
- );
840
- });
841
-
842
- it("should set tag 'ui-engine'", () => {
843
- // -- Act --
844
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
845
-
846
- // -- Assert --
847
- expect(result).toBeTruthy();
848
- expect(Sentry.setTag).toHaveBeenCalledWith('ui-engine', 'uikit');
849
- });
850
- });
851
-
852
- describe('Sentry is already initialized', () => {
853
- it('should not add the code snippet', () => {
854
- // -- Arrange --
855
- const tempDir = prepareTempDir();
856
- const filePath = prepareAppDelegateFile(
857
- tempDir,
858
- validAppDelegateSwiftWithSentry,
859
- 'swift',
860
- );
861
-
862
- // -- Act --
863
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
864
-
865
- // -- Assert --
866
- expect(result).toBeTruthy();
867
- const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
868
- expect(modifiedFileContent).toBe(validAppDelegateSwiftWithSentry);
869
- });
870
- });
871
-
872
- describe('is SwiftUI file', () => {
873
- describe('Sentry is not initialized', () => {
874
- let tempDir: string;
875
- let filePath: string;
876
-
877
- beforeEach(() => {
878
- tempDir = prepareTempDir();
879
- filePath = prepareAppDelegateFile(
880
- tempDir,
881
- validAppDelegateSwiftUI,
882
- 'swift',
883
- );
884
- });
885
-
886
- it('should add the code snippet', () => {
887
- // -- Act --
888
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
889
-
890
- // -- Assert --
891
- expect(result).toBeTruthy();
892
- const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
893
- expect(modifiedFileContent).toBe(
894
- validAppDelegateSwiftUIWithSentry,
895
- );
896
- });
897
-
898
- it("should set tag 'code-language'", () => {
899
- // -- Act --
900
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
901
-
902
- // -- Assert --
903
- expect(result).toBeTruthy();
904
- expect(Sentry.setTag).toHaveBeenNthCalledWith(
905
- 1,
906
- 'code-language',
907
- 'swift',
908
- );
909
- });
910
-
911
- it("should set tag 'ui-engine'", () => {
912
- // -- Act --
913
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
914
-
915
- // -- Assert --
916
- expect(result).toBeTruthy();
917
- expect(Sentry.setTag).toHaveBeenNthCalledWith(
918
- 2,
919
- 'ui-engine',
920
- 'swiftui',
921
- );
922
- });
923
- });
924
-
925
- describe('Sentry is already initialized', () => {
926
- it('should not add the code snippet', () => {
927
- // -- Arrange --
928
- const tempDir = prepareTempDir();
929
- const filePath = prepareAppDelegateFile(
930
- tempDir,
931
- validAppDelegateSwiftUIWithSentry,
932
- 'swift',
933
- );
934
-
935
- // -- Act --
936
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
937
-
938
- // -- Assert --
939
- expect(result).toBeTruthy();
940
- const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
941
- expect(modifiedFileContent).toBe(
942
- validAppDelegateSwiftUIWithSentry,
943
- );
944
- });
945
- });
946
- });
947
-
948
- describe('is not matching SwiftUI regex', () => {
949
- it('should not add the code snippet', () => {
950
- // -- Arrange --
951
- const tempDir = prepareTempDir();
952
- const filePath = prepareAppDelegateFile(
953
- tempDir,
954
- invalidAppDelegateSwiftUI,
955
- 'swift',
956
- );
957
-
958
- // -- Act --
959
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
960
-
961
- // -- Assert --
962
- expect(result).toBeFalsy();
963
- });
964
- });
965
- });
966
-
967
- describe('is Objective-C file', () => {
968
- describe('Sentry is not initialized', () => {
969
- it('should add the code snippet', () => {
970
- // -- Act --
971
- const tempDir = prepareTempDir();
972
- const filePath = prepareAppDelegateFile(
973
- tempDir,
974
- validAppDelegateObjC,
975
- 'm',
976
- );
977
-
978
- // -- Act --
979
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
980
-
981
- // -- Assert --
982
- expect(result).toBeTruthy();
983
- const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
984
- expect(modifiedFileContent).toBe(validAppDelegateObjCWithSentry);
985
- });
986
- });
987
-
988
- describe('Sentry is already initialized', () => {
989
- let tempDir: string;
990
- let filePath: string;
991
-
992
- beforeEach(() => {
993
- tempDir = prepareTempDir();
994
- filePath = prepareAppDelegateFile(
995
- tempDir,
996
- validAppDelegateObjCWithSentry,
997
- 'm',
998
- );
999
- });
1000
-
1001
- it('should not add the code snippet', () => {
1002
- // -- Act --
1003
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
1004
-
1005
- // -- Assert --
1006
- expect(result).toBeTruthy();
1007
- const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
1008
- expect(modifiedFileContent).toBe(validAppDelegateObjCWithSentry);
1009
- });
1010
-
1011
- it('should log info', () => {
1012
- // -- Act --
1013
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
1014
-
1015
- // -- Assert --
1016
- expect(result).toBeTruthy();
1017
- expect(clack.log.info).toHaveBeenCalledWith(
1018
- 'Sentry is already initialized in your AppDelegate. Skipping adding the code snippet.',
1019
- );
1020
- });
1021
- });
1022
-
1023
- it("should set tag 'code-language'", () => {
1024
- // -- Arrange --
1025
- const tempDir = prepareTempDir();
1026
- const filePath = prepareAppDelegateFile(
1027
- tempDir,
1028
- validAppDelegateObjC,
1029
- 'm',
1030
- );
1031
-
1032
- // -- Act --
1033
- const result = addCodeSnippetToProject(tempDir, [filePath], dsn);
1034
-
1035
- // -- Assert --
1036
- expect(result).toBeTruthy();
1037
- expect(Sentry.setTag).toHaveBeenCalledWith('code-language', 'objc');
1038
- });
1039
- });
1040
- });
1041
- });
1042
- });