@sentry/wizard 4.5.0 → 4.6.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 (228) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/README.md +23 -19
  3. package/dist/bin.js +13 -0
  4. package/dist/bin.js.map +1 -1
  5. package/dist/e2e-tests/tests/nextjs-14.test.js +3 -2
  6. package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
  7. package/dist/e2e-tests/tests/nextjs-15.test.js +2 -2
  8. package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
  9. package/dist/e2e-tests/utils/index.d.ts +1 -1
  10. package/dist/e2e-tests/utils/index.js +20 -2
  11. package/dist/e2e-tests/utils/index.js.map +1 -1
  12. package/dist/lib/Constants.d.ts +2 -0
  13. package/dist/lib/Constants.js.map +1 -1
  14. package/dist/lib/Helper/File.d.ts +1 -1
  15. package/dist/lib/Helper/File.js +1 -3
  16. package/dist/lib/Helper/File.js.map +1 -1
  17. package/dist/lib/Helper/Logging.d.ts +3 -0
  18. package/dist/lib/Helper/Logging.js +3 -0
  19. package/dist/lib/Helper/Logging.js.map +1 -1
  20. package/dist/lib/Helper/Package.d.ts +5 -3
  21. package/dist/lib/Helper/Package.js +2 -2
  22. package/dist/lib/Helper/Package.js.map +1 -1
  23. package/dist/lib/Helper/SentryCli.d.ts +20 -7
  24. package/dist/lib/Helper/SentryCli.js +21 -13
  25. package/dist/lib/Helper/SentryCli.js.map +1 -1
  26. package/dist/lib/Helper/Wizard.js +9 -5
  27. package/dist/lib/Helper/Wizard.js.map +1 -1
  28. package/dist/lib/Helper/__tests__/SentryCli.js +21 -4
  29. package/dist/lib/Helper/__tests__/SentryCli.js.map +1 -1
  30. package/dist/lib/Setup.d.ts +3 -1
  31. package/dist/lib/Setup.js.map +1 -1
  32. package/dist/lib/Steps/Integrations/BaseIntegration.js +1 -2
  33. package/dist/lib/Steps/Integrations/BaseIntegration.js.map +1 -1
  34. package/dist/lib/Steps/Integrations/Cordova.js +14 -10
  35. package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
  36. package/dist/lib/Steps/Integrations/Electron.d.ts +4 -1
  37. package/dist/lib/Steps/Integrations/Electron.js +1 -1
  38. package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
  39. package/dist/lib/Steps/Integrations/MobileProject.d.ts +3 -1
  40. package/dist/lib/Steps/Integrations/MobileProject.js +1 -1
  41. package/dist/lib/Steps/Integrations/MobileProject.js.map +1 -1
  42. package/dist/lib/Steps/PromptForParameters.d.ts +4 -1
  43. package/dist/lib/Steps/PromptForParameters.js.map +1 -1
  44. package/dist/lib/Steps/SentryProjectSelector.d.ts +42 -1
  45. package/dist/lib/Steps/SentryProjectSelector.js +1 -1
  46. package/dist/lib/Steps/SentryProjectSelector.js.map +1 -1
  47. package/dist/lib/Steps/WaitForSentry.d.ts +3 -1
  48. package/dist/lib/Steps/WaitForSentry.js +4 -4
  49. package/dist/lib/Steps/WaitForSentry.js.map +1 -1
  50. package/dist/lib/Types.d.ts +14 -0
  51. package/dist/lib/Types.js +3 -0
  52. package/dist/lib/Types.js.map +1 -0
  53. package/dist/lib/__tests__/Env.js +6 -13
  54. package/dist/lib/__tests__/Env.js.map +1 -1
  55. package/dist/src/android/android-wizard.js +15 -12
  56. package/dist/src/android/android-wizard.js.map +1 -1
  57. package/dist/src/android/code-tools.js +1 -1
  58. package/dist/src/android/code-tools.js.map +1 -1
  59. package/dist/src/android/gradle.js +4 -4
  60. package/dist/src/android/gradle.js.map +1 -1
  61. package/dist/src/android/manifest.js +1 -1
  62. package/dist/src/android/manifest.js.map +1 -1
  63. package/dist/src/apple/apple-wizard.d.ts +2 -2
  64. package/dist/src/apple/apple-wizard.js +37 -118
  65. package/dist/src/apple/apple-wizard.js.map +1 -1
  66. package/dist/src/apple/check-installed-cli.d.ts +1 -0
  67. package/dist/src/apple/check-installed-cli.js +60 -0
  68. package/dist/src/apple/check-installed-cli.js.map +1 -0
  69. package/dist/src/apple/cocoapod.js +1 -1
  70. package/dist/src/apple/cocoapod.js.map +1 -1
  71. package/dist/src/apple/code-tools.js +1 -1
  72. package/dist/src/apple/code-tools.js.map +1 -1
  73. package/dist/src/apple/configure-fastlane.d.ts +5 -0
  74. package/dist/src/apple/configure-fastlane.js +66 -0
  75. package/dist/src/apple/configure-fastlane.js.map +1 -0
  76. package/dist/src/apple/fastlane.d.ts +1 -1
  77. package/dist/src/apple/fastlane.js +5 -5
  78. package/dist/src/apple/fastlane.js.map +1 -1
  79. package/dist/src/apple/lookup-xcode-project.d.ts +7 -0
  80. package/dist/src/apple/lookup-xcode-project.js +98 -0
  81. package/dist/src/apple/lookup-xcode-project.js.map +1 -0
  82. package/dist/src/apple/options.d.ts +4 -0
  83. package/dist/src/apple/options.js +3 -0
  84. package/dist/src/apple/options.js.map +1 -0
  85. package/dist/src/apple/search-xcode-project-at-path.d.ts +1 -0
  86. package/dist/src/apple/search-xcode-project-at-path.js +70 -0
  87. package/dist/src/apple/search-xcode-project-at-path.js.map +1 -0
  88. package/dist/src/apple/xcode-manager.js +1 -1
  89. package/dist/src/apple/xcode-manager.js.map +1 -1
  90. package/dist/src/flutter/code-tools.js +3 -3
  91. package/dist/src/flutter/code-tools.js.map +1 -1
  92. package/dist/src/flutter/flutter-wizard.js +21 -15
  93. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  94. package/dist/src/flutter/templates.js +4 -4
  95. package/dist/src/flutter/templates.js.map +1 -1
  96. package/dist/src/nextjs/nextjs-wizard.js +118 -43
  97. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  98. package/dist/src/nextjs/templates.d.ts +10 -1
  99. package/dist/src/nextjs/templates.js +191 -63
  100. package/dist/src/nextjs/templates.js.map +1 -1
  101. package/dist/src/nuxt/nuxt-wizard.js +21 -16
  102. package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
  103. package/dist/src/nuxt/sdk-example.js +3 -3
  104. package/dist/src/nuxt/sdk-example.js.map +1 -1
  105. package/dist/src/nuxt/sdk-setup.js +9 -9
  106. package/dist/src/nuxt/sdk-setup.js.map +1 -1
  107. package/dist/src/nuxt/templates.js +173 -58
  108. package/dist/src/nuxt/templates.js.map +1 -1
  109. package/dist/src/nuxt/utils.js +6 -3
  110. package/dist/src/nuxt/utils.js.map +1 -1
  111. package/dist/src/react-native/expo-env-file.js +1 -1
  112. package/dist/src/react-native/expo-env-file.js.map +1 -1
  113. package/dist/src/react-native/expo-metro.js +4 -4
  114. package/dist/src/react-native/expo-metro.js.map +1 -1
  115. package/dist/src/react-native/expo.js +4 -4
  116. package/dist/src/react-native/expo.js.map +1 -1
  117. package/dist/src/react-native/javascript.js +7 -7
  118. package/dist/src/react-native/javascript.js.map +1 -1
  119. package/dist/src/react-native/metro.js +8 -8
  120. package/dist/src/react-native/metro.js.map +1 -1
  121. package/dist/src/react-native/react-native-wizard.d.ts +1 -1
  122. package/dist/src/react-native/react-native-wizard.js +36 -31
  123. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  124. package/dist/src/react-native/uninstall.js +8 -5
  125. package/dist/src/react-native/uninstall.js.map +1 -1
  126. package/dist/src/react-native/xcode.d.ts +2 -1
  127. package/dist/src/react-native/xcode.js +1 -2
  128. package/dist/src/react-native/xcode.js.map +1 -1
  129. package/dist/src/remix/codemods/handle-error.js +4 -1
  130. package/dist/src/remix/codemods/handle-error.js.map +1 -1
  131. package/dist/src/remix/remix-wizard.js +23 -18
  132. package/dist/src/remix/remix-wizard.js.map +1 -1
  133. package/dist/src/remix/sdk-example.js +163 -64
  134. package/dist/src/remix/sdk-example.js.map +1 -1
  135. package/dist/src/remix/sdk-setup.js +11 -7
  136. package/dist/src/remix/sdk-setup.js.map +1 -1
  137. package/dist/src/run.d.ts +3 -1
  138. package/dist/src/run.js +29 -9
  139. package/dist/src/run.js.map +1 -1
  140. package/dist/src/sourcemaps/sourcemaps-wizard.js +30 -28
  141. package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
  142. package/dist/src/sourcemaps/tools/angular.js +3 -3
  143. package/dist/src/sourcemaps/tools/angular.js.map +1 -1
  144. package/dist/src/sourcemaps/tools/create-react-app.js +3 -3
  145. package/dist/src/sourcemaps/tools/create-react-app.js.map +1 -1
  146. package/dist/src/sourcemaps/tools/esbuild.js +6 -6
  147. package/dist/src/sourcemaps/tools/esbuild.js.map +1 -1
  148. package/dist/src/sourcemaps/tools/nextjs.js +5 -5
  149. package/dist/src/sourcemaps/tools/nextjs.js.map +1 -1
  150. package/dist/src/sourcemaps/tools/remix.js +4 -4
  151. package/dist/src/sourcemaps/tools/remix.js.map +1 -1
  152. package/dist/src/sourcemaps/tools/rollup.js +6 -6
  153. package/dist/src/sourcemaps/tools/rollup.js.map +1 -1
  154. package/dist/src/sourcemaps/tools/sentry-cli.js +15 -15
  155. package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
  156. package/dist/src/sourcemaps/tools/tsc.js +6 -6
  157. package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
  158. package/dist/src/sourcemaps/tools/vite.js +12 -12
  159. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  160. package/dist/src/sourcemaps/tools/webpack.js +10 -10
  161. package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
  162. package/dist/src/sourcemaps/utils/detect-tool.js +2 -2
  163. package/dist/src/sourcemaps/utils/detect-tool.js.map +1 -1
  164. package/dist/src/sourcemaps/utils/other-wizards.js +5 -5
  165. package/dist/src/sourcemaps/utils/other-wizards.js.map +1 -1
  166. package/dist/src/sourcemaps/utils/sdk-version.js +7 -7
  167. package/dist/src/sourcemaps/utils/sdk-version.js.map +1 -1
  168. package/dist/src/sveltekit/sdk-example.js +1 -1
  169. package/dist/src/sveltekit/sdk-example.js.map +1 -1
  170. package/dist/src/sveltekit/sdk-setup.js +15 -14
  171. package/dist/src/sveltekit/sdk-setup.js.map +1 -1
  172. package/dist/src/sveltekit/sveltekit-wizard.js +25 -20
  173. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  174. package/dist/src/sveltekit/templates.js +126 -37
  175. package/dist/src/sveltekit/templates.js.map +1 -1
  176. package/dist/src/telemetry.js +11 -0
  177. package/dist/src/telemetry.js.map +1 -1
  178. package/dist/src/utils/{clack-utils.d.ts → clack/index.d.ts} +45 -7
  179. package/dist/src/utils/{clack-utils.js → clack/index.js} +72 -19
  180. package/dist/src/utils/clack/index.js.map +1 -0
  181. package/dist/src/utils/debug.js +1 -1
  182. package/dist/src/utils/debug.js.map +1 -1
  183. package/dist/src/utils/find-files-with-extension.d.ts +1 -0
  184. package/dist/src/utils/find-files-with-extension.js +39 -0
  185. package/dist/src/utils/find-files-with-extension.js.map +1 -0
  186. package/dist/src/utils/package-manager.d.ts +6 -1
  187. package/dist/src/utils/package-manager.js +25 -19
  188. package/dist/src/utils/package-manager.js.map +1 -1
  189. package/dist/src/utils/sentrycli-utils.js +0 -1
  190. package/dist/src/utils/sentrycli-utils.js.map +1 -1
  191. package/dist/src/utils/types.d.ts +4 -0
  192. package/dist/src/utils/types.js.map +1 -1
  193. package/dist/src/version.d.ts +1 -1
  194. package/dist/src/version.js +1 -1
  195. package/dist/src/version.js.map +1 -1
  196. package/dist/test/android/code-tools.test.js +0 -1
  197. package/dist/test/android/code-tools.test.js.map +1 -1
  198. package/dist/test/apple/cocoapod.test.js +1 -1
  199. package/dist/test/apple/cocoapod.test.js.map +1 -1
  200. package/dist/test/apple/code-tools.test.js +1 -1
  201. package/dist/test/apple/code-tools.test.js.map +1 -1
  202. package/dist/test/apple/fastfile.test.js +1 -1
  203. package/dist/test/apple/fastfile.test.js.map +1 -1
  204. package/dist/test/apple/xcode-manager.test.js +26 -2
  205. package/dist/test/apple/xcode-manager.test.js.map +1 -1
  206. package/dist/test/flutter/code-tools.test.js +0 -2
  207. package/dist/test/flutter/code-tools.test.js.map +1 -1
  208. package/dist/test/flutter/templates.test.js +23 -23
  209. package/dist/test/flutter/templates.test.js.map +1 -1
  210. package/dist/test/nextjs/templates.test.js +128 -83
  211. package/dist/test/nextjs/templates.test.js.map +1 -1
  212. package/dist/test/react-native/expo-metro.test.js +1 -1
  213. package/dist/test/react-native/expo-metro.test.js.map +1 -1
  214. package/dist/test/react-native/javascript.test.js +1 -1
  215. package/dist/test/react-native/javascript.test.js.map +1 -1
  216. package/dist/test/react-native/metro.test.js +1 -1
  217. package/dist/test/react-native/metro.test.js.map +1 -1
  218. package/dist/test/sourcemaps/tools/sentry-cli.test.js +5 -5
  219. package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -1
  220. package/dist/test/utils/{clack-utils.test.js → clack/index.test.js} +91 -18
  221. package/dist/test/utils/clack/index.test.js.map +1 -0
  222. package/dist/test/utils/package-manager.test.d.ts +1 -0
  223. package/dist/test/utils/package-manager.test.js +29 -0
  224. package/dist/test/utils/package-manager.test.js.map +1 -0
  225. package/package.json +1 -1
  226. package/dist/src/utils/clack-utils.js.map +0 -1
  227. package/dist/test/utils/clack-utils.test.js.map +0 -1
  228. /package/dist/test/utils/{clack-utils.test.d.ts → clack/index.test.d.ts} +0 -0
@@ -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":";;;AACA,uCAAkC;AAElC,+CAAwC;AACxC,6CAAyD;AACzD,yCAAsC;AAEtC,MAAa,mBAAoB,SAAQ,mBAAQ;IACxC,KAAK,CAAC,IAAI,CAAC,OAAgB;QAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpB,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,KAAK,EAAE;YACpB,OAAO,EAAE,CAAC;SACX;QAED,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,YAAY,GAAQ,MAAM,IAAA,iBAAM,EAAC;YACrC;gBACE,OAAO,EAAE,oBAAoB;gBAC7B,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO;gBACb,6DAA6D;gBAC7D,QAAQ,EAAE,IAAI,CAAC,aAAa;gBAC5B,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,0BAA0B,EAAE,GAAG,EAAE;oBAC9D,IAAA,aAAG,EAAC,0CAA0C,CAAC,CAAC;oBAChD,IAAA,aAAG,EAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;gBAC3C,CAAC,CAAC;aACH;SACF,CAAC,CAAC;QAEH,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,OAAO,GAAQ,MAAM,IAAA,iBAAM,EAAC;YAChC;gBACE,OAAO,EAAE,eAAe;gBACxB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO;gBACb,6DAA6D;gBAC7D,QAAQ,EAAE,IAAI,CAAC,aAAa;gBAC5B,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,EAAE;oBACzD,IAAA,aAAG,EAAC,qCAAqC,CAAC,CAAC;oBAC3C,IAAA,aAAG,EAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;gBAC3C,CAAC,CAAC;aACH;SACF,CAAC,CAAC;QAEH,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,MAAM,IAAA,iBAAM,EAAC;YACvB;gBACE,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,OAAO;gBACb,6DAA6D;gBAC7D,QAAQ,EAAE,IAAI,CAAC,YAAY;gBAC3B,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,EAAE;oBACvD,IAAA,aAAG,EAAC,4BAA4B,CAAC,CAAC;oBAClC,IAAA,aAAG,EAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;gBAC5C,CAAC,CAAC;aACH;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,IAAA,iBAAM,EAAC;YACxB;gBACE,OAAO,EAAE,aAAa;gBACtB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,OAAO;gBACb,6DAA6D;gBAC7D,QAAQ,EAAE,IAAI,CAAC,kBAAkB;gBACjC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,EAAE;oBACvD,IAAA,aAAG,EAAC,mCAAmC,CAAC,CAAC;oBACzC,IAAA,aAAG,EAAC,yBAAyB,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC;oBACnD,IAAA,aAAG,EACD,0EAA0E,CAC3E,CAAC;gBACJ,CAAC,CAAC;aACH;SACF,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE;gBACN,GAAG,OAAO,CAAC,MAAM;gBACjB,IAAI;gBACJ,GAAG;gBACH,OAAO;gBACP,YAAY;aACb;SACF,CAAC;IACJ,CAAC;IAEO,WAAW,CACjB,OAAgB,EAChB,gBAAyB,EACzB,WAAoB;QAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAC/B,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI;YAClC,gBAAgB;YAChB,mBAAmB,CAAC;QACtB,MAAM,QAAQ,GACZ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,WAAW,IAAI,cAAc,CAAC;QACjE,OAAO,GAAG,OAAO,GAAG,OAAO,IAAI,QAAQ,EAAE,CAAC;IAC5C,CAAC;IAEO,aAAa,CAAC,OAAgB,EAAE,WAAoB;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAC/B,MAAM,QAAQ,GACZ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,WAAW,IAAI,cAAc,CAAC;QACjE,OAAO,GAAG,OAAO,qBAAqB,QAAQ,OAAO,CAAC;IACxD,CAAC;IAEO,UAAU,CAChB,OAAgB,EAChB,SAAiB,EACjB,OAAoB;QAEpB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;QAC7C,IAAI,SAAS,IAAI,OAAO,EAAE;YACxB,OAAO,EAAE,CAAC;SACX;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,kBAAkB,CAAC,KAAa;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE/C,IAAI,UAAU,EAAE;YACd,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;gBAC3B,OAAO,gFAAgF,CAAC;aACzF;YACD,OAAO,IAAI,CAAC;SACb;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,EAAE;YAC3C,OAAO,wEAAwE,CAAC;SACjF;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,aAAa,CAAC,KAAa;QACjC,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;YACzB,OAAO,+DAA+D,CAAC;SACxE;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YACtB,OAAO,gBAAgB,CAAC;SACzB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,YAAY,CAAC,KAAa;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CACvB,+DAA+D,CAChE,CAAC;QACF,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,oBAAoB,CAAC;SAC7B;QACD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;YAC/C,OAAO,iCAAiC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA5JD,kDA4JC;AASD;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;QAChC,OAAO,KAAK,CAAC;KACd;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;QACzB,OAAO,KAAK,CAAC;KACd;IAED,IAAI;QACF,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAsB,CAAC;QACpE,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;YAC5D,OAAO,KAAK,CAAC;SACd;KACF;IAAC,MAAM;QACN,OAAO,KAAK,CAAC;KACd;IAED,OAAO,IAAI,CAAC;AACd,CAAC","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"]}
@@ -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"]}
@@ -3,19 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const Env_1 = require("../Helper/Env");
4
4
  describe('read-env', () => {
5
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
6
+ process.env.SENTRY_WIZARD_DEBUG = 'true';
7
+ process.env.SENTRY_WIZARD_UNINSTALL = 'false';
8
+ process.env.SENTRY_WIZARD_SKIP_CONNECT = 'true';
9
+ process.env.SENTRY_WIZARD_QUIET = 'true';
10
+ process.env.SENTRY_WIZARD_INTEGRATION = 'reactNative,electron';
11
+ process.env.SENTRY_WIZARD_PLATFORM = 'ios,android';
19
12
  process.env.SENTRY_WIZARD_URL = 'https://sentry.io';
20
13
  expect((0, Env_1.readEnvironment)()).toEqual({
21
14
  debug: true,
@@ -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,uCAAgD;AAEhD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,CAAC,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,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 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"]}
@@ -29,18 +29,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.runAndroidWizard = void 0;
30
30
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
31
31
  const fs = __importStar(require("fs"));
32
- // @ts-ignore - clack is ESM and TS complains about that. It works though
32
+ // @ts-expect-error - clack is ESM and TS complains about that. It works though
33
33
  const clack = __importStar(require("@clack/prompts"));
34
- const path = __importStar(require("path"));
35
34
  const Sentry = __importStar(require("@sentry/node"));
35
+ const chalk_1 = __importDefault(require("chalk"));
36
+ const path = __importStar(require("path"));
37
+ const telemetry_1 = require("../telemetry");
38
+ const clack_1 = require("../utils/clack");
39
+ const codetools = __importStar(require("./code-tools"));
36
40
  const gradle = __importStar(require("./gradle"));
37
41
  const manifest = __importStar(require("./manifest"));
38
- const codetools = __importStar(require("./code-tools"));
39
- const clack_utils_1 = require("../utils/clack-utils");
40
- const telemetry_1 = require("../telemetry");
41
- const chalk_1 = __importDefault(require("chalk"));
42
42
  const proguardMappingCliSetupConfig = {
43
- ...clack_utils_1.propertiesCliSetupConfig,
43
+ ...clack_1.propertiesCliSetupConfig,
44
44
  name: 'proguard mappings',
45
45
  };
46
46
  async function runAndroidWizard(options) {
@@ -52,11 +52,14 @@ async function runAndroidWizard(options) {
52
52
  }
53
53
  exports.runAndroidWizard = runAndroidWizard;
54
54
  async function runAndroidWizardWithTelemetry(options) {
55
- (0, clack_utils_1.printWelcome)({
55
+ (0, clack_1.printWelcome)({
56
56
  wizardName: 'Sentry Android Wizard',
57
57
  promoCode: options.promoCode,
58
58
  });
59
- await (0, clack_utils_1.confirmContinueIfNoOrDirtyGitRepo)();
59
+ await (0, clack_1.confirmContinueIfNoOrDirtyGitRepo)({
60
+ ignoreGitChanges: options.ignoreGitChanges,
61
+ cwd: undefined,
62
+ });
60
63
  const projectDir = process.cwd();
61
64
  const buildGradleFiles = findFilesWithExtensions(projectDir, [
62
65
  '.gradle',
@@ -65,11 +68,11 @@ async function runAndroidWizardWithTelemetry(options) {
65
68
  if (!buildGradleFiles || buildGradleFiles.length === 0) {
66
69
  clack.log.error('No Gradle project found. Please run this command from the root of your project.');
67
70
  Sentry.captureException('No Gradle project found');
68
- await (0, clack_utils_1.abort)();
71
+ await (0, clack_1.abort)();
69
72
  return;
70
73
  }
71
74
  const appFile = await (0, telemetry_1.traceStep)('Select App File', () => gradle.selectAppFile(buildGradleFiles));
72
- const { selectedProject, selfHosted, sentryUrl, authToken } = await (0, clack_utils_1.getOrAskForProjectData)(options, 'android');
75
+ const { selectedProject, selfHosted, sentryUrl, authToken } = await (0, clack_1.getOrAskForProjectData)(options, 'android');
73
76
  // ======== STEP 1. Add Sentry Gradle Plugin to build.gradle(.kts) ============
74
77
  clack.log.step(`Adding ${chalk_1.default.bold('Sentry Gradle plugin')} to your app's ${chalk_1.default.cyan('build.gradle')} file.`);
75
78
  const pluginAdded = await (0, telemetry_1.traceStep)('Add Gradle Plugin', () => gradle.addGradlePlugin(appFile, selectedProject.organization.slug, selectedProject.slug));
@@ -112,7 +115,7 @@ async function runAndroidWizardWithTelemetry(options) {
112
115
  }
113
116
  // ======== STEP 4. Add sentry-cli config file ============
114
117
  clack.log.step(`Configuring ${chalk_1.default.bold('proguard mappings upload')} via the ${chalk_1.default.cyan('sentry.properties')} file.`);
115
- await (0, clack_utils_1.addSentryCliConfig)({ authToken }, proguardMappingCliSetupConfig);
118
+ await (0, clack_1.addSentryCliConfig)({ authToken }, proguardMappingCliSetupConfig);
116
119
  // ======== OUTRO ========
117
120
  const issuesPageLink = selfHosted
118
121
  ? `${sentryUrl}organizations/${selectedProject.organization.slug}/issues/?project=${selectedProject.id}`
@@ -1 +1 @@
1
- {"version":3,"file":"android-wizard.js","sourceRoot":"","sources":["../../../src/android/android-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport * as fs from 'fs';\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport * as path from 'path';\nimport * as Sentry from '@sentry/node';\nimport * as gradle from './gradle';\nimport * as manifest from './manifest';\nimport * as codetools from './code-tools';\nimport {\n CliSetupConfig,\n abort,\n addSentryCliConfig,\n confirmContinueIfNoOrDirtyGitRepo,\n getOrAskForProjectData,\n printWelcome,\n propertiesCliSetupConfig,\n} from '../utils/clack-utils';\nimport { WizardOptions } from '../utils/types';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport chalk from 'chalk';\n\nconst proguardMappingCliSetupConfig: CliSetupConfig = {\n ...propertiesCliSetupConfig,\n name: 'proguard mappings',\n};\n\nexport async function runAndroidWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'android',\n wizardOptions: options,\n },\n () => runAndroidWizardWithTelemetry(options),\n );\n}\n\nasync function runAndroidWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Android Wizard',\n promoCode: options.promoCode,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo();\n\n const projectDir = process.cwd();\n const buildGradleFiles = findFilesWithExtensions(projectDir, [\n '.gradle',\n 'gradle.kts',\n ]);\n\n if (!buildGradleFiles || buildGradleFiles.length === 0) {\n clack.log.error(\n 'No Gradle project found. Please run this command from the root of your project.',\n );\n Sentry.captureException('No Gradle project found');\n await abort();\n return;\n }\n\n const appFile = await traceStep('Select App File', () =>\n gradle.selectAppFile(buildGradleFiles),\n );\n\n const { selectedProject, selfHosted, sentryUrl, authToken } =\n await getOrAskForProjectData(options, 'android');\n\n // ======== STEP 1. Add Sentry Gradle Plugin to build.gradle(.kts) ============\n clack.log.step(\n `Adding ${chalk.bold('Sentry Gradle plugin')} to your app's ${chalk.cyan(\n 'build.gradle',\n )} file.`,\n );\n const pluginAdded = await traceStep('Add Gradle Plugin', () =>\n gradle.addGradlePlugin(\n appFile,\n selectedProject.organization.slug,\n selectedProject.slug,\n ),\n );\n if (!pluginAdded) {\n clack.log.warn(\n \"Could not add Sentry Gradle plugin to your app's build.gradle file. You'll have to add it manually.\\nPlease follow the instructions at https://docs.sentry.io/platforms/android/#install\",\n );\n }\n Sentry.setTag('gradle-plugin-added', pluginAdded);\n\n // ======== STEP 2. Configure Sentry SDK via AndroidManifest ============\n clack.log.step(\n `Configuring Sentry SDK via ${chalk.cyan('AndroidManifest.xml')}`,\n );\n const appDir = path.dirname(appFile);\n const manifestFile = path.join(appDir, 'src', 'main', 'AndroidManifest.xml');\n\n const manifestUpdated = traceStep('Update Android Manifest', () =>\n manifest.addManifestSnippet(\n manifestFile,\n selectedProject.keys[0].dsn.public,\n ),\n );\n if (!manifestUpdated) {\n clack.log.warn(\n \"Could not configure the Sentry SDK. You'll have to do it manually.\\nPlease follow the instructions at https://docs.sentry.io/platforms/android/#configure\",\n );\n }\n Sentry.setTag('android-manifest-updated', manifestUpdated);\n\n // ======== STEP 3. Patch Main Activity with a test error snippet ============\n clack.log.step(\n `Patching ${chalk.bold('Main Activity')} with a test error snippet.`,\n );\n const mainActivity = traceStep('Find Main Activity', () =>\n manifest.getMainActivity(manifestFile),\n );\n let packageName = mainActivity.packageName;\n if (!packageName) {\n // if no package name in AndroidManifest, look into gradle script\n packageName = gradle.getNamespace(appFile);\n }\n const activityName = mainActivity.activityName;\n Sentry.setTag('has-activity-name', !!activityName);\n Sentry.setTag('has-package-name', !!packageName);\n if (!activityName || !packageName) {\n clack.log.warn(\n \"Could not find Activity with intent action MAIN. You'll have to manually verify the setup.\\nPlease follow the instructions at https://docs.sentry.io/platforms/android/#verify\",\n );\n Sentry.captureException('Could not find Main Activity');\n } else {\n const packageNameStable = packageName;\n const activityFile = traceStep('Find Main Activity Source File', () =>\n codetools.findActivitySourceFile(appDir, packageNameStable, activityName),\n );\n\n const activityPatched = traceStep('Patch Main Activity', () =>\n codetools.patchMainActivity(activityFile),\n );\n if (!activityPatched) {\n clack.log.warn(\n \"Could not patch main activity. You'll have to manually verify the setup.\\nPlease follow the instructions at https://docs.sentry.io/platforms/android/#verify\",\n );\n }\n Sentry.setTag('main-activity-patched', activityPatched);\n }\n\n // ======== STEP 4. Add sentry-cli config file ============\n clack.log.step(\n `Configuring ${chalk.bold('proguard mappings upload')} via the ${chalk.cyan(\n 'sentry.properties',\n )} file.`,\n );\n\n await addSentryCliConfig({ authToken }, proguardMappingCliSetupConfig);\n\n // ======== OUTRO ========\n const issuesPageLink = selfHosted\n ? `${sentryUrl}organizations/${selectedProject.organization.slug}/issues/?project=${selectedProject.id}`\n : `https://${selectedProject.organization.slug}.sentry.io/issues/?project=${selectedProject.id}`;\n\n clack.outro(`\n${chalk.greenBright('Successfully installed the Sentry Android SDK!')}\n\n${chalk.cyan(\n `You can validate your setup by launching your application and checking Sentry issues page afterwards\n${issuesPageLink}`,\n)}\n\nCheck out the SDK documentation for further configuration:\nhttps://docs.sentry.io/platforms/android/\n `);\n}\n\n//find files with the given extension\nfunction findFilesWithExtensions(\n dir: string,\n extensions: string[],\n filesWithExtensions: string[] = [],\n): string[] {\n const cwd = process.cwd();\n const files = fs.readdirSync(dir, { withFileTypes: true });\n for (const file of files) {\n if (file.isDirectory()) {\n const childDir = path.join(dir, file.name);\n findFilesWithExtensions(childDir, extensions, filesWithExtensions);\n } else if (extensions.some((ext) => file.name.endsWith(ext))) {\n filesWithExtensions.push(path.relative(cwd, path.join(dir, file.name)));\n }\n }\n return filesWithExtensions;\n}\n"]}
1
+ {"version":3,"file":"android-wizard.js","sourceRoot":"","sources":["../../../src/android/android-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport * as fs from 'fs';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport * as Sentry from '@sentry/node';\nimport chalk from 'chalk';\nimport * as path from 'path';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n CliSetupConfig,\n abort,\n addSentryCliConfig,\n confirmContinueIfNoOrDirtyGitRepo,\n getOrAskForProjectData,\n printWelcome,\n propertiesCliSetupConfig,\n} from '../utils/clack';\nimport { WizardOptions } from '../utils/types';\nimport * as codetools from './code-tools';\nimport * as gradle from './gradle';\nimport * as manifest from './manifest';\n\nconst proguardMappingCliSetupConfig: CliSetupConfig = {\n ...propertiesCliSetupConfig,\n name: 'proguard mappings',\n};\n\nexport async function runAndroidWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'android',\n wizardOptions: options,\n },\n () => runAndroidWizardWithTelemetry(options),\n );\n}\n\nasync function runAndroidWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Android Wizard',\n promoCode: options.promoCode,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const projectDir = process.cwd();\n const buildGradleFiles = findFilesWithExtensions(projectDir, [\n '.gradle',\n 'gradle.kts',\n ]);\n\n if (!buildGradleFiles || buildGradleFiles.length === 0) {\n clack.log.error(\n 'No Gradle project found. Please run this command from the root of your project.',\n );\n Sentry.captureException('No Gradle project found');\n await abort();\n return;\n }\n\n const appFile = await traceStep('Select App File', () =>\n gradle.selectAppFile(buildGradleFiles),\n );\n\n const { selectedProject, selfHosted, sentryUrl, authToken } =\n await getOrAskForProjectData(options, 'android');\n\n // ======== STEP 1. Add Sentry Gradle Plugin to build.gradle(.kts) ============\n clack.log.step(\n `Adding ${chalk.bold('Sentry Gradle plugin')} to your app's ${chalk.cyan(\n 'build.gradle',\n )} file.`,\n );\n const pluginAdded = await traceStep('Add Gradle Plugin', () =>\n gradle.addGradlePlugin(\n appFile,\n selectedProject.organization.slug,\n selectedProject.slug,\n ),\n );\n if (!pluginAdded) {\n clack.log.warn(\n \"Could not add Sentry Gradle plugin to your app's build.gradle file. You'll have to add it manually.\\nPlease follow the instructions at https://docs.sentry.io/platforms/android/#install\",\n );\n }\n Sentry.setTag('gradle-plugin-added', pluginAdded);\n\n // ======== STEP 2. Configure Sentry SDK via AndroidManifest ============\n clack.log.step(\n `Configuring Sentry SDK via ${chalk.cyan('AndroidManifest.xml')}`,\n );\n const appDir = path.dirname(appFile);\n const manifestFile = path.join(appDir, 'src', 'main', 'AndroidManifest.xml');\n\n const manifestUpdated = traceStep('Update Android Manifest', () =>\n manifest.addManifestSnippet(\n manifestFile,\n selectedProject.keys[0].dsn.public,\n ),\n );\n if (!manifestUpdated) {\n clack.log.warn(\n \"Could not configure the Sentry SDK. You'll have to do it manually.\\nPlease follow the instructions at https://docs.sentry.io/platforms/android/#configure\",\n );\n }\n Sentry.setTag('android-manifest-updated', manifestUpdated);\n\n // ======== STEP 3. Patch Main Activity with a test error snippet ============\n clack.log.step(\n `Patching ${chalk.bold('Main Activity')} with a test error snippet.`,\n );\n const mainActivity = traceStep('Find Main Activity', () =>\n manifest.getMainActivity(manifestFile),\n );\n let packageName = mainActivity.packageName;\n if (!packageName) {\n // if no package name in AndroidManifest, look into gradle script\n packageName = gradle.getNamespace(appFile);\n }\n const activityName = mainActivity.activityName;\n Sentry.setTag('has-activity-name', !!activityName);\n Sentry.setTag('has-package-name', !!packageName);\n if (!activityName || !packageName) {\n clack.log.warn(\n \"Could not find Activity with intent action MAIN. You'll have to manually verify the setup.\\nPlease follow the instructions at https://docs.sentry.io/platforms/android/#verify\",\n );\n Sentry.captureException('Could not find Main Activity');\n } else {\n const packageNameStable = packageName;\n const activityFile = traceStep('Find Main Activity Source File', () =>\n codetools.findActivitySourceFile(appDir, packageNameStable, activityName),\n );\n\n const activityPatched = traceStep('Patch Main Activity', () =>\n codetools.patchMainActivity(activityFile),\n );\n if (!activityPatched) {\n clack.log.warn(\n \"Could not patch main activity. You'll have to manually verify the setup.\\nPlease follow the instructions at https://docs.sentry.io/platforms/android/#verify\",\n );\n }\n Sentry.setTag('main-activity-patched', activityPatched);\n }\n\n // ======== STEP 4. Add sentry-cli config file ============\n clack.log.step(\n `Configuring ${chalk.bold('proguard mappings upload')} via the ${chalk.cyan(\n 'sentry.properties',\n )} file.`,\n );\n\n await addSentryCliConfig({ authToken }, proguardMappingCliSetupConfig);\n\n // ======== OUTRO ========\n const issuesPageLink = selfHosted\n ? `${sentryUrl}organizations/${selectedProject.organization.slug}/issues/?project=${selectedProject.id}`\n : `https://${selectedProject.organization.slug}.sentry.io/issues/?project=${selectedProject.id}`;\n\n clack.outro(`\n${chalk.greenBright('Successfully installed the Sentry Android SDK!')}\n\n${chalk.cyan(\n `You can validate your setup by launching your application and checking Sentry issues page afterwards\n${issuesPageLink}`,\n)}\n\nCheck out the SDK documentation for further configuration:\nhttps://docs.sentry.io/platforms/android/\n `);\n}\n\n//find files with the given extension\nfunction findFilesWithExtensions(\n dir: string,\n extensions: string[],\n filesWithExtensions: string[] = [],\n): string[] {\n const cwd = process.cwd();\n const files = fs.readdirSync(dir, { withFileTypes: true });\n for (const file of files) {\n if (file.isDirectory()) {\n const childDir = path.join(dir, file.name);\n findFilesWithExtensions(childDir, extensions, filesWithExtensions);\n } else if (extensions.some((ext) => file.name.endsWith(ext))) {\n filesWithExtensions.push(path.relative(cwd, path.join(dir, file.name)));\n }\n }\n return filesWithExtensions;\n}\n"]}
@@ -30,7 +30,7 @@ exports.getLastImportLineLocation = exports.patchMainActivity = exports.findActi
30
30
  const fs = __importStar(require("fs"));
31
31
  const path = __importStar(require("path"));
32
32
  const Sentry = __importStar(require("@sentry/node"));
33
- // @ts-ignore - clack is ESM and TS complains about that. It works though
33
+ // @ts-expect-error - clack is ESM and TS complains about that. It works though
34
34
  const clack = __importStar(require("@clack/prompts"));
35
35
  const chalk_1 = __importDefault(require("chalk"));
36
36
  const templates_1 = require("./templates");
@@ -1 +1 @@
1
- {"version":3,"file":"code-tools.js","sourceRoot":"","sources":["../../../src/android/code-tools.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as Sentry from '@sentry/node';\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport {\n sentryImport,\n sentryImportKt,\n testErrorSnippet,\n testErrorSnippetKt,\n} from './templates';\nimport { findFile } from '../utils/ast-utils';\n\n/**\n * Looks in src/main/java or src/main/kotlin for the specified {@link packageName} and\n * {@link activityName} by concatenating them. For example:\n *\n * src/\n * main/\n * java/ or kotlin/\n * my.package.name/\n * ui/\n * MainActivity.kt\n *\n * src/main/java can contain both .java and .kt sources, whilst src/main/kotlin only .kt\n *\n * @param appDir\n * @param packageName\n * @param activityName\n * @returns path to the Main Activity\n */\nexport function findActivitySourceFile(\n appDir: string,\n packageName: string,\n activityName: string,\n): string | undefined {\n const javaSrcDir = path.join(appDir, 'src', 'main', 'java');\n let possibleActivityPath;\n // if activity name starts with a dot, this means we need to concat packagename with it, otherwise\n // the package name is already specified in the activity name itself\n const packageNameParts = activityName.startsWith('.')\n ? packageName.split('.')\n : [];\n const activityNameParts = activityName.split('.');\n\n if (fs.existsSync(javaSrcDir)) {\n possibleActivityPath = findFile(\n path.join(javaSrcDir, ...packageNameParts, ...activityNameParts),\n ['.kt', '.java'],\n );\n }\n\n if (!possibleActivityPath || !fs.existsSync(possibleActivityPath)) {\n const kotlinSrcDir = path.join(appDir, 'src', 'main', 'kotlin');\n if (fs.existsSync(kotlinSrcDir)) {\n possibleActivityPath = findFile(\n path.join(kotlinSrcDir, ...packageNameParts, ...activityNameParts),\n ['.kt'],\n );\n }\n }\n return possibleActivityPath;\n}\n\n/**\n * Patches Main Activity with the test error code snippet by the specified path {@link activityFile}.\n * Finds activity's `onCreate` method, adds the snippet and necessary imports.\n *\n * ```kotlin\n * import something\n * import something.something\n * import io.sentry.Sentry <-- this is added by us\n *\n * override fun onCreate(savedInstanceState: Bundle?) {\n * super.onCreate(savedInstanceState)\n * // the snippet goes here <--\n * doSomething()\n * }\n * ```\n *\n * @param activityFile\n * @returns true if successfully patched, false otherwise\n */\nexport function patchMainActivity(activityFile: string | undefined): boolean {\n if (!activityFile || !fs.existsSync(activityFile)) {\n clack.log.warn('No main activity source file found in filesystem.');\n Sentry.captureException('No main activity source file');\n return false;\n }\n\n const activityContent = fs.readFileSync(activityFile, 'utf8');\n\n if (/import\\s+io\\.sentry\\.Sentry;?/i.test(activityContent)) {\n // sentry is already configured\n clack.log.success(\n chalk.greenBright(\n `${chalk.bold(\n 'Main Activity',\n )} is already patched with test error snippet.`,\n ),\n );\n return true;\n }\n\n const importIndex = getLastImportLineLocation(activityContent);\n\n let newActivityContent;\n if (activityFile.endsWith('.kt')) {\n newActivityContent =\n activityContent.slice(0, importIndex) +\n sentryImportKt +\n activityContent.slice(importIndex);\n } else {\n newActivityContent =\n activityContent.slice(0, importIndex) +\n sentryImport +\n activityContent.slice(importIndex);\n }\n\n const onCreateMatch = /super\\.onCreate\\(.*?\\);?/i.exec(newActivityContent);\n if (!onCreateMatch) {\n clack.log.warn('No onCreate method found in main activity.');\n Sentry.captureException('No onCreate method');\n return false;\n }\n\n const onCreateIndex = onCreateMatch.index + onCreateMatch[0].length;\n if (activityFile.endsWith('.kt')) {\n newActivityContent =\n newActivityContent.slice(0, onCreateIndex) +\n testErrorSnippetKt +\n newActivityContent.slice(onCreateIndex);\n } else {\n newActivityContent =\n newActivityContent.slice(0, onCreateIndex) +\n testErrorSnippet +\n newActivityContent.slice(onCreateIndex);\n }\n fs.writeFileSync(activityFile, newActivityContent, 'utf8');\n\n clack.log.success(\n chalk.greenBright(\n `Patched ${chalk.bold(\n 'Main Activity',\n )} with the Sentry test error snippet.`,\n ),\n );\n\n return true;\n}\n\n/**\n * Returns the string index of the last import statement in the given code file.\n * Works for both Java and Kotlin import statements.\n *\n * @param sourceCode\n * @returns the insert index, or 0 if none found.\n */\nexport function getLastImportLineLocation(sourceCode: string): number {\n const importRegex = /import(?:\\sstatic)?\\s+[\\w.*]+(?: as [\\w.]+)?;?/gim;\n\n let importsMatch = importRegex.exec(sourceCode);\n let importIndex = 0;\n while (importsMatch) {\n importIndex = importsMatch.index + importsMatch[0].length + 1;\n importsMatch = importRegex.exec(sourceCode);\n }\n return importIndex;\n}\n"]}
1
+ {"version":3,"file":"code-tools.js","sourceRoot":"","sources":["../../../src/android/code-tools.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as Sentry from '@sentry/node';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport {\n sentryImport,\n sentryImportKt,\n testErrorSnippet,\n testErrorSnippetKt,\n} from './templates';\nimport { findFile } from '../utils/ast-utils';\n\n/**\n * Looks in src/main/java or src/main/kotlin for the specified {@link packageName} and\n * {@link activityName} by concatenating them. For example:\n *\n * src/\n * main/\n * java/ or kotlin/\n * my.package.name/\n * ui/\n * MainActivity.kt\n *\n * src/main/java can contain both .java and .kt sources, whilst src/main/kotlin only .kt\n *\n * @param appDir\n * @param packageName\n * @param activityName\n * @returns path to the Main Activity\n */\nexport function findActivitySourceFile(\n appDir: string,\n packageName: string,\n activityName: string,\n): string | undefined {\n const javaSrcDir = path.join(appDir, 'src', 'main', 'java');\n let possibleActivityPath;\n // if activity name starts with a dot, this means we need to concat packagename with it, otherwise\n // the package name is already specified in the activity name itself\n const packageNameParts = activityName.startsWith('.')\n ? packageName.split('.')\n : [];\n const activityNameParts = activityName.split('.');\n\n if (fs.existsSync(javaSrcDir)) {\n possibleActivityPath = findFile(\n path.join(javaSrcDir, ...packageNameParts, ...activityNameParts),\n ['.kt', '.java'],\n );\n }\n\n if (!possibleActivityPath || !fs.existsSync(possibleActivityPath)) {\n const kotlinSrcDir = path.join(appDir, 'src', 'main', 'kotlin');\n if (fs.existsSync(kotlinSrcDir)) {\n possibleActivityPath = findFile(\n path.join(kotlinSrcDir, ...packageNameParts, ...activityNameParts),\n ['.kt'],\n );\n }\n }\n return possibleActivityPath;\n}\n\n/**\n * Patches Main Activity with the test error code snippet by the specified path {@link activityFile}.\n * Finds activity's `onCreate` method, adds the snippet and necessary imports.\n *\n * ```kotlin\n * import something\n * import something.something\n * import io.sentry.Sentry <-- this is added by us\n *\n * override fun onCreate(savedInstanceState: Bundle?) {\n * super.onCreate(savedInstanceState)\n * // the snippet goes here <--\n * doSomething()\n * }\n * ```\n *\n * @param activityFile\n * @returns true if successfully patched, false otherwise\n */\nexport function patchMainActivity(activityFile: string | undefined): boolean {\n if (!activityFile || !fs.existsSync(activityFile)) {\n clack.log.warn('No main activity source file found in filesystem.');\n Sentry.captureException('No main activity source file');\n return false;\n }\n\n const activityContent = fs.readFileSync(activityFile, 'utf8');\n\n if (/import\\s+io\\.sentry\\.Sentry;?/i.test(activityContent)) {\n // sentry is already configured\n clack.log.success(\n chalk.greenBright(\n `${chalk.bold(\n 'Main Activity',\n )} is already patched with test error snippet.`,\n ),\n );\n return true;\n }\n\n const importIndex = getLastImportLineLocation(activityContent);\n\n let newActivityContent;\n if (activityFile.endsWith('.kt')) {\n newActivityContent =\n activityContent.slice(0, importIndex) +\n sentryImportKt +\n activityContent.slice(importIndex);\n } else {\n newActivityContent =\n activityContent.slice(0, importIndex) +\n sentryImport +\n activityContent.slice(importIndex);\n }\n\n const onCreateMatch = /super\\.onCreate\\(.*?\\);?/i.exec(newActivityContent);\n if (!onCreateMatch) {\n clack.log.warn('No onCreate method found in main activity.');\n Sentry.captureException('No onCreate method');\n return false;\n }\n\n const onCreateIndex = onCreateMatch.index + onCreateMatch[0].length;\n if (activityFile.endsWith('.kt')) {\n newActivityContent =\n newActivityContent.slice(0, onCreateIndex) +\n testErrorSnippetKt +\n newActivityContent.slice(onCreateIndex);\n } else {\n newActivityContent =\n newActivityContent.slice(0, onCreateIndex) +\n testErrorSnippet +\n newActivityContent.slice(onCreateIndex);\n }\n fs.writeFileSync(activityFile, newActivityContent, 'utf8');\n\n clack.log.success(\n chalk.greenBright(\n `Patched ${chalk.bold(\n 'Main Activity',\n )} with the Sentry test error snippet.`,\n ),\n );\n\n return true;\n}\n\n/**\n * Returns the string index of the last import statement in the given code file.\n * Works for both Java and Kotlin import statements.\n *\n * @param sourceCode\n * @returns the insert index, or 0 if none found.\n */\nexport function getLastImportLineLocation(sourceCode: string): number {\n const importRegex = /import(?:\\sstatic)?\\s+[\\w.*]+(?: as [\\w.]+)?;?/gim;\n\n let importsMatch = importRegex.exec(sourceCode);\n let importIndex = 0;\n while (importsMatch) {\n importIndex = importsMatch.index + importsMatch[0].length + 1;\n importsMatch = importRegex.exec(sourceCode);\n }\n return importIndex;\n}\n"]}
@@ -29,11 +29,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.getNamespace = exports.addGradlePlugin = exports.selectAppFile = void 0;
30
30
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
31
31
  const fs = __importStar(require("fs"));
32
- const clack_utils_1 = require("../utils/clack-utils");
32
+ const clack_1 = require("../utils/clack");
33
33
  const templates_1 = require("./templates");
34
34
  const bash = __importStar(require("../utils/bash"));
35
35
  const Sentry = __importStar(require("@sentry/node"));
36
- // @ts-ignore - clack is ESM and TS complains about that. It works though
36
+ // @ts-expect-error - clack is ESM and TS complains about that. It works though
37
37
  const clack = __importStar(require("@clack/prompts"));
38
38
  const chalk_1 = __importDefault(require("chalk"));
39
39
  const release_registry_1 = require("../utils/release-registry");
@@ -63,7 +63,7 @@ async function selectAppFile(buildGradleFiles) {
63
63
  }
64
64
  if (appFiles.length === 0) {
65
65
  Sentry.setTag('custom-build-logic', true);
66
- const appFile = await (0, clack_utils_1.abortIfCancelled)(clack.text({
66
+ const appFile = await (0, clack_1.abortIfCancelled)(clack.text({
67
67
  message: `Unable to find your app's directory.
68
68
  Please enter the relative path to your app's build.gradle file from the root project`,
69
69
  placeholder: 'app/build.gradle.kts',
@@ -81,7 +81,7 @@ async function selectAppFile(buildGradleFiles) {
81
81
  }
82
82
  else {
83
83
  Sentry.setTag('multiple-projects', true);
84
- appFile = (await (0, clack_utils_1.askForItemSelection)(appFiles, 'Which project do you want to add Sentry to?')).value;
84
+ appFile = (await (0, clack_1.askForItemSelection)(appFiles, 'Which project do you want to add Sentry to?')).value;
85
85
  }
86
86
  Sentry.setTag('custom-build-logic', false);
87
87
  return appFile;