@sentry/wizard 3.42.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/.node-cache/node-v22.14.0-darwin-arm64 +0 -0
  2. package/.node-cache/node-v22.14.0-darwin-x64 +0 -0
  3. package/.node-cache/node-v22.14.0-linux-arm64 +0 -0
  4. package/.node-cache/node-v22.14.0-linux-x64 +0 -0
  5. package/.node-cache/node-v22.14.0-win-x64.exe +0 -0
  6. package/CHANGELOG.md +26 -0
  7. package/COPYING +3575 -0
  8. package/bin.ts +85 -80
  9. package/dist/bin.js +44 -35
  10. package/dist/bin.js.map +1 -1
  11. package/dist/e2e-tests/jest.config.js +1 -1
  12. package/dist/e2e-tests/jest.config.js.map +1 -1
  13. package/dist/e2e-tests/tests/flutter.test.js +62 -147
  14. package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
  15. package/dist/e2e-tests/tests/nextjs.test.js +77 -175
  16. package/dist/e2e-tests/tests/nextjs.test.js.map +1 -1
  17. package/dist/e2e-tests/tests/nuxt-3.test.js +61 -162
  18. package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
  19. package/dist/e2e-tests/tests/nuxt-4.test.js +62 -163
  20. package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
  21. package/dist/e2e-tests/tests/remix.test.js +147 -189
  22. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  23. package/dist/e2e-tests/tests/sveltekit.test.js +133 -187
  24. package/dist/e2e-tests/tests/sveltekit.test.js.map +1 -1
  25. package/dist/e2e-tests/utils/index.d.ts +1 -1
  26. package/dist/e2e-tests/utils/index.js +113 -195
  27. package/dist/e2e-tests/utils/index.js.map +1 -1
  28. package/dist/lib/Constants.js +5 -5
  29. package/dist/lib/Constants.js.map +1 -1
  30. package/dist/lib/Helper/BottomBar.d.ts +1 -1
  31. package/dist/lib/Helper/BottomBar.js +14 -15
  32. package/dist/lib/Helper/BottomBar.js.map +1 -1
  33. package/dist/lib/Helper/Env.js +5 -2
  34. package/dist/lib/Helper/Env.js.map +1 -1
  35. package/dist/lib/Helper/File.js +14 -27
  36. package/dist/lib/Helper/File.js.map +1 -1
  37. package/dist/lib/Helper/Git.js +24 -59
  38. package/dist/lib/Helper/Git.js.map +1 -1
  39. package/dist/lib/Helper/Logging.js +2 -2
  40. package/dist/lib/Helper/Logging.js.map +1 -1
  41. package/dist/lib/Helper/MergeConfig.js +4 -4
  42. package/dist/lib/Helper/MergeConfig.js.map +1 -1
  43. package/dist/lib/Helper/Package.d.ts +4 -1
  44. package/dist/lib/Helper/Package.js +12 -38
  45. package/dist/lib/Helper/Package.js.map +1 -1
  46. package/dist/lib/Helper/SentryCli.js +77 -149
  47. package/dist/lib/Helper/SentryCli.js.map +1 -1
  48. package/dist/lib/Helper/Wizard.js +29 -124
  49. package/dist/lib/Helper/Wizard.js.map +1 -1
  50. package/dist/lib/Helper/__tests__/File.js +4 -4
  51. package/dist/lib/Helper/__tests__/File.js.map +1 -1
  52. package/dist/lib/Helper/__tests__/MergeConfig.js +24 -24
  53. package/dist/lib/Helper/__tests__/MergeConfig.js.map +1 -1
  54. package/dist/lib/Helper/__tests__/SentryCli.js +33 -23
  55. package/dist/lib/Helper/__tests__/SentryCli.js.map +1 -1
  56. package/dist/lib/Setup.js +23 -85
  57. package/dist/lib/Setup.js.map +1 -1
  58. package/dist/lib/Steps/BaseStep.js +8 -8
  59. package/dist/lib/Steps/BaseStep.js.map +1 -1
  60. package/dist/lib/Steps/ChooseIntegration.js +80 -125
  61. package/dist/lib/Steps/ChooseIntegration.js.map +1 -1
  62. package/dist/lib/Steps/ConfigureProject.js +6 -66
  63. package/dist/lib/Steps/ConfigureProject.js.map +1 -1
  64. package/dist/lib/Steps/Initial.js +16 -104
  65. package/dist/lib/Steps/Initial.js.map +1 -1
  66. package/dist/lib/Steps/Integrations/BaseIntegration.js +24 -118
  67. package/dist/lib/Steps/Integrations/BaseIntegration.js.map +1 -1
  68. package/dist/lib/Steps/Integrations/Cordova.js +95 -183
  69. package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
  70. package/dist/lib/Steps/Integrations/Electron.js +87 -145
  71. package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
  72. package/dist/lib/Steps/Integrations/MobileProject.js +40 -148
  73. package/dist/lib/Steps/Integrations/MobileProject.js.map +1 -1
  74. package/dist/lib/Steps/OpenSentry.js +63 -126
  75. package/dist/lib/Steps/OpenSentry.js.map +1 -1
  76. package/dist/lib/Steps/PromptForParameters.js +110 -206
  77. package/dist/lib/Steps/PromptForParameters.js.map +1 -1
  78. package/dist/lib/Steps/Result.js +19 -79
  79. package/dist/lib/Steps/Result.js.map +1 -1
  80. package/dist/lib/Steps/SentryProjectSelector.js +57 -148
  81. package/dist/lib/Steps/SentryProjectSelector.js.map +1 -1
  82. package/dist/lib/Steps/ShouldConfigure.js +6 -66
  83. package/dist/lib/Steps/ShouldConfigure.js.map +1 -1
  84. package/dist/lib/Steps/WaitForSentry.js +43 -120
  85. package/dist/lib/Steps/WaitForSentry.js.map +1 -1
  86. package/dist/lib/Steps/Welcome.js +17 -76
  87. package/dist/lib/Steps/Welcome.js.map +1 -1
  88. package/dist/lib/__tests__/Env.js +3 -3
  89. package/dist/lib/__tests__/Env.js.map +1 -1
  90. package/dist/src/android/android-wizard.js +100 -176
  91. package/dist/src/android/android-wizard.js.map +1 -1
  92. package/dist/src/android/code-tools.js +24 -33
  93. package/dist/src/android/code-tools.js.map +1 -1
  94. package/dist/src/android/gradle.js +106 -165
  95. package/dist/src/android/gradle.js.map +1 -1
  96. package/dist/src/android/manifest.js +26 -27
  97. package/dist/src/android/manifest.js.map +1 -1
  98. package/dist/src/android/templates.js +76 -23
  99. package/dist/src/android/templates.js.map +1 -1
  100. package/dist/src/apple/apple-wizard.js +129 -225
  101. package/dist/src/apple/apple-wizard.js.map +1 -1
  102. package/dist/src/apple/cocoapod.js +47 -109
  103. package/dist/src/apple/cocoapod.js.map +1 -1
  104. package/dist/src/apple/code-tools.js +32 -35
  105. package/dist/src/apple/code-tools.js.map +1 -1
  106. package/dist/src/apple/fastlane.js +51 -97
  107. package/dist/src/apple/fastlane.js.map +1 -1
  108. package/dist/src/apple/templates.js +41 -5
  109. package/dist/src/apple/templates.js.map +1 -1
  110. package/dist/src/apple/xcode-manager.d.ts +2 -2
  111. package/dist/src/apple/xcode-manager.js +93 -108
  112. package/dist/src/apple/xcode-manager.js.map +1 -1
  113. package/dist/src/flutter/code-tools.js +79 -127
  114. package/dist/src/flutter/code-tools.js.map +1 -1
  115. package/dist/src/flutter/flutter-wizard.js +75 -136
  116. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  117. package/dist/src/flutter/templates.js +48 -12
  118. package/dist/src/flutter/templates.js.map +1 -1
  119. package/dist/src/nextjs/nextjs-wizard.js +527 -805
  120. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  121. package/dist/src/nextjs/templates.js +380 -40
  122. package/dist/src/nextjs/templates.js.map +1 -1
  123. package/dist/src/nextjs/utils.js +5 -5
  124. package/dist/src/nextjs/utils.js.map +1 -1
  125. package/dist/src/nuxt/nuxt-wizard.js +91 -188
  126. package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
  127. package/dist/src/nuxt/sdk-example.js +68 -137
  128. package/dist/src/nuxt/sdk-example.js.map +1 -1
  129. package/dist/src/nuxt/sdk-setup.d.ts +4 -4
  130. package/dist/src/nuxt/sdk-setup.js +180 -336
  131. package/dist/src/nuxt/sdk-setup.js.map +1 -1
  132. package/dist/src/nuxt/templates.js +195 -18
  133. package/dist/src/nuxt/templates.js.map +1 -1
  134. package/dist/src/nuxt/utils.js +29 -76
  135. package/dist/src/nuxt/utils.js.map +1 -1
  136. package/dist/src/react-native/expo-env-file.js +41 -94
  137. package/dist/src/react-native/expo-env-file.js.map +1 -1
  138. package/dist/src/react-native/expo-metro.d.ts +1 -1
  139. package/dist/src/react-native/expo-metro.js +75 -130
  140. package/dist/src/react-native/expo-metro.js.map +1 -1
  141. package/dist/src/react-native/expo.js +61 -114
  142. package/dist/src/react-native/expo.js.map +1 -1
  143. package/dist/src/react-native/git.js +23 -56
  144. package/dist/src/react-native/git.js.map +1 -1
  145. package/dist/src/react-native/glob.js +3 -3
  146. package/dist/src/react-native/glob.js.map +1 -1
  147. package/dist/src/react-native/gradle.js +4 -4
  148. package/dist/src/react-native/gradle.js.map +1 -1
  149. package/dist/src/react-native/javascript.js +51 -95
  150. package/dist/src/react-native/javascript.js.map +1 -1
  151. package/dist/src/react-native/metro.js +176 -296
  152. package/dist/src/react-native/metro.js.map +1 -1
  153. package/dist/src/react-native/react-native-wizard.js +267 -418
  154. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  155. package/dist/src/react-native/uninstall.js +37 -80
  156. package/dist/src/react-native/uninstall.js.map +1 -1
  157. package/dist/src/react-native/xcode.js +57 -55
  158. package/dist/src/react-native/xcode.js.map +1 -1
  159. package/dist/src/remix/codemods/express-server.js +27 -82
  160. package/dist/src/remix/codemods/express-server.js.map +1 -1
  161. package/dist/src/remix/codemods/handle-error.js +28 -31
  162. package/dist/src/remix/codemods/handle-error.js.map +1 -1
  163. package/dist/src/remix/codemods/root-common.js +11 -11
  164. package/dist/src/remix/codemods/root-common.js.map +1 -1
  165. package/dist/src/remix/codemods/root-v1.js +17 -67
  166. package/dist/src/remix/codemods/root-v1.js.map +1 -1
  167. package/dist/src/remix/codemods/root-v2.js +89 -140
  168. package/dist/src/remix/codemods/root-v2.js.map +1 -1
  169. package/dist/src/remix/remix-wizard.js +181 -343
  170. package/dist/src/remix/remix-wizard.js.map +1 -1
  171. package/dist/src/remix/sdk-example.js +84 -66
  172. package/dist/src/remix/sdk-example.js.map +1 -1
  173. package/dist/src/remix/sdk-setup.js +161 -293
  174. package/dist/src/remix/sdk-setup.js.map +1 -1
  175. package/dist/src/remix/templates.js +10 -2
  176. package/dist/src/remix/templates.js.map +1 -1
  177. package/dist/src/remix/utils.js +13 -14
  178. package/dist/src/remix/utils.js.map +1 -1
  179. package/dist/src/run.js +106 -178
  180. package/dist/src/run.js.map +1 -1
  181. package/dist/src/sourcemaps/sourcemaps-wizard.js +248 -372
  182. package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
  183. package/dist/src/sourcemaps/tools/angular.js +32 -66
  184. package/dist/src/sourcemaps/tools/angular.js.map +1 -1
  185. package/dist/src/sourcemaps/tools/create-react-app.js +14 -59
  186. package/dist/src/sourcemaps/tools/create-react-app.js.map +1 -1
  187. package/dist/src/sourcemaps/tools/esbuild.js +34 -77
  188. package/dist/src/sourcemaps/tools/esbuild.js.map +1 -1
  189. package/dist/src/sourcemaps/tools/nextjs.d.ts +2 -2
  190. package/dist/src/sourcemaps/tools/nextjs.js +75 -102
  191. package/dist/src/sourcemaps/tools/nextjs.js.map +1 -1
  192. package/dist/src/sourcemaps/tools/remix.js +53 -93
  193. package/dist/src/sourcemaps/tools/remix.js.map +1 -1
  194. package/dist/src/sourcemaps/tools/rollup.js +35 -76
  195. package/dist/src/sourcemaps/tools/rollup.js.map +1 -1
  196. package/dist/src/sourcemaps/tools/sentry-cli.js +157 -289
  197. package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
  198. package/dist/src/sourcemaps/tools/tsc.js +68 -134
  199. package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
  200. package/dist/src/sourcemaps/tools/vite.js +111 -196
  201. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  202. package/dist/src/sourcemaps/tools/webpack.d.ts +1 -1
  203. package/dist/src/sourcemaps/tools/webpack.js +158 -260
  204. package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
  205. package/dist/src/sourcemaps/utils/detect-tool.js +9 -54
  206. package/dist/src/sourcemaps/utils/detect-tool.js.map +1 -1
  207. package/dist/src/sourcemaps/utils/other-wizards.js +77 -144
  208. package/dist/src/sourcemaps/utils/other-wizards.js.map +1 -1
  209. package/dist/src/sourcemaps/utils/sdk-version.js +112 -191
  210. package/dist/src/sourcemaps/utils/sdk-version.js.map +1 -1
  211. package/dist/src/sveltekit/sdk-example.js +20 -70
  212. package/dist/src/sveltekit/sdk-example.js.map +1 -1
  213. package/dist/src/sveltekit/sdk-setup.js +250 -411
  214. package/dist/src/sveltekit/sdk-setup.js.map +1 -1
  215. package/dist/src/sveltekit/sveltekit-wizard.js +107 -191
  216. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  217. package/dist/src/sveltekit/templates.js +147 -13
  218. package/dist/src/sveltekit/templates.js.map +1 -1
  219. package/dist/src/sveltekit/utils.js +3 -3
  220. package/dist/src/sveltekit/utils.js.map +1 -1
  221. package/dist/src/telemetry.d.ts +2 -2
  222. package/dist/src/telemetry.js +58 -108
  223. package/dist/src/telemetry.js.map +1 -1
  224. package/dist/src/utils/ast-utils.js +39 -54
  225. package/dist/src/utils/ast-utils.js.map +1 -1
  226. package/dist/src/utils/bash.js +28 -75
  227. package/dist/src/utils/bash.js.map +1 -1
  228. package/dist/src/utils/clack-utils.d.ts +3 -7
  229. package/dist/src/utils/clack-utils.js +688 -1083
  230. package/dist/src/utils/clack-utils.js.map +1 -1
  231. package/dist/src/utils/debug.js +6 -10
  232. package/dist/src/utils/debug.js.map +1 -1
  233. package/dist/src/utils/package-json.js +5 -6
  234. package/dist/src/utils/package-json.js.map +1 -1
  235. package/dist/src/utils/package-manager.js +65 -139
  236. package/dist/src/utils/package-manager.js.map +1 -1
  237. package/dist/src/utils/release-registry.js +12 -59
  238. package/dist/src/utils/release-registry.js.map +1 -1
  239. package/dist/src/utils/semver.js +3 -4
  240. package/dist/src/utils/semver.js.map +1 -1
  241. package/dist/src/utils/sentrycli-utils.js +4 -4
  242. package/dist/src/utils/sentrycli-utils.js.map +1 -1
  243. package/dist/src/utils/url.js +5 -6
  244. package/dist/src/utils/url.js.map +1 -1
  245. package/dist/test/android/code-tools.test.js +18 -18
  246. package/dist/test/android/code-tools.test.js.map +1 -1
  247. package/dist/test/apple/cocoapod.test.js +154 -299
  248. package/dist/test/apple/cocoapod.test.js.map +1 -1
  249. package/dist/test/apple/code-tools.test.js +375 -263
  250. package/dist/test/apple/code-tools.test.js.map +1 -1
  251. package/dist/test/apple/fastfile.test.js +319 -271
  252. package/dist/test/apple/fastfile.test.js.map +1 -1
  253. package/dist/test/apple/templates.test.js +114 -30
  254. package/dist/test/apple/templates.test.js.map +1 -1
  255. package/dist/test/apple/xcode-manager.test.js +230 -234
  256. package/dist/test/apple/xcode-manager.test.js.map +1 -1
  257. package/dist/test/flutter/code-tools.test.js +119 -48
  258. package/dist/test/flutter/code-tools.test.js.map +1 -1
  259. package/dist/test/flutter/templates.test.js +63 -20
  260. package/dist/test/flutter/templates.test.js.map +1 -1
  261. package/dist/test/nextjs/templates.test.js +332 -43
  262. package/dist/test/nextjs/templates.test.js.map +1 -1
  263. package/dist/test/nuxt/templates.test.js +161 -33
  264. package/dist/test/nuxt/templates.test.js.map +1 -1
  265. package/dist/test/react-native/expo-metro.test.js +61 -15
  266. package/dist/test/react-native/expo-metro.test.js.map +1 -1
  267. package/dist/test/react-native/expo.test.js +37 -17
  268. package/dist/test/react-native/expo.test.js.map +1 -1
  269. package/dist/test/react-native/gradle.test.js +260 -28
  270. package/dist/test/react-native/gradle.test.js.map +1 -1
  271. package/dist/test/react-native/javascript.test.js +85 -19
  272. package/dist/test/react-native/javascript.test.js.map +1 -1
  273. package/dist/test/react-native/metro.test.js +261 -187
  274. package/dist/test/react-native/metro.test.js.map +1 -1
  275. package/dist/test/react-native/xcode.test.js +243 -62
  276. package/dist/test/react-native/xcode.test.js.map +1 -1
  277. package/dist/test/remix/client-entry.test.js +81 -21
  278. package/dist/test/remix/client-entry.test.js.map +1 -1
  279. package/dist/test/remix/server-instrumentation.test.js +21 -8
  280. package/dist/test/remix/server-instrumentation.test.js.map +1 -1
  281. package/dist/test/sourcemaps/tools/sentry-cli.test.js +20 -72
  282. package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -1
  283. package/dist/test/sourcemaps/tools/tsc.test.js +142 -68
  284. package/dist/test/sourcemaps/tools/tsc.test.js.map +1 -1
  285. package/dist/test/sourcemaps/tools/vite.test.js +106 -75
  286. package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
  287. package/dist/test/sourcemaps/tools/webpack.test.js +226 -102
  288. package/dist/test/sourcemaps/tools/webpack.test.js.map +1 -1
  289. package/dist/test/sveltekit/templates.test.js +117 -18
  290. package/dist/test/sveltekit/templates.test.js.map +1 -1
  291. package/dist/test/utils/ast-utils.test.js +99 -58
  292. package/dist/test/utils/ast-utils.test.js.map +1 -1
  293. package/dist/test/utils/clack-utils.test.js +142 -247
  294. package/dist/test/utils/clack-utils.test.js.map +1 -1
  295. package/e2e-tests/package.json +1 -1
  296. package/e2e-tests/tests/flutter.test.ts +20 -20
  297. package/e2e-tests/tests/nextjs.test.ts +2 -2
  298. package/e2e-tests/tests/nuxt-3.test.ts +4 -4
  299. package/e2e-tests/tests/nuxt-4.test.ts +3 -3
  300. package/e2e-tests/tests/remix.test.ts +3 -3
  301. package/e2e-tests/tests/sveltekit.test.ts +3 -3
  302. package/e2e-tests/utils/index.ts +33 -15
  303. package/lib/Helper/BottomBar.ts +1 -1
  304. package/lib/Helper/Env.ts +1 -1
  305. package/lib/Helper/Package.ts +12 -10
  306. package/lib/Helper/SentryCli.ts +18 -27
  307. package/lib/Helper/Wizard.ts +1 -2
  308. package/lib/Setup.ts +4 -5
  309. package/lib/Steps/ChooseIntegration.ts +40 -8
  310. package/lib/Steps/Initial.ts +17 -26
  311. package/lib/Steps/Integrations/BaseIntegration.ts +2 -8
  312. package/lib/Steps/Integrations/Cordova.ts +9 -15
  313. package/lib/Steps/Integrations/Electron.ts +23 -20
  314. package/lib/Steps/Integrations/MobileProject.ts +18 -15
  315. package/lib/Steps/OpenSentry.ts +12 -7
  316. package/lib/Steps/PromptForParameters.ts +12 -19
  317. package/lib/Steps/SentryProjectSelector.ts +30 -29
  318. package/lib/Steps/WaitForSentry.ts +29 -23
  319. package/package.json +12 -8
  320. package/src/apple/xcode-manager.ts +10 -10
  321. package/src/nextjs/templates.ts +2 -3
  322. package/src/nuxt/sdk-setup.ts +21 -18
  323. package/src/react-native/expo-metro.ts +2 -2
  324. package/src/react-native/react-native-wizard.ts +1 -2
  325. package/src/react-native/uninstall.ts +1 -2
  326. package/src/react-native/xcode.ts +1 -1
  327. package/src/run.ts +12 -5
  328. package/src/sourcemaps/tools/nextjs.ts +2 -2
  329. package/src/sourcemaps/tools/webpack.ts +3 -3
  330. package/src/telemetry.ts +27 -7
  331. package/src/utils/clack-utils.ts +50 -47
  332. package/test/apple/cocoapod.test.ts +4 -0
  333. package/test/apple/fastfile.test.ts +12 -7
  334. package/test/apple/xcode-manager.test.ts +13 -11
  335. package/test/utils/clack-utils.test.ts +40 -50
  336. package/types/read-env.d.ts +3 -0
  337. package/types/xcode.d.ts +1 -0
  338. package/dist/package.json +0 -128
@@ -22,115 +22,74 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
- var __generator = (this && this.__generator) || function (thisArg, body) {
35
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
- function verb(n) { return function (v) { return step([n, v]); }; }
38
- function step(op) {
39
- if (f) throw new TypeError("Generator is already executing.");
40
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
41
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
- if (y = 0, t) op = [op[0] & 2, t.value];
43
- switch (op[0]) {
44
- case 0: case 1: t = op; break;
45
- case 4: _.label++; return { value: op[1], done: false };
46
- case 5: _.label++; y = op[1]; op = [0]; continue;
47
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
- default:
49
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
- if (t[2]) _.ops.pop();
54
- _.trys.pop(); continue;
55
- }
56
- op = body.call(thisArg, _);
57
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
- }
60
- };
61
25
  Object.defineProperty(exports, "__esModule", { value: true });
62
- var Sentry = __importStar(require("@sentry/node"));
63
- var fs = __importStar(require("fs"));
64
- var os = __importStar(require("os"));
65
- var path = __importStar(require("path"));
66
- var cocoapod_1 = require("../../src/apple/cocoapod");
67
- var bash = __importStar(require("../../src/utils/bash"));
26
+ const Sentry = __importStar(require("@sentry/node"));
27
+ const fs = __importStar(require("fs"));
28
+ const os = __importStar(require("os"));
29
+ const path = __importStar(require("path"));
30
+ const cocoapod_1 = require("../../src/apple/cocoapod");
31
+ const bash = __importStar(require("../../src/utils/bash"));
68
32
  // @ts-ignore - clack is ESM and TS complains about that. It works though
69
- var clack = __importStar(require("@clack/prompts"));
33
+ const clack = __importStar(require("@clack/prompts"));
34
+ jest.mock('@clack/prompts', () => ({
35
+ __esModule: true,
36
+ ...jest.requireActual('@clack/prompts'),
37
+ }));
70
38
  jest.mock('../../src/utils/bash');
71
39
  jest.spyOn(Sentry, 'setTag').mockImplementation();
72
40
  jest.spyOn(Sentry, 'captureException').mockImplementation();
73
- var clackSpinnerMock = {
41
+ const clackSpinnerMock = {
74
42
  start: jest.fn(),
75
43
  stop: jest.fn(),
76
44
  message: jest.fn(),
77
45
  };
78
- describe('cocoapod', function () {
79
- beforeEach(function () {
46
+ describe('cocoapod', () => {
47
+ beforeEach(() => {
80
48
  jest.spyOn(clack, 'spinner').mockReturnValue(clackSpinnerMock);
81
49
  jest.spyOn(clack.log, 'error').mockImplementation();
82
50
  });
83
- afterEach(function () {
51
+ afterEach(() => {
84
52
  jest.clearAllMocks();
85
53
  });
86
- describe('usesCocoaPod', function () {
87
- describe('Podfile exists', function () {
88
- it('should return true', function () {
54
+ describe('usesCocoaPod', () => {
55
+ describe('Podfile exists', () => {
56
+ it('should return true', () => {
89
57
  // -- Arrange --
90
- var projPath = path.join(os.tmpdir(), 'test-project-with-podfile');
91
- var tempDir = fs.mkdtempSync(projPath);
92
- var podfile = path.join(tempDir, 'Podfile');
58
+ const projPath = path.join(os.tmpdir(), 'test-project-with-podfile');
59
+ const tempDir = fs.mkdtempSync(projPath);
60
+ const podfile = path.join(tempDir, 'Podfile');
93
61
  fs.writeFileSync(podfile, '');
94
62
  // -- Act --
95
- var result = (0, cocoapod_1.usesCocoaPod)(tempDir);
63
+ const result = (0, cocoapod_1.usesCocoaPod)(tempDir);
96
64
  // -- Assert --
97
65
  expect(result).toBeTruthy();
98
66
  });
99
67
  });
100
- describe('Podfile does not exist', function () {
101
- it('should return false', function () {
68
+ describe('Podfile does not exist', () => {
69
+ it('should return false', () => {
102
70
  // -- Arrange --
103
- var projPath = path.join(os.tmpdir(), 'test-project-without-podfile');
104
- var tempDir = fs.mkdtempSync(projPath);
71
+ const projPath = path.join(os.tmpdir(), 'test-project-without-podfile');
72
+ const tempDir = fs.mkdtempSync(projPath);
105
73
  // -- Act --
106
- var result = (0, cocoapod_1.usesCocoaPod)(tempDir);
74
+ const result = (0, cocoapod_1.usesCocoaPod)(tempDir);
107
75
  // -- Assert --
108
76
  expect(result).toBeFalsy();
109
77
  });
110
78
  });
111
79
  });
112
- describe('addCocoaPods', function () {
113
- describe('Podfile does not exist', function () {
114
- it('should throw an error', function () { return __awaiter(void 0, void 0, void 0, function () {
115
- var projPath, tempDir;
116
- return __generator(this, function (_a) {
117
- switch (_a.label) {
118
- case 0:
119
- projPath = path.join(os.tmpdir(), 'test-project-without-podfile');
120
- tempDir = fs.mkdtempSync(projPath);
121
- // -- Act & Assert --
122
- return [4 /*yield*/, expect((0, cocoapod_1.addCocoaPods)(tempDir)).rejects.toThrow('ENOENT: no such file or directory, open')];
123
- case 1:
124
- // -- Act & Assert --
125
- _a.sent();
126
- return [2 /*return*/];
127
- }
128
- });
129
- }); });
80
+ describe('addCocoaPods', () => {
81
+ describe('Podfile does not exist', () => {
82
+ it('should throw an error', async () => {
83
+ // -- Arrange --
84
+ const projPath = path.join(os.tmpdir(), 'test-project-without-podfile');
85
+ const tempDir = fs.mkdtempSync(projPath);
86
+ // -- Act & Assert --
87
+ await expect((0, cocoapod_1.addCocoaPods)(tempDir)).rejects.toThrow('ENOENT: no such file or directory, open');
88
+ });
130
89
  });
131
- describe('Podfile exists', function () {
132
- describe('Podfile includes Sentry pod', function () {
133
- var variations = [
90
+ describe('Podfile exists', () => {
91
+ describe('Podfile includes Sentry pod', () => {
92
+ const variations = [
134
93
  {
135
94
  case: 'simple',
136
95
  content: 'pod "Sentry"',
@@ -164,245 +123,141 @@ describe('cocoapod', function () {
164
123
  content: 'pod "Sentry"',
165
124
  },
166
125
  ];
167
- var _loop_1 = function (variation) {
168
- it("should not change the Podfile for ".concat(variation.case), function () { return __awaiter(void 0, void 0, void 0, function () {
169
- var projPath, podfile, result;
170
- return __generator(this, function (_a) {
171
- switch (_a.label) {
172
- case 0:
173
- projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));
174
- fs.mkdirSync(projPath, {
175
- recursive: true,
176
- });
177
- podfile = path.join(projPath, 'Podfile');
178
- fs.writeFileSync(podfile, variation.content, 'utf8');
179
- return [4 /*yield*/, (0, cocoapod_1.addCocoaPods)(projPath)];
180
- case 1:
181
- result = _a.sent();
182
- // -- Assert --
183
- expect(result).toBeTruthy();
184
- expect(fs.readFileSync(podfile, 'utf8')).toBe(variation.content);
185
- return [2 /*return*/];
186
- }
126
+ for (const variation of variations) {
127
+ it(`should not change the Podfile for ${variation.case}`, async () => {
128
+ // -- Arrange --
129
+ const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));
130
+ fs.mkdirSync(projPath, {
131
+ recursive: true,
187
132
  });
188
- }); });
189
- };
190
- for (var _i = 0, variations_1 = variations; _i < variations_1.length; _i++) {
191
- var variation = variations_1[_i];
192
- _loop_1(variation);
133
+ const podfile = path.join(projPath, 'Podfile');
134
+ fs.writeFileSync(podfile, variation.content, 'utf8');
135
+ // -- Act --
136
+ const result = await (0, cocoapod_1.addCocoaPods)(projPath);
137
+ // -- Assert --
138
+ expect(result).toBeTruthy();
139
+ expect(fs.readFileSync(podfile, 'utf8')).toBe(variation.content);
140
+ });
193
141
  }
194
142
  });
195
- describe('Podfile includes no other pods', function () {
196
- describe('Podfile does not include use_frameworks!', function () {
197
- it('should not change the Podfile', function () { return __awaiter(void 0, void 0, void 0, function () {
198
- var projPath, podfile, result;
199
- return __generator(this, function (_a) {
200
- switch (_a.label) {
201
- case 0:
202
- projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));
203
- fs.mkdirSync(projPath, {
204
- recursive: true,
205
- });
206
- podfile = path.join(projPath, 'Podfile');
207
- fs.writeFileSync(podfile, '', 'utf8');
208
- return [4 /*yield*/, (0, cocoapod_1.addCocoaPods)(projPath)];
209
- case 1:
210
- result = _a.sent();
211
- // -- Assert --
212
- expect(result).toBeFalsy();
213
- expect(fs.readFileSync(podfile, 'utf8')).toBe('');
214
- return [2 /*return*/];
215
- }
143
+ describe('Podfile includes no other pods', () => {
144
+ describe('Podfile does not include use_frameworks!', () => {
145
+ it('should not change the Podfile', async () => {
146
+ // -- Arrange --
147
+ const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));
148
+ fs.mkdirSync(projPath, {
149
+ recursive: true,
216
150
  });
217
- }); });
151
+ const podfile = path.join(projPath, 'Podfile');
152
+ fs.writeFileSync(podfile, '', 'utf8');
153
+ // -- Act --
154
+ const result = await (0, cocoapod_1.addCocoaPods)(projPath);
155
+ // -- Assert --
156
+ expect(result).toBeFalsy();
157
+ expect(fs.readFileSync(podfile, 'utf8')).toBe('');
158
+ });
218
159
  });
219
- describe('Podfile includes use_frameworks!', function () {
220
- it('should change the Podfile', function () { return __awaiter(void 0, void 0, void 0, function () {
221
- var projPath, podfile, result;
222
- return __generator(this, function (_a) {
223
- switch (_a.label) {
224
- case 0:
225
- projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));
226
- fs.mkdirSync(projPath, {
227
- recursive: true,
228
- });
229
- podfile = path.join(projPath, 'Podfile');
230
- fs.writeFileSync(podfile, "use_frameworks!", 'utf8');
231
- return [4 /*yield*/, (0, cocoapod_1.addCocoaPods)(projPath)];
232
- case 1:
233
- result = _a.sent();
234
- // -- Assert --
235
- expect(result).toBeTruthy();
236
- expect(fs.readFileSync(podfile, 'utf8')).toBe("use_frameworks!\npod 'Sentry'\n");
237
- return [2 /*return*/];
238
- }
160
+ describe('Podfile includes use_frameworks!', () => {
161
+ it('should change the Podfile', async () => {
162
+ // -- Arrange --
163
+ const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));
164
+ fs.mkdirSync(projPath, {
165
+ recursive: true,
239
166
  });
240
- }); });
167
+ const podfile = path.join(projPath, 'Podfile');
168
+ fs.writeFileSync(podfile, `use_frameworks!`, 'utf8');
169
+ // -- Act --
170
+ const result = await (0, cocoapod_1.addCocoaPods)(projPath);
171
+ // -- Assert --
172
+ expect(result).toBeTruthy();
173
+ expect(fs.readFileSync(podfile, 'utf8')).toBe(`use_frameworks!\npod 'Sentry'\n`);
174
+ });
241
175
  });
242
176
  });
243
- describe('Podfile includes other pods', function () {
244
- it('should append Sentry pod after last pod', function () { return __awaiter(void 0, void 0, void 0, function () {
245
- var projPath, podfile, result;
246
- return __generator(this, function (_a) {
247
- switch (_a.label) {
248
- case 0:
249
- projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));
250
- fs.mkdirSync(projPath, {
251
- recursive: true,
252
- });
253
- podfile = path.join(projPath, 'Podfile');
254
- fs.writeFileSync(podfile, 'pod "OtherPod"', 'utf8');
255
- return [4 /*yield*/, (0, cocoapod_1.addCocoaPods)(projPath)];
256
- case 1:
257
- result = _a.sent();
258
- // -- Assert --
259
- expect(result).toBeTruthy();
260
- expect(fs.readFileSync(podfile, 'utf8')).toBe("pod \"OtherPod\"\npod 'Sentry'\n");
261
- return [2 /*return*/];
262
- }
177
+ describe('Podfile includes other pods', () => {
178
+ it('should append Sentry pod after last pod', async () => {
179
+ // -- Arrange --
180
+ const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));
181
+ fs.mkdirSync(projPath, {
182
+ recursive: true,
263
183
  });
264
- }); });
184
+ const podfile = path.join(projPath, 'Podfile');
185
+ fs.writeFileSync(podfile, 'pod "OtherPod"', 'utf8');
186
+ // -- Act --
187
+ const result = await (0, cocoapod_1.addCocoaPods)(projPath);
188
+ // -- Assert --
189
+ expect(result).toBeTruthy();
190
+ expect(fs.readFileSync(podfile, 'utf8')).toBe(`pod "OtherPod"\npod 'Sentry'\n`);
191
+ });
265
192
  });
266
193
  });
267
194
  });
268
- describe('podInstall', function () {
269
- var workDir;
270
- beforeEach(function () {
195
+ describe('podInstall', () => {
196
+ let workDir;
197
+ beforeEach(() => {
271
198
  workDir = path.join(os.tmpdir(), 'test-project');
272
199
  });
273
- describe('any bash scripts fail', function () {
274
- beforeEach(function () {
200
+ describe('any bash scripts fail', () => {
201
+ beforeEach(() => {
275
202
  jest.spyOn(bash, 'execute').mockRejectedValue(new Error('test error'));
276
203
  });
277
- it('should not throw an error', function () { return __awaiter(void 0, void 0, void 0, function () {
278
- return __generator(this, function (_a) {
279
- switch (_a.label) {
280
- case 0:
281
- // -- Act & Assert --
282
- return [4 /*yield*/, expect((0, cocoapod_1.podInstall)(workDir)).resolves.not.toThrow()];
283
- case 1:
284
- // -- Act & Assert --
285
- _a.sent();
286
- return [2 /*return*/];
287
- }
288
- });
289
- }); });
290
- it('should set tag', function () { return __awaiter(void 0, void 0, void 0, function () {
291
- return __generator(this, function (_a) {
292
- switch (_a.label) {
293
- case 0:
294
- // -- Act --
295
- return [4 /*yield*/, (0, cocoapod_1.podInstall)(workDir)];
296
- case 1:
297
- // -- Act --
298
- _a.sent();
299
- // -- Assert --
300
- expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', false);
301
- return [2 /*return*/];
302
- }
303
- });
304
- }); });
305
- it('should capture exception', function () { return __awaiter(void 0, void 0, void 0, function () {
306
- return __generator(this, function (_a) {
307
- switch (_a.label) {
308
- case 0:
309
- // -- Act --
310
- return [4 /*yield*/, (0, cocoapod_1.podInstall)(workDir)];
311
- case 1:
312
- // -- Act --
313
- _a.sent();
314
- // -- Assert --
315
- expect(Sentry.captureException).toHaveBeenCalledWith('Sentry pod install failed.');
316
- return [2 /*return*/];
317
- }
318
- });
319
- }); });
320
- it('should start and stop spinner', function () { return __awaiter(void 0, void 0, void 0, function () {
321
- return __generator(this, function (_a) {
322
- switch (_a.label) {
323
- case 0:
324
- // -- Act --
325
- return [4 /*yield*/, (0, cocoapod_1.podInstall)(workDir)];
326
- case 1:
327
- // -- Act --
328
- _a.sent();
329
- // -- Assert --
330
- expect(clackSpinnerMock.start).toHaveBeenCalledWith("Running 'pod install'. This may take a few minutes...");
331
- expect(clackSpinnerMock.stop).toHaveBeenCalledWith('Failed to install pods.');
332
- return [2 /*return*/];
333
- }
334
- });
335
- }); });
204
+ it('should not throw an error', async () => {
205
+ // -- Act & Assert --
206
+ await expect((0, cocoapod_1.podInstall)(workDir)).resolves.not.toThrow();
207
+ });
208
+ it('should set tag', async () => {
209
+ // -- Act --
210
+ await (0, cocoapod_1.podInstall)(workDir);
211
+ // -- Assert --
212
+ expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', false);
213
+ });
214
+ it('should capture exception', async () => {
215
+ // -- Act --
216
+ await (0, cocoapod_1.podInstall)(workDir);
217
+ // -- Assert --
218
+ expect(Sentry.captureException).toHaveBeenCalledWith('Sentry pod install failed.');
219
+ });
220
+ it('should start and stop spinner', async () => {
221
+ // -- Act --
222
+ await (0, cocoapod_1.podInstall)(workDir);
223
+ // -- Assert --
224
+ expect(clackSpinnerMock.start).toHaveBeenCalledWith("Running 'pod install'. This may take a few minutes...");
225
+ expect(clackSpinnerMock.stop).toHaveBeenCalledWith('Failed to install pods.');
226
+ });
336
227
  });
337
- describe('all bash scripts work', function () {
338
- beforeEach(function () {
228
+ describe('all bash scripts work', () => {
229
+ beforeEach(() => {
339
230
  jest.spyOn(bash, 'execute').mockResolvedValue('');
340
231
  });
341
- it('should call pod update and install', function () { return __awaiter(void 0, void 0, void 0, function () {
342
- return __generator(this, function (_a) {
343
- switch (_a.label) {
344
- case 0:
345
- // -- Act --
346
- return [4 /*yield*/, (0, cocoapod_1.podInstall)(workDir)];
347
- case 1:
348
- // -- Act --
349
- _a.sent();
350
- // -- Assert --
351
- expect(bash.execute).toHaveBeenCalledWith("cd ".concat(workDir, " && pod repo update"));
352
- expect(bash.execute).toHaveBeenCalledWith("cd ".concat(workDir, " && pod install --silent"));
353
- return [2 /*return*/];
354
- }
355
- });
356
- }); });
357
- it('should set tag', function () { return __awaiter(void 0, void 0, void 0, function () {
358
- return __generator(this, function (_a) {
359
- switch (_a.label) {
360
- case 0:
361
- // -- Act --
362
- return [4 /*yield*/, (0, cocoapod_1.podInstall)(workDir)];
363
- case 1:
364
- // -- Act --
365
- _a.sent();
366
- // -- Assert --
367
- expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', true);
368
- return [2 /*return*/];
369
- }
370
- });
371
- }); });
372
- it('should start and stop spinner', function () { return __awaiter(void 0, void 0, void 0, function () {
373
- return __generator(this, function (_a) {
374
- switch (_a.label) {
375
- case 0:
376
- // -- Act --
377
- return [4 /*yield*/, (0, cocoapod_1.podInstall)(workDir)];
378
- case 1:
379
- // -- Act --
380
- _a.sent();
381
- // -- Assert --
382
- expect(clackSpinnerMock.start).toHaveBeenCalledWith("Running 'pod install'. This may take a few minutes...");
383
- expect(clackSpinnerMock.stop).toHaveBeenCalledWith('Pods installed.');
384
- return [2 /*return*/];
385
- }
386
- });
387
- }); });
232
+ it('should call pod update and install', async () => {
233
+ // -- Act --
234
+ await (0, cocoapod_1.podInstall)(workDir);
235
+ // -- Assert --
236
+ expect(bash.execute).toHaveBeenCalledWith(`cd ${workDir} && pod repo update`);
237
+ expect(bash.execute).toHaveBeenCalledWith(`cd ${workDir} && pod install --silent`);
238
+ });
239
+ it('should set tag', async () => {
240
+ // -- Act --
241
+ await (0, cocoapod_1.podInstall)(workDir);
242
+ // -- Assert --
243
+ expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', true);
244
+ });
245
+ it('should start and stop spinner', async () => {
246
+ // -- Act --
247
+ await (0, cocoapod_1.podInstall)(workDir);
248
+ // -- Assert --
249
+ expect(clackSpinnerMock.start).toHaveBeenCalledWith("Running 'pod install'. This may take a few minutes...");
250
+ expect(clackSpinnerMock.stop).toHaveBeenCalledWith('Pods installed.');
251
+ });
388
252
  });
389
- describe('dir not given', function () {
390
- it('should use current directory', function () { return __awaiter(void 0, void 0, void 0, function () {
391
- return __generator(this, function (_a) {
392
- switch (_a.label) {
393
- case 0:
394
- // -- Act --
395
- return [4 /*yield*/, (0, cocoapod_1.podInstall)()];
396
- case 1:
397
- // -- Act --
398
- _a.sent();
399
- // -- Assert --
400
- expect(bash.execute).toHaveBeenCalledWith("cd . && pod repo update");
401
- expect(bash.execute).toHaveBeenCalledWith("cd . && pod install --silent");
402
- return [2 /*return*/];
403
- }
404
- });
405
- }); });
253
+ describe('dir not given', () => {
254
+ it('should use current directory', async () => {
255
+ // -- Act --
256
+ await (0, cocoapod_1.podInstall)();
257
+ // -- Assert --
258
+ expect(bash.execute).toHaveBeenCalledWith(`cd . && pod repo update`);
259
+ expect(bash.execute).toHaveBeenCalledWith(`cd . && pod install --silent`);
260
+ });
406
261
  });
407
262
  });
408
263
  });
@@ -1 +1 @@
1
- {"version":3,"file":"cocoapod.test.js","sourceRoot":"","sources":["../../../test/apple/cocoapod.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport {\n addCocoaPods,\n podInstall,\n usesCocoaPod,\n} from '../../src/apple/cocoapod';\nimport * as bash from '../../src/utils/bash';\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\n\njest.mock('../../src/utils/bash');\njest.spyOn(Sentry, 'setTag').mockImplementation();\njest.spyOn(Sentry, 'captureException').mockImplementation();\n\nconst clackSpinnerMock = {\n start: jest.fn(),\n stop: jest.fn(),\n message: jest.fn(),\n};\n\ndescribe('cocoapod', () => {\n beforeEach(() => {\n jest.spyOn(clack, 'spinner').mockReturnValue(clackSpinnerMock);\n jest.spyOn(clack.log, 'error').mockImplementation();\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n describe('usesCocoaPod', () => {\n describe('Podfile exists', () => {\n it('should return true', () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-with-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n const podfile = path.join(tempDir, 'Podfile');\n fs.writeFileSync(podfile, '');\n\n // -- Act --\n const result = usesCocoaPod(tempDir);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n\n describe('Podfile does not exist', () => {\n it('should return false', () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-without-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n // -- Act --\n const result = usesCocoaPod(tempDir);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n });\n\n describe('addCocoaPods', () => {\n describe('Podfile does not exist', () => {\n it('should throw an error', async () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-without-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n // -- Act & Assert --\n await expect(addCocoaPods(tempDir)).rejects.toThrow(\n 'ENOENT: no such file or directory, open',\n );\n });\n });\n\n describe('Podfile exists', () => {\n describe('Podfile includes Sentry pod', () => {\n const variations = [\n {\n case: 'simple',\n content: 'pod \"Sentry\"',\n },\n {\n case: 'with-swiftui',\n content: 'pod \"SentrySwiftUI\"',\n },\n {\n case: 'leading-space',\n content: ' pod \"Sentry\"',\n },\n {\n case: 'leading-space-and-swiftui',\n content: ' pod \"SentrySwiftUI\"',\n },\n {\n case: 'trailing-space',\n content: 'pod \"Sentry\" ',\n },\n {\n case: 'trailing-space-and-swiftui',\n content: 'pod \"SentrySwiftUI\" ',\n },\n {\n case: 'single-quotes',\n content: \"pod 'Sentry'\",\n },\n {\n case: 'double-quotes',\n content: 'pod \"Sentry\"',\n },\n ];\n for (const variation of variations) {\n it(`should not change the Podfile for ${variation.case}`, async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, variation.content, 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(variation.content);\n });\n }\n });\n\n describe('Podfile includes no other pods', () => {\n describe('Podfile does not include use_frameworks!', () => {\n it('should not change the Podfile', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, '', 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe('');\n });\n });\n\n describe('Podfile includes use_frameworks!', () => {\n it('should change the Podfile', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, `use_frameworks!`, 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(\n `use_frameworks!\\npod 'Sentry'\\n`,\n );\n });\n });\n });\n\n describe('Podfile includes other pods', () => {\n it('should append Sentry pod after last pod', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, 'pod \"OtherPod\"', 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(\n `pod \"OtherPod\"\\npod 'Sentry'\\n`,\n );\n });\n });\n });\n });\n\n describe('podInstall', () => {\n let workDir: string;\n\n beforeEach(() => {\n workDir = path.join(os.tmpdir(), 'test-project');\n });\n\n describe('any bash scripts fail', () => {\n beforeEach(() => {\n jest.spyOn(bash, 'execute').mockRejectedValue(new Error('test error'));\n });\n\n it('should not throw an error', async () => {\n // -- Act & Assert --\n await expect(podInstall(workDir)).resolves.not.toThrow();\n });\n\n it('should set tag', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', false);\n });\n\n it('should capture exception', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.captureException).toHaveBeenCalledWith(\n 'Sentry pod install failed.',\n );\n });\n\n it('should start and stop spinner', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(clackSpinnerMock.start).toHaveBeenCalledWith(\n \"Running 'pod install'. This may take a few minutes...\",\n );\n expect(clackSpinnerMock.stop).toHaveBeenCalledWith(\n 'Failed to install pods.',\n );\n });\n });\n\n describe('all bash scripts work', () => {\n beforeEach(() => {\n jest.spyOn(bash, 'execute').mockResolvedValue('');\n });\n\n it('should call pod update and install', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(bash.execute).toHaveBeenCalledWith(\n `cd ${workDir} && pod repo update`,\n );\n expect(bash.execute).toHaveBeenCalledWith(\n `cd ${workDir} && pod install --silent`,\n );\n });\n\n it('should set tag', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', true);\n });\n\n it('should start and stop spinner', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(clackSpinnerMock.start).toHaveBeenCalledWith(\n \"Running 'pod install'. This may take a few minutes...\",\n );\n expect(clackSpinnerMock.stop).toHaveBeenCalledWith('Pods installed.');\n });\n });\n\n describe('dir not given', () => {\n it('should use current directory', async () => {\n // -- Act --\n await podInstall();\n\n // -- Assert --\n expect(bash.execute).toHaveBeenCalledWith(`cd . && pod repo update`);\n expect(bash.execute).toHaveBeenCalledWith(\n `cd . && pod install --silent`,\n );\n });\n });\n });\n});\n"]}
1
+ {"version":3,"file":"cocoapod.test.js","sourceRoot":"","sources":["../../../test/apple/cocoapod.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport {\n addCocoaPods,\n podInstall,\n usesCocoaPod,\n} from '../../src/apple/cocoapod';\nimport * as bash from '../../src/utils/bash';\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\njest.mock('@clack/prompts', () => ({\n __esModule: true,\n ...jest.requireActual('@clack/prompts'),\n}));\n\njest.mock('../../src/utils/bash');\njest.spyOn(Sentry, 'setTag').mockImplementation();\njest.spyOn(Sentry, 'captureException').mockImplementation();\n\nconst clackSpinnerMock = {\n start: jest.fn(),\n stop: jest.fn(),\n message: jest.fn(),\n};\n\ndescribe('cocoapod', () => {\n beforeEach(() => {\n jest.spyOn(clack, 'spinner').mockReturnValue(clackSpinnerMock);\n jest.spyOn(clack.log, 'error').mockImplementation();\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n describe('usesCocoaPod', () => {\n describe('Podfile exists', () => {\n it('should return true', () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-with-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n const podfile = path.join(tempDir, 'Podfile');\n fs.writeFileSync(podfile, '');\n\n // -- Act --\n const result = usesCocoaPod(tempDir);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n\n describe('Podfile does not exist', () => {\n it('should return false', () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-without-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n // -- Act --\n const result = usesCocoaPod(tempDir);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n });\n\n describe('addCocoaPods', () => {\n describe('Podfile does not exist', () => {\n it('should throw an error', async () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-without-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n // -- Act & Assert --\n await expect(addCocoaPods(tempDir)).rejects.toThrow(\n 'ENOENT: no such file or directory, open',\n );\n });\n });\n\n describe('Podfile exists', () => {\n describe('Podfile includes Sentry pod', () => {\n const variations = [\n {\n case: 'simple',\n content: 'pod \"Sentry\"',\n },\n {\n case: 'with-swiftui',\n content: 'pod \"SentrySwiftUI\"',\n },\n {\n case: 'leading-space',\n content: ' pod \"Sentry\"',\n },\n {\n case: 'leading-space-and-swiftui',\n content: ' pod \"SentrySwiftUI\"',\n },\n {\n case: 'trailing-space',\n content: 'pod \"Sentry\" ',\n },\n {\n case: 'trailing-space-and-swiftui',\n content: 'pod \"SentrySwiftUI\" ',\n },\n {\n case: 'single-quotes',\n content: \"pod 'Sentry'\",\n },\n {\n case: 'double-quotes',\n content: 'pod \"Sentry\"',\n },\n ];\n for (const variation of variations) {\n it(`should not change the Podfile for ${variation.case}`, async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, variation.content, 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(variation.content);\n });\n }\n });\n\n describe('Podfile includes no other pods', () => {\n describe('Podfile does not include use_frameworks!', () => {\n it('should not change the Podfile', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, '', 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe('');\n });\n });\n\n describe('Podfile includes use_frameworks!', () => {\n it('should change the Podfile', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, `use_frameworks!`, 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(\n `use_frameworks!\\npod 'Sentry'\\n`,\n );\n });\n });\n });\n\n describe('Podfile includes other pods', () => {\n it('should append Sentry pod after last pod', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, 'pod \"OtherPod\"', 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(\n `pod \"OtherPod\"\\npod 'Sentry'\\n`,\n );\n });\n });\n });\n });\n\n describe('podInstall', () => {\n let workDir: string;\n\n beforeEach(() => {\n workDir = path.join(os.tmpdir(), 'test-project');\n });\n\n describe('any bash scripts fail', () => {\n beforeEach(() => {\n jest.spyOn(bash, 'execute').mockRejectedValue(new Error('test error'));\n });\n\n it('should not throw an error', async () => {\n // -- Act & Assert --\n await expect(podInstall(workDir)).resolves.not.toThrow();\n });\n\n it('should set tag', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', false);\n });\n\n it('should capture exception', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.captureException).toHaveBeenCalledWith(\n 'Sentry pod install failed.',\n );\n });\n\n it('should start and stop spinner', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(clackSpinnerMock.start).toHaveBeenCalledWith(\n \"Running 'pod install'. This may take a few minutes...\",\n );\n expect(clackSpinnerMock.stop).toHaveBeenCalledWith(\n 'Failed to install pods.',\n );\n });\n });\n\n describe('all bash scripts work', () => {\n beforeEach(() => {\n jest.spyOn(bash, 'execute').mockResolvedValue('');\n });\n\n it('should call pod update and install', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(bash.execute).toHaveBeenCalledWith(\n `cd ${workDir} && pod repo update`,\n );\n expect(bash.execute).toHaveBeenCalledWith(\n `cd ${workDir} && pod install --silent`,\n );\n });\n\n it('should set tag', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', true);\n });\n\n it('should start and stop spinner', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(clackSpinnerMock.start).toHaveBeenCalledWith(\n \"Running 'pod install'. This may take a few minutes...\",\n );\n expect(clackSpinnerMock.stop).toHaveBeenCalledWith('Pods installed.');\n });\n });\n\n describe('dir not given', () => {\n it('should use current directory', async () => {\n // -- Act --\n await podInstall();\n\n // -- Assert --\n expect(bash.execute).toHaveBeenCalledWith(`cd . && pod repo update`);\n expect(bash.execute).toHaveBeenCalledWith(\n `cd . && pod install --silent`,\n );\n });\n });\n });\n});\n"]}