@sentry/wizard 3.11.0 → 3.13.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 (91) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/lib/Steps/ChooseIntegration.js +1 -0
  3. package/dist/lib/Steps/ChooseIntegration.js.map +1 -1
  4. package/dist/package.json +1 -1
  5. package/dist/src/android/android-wizard.js +14 -4
  6. package/dist/src/android/android-wizard.js.map +1 -1
  7. package/dist/src/android/code-tools.d.ts +8 -0
  8. package/dist/src/android/code-tools.js +20 -8
  9. package/dist/src/android/code-tools.js.map +1 -1
  10. package/dist/src/android/gradle.js +6 -1
  11. package/dist/src/android/gradle.js.map +1 -1
  12. package/dist/src/nextjs/nextjs-wizard.js +5 -2
  13. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  14. package/dist/src/nextjs/templates.d.ts +1 -1
  15. package/dist/src/nextjs/templates.js +2 -2
  16. package/dist/src/nextjs/templates.js.map +1 -1
  17. package/dist/src/remix/remix-wizard.js +8 -4
  18. package/dist/src/remix/remix-wizard.js.map +1 -1
  19. package/dist/src/remix/sdk-setup.d.ts +5 -1
  20. package/dist/src/remix/sdk-setup.js +3 -2
  21. package/dist/src/remix/sdk-setup.js.map +1 -1
  22. package/dist/src/sourcemaps/tools/sentry-cli.d.ts +9 -0
  23. package/dist/src/sourcemaps/tools/sentry-cli.js +26 -22
  24. package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
  25. package/dist/src/sourcemaps/tools/tsc.d.ts +6 -0
  26. package/dist/src/sourcemaps/tools/tsc.js +98 -17
  27. package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
  28. package/dist/src/sourcemaps/tools/vite.js +39 -124
  29. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  30. package/dist/src/sourcemaps/tools/webpack.d.ts +6 -1
  31. package/dist/src/sourcemaps/tools/webpack.js +280 -25
  32. package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
  33. package/dist/src/sveltekit/sdk-setup.js +123 -49
  34. package/dist/src/sveltekit/sdk-setup.js.map +1 -1
  35. package/dist/src/sveltekit/sveltekit-wizard.d.ts +1 -0
  36. package/dist/src/sveltekit/sveltekit-wizard.js +119 -44
  37. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  38. package/dist/src/sveltekit/utils.d.ts +2 -0
  39. package/dist/src/sveltekit/utils.js +48 -0
  40. package/dist/src/sveltekit/utils.js.map +1 -0
  41. package/dist/src/utils/ast-utils.d.ts +77 -3
  42. package/dist/src/utils/ast-utils.js +172 -6
  43. package/dist/src/utils/ast-utils.js.map +1 -1
  44. package/dist/src/utils/clack-utils.d.ts +85 -1
  45. package/dist/src/utils/clack-utils.js +214 -51
  46. package/dist/src/utils/clack-utils.js.map +1 -1
  47. package/dist/src/utils/package-manager.d.ts +5 -0
  48. package/dist/src/utils/package-manager.js +11 -7
  49. package/dist/src/utils/package-manager.js.map +1 -1
  50. package/dist/test/android/code-tools.test.d.ts +1 -0
  51. package/dist/test/android/code-tools.test.js +34 -0
  52. package/dist/test/android/code-tools.test.js.map +1 -0
  53. package/dist/test/sourcemaps/tools/sentry-cli.test.d.ts +1 -0
  54. package/dist/test/sourcemaps/tools/sentry-cli.test.js +112 -0
  55. package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -0
  56. package/dist/test/sourcemaps/tools/tsc.test.d.ts +1 -0
  57. package/dist/test/sourcemaps/tools/tsc.test.js +121 -0
  58. package/dist/test/sourcemaps/tools/tsc.test.js.map +1 -0
  59. package/dist/test/sourcemaps/tools/webpack.test.d.ts +1 -0
  60. package/dist/test/sourcemaps/tools/webpack.test.js +179 -0
  61. package/dist/test/sourcemaps/tools/webpack.test.js.map +1 -0
  62. package/dist/test/utils/ast-utils.test.js +181 -15
  63. package/dist/test/utils/ast-utils.test.js.map +1 -1
  64. package/dist/test/utils/clack-utils.test.d.ts +1 -0
  65. package/dist/test/utils/clack-utils.test.js +200 -0
  66. package/dist/test/utils/clack-utils.test.js.map +1 -0
  67. package/lib/Steps/ChooseIntegration.ts +1 -0
  68. package/package.json +1 -1
  69. package/src/android/android-wizard.ts +16 -5
  70. package/src/android/code-tools.ts +21 -7
  71. package/src/android/gradle.ts +6 -1
  72. package/src/nextjs/nextjs-wizard.ts +15 -3
  73. package/src/nextjs/templates.ts +3 -2
  74. package/src/remix/remix-wizard.ts +8 -11
  75. package/src/remix/sdk-setup.ts +8 -2
  76. package/src/sourcemaps/tools/sentry-cli.ts +16 -9
  77. package/src/sourcemaps/tools/tsc.ts +133 -28
  78. package/src/sourcemaps/tools/vite.ts +37 -127
  79. package/src/sourcemaps/tools/webpack.ts +343 -27
  80. package/src/sveltekit/sdk-setup.ts +115 -39
  81. package/src/sveltekit/sveltekit-wizard.ts +93 -25
  82. package/src/sveltekit/utils.ts +50 -0
  83. package/src/utils/ast-utils.ts +203 -7
  84. package/src/utils/clack-utils.ts +211 -44
  85. package/src/utils/package-manager.ts +12 -6
  86. package/test/android/code-tools.test.ts +49 -0
  87. package/test/sourcemaps/tools/sentry-cli.test.ts +51 -0
  88. package/test/sourcemaps/tools/tsc.test.ts +181 -0
  89. package/test/sourcemaps/tools/webpack.test.ts +303 -0
  90. package/test/utils/ast-utils.test.ts +240 -20
  91. package/test/utils/clack-utils.test.ts +142 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.13.0
4
+
5
+ - enh(android): Show link to issues page after setup is complete (#448)
6
+ - feat(remix): Pass `org`, `project`, `url` to `upload-sourcemaps` script (#434)
7
+ - feat(sourcemaps): Automatically enable source maps generation in `tsconfig.json` (#449)
8
+ - feat(sveltekit): Add telemetry collection (#455)
9
+ - fix(nextjs): Add selfhosted url in `next.config.js` (#438)
10
+ - fix(nextjs): Create necessary directories in app router (#439)
11
+ - fix(sourcemaps): Write package manager command instead of object to package.json (#453)
12
+ - ref(sveltekit): Check for minimum supported SvelteKit version (#456)
13
+
14
+ Work in this release contributed by @andreysam. Thank you for your contributions!
15
+
16
+ ## 3.12.0
17
+
18
+ - feat(sourcemaps): Automatically insert Sentry Webpack plugin (#432)
19
+ - fix(android): Add support for unusual import statements (#440)
20
+ - fix(wizard): Sort projects in project-selection step (#441)
21
+ - enh(android): Add more telemetry (#435)
22
+
3
23
  ## 3.11.0
4
24
 
5
25
  - feat(android): Add wizard support for Android (#389)
@@ -164,6 +164,7 @@ var ChooseIntegration = /** @class */ (function (_super) {
164
164
  message: 'What platform do you want to set up?',
165
165
  name: 'integration',
166
166
  type: 'list',
167
+ pageSize: 10,
167
168
  },
168
169
  ])];
169
170
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ChooseIntegration.js","sourceRoot":"","sources":["../../../lib/Steps/ChooseIntegration.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,qCAAkC;AAElC,0CAKsB;AACtB,uCAAsC;AACtC,kDAAiD;AACjD,oDAAmD;AACnD,wDAAuD;AACvD,0DAAyD;AACzD,gEAA+D;AAC/D,8CAA6C;AAC7C,8DAA6D;AAC7D,6DAAmE;AACnE,8CAA6C;AAC7C,kDAAiD;AACjD,6CAAwC;AAExC,IAAI,cAAc,GAAQ,EAAE,CAAC;AAE7B,IAAI;IACF,qCAAqC;IACrC,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAChD;AAAC,WAAM;IACN,cAAc,GAAG,OAAO,CAAC,UAAG,OAAO,CAAC,GAAG,EAAE,kBAAe,CAAC,CAAC;CAC3D;AAMD;IAAuC,qCAAQ;IAA/C;;IAoFA,CAAC;IAnFc,gCAAI,GAAjB,UAAkB,QAAiB;;;;;4BACP,qBAAM,IAAI,CAAC,8BAA8B,EAAE,EAAA;;wBAA/D,iBAAiB,GAAG,SAA2C;wBAEjE,WAAW,GAAG,IAAI,CAAC;wBACvB,QAAQ,iBAAiB,CAAC,WAAW,EAAE;4BACrC,KAAK,uBAAW,CAAC,OAAO;gCACtB,WAAW,GAAG,IAAI,iBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gCACtC,MAAM;4BACR,KAAK,uBAAW,CAAC,OAAO;gCACtB,WAAW,GAAG,IAAI,iBAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gCACnD,MAAM;4BACR,KAAK,uBAAW,CAAC,QAAQ;gCACvB,WAAW,GAAG,IAAI,mBAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gCACpD,MAAM;4BACR,KAAK,uBAAW,CAAC,MAAM;gCACrB,WAAW,GAAG,IAAI,uBAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gCACzC,MAAM;4BACR,KAAK,uBAAW,CAAC,KAAK;gCACpB,WAAW,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gCACpC,MAAM;4BACR,KAAK,uBAAW,CAAC,SAAS;gCACxB,WAAW,GAAG,IAAI,6BAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gCAC5C,MAAM;4BACR,KAAK,uBAAW,CAAC,UAAU;gCACzB,WAAW,GAAG,IAAI,+BAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gCAC7C,MAAM;4BACR,KAAK,uBAAW,CAAC,GAAG;gCAClB,WAAW,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gCACpC,MAAM;4BACR,KAAK,uBAAW,CAAC,WAAW,CAAC;4BAC7B;gCACE,WAAW,GAAG,IAAI,yBAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gCACvD,MAAM;yBACT;wBAED,sBAAO,EAAE,WAAW,aAAA,EAAE,EAAC;;;;KACxB;IAEM,mDAAuB,GAA9B;QACE,IAAI,IAAA,kCAAmB,EAAC,cAAc,EAAE,cAAc,CAAC,EAAE;YACvD,OAAO,uBAAW,CAAC,WAAW,CAAC;SAChC;QACD,IAAI,IAAA,kCAAmB,EAAC,SAAS,EAAE,cAAc,CAAC,EAAE;YAClD,OAAO,uBAAW,CAAC,OAAO,CAAC;SAC5B;QACD,IAAI,IAAA,kCAAmB,EAAC,UAAU,EAAE,cAAc,CAAC,EAAE;YACnD,OAAO,uBAAW,CAAC,QAAQ,CAAC;SAC7B;QACD,IAAI,IAAA,kCAAmB,EAAC,MAAM,EAAE,cAAc,CAAC,EAAE;YAC/C,OAAO,uBAAW,CAAC,MAAM,CAAC;SAC3B;QACD,IAAI,IAAA,kCAAmB,EAAC,WAAW,EAAE,cAAc,CAAC,EAAE;YACpD,OAAO,uBAAW,CAAC,KAAK,CAAC;SAC1B;QACD,IAAI,IAAA,kCAAmB,EAAC,eAAe,EAAE,cAAc,CAAC,EAAE;YACxD,OAAO,uBAAW,CAAC,SAAS,CAAC;SAC9B;QAED,OAAO;IACT,CAAC;IAEa,0DAA8B,GAA5C;;;;gBACE,sDAAsD;gBACtD,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBAC1B,sBAAO,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAC;iBAChD;qBAAM;oBACL,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;wBACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;qBAClD;oBAEK,wBAAwB,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAEhE,sBAAO,IAAA,iBAAM,EAAC;4BACZ;gCACE,OAAO,EAAE,IAAA,iCAAqB,GAAE;gCAChC,OAAO,EAAE,wBAAwB;gCACjC,OAAO,EAAE,sCAAsC;gCAC/C,IAAI,EAAE,aAAa;gCACnB,IAAI,EAAE,MAAM;6BACb;yBACF,CAAC,EAAC;iBACJ;;;;KACF;IACH,wBAAC;AAAD,CAAC,AApFD,CAAuC,mBAAQ,GAoF9C;AApFY,8CAAiB;AAsF9B;;;;GAIG;AACH,SAAS,WAAW,CAAC,IAAU;IAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,GAAG,uBAAW,CAAC;QACvB,IAAA,aAAG,EAAC,uCAAgC,IAAI,CAAC,GAAG,CAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;KACb;IAED,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;IACvB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;IAEnB,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import type { Answers } from 'inquirer';\nimport { prompt } from 'inquirer';\n\nimport {\n Args,\n DEFAULT_URL,\n getIntegrationChoices,\n Integration,\n} from '../Constants';\nimport { BaseStep } from './BaseStep';\nimport { Cordova } from './Integrations/Cordova';\nimport { Electron } from './Integrations/Electron';\nimport { NextJsShim } from './Integrations/NextJsShim';\nimport { ReactNative } from './Integrations/ReactNative';\nimport { SourceMapsShim } from './Integrations/SourceMapsShim';\nimport { Apple } from './Integrations/Apple';\nimport { SvelteKitShim } from './Integrations/SvelteKitShim';\nimport { hasPackageInstalled } from '../../src/utils/package-json';\nimport { Remix } from './Integrations/Remix';\nimport { Android } from './Integrations/Android';\nimport { dim } from '../Helper/Logging';\n\nlet projectPackage: any = {};\n\ntry {\n // If we run directly in setup-wizard\n projectPackage = require('../../package.json');\n} catch {\n projectPackage = require(`${process.cwd()}/package.json`);\n}\n\ntype IntegrationPromptAnswer = {\n integration: Integration;\n};\n\nexport class ChooseIntegration extends BaseStep {\n public async emit(_answers: Answers): Promise<Answers> {\n const integrationPrompt = await this._getIntegrationPromptSelection();\n\n let integration = null;\n switch (integrationPrompt.integration) {\n case Integration.android:\n integration = new Android(this._argv);\n break;\n case Integration.cordova:\n integration = new Cordova(sanitizeUrl(this._argv));\n break;\n case Integration.electron:\n integration = new Electron(sanitizeUrl(this._argv));\n break;\n case Integration.nextjs:\n integration = new NextJsShim(this._argv);\n break;\n case Integration.remix:\n integration = new Remix(this._argv);\n break;\n case Integration.sveltekit:\n integration = new SvelteKitShim(this._argv);\n break;\n case Integration.sourcemaps:\n integration = new SourceMapsShim(this._argv);\n break;\n case Integration.ios:\n integration = new Apple(this._argv);\n break;\n case Integration.reactNative:\n default:\n integration = new ReactNative(sanitizeUrl(this._argv));\n break;\n }\n\n return { integration };\n }\n\n public tryDetectingIntegration(): Integration | undefined {\n if (hasPackageInstalled('react-native', projectPackage)) {\n return Integration.reactNative;\n }\n if (hasPackageInstalled('cordova', projectPackage)) {\n return Integration.cordova;\n }\n if (hasPackageInstalled('electron', projectPackage)) {\n return Integration.electron;\n }\n if (hasPackageInstalled('next', projectPackage)) {\n return Integration.nextjs;\n }\n if (hasPackageInstalled('remix-run', projectPackage)) {\n return Integration.remix;\n }\n if (hasPackageInstalled('@sveltejs/kit', projectPackage)) {\n return Integration.sveltekit;\n }\n\n return;\n }\n\n private async _getIntegrationPromptSelection(): Promise<IntegrationPromptAnswer> {\n // If we receive project type as an arg we skip asking\n if (this._argv.integration) {\n return { integration: this._argv.integration };\n } else {\n if (this._argv.quiet) {\n throw new Error('You need to choose a platform');\n }\n\n const detectedDefaultSelection = this.tryDetectingIntegration();\n\n return prompt([\n {\n choices: getIntegrationChoices(),\n default: detectedDefaultSelection,\n message: 'What platform do you want to set up?',\n name: 'integration',\n type: 'list',\n },\n ]);\n }\n }\n}\n\n/**\n * For the `clack`-based wizard flows, which we only shim here, we don't set\n * a default url value. For backwards-compatibility with the other flows,\n * we fill it here and sanitize a user-enterd url.\n */\nfunction sanitizeUrl(argv: Args): Args {\n if (!argv.url) {\n argv.url = DEFAULT_URL;\n dim(`no URL provided, fallback to ${argv.url}`);\n return argv;\n }\n\n let baseUrl = argv.url;\n baseUrl += baseUrl.endsWith('/') ? '' : '/';\n baseUrl = baseUrl.replace(/:\\/(?!\\/)/g, '://');\n argv.url = baseUrl;\n\n return argv;\n}\n"]}
1
+ {"version":3,"file":"ChooseIntegration.js","sourceRoot":"","sources":["../../../lib/Steps/ChooseIntegration.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Answers } from 'inquirer';\nimport { prompt } from 'inquirer';\n\nimport {\n Args,\n DEFAULT_URL,\n getIntegrationChoices,\n Integration,\n} from '../Constants';\nimport { BaseStep } from './BaseStep';\nimport { Cordova } from './Integrations/Cordova';\nimport { Electron } from './Integrations/Electron';\nimport { NextJsShim } from './Integrations/NextJsShim';\nimport { ReactNative } from './Integrations/ReactNative';\nimport { SourceMapsShim } from './Integrations/SourceMapsShim';\nimport { Apple } from './Integrations/Apple';\nimport { SvelteKitShim } from './Integrations/SvelteKitShim';\nimport { hasPackageInstalled } from '../../src/utils/package-json';\nimport { Remix } from './Integrations/Remix';\nimport { Android } from './Integrations/Android';\nimport { dim } from '../Helper/Logging';\n\nlet projectPackage: any = {};\n\ntry {\n // If we run directly in setup-wizard\n projectPackage = require('../../package.json');\n} catch {\n projectPackage = require(`${process.cwd()}/package.json`);\n}\n\ntype IntegrationPromptAnswer = {\n integration: Integration;\n};\n\nexport class ChooseIntegration extends BaseStep {\n public async emit(_answers: Answers): Promise<Answers> {\n const integrationPrompt = await this._getIntegrationPromptSelection();\n\n let integration = null;\n switch (integrationPrompt.integration) {\n case Integration.android:\n integration = new Android(this._argv);\n break;\n case Integration.cordova:\n integration = new Cordova(sanitizeUrl(this._argv));\n break;\n case Integration.electron:\n integration = new Electron(sanitizeUrl(this._argv));\n break;\n case Integration.nextjs:\n integration = new NextJsShim(this._argv);\n break;\n case Integration.remix:\n integration = new Remix(this._argv);\n break;\n case Integration.sveltekit:\n integration = new SvelteKitShim(this._argv);\n break;\n case Integration.sourcemaps:\n integration = new SourceMapsShim(this._argv);\n break;\n case Integration.ios:\n integration = new Apple(this._argv);\n break;\n case Integration.reactNative:\n default:\n integration = new ReactNative(sanitizeUrl(this._argv));\n break;\n }\n\n return { integration };\n }\n\n public tryDetectingIntegration(): Integration | undefined {\n if (hasPackageInstalled('react-native', projectPackage)) {\n return Integration.reactNative;\n }\n if (hasPackageInstalled('cordova', projectPackage)) {\n return Integration.cordova;\n }\n if (hasPackageInstalled('electron', projectPackage)) {\n return Integration.electron;\n }\n if (hasPackageInstalled('next', projectPackage)) {\n return Integration.nextjs;\n }\n if (hasPackageInstalled('remix-run', projectPackage)) {\n return Integration.remix;\n }\n if (hasPackageInstalled('@sveltejs/kit', projectPackage)) {\n return Integration.sveltekit;\n }\n\n return;\n }\n\n private async _getIntegrationPromptSelection(): Promise<IntegrationPromptAnswer> {\n // If we receive project type as an arg we skip asking\n if (this._argv.integration) {\n return { integration: this._argv.integration };\n } else {\n if (this._argv.quiet) {\n throw new Error('You need to choose a platform');\n }\n\n const detectedDefaultSelection = this.tryDetectingIntegration();\n\n return prompt([\n {\n choices: getIntegrationChoices(),\n default: detectedDefaultSelection,\n message: 'What platform do you want to set up?',\n name: 'integration',\n type: 'list',\n pageSize: 10,\n },\n ]);\n }\n }\n}\n\n/**\n * For the `clack`-based wizard flows, which we only shim here, we don't set\n * a default url value. For backwards-compatibility with the other flows,\n * we fill it here and sanitize a user-enterd url.\n */\nfunction sanitizeUrl(argv: Args): Args {\n if (!argv.url) {\n argv.url = DEFAULT_URL;\n dim(`no URL provided, fallback to ${argv.url}`);\n return argv;\n }\n\n let baseUrl = argv.url;\n baseUrl += baseUrl.endsWith('/') ? '' : '/';\n baseUrl = baseUrl.replace(/:\\/(?!\\/)/g, '://');\n argv.url = baseUrl;\n\n return argv;\n}\n"]}
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/wizard",
3
- "version": "3.11.0",
3
+ "version": "3.13.0",
4
4
  "homepage": "https://github.com/getsentry/sentry-wizard",
5
5
  "repository": "https://github.com/getsentry/sentry-wizard",
6
6
  "description": "Sentry wizard helping you to configure your project",
@@ -68,6 +68,7 @@ var fs = __importStar(require("fs"));
68
68
  // @ts-ignore - clack is ESM and TS complains about that. It works though
69
69
  var clack = __importStar(require("@clack/prompts"));
70
70
  var path = __importStar(require("path"));
71
+ var Sentry = __importStar(require("@sentry/node"));
71
72
  var gradle = __importStar(require("./gradle"));
72
73
  var manifest = __importStar(require("./manifest"));
73
74
  var codetools = __importStar(require("./code-tools"));
@@ -104,7 +105,7 @@ function runAndroidWizard(options) {
104
105
  exports.runAndroidWizard = runAndroidWizard;
105
106
  function runAndroidWizardWithTelemetry(options) {
106
107
  return __awaiter(this, void 0, void 0, function () {
107
- var projectDir, buildGradleFiles, appFile, _a, selectedProject, authToken, pluginAdded, appDir, manifestFile, manifestUpdated, mainActivity, packageName, activityName, packageNameStable_1, activityFile_1, activityPatched;
108
+ var projectDir, buildGradleFiles, appFile, _a, selectedProject, selfHosted, sentryUrl, authToken, pluginAdded, appDir, manifestFile, manifestUpdated, mainActivity, packageName, activityName, packageNameStable_1, activityFile_1, activityPatched, issuesPageLink;
108
109
  return __generator(this, function (_b) {
109
110
  switch (_b.label) {
110
111
  case 0:
@@ -122,6 +123,7 @@ function runAndroidWizardWithTelemetry(options) {
122
123
  ]);
123
124
  if (!(!buildGradleFiles || buildGradleFiles.length === 0)) return [3 /*break*/, 3];
124
125
  clack.log.error('No Gradle project found. Please run this command from the root of your project.');
126
+ Sentry.captureException('No Gradle project found');
125
127
  return [4 /*yield*/, (0, clack_utils_1.abort)()];
126
128
  case 2:
127
129
  _b.sent();
@@ -133,7 +135,7 @@ function runAndroidWizardWithTelemetry(options) {
133
135
  appFile = _b.sent();
134
136
  return [4 /*yield*/, (0, clack_utils_1.getOrAskForProjectData)(options, 'android')];
135
137
  case 5:
136
- _a = _b.sent(), selectedProject = _a.selectedProject, authToken = _a.authToken;
138
+ _a = _b.sent(), selectedProject = _a.selectedProject, selfHosted = _a.selfHosted, sentryUrl = _a.sentryUrl, authToken = _a.authToken;
137
139
  // ======== STEP 1. Add Sentry Gradle Plugin to build.gradle(.kts) ============
138
140
  clack.log.step("Adding ".concat(chalk_1.default.bold('Sentry Gradle plugin'), " to your app's ").concat(chalk_1.default.cyan('build.gradle'), " file."));
139
141
  return [4 /*yield*/, (0, telemetry_1.traceStep)('Add Gradle Plugin', function () {
@@ -144,6 +146,7 @@ function runAndroidWizardWithTelemetry(options) {
144
146
  if (!pluginAdded) {
145
147
  clack.log.warn("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");
146
148
  }
149
+ Sentry.setTag('gradle-plugin-added', pluginAdded);
147
150
  // ======== STEP 2. Configure Sentry SDK via AndroidManifest ============
148
151
  clack.log.step("Configuring Sentry SDK via ".concat(chalk_1.default.cyan('AndroidManifest.xml')));
149
152
  appDir = path.dirname(appFile);
@@ -154,6 +157,7 @@ function runAndroidWizardWithTelemetry(options) {
154
157
  if (!manifestUpdated) {
155
158
  clack.log.warn("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");
156
159
  }
160
+ Sentry.setTag('android-manifest-updated', manifestUpdated);
157
161
  // ======== STEP 3. Patch Main Activity with a test error snippet ============
158
162
  clack.log.step("Patching ".concat(chalk_1.default.bold('Main Activity'), " with a test error snippet."));
159
163
  mainActivity = (0, telemetry_1.traceStep)('Find Main Activity', function () {
@@ -165,8 +169,11 @@ function runAndroidWizardWithTelemetry(options) {
165
169
  packageName = gradle.getNamespace(appFile);
166
170
  }
167
171
  activityName = mainActivity.activityName;
172
+ Sentry.setTag('has-activity-name', !!activityName);
173
+ Sentry.setTag('has-package-name', !!packageName);
168
174
  if (!activityName || !packageName) {
169
175
  clack.log.warn("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");
176
+ Sentry.captureException('Could not find Main Activity');
170
177
  }
171
178
  else {
172
179
  packageNameStable_1 = packageName;
@@ -179,6 +186,7 @@ function runAndroidWizardWithTelemetry(options) {
179
186
  if (!activityPatched) {
180
187
  clack.log.warn("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");
181
188
  }
189
+ Sentry.setTag('main-activity-patched', activityPatched);
182
190
  }
183
191
  // ======== STEP 4. Add sentry-cli config file ============
184
192
  clack.log.step("Configuring ".concat(chalk_1.default.bold('proguard mappings upload'), " via the ").concat(chalk_1.default.cyan('sentry.properties'), " file."));
@@ -187,8 +195,10 @@ function runAndroidWizardWithTelemetry(options) {
187
195
  })];
188
196
  case 7:
189
197
  _b.sent();
190
- // ======== OUTRO ========
191
- clack.outro("\n".concat(chalk_1.default.greenBright('Successfully installed the Sentry Android SDK!'), "\n\n").concat(chalk_1.default.cyan('You can validate your setup by launching your application and checking Sentry issues page afterwards'), "\n\nCheck out the SDK documentation for further configuration:\nhttps://docs.sentry.io/platforms/android/\n "));
198
+ issuesPageLink = selfHosted
199
+ ? "".concat(sentryUrl, "organizations/").concat(selectedProject.organization.slug, "/issues/?project=").concat(selectedProject.id)
200
+ : "https://".concat(selectedProject.organization.slug, ".sentry.io/issues/?project=").concat(selectedProject.id);
201
+ clack.outro("\n".concat(chalk_1.default.greenBright('Successfully installed the Sentry Android SDK!'), "\n\n").concat(chalk_1.default.cyan("You can validate your setup by launching your application and checking Sentry issues page afterwards\n".concat(issuesPageLink)), "\n\nCheck out the SDK documentation for further configuration:\nhttps://docs.sentry.io/platforms/android/\n "));
192
202
  return [2 /*return*/];
193
203
  }
194
204
  });
@@ -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 gradle from './gradle';\nimport * as manifest from './manifest';\nimport * as codetools from './code-tools';\nimport {\n CliSetupConfig,\n SENTRY_PROPERTIES_FILE,\n abort,\n addSentryCliConfig,\n confirmContinueEvenThoughNoGitRepo,\n getOrAskForProjectData,\n printWelcome,\n} from '../utils/clack-utils';\nimport { WizardOptions } from '../utils/types';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport chalk from 'chalk';\n\nconst proguardMappingCliSetupConfig: CliSetupConfig = {\n filename: SENTRY_PROPERTIES_FILE,\n name: 'proguard mappings',\n likelyAlreadyHasAuthToken(contents: string): boolean {\n return !!contents.match(/auth\\.token=./g);\n },\n tokenContent(authToken: string): string {\n return `auth.token=${authToken}`;\n },\n likelyAlreadyHasOrgAndProject(contents: string): boolean {\n return !!(\n contents.match(/defaults\\.org=./g) &&\n contents.match(/defaults\\.project=./g)\n );\n },\n orgAndProjContent(org: string, project: string): string {\n return `defaults.org=${org}\\ndefaults.project=${project}`;\n },\n};\n\nexport async function runAndroidWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'android',\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 confirmContinueEvenThoughNoGitRepo();\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 await abort();\n return;\n }\n\n const appFile = await traceStep('Select App File', () =>\n gradle.selectAppFile(buildGradleFiles),\n );\n\n const { selectedProject, authToken } = await getOrAskForProjectData(\n options,\n 'android',\n );\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\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\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 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 } 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 }\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 await traceStep('Add SentryCli Config', () =>\n addSentryCliConfig(authToken, proguardMappingCliSetupConfig),\n );\n\n // ======== OUTRO ========\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)}\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-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 SENTRY_PROPERTIES_FILE,\n abort,\n addSentryCliConfig,\n confirmContinueEvenThoughNoGitRepo,\n getOrAskForProjectData,\n printWelcome,\n} from '../utils/clack-utils';\nimport { WizardOptions } from '../utils/types';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport chalk from 'chalk';\n\nconst proguardMappingCliSetupConfig: CliSetupConfig = {\n filename: SENTRY_PROPERTIES_FILE,\n name: 'proguard mappings',\n likelyAlreadyHasAuthToken(contents: string): boolean {\n return !!contents.match(/auth\\.token=./g);\n },\n tokenContent(authToken: string): string {\n return `auth.token=${authToken}`;\n },\n likelyAlreadyHasOrgAndProject(contents: string): boolean {\n return !!(\n contents.match(/defaults\\.org=./g) &&\n contents.match(/defaults\\.project=./g)\n );\n },\n orgAndProjContent(org: string, project: string): string {\n return `defaults.org=${org}\\ndefaults.project=${project}`;\n },\n};\n\nexport async function runAndroidWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'android',\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 confirmContinueEvenThoughNoGitRepo();\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 await traceStep('Add SentryCli Config', () =>\n addSentryCliConfig(authToken, proguardMappingCliSetupConfig),\n );\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"]}
@@ -37,3 +37,11 @@ export declare function findActivitySourceFile(appDir: string, packageName: stri
37
37
  * @returns true if successfully patched, false otherwise
38
38
  */
39
39
  export declare function patchMainActivity(activityFile: string | undefined): boolean;
40
+ /**
41
+ * Returns the string index of the last import statement in the given code file.
42
+ * Works for both Java and Kotlin import statements.
43
+ *
44
+ * @param sourceCode
45
+ * @returns the insert index, or 0 if none found.
46
+ */
47
+ export declare function getLastImportLineLocation(sourceCode: string): number;
@@ -35,7 +35,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
35
35
  return (mod && mod.__esModule) ? mod : { "default": mod };
36
36
  };
37
37
  Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.patchMainActivity = exports.findActivitySourceFile = void 0;
38
+ exports.getLastImportLineLocation = exports.patchMainActivity = exports.findActivitySourceFile = void 0;
39
39
  var fs = __importStar(require("fs"));
40
40
  var path = __importStar(require("path"));
41
41
  var Sentry = __importStar(require("@sentry/node"));
@@ -114,13 +114,7 @@ function patchMainActivity(activityFile) {
114
114
  clack.log.success(chalk_1.default.greenBright("".concat(chalk_1.default.bold('Main Activity'), " is already patched with test error snippet.")));
115
115
  return true;
116
116
  }
117
- var importRegex = /import\s+[\w.]+;?/gim;
118
- var importsMatch = importRegex.exec(activityContent);
119
- var importIndex = 0;
120
- while (importsMatch) {
121
- importIndex = importsMatch.index + importsMatch[0].length + 1;
122
- importsMatch = importRegex.exec(activityContent);
123
- }
117
+ var importIndex = getLastImportLineLocation(activityContent);
124
118
  var newActivityContent;
125
119
  if (activityFile.endsWith('.kt')) {
126
120
  newActivityContent =
@@ -158,4 +152,22 @@ function patchMainActivity(activityFile) {
158
152
  return true;
159
153
  }
160
154
  exports.patchMainActivity = patchMainActivity;
155
+ /**
156
+ * Returns the string index of the last import statement in the given code file.
157
+ * Works for both Java and Kotlin import statements.
158
+ *
159
+ * @param sourceCode
160
+ * @returns the insert index, or 0 if none found.
161
+ */
162
+ function getLastImportLineLocation(sourceCode) {
163
+ var importRegex = /import(?:\sstatic)?\s+[\w.*]+(?: as [\w.]+)?;?/gim;
164
+ var importsMatch = importRegex.exec(sourceCode);
165
+ var importIndex = 0;
166
+ while (importsMatch) {
167
+ importIndex = importsMatch.index + importsMatch[0].length + 1;
168
+ importsMatch = importRegex.exec(sourceCode);
169
+ }
170
+ return importIndex;
171
+ }
172
+ exports.getLastImportLineLocation = getLastImportLineLocation;
161
173
  //# sourceMappingURL=code-tools.js.map
@@ -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 importRegex = /import\\s+[\\w.]+;?/gim;\n let importsMatch = importRegex.exec(activityContent);\n let importIndex = 0;\n while (importsMatch) {\n importIndex = importsMatch.index + importsMatch[0].length + 1;\n importsMatch = importRegex.exec(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"]}
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"]}
@@ -105,7 +105,12 @@ function selectAppFile(buildGradleFiles) {
105
105
  if (!(appFiles.length === 0)) return [3 /*break*/, 2];
106
106
  Sentry.setTag('custom-build-logic', true);
107
107
  return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(clack.text({
108
- message: "Unable to find your app's directory. \n Please enter the relative path to your app's build.gradle file from the root project (e.g. \"app/build.gradle.kts\")",
108
+ message: "Unable to find your app's directory. \n Please enter the relative path to your app's build.gradle file from the root project",
109
+ placeholder: 'app/build.gradle.kts',
110
+ validate: function (value) {
111
+ if (!value.includes('.gradle') || !fs.existsSync(value))
112
+ return "Not a valid gradle file.";
113
+ },
109
114
  }))];
110
115
  case 1:
111
116
  appFile_1 = _a.sent();
@@ -1 +1 @@
1
- {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../../src/android/gradle.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport * as fs from 'fs';\nimport { abortIfCancelled, askForItemSelection } from '../utils/clack-utils';\nimport {\n plugin,\n pluginKts,\n pluginsBlock,\n pluginsBlockKts,\n sourceContext,\n sourceContextKts,\n} from './templates';\nimport * as bash from '../utils/bash';\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 { fetchSdkVersion } from '../utils/release-registry';\n\n/**\n * A Gradle project may contain multiple modules, some of them may be applications, some of them may be libraries.\n * We are only interested in applications. For example:\n *\n * myproject/\n * app/\n * lib1/\n * lib2/\n * wearApp/\n *\n * In this case^ we are interested in app/ and wearApp/\n *\n * @param buildGradleFiles a list of build.gradle(.kts) paths that contain the com.android.application plugin\n * @returns the selected project for setting up\n */\nexport async function selectAppFile(\n buildGradleFiles: string[],\n): Promise<string> {\n const appFiles = [];\n for (let index = 0; index < buildGradleFiles.length; index++) {\n const file = buildGradleFiles[index];\n const text = fs.readFileSync(file, 'utf8');\n if (/\\(?[\"']com\\.android\\.application[\"']\\)?(?!.*\\S)/.test(text)) {\n appFiles.push(file);\n }\n }\n\n if (appFiles.length === 0) {\n Sentry.setTag('custom-build-logic', true);\n const appFile = await abortIfCancelled(\n clack.text({\n message: `Unable to find your app's directory. \n Please enter the relative path to your app's build.gradle file from the root project (e.g. \"app/build.gradle.kts\")`,\n }),\n );\n return appFile;\n }\n\n let appFile;\n if (appFiles.length === 1) {\n Sentry.setTag('multiple-projects', false);\n appFile = appFiles[0];\n } else {\n Sentry.setTag('multiple-projects', true);\n appFile = (\n await askForItemSelection(\n appFiles,\n 'Which project do you want to add Sentry to?',\n )\n ).value;\n }\n Sentry.setTag('custom-build-logic', false);\n return appFile;\n}\n\n/**\n * Patches a build.gradle(.kts) file that contains `com.android.application` plugin.\n * There are multiple cases we have to handle here:\n * - An existing `plugins {}` block:\n * - We just have to add our plugin inside the block\n * - No existing `plugins {}` block\n * - We have to add the entire block in the beginning of the file, BUT *after imports*\n *\n * For example (2nd case):\n *\n * ```\n * import net.ltgt.gradle.errorprone.errorprone\n *\n * // our plugins block goes here <--\n * plugins {\n * id(\"io.sentry.android.gradle\") version \"3.12.0\"\n * }\n *\n * apply(plugin = \"com.android.application\")\n *\n * android {\n * ...\n * }\n * ```\n *\n * In the end we run `./gradlew` to verify the config is build-able and not broken.\n *\n * @param appFile the selected Gradle application project\n * @returns true if successfully added Sentry Gradle config, false otherwise\n */\nexport async function addGradlePlugin(\n appFile: string,\n orgSlug: string,\n projectSlug: string,\n): Promise<boolean> {\n const gradleScript = fs.readFileSync(appFile, 'utf8');\n\n if (/\\(?[\"']io\\.sentry\\.android\\.gradle[\"']\\)?/.test(gradleScript)) {\n // sentry gradle plugin is already installed\n clack.log.success(\n chalk.greenBright(\n `${chalk.bold(\n 'Sentry Gradle plugin',\n )} is already added to the project.`,\n ),\n );\n maybeAddSourceContextConfig(appFile, gradleScript, orgSlug, projectSlug);\n return true;\n }\n\n const pluginVersion = await fetchSdkVersion(\n 'sentry.java.android.gradle-plugin',\n );\n const pluginsBlockMatch = /plugins\\s*{[^{}]*}/.exec(gradleScript);\n let newGradleScript;\n if (!pluginsBlockMatch) {\n // no \"plugins {}\" block, we can just add our own after imports\n const regex = /import\\s+[\\w.]+/gm;\n let importsMatch = regex.exec(gradleScript);\n let insertIndex = 0;\n while (importsMatch) {\n insertIndex = importsMatch.index + importsMatch[0].length + 1;\n importsMatch = regex.exec(gradleScript);\n }\n\n if (appFile.endsWith('.kts')) {\n newGradleScript =\n gradleScript.slice(0, insertIndex) +\n pluginsBlockKts(pluginVersion) +\n gradleScript.slice(insertIndex);\n } else {\n newGradleScript =\n gradleScript.slice(0, insertIndex) +\n pluginsBlock(pluginVersion) +\n gradleScript.slice(insertIndex);\n }\n } else {\n const insertIndex =\n pluginsBlockMatch.index + pluginsBlockMatch[0].length - 1;\n if (appFile.endsWith('.kts')) {\n newGradleScript =\n gradleScript.slice(0, insertIndex) +\n pluginKts(pluginVersion) +\n gradleScript.slice(insertIndex);\n } else {\n newGradleScript =\n gradleScript.slice(0, insertIndex) +\n plugin(pluginVersion) +\n gradleScript.slice(insertIndex);\n }\n }\n fs.writeFileSync(appFile, newGradleScript, 'utf8');\n\n maybeAddSourceContextConfig(appFile, newGradleScript, orgSlug, projectSlug);\n\n const buildSpinner = clack.spinner();\n\n buildSpinner.start(\n 'Running ./gradlew to verify changes (this may take a few minutes)...',\n );\n\n try {\n await bash.execute('./gradlew');\n buildSpinner.stop(\n chalk.greenBright(\n `${chalk.bold('Sentry Gradle plugin')} added to the project.`,\n ),\n );\n } catch (e) {\n buildSpinner.stop();\n Sentry.captureException('Gradle Sync failed');\n return false;\n }\n\n return true;\n}\n\n/**\n * Looks for the applications packageName (namespace) in the specified build.gradle(.kts) file.\n *\n * ```\n * android {\n * namespace 'my.package.name' <-- this is what we extract\n *\n * compileSdkVersion = 31\n * ...\n * }\n * ```\n * @param appFile\n * @returns the packageName(namespace) of the app if available\n */\nexport function getNamespace(appFile: string): string | undefined {\n const gradleScript = fs.readFileSync(appFile, 'utf8');\n\n const namespaceMatch = /namespace\\s*=?\\s*['\"]([^'\"]+)['\"]/i.exec(\n gradleScript,\n );\n if (!namespaceMatch || namespaceMatch.length <= 1) {\n clack.log.warn('Unable to determine application package name.');\n Sentry.captureException('No package name');\n return undefined;\n }\n\n const namespace = namespaceMatch[1];\n return namespace;\n}\n\n/**\n * Adds source context configuration to the gradleScript if `sentry {}` block is not yet configured,\n *\n * @param appFile\n * @param gradleScript\n */\nfunction maybeAddSourceContextConfig(\n appFile: string,\n gradleScript: string,\n orgSlug: string,\n projectSlug: string,\n) {\n if (!/sentry\\s*\\{[^}]*\\}/i.test(gradleScript)) {\n // if no sentry {} block is configured, we add our own with source context enabled\n if (appFile.endsWith('.kts')) {\n fs.appendFileSync(\n appFile,\n sourceContextKts(orgSlug, projectSlug),\n 'utf8',\n );\n } else {\n fs.appendFileSync(appFile, sourceContext(orgSlug, projectSlug), 'utf8');\n }\n }\n}\n"]}
1
+ {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../../src/android/gradle.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport * as fs from 'fs';\nimport { abortIfCancelled, askForItemSelection } from '../utils/clack-utils';\nimport {\n plugin,\n pluginKts,\n pluginsBlock,\n pluginsBlockKts,\n sourceContext,\n sourceContextKts,\n} from './templates';\nimport * as bash from '../utils/bash';\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 { fetchSdkVersion } from '../utils/release-registry';\n\n/**\n * A Gradle project may contain multiple modules, some of them may be applications, some of them may be libraries.\n * We are only interested in applications. For example:\n *\n * myproject/\n * app/\n * lib1/\n * lib2/\n * wearApp/\n *\n * In this case^ we are interested in app/ and wearApp/\n *\n * @param buildGradleFiles a list of build.gradle(.kts) paths that contain the com.android.application plugin\n * @returns the selected project for setting up\n */\nexport async function selectAppFile(\n buildGradleFiles: string[],\n): Promise<string> {\n const appFiles = [];\n for (let index = 0; index < buildGradleFiles.length; index++) {\n const file = buildGradleFiles[index];\n const text = fs.readFileSync(file, 'utf8');\n if (/\\(?[\"']com\\.android\\.application[\"']\\)?(?!.*\\S)/.test(text)) {\n appFiles.push(file);\n }\n }\n\n if (appFiles.length === 0) {\n Sentry.setTag('custom-build-logic', true);\n const appFile = await abortIfCancelled(\n clack.text({\n message: `Unable to find your app's directory. \n Please enter the relative path to your app's build.gradle file from the root project`,\n placeholder: 'app/build.gradle.kts',\n validate(value) {\n if (!value.includes('.gradle') || !fs.existsSync(value))\n return `Not a valid gradle file.`;\n },\n }),\n );\n return appFile;\n }\n\n let appFile;\n if (appFiles.length === 1) {\n Sentry.setTag('multiple-projects', false);\n appFile = appFiles[0];\n } else {\n Sentry.setTag('multiple-projects', true);\n appFile = (\n await askForItemSelection(\n appFiles,\n 'Which project do you want to add Sentry to?',\n )\n ).value;\n }\n Sentry.setTag('custom-build-logic', false);\n return appFile;\n}\n\n/**\n * Patches a build.gradle(.kts) file that contains `com.android.application` plugin.\n * There are multiple cases we have to handle here:\n * - An existing `plugins {}` block:\n * - We just have to add our plugin inside the block\n * - No existing `plugins {}` block\n * - We have to add the entire block in the beginning of the file, BUT *after imports*\n *\n * For example (2nd case):\n *\n * ```\n * import net.ltgt.gradle.errorprone.errorprone\n *\n * // our plugins block goes here <--\n * plugins {\n * id(\"io.sentry.android.gradle\") version \"3.12.0\"\n * }\n *\n * apply(plugin = \"com.android.application\")\n *\n * android {\n * ...\n * }\n * ```\n *\n * In the end we run `./gradlew` to verify the config is build-able and not broken.\n *\n * @param appFile the selected Gradle application project\n * @returns true if successfully added Sentry Gradle config, false otherwise\n */\nexport async function addGradlePlugin(\n appFile: string,\n orgSlug: string,\n projectSlug: string,\n): Promise<boolean> {\n const gradleScript = fs.readFileSync(appFile, 'utf8');\n\n if (/\\(?[\"']io\\.sentry\\.android\\.gradle[\"']\\)?/.test(gradleScript)) {\n // sentry gradle plugin is already installed\n clack.log.success(\n chalk.greenBright(\n `${chalk.bold(\n 'Sentry Gradle plugin',\n )} is already added to the project.`,\n ),\n );\n maybeAddSourceContextConfig(appFile, gradleScript, orgSlug, projectSlug);\n return true;\n }\n\n const pluginVersion = await fetchSdkVersion(\n 'sentry.java.android.gradle-plugin',\n );\n const pluginsBlockMatch = /plugins\\s*{[^{}]*}/.exec(gradleScript);\n let newGradleScript;\n if (!pluginsBlockMatch) {\n // no \"plugins {}\" block, we can just add our own after imports\n const regex = /import\\s+[\\w.]+/gm;\n let importsMatch = regex.exec(gradleScript);\n let insertIndex = 0;\n while (importsMatch) {\n insertIndex = importsMatch.index + importsMatch[0].length + 1;\n importsMatch = regex.exec(gradleScript);\n }\n\n if (appFile.endsWith('.kts')) {\n newGradleScript =\n gradleScript.slice(0, insertIndex) +\n pluginsBlockKts(pluginVersion) +\n gradleScript.slice(insertIndex);\n } else {\n newGradleScript =\n gradleScript.slice(0, insertIndex) +\n pluginsBlock(pluginVersion) +\n gradleScript.slice(insertIndex);\n }\n } else {\n const insertIndex =\n pluginsBlockMatch.index + pluginsBlockMatch[0].length - 1;\n if (appFile.endsWith('.kts')) {\n newGradleScript =\n gradleScript.slice(0, insertIndex) +\n pluginKts(pluginVersion) +\n gradleScript.slice(insertIndex);\n } else {\n newGradleScript =\n gradleScript.slice(0, insertIndex) +\n plugin(pluginVersion) +\n gradleScript.slice(insertIndex);\n }\n }\n fs.writeFileSync(appFile, newGradleScript, 'utf8');\n\n maybeAddSourceContextConfig(appFile, newGradleScript, orgSlug, projectSlug);\n\n const buildSpinner = clack.spinner();\n\n buildSpinner.start(\n 'Running ./gradlew to verify changes (this may take a few minutes)...',\n );\n\n try {\n await bash.execute('./gradlew');\n buildSpinner.stop(\n chalk.greenBright(\n `${chalk.bold('Sentry Gradle plugin')} added to the project.`,\n ),\n );\n } catch (e) {\n buildSpinner.stop();\n Sentry.captureException('Gradle Sync failed');\n return false;\n }\n\n return true;\n}\n\n/**\n * Looks for the applications packageName (namespace) in the specified build.gradle(.kts) file.\n *\n * ```\n * android {\n * namespace 'my.package.name' <-- this is what we extract\n *\n * compileSdkVersion = 31\n * ...\n * }\n * ```\n * @param appFile\n * @returns the packageName(namespace) of the app if available\n */\nexport function getNamespace(appFile: string): string | undefined {\n const gradleScript = fs.readFileSync(appFile, 'utf8');\n\n const namespaceMatch = /namespace\\s*=?\\s*['\"]([^'\"]+)['\"]/i.exec(\n gradleScript,\n );\n if (!namespaceMatch || namespaceMatch.length <= 1) {\n clack.log.warn('Unable to determine application package name.');\n Sentry.captureException('No package name');\n return undefined;\n }\n\n const namespace = namespaceMatch[1];\n return namespace;\n}\n\n/**\n * Adds source context configuration to the gradleScript if `sentry {}` block is not yet configured,\n *\n * @param appFile\n * @param gradleScript\n */\nfunction maybeAddSourceContextConfig(\n appFile: string,\n gradleScript: string,\n orgSlug: string,\n projectSlug: string,\n) {\n if (!/sentry\\s*\\{[^}]*\\}/i.test(gradleScript)) {\n // if no sentry {} block is configured, we add our own with source context enabled\n if (appFile.endsWith('.kts')) {\n fs.appendFileSync(\n appFile,\n sourceContextKts(orgSlug, projectSlug),\n 'utf8',\n );\n } else {\n fs.appendFileSync(appFile, sourceContext(orgSlug, projectSlug), 'utf8');\n }\n }\n}\n"]}
@@ -160,7 +160,7 @@ function runNextjsWizard(options) {
160
160
  _i++;
161
161
  return [3 /*break*/, 6];
162
162
  case 11:
163
- sentryWebpackOptionsTemplate = (0, templates_1.getNextjsWebpackPluginOptionsTemplate)(selectedProject.organization.slug, selectedProject.slug);
163
+ sentryWebpackOptionsTemplate = (0, templates_1.getNextjsWebpackPluginOptionsTemplate)(selectedProject.organization.slug, selectedProject.slug, selfHosted, sentryUrl);
164
164
  sentryBuildOptionsTemplate = (0, templates_1.getNextjsSentryBuildOptionsTemplate)();
165
165
  nextConfigJs = 'next.config.js';
166
166
  nextConfigMjs = 'next.config.mjs';
@@ -285,12 +285,15 @@ function runNextjsWizard(options) {
285
285
  url: sentryUrl,
286
286
  useClient: true,
287
287
  });
288
+ fs.mkdirSync(path.join.apply(path, __spreadArray(__spreadArray([process.cwd()], appLocation, false), ['sentry-example-page'], false)), {
289
+ recursive: true,
290
+ });
288
291
  return [4 /*yield*/, fs.promises.writeFile(path.join.apply(path, __spreadArray(__spreadArray([process.cwd()], appLocation, false), ['sentry-example-page',
289
292
  'page.jsx'], false)), examplePageContents, { encoding: 'utf8', flag: 'w' })];
290
293
  case 27:
291
294
  _d.sent();
292
295
  prompts_1.default.log.success("Created ".concat(chalk_1.default.bold(path.join.apply(path, __spreadArray(__spreadArray([], appLocation, false), ['sentry-example-page', 'page.jsx'], false))), "."));
293
- fs.mkdirSync(path.join.apply(path, __spreadArray(__spreadArray([process.cwd()], appLocation, false), ['api'], false)), {
296
+ fs.mkdirSync(path.join.apply(path, __spreadArray(__spreadArray([process.cwd()], appLocation, false), ['api', 'sentry-example-api'], false)), {
294
297
  recursive: true,
295
298
  });
296
299
  return [4 /*yield*/, fs.promises.writeFile(path.join.apply(path, __spreadArray(__spreadArray([process.cwd()], appLocation, false), ['api',
@@ -1 +1 @@
1
- {"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as fs from 'fs';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, parseModule } from 'magicast';\nimport * as path from 'path';\n\nimport {\n abort,\n abortIfCancelled,\n addSentryCliConfig,\n confirmContinueEvenThoughNoGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { WizardOptions } from '../utils/types';\nimport {\n getNextjsConfigCjsAppendix,\n getNextjsConfigCjsTemplate,\n getNextjsConfigEsmCopyPasteSnippet,\n getNextjsSentryBuildOptionsTemplate,\n getNextjsWebpackPluginOptionsTemplate,\n getSentryConfigContents,\n getSentryExampleApiRoute,\n getSentryExampleAppDirApiRoute,\n getSentryExamplePageContents,\n} from './templates';\n\n// eslint-disable-next-line complexity\nexport async function runNextjsWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Next.js Wizard',\n promoCode: options.promoCode,\n });\n\n await confirmContinueEvenThoughNoGitRepo();\n\n const packageJson = await getPackageDotJson();\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const { selectedProject, authToken, selfHosted, sentryUrl } =\n await getOrAskForProjectData(options, 'javascript-nextjs');\n\n await installPackage({\n packageName: '@sentry/nextjs',\n alreadyInstalled: !!packageJson?.dependencies?.['@sentry/nextjs'],\n });\n\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'client', 'edge'] as const;\n\n for (const configVariant of configVariants) {\n const jsConfig = `sentry.${configVariant}.config.js`;\n const tsConfig = `sentry.${configVariant}.config.ts`;\n\n const jsConfigExists = fs.existsSync(path.join(process.cwd(), jsConfig));\n const tsConfigExists = fs.existsSync(path.join(process.cwd(), tsConfig));\n\n let shouldWriteFile = true;\n\n if (jsConfigExists || tsConfigExists) {\n const existingConfigs = [];\n\n if (jsConfigExists) {\n existingConfigs.push(jsConfig);\n }\n\n if (tsConfigExists) {\n existingConfigs.push(tsConfig);\n }\n\n const overwriteExistingConfigs = await abortIfCancelled(\n clack.confirm({\n message: `Found existing Sentry ${configVariant} config (${existingConfigs.join(\n ', ',\n )}). Overwrite ${existingConfigs.length > 1 ? 'them' : 'it'}?`,\n }),\n );\n\n shouldWriteFile = overwriteExistingConfigs;\n\n if (overwriteExistingConfigs) {\n if (jsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), jsConfig));\n clack.log.warn(`Removed existing ${chalk.bold(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.bold(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryConfigContents(\n selectedProject.keys[0].dsn.public,\n configVariant,\n ),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created fresh ${chalk.bold(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n }\n }\n\n const sentryWebpackOptionsTemplate = getNextjsWebpackPluginOptionsTemplate(\n selectedProject.organization.slug,\n selectedProject.slug,\n );\n const sentryBuildOptionsTemplate = getNextjsSentryBuildOptionsTemplate();\n\n const nextConfigJs = 'next.config.js';\n const nextConfigMjs = 'next.config.mjs';\n\n const nextConfigJsExists = fs.existsSync(\n path.join(process.cwd(), nextConfigJs),\n );\n const nextConfigMjsExists = fs.existsSync(\n path.join(process.cwd(), nextConfigMjs),\n );\n\n if (!nextConfigJsExists && !nextConfigMjsExists) {\n await fs.promises.writeFile(\n path.join(process.cwd(), nextConfigJs),\n getNextjsConfigCjsTemplate(\n sentryWebpackOptionsTemplate,\n sentryBuildOptionsTemplate,\n ),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.bold('next.config.js')} with Sentry configuration.`,\n );\n }\n\n if (nextConfigJsExists) {\n const nextConfgiJsContent = fs.readFileSync(\n path.join(process.cwd(), nextConfigJs),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfgiJsContent.includes('@sentry/nextjs') &&\n nextConfgiJsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.bold(\n nextConfigJs,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n if (shouldInject) {\n await fs.promises.appendFile(\n path.join(process.cwd(), nextConfigJs),\n getNextjsConfigCjsAppendix(\n sentryWebpackOptionsTemplate,\n sentryBuildOptionsTemplate,\n ),\n 'utf8',\n );\n\n clack.log.success(\n `Added Sentry configuration to ${chalk.bold(nextConfigJs)}. ${chalk.dim(\n '(you probably want to clean this up a bit!)',\n )}`,\n );\n }\n }\n\n if (nextConfigMjsExists) {\n const nextConfgiMjsContent = fs.readFileSync(\n path.join(process.cwd(), nextConfigMjs),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfgiMjsContent.includes('@sentry/nextjs') &&\n nextConfgiMjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.bold(\n nextConfigMjs,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n try {\n if (shouldInject) {\n const mod = parseModule(nextConfgiMjsContent);\n mod.imports.$add({\n from: '@sentry/nextjs',\n imported: 'withSentryConfig',\n local: 'withSentryConfig',\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n const expressionToWrap = generateCode(mod.exports.default.$ast).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.default = builders.raw(`withSentryConfig(\n ${expressionToWrap},\n ${sentryWebpackOptionsTemplate},\n ${sentryBuildOptionsTemplate}\n)`);\n const newCode = mod.generate().code;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), nextConfigMjs),\n newCode,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added Sentry configuration to ${chalk.bold(\n nextConfigMjs,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n }\n } catch {\n clack.log.warn(\n chalk.yellow(\n `Something went wrong writing to ${chalk.bold(nextConfigMjs)}`,\n ),\n );\n clack.log.info(\n `Please put the following code snippet into ${chalk.bold(\n nextConfigMjs,\n )}: ${chalk.dim('You probably have to clean it up a bit.')}\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getNextjsConfigEsmCopyPasteSnippet(\n sentryWebpackOptionsTemplate,\n sentryBuildOptionsTemplate,\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Are you done putting the snippet above into ${chalk.bold(\n nextConfigMjs,\n )}?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n }\n\n const srcDir = path.join(process.cwd(), 'src');\n const maybePagesDirPath = path.join(process.cwd(), 'pages');\n const maybeSrcPagesDirPath = path.join(srcDir, 'pages');\n const maybeAppDirPath = path.join(process.cwd(), 'app');\n const maybeSrcAppDirPath = path.join(srcDir, 'app');\n\n let pagesLocation =\n fs.existsSync(maybePagesDirPath) &&\n fs.lstatSync(maybePagesDirPath).isDirectory()\n ? ['pages']\n : fs.existsSync(maybeSrcPagesDirPath) &&\n fs.lstatSync(maybeSrcPagesDirPath).isDirectory()\n ? ['src', 'pages']\n : undefined;\n\n const appLocation =\n fs.existsSync(maybeAppDirPath) &&\n fs.lstatSync(maybeAppDirPath).isDirectory()\n ? ['app']\n : fs.existsSync(maybeSrcAppDirPath) &&\n fs.lstatSync(maybeSrcAppDirPath).isDirectory()\n ? ['src', 'app']\n : undefined;\n\n if (!pagesLocation && !appLocation) {\n pagesLocation =\n fs.existsSync(srcDir) && fs.lstatSync(srcDir).isDirectory()\n ? ['src', 'pages']\n : ['pages'];\n fs.mkdirSync(path.join(process.cwd(), ...pagesLocation), {\n recursive: true,\n });\n }\n\n if (appLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\n useClient: true,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appLocation,\n 'sentry-example-page',\n 'page.jsx',\n ),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.bold(\n path.join(...appLocation, 'sentry-example-page', 'page.jsx'),\n )}.`,\n );\n\n fs.mkdirSync(path.join(process.cwd(), ...appLocation, 'api'), {\n recursive: true,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appLocation,\n 'api',\n 'sentry-example-api',\n 'route.js',\n ),\n getSentryExampleAppDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.bold(\n path.join(...appLocation, 'api', 'sentry-example-api', 'route.js'),\n )}.`,\n );\n } else if (pagesLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\n useClient: false,\n });\n\n await fs.promises.writeFile(\n path.join(process.cwd(), ...pagesLocation, 'sentry-example-page.jsx'),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.bold(\n path.join(...pagesLocation, 'sentry-example-page.js'),\n )}.`,\n );\n\n fs.mkdirSync(path.join(process.cwd(), ...pagesLocation, 'api'), {\n recursive: true,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesLocation,\n 'api',\n 'sentry-example-api.js',\n ),\n getSentryExampleApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.bold(\n path.join(...pagesLocation, 'api', 'sentry-example-api.js'),\n )}.`,\n );\n }\n\n await addSentryCliConfig(authToken);\n\n const mightBeUsingVercel = fs.existsSync(\n path.join(process.cwd(), 'vercel.json'),\n );\n\n clack.outro(\n `${chalk.green('Everything is set up!')}\n\n ${chalk.cyan(\n 'You can validate your setup by starting your dev environment (`next dev`) and visiting \"/sentry-example-page\".',\n )}\n${\n mightBeUsingVercel\n ? `\n ▲ It seems like you're using Vercel. We recommend using the Sentry Vercel integration: https://vercel.com/integrations/sentry\n`\n : ''\n}\n ${chalk.dim(\n 'If you encounter any issues, let us know here: https://github.com/getsentry/sentry-javascript/issues',\n )}`,\n );\n}\n"]}
1
+ {"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as fs from 'fs';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, parseModule } from 'magicast';\nimport * as path from 'path';\n\nimport {\n abort,\n abortIfCancelled,\n addSentryCliConfig,\n confirmContinueEvenThoughNoGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { WizardOptions } from '../utils/types';\nimport {\n getNextjsConfigCjsAppendix,\n getNextjsConfigCjsTemplate,\n getNextjsConfigEsmCopyPasteSnippet,\n getNextjsSentryBuildOptionsTemplate,\n getNextjsWebpackPluginOptionsTemplate,\n getSentryConfigContents,\n getSentryExampleApiRoute,\n getSentryExampleAppDirApiRoute,\n getSentryExamplePageContents,\n} from './templates';\n\n// eslint-disable-next-line complexity\nexport async function runNextjsWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Next.js Wizard',\n promoCode: options.promoCode,\n });\n\n await confirmContinueEvenThoughNoGitRepo();\n\n const packageJson = await getPackageDotJson();\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const { selectedProject, authToken, selfHosted, sentryUrl } =\n await getOrAskForProjectData(options, 'javascript-nextjs');\n\n await installPackage({\n packageName: '@sentry/nextjs',\n alreadyInstalled: !!packageJson?.dependencies?.['@sentry/nextjs'],\n });\n\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'client', 'edge'] as const;\n\n for (const configVariant of configVariants) {\n const jsConfig = `sentry.${configVariant}.config.js`;\n const tsConfig = `sentry.${configVariant}.config.ts`;\n\n const jsConfigExists = fs.existsSync(path.join(process.cwd(), jsConfig));\n const tsConfigExists = fs.existsSync(path.join(process.cwd(), tsConfig));\n\n let shouldWriteFile = true;\n\n if (jsConfigExists || tsConfigExists) {\n const existingConfigs = [];\n\n if (jsConfigExists) {\n existingConfigs.push(jsConfig);\n }\n\n if (tsConfigExists) {\n existingConfigs.push(tsConfig);\n }\n\n const overwriteExistingConfigs = await abortIfCancelled(\n clack.confirm({\n message: `Found existing Sentry ${configVariant} config (${existingConfigs.join(\n ', ',\n )}). Overwrite ${existingConfigs.length > 1 ? 'them' : 'it'}?`,\n }),\n );\n\n shouldWriteFile = overwriteExistingConfigs;\n\n if (overwriteExistingConfigs) {\n if (jsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), jsConfig));\n clack.log.warn(`Removed existing ${chalk.bold(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.bold(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryConfigContents(\n selectedProject.keys[0].dsn.public,\n configVariant,\n ),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created fresh ${chalk.bold(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n }\n }\n\n const sentryWebpackOptionsTemplate = getNextjsWebpackPluginOptionsTemplate(\n selectedProject.organization.slug,\n selectedProject.slug,\n selfHosted,\n sentryUrl,\n );\n const sentryBuildOptionsTemplate = getNextjsSentryBuildOptionsTemplate();\n\n const nextConfigJs = 'next.config.js';\n const nextConfigMjs = 'next.config.mjs';\n\n const nextConfigJsExists = fs.existsSync(\n path.join(process.cwd(), nextConfigJs),\n );\n const nextConfigMjsExists = fs.existsSync(\n path.join(process.cwd(), nextConfigMjs),\n );\n\n if (!nextConfigJsExists && !nextConfigMjsExists) {\n await fs.promises.writeFile(\n path.join(process.cwd(), nextConfigJs),\n getNextjsConfigCjsTemplate(\n sentryWebpackOptionsTemplate,\n sentryBuildOptionsTemplate,\n ),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.bold('next.config.js')} with Sentry configuration.`,\n );\n }\n\n if (nextConfigJsExists) {\n const nextConfgiJsContent = fs.readFileSync(\n path.join(process.cwd(), nextConfigJs),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfgiJsContent.includes('@sentry/nextjs') &&\n nextConfgiJsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.bold(\n nextConfigJs,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n if (shouldInject) {\n await fs.promises.appendFile(\n path.join(process.cwd(), nextConfigJs),\n getNextjsConfigCjsAppendix(\n sentryWebpackOptionsTemplate,\n sentryBuildOptionsTemplate,\n ),\n 'utf8',\n );\n\n clack.log.success(\n `Added Sentry configuration to ${chalk.bold(nextConfigJs)}. ${chalk.dim(\n '(you probably want to clean this up a bit!)',\n )}`,\n );\n }\n }\n\n if (nextConfigMjsExists) {\n const nextConfgiMjsContent = fs.readFileSync(\n path.join(process.cwd(), nextConfigMjs),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfgiMjsContent.includes('@sentry/nextjs') &&\n nextConfgiMjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.bold(\n nextConfigMjs,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n try {\n if (shouldInject) {\n const mod = parseModule(nextConfgiMjsContent);\n mod.imports.$add({\n from: '@sentry/nextjs',\n imported: 'withSentryConfig',\n local: 'withSentryConfig',\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n const expressionToWrap = generateCode(mod.exports.default.$ast).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.default = builders.raw(`withSentryConfig(\n ${expressionToWrap},\n ${sentryWebpackOptionsTemplate},\n ${sentryBuildOptionsTemplate}\n)`);\n const newCode = mod.generate().code;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), nextConfigMjs),\n newCode,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added Sentry configuration to ${chalk.bold(\n nextConfigMjs,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n }\n } catch {\n clack.log.warn(\n chalk.yellow(\n `Something went wrong writing to ${chalk.bold(nextConfigMjs)}`,\n ),\n );\n clack.log.info(\n `Please put the following code snippet into ${chalk.bold(\n nextConfigMjs,\n )}: ${chalk.dim('You probably have to clean it up a bit.')}\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getNextjsConfigEsmCopyPasteSnippet(\n sentryWebpackOptionsTemplate,\n sentryBuildOptionsTemplate,\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Are you done putting the snippet above into ${chalk.bold(\n nextConfigMjs,\n )}?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n }\n\n const srcDir = path.join(process.cwd(), 'src');\n const maybePagesDirPath = path.join(process.cwd(), 'pages');\n const maybeSrcPagesDirPath = path.join(srcDir, 'pages');\n const maybeAppDirPath = path.join(process.cwd(), 'app');\n const maybeSrcAppDirPath = path.join(srcDir, 'app');\n\n let pagesLocation =\n fs.existsSync(maybePagesDirPath) &&\n fs.lstatSync(maybePagesDirPath).isDirectory()\n ? ['pages']\n : fs.existsSync(maybeSrcPagesDirPath) &&\n fs.lstatSync(maybeSrcPagesDirPath).isDirectory()\n ? ['src', 'pages']\n : undefined;\n\n const appLocation =\n fs.existsSync(maybeAppDirPath) &&\n fs.lstatSync(maybeAppDirPath).isDirectory()\n ? ['app']\n : fs.existsSync(maybeSrcAppDirPath) &&\n fs.lstatSync(maybeSrcAppDirPath).isDirectory()\n ? ['src', 'app']\n : undefined;\n\n if (!pagesLocation && !appLocation) {\n pagesLocation =\n fs.existsSync(srcDir) && fs.lstatSync(srcDir).isDirectory()\n ? ['src', 'pages']\n : ['pages'];\n fs.mkdirSync(path.join(process.cwd(), ...pagesLocation), {\n recursive: true,\n });\n }\n\n if (appLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\n useClient: true,\n });\n\n fs.mkdirSync(\n path.join(process.cwd(), ...appLocation, 'sentry-example-page'),\n {\n recursive: true,\n },\n );\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appLocation,\n 'sentry-example-page',\n 'page.jsx',\n ),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.bold(\n path.join(...appLocation, 'sentry-example-page', 'page.jsx'),\n )}.`,\n );\n\n fs.mkdirSync(\n path.join(process.cwd(), ...appLocation, 'api', 'sentry-example-api'),\n {\n recursive: true,\n },\n );\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appLocation,\n 'api',\n 'sentry-example-api',\n 'route.js',\n ),\n getSentryExampleAppDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.bold(\n path.join(...appLocation, 'api', 'sentry-example-api', 'route.js'),\n )}.`,\n );\n } else if (pagesLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\n useClient: false,\n });\n\n await fs.promises.writeFile(\n path.join(process.cwd(), ...pagesLocation, 'sentry-example-page.jsx'),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.bold(\n path.join(...pagesLocation, 'sentry-example-page.js'),\n )}.`,\n );\n\n fs.mkdirSync(path.join(process.cwd(), ...pagesLocation, 'api'), {\n recursive: true,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesLocation,\n 'api',\n 'sentry-example-api.js',\n ),\n getSentryExampleApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.bold(\n path.join(...pagesLocation, 'api', 'sentry-example-api.js'),\n )}.`,\n );\n }\n\n await addSentryCliConfig(authToken);\n\n const mightBeUsingVercel = fs.existsSync(\n path.join(process.cwd(), 'vercel.json'),\n );\n\n clack.outro(\n `${chalk.green('Everything is set up!')}\n\n ${chalk.cyan(\n 'You can validate your setup by starting your dev environment (`next dev`) and visiting \"/sentry-example-page\".',\n )}\n${\n mightBeUsingVercel\n ? `\n ▲ It seems like you're using Vercel. We recommend using the Sentry Vercel integration: https://vercel.com/integrations/sentry\n`\n : ''\n}\n ${chalk.dim(\n 'If you encounter any issues, let us know here: https://github.com/getsentry/sentry-javascript/issues',\n )}`,\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- export declare function getNextjsWebpackPluginOptionsTemplate(orgSlug: string, projectSlug: string): string;
1
+ export declare function getNextjsWebpackPluginOptionsTemplate(orgSlug: string, projectSlug: string, selfHosted: boolean, url: string): string;
2
2
  export declare function getNextjsSentryBuildOptionsTemplate(): string;
3
3
  export declare function getNextjsConfigCjsTemplate(sentryWebpackPluginOptionsTemplate: string, sentryBuildOptionsTemplate: string): string;
4
4
  export declare function getNextjsConfigCjsAppendix(sentryWebpackPluginOptionsTemplate: string, sentryBuildOptionsTemplate: string): string;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getSentryExampleAppDirApiRoute = exports.getSentryExampleApiRoute = exports.getSentryExamplePageContents = exports.getSentryConfigContents = exports.getNextjsConfigEsmCopyPasteSnippet = exports.getNextjsConfigCjsAppendix = exports.getNextjsConfigCjsTemplate = exports.getNextjsSentryBuildOptionsTemplate = exports.getNextjsWebpackPluginOptionsTemplate = void 0;
4
- function getNextjsWebpackPluginOptionsTemplate(orgSlug, projectSlug) {
5
- return "{\n // For all available options, see:\n // https://github.com/getsentry/sentry-webpack-plugin#options\n\n // Suppresses source map uploading logs during build\n silent: true,\n\n org: \"".concat(orgSlug, "\",\n project: \"").concat(projectSlug, "\",\n }");
4
+ function getNextjsWebpackPluginOptionsTemplate(orgSlug, projectSlug, selfHosted, url) {
5
+ return "{\n // For all available options, see:\n // https://github.com/getsentry/sentry-webpack-plugin#options\n\n // Suppresses source map uploading logs during build\n silent: true,\n org: \"".concat(orgSlug, "\",\n project: \"").concat(projectSlug, "\",").concat(selfHosted ? "\n url: \"".concat(url, "\"") : '', "\n }");
6
6
  }
7
7
  exports.getNextjsWebpackPluginOptionsTemplate = getNextjsWebpackPluginOptionsTemplate;
8
8
  function getNextjsSentryBuildOptionsTemplate() {