@sentry/wizard 4.5.0 → 4.7.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 (293) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/README.md +23 -19
  3. package/dist/bin.js +22 -0
  4. package/dist/bin.js.map +1 -1
  5. package/dist/e2e-tests/tests/flutter.test.js +16 -16
  6. package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
  7. package/dist/e2e-tests/tests/help-message.test.js +56 -0
  8. package/dist/e2e-tests/tests/help-message.test.js.map +1 -0
  9. package/dist/e2e-tests/tests/nextjs-14.test.js +17 -16
  10. package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
  11. package/dist/e2e-tests/tests/nextjs-15.test.js +16 -16
  12. package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
  13. package/dist/e2e-tests/tests/nuxt-3.test.js +13 -12
  14. package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
  15. package/dist/e2e-tests/tests/nuxt-4.test.js +13 -12
  16. package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
  17. package/dist/e2e-tests/tests/remix.test.js +20 -20
  18. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  19. package/dist/e2e-tests/tests/sveltekit.test.js +20 -20
  20. package/dist/e2e-tests/tests/sveltekit.test.js.map +1 -1
  21. package/dist/e2e-tests/utils/index.d.ts +1 -1
  22. package/dist/e2e-tests/utils/index.js +35 -13
  23. package/dist/e2e-tests/utils/index.js.map +1 -1
  24. package/dist/lib/Constants.d.ts +7 -1
  25. package/dist/lib/Constants.js.map +1 -1
  26. package/dist/lib/Helper/File.d.ts +1 -1
  27. package/dist/lib/Helper/File.js +1 -3
  28. package/dist/lib/Helper/File.js.map +1 -1
  29. package/dist/lib/Helper/Logging.d.ts +4 -1
  30. package/dist/lib/Helper/Logging.js +3 -0
  31. package/dist/lib/Helper/Logging.js.map +1 -1
  32. package/dist/lib/Helper/Package.d.ts +5 -3
  33. package/dist/lib/Helper/Package.js +2 -2
  34. package/dist/lib/Helper/Package.js.map +1 -1
  35. package/dist/lib/Helper/SentryCli.d.ts +20 -7
  36. package/dist/lib/Helper/SentryCli.js +21 -13
  37. package/dist/lib/Helper/SentryCli.js.map +1 -1
  38. package/dist/lib/Helper/Wizard.js +9 -5
  39. package/dist/lib/Helper/Wizard.js.map +1 -1
  40. package/dist/lib/Helper/__tests__/File.js +9 -9
  41. package/dist/lib/Helper/__tests__/File.js.map +1 -1
  42. package/dist/lib/Helper/__tests__/MergeConfig.js +17 -17
  43. package/dist/lib/Helper/__tests__/MergeConfig.js.map +1 -1
  44. package/dist/lib/Helper/__tests__/SentryCli.js +39 -21
  45. package/dist/lib/Helper/__tests__/SentryCli.js.map +1 -1
  46. package/dist/lib/Setup.d.ts +4 -1
  47. package/dist/lib/Setup.js +12 -2
  48. package/dist/lib/Setup.js.map +1 -1
  49. package/dist/lib/Steps/BaseStep.d.ts +1 -1
  50. package/dist/lib/Steps/BaseStep.js.map +1 -1
  51. package/dist/lib/Steps/Integrations/BaseIntegration.js +1 -2
  52. package/dist/lib/Steps/Integrations/BaseIntegration.js.map +1 -1
  53. package/dist/lib/Steps/Integrations/Cordova.js +14 -10
  54. package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
  55. package/dist/lib/Steps/Integrations/Electron.d.ts +4 -1
  56. package/dist/lib/Steps/Integrations/Electron.js +1 -1
  57. package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
  58. package/dist/lib/Steps/Integrations/MobileProject.d.ts +3 -1
  59. package/dist/lib/Steps/Integrations/MobileProject.js +1 -1
  60. package/dist/lib/Steps/Integrations/MobileProject.js.map +1 -1
  61. package/dist/lib/Steps/PromptForParameters.d.ts +4 -1
  62. package/dist/lib/Steps/PromptForParameters.js.map +1 -1
  63. package/dist/lib/Steps/SentryProjectSelector.d.ts +42 -1
  64. package/dist/lib/Steps/SentryProjectSelector.js +1 -1
  65. package/dist/lib/Steps/SentryProjectSelector.js.map +1 -1
  66. package/dist/lib/Steps/WaitForSentry.d.ts +3 -1
  67. package/dist/lib/Steps/WaitForSentry.js +4 -4
  68. package/dist/lib/Steps/WaitForSentry.js.map +1 -1
  69. package/dist/lib/Steps/Welcome.js +5 -0
  70. package/dist/lib/Steps/Welcome.js.map +1 -1
  71. package/dist/lib/Types.d.ts +14 -0
  72. package/dist/lib/Types.js +3 -0
  73. package/dist/lib/Types.js.map +1 -0
  74. package/dist/lib/__tests__/Env.js +10 -16
  75. package/dist/lib/__tests__/Env.js.map +1 -1
  76. package/dist/src/android/android-wizard.js +15 -12
  77. package/dist/src/android/android-wizard.js.map +1 -1
  78. package/dist/src/android/code-tools.js +1 -1
  79. package/dist/src/android/code-tools.js.map +1 -1
  80. package/dist/src/android/gradle.js +4 -4
  81. package/dist/src/android/gradle.js.map +1 -1
  82. package/dist/src/android/manifest.js +1 -1
  83. package/dist/src/android/manifest.js.map +1 -1
  84. package/dist/src/apple/apple-wizard.d.ts +2 -2
  85. package/dist/src/apple/apple-wizard.js +54 -175
  86. package/dist/src/apple/apple-wizard.js.map +1 -1
  87. package/dist/src/apple/check-installed-cli.d.ts +1 -0
  88. package/dist/src/apple/check-installed-cli.js +60 -0
  89. package/dist/src/apple/check-installed-cli.js.map +1 -0
  90. package/dist/src/apple/cocoapod.js +1 -1
  91. package/dist/src/apple/cocoapod.js.map +1 -1
  92. package/dist/src/apple/code-tools.js +1 -1
  93. package/dist/src/apple/code-tools.js.map +1 -1
  94. package/dist/src/apple/configure-fastlane.d.ts +5 -0
  95. package/dist/src/apple/configure-fastlane.js +66 -0
  96. package/dist/src/apple/configure-fastlane.js.map +1 -0
  97. package/dist/src/apple/configure-package-manager.d.ts +5 -0
  98. package/dist/src/apple/configure-package-manager.js +68 -0
  99. package/dist/src/apple/configure-package-manager.js.map +1 -0
  100. package/dist/src/apple/configure-sentry-cli.d.ts +4 -0
  101. package/dist/src/apple/configure-sentry-cli.js +47 -0
  102. package/dist/src/apple/configure-sentry-cli.js.map +1 -0
  103. package/dist/src/apple/configure-xcode-project.d.ts +8 -0
  104. package/dist/src/apple/configure-xcode-project.js +11 -0
  105. package/dist/src/apple/configure-xcode-project.js.map +1 -0
  106. package/dist/src/apple/fastlane.d.ts +1 -1
  107. package/dist/src/apple/fastlane.js +5 -5
  108. package/dist/src/apple/fastlane.js.map +1 -1
  109. package/dist/src/apple/inject-code-snippet.d.ts +6 -0
  110. package/dist/src/apple/inject-code-snippet.js +54 -0
  111. package/dist/src/apple/inject-code-snippet.js.map +1 -0
  112. package/dist/src/apple/lookup-xcode-project.d.ts +7 -0
  113. package/dist/src/apple/lookup-xcode-project.js +98 -0
  114. package/dist/src/apple/lookup-xcode-project.js.map +1 -0
  115. package/dist/src/apple/options.d.ts +4 -0
  116. package/dist/src/apple/options.js +3 -0
  117. package/dist/src/apple/options.js.map +1 -0
  118. package/dist/src/apple/search-xcode-project-at-path.d.ts +1 -0
  119. package/dist/src/apple/search-xcode-project-at-path.js +70 -0
  120. package/dist/src/apple/search-xcode-project-at-path.js.map +1 -0
  121. package/dist/src/apple/templates.js +11 -7
  122. package/dist/src/apple/templates.js.map +1 -1
  123. package/dist/src/apple/xcode-manager.js +4 -7
  124. package/dist/src/apple/xcode-manager.js.map +1 -1
  125. package/dist/src/flutter/code-tools.js +3 -3
  126. package/dist/src/flutter/code-tools.js.map +1 -1
  127. package/dist/src/flutter/flutter-wizard.js +21 -15
  128. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  129. package/dist/src/flutter/templates.js +4 -4
  130. package/dist/src/flutter/templates.js.map +1 -1
  131. package/dist/src/nextjs/nextjs-wizard.js +118 -43
  132. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  133. package/dist/src/nextjs/templates.d.ts +10 -1
  134. package/dist/src/nextjs/templates.js +192 -62
  135. package/dist/src/nextjs/templates.js.map +1 -1
  136. package/dist/src/nuxt/nuxt-wizard.js +21 -16
  137. package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
  138. package/dist/src/nuxt/sdk-example.js +3 -3
  139. package/dist/src/nuxt/sdk-example.js.map +1 -1
  140. package/dist/src/nuxt/sdk-setup.js +9 -9
  141. package/dist/src/nuxt/sdk-setup.js.map +1 -1
  142. package/dist/src/nuxt/templates.js +173 -58
  143. package/dist/src/nuxt/templates.js.map +1 -1
  144. package/dist/src/nuxt/utils.js +6 -3
  145. package/dist/src/nuxt/utils.js.map +1 -1
  146. package/dist/src/react-native/expo-env-file.js +1 -1
  147. package/dist/src/react-native/expo-env-file.js.map +1 -1
  148. package/dist/src/react-native/expo-metro.js +4 -4
  149. package/dist/src/react-native/expo-metro.js.map +1 -1
  150. package/dist/src/react-native/expo.js +4 -4
  151. package/dist/src/react-native/expo.js.map +1 -1
  152. package/dist/src/react-native/javascript.d.ts +6 -4
  153. package/dist/src/react-native/javascript.js +31 -15
  154. package/dist/src/react-native/javascript.js.map +1 -1
  155. package/dist/src/react-native/metro.js +8 -8
  156. package/dist/src/react-native/metro.js.map +1 -1
  157. package/dist/src/react-native/react-native-wizard.d.ts +5 -1
  158. package/dist/src/react-native/react-native-wizard.js +66 -36
  159. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  160. package/dist/src/react-native/uninstall.js +8 -5
  161. package/dist/src/react-native/uninstall.js.map +1 -1
  162. package/dist/src/react-native/xcode.d.ts +9 -4
  163. package/dist/src/react-native/xcode.js +65 -22
  164. package/dist/src/react-native/xcode.js.map +1 -1
  165. package/dist/src/remix/codemods/handle-error.js +4 -1
  166. package/dist/src/remix/codemods/handle-error.js.map +1 -1
  167. package/dist/src/remix/remix-wizard.js +23 -18
  168. package/dist/src/remix/remix-wizard.js.map +1 -1
  169. package/dist/src/remix/sdk-example.js +163 -64
  170. package/dist/src/remix/sdk-example.js.map +1 -1
  171. package/dist/src/remix/sdk-setup.js +11 -7
  172. package/dist/src/remix/sdk-setup.js.map +1 -1
  173. package/dist/src/run.d.ts +3 -1
  174. package/dist/src/run.js +29 -9
  175. package/dist/src/run.js.map +1 -1
  176. package/dist/src/sourcemaps/sourcemaps-wizard.js +30 -28
  177. package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
  178. package/dist/src/sourcemaps/tools/angular.js +3 -3
  179. package/dist/src/sourcemaps/tools/angular.js.map +1 -1
  180. package/dist/src/sourcemaps/tools/create-react-app.js +3 -3
  181. package/dist/src/sourcemaps/tools/create-react-app.js.map +1 -1
  182. package/dist/src/sourcemaps/tools/esbuild.js +6 -6
  183. package/dist/src/sourcemaps/tools/esbuild.js.map +1 -1
  184. package/dist/src/sourcemaps/tools/nextjs.js +5 -5
  185. package/dist/src/sourcemaps/tools/nextjs.js.map +1 -1
  186. package/dist/src/sourcemaps/tools/remix.js +4 -4
  187. package/dist/src/sourcemaps/tools/remix.js.map +1 -1
  188. package/dist/src/sourcemaps/tools/rollup.js +6 -6
  189. package/dist/src/sourcemaps/tools/rollup.js.map +1 -1
  190. package/dist/src/sourcemaps/tools/sentry-cli.js +15 -15
  191. package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
  192. package/dist/src/sourcemaps/tools/tsc.js +6 -6
  193. package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
  194. package/dist/src/sourcemaps/tools/vite.js +12 -12
  195. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  196. package/dist/src/sourcemaps/tools/webpack.js +10 -10
  197. package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
  198. package/dist/src/sourcemaps/utils/detect-tool.js +2 -2
  199. package/dist/src/sourcemaps/utils/detect-tool.js.map +1 -1
  200. package/dist/src/sourcemaps/utils/other-wizards.js +5 -5
  201. package/dist/src/sourcemaps/utils/other-wizards.js.map +1 -1
  202. package/dist/src/sourcemaps/utils/sdk-version.js +7 -7
  203. package/dist/src/sourcemaps/utils/sdk-version.js.map +1 -1
  204. package/dist/src/sveltekit/sdk-example.js +1 -1
  205. package/dist/src/sveltekit/sdk-example.js.map +1 -1
  206. package/dist/src/sveltekit/sdk-setup.js +15 -14
  207. package/dist/src/sveltekit/sdk-setup.js.map +1 -1
  208. package/dist/src/sveltekit/sveltekit-wizard.js +25 -20
  209. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  210. package/dist/src/sveltekit/templates.js +126 -37
  211. package/dist/src/sveltekit/templates.js.map +1 -1
  212. package/dist/src/telemetry.js +11 -0
  213. package/dist/src/telemetry.js.map +1 -1
  214. package/dist/src/utils/{clack-utils.d.ts → clack/index.d.ts} +45 -7
  215. package/dist/src/utils/{clack-utils.js → clack/index.js} +75 -20
  216. package/dist/src/utils/clack/index.js.map +1 -0
  217. package/dist/src/utils/debug.js +1 -1
  218. package/dist/src/utils/debug.js.map +1 -1
  219. package/dist/src/utils/find-files-with-extension.d.ts +1 -0
  220. package/dist/src/utils/find-files-with-extension.js +39 -0
  221. package/dist/src/utils/find-files-with-extension.js.map +1 -0
  222. package/dist/src/utils/package-manager.d.ts +8 -1
  223. package/dist/src/utils/package-manager.js +79 -23
  224. package/dist/src/utils/package-manager.js.map +1 -1
  225. package/dist/src/utils/sentrycli-utils.js +0 -1
  226. package/dist/src/utils/sentrycli-utils.js.map +1 -1
  227. package/dist/src/utils/types.d.ts +4 -0
  228. package/dist/src/utils/types.js.map +1 -1
  229. package/dist/src/version.d.ts +1 -1
  230. package/dist/src/version.js +1 -1
  231. package/dist/src/version.js.map +1 -1
  232. package/dist/test/android/code-tools.test.js +13 -13
  233. package/dist/test/android/code-tools.test.js.map +1 -1
  234. package/dist/test/apple/cocoapod.test.js +78 -73
  235. package/dist/test/apple/cocoapod.test.js.map +1 -1
  236. package/dist/test/apple/code-tools.test.js +174 -167
  237. package/dist/test/apple/code-tools.test.js.map +1 -1
  238. package/dist/test/apple/fastfile.test.js +87 -84
  239. package/dist/test/apple/fastfile.test.js.map +1 -1
  240. package/dist/test/apple/templates.test.js +32 -27
  241. package/dist/test/apple/templates.test.js.map +1 -1
  242. package/dist/test/apple/xcode-manager.test.js +208 -185
  243. package/dist/test/apple/xcode-manager.test.js.map +1 -1
  244. package/dist/test/flutter/code-tools.test.js +29 -30
  245. package/dist/test/flutter/code-tools.test.js.map +1 -1
  246. package/dist/test/flutter/templates.test.js +38 -37
  247. package/dist/test/flutter/templates.test.js.map +1 -1
  248. package/dist/test/nextjs/templates.test.js +155 -103
  249. package/dist/test/nextjs/templates.test.js.map +1 -1
  250. package/dist/test/nuxt/templates.test.js +25 -24
  251. package/dist/test/nuxt/templates.test.js.map +1 -1
  252. package/dist/test/react-native/expo-metro.test.js +12 -11
  253. package/dist/test/react-native/expo-metro.test.js.map +1 -1
  254. package/dist/test/react-native/expo.test.js +11 -10
  255. package/dist/test/react-native/expo.test.js.map +1 -1
  256. package/dist/test/react-native/gradle.test.js +27 -26
  257. package/dist/test/react-native/gradle.test.js.map +1 -1
  258. package/dist/test/react-native/javascript.test.js +109 -59
  259. package/dist/test/react-native/javascript.test.js.map +1 -1
  260. package/dist/test/react-native/metro.test.js +66 -65
  261. package/dist/test/react-native/metro.test.js.map +1 -1
  262. package/dist/test/react-native/xcode.test.js +138 -37
  263. package/dist/test/react-native/xcode.test.js.map +1 -1
  264. package/dist/test/remix/client-entry.test.js +8 -7
  265. package/dist/test/remix/client-entry.test.js.map +1 -1
  266. package/dist/test/remix/server-instrumentation.test.js +6 -5
  267. package/dist/test/remix/server-instrumentation.test.js.map +1 -1
  268. package/dist/test/sourcemaps/tools/sentry-cli.test.js +21 -21
  269. package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -1
  270. package/dist/test/sourcemaps/tools/tsc.test.js +13 -14
  271. package/dist/test/sourcemaps/tools/tsc.test.js.map +1 -1
  272. package/dist/test/sourcemaps/tools/vite.test.js +13 -14
  273. package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
  274. package/dist/test/sourcemaps/tools/webpack.test.js +19 -20
  275. package/dist/test/sourcemaps/tools/webpack.test.js.map +1 -1
  276. package/dist/test/sveltekit/templates.test.js +13 -12
  277. package/dist/test/sveltekit/templates.test.js.map +1 -1
  278. package/dist/test/utils/ast-utils.test.js +45 -44
  279. package/dist/test/utils/ast-utils.test.js.map +1 -1
  280. package/dist/test/utils/clack/index.test.d.ts +1 -0
  281. package/dist/test/utils/clack/index.test.js +375 -0
  282. package/dist/test/utils/clack/index.test.js.map +1 -0
  283. package/dist/test/utils/package-manager.test.d.ts +1 -0
  284. package/dist/test/utils/package-manager.test.js +30 -0
  285. package/dist/test/utils/package-manager.test.js.map +1 -0
  286. package/package.json +10 -38
  287. package/dist/e2e-tests/jest.config.d.ts +0 -17
  288. package/dist/e2e-tests/jest.config.js +0 -23
  289. package/dist/e2e-tests/jest.config.js.map +0 -1
  290. package/dist/src/utils/clack-utils.js.map +0 -1
  291. package/dist/test/utils/clack-utils.test.js +0 -306
  292. package/dist/test/utils/clack-utils.test.js.map +0 -1
  293. /package/dist/{test/utils/clack-utils.test.d.ts → e2e-tests/tests/help-message.test.d.ts} +0 -0
@@ -29,11 +29,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.Cordova = void 0;
30
30
  const fs = __importStar(require("node:fs"));
31
31
  const path = __importStar(require("node:path"));
32
+ const xcode_1 = __importDefault(require("xcode"));
32
33
  const File_1 = require("../../Helper/File");
33
34
  const Logging_1 = require("../../Helper/Logging");
34
35
  const SentryCli_1 = require("../../Helper/SentryCli");
35
36
  const BaseIntegration_1 = require("./BaseIntegration");
36
- const xcode_1 = __importDefault(require("xcode"));
37
37
  class Cordova extends BaseIntegration_1.BaseIntegration {
38
38
  _argv;
39
39
  _sentryCli;
@@ -49,13 +49,13 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
49
49
  return this.uninstall(answers);
50
50
  }
51
51
  const sentryCliProperties = this._sentryCli.convertAnswersToProperties(answers);
52
- await (0, File_1.patchMatchingFile)(`${this._folderPrefix}/ios/*.xcodeproj/project.pbxproj`, this._patchXcodeProj.bind(this));
52
+ await (0, File_1.patchMatchingFile)(`${this._folderPrefix}/ios/*.xcodeproj/project.pbxproj`, (contents, filename) => this._patchXcodeProj(contents, filename));
53
53
  await this._addSentryProperties(sentryCliProperties);
54
54
  (0, Logging_1.green)('Successfully set up for cordova');
55
55
  return {};
56
56
  }
57
57
  async uninstall(_answers) {
58
- await (0, File_1.patchMatchingFile)('**/*.xcodeproj/project.pbxproj', this._unpatchXcodeProj.bind(this));
58
+ await (0, File_1.patchMatchingFile)('**/*.xcodeproj/project.pbxproj', (_, filename) => this._unpatchXcodeProj(filename));
59
59
  return {};
60
60
  }
61
61
  async shouldConfigure(_answers) {
@@ -95,7 +95,7 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
95
95
  }
96
96
  _unpatchXcodeBuildScripts(proj) {
97
97
  const scripts = proj.hash.project.objects.PBXShellScriptBuildPhase || {};
98
- const firstTarget = proj.getFirstTarget().uuid;
98
+ const firstTarget = proj.getFirstTarget()?.uuid || '';
99
99
  const nativeTargets = proj.hash.project.objects.PBXNativeTarget;
100
100
  // scripts to kill entirely.
101
101
  for (const key of Object.keys(scripts)) {
@@ -104,13 +104,14 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
104
104
  if (typeof script === 'string' || script === undefined) {
105
105
  continue;
106
106
  }
107
- if (script.shellScript.match(/SENTRY_PROPERTIES/) ||
108
- script.shellScript.match(/SENTRY_FRAMEWORK_PATCH/)) {
107
+ if (script.shellScript?.match(/SENTRY_PROPERTIES/) ||
108
+ script.shellScript?.match(/SENTRY_FRAMEWORK_PATCH/)) {
109
109
  // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
110
110
  delete scripts[key];
111
111
  // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
112
112
  delete scripts[`${key}_comment`];
113
- const phases = nativeTargets[firstTarget].buildPhases;
113
+ const target = nativeTargets && nativeTargets[firstTarget];
114
+ const phases = typeof target === 'object' && target.buildPhases;
114
115
  if (phases) {
115
116
  for (let i = 0; i < phases.length; i++) {
116
117
  if (phases[i].value === key) {
@@ -133,7 +134,8 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
133
134
  }
134
135
  const buildScripts = [];
135
136
  for (const val of Object.values(proj.hash.project.objects.PBXShellScriptBuildPhase || {})) {
136
- if (val.isa) {
137
+ if (typeof val === 'object' &&
138
+ val.isa === 'PBXShellScriptBuildPhase') {
137
139
  buildScripts.push(val);
138
140
  }
139
141
  }
@@ -155,7 +157,8 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
155
157
  }
156
158
  _addNewXcodeBuildPhaseForSymbols(buildScripts, proj) {
157
159
  for (const script of buildScripts) {
158
- if (script.shellScript.match(/SENTRY_PROPERTIES/)) {
160
+ if (typeof script === 'object' &&
161
+ script.shellScript?.match(/SENTRY_PROPERTIES/)) {
159
162
  return;
160
163
  }
161
164
  }
@@ -193,7 +196,8 @@ class Cordova extends BaseIntegration_1.BaseIntegration {
193
196
  }
194
197
  _addNewXcodeBuildPhaseForStripping(buildScripts, proj) {
195
198
  for (const script of buildScripts) {
196
- if (script.shellScript.match(/SENTRY_FRAMEWORK_PATCH/)) {
199
+ if (typeof script === 'object' &&
200
+ script.shellScript?.match(/SENTRY_FRAMEWORK_PATCH/)) {
197
201
  return;
198
202
  }
199
203
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Cordova.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/Cordova.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { Answers } from 'inquirer';\n\nimport type { Args } from '../../Constants';\nimport { exists, matchesContent, patchMatchingFile } from '../../Helper/File';\nimport { green } from '../../Helper/Logging';\nimport { SentryCli } from '../../Helper/SentryCli';\nimport { BaseIntegration } from './BaseIntegration';\n\nimport xcode from 'xcode';\nimport type { PBXShellScriptBuildPhase } from 'xcode';\n\nexport class Cordova extends BaseIntegration {\n protected _sentryCli: SentryCli;\n\n protected _folderPrefix = 'platforms';\n protected _pluginFolder: string[] = ['.'];\n\n public constructor(protected _argv: Args) {\n super(_argv);\n this._sentryCli = new SentryCli(this._argv);\n }\n\n public async emit(answers: Answers): Promise<Answers> {\n if (this._argv.uninstall) {\n return this.uninstall(answers);\n }\n\n const sentryCliProperties =\n this._sentryCli.convertAnswersToProperties(answers);\n\n await patchMatchingFile(\n `${this._folderPrefix}/ios/*.xcodeproj/project.pbxproj`,\n this._patchXcodeProj.bind(this),\n );\n\n await this._addSentryProperties(sentryCliProperties);\n green('Successfully set up for cordova');\n\n return {};\n }\n\n public async uninstall(_answers: Answers): Promise<Answers> {\n await patchMatchingFile(\n '**/*.xcodeproj/project.pbxproj',\n this._unpatchXcodeProj.bind(this),\n );\n\n return {};\n }\n\n public async shouldConfigure(_answers: Answers): Promise<Answers> {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n if (this._shouldConfigure) {\n return this._shouldConfigure;\n }\n\n let result = false;\n if (!exists(path.join('sentry.properties'))) {\n result = true;\n this.debug('sentry.properties not exists');\n }\n\n if (\n !matchesContent('**/*.xcodeproj/project.pbxproj', /SENTRY_PROPERTIES/gi)\n ) {\n result = true;\n this.debug('**/*.xcodeproj/project.pbxproj not matched');\n }\n\n if (this._argv.uninstall) {\n // if we uninstall we need to invert the result so we remove already patched\n result = !result;\n }\n\n this._shouldConfigure = Promise.resolve({ cordova: result });\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.shouldConfigure;\n }\n\n private _unpatchXcodeProj(filename: string): Promise<string> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: any) => {\n if (err) {\n reject(err);\n return;\n }\n\n this._unpatchXcodeBuildScripts(proj);\n resolve(proj.writeSync());\n });\n });\n }\n\n private _unpatchXcodeBuildScripts(proj: any): void {\n const scripts = proj.hash.project.objects.PBXShellScriptBuildPhase || {};\n const firstTarget = proj.getFirstTarget().uuid;\n const nativeTargets = proj.hash.project.objects.PBXNativeTarget;\n\n // scripts to kill entirely.\n for (const key of Object.keys(scripts)) {\n const script = scripts[key];\n\n // ignore comments and keys that got deleted\n if (typeof script === 'string' || script === undefined) {\n continue;\n }\n\n if (\n script.shellScript.match(/SENTRY_PROPERTIES/) ||\n script.shellScript.match(/SENTRY_FRAMEWORK_PATCH/)\n ) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[key];\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[`${key}_comment`];\n const phases = nativeTargets[firstTarget].buildPhases;\n if (phases) {\n for (let i = 0; i < phases.length; i++) {\n if (phases[i].value === key) {\n phases.splice(i, 1);\n break;\n }\n }\n }\n continue;\n }\n }\n }\n\n private _patchXcodeProj(\n contents: string,\n filename: string,\n ): Promise<void | string> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: any) => {\n if (err) {\n reject(err);\n return;\n }\n\n const buildScripts = [];\n for (const val of Object.values(\n proj.hash.project.objects.PBXShellScriptBuildPhase || {},\n )) {\n if ((val as PBXShellScriptBuildPhase).isa) {\n buildScripts.push(val);\n }\n }\n\n this._addNewXcodeBuildPhaseForSymbols(buildScripts, proj);\n this._addNewXcodeBuildPhaseForStripping(buildScripts, proj);\n\n // we always modify the xcode file in memory but we only want to save it\n // in case the user wants configuration for ios. This is why we check\n // here first if changes are made before we might prompt the platform\n // continue prompt.\n const newContents = proj.writeSync();\n if (newContents === contents) {\n resolve();\n } else {\n resolve(newContents);\n }\n });\n });\n }\n\n private _addNewXcodeBuildPhaseForSymbols(buildScripts: any, proj: any): void {\n for (const script of buildScripts) {\n if (script.shellScript.match(/SENTRY_PROPERTIES/)) {\n return;\n }\n }\n const cwd = path.join(process.cwd(), 'sentry.properties');\n proj.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Upload Debug Symbols to Sentry',\n null,\n {\n shellPath: '/bin/sh',\n shellScript:\n // eslint-disable-next-line prefer-template\n 'echo \"warning: uploading debug symbols - set SENTRY_SKIP_DSYM_UPLOAD=true to skip this\"\\\\n' +\n 'if [ -n \"$SENTRY_SKIP_DSYM_UPLOAD\" ]; then\\\\n' +\n ' echo \"warning: skipping debug symbol upload\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'export SENTRY_PROPERTIES=' +\n cwd +\n '\\\\n' +\n 'function getProperty {\\\\n' +\n ' PROP_KEY=$1\\\\n' +\n ' PROP_VALUE=`cat $SENTRY_PROPERTIES | grep \"$PROP_KEY\" | cut -d\\'=\\' -f2`\\\\n' +\n ' if [ -z \"$PROP_VALUE\" ]; then\\\\n' +\n ' echo \"plugins/sentry-cordova/node_modules/@sentry/cli/bin/sentry-cli\"\\\\n' +\n ' else\\\\n' +\n ' echo $PROP_VALUE\\\\n' +\n ' fi\\\\n' +\n '}\\\\n' +\n 'if [ ! -f $SENTRY_PROPERTIES ]; then\\\\n' +\n ' echo \"warning: SENTRY: sentry.properties file not found! Skipping symbol upload.\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'echo \"# Reading property from $SENTRY_PROPERTIES\"\\\\n' +\n 'SENTRY_CLI=$(getProperty \"cli.executable\")\\\\n' +\n 'SENTRY_COMMAND=\"../../$SENTRY_CLI upload-dsym\"\\\\n' +\n '$SENTRY_COMMAND',\n },\n );\n }\n\n private _addNewXcodeBuildPhaseForStripping(\n buildScripts: any,\n proj: any,\n ): void {\n for (const script of buildScripts) {\n if (script.shellScript.match(/SENTRY_FRAMEWORK_PATCH/)) {\n return;\n }\n }\n // http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/\n proj.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Sentry strip unused archs from Framework',\n null,\n {\n shellPath: '/bin/sh',\n shellScript:\n '# SENTRY_FRAMEWORK_PATCH \\\\n' +\n 'echo \"warning: patching framework - set SENTRY_SKIP_FRAMEWORK_PATCH=true to skip this\"\\\\n' +\n 'if [ -n \"$SENTRY_SKIP_FRAMEWORK_PATCH\" ]; then\\\\n' +\n ' echo \"warning: skipping framework patch\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'APP_PATH=\"${TARGET_BUILD_DIR}/${WRAPPER_NAME}\"\\\\n' +\n 'find \"$APP_PATH\" -name \\'Sentry*.framework\\' -type d | while read -r FRAMEWORK\\\\n' +\n 'do\\\\n' +\n 'FRAMEWORK_EXECUTABLE_NAME=$(defaults read \"$FRAMEWORK/Info.plist\" CFBundleExecutable)\\\\n' +\n 'FRAMEWORK_EXECUTABLE_PATH=\"$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME\"\\\\n' +\n 'echo \"Executable is $FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'EXTRACTED_ARCHS=()\\\\n' +\n 'for ARCH in $ARCHS\\\\n' +\n 'do\\\\n' +\n 'echo \"Checking if $FRAMEWORK_EXECUTABLE_PATH needs to be stripped.\"\\\\n' +\n '# Do not skip if \"Architectures in the fat file\".\\\\n' +\n '# Skip if Non-fat file or if file not found. \\\\n' +\n 'if lipo -info \"$FRAMEWORK_EXECUTABLE_PATH\" | grep -v \" fat \"; then\\\\n' +\n ' echo \"Strip not required, skipping the strip script.\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'echo \"Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME\"\\\\n' +\n 'lipo -extract \"$ARCH\" \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\"\\\\n' +\n 'EXTRACTED_ARCHS+=(\"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\")\\\\n' +\n 'done\\\\n' +\n 'echo \"Merging extracted architectures: ${ARCHS}\"\\\\n' +\n 'lipo -o \"$FRAMEWORK_EXECUTABLE_PATH-merged\" -create \"${EXTRACTED_ARCHS[@]}\"\\\\n' +\n 'rm \"${EXTRACTED_ARCHS[@]}\"\\\\n' +\n 'echo \"Replacing original executable with thinned version\"\\\\n' +\n 'rm \"$FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'mv \"$FRAMEWORK_EXECUTABLE_PATH-merged\" \"$FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'done',\n },\n );\n }\n\n private _addSentryProperties(properties: any): Promise<void> {\n let rv = Promise.resolve();\n const fn = path.join('sentry.properties');\n if (exists(fn)) {\n return rv;\n }\n rv = rv.then(() =>\n fs.writeFileSync(fn, this._sentryCli.dumpProperties(properties)),\n );\n\n return rv;\n }\n}\n"]}
1
+ {"version":3,"file":"Cordova.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/Cordova.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Answers } from 'inquirer';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PBXShellScriptBuildPhase, Project } from 'xcode';\nimport xcode from 'xcode';\n\nimport type { Args } from '../../Constants';\nimport { exists, matchesContent, patchMatchingFile } from '../../Helper/File';\nimport { green } from '../../Helper/Logging';\nimport { SentryCli, SentryCliProps } from '../../Helper/SentryCli';\nimport { BaseIntegration } from './BaseIntegration';\n\nexport class Cordova extends BaseIntegration {\n protected _sentryCli: SentryCli;\n\n protected _folderPrefix = 'platforms';\n protected _pluginFolder: string[] = ['.'];\n\n public constructor(protected _argv: Args) {\n super(_argv);\n this._sentryCli = new SentryCli(this._argv);\n }\n\n public async emit(answers: Answers): Promise<Answers> {\n if (this._argv.uninstall) {\n return this.uninstall(answers);\n }\n\n const sentryCliProperties =\n this._sentryCli.convertAnswersToProperties(answers);\n\n await patchMatchingFile(\n `${this._folderPrefix}/ios/*.xcodeproj/project.pbxproj`,\n (contents, filename) => this._patchXcodeProj(contents, filename),\n );\n\n await this._addSentryProperties(sentryCliProperties);\n green('Successfully set up for cordova');\n\n return {};\n }\n\n public async uninstall(_answers: Answers): Promise<Answers> {\n await patchMatchingFile('**/*.xcodeproj/project.pbxproj', (_, filename) =>\n this._unpatchXcodeProj(filename),\n );\n\n return {};\n }\n\n public async shouldConfigure(_answers: Answers): Promise<Answers> {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n if (this._shouldConfigure) {\n return this._shouldConfigure;\n }\n\n let result = false;\n if (!exists(path.join('sentry.properties'))) {\n result = true;\n this.debug('sentry.properties not exists');\n }\n\n if (\n !matchesContent('**/*.xcodeproj/project.pbxproj', /SENTRY_PROPERTIES/gi)\n ) {\n result = true;\n this.debug('**/*.xcodeproj/project.pbxproj not matched');\n }\n\n if (this._argv.uninstall) {\n // if we uninstall we need to invert the result so we remove already patched\n result = !result;\n }\n\n this._shouldConfigure = Promise.resolve({ cordova: result });\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.shouldConfigure;\n }\n\n private _unpatchXcodeProj(filename: string): Promise<string> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: unknown) => {\n if (err) {\n reject(err);\n return;\n }\n\n this._unpatchXcodeBuildScripts(proj);\n resolve(proj.writeSync());\n });\n });\n }\n\n private _unpatchXcodeBuildScripts(proj: Project): void {\n const scripts = proj.hash.project.objects.PBXShellScriptBuildPhase || {};\n\n const firstTarget = proj.getFirstTarget()?.uuid || '';\n\n const nativeTargets = proj.hash.project.objects.PBXNativeTarget;\n\n // scripts to kill entirely.\n for (const key of Object.keys(scripts)) {\n const script = scripts[key];\n\n // ignore comments and keys that got deleted\n if (typeof script === 'string' || script === undefined) {\n continue;\n }\n\n if (\n script.shellScript?.match(/SENTRY_PROPERTIES/) ||\n script.shellScript?.match(/SENTRY_FRAMEWORK_PATCH/)\n ) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[key];\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[`${key}_comment`];\n const target = nativeTargets && nativeTargets[firstTarget];\n const phases = typeof target === 'object' && target.buildPhases;\n if (phases) {\n for (let i = 0; i < phases.length; i++) {\n if (phases[i].value === key) {\n phases.splice(i, 1);\n break;\n }\n }\n }\n continue;\n }\n }\n }\n\n private _patchXcodeProj(\n contents: string,\n filename: string,\n ): Promise<string | void> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: unknown) => {\n if (err) {\n reject(err);\n return;\n }\n\n const buildScripts: Array<PBXShellScriptBuildPhase> = [];\n for (const val of Object.values(\n proj.hash.project.objects.PBXShellScriptBuildPhase || {},\n )) {\n if (\n typeof val === 'object' &&\n val.isa === 'PBXShellScriptBuildPhase'\n ) {\n buildScripts.push(val);\n }\n }\n\n this._addNewXcodeBuildPhaseForSymbols(buildScripts, proj);\n this._addNewXcodeBuildPhaseForStripping(buildScripts, proj);\n\n // we always modify the xcode file in memory but we only want to save it\n // in case the user wants configuration for ios. This is why we check\n // here first if changes are made before we might prompt the platform\n // continue prompt.\n const newContents = proj.writeSync();\n if (newContents === contents) {\n resolve();\n } else {\n resolve(newContents);\n }\n });\n });\n }\n\n private _addNewXcodeBuildPhaseForSymbols(\n buildScripts: Array<PBXShellScriptBuildPhase | string>,\n proj: Project,\n ): void {\n for (const script of buildScripts) {\n if (\n typeof script === 'object' &&\n script.shellScript?.match(/SENTRY_PROPERTIES/)\n ) {\n return;\n }\n }\n const cwd = path.join(process.cwd(), 'sentry.properties');\n proj.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Upload Debug Symbols to Sentry',\n null,\n {\n shellPath: '/bin/sh',\n shellScript:\n // eslint-disable-next-line prefer-template\n 'echo \"warning: uploading debug symbols - set SENTRY_SKIP_DSYM_UPLOAD=true to skip this\"\\\\n' +\n 'if [ -n \"$SENTRY_SKIP_DSYM_UPLOAD\" ]; then\\\\n' +\n ' echo \"warning: skipping debug symbol upload\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'export SENTRY_PROPERTIES=' +\n cwd +\n '\\\\n' +\n 'function getProperty {\\\\n' +\n ' PROP_KEY=$1\\\\n' +\n ' PROP_VALUE=`cat $SENTRY_PROPERTIES | grep \"$PROP_KEY\" | cut -d\\'=\\' -f2`\\\\n' +\n ' if [ -z \"$PROP_VALUE\" ]; then\\\\n' +\n ' echo \"plugins/sentry-cordova/node_modules/@sentry/cli/bin/sentry-cli\"\\\\n' +\n ' else\\\\n' +\n ' echo $PROP_VALUE\\\\n' +\n ' fi\\\\n' +\n '}\\\\n' +\n 'if [ ! -f $SENTRY_PROPERTIES ]; then\\\\n' +\n ' echo \"warning: SENTRY: sentry.properties file not found! Skipping symbol upload.\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'echo \"# Reading property from $SENTRY_PROPERTIES\"\\\\n' +\n 'SENTRY_CLI=$(getProperty \"cli.executable\")\\\\n' +\n 'SENTRY_COMMAND=\"../../$SENTRY_CLI upload-dsym\"\\\\n' +\n '$SENTRY_COMMAND',\n },\n );\n }\n\n private _addNewXcodeBuildPhaseForStripping(\n buildScripts: Array<PBXShellScriptBuildPhase | string>,\n proj: Project,\n ): void {\n for (const script of buildScripts) {\n if (\n typeof script === 'object' &&\n script.shellScript?.match(/SENTRY_FRAMEWORK_PATCH/)\n ) {\n return;\n }\n }\n // http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/\n proj.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Sentry strip unused archs from Framework',\n null,\n {\n shellPath: '/bin/sh',\n shellScript:\n '# SENTRY_FRAMEWORK_PATCH \\\\n' +\n 'echo \"warning: patching framework - set SENTRY_SKIP_FRAMEWORK_PATCH=true to skip this\"\\\\n' +\n 'if [ -n \"$SENTRY_SKIP_FRAMEWORK_PATCH\" ]; then\\\\n' +\n ' echo \"warning: skipping framework patch\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'APP_PATH=\"${TARGET_BUILD_DIR}/${WRAPPER_NAME}\"\\\\n' +\n 'find \"$APP_PATH\" -name \\'Sentry*.framework\\' -type d | while read -r FRAMEWORK\\\\n' +\n 'do\\\\n' +\n 'FRAMEWORK_EXECUTABLE_NAME=$(defaults read \"$FRAMEWORK/Info.plist\" CFBundleExecutable)\\\\n' +\n 'FRAMEWORK_EXECUTABLE_PATH=\"$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME\"\\\\n' +\n 'echo \"Executable is $FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'EXTRACTED_ARCHS=()\\\\n' +\n 'for ARCH in $ARCHS\\\\n' +\n 'do\\\\n' +\n 'echo \"Checking if $FRAMEWORK_EXECUTABLE_PATH needs to be stripped.\"\\\\n' +\n '# Do not skip if \"Architectures in the fat file\".\\\\n' +\n '# Skip if Non-fat file or if file not found. \\\\n' +\n 'if lipo -info \"$FRAMEWORK_EXECUTABLE_PATH\" | grep -v \" fat \"; then\\\\n' +\n ' echo \"Strip not required, skipping the strip script.\"\\\\n' +\n ' exit 0\\\\n' +\n 'fi\\\\n' +\n 'echo \"Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME\"\\\\n' +\n 'lipo -extract \"$ARCH\" \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\"\\\\n' +\n 'EXTRACTED_ARCHS+=(\"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\")\\\\n' +\n 'done\\\\n' +\n 'echo \"Merging extracted architectures: ${ARCHS}\"\\\\n' +\n 'lipo -o \"$FRAMEWORK_EXECUTABLE_PATH-merged\" -create \"${EXTRACTED_ARCHS[@]}\"\\\\n' +\n 'rm \"${EXTRACTED_ARCHS[@]}\"\\\\n' +\n 'echo \"Replacing original executable with thinned version\"\\\\n' +\n 'rm \"$FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'mv \"$FRAMEWORK_EXECUTABLE_PATH-merged\" \"$FRAMEWORK_EXECUTABLE_PATH\"\\\\n' +\n 'done',\n },\n );\n }\n\n private _addSentryProperties(properties: SentryCliProps): Promise<void> {\n let rv = Promise.resolve();\n const fn = path.join('sentry.properties');\n if (exists(fn)) {\n return rv;\n }\n rv = rv.then(() =>\n fs.writeFileSync(fn, this._sentryCli.dumpProperties(properties)),\n );\n\n return rv;\n }\n}\n"]}
@@ -2,11 +2,14 @@ import type { Answers } from 'inquirer';
2
2
  import type { Args } from '../../Constants';
3
3
  import { SentryCli } from '../../Helper/SentryCli';
4
4
  import { BaseIntegration } from './BaseIntegration';
5
+ import { Config } from '../../Types';
5
6
  export declare class Electron extends BaseIntegration {
6
7
  protected _argv: Args;
7
8
  protected _sentryCli: SentryCli;
8
9
  constructor(_argv: Args);
9
- emit(answers: Answers): Promise<Answers>;
10
+ emit(answers: Answers & {
11
+ config?: Config;
12
+ }): Promise<Answers>;
10
13
  shouldConfigure(_answers: Answers): Promise<Answers>;
11
14
  private _checkDep;
12
15
  }
@@ -71,7 +71,7 @@ class Electron extends BaseIntegration_1.BaseIntegration {
71
71
  }
72
72
  // eslint-disable-next-line @typescript-eslint/require-await
73
73
  async emit(answers) {
74
- const dsn = answers.config?.dsn?.public ?? null;
74
+ const dsn = answers.config?.dsn?.public ?? 'DSN NOT FOUND';
75
75
  (0, Logging_1.nl)();
76
76
  const sentryCliProps = this._sentryCli.convertAnswersToProperties(answers);
77
77
  fs.writeFileSync('./sentry.properties', this._sentryCli.dumpProperties(sentryCliProps));
@@ -1 +1 @@
1
- {"version":3,"file":"Electron.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/Electron.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport type { Answers } from 'inquirer';\nimport { prompt } from 'inquirer';\nimport * as path from 'node:path';\n\nimport type { Args } from '../../Constants';\nimport { dim, green, l, nl, red } from '../../Helper/Logging';\nimport { SentryCli } from '../../Helper/SentryCli';\nimport { BaseIntegration } from './BaseIntegration';\n\nconst MIN_ELECTRON_VERSION_STRING = '23.0.0';\nconst MIN_ELECTRON_VERSION = parseInt(\n MIN_ELECTRON_VERSION_STRING.replace(/\\D+/g, ''),\n 10,\n);\n\nconst CODE_EXAMPLE_MAIN = `// ESM\nimport * as Sentry from '@sentry/electron/main';\n// CommonJs\nconst Sentry = require('@sentry/electron/main');\n\nSentry.init({\n dsn: '___DSN___',\n});`;\n\nconst CODE_EXAMPLE_RENDERER = `// ESM\nimport * as Sentry from '@sentry/electron/renderer';\n// CommonJs\nconst Sentry = require('@sentry/electron/renderer');\n\nSentry.init({});`;\n\ntype PackageJSON = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n};\nlet appPackage: PackageJSON = {};\n\nfunction printExample(example: string, title = ''): void {\n if (title) {\n l(title);\n }\n\n nl();\n dim(example.replace(/^/gm, ' '));\n nl();\n}\n\ntry {\n appPackage = JSON.parse(\n fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8'),\n ) as PackageJSON;\n} catch {\n // We don't need to have this\n}\n\nexport class Electron extends BaseIntegration {\n protected _sentryCli: SentryCli;\n\n public constructor(protected _argv: Args) {\n super(_argv);\n this._sentryCli = new SentryCli(this._argv);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async emit(answers: Answers): Promise<Answers> {\n const dsn = answers.config?.dsn?.public ?? null;\n nl();\n\n const sentryCliProps = this._sentryCli.convertAnswersToProperties(answers);\n fs.writeFileSync(\n './sentry.properties',\n this._sentryCli.dumpProperties(sentryCliProps),\n );\n green('Successfully created sentry.properties');\n nl();\n\n printExample(\n CODE_EXAMPLE_MAIN.replace('___DSN___', dsn),\n 'Add these lines in to your main process code to setup Sentry:',\n );\n\n printExample(\n CODE_EXAMPLE_RENDERER,\n 'Add these lines in to your renderer processes code to setup Sentry:',\n );\n\n l('For more information, see https://docs.sentry.io/clients/electron/');\n nl();\n\n return {};\n }\n\n public async shouldConfigure(_answers: Answers): Promise<Answers> {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n if (this._shouldConfigure) {\n return this._shouldConfigure;\n }\n\n let success = true;\n nl();\n\n success =\n this._checkDep('electron', MIN_ELECTRON_VERSION_STRING) && success;\n success = this._checkDep('@sentry/electron') && success;\n\n let continued: Answers = { continue: true };\n if (!success && !this._argv.quiet) {\n continued = await prompt({\n message:\n 'There were errors during your project checkup, do you still want to continue?',\n name: 'continue',\n default: false,\n type: 'confirm',\n });\n }\n\n nl();\n\n if (!continued?.continue) {\n throw new Error('Please install the required dependencies to continue.');\n }\n\n this._shouldConfigure = Promise.resolve({ electron: true });\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.shouldConfigure;\n }\n\n private _checkDep(packageName: string, minVersion?: string): boolean {\n const depVersion = parseInt(\n (appPackage.dependencies?.[packageName] || '0').replace(/\\D+/g, ''),\n 10,\n );\n const devDepVersion = parseInt(\n (appPackage.devDependencies?.[packageName] || '0').replace(/\\D+/g, ''),\n 10,\n );\n\n if (\n !appPackage.dependencies?.[packageName] &&\n !appPackage.devDependencies?.[packageName]\n ) {\n red(`✗ ${packageName} isn't in your dependencies`);\n red(' please install it with yarn/npm');\n return false;\n }\n if (\n minVersion &&\n depVersion < MIN_ELECTRON_VERSION &&\n devDepVersion < MIN_ELECTRON_VERSION\n ) {\n red(\n `✗ Your installed version of ${packageName} is to old, >${MIN_ELECTRON_VERSION_STRING} needed`,\n );\n return false;\n }\n if (minVersion) {\n green(`✓ ${packageName} > ${minVersion} is installed`);\n } else {\n green(`✓ ${packageName} is installed`);\n }\n return true;\n }\n}\n"]}
1
+ {"version":3,"file":"Electron.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/Electron.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport type { Answers } from 'inquirer';\nimport { prompt } from 'inquirer';\nimport * as path from 'node:path';\n\nimport type { Args } from '../../Constants';\nimport { dim, green, l, nl, red } from '../../Helper/Logging';\nimport { SentryCli } from '../../Helper/SentryCli';\nimport { BaseIntegration } from './BaseIntegration';\nimport { Config } from '../../Types';\n\nconst MIN_ELECTRON_VERSION_STRING = '23.0.0';\nconst MIN_ELECTRON_VERSION = parseInt(\n MIN_ELECTRON_VERSION_STRING.replace(/\\D+/g, ''),\n 10,\n);\n\nconst CODE_EXAMPLE_MAIN = `// ESM\nimport * as Sentry from '@sentry/electron/main';\n// CommonJs\nconst Sentry = require('@sentry/electron/main');\n\nSentry.init({\n dsn: '___DSN___',\n});`;\n\nconst CODE_EXAMPLE_RENDERER = `// ESM\nimport * as Sentry from '@sentry/electron/renderer';\n// CommonJs\nconst Sentry = require('@sentry/electron/renderer');\n\nSentry.init({});`;\n\ntype PackageJSON = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n};\nlet appPackage: PackageJSON = {};\n\nfunction printExample(example: string, title = ''): void {\n if (title) {\n l(title);\n }\n\n nl();\n dim(example.replace(/^/gm, ' '));\n nl();\n}\n\ntry {\n appPackage = JSON.parse(\n fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8'),\n ) as PackageJSON;\n} catch {\n // We don't need to have this\n}\n\nexport class Electron extends BaseIntegration {\n protected _sentryCli: SentryCli;\n\n public constructor(protected _argv: Args) {\n super(_argv);\n this._sentryCli = new SentryCli(this._argv);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async emit(answers: Answers & { config?: Config }): Promise<Answers> {\n const dsn = answers.config?.dsn?.public ?? 'DSN NOT FOUND';\n nl();\n\n const sentryCliProps = this._sentryCli.convertAnswersToProperties(answers);\n fs.writeFileSync(\n './sentry.properties',\n this._sentryCli.dumpProperties(sentryCliProps),\n );\n green('Successfully created sentry.properties');\n nl();\n\n printExample(\n CODE_EXAMPLE_MAIN.replace('___DSN___', dsn),\n 'Add these lines in to your main process code to setup Sentry:',\n );\n\n printExample(\n CODE_EXAMPLE_RENDERER,\n 'Add these lines in to your renderer processes code to setup Sentry:',\n );\n\n l('For more information, see https://docs.sentry.io/clients/electron/');\n nl();\n\n return {};\n }\n\n public async shouldConfigure(_answers: Answers): Promise<Answers> {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n if (this._shouldConfigure) {\n return this._shouldConfigure;\n }\n\n let success = true;\n nl();\n\n success =\n this._checkDep('electron', MIN_ELECTRON_VERSION_STRING) && success;\n success = this._checkDep('@sentry/electron') && success;\n\n let continued: Answers = { continue: true };\n if (!success && !this._argv.quiet) {\n continued = await prompt({\n message:\n 'There were errors during your project checkup, do you still want to continue?',\n name: 'continue',\n default: false,\n type: 'confirm',\n });\n }\n\n nl();\n\n if (!continued?.continue) {\n throw new Error('Please install the required dependencies to continue.');\n }\n\n this._shouldConfigure = Promise.resolve({ electron: true });\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.shouldConfigure;\n }\n\n private _checkDep(packageName: string, minVersion?: string): boolean {\n const depVersion = parseInt(\n (appPackage.dependencies?.[packageName] || '0').replace(/\\D+/g, ''),\n 10,\n );\n const devDepVersion = parseInt(\n (appPackage.devDependencies?.[packageName] || '0').replace(/\\D+/g, ''),\n 10,\n );\n\n if (\n !appPackage.dependencies?.[packageName] &&\n !appPackage.devDependencies?.[packageName]\n ) {\n red(`✗ ${packageName} isn't in your dependencies`);\n red(' please install it with yarn/npm');\n return false;\n }\n if (\n minVersion &&\n depVersion < MIN_ELECTRON_VERSION &&\n devDepVersion < MIN_ELECTRON_VERSION\n ) {\n red(\n `✗ Your installed version of ${packageName} is to old, >${MIN_ELECTRON_VERSION_STRING} needed`,\n );\n return false;\n }\n if (minVersion) {\n green(`✓ ${packageName} > ${minVersion} is installed`);\n } else {\n green(`✓ ${packageName} is installed`);\n }\n return true;\n }\n}\n"]}
@@ -5,6 +5,8 @@ export declare abstract class MobileProject extends BaseIntegration {
5
5
  protected _platforms: Platform[];
6
6
  getPlatforms(answers: Answers): string[];
7
7
  shouldConfigure(answers: Answers): Promise<Answers>;
8
- protected _platformSelector(): Promise<Answers>;
8
+ protected _platformSelector(): Promise<Answers & {
9
+ platform: Platform[];
10
+ }>;
9
11
  protected abstract _shouldConfigurePlatform(platform: Platform): Promise<boolean>;
10
12
  }
@@ -23,7 +23,7 @@ class MobileProject extends BaseIntegration_1.BaseIntegration {
23
23
  }
24
24
  const isPlatformSet = this._argv.platform &&
25
25
  Array.isArray(this._argv.platform) &&
26
- this._argv.platform.length;
26
+ !!this._argv.platform.length;
27
27
  this._platforms = isPlatformSet
28
28
  ? this._argv.platform
29
29
  : (await this._platformSelector()).platform;
@@ -1 +1 @@
1
- {"version":3,"file":"MobileProject.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/MobileProject.ts"],"names":[],"mappings":";;;AACA,uCAAkC;AAElC,+CAA+D;AAC/D,kDAA2C;AAC3C,uDAAoD;AAEpD,MAAsB,aAAc,SAAQ,iCAAe;IAC/C,UAAU,CAAa;IAE1B,YAAY,CAAC,OAAgB;QAClC,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;SACzC;QACD,MAAM,wBAAwB,GAC5B,OAAO,CAAC,wBAA8D,CAAC;QACzE,OAAO,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC;aAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACzB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;IACpD,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,OAAgB;QAC3C,IAAI,EAAE,wBAAwB,EAAE,GAAG,OAElC,CAAC;QACF,IAAI,wBAAwB,EAAE;YAC5B,OAAO,EAAE,wBAAwB,EAAE,CAAC;SACrC;QAED,MAAM,aAAa,GACjB,IAAI,CAAC,KAAK,CAAC,QAAQ;YACnB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE7B,IAAI,CAAC,UAAU,GAAG,aAAa;YAC7B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;YACrB,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC;QAE9C,wBAAwB,GAAG,EAAE,CAAC;QAC9B,kEAAkE;QAClE,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,oBAAQ,CAAC,EAAE;YAC9C,wBAAwB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACrE,CAAC,CAAC,MAAM,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC;gBAC/C,CAAC,CAAC,KAAK,CAAC;YACV,IACE,wBAAwB,CAAC,QAAQ,CAAC,KAAK,KAAK;gBAC5C,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,KAAK,EAC9B;gBACA,IAAA,aAAG,EAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;aACvC;SACF;QACD,OAAO,EAAE,wBAAwB,EAAE,CAAC;IACtC,CAAC;IAES,iBAAiB;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QACD,OAAO,IAAA,iBAAM,EAAC;YACZ;gBACE,OAAO,EAAE,IAAA,8BAAkB,GAAE;gBAC7B,OAAO,EAAE,0CAA0C;gBACnD,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,UAAU;aACjB;SACF,CAAC,CAAC;IACL,CAAC;CAKF;AAhED,sCAgEC","sourcesContent":["import type { Answers } from 'inquirer';\nimport { prompt } from 'inquirer';\n\nimport { getPlatformChoices, Platform } from '../../Constants';\nimport { dim } from '../../Helper/Logging';\nimport { BaseIntegration } from './BaseIntegration';\n\nexport abstract class MobileProject extends BaseIntegration {\n protected _platforms: Platform[];\n\n public getPlatforms(answers: Answers): string[] {\n if (!answers.shouldConfigurePlatforms) {\n throw new Error('No platform selected');\n }\n const shouldConfigurePlatforms =\n answers.shouldConfigurePlatforms as Partial<Record<Platform, boolean>>;\n return Object.entries(shouldConfigurePlatforms)\n .filter((pair) => pair[1])\n .map((pair) => pair[0]); // only return the keys\n }\n\n public async shouldConfigure(answers: Answers): Promise<Answers> {\n let { shouldConfigurePlatforms } = answers as {\n shouldConfigurePlatforms?: Partial<Record<Platform, boolean>>;\n };\n if (shouldConfigurePlatforms) {\n return { shouldConfigurePlatforms };\n }\n\n const isPlatformSet =\n this._argv.platform &&\n Array.isArray(this._argv.platform) &&\n this._argv.platform.length;\n\n this._platforms = isPlatformSet\n ? this._argv.platform\n : (await this._platformSelector()).platform;\n\n shouldConfigurePlatforms = {};\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n for (const platform of Object.values(Platform)) {\n shouldConfigurePlatforms[platform] = this._platforms.includes(platform)\n ? await this._shouldConfigurePlatform(platform)\n : false;\n if (\n shouldConfigurePlatforms[platform] === false &&\n this._argv.uninstall === false\n ) {\n dim(`will not configure ${platform}`);\n }\n }\n return { shouldConfigurePlatforms };\n }\n\n protected _platformSelector(): Promise<Answers> {\n if (this._argv.quiet) {\n throw new Error('You need to choose a platform');\n }\n return prompt([\n {\n choices: getPlatformChoices(),\n message: 'Select the platforms you like to set up:',\n name: 'platform',\n type: 'checkbox',\n },\n ]);\n }\n\n protected abstract _shouldConfigurePlatform(\n platform: Platform,\n ): Promise<boolean>;\n}\n"]}
1
+ {"version":3,"file":"MobileProject.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/MobileProject.ts"],"names":[],"mappings":";;;AACA,uCAAkC;AAElC,+CAA+D;AAC/D,kDAA2C;AAC3C,uDAAoD;AAEpD,MAAsB,aAAc,SAAQ,iCAAe;IAC/C,UAAU,CAAa;IAE1B,YAAY,CAAC,OAAgB;QAClC,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;SACzC;QACD,MAAM,wBAAwB,GAC5B,OAAO,CAAC,wBAA8D,CAAC;QACzE,OAAO,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC;aAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACzB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;IACpD,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,OAAgB;QAC3C,IAAI,EAAE,wBAAwB,EAAE,GAAG,OAElC,CAAC;QACF,IAAI,wBAAwB,EAAE;YAC5B,OAAO,EAAE,wBAAwB,EAAE,CAAC;SACrC;QAED,MAAM,aAAa,GACjB,IAAI,CAAC,KAAK,CAAC,QAAQ;YACnB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE/B,IAAI,CAAC,UAAU,GAAG,aAAa;YAC7B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;YACrB,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC;QAE9C,wBAAwB,GAAG,EAAE,CAAC;QAC9B,kEAAkE;QAClE,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,oBAAQ,CAAC,EAAE;YAC9C,wBAAwB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACrE,CAAC,CAAC,MAAM,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC;gBAC/C,CAAC,CAAC,KAAK,CAAC;YACV,IACE,wBAAwB,CAAC,QAAQ,CAAC,KAAK,KAAK;gBAC5C,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,KAAK,EAC9B;gBACA,IAAA,aAAG,EAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;aACvC;SACF;QACD,OAAO,EAAE,wBAAwB,EAAE,CAAC;IACtC,CAAC;IAES,iBAAiB;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QACD,OAAO,IAAA,iBAAM,EAAC;YACZ;gBACE,OAAO,EAAE,IAAA,8BAAkB,GAAE;gBAC7B,OAAO,EAAE,0CAA0C;gBACnD,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,UAAU;aACjB;SACF,CAAC,CAAC;IACL,CAAC;CAKF;AAhED,sCAgEC","sourcesContent":["import type { Answers } from 'inquirer';\nimport { prompt } from 'inquirer';\n\nimport { getPlatformChoices, Platform } from '../../Constants';\nimport { dim } from '../../Helper/Logging';\nimport { BaseIntegration } from './BaseIntegration';\n\nexport abstract class MobileProject extends BaseIntegration {\n protected _platforms: Platform[];\n\n public getPlatforms(answers: Answers): string[] {\n if (!answers.shouldConfigurePlatforms) {\n throw new Error('No platform selected');\n }\n const shouldConfigurePlatforms =\n answers.shouldConfigurePlatforms as Partial<Record<Platform, boolean>>;\n return Object.entries(shouldConfigurePlatforms)\n .filter((pair) => pair[1])\n .map((pair) => pair[0]); // only return the keys\n }\n\n public async shouldConfigure(answers: Answers): Promise<Answers> {\n let { shouldConfigurePlatforms } = answers as {\n shouldConfigurePlatforms?: Partial<Record<Platform, boolean>>;\n };\n if (shouldConfigurePlatforms) {\n return { shouldConfigurePlatforms };\n }\n\n const isPlatformSet =\n this._argv.platform &&\n Array.isArray(this._argv.platform) &&\n !!this._argv.platform.length;\n\n this._platforms = isPlatformSet\n ? this._argv.platform\n : (await this._platformSelector()).platform;\n\n shouldConfigurePlatforms = {};\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n for (const platform of Object.values(Platform)) {\n shouldConfigurePlatforms[platform] = this._platforms.includes(platform)\n ? await this._shouldConfigurePlatform(platform)\n : false;\n if (\n shouldConfigurePlatforms[platform] === false &&\n this._argv.uninstall === false\n ) {\n dim(`will not configure ${platform}`);\n }\n }\n return { shouldConfigurePlatforms };\n }\n\n protected _platformSelector(): Promise<Answers & { platform: Platform[] }> {\n if (this._argv.quiet) {\n throw new Error('You need to choose a platform');\n }\n return prompt([\n {\n choices: getPlatformChoices(),\n message: 'Select the platforms you like to set up:',\n name: 'platform',\n type: 'checkbox',\n },\n ]);\n }\n\n protected abstract _shouldConfigurePlatform(\n platform: Platform,\n ): Promise<boolean>;\n}\n"]}
@@ -1,7 +1,10 @@
1
1
  import type { Answers } from 'inquirer';
2
2
  import { BaseStep } from './BaseStep';
3
+ import { Config } from '../Types';
3
4
  export declare class PromptForParameters extends BaseStep {
4
- emit(answers: Answers): Promise<Answers>;
5
+ emit(answers: Answers & {
6
+ config?: Config;
7
+ }): Promise<Answers & Config>;
5
8
  private _getFullUrl;
6
9
  private _getDSNKeyUrl;
7
10
  private _shouldAsk;
@@ -1 +1 @@
1
- {"version":3,"file":"PromptForParameters.js","sourceRoot":"","sources":["../../../lib/Steps/PromptForParameters.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Answers } from 'inquirer';\nimport { prompt } from 'inquirer';\n\nimport { dim } from '../Helper/Logging';\nimport { getCurrentIntegration } from '../Helper/Wizard';\nimport { BaseStep } from './BaseStep';\n\nexport class PromptForParameters extends BaseStep {\n public async emit(answers: Answers): Promise<Answers> {\n this.debug(answers);\n if (!(await getCurrentIntegration(answers).shouldEmit(answers))) {\n return {};\n }\n if (this._argv.quiet) {\n return {};\n }\n\n let url = this._getFullUrl(answers);\n const organization: any = await prompt([\n {\n message: 'Organization Slug:',\n name: 'slug',\n type: 'input',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n validate: this._validateSlug,\n when: this._shouldAsk(answers, 'config.organization.slug', () => {\n dim('Please copy/paste your organization slug');\n dim(`It can be found in the url ${url}`);\n }),\n },\n ]);\n\n url = this._getFullUrl(answers, organization.slug);\n const project: any = await prompt([\n {\n message: 'Project Slug:',\n name: 'slug',\n type: 'input',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n validate: this._validateSlug,\n when: this._shouldAsk(answers, 'config.project.slug', () => {\n dim('Please copy/paste your project slug');\n dim(`It can be found in the url ${url}`);\n }),\n },\n ]);\n\n url = this._getFullUrl(answers, organization.slug, project.slug);\n const dsnKeyUrl = this._getDSNKeyUrl(answers, project.slug);\n const dsn = await prompt([\n {\n message: 'DSN:',\n name: 'public',\n type: 'input',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n validate: this._validateDSN,\n when: this._shouldAsk(answers, 'config.dsn.public', () => {\n dim('Please copy/paste your DSN');\n dim(`It can be found here: ${dsnKeyUrl}`);\n }),\n },\n ]);\n\n const auth = await prompt([\n {\n message: 'Auth Token:',\n name: 'token',\n type: 'input',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n validate: this._validateAuthToken,\n when: this._shouldAsk(answers, 'config.auth.token', () => {\n dim('Please copy/paste your auth token');\n dim(`It can be found here: ${this._argv.url}api/`);\n dim(\n 'In case there is none yet, create one with [project:releases] permission',\n );\n }),\n },\n ]);\n\n return {\n config: {\n ...answers.config,\n auth,\n dsn,\n project,\n organization,\n },\n };\n }\n\n private _getFullUrl(\n answers: Answers,\n organizationSlug?: string,\n projectSlug?: string,\n ): string {\n const baseUrl = this._argv.url;\n const orgSlug =\n answers.config?.organization?.slug ??\n organizationSlug ??\n 'organization_slug';\n const projSlug =\n answers.config?.project?.slug ?? projectSlug ?? 'project_slug';\n return `${baseUrl}${orgSlug}/${projSlug}`;\n }\n\n private _getDSNKeyUrl(answers: Answers, projectSlug?: string): string {\n const baseUrl = this._argv.url;\n const projSlug =\n answers.config?.project?.slug ?? projectSlug ?? 'project_slug';\n return `${baseUrl}settings/projects/${projSlug}/keys`;\n }\n\n private _shouldAsk(\n answers: Answers,\n configKey: string,\n preHook?: () => void,\n ): boolean {\n const shouldAsk = answers[configKey] != null;\n if (shouldAsk && preHook) {\n preHook();\n }\n return shouldAsk;\n }\n\n private _validateAuthToken(input: string): boolean | string {\n const isOrgToken = input.startsWith('sntrys_');\n\n if (isOrgToken) {\n if (!isValidOrgToken(input)) {\n return 'Make sure you correctly copied your auth token. It should start with \"sntrys_\"';\n }\n return true;\n }\n\n if (!input.match(/(sntrys_)?[0-9a-f]{64}/g)) {\n return 'Make sure you copied the correct auth token, it should be 64 hex chars';\n }\n return true;\n }\n\n private _validateSlug(input: string): boolean | string {\n if (input.match(/[A-Z]/g)) {\n return 'Please copy the slug from the url, it should be all lowercase';\n }\n if (input.length === 0) {\n return \"Can't be empty\";\n }\n return true;\n }\n\n private _validateDSN(input: string): boolean | string {\n const match = input.match(\n /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w.-]+)(?::(\\d+))?(\\/.*)$/,\n );\n if (!match) {\n return 'Invalid DSN format';\n }\n if (match[1] !== 'http' && match[1] !== 'https') {\n return `Unsupported protocol for DSN: ${match[1]}`;\n }\n return true;\n }\n}\n\ntype MaybeOrgAuthToken = {\n iat?: number;\n url?: string;\n org?: string;\n region_url?: string;\n};\n\n/**\n * Trying to parse and decode an org auth token. Based on:\n * - https://github.com/getsentry/rfcs/blob/main/text/0091-ci-upload-tokens.md#parsing-tokens\n * - https://github.com/getsentry/rfcs/blob/main/text/0091-ci-upload-tokens.md#token-facts\n */\nfunction isValidOrgToken(input: string): boolean {\n if (!input.startsWith('sntrys_')) {\n return false;\n }\n\n const tokenParts = input.split('_');\n if (tokenParts.length < 3) {\n return false;\n }\n\n try {\n const payload = tokenParts[1];\n const decodedPayload = Buffer.from(payload, 'base64').toString();\n const jsonPayload = JSON.parse(decodedPayload) as MaybeOrgAuthToken;\n if (!jsonPayload.iat || !jsonPayload.url || !jsonPayload.org) {\n return false;\n }\n } catch {\n return false;\n }\n\n return true;\n}\n"]}
1
+ {"version":3,"file":"PromptForParameters.js","sourceRoot":"","sources":["../../../lib/Steps/PromptForParameters.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Answers } from 'inquirer';\nimport { prompt } from 'inquirer';\n\nimport { dim } from '../Helper/Logging';\nimport { getCurrentIntegration } from '../Helper/Wizard';\nimport { BaseStep } from './BaseStep';\nimport { Config } from '../Types';\n\nexport class PromptForParameters extends BaseStep {\n public async emit(\n answers: Answers & { config?: Config },\n ): Promise<Answers & Config> {\n this.debug(answers);\n if (!(await getCurrentIntegration(answers).shouldEmit(answers))) {\n return {};\n }\n if (this._argv.quiet) {\n return {};\n }\n\n let url = this._getFullUrl(answers);\n const organization = await prompt<{ slug: string }>([\n {\n message: 'Organization Slug:',\n name: 'slug',\n type: 'input',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n validate: this._validateSlug,\n when: this._shouldAsk(answers, 'config.organization.slug', () => {\n dim('Please copy/paste your organization slug');\n dim(`It can be found in the url ${url}`);\n }),\n },\n ]);\n\n url = this._getFullUrl(answers, organization.slug);\n const project = await prompt<{ slug: string }>([\n {\n message: 'Project Slug:',\n name: 'slug',\n type: 'input',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n validate: this._validateSlug,\n when: this._shouldAsk(answers, 'config.project.slug', () => {\n dim('Please copy/paste your project slug');\n dim(`It can be found in the url ${url}`);\n }),\n },\n ]);\n\n url = this._getFullUrl(answers, organization.slug, project.slug);\n const dsnKeyUrl = this._getDSNKeyUrl(answers, project.slug);\n const dsn = await prompt<{ public: string }>([\n {\n message: 'DSN:',\n name: 'public',\n type: 'input',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n validate: this._validateDSN,\n when: this._shouldAsk(answers, 'config.dsn.public', () => {\n dim('Please copy/paste your DSN');\n dim(`It can be found here: ${dsnKeyUrl}`);\n }),\n },\n ]);\n\n const auth = await prompt<{ token: string }>([\n {\n message: 'Auth Token:',\n name: 'token',\n type: 'input',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n validate: this._validateAuthToken,\n when: this._shouldAsk(answers, 'config.auth.token', () => {\n dim('Please copy/paste your auth token');\n dim(`It can be found here: ${this._argv.url}api/`);\n dim(\n 'In case there is none yet, create one with [project:releases] permission',\n );\n }),\n },\n ]);\n\n return {\n config: {\n ...answers.config,\n auth,\n dsn,\n project,\n organization,\n },\n } as Answers & { config?: Config };\n }\n\n private _getFullUrl(\n answers: Answers & { config?: Config },\n organizationSlug?: string,\n projectSlug?: string,\n ): string {\n const baseUrl = this._argv.url;\n const orgSlug =\n answers.config?.organization?.slug ??\n organizationSlug ??\n 'organization_slug';\n const projSlug =\n answers.config?.project?.slug ?? projectSlug ?? 'project_slug';\n return `${baseUrl}${orgSlug}/${projSlug}`;\n }\n\n private _getDSNKeyUrl(\n answers: Answers & { config?: Config },\n projectSlug?: string,\n ): string {\n const baseUrl = this._argv.url;\n const projSlug =\n answers.config?.project?.slug ?? projectSlug ?? 'project_slug';\n return `${baseUrl}settings/projects/${projSlug}/keys`;\n }\n\n private _shouldAsk(\n answers: Answers,\n configKey: string,\n preHook?: () => void,\n ): boolean {\n const shouldAsk = answers[configKey] != null;\n if (shouldAsk && preHook) {\n preHook();\n }\n return shouldAsk;\n }\n\n private _validateAuthToken(input: string): boolean | string {\n const isOrgToken = input.startsWith('sntrys_');\n\n if (isOrgToken) {\n if (!isValidOrgToken(input)) {\n return 'Make sure you correctly copied your auth token. It should start with \"sntrys_\"';\n }\n return true;\n }\n\n if (!input.match(/(sntrys_)?[0-9a-f]{64}/g)) {\n return 'Make sure you copied the correct auth token, it should be 64 hex chars';\n }\n return true;\n }\n\n private _validateSlug(input: string): boolean | string {\n if (input.match(/[A-Z]/g)) {\n return 'Please copy the slug from the url, it should be all lowercase';\n }\n if (input.length === 0) {\n return \"Can't be empty\";\n }\n return true;\n }\n\n private _validateDSN(input: string): boolean | string {\n const match = input.match(\n /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w.-]+)(?::(\\d+))?(\\/.*)$/,\n );\n if (!match) {\n return 'Invalid DSN format';\n }\n if (match[1] !== 'http' && match[1] !== 'https') {\n return `Unsupported protocol for DSN: ${match[1]}`;\n }\n return true;\n }\n}\n\ntype MaybeOrgAuthToken = {\n iat?: number;\n url?: string;\n org?: string;\n region_url?: string;\n};\n\n/**\n * Trying to parse and decode an org auth token. Based on:\n * - https://github.com/getsentry/rfcs/blob/main/text/0091-ci-upload-tokens.md#parsing-tokens\n * - https://github.com/getsentry/rfcs/blob/main/text/0091-ci-upload-tokens.md#token-facts\n */\nfunction isValidOrgToken(input: string): boolean {\n if (!input.startsWith('sntrys_')) {\n return false;\n }\n\n const tokenParts = input.split('_');\n if (tokenParts.length < 3) {\n return false;\n }\n\n try {\n const payload = tokenParts[1];\n const decodedPayload = Buffer.from(payload, 'base64').toString();\n const jsonPayload = JSON.parse(decodedPayload) as MaybeOrgAuthToken;\n if (!jsonPayload.iat || !jsonPayload.url || !jsonPayload.org) {\n return false;\n }\n } catch {\n return false;\n }\n\n return true;\n}\n"]}
@@ -1,5 +1,46 @@
1
1
  import type { Answers } from 'inquirer';
2
2
  import { BaseStep } from './BaseStep';
3
+ type Project = {
4
+ id: string;
5
+ slug: string;
6
+ organization?: {
7
+ name: string;
8
+ slug: string;
9
+ };
10
+ keys: {
11
+ dsn: {
12
+ public: string;
13
+ private: string;
14
+ };
15
+ }[];
16
+ };
17
+ type Wizard = {
18
+ projects: Project[];
19
+ apiKeys: {
20
+ token: string;
21
+ };
22
+ };
23
+ type Config = {
24
+ organization?: {
25
+ slug?: string | null;
26
+ };
27
+ project?: {
28
+ id?: string | null;
29
+ slug?: string | null;
30
+ };
31
+ dsn?: {
32
+ public?: string | null;
33
+ private?: string | null;
34
+ };
35
+ auth?: {
36
+ token?: string | null;
37
+ };
38
+ };
3
39
  export declare class SentryProjectSelector extends BaseStep {
4
- emit(answers: Answers): Promise<any>;
40
+ emit(answers: Answers & {
41
+ wizard?: Wizard;
42
+ }): Promise<{
43
+ config?: Config;
44
+ }>;
5
45
  }
46
+ export {};
@@ -30,7 +30,7 @@ class SentryProjectSelector extends BaseStep_1.BaseStep {
30
30
  {
31
31
  choices: answers.wizard.projects.map((project) => {
32
32
  return {
33
- name: `${project.organization.name} / ${project.slug}`,
33
+ name: `${project.organization?.name ?? ''} / ${project.slug}`,
34
34
  value: project,
35
35
  };
36
36
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"SentryProjectSelector.js","sourceRoot":"","sources":["../../../lib/Steps/SentryProjectSelector.ts"],"names":[],"mappings":";;;AACA,uCAAkC;AAElC,yCAAsC;AAiBtC,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAa,qBAAsB,SAAQ,mBAAQ;IAC1C,KAAK,CAAC,IAAI,CAAC,OAAgB;QAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEpB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnB,4DAA4D;YAC5D,OAAO,EAAE,CAAC;SACX;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACpE,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;SACH;QAED,IAAI,eAAe,GAAwC,IAAI,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACxC,eAAe,GAAG;gBAChB,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAY;aACvD,CAAC;YACF,4DAA4D;YAC5D,2EAA2E;YAC3E,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;SACnB;aAAM;YACL,eAAe,GAAG,MAAM,IAAA,iBAAM,EAAC;gBAC7B;oBACE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE;wBACpD,OAAO;4BACL,IAAI,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,MAAM,OAAO,CAAC,IAAI,EAAE;4BACtD,KAAK,EAAE,OAAO;yBACf,CAAC;oBACJ,CAAC,CAAC;oBACF,OAAO,EAAE,uCAAuC;oBAChD,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,MAAM;iBACb;aACF,CAAC,CAAC;SACJ;QACD,MAAM,GAAG,GAAG,eAAe,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;YAC3D,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,IAAI;SACd,CAAC;QACF,OAAO;YACL,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI;iBAC7C;gBACD,GAAG;gBACH,YAAY,EAAE;oBACZ,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC,YAAY,EAAE,IAAI,IAAI,IAAI;iBAClE;gBACD,OAAO,EAAE;oBACP,EAAE,EAAE,eAAe,EAAE,eAAe,CAAC,EAAE,IAAI,IAAI;oBAC/C,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC,IAAI,IAAI,IAAI;iBACpD;aACF;SACF,CAAC;IACJ,CAAC;CACF;AA1DD,sDA0DC","sourcesContent":["import type { Answers } from 'inquirer';\nimport { prompt } from 'inquirer';\n\nimport { BaseStep } from './BaseStep';\n\ntype Project = {\n id: string;\n slug: string;\n organization?: {\n name: string;\n slug: string;\n };\n keys: {\n dsn: {\n public: string;\n private: string;\n };\n }[];\n};\n\nfunction sleep(n: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, n));\n}\n\nexport class SentryProjectSelector extends BaseStep {\n public async emit(answers: Answers): Promise<any> {\n this.debug(answers);\n\n if (!answers.wizard) {\n // we skip this completely because the wizard wasn't running\n return {};\n }\n\n if (!answers.wizard.projects || answers.wizard.projects.length === 0) {\n throw new Error(\n 'No Projects found. Please create a new Project in Sentry and try again.',\n );\n }\n\n let selectedProject: { selectedProject: Project } | null = null;\n if (answers.wizard.projects.length === 1) {\n selectedProject = {\n selectedProject: answers.wizard.projects[0] as Project,\n };\n // the wizard CLI closes too quickly when we skip the prompt\n // as it will cause the UI to be stuck saying Waiting for wizard to connect\n await sleep(1000);\n } else {\n selectedProject = await prompt([\n {\n choices: answers.wizard.projects.map((project: any) => {\n return {\n name: `${project.organization.name} / ${project.slug}`,\n value: project,\n };\n }),\n message: 'Please select your project in Sentry:',\n name: 'selectedProject',\n type: 'list',\n },\n ]);\n }\n const dsn = selectedProject?.selectedProject.keys[0]?.dsn ?? {\n public: null,\n private: null,\n };\n return {\n config: {\n auth: {\n token: answers.wizard.apiKeys?.token ?? null,\n },\n dsn,\n organization: {\n slug: selectedProject?.selectedProject.organization?.slug ?? null,\n },\n project: {\n id: selectedProject?.selectedProject.id ?? null,\n slug: selectedProject?.selectedProject.slug ?? null,\n },\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"SentryProjectSelector.js","sourceRoot":"","sources":["../../../lib/Steps/SentryProjectSelector.ts"],"names":[],"mappings":";;;AACA,uCAAkC;AAElC,yCAAsC;AA+BtC,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAa,qBAAsB,SAAQ,mBAAQ;IAC1C,KAAK,CAAC,IAAI,CACf,OAAsC;QAEtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEpB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnB,4DAA4D;YAC5D,OAAO,EAAE,CAAC;SACX;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACpE,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;SACH;QAED,IAAI,eAAe,GAAwC,IAAI,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACxC,eAAe,GAAG;gBAChB,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;aAC5C,CAAC;YACF,4DAA4D;YAC5D,2EAA2E;YAC3E,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;SACnB;aAAM;YACL,eAAe,GAAG,MAAM,IAAA,iBAAM,EAAC;gBAC7B;oBACE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAgB,EAAE,EAAE;wBACxD,OAAO;4BACL,IAAI,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE;4BAC7D,KAAK,EAAE,OAAO;yBACf,CAAC;oBACJ,CAAC,CAAC;oBACF,OAAO,EAAE,uCAAuC;oBAChD,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,MAAM;iBACb;aACF,CAAC,CAAC;SACJ;QACD,MAAM,GAAG,GAAG,eAAe,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;YAC3D,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,IAAI;SACd,CAAC;QACF,OAAO;YACL,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI;iBAC7C;gBACD,GAAG;gBACH,YAAY,EAAE;oBACZ,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC,YAAY,EAAE,IAAI,IAAI,IAAI;iBAClE;gBACD,OAAO,EAAE;oBACP,EAAE,EAAE,eAAe,EAAE,eAAe,CAAC,EAAE,IAAI,IAAI;oBAC/C,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC,IAAI,IAAI,IAAI;iBACpD;aACF;SACF,CAAC;IACJ,CAAC;CACF;AA5DD,sDA4DC","sourcesContent":["import type { Answers } from 'inquirer';\nimport { prompt } from 'inquirer';\n\nimport { BaseStep } from './BaseStep';\n\ntype Project = {\n id: string;\n slug: string;\n organization?: {\n name: string;\n slug: string;\n };\n keys: {\n dsn: {\n public: string;\n private: string;\n };\n }[];\n};\n\ntype Wizard = {\n projects: Project[];\n apiKeys: {\n token: string;\n };\n};\n\ntype Config = {\n organization?: { slug?: string | null };\n project?: { id?: string | null; slug?: string | null };\n dsn?: { public?: string | null; private?: string | null };\n auth?: { token?: string | null };\n};\n\nfunction sleep(n: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, n));\n}\n\nexport class SentryProjectSelector extends BaseStep {\n public async emit(\n answers: Answers & { wizard?: Wizard },\n ): Promise<{ config?: Config }> {\n this.debug(answers);\n\n if (!answers.wizard) {\n // we skip this completely because the wizard wasn't running\n return {};\n }\n\n if (!answers.wizard.projects || answers.wizard.projects.length === 0) {\n throw new Error(\n 'No Projects found. Please create a new Project in Sentry and try again.',\n );\n }\n\n let selectedProject: { selectedProject: Project } | null = null;\n if (answers.wizard.projects.length === 1) {\n selectedProject = {\n selectedProject: answers.wizard.projects[0],\n };\n // the wizard CLI closes too quickly when we skip the prompt\n // as it will cause the UI to be stuck saying Waiting for wizard to connect\n await sleep(1000);\n } else {\n selectedProject = await prompt([\n {\n choices: answers.wizard.projects.map((project: Project) => {\n return {\n name: `${project.organization?.name ?? ''} / ${project.slug}`,\n value: project,\n };\n }),\n message: 'Please select your project in Sentry:',\n name: 'selectedProject',\n type: 'list',\n },\n ]);\n }\n const dsn = selectedProject?.selectedProject.keys[0]?.dsn ?? {\n public: null,\n private: null,\n };\n return {\n config: {\n auth: {\n token: answers.wizard.apiKeys?.token ?? null,\n },\n dsn,\n organization: {\n slug: selectedProject?.selectedProject.organization?.slug ?? null,\n },\n project: {\n id: selectedProject?.selectedProject.id ?? null,\n slug: selectedProject?.selectedProject.slug ?? null,\n },\n },\n };\n }\n}\n"]}
@@ -1,5 +1,7 @@
1
1
  import type { Answers } from 'inquirer';
2
2
  import { BaseStep } from './BaseStep';
3
3
  export declare class WaitForSentry extends BaseStep {
4
- emit(answers: Answers): Promise<Answers>;
4
+ emit(answers: Answers & {
5
+ hash?: string;
6
+ }): Promise<Answers>;
5
7
  }
@@ -13,21 +13,21 @@ class WaitForSentry extends BaseStep_1.BaseStep {
13
13
  return {};
14
14
  }
15
15
  if (!answers.hash) {
16
- throw new Error(`No wizard hash found ${answers}`);
16
+ throw new Error('No wizard hash found.');
17
17
  }
18
18
  return new Promise((resolve, _reject) => {
19
19
  this.debug(answers);
20
20
  BottomBar_1.BottomBar.show('Waiting for Sentry...');
21
21
  const baseUrl = this._argv.url;
22
22
  const pingSentry = async () => {
23
- const response = await fetch(`${baseUrl}api/0/wizard/${answers.hash}/`);
23
+ const response = await fetch(`${baseUrl}api/0/wizard/${answers.hash ? answers.hash + '/' : ''}`);
24
24
  this.debug('Polling received data');
25
25
  if (!response.ok) {
26
26
  throw new Error(`Received status ${response.status} ${response.statusText}`);
27
27
  }
28
28
  const data = await response.json();
29
29
  // Delete the wizard hash since we were able to fetch the data
30
- await fetch(`${baseUrl}api/0/wizard/${answers.hash}/`, {
30
+ await fetch(`${baseUrl}api/0/wizard/${answers.hash ? answers.hash + '/' : ''}`, {
31
31
  method: 'DELETE',
32
32
  });
33
33
  BottomBar_1.BottomBar.hide();
@@ -35,7 +35,7 @@ class WaitForSentry extends BaseStep_1.BaseStep {
35
35
  resolve({ wizard: data });
36
36
  };
37
37
  const poll = () => {
38
- this.debug(`Polling: ${baseUrl}api/0/wizard/${answers.hash}/`);
38
+ this.debug(`Polling: ${baseUrl}api/0/wizard/${answers.hash ? answers.hash + '/' : ''}`);
39
39
  pingSentry().catch((e) => {
40
40
  this.debug('Polling received:');
41
41
  this.debug(e);
@@ -1 +1 @@
1
- {"version":3,"file":"WaitForSentry.js","sourceRoot":"","sources":["../../../lib/Steps/WaitForSentry.ts"],"names":[],"mappings":";;;AAEA,mDAAgD;AAChD,6CAAyD;AACzD,yCAAsC;AAEtC,MAAa,aAAc,SAAQ,mBAAQ;IAClC,KAAK,CAAC,IAAI,CAAC,OAAgB;QAChC,IAAI,CAAC,CAAC,MAAM,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE;YAC/D,OAAO,EAAE,CAAC;SACX;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAC1B,OAAO,EAAE,CAAC;SACX;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;SACpD;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEpB,qBAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAE/B,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;gBAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,gBAAgB,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;gBACxE,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBACpC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;oBAChB,MAAM,IAAI,KAAK,CACb,mBAAmB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC5D,CAAC;iBACH;gBACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,8DAA8D;gBAC9D,MAAM,KAAK,CAAC,GAAG,OAAO,gBAAgB,OAAO,CAAC,IAAI,GAAG,EAAE;oBACrD,MAAM,EAAE,QAAQ;iBACjB,CAAC,CAAC;gBACH,qBAAS,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC/B,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5B,CAAC,CAAC;YAEF,MAAM,IAAI,GAAG,GAAS,EAAE;gBACtB,IAAI,CAAC,KAAK,CAAC,YAAY,OAAO,gBAAgB,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;gBAC/D,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;oBACvB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;oBAChC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACd,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAjDD,sCAiDC","sourcesContent":["import type { Answers } from 'inquirer';\n\nimport { BottomBar } from '../Helper/BottomBar';\nimport { getCurrentIntegration } from '../Helper/Wizard';\nimport { BaseStep } from './BaseStep';\n\nexport class WaitForSentry extends BaseStep {\n public async emit(answers: Answers): Promise<Answers> {\n if (!(await getCurrentIntegration(answers).shouldEmit(answers))) {\n return {};\n }\n if (this._argv.skipConnect) {\n return {};\n }\n\n if (!answers.hash) {\n throw new Error(`No wizard hash found ${answers}`);\n }\n\n return new Promise((resolve, _reject) => {\n this.debug(answers);\n\n BottomBar.show('Waiting for Sentry...');\n const baseUrl = this._argv.url;\n\n const pingSentry = async (): Promise<void> => {\n const response = await fetch(`${baseUrl}api/0/wizard/${answers.hash}/`);\n this.debug('Polling received data');\n if (!response.ok) {\n throw new Error(\n `Received status ${response.status} ${response.statusText}`,\n );\n }\n const data = await response.json();\n // Delete the wizard hash since we were able to fetch the data\n await fetch(`${baseUrl}api/0/wizard/${answers.hash}/`, {\n method: 'DELETE',\n });\n BottomBar.hide();\n this.debug('Polling Success!');\n resolve({ wizard: data });\n };\n\n const poll = (): void => {\n this.debug(`Polling: ${baseUrl}api/0/wizard/${answers.hash}/`);\n pingSentry().catch((e) => {\n this.debug('Polling received:');\n this.debug(e);\n setTimeout(poll, 1000);\n });\n };\n\n poll();\n });\n }\n}\n"]}
1
+ {"version":3,"file":"WaitForSentry.js","sourceRoot":"","sources":["../../../lib/Steps/WaitForSentry.ts"],"names":[],"mappings":";;;AAEA,mDAAgD;AAChD,6CAAyD;AACzD,yCAAsC;AAEtC,MAAa,aAAc,SAAQ,mBAAQ;IAClC,KAAK,CAAC,IAAI,CAAC,OAAoC;QACpD,IAAI,CAAC,CAAC,MAAM,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE;YAC/D,OAAO,EAAE,CAAC;SACX;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAC1B,OAAO,EAAE,CAAC;SACX;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;SAC1C;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEpB,qBAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAE/B,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;gBAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,OAAO,gBAAgB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACnE,CAAC;gBACF,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBACpC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;oBAChB,MAAM,IAAI,KAAK,CACb,mBAAmB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC5D,CAAC;iBACH;gBACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,8DAA8D;gBAC9D,MAAM,KAAK,CACT,GAAG,OAAO,gBAAgB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAClE;oBACE,MAAM,EAAE,QAAQ;iBACjB,CACF,CAAC;gBACF,qBAAS,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC/B,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5B,CAAC,CAAC;YAEF,MAAM,IAAI,GAAG,GAAS,EAAE;gBACtB,IAAI,CAAC,KAAK,CACR,YAAY,OAAO,gBACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EACtC,EAAE,CACH,CAAC;gBACF,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;oBACvB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;oBAChC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACd,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA1DD,sCA0DC","sourcesContent":["import type { Answers } from 'inquirer';\n\nimport { BottomBar } from '../Helper/BottomBar';\nimport { getCurrentIntegration } from '../Helper/Wizard';\nimport { BaseStep } from './BaseStep';\n\nexport class WaitForSentry extends BaseStep {\n public async emit(answers: Answers & { hash?: string }): Promise<Answers> {\n if (!(await getCurrentIntegration(answers).shouldEmit(answers))) {\n return {};\n }\n if (this._argv.skipConnect) {\n return {};\n }\n\n if (!answers.hash) {\n throw new Error('No wizard hash found.');\n }\n\n return new Promise((resolve, _reject) => {\n this.debug(answers);\n\n BottomBar.show('Waiting for Sentry...');\n const baseUrl = this._argv.url;\n\n const pingSentry = async (): Promise<void> => {\n const response = await fetch(\n `${baseUrl}api/0/wizard/${answers.hash ? answers.hash + '/' : ''}`,\n );\n this.debug('Polling received data');\n if (!response.ok) {\n throw new Error(\n `Received status ${response.status} ${response.statusText}`,\n );\n }\n const data = await response.json();\n // Delete the wizard hash since we were able to fetch the data\n await fetch(\n `${baseUrl}api/0/wizard/${answers.hash ? answers.hash + '/' : ''}`,\n {\n method: 'DELETE',\n },\n );\n BottomBar.hide();\n this.debug('Polling Success!');\n resolve({ wizard: data });\n };\n\n const poll = (): void => {\n this.debug(\n `Polling: ${baseUrl}api/0/wizard/${\n answers.hash ? answers.hash + '/' : ''\n }`,\n );\n pingSentry().catch((e) => {\n this.debug('Polling received:');\n this.debug(e);\n setTimeout(poll, 1000);\n });\n };\n\n poll();\n });\n }\n}\n"]}
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.Welcome = void 0;
4
7
  const Logging_1 = require("../Helper/Logging");
5
8
  const BaseStep_1 = require("./BaseStep");
9
+ const chalk_1 = __importDefault(require("chalk"));
6
10
  class Welcome extends BaseStep_1.BaseStep {
7
11
  static _didShow = false;
8
12
  // eslint-disable-next-line @typescript-eslint/require-await
@@ -12,6 +16,7 @@ class Welcome extends BaseStep_1.BaseStep {
12
16
  }
13
17
  if (this._argv.uninstall === false) {
14
18
  (0, Logging_1.green)('Sentry Wizard will help you to configure your project');
19
+ (0, Logging_1.dim)(`This wizard sends telemetry data and crash reports to Sentry. This helps us improve the Wizard. You can turn telemetry off at any time by running sentry-wizard ${chalk_1.default.cyan('--disable-telemetry')}.`);
15
20
  (0, Logging_1.dim)('Thank you for using Sentry :)');
16
21
  }
17
22
  Welcome._didShow = true;
@@ -1 +1 @@
1
- {"version":3,"file":"Welcome.js","sourceRoot":"","sources":["../../../lib/Steps/Welcome.ts"],"names":[],"mappings":";;;AAEA,+CAA+C;AAC/C,yCAAsC;AAEtC,MAAa,OAAQ,SAAQ,mBAAQ;IAC3B,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;IAEhC,4DAA4D;IACrD,KAAK,CAAC,IAAI,CAAC,QAAiB;QACjC,IAAI,OAAO,CAAC,QAAQ,EAAE;YACpB,OAAO,EAAE,CAAC;SACX;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,KAAK,EAAE;YAClC,IAAA,eAAK,EAAC,uDAAuD,CAAC,CAAC;YAC/D,IAAA,aAAG,EAAC,+BAA+B,CAAC,CAAC;SACtC;QACD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;;AAdU,0BAAO","sourcesContent":["import type { Answers } from 'inquirer';\n\nimport { dim, green } from '../Helper/Logging';\nimport { BaseStep } from './BaseStep';\n\nexport class Welcome extends BaseStep {\n private static _didShow = false;\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async emit(_answers: Answers): Promise<Answers> {\n if (Welcome._didShow) {\n return {};\n }\n if (this._argv.uninstall === false) {\n green('Sentry Wizard will help you to configure your project');\n dim('Thank you for using Sentry :)');\n }\n Welcome._didShow = true;\n return {};\n }\n}\n"]}
1
+ {"version":3,"file":"Welcome.js","sourceRoot":"","sources":["../../../lib/Steps/Welcome.ts"],"names":[],"mappings":";;;;;;AAEA,+CAA+C;AAC/C,yCAAsC;AACtC,kDAA0B;AAE1B,MAAa,OAAQ,SAAQ,mBAAQ;IAC3B,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;IAEhC,4DAA4D;IACrD,KAAK,CAAC,IAAI,CAAC,QAAiB;QACjC,IAAI,OAAO,CAAC,QAAQ,EAAE;YACpB,OAAO,EAAE,CAAC;SACX;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,KAAK,EAAE;YAClC,IAAA,eAAK,EAAC,uDAAuD,CAAC,CAAC;YAC/D,IAAA,aAAG,EACD,mKAAmK,eAAK,CAAC,IAAI,CAC3K,qBAAqB,CACtB,GAAG,CACL,CAAC;YACF,IAAA,aAAG,EAAC,+BAA+B,CAAC,CAAC;SACtC;QACD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;;AAnBU,0BAAO","sourcesContent":["import type { Answers } from 'inquirer';\n\nimport { dim, green } from '../Helper/Logging';\nimport { BaseStep } from './BaseStep';\nimport chalk from 'chalk';\n\nexport class Welcome extends BaseStep {\n private static _didShow = false;\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async emit(_answers: Answers): Promise<Answers> {\n if (Welcome._didShow) {\n return {};\n }\n if (this._argv.uninstall === false) {\n green('Sentry Wizard will help you to configure your project');\n dim(\n `This wizard sends telemetry data and crash reports to Sentry. This helps us improve the Wizard. You can turn telemetry off at any time by running sentry-wizard ${chalk.cyan(\n '--disable-telemetry',\n )}.`,\n );\n dim('Thank you for using Sentry :)');\n }\n Welcome._didShow = true;\n return {};\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ export type Config = {
2
+ organization?: {
3
+ slug?: string;
4
+ };
5
+ project?: {
6
+ slug?: string;
7
+ };
8
+ dsn?: {
9
+ public?: string;
10
+ };
11
+ auth?: {
12
+ token?: string;
13
+ };
14
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Types.js","sourceRoot":"","sources":["../../lib/Types.ts"],"names":[],"mappings":"","sourcesContent":["export type Config = {\n organization?: { slug?: string };\n project?: { slug?: string };\n dsn?: { public?: string };\n auth?: { token?: string };\n};\n"]}
@@ -1,23 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
3
4
  const Env_1 = require("../Helper/Env");
4
- describe('read-env', () => {
5
- test('transform', () => {
6
- // @ts-ignore: true not assignable to string/undefined
7
- process.env.SENTRY_WIZARD_DEBUG = true;
8
- // @ts-ignore: true not assignable to string/undefined
9
- process.env.SENTRY_WIZARD_UNINSTALL = false;
10
- // @ts-ignore: true not assignable to string/undefined
11
- process.env.SENTRY_WIZARD_SKIP_CONNECT = true;
12
- // @ts-ignore: true not assignable to string/undefined
13
- process.env.SENTRY_WIZARD_QUIET = true;
14
- // @ts-ignore: true not assignable to string/undefined
15
- process.env.SENTRY_WIZARD_INTEGRATION = ['reactNative', 'electron'];
16
- // @ts-ignore: true not assignable to string/undefined
17
- process.env.SENTRY_WIZARD_PLATFORM = ['ios', 'android'];
18
- // @ts-ignore: true not assignable to string/undefined
5
+ (0, vitest_1.describe)('read-env', () => {
6
+ (0, vitest_1.test)('transform', () => {
7
+ process.env.SENTRY_WIZARD_DEBUG = 'true';
8
+ process.env.SENTRY_WIZARD_UNINSTALL = 'false';
9
+ process.env.SENTRY_WIZARD_SKIP_CONNECT = 'true';
10
+ process.env.SENTRY_WIZARD_QUIET = 'true';
11
+ process.env.SENTRY_WIZARD_INTEGRATION = 'reactNative,electron';
12
+ process.env.SENTRY_WIZARD_PLATFORM = 'ios,android';
19
13
  process.env.SENTRY_WIZARD_URL = 'https://sentry.io';
20
- expect((0, Env_1.readEnvironment)()).toEqual({
14
+ (0, vitest_1.expect)((0, Env_1.readEnvironment)()).toEqual({
21
15
  debug: true,
22
16
  integration: 'reactNative,electron',
23
17
  platform: 'ios,android',
@@ -1 +1 @@
1
- {"version":3,"file":"Env.js","sourceRoot":"","sources":["../../../lib/__tests__/Env.ts"],"names":[],"mappings":";;AAAA,uCAAgD;AAEhD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QACrB,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACvC,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,KAAK,CAAC;QAC5C,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,IAAI,CAAC;QAC9C,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACvC,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACpE,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACxD,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,mBAAmB,CAAC;QACpD,MAAM,CAAC,IAAA,qBAAe,GAAE,CAAC,CAAC,OAAO,CAAC;YAChC,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,sBAAsB;YACnC,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,KAAK;YAChB,GAAG,EAAE,mBAAmB;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { readEnvironment } from '../Helper/Env';\n\ndescribe('read-env', () => {\n test('transform', () => {\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_DEBUG = true;\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_UNINSTALL = false;\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_SKIP_CONNECT = true;\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_QUIET = true;\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_INTEGRATION = ['reactNative', 'electron'];\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_PLATFORM = ['ios', 'android'];\n // @ts-ignore: true not assignable to string/undefined\n process.env.SENTRY_WIZARD_URL = 'https://sentry.io';\n expect(readEnvironment()).toEqual({\n debug: true,\n integration: 'reactNative,electron',\n platform: 'ios,android',\n quiet: true,\n skipConnect: true,\n uninstall: false,\n url: 'https://sentry.io',\n });\n });\n});\n"]}
1
+ {"version":3,"file":"Env.js","sourceRoot":"","sources":["../../../lib/__tests__/Env.ts"],"names":[],"mappings":";;AAAA,mCAAgD;AAChD,uCAAgD;AAEhD,IAAA,iBAAQ,EAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAA,aAAI,EAAC,WAAW,EAAE,GAAG,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,MAAM,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,OAAO,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,MAAM,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,MAAM,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,sBAAsB,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,aAAa,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,mBAAmB,CAAC;QAEpD,IAAA,eAAM,EAAC,IAAA,qBAAe,GAAE,CAAC,CAAC,OAAO,CAAC;YAChC,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,sBAAsB;YACnC,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,KAAK;YAChB,GAAG,EAAE,mBAAmB;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, test } from 'vitest';\nimport { readEnvironment } from '../Helper/Env';\n\ndescribe('read-env', () => {\n test('transform', () => {\n process.env.SENTRY_WIZARD_DEBUG = 'true';\n process.env.SENTRY_WIZARD_UNINSTALL = 'false';\n process.env.SENTRY_WIZARD_SKIP_CONNECT = 'true';\n process.env.SENTRY_WIZARD_QUIET = 'true';\n process.env.SENTRY_WIZARD_INTEGRATION = 'reactNative,electron';\n process.env.SENTRY_WIZARD_PLATFORM = 'ios,android';\n process.env.SENTRY_WIZARD_URL = 'https://sentry.io';\n\n expect(readEnvironment()).toEqual({\n debug: true,\n integration: 'reactNative,electron',\n platform: 'ios,android',\n quiet: true,\n skipConnect: true,\n uninstall: false,\n url: 'https://sentry.io',\n });\n });\n});\n"]}