@sentry/wizard 4.0.0 → 4.0.2

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 (330) hide show
  1. package/CHANGELOG.md +11 -2
  2. package/dist/NextJs/configs/next.config.js +1 -1
  3. package/dist/bin.js +2 -1
  4. package/dist/bin.js.map +1 -1
  5. package/dist/bump-version.js +28 -0
  6. package/dist/craft-pre-release.sh +2 -0
  7. package/dist/lib/Steps/Initial.js +2 -12
  8. package/dist/lib/Steps/Initial.js.map +1 -1
  9. package/dist/lib/Steps/Integrations/Electron.js +1 -1
  10. package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
  11. package/dist/src/nextjs/templates.js +1 -1
  12. package/dist/src/nextjs/templates.js.map +1 -1
  13. package/dist/src/run.js +2 -18
  14. package/dist/src/run.js.map +1 -1
  15. package/dist/src/telemetry.js +2 -16
  16. package/dist/src/telemetry.js.map +1 -1
  17. package/dist/src/utils/clack-utils.d.ts +16 -0
  18. package/dist/src/utils/clack-utils.js +53 -45
  19. package/dist/src/utils/clack-utils.js.map +1 -1
  20. package/dist/src/version.d.ts +1 -0
  21. package/dist/src/version.js +7 -0
  22. package/dist/src/version.js.map +1 -0
  23. package/dist/test/nextjs/templates.test.js +4 -4
  24. package/dist/test/nextjs/templates.test.js.map +1 -1
  25. package/dist/test/utils/clack-utils.test.js +52 -0
  26. package/dist/test/utils/clack-utils.test.js.map +1 -1
  27. package/package.json +5 -2
  28. package/.node-cache/node-v22.14.0-darwin-arm64 +0 -0
  29. package/.node-cache/node-v22.14.0-darwin-x64 +0 -0
  30. package/.node-cache/node-v22.14.0-linux-arm64 +0 -0
  31. package/.node-cache/node-v22.14.0-linux-x64 +0 -0
  32. package/.node-cache/node-v22.14.0-win-x64.exe +0 -0
  33. package/COPYING +0 -3575
  34. package/bin.ts +0 -143
  35. package/codecov.yml +0 -15
  36. package/e2e-tests/.env.example +0 -11
  37. package/e2e-tests/README.md +0 -63
  38. package/e2e-tests/jest.config.ts +0 -22
  39. package/e2e-tests/package.json +0 -14
  40. package/e2e-tests/run.sh +0 -15
  41. package/e2e-tests/test-applications/apple/damaged-missing-configuration-list/Project.xcodeproj/project.pbxproj +0 -52
  42. package/e2e-tests/test-applications/apple/damaged-missing-configuration-list/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +0 -78
  43. package/e2e-tests/test-applications/apple/no-targets/Project.xcodeproj/project.pbxproj +0 -62
  44. package/e2e-tests/test-applications/apple/no-targets/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +0 -78
  45. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project.xcodeproj/project.pbxproj +0 -470
  46. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +0 -78
  47. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project1/ContentView.swift +0 -7
  48. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project1/Project1App.swift +0 -10
  49. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project2/ContentView.swift +0 -7
  50. package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project2/Project2App.swift +0 -10
  51. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Project.xcodeproj/project.pbxproj +0 -382
  52. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Project.xcodeproj/xcshareddata/xcschemes/Project.xcscheme +0 -78
  53. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Sources/ContentView.swift +0 -7
  54. package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Sources/MainApp.swift +0 -10
  55. package/e2e-tests/test-applications/flutter-test-app/.metadata +0 -45
  56. package/e2e-tests/test-applications/flutter-test-app/README.md +0 -16
  57. package/e2e-tests/test-applications/flutter-test-app/analysis_options.yaml +0 -28
  58. package/e2e-tests/test-applications/flutter-test-app/android/app/build.gradle +0 -44
  59. package/e2e-tests/test-applications/flutter-test-app/android/app/src/debug/AndroidManifest.xml +0 -7
  60. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/AndroidManifest.xml +0 -45
  61. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/kotlin/com/example/flutter_magic/MainActivity.kt +0 -5
  62. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/drawable/launch_background.xml +0 -12
  63. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/drawable-v21/launch_background.xml +0 -12
  64. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  65. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  66. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  67. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  68. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  69. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/values/styles.xml +0 -18
  70. package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/values-night/styles.xml +0 -18
  71. package/e2e-tests/test-applications/flutter-test-app/android/app/src/profile/AndroidManifest.xml +0 -7
  72. package/e2e-tests/test-applications/flutter-test-app/android/build.gradle +0 -18
  73. package/e2e-tests/test-applications/flutter-test-app/android/gradle/wrapper/gradle-wrapper.properties +0 -5
  74. package/e2e-tests/test-applications/flutter-test-app/android/gradle.properties +0 -3
  75. package/e2e-tests/test-applications/flutter-test-app/android/settings.gradle +0 -25
  76. package/e2e-tests/test-applications/flutter-test-app/lib/main.dart +0 -125
  77. package/e2e-tests/test-applications/flutter-test-app/linux/CMakeLists.txt +0 -145
  78. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/CMakeLists.txt +0 -88
  79. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugin_registrant.cc +0 -11
  80. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugin_registrant.h +0 -15
  81. package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugins.cmake +0 -23
  82. package/e2e-tests/test-applications/flutter-test-app/linux/main.cc +0 -6
  83. package/e2e-tests/test-applications/flutter-test-app/linux/my_application.cc +0 -124
  84. package/e2e-tests/test-applications/flutter-test-app/linux/my_application.h +0 -18
  85. package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/Flutter-Debug.xcconfig +0 -2
  86. package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/Flutter-Release.xcconfig +0 -2
  87. package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/GeneratedPluginRegistrant.swift +0 -10
  88. package/e2e-tests/test-applications/flutter-test-app/macos/Podfile +0 -43
  89. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/AppDelegate.swift +0 -9
  90. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -68
  91. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png +0 -0
  92. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png +0 -0
  93. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png +0 -0
  94. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png +0 -0
  95. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png +0 -0
  96. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png +0 -0
  97. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png +0 -0
  98. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Base.lproj/MainMenu.xib +0 -343
  99. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/AppInfo.xcconfig +0 -14
  100. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Debug.xcconfig +0 -2
  101. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Release.xcconfig +0 -2
  102. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Warnings.xcconfig +0 -13
  103. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/DebugProfile.entitlements +0 -12
  104. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Info.plist +0 -32
  105. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/MainFlutterWindow.swift +0 -15
  106. package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Release.entitlements +0 -8
  107. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/project.pbxproj +0 -705
  108. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  109. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +0 -98
  110. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcworkspace/contents.xcworkspacedata +0 -7
  111. package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  112. package/e2e-tests/test-applications/flutter-test-app/macos/RunnerTests/RunnerTests.swift +0 -12
  113. package/e2e-tests/test-applications/flutter-test-app/pubspec.lock +0 -213
  114. package/e2e-tests/test-applications/flutter-test-app/pubspec.yaml +0 -89
  115. package/e2e-tests/test-applications/flutter-test-app/test/widget_test.dart +0 -30
  116. package/e2e-tests/test-applications/flutter-test-app/web/favicon.png +0 -0
  117. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-192.png +0 -0
  118. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-512.png +0 -0
  119. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-maskable-192.png +0 -0
  120. package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-maskable-512.png +0 -0
  121. package/e2e-tests/test-applications/flutter-test-app/web/index.html +0 -38
  122. package/e2e-tests/test-applications/flutter-test-app/web/manifest.json +0 -35
  123. package/e2e-tests/test-applications/flutter-test-app/windows/CMakeLists.txt +0 -108
  124. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/CMakeLists.txt +0 -109
  125. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugin_registrant.cc +0 -11
  126. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugin_registrant.h +0 -15
  127. package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugins.cmake +0 -23
  128. package/e2e-tests/test-applications/flutter-test-app/windows/runner/CMakeLists.txt +0 -40
  129. package/e2e-tests/test-applications/flutter-test-app/windows/runner/Runner.rc +0 -121
  130. package/e2e-tests/test-applications/flutter-test-app/windows/runner/flutter_window.cpp +0 -71
  131. package/e2e-tests/test-applications/flutter-test-app/windows/runner/flutter_window.h +0 -33
  132. package/e2e-tests/test-applications/flutter-test-app/windows/runner/main.cpp +0 -43
  133. package/e2e-tests/test-applications/flutter-test-app/windows/runner/resource.h +0 -16
  134. package/e2e-tests/test-applications/flutter-test-app/windows/runner/resources/app_icon.ico +0 -0
  135. package/e2e-tests/test-applications/flutter-test-app/windows/runner/runner.exe.manifest +0 -14
  136. package/e2e-tests/test-applications/flutter-test-app/windows/runner/utils.cpp +0 -65
  137. package/e2e-tests/test-applications/flutter-test-app/windows/runner/utils.h +0 -19
  138. package/e2e-tests/test-applications/flutter-test-app/windows/runner/win32_window.cpp +0 -288
  139. package/e2e-tests/test-applications/flutter-test-app/windows/runner/win32_window.h +0 -102
  140. package/e2e-tests/test-applications/nextjs-test-app/next.config.mjs +0 -4
  141. package/e2e-tests/test-applications/nextjs-test-app/package.json +0 -22
  142. package/e2e-tests/test-applications/nextjs-test-app/src/app/layout.tsx +0 -20
  143. package/e2e-tests/test-applications/nextjs-test-app/src/app/page.tsx +0 -90
  144. package/e2e-tests/test-applications/nuxt-3-test-app/README.md +0 -75
  145. package/e2e-tests/test-applications/nuxt-3-test-app/nuxt.config.ts +0 -5
  146. package/e2e-tests/test-applications/nuxt-3-test-app/package.json +0 -18
  147. package/e2e-tests/test-applications/nuxt-3-test-app/public/favicon.ico +0 -0
  148. package/e2e-tests/test-applications/nuxt-3-test-app/public/robots.txt +0 -1
  149. package/e2e-tests/test-applications/nuxt-4-test-app/README.md +0 -75
  150. package/e2e-tests/test-applications/nuxt-4-test-app/nuxt.config.ts +0 -6
  151. package/e2e-tests/test-applications/nuxt-4-test-app/package.json +0 -18
  152. package/e2e-tests/test-applications/nuxt-4-test-app/public/favicon.ico +0 -0
  153. package/e2e-tests/test-applications/nuxt-4-test-app/public/robots.txt +0 -1
  154. package/e2e-tests/test-applications/remix-test-app/app/entry.client.tsx +0 -18
  155. package/e2e-tests/test-applications/remix-test-app/app/entry.server.tsx +0 -140
  156. package/e2e-tests/test-applications/remix-test-app/app/root.tsx +0 -30
  157. package/e2e-tests/test-applications/remix-test-app/app/routes/_index.tsx +0 -48
  158. package/e2e-tests/test-applications/remix-test-app/app/tailwind.css +0 -3
  159. package/e2e-tests/test-applications/remix-test-app/package.json +0 -37
  160. package/e2e-tests/test-applications/remix-test-app/postcss.config.js +0 -6
  161. package/e2e-tests/test-applications/remix-test-app/tailwind.config.ts +0 -9
  162. package/e2e-tests/test-applications/remix-test-app/vite.config.ts +0 -16
  163. package/e2e-tests/test-applications/sveltekit-test-app/package.json +0 -21
  164. package/e2e-tests/test-applications/sveltekit-test-app/src/app.d.ts +0 -13
  165. package/e2e-tests/test-applications/sveltekit-test-app/src/app.html +0 -11
  166. package/e2e-tests/test-applications/sveltekit-test-app/src/lib/index.ts +0 -1
  167. package/e2e-tests/test-applications/sveltekit-test-app/src/routes/+page.svelte +0 -2
  168. package/e2e-tests/test-applications/sveltekit-test-app/svelte.config.js +0 -18
  169. package/e2e-tests/test-applications/sveltekit-test-app/vite.config.ts +0 -6
  170. package/e2e-tests/tests/flutter.test.ts +0 -127
  171. package/e2e-tests/tests/nextjs.test.ts +0 -161
  172. package/e2e-tests/tests/nuxt-3.test.ts +0 -189
  173. package/e2e-tests/tests/nuxt-4.test.ts +0 -188
  174. package/e2e-tests/tests/remix.test.ts +0 -277
  175. package/e2e-tests/tests/sveltekit.test.ts +0 -284
  176. package/e2e-tests/utils/index.ts +0 -456
  177. package/index.ts +0 -2
  178. package/lib/Constants.ts +0 -118
  179. package/lib/Helper/BottomBar.ts +0 -28
  180. package/lib/Helper/Env.ts +0 -7
  181. package/lib/Helper/File.ts +0 -65
  182. package/lib/Helper/Git.ts +0 -39
  183. package/lib/Helper/Logging.ts +0 -44
  184. package/lib/Helper/MergeConfig.ts +0 -19
  185. package/lib/Helper/Package.ts +0 -80
  186. package/lib/Helper/SentryCli.ts +0 -139
  187. package/lib/Helper/Wizard.ts +0 -58
  188. package/lib/Helper/__tests__/File.ts +0 -15
  189. package/lib/Helper/__tests__/MergeConfig.ts +0 -98
  190. package/lib/Helper/__tests__/SentryCli.ts +0 -86
  191. package/lib/Helper/test-fixtures/next.config.1-merged.js +0 -18
  192. package/lib/Helper/test-fixtures/next.config.1.js +0 -6
  193. package/lib/Helper/test-fixtures/next.config.2.js +0 -8
  194. package/lib/Helper/test-fixtures/next.config.3-merged.js +0 -21
  195. package/lib/Helper/test-fixtures/next.config.3.js +0 -9
  196. package/lib/Helper/test-fixtures/next.config.4-merged.js +0 -21
  197. package/lib/Helper/test-fixtures/next.config.4.js +0 -9
  198. package/lib/Setup.ts +0 -40
  199. package/lib/Steps/BaseStep.ts +0 -25
  200. package/lib/Steps/ChooseIntegration.ts +0 -144
  201. package/lib/Steps/ConfigureProject.ts +0 -10
  202. package/lib/Steps/Initial.ts +0 -35
  203. package/lib/Steps/Integrations/BaseIntegration.ts +0 -42
  204. package/lib/Steps/Integrations/Cordova.ts +0 -283
  205. package/lib/Steps/Integrations/Electron.ts +0 -164
  206. package/lib/Steps/Integrations/MobileProject.ts +0 -72
  207. package/lib/Steps/OpenSentry.ts +0 -80
  208. package/lib/Steps/PromptForParameters.ts +0 -200
  209. package/lib/Steps/Result.ts +0 -22
  210. package/lib/Steps/SentryProjectSelector.ts +0 -83
  211. package/lib/Steps/ShouldConfigure.ts +0 -10
  212. package/lib/Steps/WaitForSentry.ts +0 -56
  213. package/lib/Steps/Welcome.ts +0 -21
  214. package/lib/Steps/index.ts +0 -10
  215. package/lib/__tests__/Env.ts +0 -29
  216. package/scripts/NextJs/configs/_error.js +0 -39
  217. package/scripts/NextJs/configs/next.config.js +0 -36
  218. package/scripts/NextJs/configs/next.config.template.js +0 -12
  219. package/scripts/NextJs/configs/sentry.client.config.js +0 -17
  220. package/scripts/NextJs/configs/sentry.edge.config.js +0 -17
  221. package/scripts/NextJs/configs/sentry.server.config.js +0 -17
  222. package/scripts/NextJs/sentry_sample_error.js +0 -47
  223. package/scripts/craft-pre-release.sh +0 -10
  224. package/src/android/android-wizard.ts +0 -192
  225. package/src/android/code-tools.ts +0 -170
  226. package/src/android/gradle.ts +0 -250
  227. package/src/android/manifest.ts +0 -180
  228. package/src/android/templates.ts +0 -86
  229. package/src/apple/apple-wizard.ts +0 -269
  230. package/src/apple/cocoapod.ts +0 -73
  231. package/src/apple/code-tools.ts +0 -147
  232. package/src/apple/fastlane.ts +0 -170
  233. package/src/apple/templates.ts +0 -65
  234. package/src/apple/xcode-manager.ts +0 -404
  235. package/src/flutter/code-tools.ts +0 -284
  236. package/src/flutter/flutter-wizard.ts +0 -164
  237. package/src/flutter/templates.ts +0 -90
  238. package/src/nextjs/nextjs-wizard.ts +0 -1007
  239. package/src/nextjs/templates.ts +0 -525
  240. package/src/nextjs/utils.ts +0 -21
  241. package/src/nuxt/nuxt-wizard.ts +0 -188
  242. package/src/nuxt/sdk-example.ts +0 -135
  243. package/src/nuxt/sdk-setup.ts +0 -352
  244. package/src/nuxt/templates.ts +0 -303
  245. package/src/nuxt/types.ts +0 -8
  246. package/src/nuxt/utils.ts +0 -42
  247. package/src/react-native/expo-env-file.ts +0 -55
  248. package/src/react-native/expo-metro.ts +0 -212
  249. package/src/react-native/expo.ts +0 -175
  250. package/src/react-native/git.ts +0 -25
  251. package/src/react-native/glob.ts +0 -13
  252. package/src/react-native/gradle.ts +0 -26
  253. package/src/react-native/javascript.ts +0 -103
  254. package/src/react-native/metro.ts +0 -599
  255. package/src/react-native/options.ts +0 -5
  256. package/src/react-native/react-native-wizard.ts +0 -512
  257. package/src/react-native/uninstall.ts +0 -109
  258. package/src/react-native/xcode.ts +0 -302
  259. package/src/remix/codemods/express-server.ts +0 -44
  260. package/src/remix/codemods/handle-error.ts +0 -118
  261. package/src/remix/codemods/root-common.ts +0 -63
  262. package/src/remix/codemods/root-v1.ts +0 -41
  263. package/src/remix/codemods/root-v2.ts +0 -153
  264. package/src/remix/remix-wizard.ts +0 -261
  265. package/src/remix/sdk-example.ts +0 -120
  266. package/src/remix/sdk-setup.ts +0 -546
  267. package/src/remix/templates.ts +0 -11
  268. package/src/remix/utils.ts +0 -96
  269. package/src/run.ts +0 -211
  270. package/src/sourcemaps/sourcemaps-wizard.ts +0 -364
  271. package/src/sourcemaps/tools/angular.ts +0 -42
  272. package/src/sourcemaps/tools/create-react-app.ts +0 -19
  273. package/src/sourcemaps/tools/esbuild.ts +0 -65
  274. package/src/sourcemaps/tools/nextjs.ts +0 -114
  275. package/src/sourcemaps/tools/remix.ts +0 -90
  276. package/src/sourcemaps/tools/rollup.ts +0 -67
  277. package/src/sourcemaps/tools/sentry-cli.ts +0 -287
  278. package/src/sourcemaps/tools/tsc.ts +0 -144
  279. package/src/sourcemaps/tools/types.ts +0 -11
  280. package/src/sourcemaps/tools/vite.ts +0 -300
  281. package/src/sourcemaps/tools/webpack.ts +0 -383
  282. package/src/sourcemaps/utils/detect-tool.ts +0 -46
  283. package/src/sourcemaps/utils/other-wizards.ts +0 -167
  284. package/src/sourcemaps/utils/sdk-version.ts +0 -266
  285. package/src/sveltekit/sdk-example.ts +0 -56
  286. package/src/sveltekit/sdk-setup.ts +0 -667
  287. package/src/sveltekit/sveltekit-wizard.ts +0 -192
  288. package/src/sveltekit/templates.ts +0 -185
  289. package/src/sveltekit/utils.ts +0 -50
  290. package/src/telemetry.ts +0 -144
  291. package/src/utils/ast-utils.ts +0 -270
  292. package/src/utils/bash.ts +0 -57
  293. package/src/utils/clack-utils.ts +0 -1536
  294. package/src/utils/debug.ts +0 -20
  295. package/src/utils/package-json.ts +0 -51
  296. package/src/utils/package-manager.ts +0 -172
  297. package/src/utils/release-registry.ts +0 -19
  298. package/src/utils/semver.ts +0 -33
  299. package/src/utils/sentrycli-utils.ts +0 -24
  300. package/src/utils/string.ts +0 -7
  301. package/src/utils/types.ts +0 -77
  302. package/src/utils/url.ts +0 -27
  303. package/src/utils/vendor/is-unicorn-supported.ts +0 -29
  304. package/test/android/code-tools.test.ts +0 -49
  305. package/test/apple/cocoapod.test.ts +0 -310
  306. package/test/apple/code-tools.test.ts +0 -1042
  307. package/test/apple/fastfile.test.ts +0 -555
  308. package/test/apple/templates.test.ts +0 -191
  309. package/test/apple/xcode-manager.test.ts +0 -1068
  310. package/test/flutter/code-tools.test.ts +0 -212
  311. package/test/flutter/templates.test.ts +0 -100
  312. package/test/nextjs/templates.test.ts +0 -429
  313. package/test/nuxt/templates.test.ts +0 -255
  314. package/test/react-native/expo-metro.test.ts +0 -81
  315. package/test/react-native/expo.test.ts +0 -86
  316. package/test/react-native/gradle.test.ts +0 -310
  317. package/test/react-native/javascript.test.ts +0 -134
  318. package/test/react-native/metro.test.ts +0 -396
  319. package/test/react-native/xcode.test.ts +0 -401
  320. package/test/remix/client-entry.test.ts +0 -122
  321. package/test/remix/server-instrumentation.test.ts +0 -36
  322. package/test/sourcemaps/tools/sentry-cli.test.ts +0 -57
  323. package/test/sourcemaps/tools/tsc.test.ts +0 -181
  324. package/test/sourcemaps/tools/vite.test.ts +0 -149
  325. package/test/sourcemaps/tools/webpack.test.ts +0 -303
  326. package/test/sveltekit/templates.test.ts +0 -152
  327. package/test/utils/ast-utils.test.ts +0 -264
  328. package/test/utils/clack-utils.test.ts +0 -224
  329. package/types/read-env.d.ts +0 -3
  330. package/types/xcode.d.ts +0 -527
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.askShouldAddPackageOverride = exports.askShouldInstallPackage = exports.featureSelectionPrompt = exports.askShouldCreateExampleComponent = exports.askShouldCreateExamplePage = exports.createNewConfigFile = exports.makeCodeSnippet = exports.showCopyPasteInstructions = exports.askForToolConfigPath = exports.getOrAskForProjectData = exports.isUsingTypeScript = exports.getPackageManager = exports.updatePackageDotJson = exports.getPackageDotJson = exports.ensurePackageIsInstalled = exports.runPrettierIfInstalled = exports.addDotEnvSentryBuildPluginFile = exports.addSentryCliConfig = exports.installPackage = exports.confirmContinueIfPackageVersionNotSupported = exports.askForItemSelection = exports.askToInstallSentryCLI = exports.getUncommittedOrUntrackedFiles = exports.isInGitRepo = exports.confirmContinueIfNoOrDirtyGitRepo = exports.printWelcome = exports.abortIfCancelled = exports.abort = exports.propertiesCliSetupConfig = exports.rcCliSetupConfig = exports.SENTRY_PROPERTIES_FILE = exports.SENTRY_CLI_RC_FILE = exports.SENTRY_DOT_ENV_FILE = void 0;
29
+ exports.askShouldAddPackageOverride = exports.askShouldInstallPackage = exports.featureSelectionPrompt = exports.askShouldCreateExampleComponent = exports.askShouldCreateExamplePage = exports.createNewConfigFile = exports.makeCodeSnippet = exports.showCopyPasteInstructions = exports.askForToolConfigPath = exports.askForWizardLogin = exports.getOrAskForProjectData = exports.isUsingTypeScript = exports.getPackageManager = exports.updatePackageDotJson = exports.getPackageDotJson = exports.ensurePackageIsInstalled = exports.runPrettierIfInstalled = exports.addDotEnvSentryBuildPluginFile = exports.addSentryCliConfig = exports.installPackage = exports.confirmContinueIfPackageVersionNotSupported = exports.askForItemSelection = exports.askToInstallSentryCLI = exports.getUncommittedOrUntrackedFiles = exports.isInGitRepo = exports.confirmContinueIfNoOrDirtyGitRepo = exports.printWelcome = exports.abortIfCancelled = exports.abort = exports.propertiesCliSetupConfig = exports.rcCliSetupConfig = exports.SENTRY_PROPERTIES_FILE = exports.SENTRY_CLI_RC_FILE = exports.SENTRY_DOT_ENV_FILE = void 0;
30
30
  const childProcess = __importStar(require("node:child_process"));
31
31
  const fs = __importStar(require("node:fs"));
32
32
  const os = __importStar(require("node:os"));
@@ -44,6 +44,7 @@ const debug_1 = require("./debug");
44
44
  const package_json_1 = require("./package-json");
45
45
  const package_manager_1 = require("./package-manager");
46
46
  const semver_1 = require("./semver");
47
+ const version_1 = require("../version");
47
48
  exports.SENTRY_DOT_ENV_FILE = '.env.sentry-build-plugin';
48
49
  exports.SENTRY_CLI_RC_FILE = '.sentryclirc';
49
50
  exports.SENTRY_PROPERTIES_FILE = 'sentry.properties';
@@ -124,15 +125,6 @@ async function abortIfCancelled(input) {
124
125
  }
125
126
  exports.abortIfCancelled = abortIfCancelled;
126
127
  function printWelcome(options) {
127
- let wizardVersion = process.env.npm_package_version;
128
- if (!wizardVersion) {
129
- try {
130
- wizardVersion = JSON.parse(fs.readFileSync((0, node_path_1.join)((0, node_path_1.dirname)(require.resolve('@sentry/wizard')), '..', 'package.json'), 'utf-8')).version;
131
- }
132
- catch {
133
- // We don't need to have this
134
- }
135
- }
136
128
  // eslint-disable-next-line no-console
137
129
  console.log('');
138
130
  clack.intro(chalk_1.default.inverse(` ${options.wizardName} `));
@@ -141,9 +133,7 @@ function printWelcome(options) {
141
133
  if (options.promoCode) {
142
134
  welcomeText = `${welcomeText}\n\nUsing promo-code: ${options.promoCode}`;
143
135
  }
144
- if (wizardVersion) {
145
- welcomeText = `${welcomeText}\n\nVersion: ${wizardVersion}`;
146
- }
136
+ welcomeText = `${welcomeText}\n\nVersion: ${version_1.WIZARD_VERSION}`;
147
137
  if (options.telemetryEnabled) {
148
138
  welcomeText = `${welcomeText}
149
139
 
@@ -681,44 +671,31 @@ async function askForSelfHosted(urlFromArgs, saas) {
681
671
  Sentry.setTag('self-hosted', isSelfHostedUrl);
682
672
  return { url: validUrl, selfHosted: true };
683
673
  }
674
+ /**
675
+ * Exported for testing
676
+ */
684
677
  async function askForWizardLogin(options) {
685
- Sentry.setTag('has-promo-code', !!options.promoCode);
686
- let hasSentryAccount = await clack.confirm({
687
- message: 'Do you already have a Sentry account?',
688
- });
689
- hasSentryAccount = await abortIfCancelled(hasSentryAccount);
678
+ const { orgSlug, projectSlug, url, platform, promoCode } = options;
679
+ Sentry.setTag('has-promo-code', !!promoCode);
680
+ const projectAndOrgPreselected = !!(orgSlug && projectSlug);
681
+ const hasSentryAccount = projectAndOrgPreselected || (await askHasSentryAccount());
690
682
  Sentry.setTag('already-has-sentry-account', hasSentryAccount);
691
- let wizardHash;
692
- try {
693
- wizardHash = (await axios_1.default.get(`${options.url}api/0/wizard/`)).data.hash;
694
- }
695
- catch (e) {
696
- if (options.url !== SAAS_URL) {
697
- clack.log.error('Loading Wizard failed. Did you provide the right URL?');
698
- clack.log.info(JSON.stringify(e, null, 2));
699
- await abort(chalk_1.default.red('Please check your configuration and try again.\n\n Let us know if you think this is an issue with the wizard or Sentry: https://github.com/getsentry/sentry-wizard/issues'));
700
- }
701
- else {
702
- clack.log.error('Loading Wizard failed.');
703
- clack.log.info(JSON.stringify(e, null, 2));
704
- await abort(chalk_1.default.red('Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues'));
705
- }
683
+ const wizardHash = await makeInitialWizardHashRequest(url);
684
+ const loginUrl = new node_url_1.URL(`${url}account/settings/wizard/${wizardHash}/`);
685
+ if (orgSlug) {
686
+ loginUrl.searchParams.set('org_slug', orgSlug);
706
687
  }
707
- const loginUrl = new node_url_1.URL(`${options.url}account/settings/wizard/${wizardHash}/`);
708
- if (options.orgSlug) {
709
- loginUrl.searchParams.set('org_slug', options.orgSlug);
710
- }
711
- if (options.projectSlug) {
712
- loginUrl.searchParams.set('project_slug', options.projectSlug);
688
+ if (projectSlug) {
689
+ loginUrl.searchParams.set('project_slug', projectSlug);
713
690
  }
714
691
  if (!hasSentryAccount) {
715
692
  loginUrl.searchParams.set('signup', '1');
716
693
  }
717
- if (options.platform) {
718
- loginUrl.searchParams.set('project_platform', options.platform);
694
+ if (platform) {
695
+ loginUrl.searchParams.set('project_platform', platform);
719
696
  }
720
- if (options.promoCode) {
721
- loginUrl.searchParams.set('code', options.promoCode);
697
+ if (promoCode) {
698
+ loginUrl.searchParams.set('code', promoCode);
722
699
  }
723
700
  const urlToOpen = loginUrl.toString();
724
701
  clack.log.info(`${chalk_1.default.bold(`If the browser window didn't open automatically, please open the following link to ${hasSentryAccount ? 'log' : 'sign'} into Sentry:`)}\n\n${chalk_1.default.cyan(urlToOpen)}`);
@@ -730,7 +707,7 @@ async function askForWizardLogin(options) {
730
707
  const data = await new Promise((resolve) => {
731
708
  const pollingInterval = (0, node_timers_1.setInterval)(() => {
732
709
  axios_1.default
733
- .get(`${options.url}api/0/wizard/${wizardHash}/`, {
710
+ .get(`${url}api/0/wizard/${wizardHash}/`, {
734
711
  headers: {
735
712
  'Accept-Encoding': 'deflate',
736
713
  },
@@ -739,7 +716,7 @@ async function askForWizardLogin(options) {
739
716
  resolve(result.data);
740
717
  clearTimeout(timeout);
741
718
  clearInterval(pollingInterval);
742
- void axios_1.default.delete(`${options.url}api/0/wizard/${wizardHash}/`);
719
+ void axios_1.default.delete(`${url}api/0/wizard/${wizardHash}/`);
743
720
  })
744
721
  .catch(() => {
745
722
  // noop - just try again
@@ -756,6 +733,37 @@ async function askForWizardLogin(options) {
756
733
  Sentry.setTag('opened-wizard-link', true);
757
734
  return data;
758
735
  }
736
+ exports.askForWizardLogin = askForWizardLogin;
737
+ /**
738
+ * This first request to Sentry creates a cache on the Sentry backend whose key is returned.
739
+ * We use this key later on to poll for the actual project data.
740
+ */
741
+ async function makeInitialWizardHashRequest(url) {
742
+ const reqUrl = `${url}api/0/wizard/`;
743
+ try {
744
+ return (await axios_1.default.get(reqUrl)).data.hash;
745
+ }
746
+ catch (e) {
747
+ if (url !== SAAS_URL) {
748
+ clack.log.error(`Loading Wizard failed. Did you provide the right URL? (url: ${reqUrl})`);
749
+ clack.log.info(JSON.stringify(e, null, 2));
750
+ await abort(chalk_1.default.red('Please check your configuration and try again.\n\n Let us know if you think this is an issue with the wizard or Sentry: https://github.com/getsentry/sentry-wizard/issues'));
751
+ }
752
+ else {
753
+ clack.log.error('Loading Wizard failed.');
754
+ clack.log.info(JSON.stringify(e, null, 2));
755
+ await abort(chalk_1.default.red('Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues'));
756
+ }
757
+ }
758
+ // We don't get here as we abort in an error case but TS doesn't know that
759
+ return 'invalid hash';
760
+ }
761
+ async function askHasSentryAccount() {
762
+ const hasSentryAccount = await clack.confirm({
763
+ message: 'Do you already have a Sentry account?',
764
+ });
765
+ return abortIfCancelled(hasSentryAccount);
766
+ }
759
767
  async function askForProjectSelection(projects, orgSlug, projectSlug) {
760
768
  const label = (project) => {
761
769
  return `${project.organization.slug}/${project.slug}`;
@@ -1 +1 @@
1
- {"version":3,"file":"clack-utils.js","sourceRoot":"","sources":["../../../src/utils/clack-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as childProcess from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport { basename, dirname, isAbsolute, join, relative } from 'node:path';\nimport { setInterval } from 'node:timers';\nimport { URL } from 'node:url';\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport * as Sentry from '@sentry/node';\nimport axios from 'axios';\nimport chalk from 'chalk';\nimport opn from 'opn';\nimport { traceStep } from '../telemetry';\nimport { debug } from './debug';\nimport { type PackageDotJson, hasPackageInstalled } from './package-json';\nimport {\n type PackageManager,\n detectPackageManger,\n packageManagers,\n} from './package-manager';\nimport { fulfillsVersionRange } from './semver';\nimport type { Feature, SentryProjectData, WizardOptions } from './types';\n\nexport const SENTRY_DOT_ENV_FILE = '.env.sentry-build-plugin';\nexport const SENTRY_CLI_RC_FILE = '.sentryclirc';\nexport const SENTRY_PROPERTIES_FILE = 'sentry.properties';\n\nconst SAAS_URL = 'https://sentry.io/';\n\nconst DUMMY_AUTH_TOKEN = '_YOUR_SENTRY_AUTH_TOKEN_';\n\ninterface WizardProjectData {\n apiKeys?: {\n token?: string;\n };\n projects?: SentryProjectData[];\n}\n\nexport interface CliSetupConfig {\n filename: string;\n name: string;\n gitignore: boolean;\n\n likelyAlreadyHasAuthToken(contents: string): boolean;\n tokenContent(authToken: string): string;\n\n likelyAlreadyHasOrgAndProject(contents: string): boolean;\n orgAndProjContent(org: string, project: string): string;\n\n likelyAlreadyHasUrl?(contents: string): boolean;\n urlContent?(url: string): string;\n}\n\nexport interface CliSetupConfigContent {\n authToken: string;\n org?: string;\n project?: string;\n url?: string;\n}\n\nexport const rcCliSetupConfig: CliSetupConfig = {\n filename: SENTRY_CLI_RC_FILE,\n name: 'source maps',\n gitignore: true,\n likelyAlreadyHasAuthToken: function (contents: string): boolean {\n return !!(contents.includes('[auth]') && contents.match(/token=./g));\n },\n tokenContent: function (authToken: string): string {\n return `[auth]\\ntoken=${authToken}`;\n },\n likelyAlreadyHasOrgAndProject: function (contents: string): boolean {\n return !!(\n contents.includes('[defaults]') &&\n contents.match(/org=./g) &&\n contents.match(/project=./g)\n );\n },\n orgAndProjContent: function (org: string, project: string): string {\n return `[defaults]\\norg=${org}\\nproject=${project}`;\n },\n};\n\nexport const propertiesCliSetupConfig: Required<CliSetupConfig> = {\n filename: SENTRY_PROPERTIES_FILE,\n gitignore: true,\n name: 'debug files',\n likelyAlreadyHasAuthToken(contents: string): boolean {\n return !!contents.match(/auth\\.token=./g);\n },\n tokenContent(authToken: string): string {\n return `auth.token=${authToken}`;\n },\n likelyAlreadyHasOrgAndProject(contents: string): boolean {\n return !!(\n contents.match(/defaults\\.org=./g) &&\n contents.match(/defaults\\.project=./g)\n );\n },\n orgAndProjContent(org: string, project: string): string {\n return `defaults.org=${org}\\ndefaults.project=${project}`;\n },\n likelyAlreadyHasUrl(contents: string): boolean {\n return !!contents.match(/defaults\\.url=./g);\n },\n urlContent(url: string): string {\n return `defaults.url=${url}`;\n },\n};\n\nexport async function abort(message?: string, status?: number): Promise<never> {\n clack.outro(message ?? 'Wizard setup cancelled.');\n const sentryHub = Sentry.getCurrentHub();\n const sentryTransaction = sentryHub.getScope().getTransaction();\n sentryTransaction?.setStatus('aborted');\n sentryTransaction?.finish();\n const sentrySession = sentryHub.getScope().getSession();\n if (sentrySession) {\n sentrySession.status = status === 0 ? 'abnormal' : 'crashed';\n sentryHub.captureSession(true);\n }\n await Sentry.flush(3000);\n return process.exit(status ?? 1);\n}\n\nexport async function abortIfCancelled<T>(\n input: T | Promise<T>,\n): Promise<Exclude<T, symbol>> {\n if (clack.isCancel(await input)) {\n clack.cancel('Wizard setup cancelled.');\n const sentryHub = Sentry.getCurrentHub();\n const sentryTransaction = sentryHub.getScope().getTransaction();\n sentryTransaction?.setStatus('cancelled');\n sentryTransaction?.finish();\n sentryHub.captureSession(true);\n await Sentry.flush(3000);\n process.exit(0);\n } else {\n return input as Exclude<T, symbol>;\n }\n}\n\ntype PackageJSON = { version?: string };\n\nexport function printWelcome(options: {\n wizardName: string;\n promoCode?: string;\n message?: string;\n telemetryEnabled?: boolean;\n}): void {\n let wizardVersion = process.env.npm_package_version;\n if (!wizardVersion) {\n try {\n wizardVersion = (\n JSON.parse(\n fs.readFileSync(\n join(\n dirname(require.resolve('@sentry/wizard')),\n '..',\n 'package.json',\n ),\n 'utf-8',\n ),\n ) as PackageJSON\n ).version;\n } catch {\n // We don't need to have this\n }\n }\n\n // eslint-disable-next-line no-console\n console.log('');\n clack.intro(chalk.inverse(` ${options.wizardName} `));\n\n let welcomeText =\n options.message ||\n `The ${options.wizardName} will help you set up Sentry for your application.\\nThank you for using Sentry :)`;\n\n if (options.promoCode) {\n welcomeText = `${welcomeText}\\n\\nUsing promo-code: ${options.promoCode}`;\n }\n\n if (wizardVersion) {\n welcomeText = `${welcomeText}\\n\\nVersion: ${wizardVersion}`;\n }\n\n if (options.telemetryEnabled) {\n welcomeText = `${welcomeText}\n\nThis wizard sends telemetry data and crash reports to Sentry. This helps us improve the Wizard.\nYou can turn this off at any time by running ${chalk.cyanBright(\n 'sentry-wizard --disable-telemetry',\n )}.`;\n }\n\n clack.note(welcomeText);\n}\n\nexport async function confirmContinueIfNoOrDirtyGitRepo(): Promise<void> {\n return traceStep('check-git-status', async () => {\n if (!isInGitRepo()) {\n const continueWithoutGit = await abortIfCancelled(\n clack.confirm({\n message:\n 'You are not inside a git repository. The wizard will create and update files. Do you want to continue anyway?',\n }),\n );\n\n Sentry.setTag('continue-without-git', continueWithoutGit);\n\n if (!continueWithoutGit) {\n await abort(undefined, 0);\n }\n // return early to avoid checking for uncommitted files\n return;\n }\n\n const uncommittedOrUntrackedFiles = getUncommittedOrUntrackedFiles();\n if (uncommittedOrUntrackedFiles.length) {\n clack.log.warn(\n `You have uncommitted or untracked files in your repo:\n\n${uncommittedOrUntrackedFiles.join('\\n')}\n\nThe wizard will create and update files.`,\n );\n const continueWithDirtyRepo = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n\n Sentry.setTag('continue-with-dirty-repo', continueWithDirtyRepo);\n\n if (!continueWithDirtyRepo) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport function isInGitRepo() {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getUncommittedOrUntrackedFiles(): string[] {\n try {\n const gitStatus = childProcess\n .execSync('git status --porcelain=v1', {\n // we only care about stdout\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString();\n\n const files = gitStatus\n .split(os.EOL)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((f) => `- ${f.split(/\\s+/)[1]}`);\n\n return files;\n } catch {\n return [];\n }\n}\n\nexport async function askToInstallSentryCLI(): Promise<boolean> {\n return await abortIfCancelled(\n clack.confirm({\n message:\n \"You don't have Sentry CLI installed. Do you want to install it?\",\n }),\n );\n}\n\nexport async function askForItemSelection(\n items: string[],\n message: string,\n): Promise<{ value: string; index: number }> {\n const selection: { value: string; index: number } | symbol =\n await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: message,\n options: items.map((item, index) => {\n return {\n value: { value: item, index: index },\n label: item,\n };\n }),\n }),\n );\n\n return selection;\n}\n\nexport async function confirmContinueIfPackageVersionNotSupported({\n packageId,\n packageName,\n packageVersion,\n acceptableVersions,\n note,\n}: {\n packageId: string;\n packageName: string;\n packageVersion: string;\n acceptableVersions: string;\n note?: string;\n}): Promise<void> {\n return traceStep(`check-package-version`, async () => {\n Sentry.setTag(`${packageName.toLowerCase()}-version`, packageVersion);\n const isSupportedVersion = fulfillsVersionRange({\n acceptableVersions,\n version: packageVersion,\n canBeLatest: true,\n });\n\n if (isSupportedVersion) {\n Sentry.setTag(`${packageName.toLowerCase()}-supported`, true);\n return;\n }\n\n clack.log.warn(\n `You have an unsupported version of ${packageName} installed:\n\n ${packageId}@${packageVersion}`,\n );\n\n clack.note(\n note ??\n `Please upgrade to ${acceptableVersions} if you wish to use the Sentry Wizard.`,\n );\n const continueWithUnsupportedVersion = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n Sentry.setTag(\n `${packageName.toLowerCase()}-continue-with-unsupported-version`,\n continueWithUnsupportedVersion,\n );\n\n if (!continueWithUnsupportedVersion) {\n await abort(undefined, 0);\n }\n });\n}\n\n/**\n * Installs or updates a package with the user's package manager.\n *\n * IMPORTANT: This function modifies the `package.json`! Be sure to re-read\n * it if you make additional modifications to it after calling this function!\n */\nexport async function installPackage({\n packageName,\n alreadyInstalled,\n askBeforeUpdating = true,\n packageNameDisplayLabel,\n packageManager,\n forceInstall = false,\n}: {\n /** The string that is passed to the package manager CLI as identifier to install (e.g. `@sentry/nextjs`, or `@sentry/nextjs@^8`) */\n packageName: string;\n alreadyInstalled: boolean;\n askBeforeUpdating?: boolean;\n /** Overrides what is shown in the installation logs in place of the `packageName` option. Useful if the `packageName` is ugly (e.g. `@sentry/nextjs@^8`) */\n packageNameDisplayLabel?: string;\n packageManager?: PackageManager;\n /** Add force install flag to command to skip install precondition fails */\n forceInstall?: boolean;\n}): Promise<{ packageManager?: PackageManager }> {\n return traceStep('install-package', async () => {\n if (alreadyInstalled && askBeforeUpdating) {\n const shouldUpdatePackage = await abortIfCancelled(\n clack.confirm({\n message: `The ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} package is already installed. Do you want to update it to the latest version?`,\n }),\n );\n\n if (!shouldUpdatePackage) {\n return {};\n }\n }\n\n const sdkInstallSpinner = clack.spinner();\n\n const pkgManager = packageManager || (await getPackageManager());\n\n sdkInstallSpinner.start(\n `${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `${pkgManager.installCommand} ${packageName} ${pkgManager.flags} ${\n forceInstall ? pkgManager.forceInstallFlag : ''\n }`,\n (err, stdout, stderr) => {\n if (err) {\n // Write a log file so we can better troubleshoot issues\n fs.writeFileSync(\n join(\n process.cwd(),\n `sentry-wizard-installation-error-${Date.now()}.log`,\n ),\n JSON.stringify({\n stdout,\n stderr,\n }),\n { encoding: 'utf8' },\n );\n\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n sdkInstallSpinner.stop('Installation failed.');\n clack.log.error(\n `${chalk.red(\n 'Encountered the following error during installation:',\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n )}\\n\\n${e}\\n\\n${chalk.dim(\n \"The wizard has created a `sentry-wizard-installation-error-*.log` file. If you think this issue is caused by the Sentry wizard, create an issue on GitHub and include the log file's content:\\nhttps://github.com/getsentry/sentry-wizard/issues\",\n )}`,\n );\n await abort();\n }\n\n sdkInstallSpinner.stop(\n `${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n return { packageManager: pkgManager };\n });\n}\n\nexport async function addSentryCliConfig(\n { authToken, org, project, url }: CliSetupConfigContent,\n setupConfig: CliSetupConfig = rcCliSetupConfig,\n): Promise<void> {\n return traceStep('add-sentry-cli-config', async () => {\n const configPath = join(process.cwd(), setupConfig.filename);\n const configExists = fs.existsSync(configPath);\n\n let configContents =\n (configExists && fs.readFileSync(configPath, 'utf8')) || '';\n configContents = addAuthTokenToSentryConfig(\n configContents,\n authToken,\n setupConfig,\n );\n configContents = addOrgAndProjectToSentryConfig(\n configContents,\n org,\n project,\n setupConfig,\n );\n configContents = addUrlToSentryConfig(configContents, url, setupConfig);\n\n try {\n await fs.promises.writeFile(configPath, configContents, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `${configExists ? 'Saved' : 'Created'} ${chalk.cyan(\n setupConfig.filename,\n )}.`,\n );\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.cyan(\n setupConfig.filename,\n )}. Uploading ${\n setupConfig.name\n } during build will likely not work locally.`,\n );\n }\n\n if (setupConfig.gitignore) {\n await addCliConfigFileToGitIgnore(setupConfig.filename);\n } else {\n clack.log.warn(\n chalk.yellow('DO NOT commit auth token to your repository!'),\n );\n }\n });\n}\n\nfunction addAuthTokenToSentryConfig(\n configContents: string,\n authToken: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!authToken) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasAuthToken(configContents)) {\n clack.log.warn(\n `${chalk.cyan(\n setupConfig.filename,\n )} already has auth token. Will not add one.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.tokenContent(\n authToken,\n )}\\n`;\n clack.log.success(\n `Added auth token to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nfunction addOrgAndProjectToSentryConfig(\n configContents: string,\n org: string | undefined,\n project: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!org || !project) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasOrgAndProject(configContents)) {\n clack.log.warn(\n `${chalk.cyan(\n setupConfig.filename,\n )} already has org and project. Will not add them.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.orgAndProjContent(\n org,\n project,\n )}\\n`;\n clack.log.success(\n `Added default org and project to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nfunction addUrlToSentryConfig(\n configContents: string,\n url: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!url || !setupConfig.urlContent || !setupConfig.likelyAlreadyHasUrl) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasUrl(configContents)) {\n clack.log.warn(\n `${chalk.cyan(setupConfig.filename)} already has url. Will not add one.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.urlContent(url)}\\n`;\n clack.log.success(\n `Added default url to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nexport async function addDotEnvSentryBuildPluginFile(\n authToken: string,\n): Promise<void> {\n const envVarContent = `# DO NOT commit this file to your repository!\n# The SENTRY_AUTH_TOKEN variable is picked up by the Sentry Build Plugin.\n# It's used for authentication when uploading source maps.\n# You can also set this env variable in your own \\`.env\\` files and remove this file.\nSENTRY_AUTH_TOKEN=${authToken}\n`;\n\n const dotEnvFilePath = join(process.cwd(), SENTRY_DOT_ENV_FILE);\n const dotEnvFileExists = fs.existsSync(dotEnvFilePath);\n\n if (dotEnvFileExists) {\n const dotEnvFileContent = fs.readFileSync(dotEnvFilePath, 'utf8');\n\n const hasAuthToken = !!dotEnvFileContent.match(\n /^\\s*SENTRY_AUTH_TOKEN\\s*=/g,\n );\n\n if (hasAuthToken) {\n clack.log.warn(\n `${chalk.bold.cyan(\n SENTRY_DOT_ENV_FILE,\n )} already has auth token. Will not add one.`,\n );\n } else {\n try {\n await fs.promises.writeFile(\n dotEnvFilePath,\n `${dotEnvFileContent}\\n${envVarContent}`,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added auth token to ${chalk.bold.cyan(SENTRY_DOT_ENV_FILE)}`,\n );\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.bold.cyan(\n SENTRY_DOT_ENV_FILE,\n )}. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n } else {\n try {\n await fs.promises.writeFile(dotEnvFilePath, envVarContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `Created ${chalk.bold.cyan(\n SENTRY_DOT_ENV_FILE,\n )} with auth token for you to test source map uploading locally.`,\n );\n } catch {\n clack.log.warning(\n `Failed to create ${chalk.bold.cyan(\n SENTRY_DOT_ENV_FILE,\n )} with auth token. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n\n await addCliConfigFileToGitIgnore(SENTRY_DOT_ENV_FILE);\n}\n\nasync function addCliConfigFileToGitIgnore(filename: string): Promise<void> {\n const gitignorePath = join(process.cwd(), '.gitignore');\n\n try {\n const gitignoreContent = await fs.promises.readFile(gitignorePath, 'utf8');\n if (gitignoreContent.split(/\\r?\\n/).includes(filename)) {\n clack.log.info(\n `${chalk.bold('.gitignore')} already has ${chalk.bold(\n filename,\n )}. Will not add it again.`,\n );\n return;\n }\n\n await fs.promises.appendFile(\n gitignorePath,\n `\\n# Sentry Config File\\n${filename}\\n`,\n { encoding: 'utf8' },\n );\n clack.log.success(\n `Added ${chalk.cyan(filename)} to ${chalk.cyan('.gitignore')}.`,\n );\n } catch {\n clack.log.error(\n `Failed adding ${chalk.cyan(filename)} to ${chalk.cyan(\n '.gitignore',\n )}. Please add it manually!`,\n );\n }\n}\n\nexport async function runPrettierIfInstalled(): Promise<void> {\n return traceStep('run-prettier', async () => {\n if (!isInGitRepo()) {\n // We only run formatting on changed files. If we're not in a git repo, we can't find\n // changed files. So let's early-return without showing any formatting-related messages.\n return;\n }\n\n const changedOrUntrackedFiles = getUncommittedOrUntrackedFiles()\n .map((filename) => {\n return filename.startsWith('- ') ? filename.slice(2) : filename;\n })\n .join(' ');\n\n if (!changedOrUntrackedFiles.length) {\n // Likewise, if we can't find changed or untracked files, there's no point in running Prettier.\n return;\n }\n\n const packageJson = await getPackageDotJson();\n const prettierInstalled = hasPackageInstalled('prettier', packageJson);\n\n Sentry.setTag('prettier-installed', prettierInstalled);\n\n if (!prettierInstalled) {\n return;\n }\n\n // prompt the user if they want to run prettier\n const shouldRunPrettier = await abortIfCancelled(\n clack.confirm({\n message:\n 'Looks like you have Prettier in your project. Do you want to run it on your files?',\n }),\n );\n\n if (!shouldRunPrettier) {\n return;\n }\n\n const prettierSpinner = clack.spinner();\n prettierSpinner.start('Running Prettier on your files.');\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `npx prettier --ignore-unknown --write ${changedOrUntrackedFiles}`,\n (err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n prettierSpinner.stop('Prettier failed to run.');\n clack.log.warn(\n 'Prettier failed to run. There may be formatting issues in your updated files.',\n );\n return;\n }\n\n prettierSpinner.stop('Prettier has formatted your files.');\n });\n}\n\n/**\n * Checks if @param packageId is listed as a dependency in @param packageJson.\n * If not, it will ask users if they want to continue without the package.\n *\n * Use this function to check if e.g. a the framework of the SDK is installed\n *\n * @param packageJson the package.json object\n * @param packageId the npm name of the package\n * @param packageName a human readable name of the package\n */\nexport async function ensurePackageIsInstalled(\n packageJson: PackageDotJson,\n packageId: string,\n packageName: string,\n): Promise<void> {\n return traceStep('ensure-package-installed', async () => {\n const installed = hasPackageInstalled(packageId, packageJson);\n\n Sentry.setTag(`${packageName.toLowerCase()}-installed`, installed);\n\n if (!installed) {\n Sentry.setTag(`${packageName.toLowerCase()}-installed`, false);\n const continueWithoutPackage = await abortIfCancelled(\n clack.confirm({\n message: `${packageName} does not seem to be installed. Do you still want to continue?`,\n initialValue: false,\n }),\n );\n\n if (!continueWithoutPackage) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport async function getPackageDotJson(): Promise<PackageDotJson> {\n const packageJsonFileContents = await fs.promises\n .readFile(join(process.cwd(), 'package.json'), 'utf8')\n .catch(() => {\n clack.log.error(\n 'Could not find package.json. Make sure to run the wizard in the root of your app!',\n );\n return abort();\n });\n\n let packageJson: PackageDotJson | undefined = undefined;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n packageJson = JSON.parse(packageJsonFileContents);\n } catch {\n clack.log.error(\n `Unable to parse your ${chalk.cyan(\n 'package.json',\n )}. Make sure it has a valid format!`,\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\nexport async function updatePackageDotJson(\n packageDotJson: PackageDotJson,\n): Promise<void> {\n try {\n await fs.promises.writeFile(\n join(process.cwd(), 'package.json'),\n // TODO: maybe figure out the original indentation\n JSON.stringify(packageDotJson, null, 2),\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n } catch {\n clack.log.error(`Unable to update your ${chalk.cyan('package.json')}.`);\n\n await abort();\n }\n}\n\nexport async function getPackageManager(): Promise<PackageManager> {\n const detectedPackageManager = detectPackageManger();\n\n if (detectedPackageManager) {\n return detectedPackageManager;\n }\n\n const selectedPackageManager: PackageManager | symbol =\n await abortIfCancelled(\n clack.select({\n message: 'Please select your package manager.',\n options: packageManagers.map((packageManager) => ({\n value: packageManager,\n label: packageManager.label,\n })),\n }),\n );\n\n Sentry.setTag('package-manager', selectedPackageManager.name);\n\n return selectedPackageManager;\n}\n\nexport function isUsingTypeScript() {\n try {\n return fs.existsSync(join(process.cwd(), 'tsconfig.json'));\n } catch {\n return false;\n }\n}\n\n/**\n * Checks if we already got project data from a previous wizard invocation.\n * If yes, this data is returned.\n * Otherwise, we start the login flow and ask the user to select a project.\n *\n * Use this function to get project data for the wizard.\n *\n * @param options wizard options\n * @param platform the platform of the wizard\n * @returns project data (org, project, token, url)\n */\nexport async function getOrAskForProjectData(\n options: WizardOptions,\n platform?:\n | 'javascript-nextjs'\n | 'javascript-nuxt'\n | 'javascript-remix'\n | 'javascript-sveltekit'\n | 'apple-ios'\n | 'android'\n | 'react-native'\n | 'flutter',\n): Promise<{\n sentryUrl: string;\n selfHosted: boolean;\n selectedProject: SentryProjectData;\n authToken: string;\n}> {\n if (options.preSelectedProject) {\n return {\n selfHosted: options.preSelectedProject.selfHosted,\n sentryUrl: options.url ?? SAAS_URL,\n authToken: options.preSelectedProject.authToken,\n selectedProject: options.preSelectedProject.project,\n };\n }\n const { url: sentryUrl, selfHosted } = await traceStep(\n 'ask-self-hosted',\n () => askForSelfHosted(options.url, options.saas),\n );\n\n const { projects, apiKeys } = await traceStep('login', () =>\n askForWizardLogin({\n promoCode: options.promoCode,\n url: sentryUrl,\n platform: platform,\n orgSlug: options.orgSlug,\n projectSlug: options.projectSlug,\n }),\n );\n\n if (!projects || !projects.length) {\n clack.log.error(\n 'No projects found. Please create a project in Sentry and try again.',\n );\n Sentry.setTag('no-projects-found', true);\n await abort();\n // This rejection won't return due to the abort call but TS doesn't know that\n return Promise.reject();\n }\n\n const selectedProject = await traceStep('select-project', () =>\n askForProjectSelection(projects, options.orgSlug, options.projectSlug),\n );\n\n const { token } = apiKeys ?? {};\n\n if (!token) {\n clack.log.error(`Didn't receive an auth token. This shouldn't happen :(\n\nPlease let us know if you think this is a bug in the wizard:\n${chalk.cyan('https://github.com/getsentry/sentry-wizard/issues')}`);\n\n clack.log.info(`In the meantime, we'll add a dummy auth token (${chalk.cyan(\n `\"${DUMMY_AUTH_TOKEN}\"`,\n )}) for you to replace later.\nCreate your auth token here:\n${chalk.cyan(\n selfHosted\n ? `${sentryUrl}organizations/${selectedProject.organization.slug}/settings/auth-tokens`\n : `https://${selectedProject.organization.slug}.sentry.io/settings/auth-tokens`,\n)}`);\n }\n\n return {\n sentryUrl,\n selfHosted,\n authToken: apiKeys?.token || DUMMY_AUTH_TOKEN,\n selectedProject,\n };\n}\n\n/**\n * Asks users if they are using SaaS or self-hosted Sentry and returns the validated URL.\n *\n * If users started the wizard with a --url arg, that URL is used as the default and we skip\n * the self-hosted question. However, the passed url is still validated and in case it's\n * invalid, users are asked to enter a new one until it is valid.\n *\n * @param urlFromArgs the url passed via the --url arg\n */\nasync function askForSelfHosted(\n urlFromArgs?: string,\n saas?: boolean,\n): Promise<{\n url: string;\n selfHosted: boolean;\n}> {\n if (saas) {\n Sentry.setTag('url', SAAS_URL);\n Sentry.setTag('self-hosted', false);\n return { url: SAAS_URL, selfHosted: false };\n }\n\n if (!urlFromArgs) {\n const choice: 'saas' | 'self-hosted' | symbol = await abortIfCancelled(\n clack.select({\n message: 'Are you using Sentry SaaS or self-hosted Sentry?',\n options: [\n { value: 'saas', label: 'Sentry SaaS (sentry.io)' },\n {\n value: 'self-hosted',\n label: 'Self-hosted/on-premise/single-tenant',\n },\n ],\n }),\n );\n\n if (choice === 'saas') {\n Sentry.setTag('url', SAAS_URL);\n Sentry.setTag('self-hosted', false);\n return { url: SAAS_URL, selfHosted: false };\n }\n }\n\n let validUrl: string | undefined;\n let tmpUrlFromArgs = urlFromArgs;\n\n while (validUrl === undefined) {\n const url =\n tmpUrlFromArgs ||\n (await abortIfCancelled(\n clack.text({\n message: `Please enter the URL of your ${\n urlFromArgs ? '' : 'self-hosted '\n }Sentry instance.`,\n placeholder: 'https://sentry.io/',\n }),\n ));\n tmpUrlFromArgs = undefined;\n\n try {\n validUrl = new URL(url).toString();\n\n // We assume everywhere else that the URL ends in a slash\n if (!validUrl.endsWith('/')) {\n validUrl += '/';\n }\n } catch {\n clack.log.error(\n `Please enter a valid URL. (It should look something like \"https://sentry.mydomain.com/\", got ${url})`,\n );\n }\n }\n\n const isSelfHostedUrl = new URL(validUrl).host !== new URL(SAAS_URL).host;\n\n Sentry.setTag('url', validUrl);\n Sentry.setTag('self-hosted', isSelfHostedUrl);\n\n return { url: validUrl, selfHosted: true };\n}\n\nasync function askForWizardLogin(options: {\n url: string;\n promoCode?: string;\n platform?:\n | 'javascript-nextjs'\n | 'javascript-nuxt'\n | 'javascript-remix'\n | 'javascript-sveltekit'\n | 'apple-ios'\n | 'android'\n | 'react-native'\n | 'flutter';\n orgSlug?: string;\n projectSlug?: string;\n}): Promise<WizardProjectData> {\n Sentry.setTag('has-promo-code', !!options.promoCode);\n\n let hasSentryAccount = await clack.confirm({\n message: 'Do you already have a Sentry account?',\n });\n\n hasSentryAccount = await abortIfCancelled(hasSentryAccount);\n\n Sentry.setTag('already-has-sentry-account', hasSentryAccount);\n\n let wizardHash: string;\n try {\n wizardHash = (\n await axios.get<{ hash: string }>(`${options.url}api/0/wizard/`)\n ).data.hash;\n } catch (e: unknown) {\n if (options.url !== SAAS_URL) {\n clack.log.error('Loading Wizard failed. Did you provide the right URL?');\n clack.log.info(JSON.stringify(e, null, 2));\n await abort(\n chalk.red(\n 'Please check your configuration and try again.\\n\\n Let us know if you think this is an issue with the wizard or Sentry: https://github.com/getsentry/sentry-wizard/issues',\n ),\n );\n } else {\n clack.log.error('Loading Wizard failed.');\n clack.log.info(JSON.stringify(e, null, 2));\n await abort(\n chalk.red(\n 'Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues',\n ),\n );\n }\n }\n\n const loginUrl = new URL(\n `${options.url}account/settings/wizard/${wizardHash!}/`,\n );\n\n if (options.orgSlug) {\n loginUrl.searchParams.set('org_slug', options.orgSlug);\n }\n\n if (options.projectSlug) {\n loginUrl.searchParams.set('project_slug', options.projectSlug);\n }\n\n if (!hasSentryAccount) {\n loginUrl.searchParams.set('signup', '1');\n }\n\n if (options.platform) {\n loginUrl.searchParams.set('project_platform', options.platform);\n }\n\n if (options.promoCode) {\n loginUrl.searchParams.set('code', options.promoCode);\n }\n\n const urlToOpen = loginUrl.toString();\n clack.log.info(\n `${chalk.bold(\n `If the browser window didn't open automatically, please open the following link to ${\n hasSentryAccount ? 'log' : 'sign'\n } into Sentry:`,\n )}\\n\\n${chalk.cyan(urlToOpen)}`,\n );\n\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n const noop = () => {}; // eslint-disable-line @typescript-eslint/no-empty-function\n opn(urlToOpen, { wait: false }).then((cp) => cp.on('error', noop), noop);\n\n const loginSpinner = clack.spinner();\n\n loginSpinner.start('Waiting for you to log in using the link above');\n\n const data = await new Promise<WizardProjectData>((resolve) => {\n const pollingInterval = setInterval(() => {\n axios\n .get<WizardProjectData>(`${options.url}api/0/wizard/${wizardHash}/`, {\n headers: {\n 'Accept-Encoding': 'deflate',\n },\n })\n .then((result) => {\n resolve(result.data);\n clearTimeout(timeout);\n clearInterval(pollingInterval);\n void axios.delete(`${options.url}api/0/wizard/${wizardHash}/`);\n })\n .catch(() => {\n // noop - just try again\n });\n }, 500);\n\n const timeout = setTimeout(() => {\n clearInterval(pollingInterval);\n loginSpinner.stop(\n 'Login timed out. No worries - it happens to the best of us.',\n );\n\n Sentry.setTag('opened-wizard-link', false);\n void abort('Please restart the Wizard and log in to complete the setup.');\n }, 180_000);\n });\n\n loginSpinner.stop('Login complete.');\n Sentry.setTag('opened-wizard-link', true);\n\n return data;\n}\n\nasync function askForProjectSelection(\n projects: SentryProjectData[],\n orgSlug?: string,\n projectSlug?: string,\n): Promise<SentryProjectData> {\n const label = (project: SentryProjectData): string => {\n return `${project.organization.slug}/${project.slug}`;\n };\n\n const filteredProjects = filterProjectsBySlugs(\n projects,\n orgSlug,\n projectSlug,\n );\n\n if (filteredProjects.length === 1) {\n const selection = filteredProjects[0];\n\n Sentry.setTag('project', selection.slug);\n Sentry.setUser({ id: selection.organization.slug });\n clack.log.step(`Selected project ${label(selection)}`);\n\n return selection;\n }\n\n if (filteredProjects.length === 0) {\n clack.log.warn('Could not find a project with the provided slugs.');\n }\n\n const sortedProjects = filteredProjects.length ? filteredProjects : projects;\n sortedProjects.sort((a: SentryProjectData, b: SentryProjectData) => {\n return label(a).localeCompare(label(b));\n });\n\n const selection: SentryProjectData | symbol = await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: 'Select your Sentry project.',\n options: sortedProjects.map((project) => {\n return {\n value: project,\n label: label(project),\n };\n }),\n }),\n );\n\n Sentry.setTag('project', selection.slug);\n Sentry.setUser({ id: selection.organization.slug });\n\n return selection;\n}\n\nfunction filterProjectsBySlugs(\n projects: SentryProjectData[],\n orgSlug?: string,\n projectSlug?: string,\n): SentryProjectData[] {\n if (!orgSlug && !projectSlug) {\n return projects;\n }\n if (orgSlug && !projectSlug) {\n return projects.filter((p) => p.organization.slug === orgSlug);\n }\n if (!orgSlug && projectSlug) {\n return projects.filter((p) => p.slug === projectSlug);\n }\n\n return projects.filter(\n (p) => p.organization.slug === orgSlug && p.slug === projectSlug,\n );\n}\n\n/**\n * Asks users if they have a config file for @param tool (e.g. Vite).\n * If yes, asks users to specify the path to their config file.\n *\n * Use this helper function as a fallback mechanism if the lookup for\n * a config file with its most usual location/name fails.\n *\n * @param toolName Name of the tool for which we're looking for the config file\n * @param configFileName Name of the most common config file name (e.g. vite.config.js)\n *\n * @returns a user path to the config file or undefined if the user doesn't have a config file\n */\nexport async function askForToolConfigPath(\n toolName: string,\n configFileName: string,\n): Promise<string | undefined> {\n const hasConfig = await abortIfCancelled(\n clack.confirm({\n message: `Do you have a ${toolName} config file (e.g. ${chalk.cyan(\n configFileName,\n )})?`,\n initialValue: true,\n }),\n );\n\n if (!hasConfig) {\n return undefined;\n }\n\n return await abortIfCancelled(\n clack.text({\n message: `Please enter the path to your ${toolName} config file:`,\n placeholder: join('.', configFileName),\n validate: (value) => {\n if (!value) {\n return 'Please enter a path.';\n }\n\n try {\n fs.accessSync(value);\n } catch {\n return 'Could not access the file at this path.';\n }\n },\n }),\n );\n}\n\n/**\n * Prints copy/paste-able instructions to the console.\n * Afterwards asks the user if they added the code snippet to their file.\n *\n * While there's no point in providing a \"no\" answer here, it gives users time to fulfill the\n * task before the wizard continues with additional steps.\n *\n * Use this function if you want to show users instructions on how to add/modify\n * code in their file. This is helpful if automatic insertion failed or is not possible/feasible.\n *\n * @param filename the name of the file to which the code snippet should be applied.\n * If a path is provided, only the filename will be used.\n *\n * @param codeSnippet the snippet to be printed. Use {@link makeCodeSnippet} to create the\n * diff-like format for visually highlighting unchanged or modified lines of code.\n *\n * @param hint (optional) a hint to be printed after the main instruction to add\n * the code from @param codeSnippet to their @param filename.\n *\n * More guidelines on copy/paste instructions:\n * @see {@link https://develop.sentry.dev/sdk/setup-wizards/#copy--paste-snippets}\n *\n * TODO: refactor copy paste instructions across different wizards to use this function.\n * this might require adding a custom message parameter to the function\n */\nexport async function showCopyPasteInstructions(\n filename: string,\n codeSnippet: string,\n hint?: string,\n): Promise<void> {\n clack.log.step(\n `Add the following code to your ${chalk.cyan(basename(filename))} file:${\n hint ? chalk.dim(` (${chalk.dim(hint)})`) : ''\n }`,\n );\n\n // Padding the code snippet to be printed with a \\n at the beginning and end\n // This makes it easier to distinguish the snippet from the rest of the output\n // Intentionally logging directly to console here so that the code can be copied/pasted directly\n // eslint-disable-next-line no-console\n console.log(`\\n${codeSnippet}\\n`);\n\n await abortIfCancelled(\n clack.select({\n message: 'Did you apply the snippet above?',\n options: [{ label: 'Yes, continue!', value: true }],\n initialValue: true,\n }),\n );\n}\n\n/**\n * Callback that exposes formatting helpers for a code snippet.\n * @param unchanged - Formats text as old code.\n * @param plus - Formats text as new code.\n * @param minus - Formats text as removed code.\n */\ntype CodeSnippetFormatter = (\n unchanged: (txt: string) => string,\n plus: (txt: string) => string,\n minus: (txt: string) => string,\n) => string;\n\n/**\n * Crafts a code snippet that can be used to e.g.\n * - print copy/paste instructions to the console\n * - create a new config file.\n *\n * @param colors set this to true if you want the final snippet to be colored.\n * This is useful for printing the snippet to the console as part of copy/paste instructions.\n *\n * @param callback the callback that returns the formatted code snippet.\n * It exposes takes the helper functions for marking code as unchanged, new or removed.\n * These functions no-op if no special formatting should be applied\n * and otherwise apply the appropriate formatting/coloring.\n * (@see {@link CodeSnippetFormatter})\n *\n * @see {@link showCopyPasteInstructions} for the helper with which to display the snippet in the console.\n *\n * @returns a string containing the final, formatted code snippet.\n */\nexport function makeCodeSnippet(\n colors: boolean,\n callback: CodeSnippetFormatter,\n): string {\n const unchanged = (txt: string) => (colors ? chalk.grey(txt) : txt);\n const plus = (txt: string) => (colors ? chalk.greenBright(txt) : txt);\n const minus = (txt: string) => (colors ? chalk.redBright(txt) : txt);\n\n return callback(unchanged, plus, minus);\n}\n\n/**\n * Creates a new config file with the given @param filepath and @param codeSnippet.\n *\n * Use this function to create a new config file for users. This is useful\n * when users answered that they don't yet have a config file for a tool.\n *\n * (This doesn't mean that they don't yet have some other way of configuring\n * their tool but we can leave it up to them to figure out how to merge configs\n * here.)\n *\n * @param filepath absolute path to the new config file\n * @param codeSnippet the snippet to be inserted into the file\n * @param moreInformation (optional) the message to be printed after the file was created\n * For example, this can be a link to more information about configuring the tool.\n *\n * @returns true on success, false otherwise\n */\nexport async function createNewConfigFile(\n filepath: string,\n codeSnippet: string,\n moreInformation?: string,\n): Promise<boolean> {\n if (!isAbsolute(filepath)) {\n debug(`createNewConfigFile: filepath is not absolute: ${filepath}`);\n return false;\n }\n\n const prettyFilename = chalk.cyan(relative(process.cwd(), filepath));\n\n try {\n await fs.promises.writeFile(filepath, codeSnippet);\n\n clack.log.success(`Added new ${prettyFilename} file.`);\n\n if (moreInformation) {\n clack.log.info(chalk.gray(moreInformation));\n }\n\n return true;\n } catch (e) {\n debug(e);\n clack.log.warn(\n `Could not create a new ${prettyFilename} file. Please create one manually and follow the instructions below.`,\n );\n }\n\n return false;\n}\n\nexport async function askShouldCreateExamplePage(\n customRoute?: string,\n): Promise<boolean> {\n const route = chalk.cyan(customRoute ?? '/sentry-example-page');\n return traceStep('ask-create-example-page', () =>\n abortIfCancelled(\n clack.select({\n message: `Do you want to create an example page (\"${route}\") to test your Sentry setup?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Recommended - Check your git status before committing!',\n },\n { value: false, label: 'No' },\n ],\n }),\n ),\n );\n}\n\nexport async function askShouldCreateExampleComponent(): Promise<boolean> {\n return traceStep('ask-create-example-component', () =>\n abortIfCancelled(\n clack.select({\n message: `Do you want to create an example component to test your Sentry setup?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Recommended - Check your git status before committing!',\n },\n { value: false, label: 'No' },\n ],\n }),\n ),\n );\n}\n\nexport async function featureSelectionPrompt<F extends ReadonlyArray<Feature>>(\n features: F,\n): Promise<{ [key in F[number]['id']]: boolean }> {\n return traceStep('feature-selection', async () => {\n const selectedFeatures: Record<string, boolean> = {};\n\n for (const feature of features) {\n const selected = await abortIfCancelled(\n clack.select({\n message: feature.prompt,\n initialValue: true,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: feature.enabledHint,\n },\n {\n value: false,\n label: 'No',\n hint: feature.disabledHint,\n },\n ],\n }),\n );\n\n selectedFeatures[feature.id] = selected;\n }\n\n return selectedFeatures as { [key in F[number]['id']]: boolean };\n });\n}\n\nexport async function askShouldInstallPackage(\n pkgName: string,\n): Promise<boolean> {\n return traceStep(`ask-install-package`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to install ${chalk.cyan(pkgName)}?`,\n }),\n ),\n );\n}\n\nexport async function askShouldAddPackageOverride(\n pkgName: string,\n pkgVersion: string,\n): Promise<boolean> {\n return traceStep(`ask-add-package-override`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to add an override for ${chalk.cyan(\n pkgName,\n )} version ${chalk.cyan(pkgVersion)}?`,\n }),\n ),\n );\n}\n"]}
1
+ {"version":3,"file":"clack-utils.js","sourceRoot":"","sources":["../../../src/utils/clack-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as childProcess from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport { basename, isAbsolute, join, relative } from 'node:path';\nimport { setInterval } from 'node:timers';\nimport { URL } from 'node:url';\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport * as Sentry from '@sentry/node';\nimport axios from 'axios';\nimport chalk from 'chalk';\nimport opn from 'opn';\nimport { traceStep } from '../telemetry';\nimport { debug } from './debug';\nimport { type PackageDotJson, hasPackageInstalled } from './package-json';\nimport {\n type PackageManager,\n detectPackageManger,\n packageManagers,\n} from './package-manager';\nimport { fulfillsVersionRange } from './semver';\nimport type { Feature, SentryProjectData, WizardOptions } from './types';\nimport { WIZARD_VERSION } from '../version';\n\nexport const SENTRY_DOT_ENV_FILE = '.env.sentry-build-plugin';\nexport const SENTRY_CLI_RC_FILE = '.sentryclirc';\nexport const SENTRY_PROPERTIES_FILE = 'sentry.properties';\n\nconst SAAS_URL = 'https://sentry.io/';\n\nconst DUMMY_AUTH_TOKEN = '_YOUR_SENTRY_AUTH_TOKEN_';\n\ninterface WizardProjectData {\n apiKeys?: {\n token?: string;\n };\n projects?: SentryProjectData[];\n}\n\nexport interface CliSetupConfig {\n filename: string;\n name: string;\n gitignore: boolean;\n\n likelyAlreadyHasAuthToken(contents: string): boolean;\n tokenContent(authToken: string): string;\n\n likelyAlreadyHasOrgAndProject(contents: string): boolean;\n orgAndProjContent(org: string, project: string): string;\n\n likelyAlreadyHasUrl?(contents: string): boolean;\n urlContent?(url: string): string;\n}\n\nexport interface CliSetupConfigContent {\n authToken: string;\n org?: string;\n project?: string;\n url?: string;\n}\n\nexport const rcCliSetupConfig: CliSetupConfig = {\n filename: SENTRY_CLI_RC_FILE,\n name: 'source maps',\n gitignore: true,\n likelyAlreadyHasAuthToken: function (contents: string): boolean {\n return !!(contents.includes('[auth]') && contents.match(/token=./g));\n },\n tokenContent: function (authToken: string): string {\n return `[auth]\\ntoken=${authToken}`;\n },\n likelyAlreadyHasOrgAndProject: function (contents: string): boolean {\n return !!(\n contents.includes('[defaults]') &&\n contents.match(/org=./g) &&\n contents.match(/project=./g)\n );\n },\n orgAndProjContent: function (org: string, project: string): string {\n return `[defaults]\\norg=${org}\\nproject=${project}`;\n },\n};\n\nexport const propertiesCliSetupConfig: Required<CliSetupConfig> = {\n filename: SENTRY_PROPERTIES_FILE,\n gitignore: true,\n name: 'debug files',\n likelyAlreadyHasAuthToken(contents: string): boolean {\n return !!contents.match(/auth\\.token=./g);\n },\n tokenContent(authToken: string): string {\n return `auth.token=${authToken}`;\n },\n likelyAlreadyHasOrgAndProject(contents: string): boolean {\n return !!(\n contents.match(/defaults\\.org=./g) &&\n contents.match(/defaults\\.project=./g)\n );\n },\n orgAndProjContent(org: string, project: string): string {\n return `defaults.org=${org}\\ndefaults.project=${project}`;\n },\n likelyAlreadyHasUrl(contents: string): boolean {\n return !!contents.match(/defaults\\.url=./g);\n },\n urlContent(url: string): string {\n return `defaults.url=${url}`;\n },\n};\n\nexport async function abort(message?: string, status?: number): Promise<never> {\n clack.outro(message ?? 'Wizard setup cancelled.');\n const sentryHub = Sentry.getCurrentHub();\n const sentryTransaction = sentryHub.getScope().getTransaction();\n sentryTransaction?.setStatus('aborted');\n sentryTransaction?.finish();\n const sentrySession = sentryHub.getScope().getSession();\n if (sentrySession) {\n sentrySession.status = status === 0 ? 'abnormal' : 'crashed';\n sentryHub.captureSession(true);\n }\n await Sentry.flush(3000);\n return process.exit(status ?? 1);\n}\n\nexport async function abortIfCancelled<T>(\n input: T | Promise<T>,\n): Promise<Exclude<T, symbol>> {\n if (clack.isCancel(await input)) {\n clack.cancel('Wizard setup cancelled.');\n const sentryHub = Sentry.getCurrentHub();\n const sentryTransaction = sentryHub.getScope().getTransaction();\n sentryTransaction?.setStatus('cancelled');\n sentryTransaction?.finish();\n sentryHub.captureSession(true);\n await Sentry.flush(3000);\n process.exit(0);\n } else {\n return input as Exclude<T, symbol>;\n }\n}\n\nexport function printWelcome(options: {\n wizardName: string;\n promoCode?: string;\n message?: string;\n telemetryEnabled?: boolean;\n}): void {\n // eslint-disable-next-line no-console\n console.log('');\n clack.intro(chalk.inverse(` ${options.wizardName} `));\n\n let welcomeText =\n options.message ||\n `The ${options.wizardName} will help you set up Sentry for your application.\\nThank you for using Sentry :)`;\n\n if (options.promoCode) {\n welcomeText = `${welcomeText}\\n\\nUsing promo-code: ${options.promoCode}`;\n }\n\n welcomeText = `${welcomeText}\\n\\nVersion: ${WIZARD_VERSION}`;\n\n if (options.telemetryEnabled) {\n welcomeText = `${welcomeText}\n\nThis wizard sends telemetry data and crash reports to Sentry. This helps us improve the Wizard.\nYou can turn this off at any time by running ${chalk.cyanBright(\n 'sentry-wizard --disable-telemetry',\n )}.`;\n }\n\n clack.note(welcomeText);\n}\n\nexport async function confirmContinueIfNoOrDirtyGitRepo(): Promise<void> {\n return traceStep('check-git-status', async () => {\n if (!isInGitRepo()) {\n const continueWithoutGit = await abortIfCancelled(\n clack.confirm({\n message:\n 'You are not inside a git repository. The wizard will create and update files. Do you want to continue anyway?',\n }),\n );\n\n Sentry.setTag('continue-without-git', continueWithoutGit);\n\n if (!continueWithoutGit) {\n await abort(undefined, 0);\n }\n // return early to avoid checking for uncommitted files\n return;\n }\n\n const uncommittedOrUntrackedFiles = getUncommittedOrUntrackedFiles();\n if (uncommittedOrUntrackedFiles.length) {\n clack.log.warn(\n `You have uncommitted or untracked files in your repo:\n\n${uncommittedOrUntrackedFiles.join('\\n')}\n\nThe wizard will create and update files.`,\n );\n const continueWithDirtyRepo = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n\n Sentry.setTag('continue-with-dirty-repo', continueWithDirtyRepo);\n\n if (!continueWithDirtyRepo) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport function isInGitRepo() {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getUncommittedOrUntrackedFiles(): string[] {\n try {\n const gitStatus = childProcess\n .execSync('git status --porcelain=v1', {\n // we only care about stdout\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString();\n\n const files = gitStatus\n .split(os.EOL)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((f) => `- ${f.split(/\\s+/)[1]}`);\n\n return files;\n } catch {\n return [];\n }\n}\n\nexport async function askToInstallSentryCLI(): Promise<boolean> {\n return await abortIfCancelled(\n clack.confirm({\n message:\n \"You don't have Sentry CLI installed. Do you want to install it?\",\n }),\n );\n}\n\nexport async function askForItemSelection(\n items: string[],\n message: string,\n): Promise<{ value: string; index: number }> {\n const selection: { value: string; index: number } | symbol =\n await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: message,\n options: items.map((item, index) => {\n return {\n value: { value: item, index: index },\n label: item,\n };\n }),\n }),\n );\n\n return selection;\n}\n\nexport async function confirmContinueIfPackageVersionNotSupported({\n packageId,\n packageName,\n packageVersion,\n acceptableVersions,\n note,\n}: {\n packageId: string;\n packageName: string;\n packageVersion: string;\n acceptableVersions: string;\n note?: string;\n}): Promise<void> {\n return traceStep(`check-package-version`, async () => {\n Sentry.setTag(`${packageName.toLowerCase()}-version`, packageVersion);\n const isSupportedVersion = fulfillsVersionRange({\n acceptableVersions,\n version: packageVersion,\n canBeLatest: true,\n });\n\n if (isSupportedVersion) {\n Sentry.setTag(`${packageName.toLowerCase()}-supported`, true);\n return;\n }\n\n clack.log.warn(\n `You have an unsupported version of ${packageName} installed:\n\n ${packageId}@${packageVersion}`,\n );\n\n clack.note(\n note ??\n `Please upgrade to ${acceptableVersions} if you wish to use the Sentry Wizard.`,\n );\n const continueWithUnsupportedVersion = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n Sentry.setTag(\n `${packageName.toLowerCase()}-continue-with-unsupported-version`,\n continueWithUnsupportedVersion,\n );\n\n if (!continueWithUnsupportedVersion) {\n await abort(undefined, 0);\n }\n });\n}\n\n/**\n * Installs or updates a package with the user's package manager.\n *\n * IMPORTANT: This function modifies the `package.json`! Be sure to re-read\n * it if you make additional modifications to it after calling this function!\n */\nexport async function installPackage({\n packageName,\n alreadyInstalled,\n askBeforeUpdating = true,\n packageNameDisplayLabel,\n packageManager,\n forceInstall = false,\n}: {\n /** The string that is passed to the package manager CLI as identifier to install (e.g. `@sentry/nextjs`, or `@sentry/nextjs@^8`) */\n packageName: string;\n alreadyInstalled: boolean;\n askBeforeUpdating?: boolean;\n /** Overrides what is shown in the installation logs in place of the `packageName` option. Useful if the `packageName` is ugly (e.g. `@sentry/nextjs@^8`) */\n packageNameDisplayLabel?: string;\n packageManager?: PackageManager;\n /** Add force install flag to command to skip install precondition fails */\n forceInstall?: boolean;\n}): Promise<{ packageManager?: PackageManager }> {\n return traceStep('install-package', async () => {\n if (alreadyInstalled && askBeforeUpdating) {\n const shouldUpdatePackage = await abortIfCancelled(\n clack.confirm({\n message: `The ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} package is already installed. Do you want to update it to the latest version?`,\n }),\n );\n\n if (!shouldUpdatePackage) {\n return {};\n }\n }\n\n const sdkInstallSpinner = clack.spinner();\n\n const pkgManager = packageManager || (await getPackageManager());\n\n sdkInstallSpinner.start(\n `${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `${pkgManager.installCommand} ${packageName} ${pkgManager.flags} ${\n forceInstall ? pkgManager.forceInstallFlag : ''\n }`,\n (err, stdout, stderr) => {\n if (err) {\n // Write a log file so we can better troubleshoot issues\n fs.writeFileSync(\n join(\n process.cwd(),\n `sentry-wizard-installation-error-${Date.now()}.log`,\n ),\n JSON.stringify({\n stdout,\n stderr,\n }),\n { encoding: 'utf8' },\n );\n\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n sdkInstallSpinner.stop('Installation failed.');\n clack.log.error(\n `${chalk.red(\n 'Encountered the following error during installation:',\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n )}\\n\\n${e}\\n\\n${chalk.dim(\n \"The wizard has created a `sentry-wizard-installation-error-*.log` file. If you think this issue is caused by the Sentry wizard, create an issue on GitHub and include the log file's content:\\nhttps://github.com/getsentry/sentry-wizard/issues\",\n )}`,\n );\n await abort();\n }\n\n sdkInstallSpinner.stop(\n `${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n return { packageManager: pkgManager };\n });\n}\n\nexport async function addSentryCliConfig(\n { authToken, org, project, url }: CliSetupConfigContent,\n setupConfig: CliSetupConfig = rcCliSetupConfig,\n): Promise<void> {\n return traceStep('add-sentry-cli-config', async () => {\n const configPath = join(process.cwd(), setupConfig.filename);\n const configExists = fs.existsSync(configPath);\n\n let configContents =\n (configExists && fs.readFileSync(configPath, 'utf8')) || '';\n configContents = addAuthTokenToSentryConfig(\n configContents,\n authToken,\n setupConfig,\n );\n configContents = addOrgAndProjectToSentryConfig(\n configContents,\n org,\n project,\n setupConfig,\n );\n configContents = addUrlToSentryConfig(configContents, url, setupConfig);\n\n try {\n await fs.promises.writeFile(configPath, configContents, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `${configExists ? 'Saved' : 'Created'} ${chalk.cyan(\n setupConfig.filename,\n )}.`,\n );\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.cyan(\n setupConfig.filename,\n )}. Uploading ${\n setupConfig.name\n } during build will likely not work locally.`,\n );\n }\n\n if (setupConfig.gitignore) {\n await addCliConfigFileToGitIgnore(setupConfig.filename);\n } else {\n clack.log.warn(\n chalk.yellow('DO NOT commit auth token to your repository!'),\n );\n }\n });\n}\n\nfunction addAuthTokenToSentryConfig(\n configContents: string,\n authToken: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!authToken) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasAuthToken(configContents)) {\n clack.log.warn(\n `${chalk.cyan(\n setupConfig.filename,\n )} already has auth token. Will not add one.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.tokenContent(\n authToken,\n )}\\n`;\n clack.log.success(\n `Added auth token to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nfunction addOrgAndProjectToSentryConfig(\n configContents: string,\n org: string | undefined,\n project: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!org || !project) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasOrgAndProject(configContents)) {\n clack.log.warn(\n `${chalk.cyan(\n setupConfig.filename,\n )} already has org and project. Will not add them.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.orgAndProjContent(\n org,\n project,\n )}\\n`;\n clack.log.success(\n `Added default org and project to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nfunction addUrlToSentryConfig(\n configContents: string,\n url: string | undefined,\n setupConfig: CliSetupConfig,\n): string {\n if (!url || !setupConfig.urlContent || !setupConfig.likelyAlreadyHasUrl) {\n return configContents;\n }\n\n if (setupConfig.likelyAlreadyHasUrl(configContents)) {\n clack.log.warn(\n `${chalk.cyan(setupConfig.filename)} already has url. Will not add one.`,\n );\n return configContents;\n }\n\n const newContents = `${configContents}\\n${setupConfig.urlContent(url)}\\n`;\n clack.log.success(\n `Added default url to ${chalk.cyan(\n setupConfig.filename,\n )} for you to test uploading ${setupConfig.name} locally.`,\n );\n return newContents;\n}\n\nexport async function addDotEnvSentryBuildPluginFile(\n authToken: string,\n): Promise<void> {\n const envVarContent = `# DO NOT commit this file to your repository!\n# The SENTRY_AUTH_TOKEN variable is picked up by the Sentry Build Plugin.\n# It's used for authentication when uploading source maps.\n# You can also set this env variable in your own \\`.env\\` files and remove this file.\nSENTRY_AUTH_TOKEN=${authToken}\n`;\n\n const dotEnvFilePath = join(process.cwd(), SENTRY_DOT_ENV_FILE);\n const dotEnvFileExists = fs.existsSync(dotEnvFilePath);\n\n if (dotEnvFileExists) {\n const dotEnvFileContent = fs.readFileSync(dotEnvFilePath, 'utf8');\n\n const hasAuthToken = !!dotEnvFileContent.match(\n /^\\s*SENTRY_AUTH_TOKEN\\s*=/g,\n );\n\n if (hasAuthToken) {\n clack.log.warn(\n `${chalk.bold.cyan(\n SENTRY_DOT_ENV_FILE,\n )} already has auth token. Will not add one.`,\n );\n } else {\n try {\n await fs.promises.writeFile(\n dotEnvFilePath,\n `${dotEnvFileContent}\\n${envVarContent}`,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added auth token to ${chalk.bold.cyan(SENTRY_DOT_ENV_FILE)}`,\n );\n } catch {\n clack.log.warning(\n `Failed to add auth token to ${chalk.bold.cyan(\n SENTRY_DOT_ENV_FILE,\n )}. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n } else {\n try {\n await fs.promises.writeFile(dotEnvFilePath, envVarContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `Created ${chalk.bold.cyan(\n SENTRY_DOT_ENV_FILE,\n )} with auth token for you to test source map uploading locally.`,\n );\n } catch {\n clack.log.warning(\n `Failed to create ${chalk.bold.cyan(\n SENTRY_DOT_ENV_FILE,\n )} with auth token. Uploading source maps during build will likely not work locally.`,\n );\n }\n }\n\n await addCliConfigFileToGitIgnore(SENTRY_DOT_ENV_FILE);\n}\n\nasync function addCliConfigFileToGitIgnore(filename: string): Promise<void> {\n const gitignorePath = join(process.cwd(), '.gitignore');\n\n try {\n const gitignoreContent = await fs.promises.readFile(gitignorePath, 'utf8');\n if (gitignoreContent.split(/\\r?\\n/).includes(filename)) {\n clack.log.info(\n `${chalk.bold('.gitignore')} already has ${chalk.bold(\n filename,\n )}. Will not add it again.`,\n );\n return;\n }\n\n await fs.promises.appendFile(\n gitignorePath,\n `\\n# Sentry Config File\\n${filename}\\n`,\n { encoding: 'utf8' },\n );\n clack.log.success(\n `Added ${chalk.cyan(filename)} to ${chalk.cyan('.gitignore')}.`,\n );\n } catch {\n clack.log.error(\n `Failed adding ${chalk.cyan(filename)} to ${chalk.cyan(\n '.gitignore',\n )}. Please add it manually!`,\n );\n }\n}\n\nexport async function runPrettierIfInstalled(): Promise<void> {\n return traceStep('run-prettier', async () => {\n if (!isInGitRepo()) {\n // We only run formatting on changed files. If we're not in a git repo, we can't find\n // changed files. So let's early-return without showing any formatting-related messages.\n return;\n }\n\n const changedOrUntrackedFiles = getUncommittedOrUntrackedFiles()\n .map((filename) => {\n return filename.startsWith('- ') ? filename.slice(2) : filename;\n })\n .join(' ');\n\n if (!changedOrUntrackedFiles.length) {\n // Likewise, if we can't find changed or untracked files, there's no point in running Prettier.\n return;\n }\n\n const packageJson = await getPackageDotJson();\n const prettierInstalled = hasPackageInstalled('prettier', packageJson);\n\n Sentry.setTag('prettier-installed', prettierInstalled);\n\n if (!prettierInstalled) {\n return;\n }\n\n // prompt the user if they want to run prettier\n const shouldRunPrettier = await abortIfCancelled(\n clack.confirm({\n message:\n 'Looks like you have Prettier in your project. Do you want to run it on your files?',\n }),\n );\n\n if (!shouldRunPrettier) {\n return;\n }\n\n const prettierSpinner = clack.spinner();\n prettierSpinner.start('Running Prettier on your files.');\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `npx prettier --ignore-unknown --write ${changedOrUntrackedFiles}`,\n (err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n prettierSpinner.stop('Prettier failed to run.');\n clack.log.warn(\n 'Prettier failed to run. There may be formatting issues in your updated files.',\n );\n return;\n }\n\n prettierSpinner.stop('Prettier has formatted your files.');\n });\n}\n\n/**\n * Checks if @param packageId is listed as a dependency in @param packageJson.\n * If not, it will ask users if they want to continue without the package.\n *\n * Use this function to check if e.g. a the framework of the SDK is installed\n *\n * @param packageJson the package.json object\n * @param packageId the npm name of the package\n * @param packageName a human readable name of the package\n */\nexport async function ensurePackageIsInstalled(\n packageJson: PackageDotJson,\n packageId: string,\n packageName: string,\n): Promise<void> {\n return traceStep('ensure-package-installed', async () => {\n const installed = hasPackageInstalled(packageId, packageJson);\n\n Sentry.setTag(`${packageName.toLowerCase()}-installed`, installed);\n\n if (!installed) {\n Sentry.setTag(`${packageName.toLowerCase()}-installed`, false);\n const continueWithoutPackage = await abortIfCancelled(\n clack.confirm({\n message: `${packageName} does not seem to be installed. Do you still want to continue?`,\n initialValue: false,\n }),\n );\n\n if (!continueWithoutPackage) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport async function getPackageDotJson(): Promise<PackageDotJson> {\n const packageJsonFileContents = await fs.promises\n .readFile(join(process.cwd(), 'package.json'), 'utf8')\n .catch(() => {\n clack.log.error(\n 'Could not find package.json. Make sure to run the wizard in the root of your app!',\n );\n return abort();\n });\n\n let packageJson: PackageDotJson | undefined = undefined;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n packageJson = JSON.parse(packageJsonFileContents);\n } catch {\n clack.log.error(\n `Unable to parse your ${chalk.cyan(\n 'package.json',\n )}. Make sure it has a valid format!`,\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\nexport async function updatePackageDotJson(\n packageDotJson: PackageDotJson,\n): Promise<void> {\n try {\n await fs.promises.writeFile(\n join(process.cwd(), 'package.json'),\n // TODO: maybe figure out the original indentation\n JSON.stringify(packageDotJson, null, 2),\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n } catch {\n clack.log.error(`Unable to update your ${chalk.cyan('package.json')}.`);\n\n await abort();\n }\n}\n\nexport async function getPackageManager(): Promise<PackageManager> {\n const detectedPackageManager = detectPackageManger();\n\n if (detectedPackageManager) {\n return detectedPackageManager;\n }\n\n const selectedPackageManager: PackageManager | symbol =\n await abortIfCancelled(\n clack.select({\n message: 'Please select your package manager.',\n options: packageManagers.map((packageManager) => ({\n value: packageManager,\n label: packageManager.label,\n })),\n }),\n );\n\n Sentry.setTag('package-manager', selectedPackageManager.name);\n\n return selectedPackageManager;\n}\n\nexport function isUsingTypeScript() {\n try {\n return fs.existsSync(join(process.cwd(), 'tsconfig.json'));\n } catch {\n return false;\n }\n}\n\n/**\n * Checks if we already got project data from a previous wizard invocation.\n * If yes, this data is returned.\n * Otherwise, we start the login flow and ask the user to select a project.\n *\n * Use this function to get project data for the wizard.\n *\n * @param options wizard options\n * @param platform the platform of the wizard\n * @returns project data (org, project, token, url)\n */\nexport async function getOrAskForProjectData(\n options: WizardOptions,\n platform?:\n | 'javascript-nextjs'\n | 'javascript-nuxt'\n | 'javascript-remix'\n | 'javascript-sveltekit'\n | 'apple-ios'\n | 'android'\n | 'react-native'\n | 'flutter',\n): Promise<{\n sentryUrl: string;\n selfHosted: boolean;\n selectedProject: SentryProjectData;\n authToken: string;\n}> {\n if (options.preSelectedProject) {\n return {\n selfHosted: options.preSelectedProject.selfHosted,\n sentryUrl: options.url ?? SAAS_URL,\n authToken: options.preSelectedProject.authToken,\n selectedProject: options.preSelectedProject.project,\n };\n }\n const { url: sentryUrl, selfHosted } = await traceStep(\n 'ask-self-hosted',\n () => askForSelfHosted(options.url, options.saas),\n );\n\n const { projects, apiKeys } = await traceStep('login', () =>\n askForWizardLogin({\n promoCode: options.promoCode,\n url: sentryUrl,\n platform: platform,\n orgSlug: options.orgSlug,\n projectSlug: options.projectSlug,\n }),\n );\n\n if (!projects || !projects.length) {\n clack.log.error(\n 'No projects found. Please create a project in Sentry and try again.',\n );\n Sentry.setTag('no-projects-found', true);\n await abort();\n // This rejection won't return due to the abort call but TS doesn't know that\n return Promise.reject();\n }\n\n const selectedProject = await traceStep('select-project', () =>\n askForProjectSelection(projects, options.orgSlug, options.projectSlug),\n );\n\n const { token } = apiKeys ?? {};\n\n if (!token) {\n clack.log.error(`Didn't receive an auth token. This shouldn't happen :(\n\nPlease let us know if you think this is a bug in the wizard:\n${chalk.cyan('https://github.com/getsentry/sentry-wizard/issues')}`);\n\n clack.log.info(`In the meantime, we'll add a dummy auth token (${chalk.cyan(\n `\"${DUMMY_AUTH_TOKEN}\"`,\n )}) for you to replace later.\nCreate your auth token here:\n${chalk.cyan(\n selfHosted\n ? `${sentryUrl}organizations/${selectedProject.organization.slug}/settings/auth-tokens`\n : `https://${selectedProject.organization.slug}.sentry.io/settings/auth-tokens`,\n)}`);\n }\n\n return {\n sentryUrl,\n selfHosted,\n authToken: apiKeys?.token || DUMMY_AUTH_TOKEN,\n selectedProject,\n };\n}\n\n/**\n * Asks users if they are using SaaS or self-hosted Sentry and returns the validated URL.\n *\n * If users started the wizard with a --url arg, that URL is used as the default and we skip\n * the self-hosted question. However, the passed url is still validated and in case it's\n * invalid, users are asked to enter a new one until it is valid.\n *\n * @param urlFromArgs the url passed via the --url arg\n */\nasync function askForSelfHosted(\n urlFromArgs?: string,\n saas?: boolean,\n): Promise<{\n url: string;\n selfHosted: boolean;\n}> {\n if (saas) {\n Sentry.setTag('url', SAAS_URL);\n Sentry.setTag('self-hosted', false);\n return { url: SAAS_URL, selfHosted: false };\n }\n\n if (!urlFromArgs) {\n const choice: 'saas' | 'self-hosted' | symbol = await abortIfCancelled(\n clack.select({\n message: 'Are you using Sentry SaaS or self-hosted Sentry?',\n options: [\n { value: 'saas', label: 'Sentry SaaS (sentry.io)' },\n {\n value: 'self-hosted',\n label: 'Self-hosted/on-premise/single-tenant',\n },\n ],\n }),\n );\n\n if (choice === 'saas') {\n Sentry.setTag('url', SAAS_URL);\n Sentry.setTag('self-hosted', false);\n return { url: SAAS_URL, selfHosted: false };\n }\n }\n\n let validUrl: string | undefined;\n let tmpUrlFromArgs = urlFromArgs;\n\n while (validUrl === undefined) {\n const url =\n tmpUrlFromArgs ||\n (await abortIfCancelled(\n clack.text({\n message: `Please enter the URL of your ${\n urlFromArgs ? '' : 'self-hosted '\n }Sentry instance.`,\n placeholder: 'https://sentry.io/',\n }),\n ));\n tmpUrlFromArgs = undefined;\n\n try {\n validUrl = new URL(url).toString();\n\n // We assume everywhere else that the URL ends in a slash\n if (!validUrl.endsWith('/')) {\n validUrl += '/';\n }\n } catch {\n clack.log.error(\n `Please enter a valid URL. (It should look something like \"https://sentry.mydomain.com/\", got ${url})`,\n );\n }\n }\n\n const isSelfHostedUrl = new URL(validUrl).host !== new URL(SAAS_URL).host;\n\n Sentry.setTag('url', validUrl);\n Sentry.setTag('self-hosted', isSelfHostedUrl);\n\n return { url: validUrl, selfHosted: true };\n}\n\n/**\n * Exported for testing\n */\nexport async function askForWizardLogin(options: {\n url: string;\n promoCode?: string;\n platform?:\n | 'javascript-nextjs'\n | 'javascript-nuxt'\n | 'javascript-remix'\n | 'javascript-sveltekit'\n | 'apple-ios'\n | 'android'\n | 'react-native'\n | 'flutter';\n orgSlug?: string;\n projectSlug?: string;\n}): Promise<WizardProjectData> {\n const { orgSlug, projectSlug, url, platform, promoCode } = options;\n\n Sentry.setTag('has-promo-code', !!promoCode);\n\n const projectAndOrgPreselected = !!(orgSlug && projectSlug);\n\n const hasSentryAccount =\n projectAndOrgPreselected || (await askHasSentryAccount());\n\n Sentry.setTag('already-has-sentry-account', hasSentryAccount);\n\n const wizardHash = await makeInitialWizardHashRequest(url);\n\n const loginUrl = new URL(`${url}account/settings/wizard/${wizardHash}/`);\n\n if (orgSlug) {\n loginUrl.searchParams.set('org_slug', orgSlug);\n }\n\n if (projectSlug) {\n loginUrl.searchParams.set('project_slug', projectSlug);\n }\n\n if (!hasSentryAccount) {\n loginUrl.searchParams.set('signup', '1');\n }\n\n if (platform) {\n loginUrl.searchParams.set('project_platform', platform);\n }\n\n if (promoCode) {\n loginUrl.searchParams.set('code', promoCode);\n }\n\n const urlToOpen = loginUrl.toString();\n clack.log.info(\n `${chalk.bold(\n `If the browser window didn't open automatically, please open the following link to ${\n hasSentryAccount ? 'log' : 'sign'\n } into Sentry:`,\n )}\\n\\n${chalk.cyan(urlToOpen)}`,\n );\n\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n const noop = () => {}; // eslint-disable-line @typescript-eslint/no-empty-function\n opn(urlToOpen, { wait: false }).then((cp) => cp.on('error', noop), noop);\n\n const loginSpinner = clack.spinner();\n\n loginSpinner.start('Waiting for you to log in using the link above');\n\n const data = await new Promise<WizardProjectData>((resolve) => {\n const pollingInterval = setInterval(() => {\n axios\n .get<WizardProjectData>(`${url}api/0/wizard/${wizardHash}/`, {\n headers: {\n 'Accept-Encoding': 'deflate',\n },\n })\n .then((result) => {\n resolve(result.data);\n clearTimeout(timeout);\n clearInterval(pollingInterval);\n void axios.delete(`${url}api/0/wizard/${wizardHash}/`);\n })\n .catch(() => {\n // noop - just try again\n });\n }, 500);\n\n const timeout = setTimeout(() => {\n clearInterval(pollingInterval);\n loginSpinner.stop(\n 'Login timed out. No worries - it happens to the best of us.',\n );\n\n Sentry.setTag('opened-wizard-link', false);\n void abort('Please restart the Wizard and log in to complete the setup.');\n }, 180_000);\n });\n\n loginSpinner.stop('Login complete.');\n Sentry.setTag('opened-wizard-link', true);\n\n return data;\n}\n\n/**\n * This first request to Sentry creates a cache on the Sentry backend whose key is returned.\n * We use this key later on to poll for the actual project data.\n */\nasync function makeInitialWizardHashRequest(url: string): Promise<string> {\n const reqUrl = `${url}api/0/wizard/`;\n try {\n return (await axios.get<{ hash: string }>(reqUrl)).data.hash;\n } catch (e: unknown) {\n if (url !== SAAS_URL) {\n clack.log.error(\n `Loading Wizard failed. Did you provide the right URL? (url: ${reqUrl})`,\n );\n clack.log.info(JSON.stringify(e, null, 2));\n await abort(\n chalk.red(\n 'Please check your configuration and try again.\\n\\n Let us know if you think this is an issue with the wizard or Sentry: https://github.com/getsentry/sentry-wizard/issues',\n ),\n );\n } else {\n clack.log.error('Loading Wizard failed.');\n clack.log.info(JSON.stringify(e, null, 2));\n await abort(\n chalk.red(\n 'Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues',\n ),\n );\n }\n }\n\n // We don't get here as we abort in an error case but TS doesn't know that\n return 'invalid hash';\n}\n\nasync function askHasSentryAccount(): Promise<boolean> {\n const hasSentryAccount = await clack.confirm({\n message: 'Do you already have a Sentry account?',\n });\n\n return abortIfCancelled(hasSentryAccount);\n}\n\nasync function askForProjectSelection(\n projects: SentryProjectData[],\n orgSlug?: string,\n projectSlug?: string,\n): Promise<SentryProjectData> {\n const label = (project: SentryProjectData): string => {\n return `${project.organization.slug}/${project.slug}`;\n };\n\n const filteredProjects = filterProjectsBySlugs(\n projects,\n orgSlug,\n projectSlug,\n );\n\n if (filteredProjects.length === 1) {\n const selection = filteredProjects[0];\n\n Sentry.setTag('project', selection.slug);\n Sentry.setUser({ id: selection.organization.slug });\n clack.log.step(`Selected project ${label(selection)}`);\n\n return selection;\n }\n\n if (filteredProjects.length === 0) {\n clack.log.warn('Could not find a project with the provided slugs.');\n }\n\n const sortedProjects = filteredProjects.length ? filteredProjects : projects;\n sortedProjects.sort((a: SentryProjectData, b: SentryProjectData) => {\n return label(a).localeCompare(label(b));\n });\n\n const selection: SentryProjectData | symbol = await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: 'Select your Sentry project.',\n options: sortedProjects.map((project) => {\n return {\n value: project,\n label: label(project),\n };\n }),\n }),\n );\n\n Sentry.setTag('project', selection.slug);\n Sentry.setUser({ id: selection.organization.slug });\n\n return selection;\n}\n\nfunction filterProjectsBySlugs(\n projects: SentryProjectData[],\n orgSlug?: string,\n projectSlug?: string,\n): SentryProjectData[] {\n if (!orgSlug && !projectSlug) {\n return projects;\n }\n if (orgSlug && !projectSlug) {\n return projects.filter((p) => p.organization.slug === orgSlug);\n }\n if (!orgSlug && projectSlug) {\n return projects.filter((p) => p.slug === projectSlug);\n }\n\n return projects.filter(\n (p) => p.organization.slug === orgSlug && p.slug === projectSlug,\n );\n}\n\n/**\n * Asks users if they have a config file for @param tool (e.g. Vite).\n * If yes, asks users to specify the path to their config file.\n *\n * Use this helper function as a fallback mechanism if the lookup for\n * a config file with its most usual location/name fails.\n *\n * @param toolName Name of the tool for which we're looking for the config file\n * @param configFileName Name of the most common config file name (e.g. vite.config.js)\n *\n * @returns a user path to the config file or undefined if the user doesn't have a config file\n */\nexport async function askForToolConfigPath(\n toolName: string,\n configFileName: string,\n): Promise<string | undefined> {\n const hasConfig = await abortIfCancelled(\n clack.confirm({\n message: `Do you have a ${toolName} config file (e.g. ${chalk.cyan(\n configFileName,\n )})?`,\n initialValue: true,\n }),\n );\n\n if (!hasConfig) {\n return undefined;\n }\n\n return await abortIfCancelled(\n clack.text({\n message: `Please enter the path to your ${toolName} config file:`,\n placeholder: join('.', configFileName),\n validate: (value) => {\n if (!value) {\n return 'Please enter a path.';\n }\n\n try {\n fs.accessSync(value);\n } catch {\n return 'Could not access the file at this path.';\n }\n },\n }),\n );\n}\n\n/**\n * Prints copy/paste-able instructions to the console.\n * Afterwards asks the user if they added the code snippet to their file.\n *\n * While there's no point in providing a \"no\" answer here, it gives users time to fulfill the\n * task before the wizard continues with additional steps.\n *\n * Use this function if you want to show users instructions on how to add/modify\n * code in their file. This is helpful if automatic insertion failed or is not possible/feasible.\n *\n * @param filename the name of the file to which the code snippet should be applied.\n * If a path is provided, only the filename will be used.\n *\n * @param codeSnippet the snippet to be printed. Use {@link makeCodeSnippet} to create the\n * diff-like format for visually highlighting unchanged or modified lines of code.\n *\n * @param hint (optional) a hint to be printed after the main instruction to add\n * the code from @param codeSnippet to their @param filename.\n *\n * More guidelines on copy/paste instructions:\n * @see {@link https://develop.sentry.dev/sdk/setup-wizards/#copy--paste-snippets}\n *\n * TODO: refactor copy paste instructions across different wizards to use this function.\n * this might require adding a custom message parameter to the function\n */\nexport async function showCopyPasteInstructions(\n filename: string,\n codeSnippet: string,\n hint?: string,\n): Promise<void> {\n clack.log.step(\n `Add the following code to your ${chalk.cyan(basename(filename))} file:${\n hint ? chalk.dim(` (${chalk.dim(hint)})`) : ''\n }`,\n );\n\n // Padding the code snippet to be printed with a \\n at the beginning and end\n // This makes it easier to distinguish the snippet from the rest of the output\n // Intentionally logging directly to console here so that the code can be copied/pasted directly\n // eslint-disable-next-line no-console\n console.log(`\\n${codeSnippet}\\n`);\n\n await abortIfCancelled(\n clack.select({\n message: 'Did you apply the snippet above?',\n options: [{ label: 'Yes, continue!', value: true }],\n initialValue: true,\n }),\n );\n}\n\n/**\n * Callback that exposes formatting helpers for a code snippet.\n * @param unchanged - Formats text as old code.\n * @param plus - Formats text as new code.\n * @param minus - Formats text as removed code.\n */\ntype CodeSnippetFormatter = (\n unchanged: (txt: string) => string,\n plus: (txt: string) => string,\n minus: (txt: string) => string,\n) => string;\n\n/**\n * Crafts a code snippet that can be used to e.g.\n * - print copy/paste instructions to the console\n * - create a new config file.\n *\n * @param colors set this to true if you want the final snippet to be colored.\n * This is useful for printing the snippet to the console as part of copy/paste instructions.\n *\n * @param callback the callback that returns the formatted code snippet.\n * It exposes takes the helper functions for marking code as unchanged, new or removed.\n * These functions no-op if no special formatting should be applied\n * and otherwise apply the appropriate formatting/coloring.\n * (@see {@link CodeSnippetFormatter})\n *\n * @see {@link showCopyPasteInstructions} for the helper with which to display the snippet in the console.\n *\n * @returns a string containing the final, formatted code snippet.\n */\nexport function makeCodeSnippet(\n colors: boolean,\n callback: CodeSnippetFormatter,\n): string {\n const unchanged = (txt: string) => (colors ? chalk.grey(txt) : txt);\n const plus = (txt: string) => (colors ? chalk.greenBright(txt) : txt);\n const minus = (txt: string) => (colors ? chalk.redBright(txt) : txt);\n\n return callback(unchanged, plus, minus);\n}\n\n/**\n * Creates a new config file with the given @param filepath and @param codeSnippet.\n *\n * Use this function to create a new config file for users. This is useful\n * when users answered that they don't yet have a config file for a tool.\n *\n * (This doesn't mean that they don't yet have some other way of configuring\n * their tool but we can leave it up to them to figure out how to merge configs\n * here.)\n *\n * @param filepath absolute path to the new config file\n * @param codeSnippet the snippet to be inserted into the file\n * @param moreInformation (optional) the message to be printed after the file was created\n * For example, this can be a link to more information about configuring the tool.\n *\n * @returns true on success, false otherwise\n */\nexport async function createNewConfigFile(\n filepath: string,\n codeSnippet: string,\n moreInformation?: string,\n): Promise<boolean> {\n if (!isAbsolute(filepath)) {\n debug(`createNewConfigFile: filepath is not absolute: ${filepath}`);\n return false;\n }\n\n const prettyFilename = chalk.cyan(relative(process.cwd(), filepath));\n\n try {\n await fs.promises.writeFile(filepath, codeSnippet);\n\n clack.log.success(`Added new ${prettyFilename} file.`);\n\n if (moreInformation) {\n clack.log.info(chalk.gray(moreInformation));\n }\n\n return true;\n } catch (e) {\n debug(e);\n clack.log.warn(\n `Could not create a new ${prettyFilename} file. Please create one manually and follow the instructions below.`,\n );\n }\n\n return false;\n}\n\nexport async function askShouldCreateExamplePage(\n customRoute?: string,\n): Promise<boolean> {\n const route = chalk.cyan(customRoute ?? '/sentry-example-page');\n return traceStep('ask-create-example-page', () =>\n abortIfCancelled(\n clack.select({\n message: `Do you want to create an example page (\"${route}\") to test your Sentry setup?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Recommended - Check your git status before committing!',\n },\n { value: false, label: 'No' },\n ],\n }),\n ),\n );\n}\n\nexport async function askShouldCreateExampleComponent(): Promise<boolean> {\n return traceStep('ask-create-example-component', () =>\n abortIfCancelled(\n clack.select({\n message: `Do you want to create an example component to test your Sentry setup?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'Recommended - Check your git status before committing!',\n },\n { value: false, label: 'No' },\n ],\n }),\n ),\n );\n}\n\nexport async function featureSelectionPrompt<F extends ReadonlyArray<Feature>>(\n features: F,\n): Promise<{ [key in F[number]['id']]: boolean }> {\n return traceStep('feature-selection', async () => {\n const selectedFeatures: Record<string, boolean> = {};\n\n for (const feature of features) {\n const selected = await abortIfCancelled(\n clack.select({\n message: feature.prompt,\n initialValue: true,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: feature.enabledHint,\n },\n {\n value: false,\n label: 'No',\n hint: feature.disabledHint,\n },\n ],\n }),\n );\n\n selectedFeatures[feature.id] = selected;\n }\n\n return selectedFeatures as { [key in F[number]['id']]: boolean };\n });\n}\n\nexport async function askShouldInstallPackage(\n pkgName: string,\n): Promise<boolean> {\n return traceStep(`ask-install-package`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to install ${chalk.cyan(pkgName)}?`,\n }),\n ),\n );\n}\n\nexport async function askShouldAddPackageOverride(\n pkgName: string,\n pkgVersion: string,\n): Promise<boolean> {\n return traceStep(`ask-add-package-override`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to add an override for ${chalk.cyan(\n pkgName,\n )} version ${chalk.cyan(pkgVersion)}?`,\n }),\n ),\n );\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare const WIZARD_VERSION = "4.0.2";
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ // DO NOT modify this file manually!
3
+ // This is file is updated at release time.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.WIZARD_VERSION = void 0;
6
+ exports.WIZARD_VERSION = '4.0.2';
7
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,2CAA2C;;;AAE9B,QAAA,cAAc,GAAG,OAAO,CAAC","sourcesContent":["// DO NOT modify this file manually!\n// This is file is updated at release time.\n\nexport const WIZARD_VERSION = '4.0.2';\n"]}
@@ -234,7 +234,7 @@ describe('Next.js code templates', () => {
234
234
  expect(template).toMatchInlineSnapshot(`
235
235
  "{
236
236
  // For all available options, see:
237
- // https://github.com/getsentry/sentry-webpack-plugin#options
237
+ // https://www.npmjs.com/package/@sentry/webpack-plugin#options
238
238
 
239
239
  org: "my-org",
240
240
  project: "my-project",
@@ -277,7 +277,7 @@ describe('Next.js code templates', () => {
277
277
  expect(template).toMatchInlineSnapshot(`
278
278
  "{
279
279
  // For all available options, see:
280
- // https://github.com/getsentry/sentry-webpack-plugin#options
280
+ // https://www.npmjs.com/package/@sentry/webpack-plugin#options
281
281
 
282
282
  org: "my-org",
283
283
  project: "my-project",
@@ -321,7 +321,7 @@ describe('Next.js code templates', () => {
321
321
  expect(template).toMatchInlineSnapshot(`
322
322
  "{
323
323
  // For all available options, see:
324
- // https://github.com/getsentry/sentry-webpack-plugin#options
324
+ // https://www.npmjs.com/package/@sentry/webpack-plugin#options
325
325
 
326
326
  org: "my-org",
327
327
  project: "my-project",
@@ -364,7 +364,7 @@ describe('Next.js code templates', () => {
364
364
  expect(template).toMatchInlineSnapshot(`
365
365
  "{
366
366
  // For all available options, see:
367
- // https://github.com/getsentry/sentry-webpack-plugin#options
367
+ // https://www.npmjs.com/package/@sentry/webpack-plugin#options
368
368
 
369
369
  org: "my-org",
370
370
  project: "my-project",