@sentry/wizard 4.6.0 → 4.8.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 (218) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +19 -19
  3. package/dist/bin.js +9 -0
  4. package/dist/bin.js.map +1 -1
  5. package/dist/e2e-tests/tests/angular-17.test.d.ts +1 -0
  6. package/dist/e2e-tests/tests/angular-17.test.js +196 -0
  7. package/dist/e2e-tests/tests/angular-17.test.js.map +1 -0
  8. package/dist/e2e-tests/tests/angular-19.test.d.ts +1 -0
  9. package/dist/e2e-tests/tests/angular-19.test.js +194 -0
  10. package/dist/e2e-tests/tests/angular-19.test.js.map +1 -0
  11. package/dist/e2e-tests/tests/expo.test.d.ts +1 -0
  12. package/dist/e2e-tests/tests/expo.test.js +95 -0
  13. package/dist/e2e-tests/tests/expo.test.js.map +1 -0
  14. package/dist/e2e-tests/tests/flutter.test.js +16 -16
  15. package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
  16. package/dist/e2e-tests/tests/help-message.test.d.ts +1 -0
  17. package/dist/e2e-tests/tests/help-message.test.js +56 -0
  18. package/dist/e2e-tests/tests/help-message.test.js.map +1 -0
  19. package/dist/e2e-tests/tests/nextjs-14.test.js +15 -15
  20. package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
  21. package/dist/e2e-tests/tests/nextjs-15.test.js +15 -15
  22. package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
  23. package/dist/e2e-tests/tests/nuxt-3.test.js +13 -12
  24. package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
  25. package/dist/e2e-tests/tests/nuxt-4.test.js +13 -12
  26. package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
  27. package/dist/e2e-tests/tests/react-native.test.d.ts +1 -0
  28. package/dist/e2e-tests/tests/react-native.test.js +97 -0
  29. package/dist/e2e-tests/tests/react-native.test.js.map +1 -0
  30. package/dist/e2e-tests/tests/remix.test.js +24 -24
  31. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  32. package/dist/e2e-tests/tests/sveltekit.test.js +22 -22
  33. package/dist/e2e-tests/tests/sveltekit.test.js.map +1 -1
  34. package/dist/e2e-tests/utils/index.d.ts +7 -0
  35. package/dist/e2e-tests/utils/index.js +33 -12
  36. package/dist/e2e-tests/utils/index.js.map +1 -1
  37. package/dist/lib/Constants.d.ts +6 -1
  38. package/dist/lib/Constants.js +3 -0
  39. package/dist/lib/Constants.js.map +1 -1
  40. package/dist/lib/Helper/Logging.d.ts +1 -1
  41. package/dist/lib/Helper/Logging.js.map +1 -1
  42. package/dist/lib/Helper/__tests__/File.js +9 -9
  43. package/dist/lib/Helper/__tests__/File.js.map +1 -1
  44. package/dist/lib/Helper/__tests__/MergeConfig.js +17 -17
  45. package/dist/lib/Helper/__tests__/MergeConfig.js.map +1 -1
  46. package/dist/lib/Helper/__tests__/SentryCli.js +23 -22
  47. package/dist/lib/Helper/__tests__/SentryCli.js.map +1 -1
  48. package/dist/lib/Setup.d.ts +2 -1
  49. package/dist/lib/Setup.js +12 -2
  50. package/dist/lib/Setup.js.map +1 -1
  51. package/dist/lib/Steps/BaseStep.d.ts +1 -1
  52. package/dist/lib/Steps/BaseStep.js.map +1 -1
  53. package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
  54. package/dist/lib/Steps/Welcome.js +5 -0
  55. package/dist/lib/Steps/Welcome.js.map +1 -1
  56. package/dist/lib/__tests__/Env.js +4 -3
  57. package/dist/lib/__tests__/Env.js.map +1 -1
  58. package/dist/src/angular/angular-wizard.d.ts +3 -0
  59. package/dist/src/angular/angular-wizard.js +186 -0
  60. package/dist/src/angular/angular-wizard.js.map +1 -0
  61. package/dist/src/angular/codemods/app-config.d.ts +3 -0
  62. package/dist/src/angular/codemods/app-config.js +211 -0
  63. package/dist/src/angular/codemods/app-config.js.map +1 -0
  64. package/dist/src/angular/codemods/main.d.ts +20 -0
  65. package/dist/src/angular/codemods/main.js +62 -0
  66. package/dist/src/angular/codemods/main.js.map +1 -0
  67. package/dist/src/angular/codemods/sourcemaps.d.ts +21 -0
  68. package/dist/src/angular/codemods/sourcemaps.js +94 -0
  69. package/dist/src/angular/codemods/sourcemaps.js.map +1 -0
  70. package/dist/src/angular/example-component.d.ts +8 -0
  71. package/dist/src/angular/example-component.js +286 -0
  72. package/dist/src/angular/example-component.js.map +1 -0
  73. package/dist/src/angular/sdk-setup.d.ts +6 -0
  74. package/dist/src/angular/sdk-setup.js +99 -0
  75. package/dist/src/angular/sdk-setup.js.map +1 -0
  76. package/dist/src/apple/apple-wizard.js +24 -64
  77. package/dist/src/apple/apple-wizard.js.map +1 -1
  78. package/dist/src/apple/configure-package-manager.d.ts +5 -0
  79. package/dist/src/apple/configure-package-manager.js +68 -0
  80. package/dist/src/apple/configure-package-manager.js.map +1 -0
  81. package/dist/src/apple/configure-sentry-cli.d.ts +4 -0
  82. package/dist/src/apple/configure-sentry-cli.js +47 -0
  83. package/dist/src/apple/configure-sentry-cli.js.map +1 -0
  84. package/dist/src/apple/configure-xcode-project.d.ts +8 -0
  85. package/dist/src/apple/configure-xcode-project.js +11 -0
  86. package/dist/src/apple/configure-xcode-project.js.map +1 -0
  87. package/dist/src/apple/inject-code-snippet.d.ts +6 -0
  88. package/dist/src/apple/inject-code-snippet.js +54 -0
  89. package/dist/src/apple/inject-code-snippet.js.map +1 -0
  90. package/dist/src/apple/templates.js +11 -7
  91. package/dist/src/apple/templates.js.map +1 -1
  92. package/dist/src/apple/xcode-manager.js +3 -6
  93. package/dist/src/apple/xcode-manager.js.map +1 -1
  94. package/dist/src/flutter/flutter-wizard.js +10 -2
  95. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  96. package/dist/src/nextjs/nextjs-wizard.js +26 -12
  97. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  98. package/dist/src/nextjs/templates.js +59 -8
  99. package/dist/src/nextjs/templates.js.map +1 -1
  100. package/dist/src/nuxt/templates.js +30 -0
  101. package/dist/src/nuxt/templates.js.map +1 -1
  102. package/dist/src/react-native/expo-metro.js +4 -1
  103. package/dist/src/react-native/expo-metro.js.map +1 -1
  104. package/dist/src/react-native/expo.js +5 -1
  105. package/dist/src/react-native/expo.js.map +1 -1
  106. package/dist/src/react-native/javascript.d.ts +6 -4
  107. package/dist/src/react-native/javascript.js +33 -10
  108. package/dist/src/react-native/javascript.js.map +1 -1
  109. package/dist/src/react-native/metro.js +8 -2
  110. package/dist/src/react-native/metro.js.map +1 -1
  111. package/dist/src/react-native/react-native-wizard.d.ts +4 -0
  112. package/dist/src/react-native/react-native-wizard.js +30 -5
  113. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  114. package/dist/src/react-native/xcode.d.ts +7 -3
  115. package/dist/src/react-native/xcode.js +68 -20
  116. package/dist/src/react-native/xcode.js.map +1 -1
  117. package/dist/src/remix/sdk-example.js +30 -1
  118. package/dist/src/remix/sdk-example.js.map +1 -1
  119. package/dist/src/remix/sdk-setup.js +11 -5
  120. package/dist/src/remix/sdk-setup.js.map +1 -1
  121. package/dist/src/run.d.ts +1 -1
  122. package/dist/src/run.js +7 -2
  123. package/dist/src/run.js.map +1 -1
  124. package/dist/src/sourcemaps/sourcemaps-wizard.d.ts +1 -1
  125. package/dist/src/sourcemaps/sourcemaps-wizard.js +35 -20
  126. package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
  127. package/dist/src/sourcemaps/tools/angular.d.ts +1 -0
  128. package/dist/src/sourcemaps/tools/angular.js +7 -7
  129. package/dist/src/sourcemaps/tools/angular.js.map +1 -1
  130. package/dist/src/sourcemaps/tools/sentry-cli.d.ts +5 -1
  131. package/dist/src/sourcemaps/tools/sentry-cli.js +6 -3
  132. package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
  133. package/dist/src/sourcemaps/tools/tsc.js +5 -1
  134. package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
  135. package/dist/src/sourcemaps/tools/vite.js +4 -1
  136. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  137. package/dist/src/sourcemaps/tools/webpack.js +4 -1
  138. package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
  139. package/dist/src/sveltekit/sdk-example.js +1 -1
  140. package/dist/src/sveltekit/sdk-example.js.map +1 -1
  141. package/dist/src/sveltekit/sveltekit-wizard.js +2 -2
  142. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  143. package/dist/src/sveltekit/templates.js +28 -1
  144. package/dist/src/sveltekit/templates.js.map +1 -1
  145. package/dist/src/utils/clack/index.d.ts +11 -3
  146. package/dist/src/utils/clack/index.js +12 -4
  147. package/dist/src/utils/clack/index.js.map +1 -1
  148. package/dist/src/utils/package-manager.d.ts +2 -0
  149. package/dist/src/utils/package-manager.js +55 -5
  150. package/dist/src/utils/package-manager.js.map +1 -1
  151. package/dist/src/version.d.ts +1 -1
  152. package/dist/src/version.js +1 -1
  153. package/dist/src/version.js.map +1 -1
  154. package/dist/test/android/code-tools.test.js +13 -12
  155. package/dist/test/android/code-tools.test.js.map +1 -1
  156. package/dist/test/angular/angular-wizard.test.d.ts +1 -0
  157. package/dist/test/angular/angular-wizard.test.js +27 -0
  158. package/dist/test/angular/angular-wizard.test.js.map +1 -0
  159. package/dist/test/angular/codemods/sourcemaps.test.d.ts +1 -0
  160. package/dist/test/angular/codemods/sourcemaps.test.js +237 -0
  161. package/dist/test/angular/codemods/sourcemaps.test.js.map +1 -0
  162. package/dist/test/angular/example-component.test.d.ts +1 -0
  163. package/dist/test/angular/example-component.test.js +105 -0
  164. package/dist/test/angular/example-component.test.js.map +1 -0
  165. package/dist/test/apple/cocoapod.test.js +77 -72
  166. package/dist/test/apple/cocoapod.test.js.map +1 -1
  167. package/dist/test/apple/code-tools.test.js +173 -166
  168. package/dist/test/apple/code-tools.test.js.map +1 -1
  169. package/dist/test/apple/fastfile.test.js +86 -83
  170. package/dist/test/apple/fastfile.test.js.map +1 -1
  171. package/dist/test/apple/templates.test.js +32 -27
  172. package/dist/test/apple/templates.test.js.map +1 -1
  173. package/dist/test/apple/xcode-manager.test.js +182 -183
  174. package/dist/test/apple/xcode-manager.test.js.map +1 -1
  175. package/dist/test/flutter/code-tools.test.js +29 -28
  176. package/dist/test/flutter/code-tools.test.js.map +1 -1
  177. package/dist/test/flutter/templates.test.js +15 -14
  178. package/dist/test/flutter/templates.test.js.map +1 -1
  179. package/dist/test/nextjs/templates.test.js +43 -36
  180. package/dist/test/nextjs/templates.test.js.map +1 -1
  181. package/dist/test/nuxt/templates.test.js +25 -24
  182. package/dist/test/nuxt/templates.test.js.map +1 -1
  183. package/dist/test/react-native/expo-metro.test.js +11 -10
  184. package/dist/test/react-native/expo-metro.test.js.map +1 -1
  185. package/dist/test/react-native/expo.test.js +11 -10
  186. package/dist/test/react-native/expo.test.js.map +1 -1
  187. package/dist/test/react-native/gradle.test.js +27 -26
  188. package/dist/test/react-native/gradle.test.js.map +1 -1
  189. package/dist/test/react-native/javascript.test.js +108 -58
  190. package/dist/test/react-native/javascript.test.js.map +1 -1
  191. package/dist/test/react-native/metro.test.js +178 -64
  192. package/dist/test/react-native/metro.test.js.map +1 -1
  193. package/dist/test/react-native/xcode.test.js +138 -37
  194. package/dist/test/react-native/xcode.test.js.map +1 -1
  195. package/dist/test/remix/client-entry.test.js +18 -17
  196. package/dist/test/remix/client-entry.test.js.map +1 -1
  197. package/dist/test/remix/server-instrumentation.test.js +6 -5
  198. package/dist/test/remix/server-instrumentation.test.js.map +1 -1
  199. package/dist/test/sourcemaps/tools/sentry-cli.test.js +20 -20
  200. package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -1
  201. package/dist/test/sourcemaps/tools/tsc.test.js +13 -14
  202. package/dist/test/sourcemaps/tools/tsc.test.js.map +1 -1
  203. package/dist/test/sourcemaps/tools/vite.test.js +13 -14
  204. package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
  205. package/dist/test/sourcemaps/tools/webpack.test.js +19 -20
  206. package/dist/test/sourcemaps/tools/webpack.test.js.map +1 -1
  207. package/dist/test/sveltekit/templates.test.js +13 -12
  208. package/dist/test/sveltekit/templates.test.js.map +1 -1
  209. package/dist/test/utils/ast-utils.test.js +45 -44
  210. package/dist/test/utils/ast-utils.test.js.map +1 -1
  211. package/dist/test/utils/clack/index.test.js +140 -144
  212. package/dist/test/utils/clack/index.test.js.map +1 -1
  213. package/dist/test/utils/package-manager.test.js +8 -7
  214. package/dist/test/utils/package-manager.test.js.map +1 -1
  215. package/package.json +10 -38
  216. package/dist/e2e-tests/jest.config.d.ts +0 -17
  217. package/dist/e2e-tests/jest.config.js +0 -23
  218. package/dist/e2e-tests/jest.config.js.map +0 -1
@@ -323,15 +323,22 @@ async function createOrMergeNextJsFiles(selectedProject, selfHosted, sentryUrl,
323
323
  : path.join(process.cwd(), 'src', newInstrumentationFileName);
324
324
  const successfullyCreated = await (0, clack_1.createNewConfigFile)(newInstrumentationHookPath, (0, templates_1.getInstrumentationHookContent)(newInstrumentationHookLocation));
325
325
  if (!successfullyCreated) {
326
- await (0, clack_1.showCopyPasteInstructions)(newInstrumentationFileName, (0, templates_1.getInstrumentationHookCopyPasteSnippet)(newInstrumentationHookLocation), "create the file if it doesn't already exist");
326
+ await (0, clack_1.showCopyPasteInstructions)({
327
+ filename: newInstrumentationFileName,
328
+ codeSnippet: (0, templates_1.getInstrumentationHookCopyPasteSnippet)(newInstrumentationHookLocation),
329
+ hint: "create the file if it doesn't already exist",
330
+ });
327
331
  }
328
332
  }
329
333
  else {
330
- await (0, clack_1.showCopyPasteInstructions)(srcInstrumentationTsExists || instrumentationTsExists
331
- ? 'instrumentation.ts'
332
- : srcInstrumentationJsExists || instrumentationJsExists
333
- ? 'instrumentation.js'
334
- : newInstrumentationFileName, (0, templates_1.getInstrumentationHookCopyPasteSnippet)(instrumentationHookLocation));
334
+ await (0, clack_1.showCopyPasteInstructions)({
335
+ filename: srcInstrumentationTsExists || instrumentationTsExists
336
+ ? 'instrumentation.ts'
337
+ : srcInstrumentationJsExists || instrumentationJsExists
338
+ ? 'instrumentation.js'
339
+ : newInstrumentationFileName,
340
+ codeSnippet: (0, templates_1.getInstrumentationHookCopyPasteSnippet)(instrumentationHookLocation),
341
+ });
335
342
  }
336
343
  });
337
344
  await (0, telemetry_1.traceStep)('setup-instrumentation-client-hook', async () => {
@@ -384,15 +391,22 @@ async function createOrMergeNextJsFiles(selectedProject, selfHosted, sentryUrl,
384
391
  : path.join(process.cwd(), 'src', newInstrumentationClientFileName);
385
392
  const successfullyCreated = await (0, clack_1.createNewConfigFile)(newInstrumentationClientHookPath, (0, templates_1.getInstrumentationClientFileContents)(selectedProject.keys[0].dsn.public, selectedFeatures));
386
393
  if (!successfullyCreated) {
387
- await (0, clack_1.showCopyPasteInstructions)(newInstrumentationClientFileName, (0, templates_1.getInstrumentationClientHookCopyPasteSnippet)(selectedProject.keys[0].dsn.public, selectedFeatures), "create the file if it doesn't already exist");
394
+ await (0, clack_1.showCopyPasteInstructions)({
395
+ filename: newInstrumentationClientFileName,
396
+ codeSnippet: (0, templates_1.getInstrumentationClientHookCopyPasteSnippet)(selectedProject.keys[0].dsn.public, selectedFeatures),
397
+ hint: "create the file if it doesn't already exist",
398
+ });
388
399
  }
389
400
  }
390
401
  else {
391
- await (0, clack_1.showCopyPasteInstructions)(srcInstrumentationClientTsExists || instrumentationClientTsExists
392
- ? 'instrumentation-client.ts'
393
- : srcInstrumentationClientJsExists || instrumentationClientJsExists
394
- ? 'instrumentation-client.js'
395
- : newInstrumentationClientFileName, (0, templates_1.getInstrumentationClientHookCopyPasteSnippet)(selectedProject.keys[0].dsn.public, selectedFeatures));
402
+ await (0, clack_1.showCopyPasteInstructions)({
403
+ filename: srcInstrumentationClientTsExists || instrumentationClientTsExists
404
+ ? 'instrumentation-client.ts'
405
+ : srcInstrumentationClientJsExists || instrumentationClientJsExists
406
+ ? 'instrumentation-client.js'
407
+ : newInstrumentationClientFileName,
408
+ codeSnippet: (0, templates_1.getInstrumentationClientHookCopyPasteSnippet)(selectedProject.keys[0].dsn.public, selectedFeatures),
409
+ });
396
410
  }
397
411
  });
398
412
  await (0, telemetry_1.traceStep)('setup-next-config', async () => {
@@ -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-expect-error - 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-expect-error - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, parseModule } from 'magicast';\nimport * as path from 'path';\n\nimport * as Sentry from '@sentry/node';\n\nimport { setupCI } from '../sourcemaps/sourcemaps-wizard';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n abort,\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n createNewConfigFile,\n ensurePackageIsInstalled,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n runPrettierIfInstalled,\n showCopyPasteInstructions,\n} from '../utils/clack';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport type { SentryProjectData, WizardOptions } from '../utils/types';\nimport {\n getFullUnderscoreErrorCopyPasteSnippet,\n getGlobalErrorCopyPasteSnippet,\n getInstrumentationHookContent,\n getInstrumentationHookCopyPasteSnippet,\n getNextjsConfigCjsAppendix,\n getNextjsConfigCjsTemplate,\n getNextjsConfigEsmCopyPasteSnippet,\n getNextjsConfigMjsTemplate,\n getRootLayout,\n getSentryServersideConfigContents,\n getInstrumentationClientFileContents,\n getSentryDefaultGlobalErrorPage,\n getSentryDefaultUnderscoreErrorPage,\n getSentryExampleAppDirApiRoute,\n getSentryExamplePageContents,\n getSentryExamplePagesDirApiRoute,\n getSimpleUnderscoreErrorCopyPasteSnippet,\n getWithSentryConfigOptionsTemplate,\n getInstrumentationClientHookCopyPasteSnippet,\n} from './templates';\nimport { getNextJsVersionBucket } from './utils';\n\nexport function runNextjsWizard(options: WizardOptions) {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'nextjs',\n wizardOptions: options,\n },\n () => runNextjsWizardWithTelemetry(options),\n );\n}\n\nexport async function runNextjsWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry Next.js Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n const typeScriptDetected = isUsingTypeScript();\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n Sentry.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n const { selectedProject, authToken, selfHosted, sentryUrl } =\n await getOrAskForProjectData(options, 'javascript-nextjs');\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/nextjs',\n packageJson,\n );\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n const { packageManager: packageManagerFromInstallStep } =\n await installPackage({\n packageName: '@sentry/nextjs@latest',\n packageNameDisplayLabel: '@sentry/nextjs',\n alreadyInstalled: !!packageJson?.dependencies?.['@sentry/nextjs'],\n forceInstall,\n });\n\n await traceStep('configure-sdk', async () => {\n const tunnelRoute = await askShouldSetTunnelRoute();\n\n await createOrMergeNextJsFiles(selectedProject, selfHosted, sentryUrl, {\n tunnelRoute,\n });\n });\n\n await traceStep('create-underscoreerror-page', async () => {\n const srcDir = path.join(process.cwd(), 'src');\n const maybePagesDirPath = path.join(process.cwd(), 'pages');\n const maybeSrcPagesDirPath = path.join(srcDir, 'pages');\n\n const 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 if (!pagesLocation) {\n return;\n }\n\n const underscoreErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...pagesLocation, '_error.tsx'),\n )\n ? '_error.tsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.ts'))\n ? '_error.ts'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.jsx'))\n ? '_error.jsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.js'))\n ? '_error.js'\n : undefined;\n\n if (!underscoreErrorPageFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), ...pagesLocation, '_error.jsx'),\n getSentryDefaultUnderscoreErrorPage(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(path.join(...pagesLocation, '_error.jsx'))}.`,\n );\n } else if (\n fs\n .readFileSync(\n path.join(process.cwd(), ...pagesLocation, underscoreErrorPageFile),\n 'utf8',\n )\n .includes('getInitialProps')\n ) {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease put the following function call in the ${chalk.bold(\n 'getInitialProps',\n )}\\nmethod of your custom error page at ${chalk.bold(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(getSimpleUnderscoreErrorCopyPasteSnippet());\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you modify your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n } else {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getFullUnderscoreErrorCopyPasteSnippet(\n underscoreErrorPageFile === '_error.ts' ||\n underscoreErrorPageFile === '_error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you add the code to your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\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 await traceStep('create-global-error-page', async () => {\n const maybeAppDirPath = path.join(process.cwd(), 'app');\n const maybeSrcAppDirPath = path.join(process.cwd(), 'src', 'app');\n\n const appDirLocation =\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 (!appDirLocation) {\n return;\n }\n\n const globalErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.tsx'),\n )\n ? 'global-error.tsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.ts'),\n )\n ? 'global-error.ts'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.jsx'),\n )\n ? 'global-error.jsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.js'),\n )\n ? 'global-error.js'\n : undefined;\n\n if (!globalErrorPageFile) {\n const newGlobalErrorFileName = `global-error.${\n typeScriptDetected ? 'tsx' : 'jsx'\n }`;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), ...appDirLocation, newGlobalErrorFileName),\n getSentryDefaultGlobalErrorPage(typeScriptDetected),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appDirLocation, newGlobalErrorFileName),\n )}.`,\n );\n } else {\n clack.log.info(\n `It seems like you already have a custom error page for your app directory.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )}:\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getGlobalErrorCopyPasteSnippet(\n globalErrorPageFile === 'global-error.ts' ||\n globalErrorPageFile === 'global-error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you add the code to your ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )} file as described above?`,\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 shouldCreateExamplePage = await askShouldCreateExamplePage();\n if (shouldCreateExamplePage) {\n await traceStep('create-example-page', async () =>\n createExamplePage(selfHosted, selectedProject, sentryUrl),\n );\n }\n\n await addDotEnvSentryBuildPluginFile(authToken);\n\n const isLikelyUsingTurbopack = await checkIfLikelyIsUsingTurbopack();\n if (isLikelyUsingTurbopack || isLikelyUsingTurbopack === null) {\n await abortIfCancelled(\n clack.select({\n message: `Warning: The Sentry SDK is only compatible with Turbopack on Next.js version 15.3.0 (or 15.3.0-canary.8) or later. ${chalk.bold(\n `If you are using Turbopack with an older Next.js version, temporarily remove \\`--turbo\\` or \\`--turbopack\\` from your dev command until you have verified the SDK is working as expected. Note that the SDK will continue to work for non-Turbopack production builds.`,\n )}`,\n options: [\n {\n label: 'I understand.',\n hint: 'press enter',\n value: true,\n },\n ],\n initialValue: true,\n }),\n );\n }\n\n const mightBeUsingVercel = fs.existsSync(\n path.join(process.cwd(), 'vercel.json'),\n );\n\n if (mightBeUsingVercel && !options.comingFrom) {\n clack.log.info(\n \"▲ It seems like you're using Vercel. We recommend using the Sentry Vercel \\\n integration to set up an auth token for Vercel deployments: https://vercel.com/integrations/sentry\",\n );\n } else {\n await setupCI('nextjs', authToken, options.comingFrom);\n }\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager());\n await runPrettierIfInstalled({\n cwd: undefined,\n });\n\n clack.outro(`\n${chalk.green('Successfully installed the Sentry Next.js SDK!')} ${\n shouldCreateExamplePage\n ? `\\n\\nYou can validate your setup by (re)starting your dev environment (e.g. ${chalk.cyan(\n `${packageManagerForOutro.runScriptCommand} dev`,\n )}) and visiting ${chalk.cyan('\"/sentry-example-page\"')}`\n : ''\n }${\n shouldCreateExamplePage && isLikelyUsingTurbopack\n ? `\\nDon't forget to remove \\`--turbo\\` or \\`--turbopack\\` from your dev command until you have verified the SDK is working. You can safely add it back afterwards.`\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\ntype SDKConfigOptions = {\n tunnelRoute: boolean;\n};\n\nasync function createOrMergeNextJsFiles(\n selectedProject: SentryProjectData,\n selfHosted: boolean,\n sentryUrl: string,\n sdkConfigOptions: SDKConfigOptions,\n) {\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'edge'] as const;\n\n for (const configVariant of configVariants) {\n await traceStep(`create-sentry-${configVariant}-config`, async () => {\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 Sentry.setTag(\n `overwrite-${configVariant}-config`,\n overwriteExistingConfigs,\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.cyan(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryServersideConfigContents(\n selectedProject.keys[0].dsn.public,\n configVariant,\n selectedFeatures,\n ),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created fresh ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n Sentry.setTag(`created-${configVariant}-config`, true);\n }\n });\n }\n\n await traceStep('setup-instrumentation-hook', async () => {\n const hasRootAppDirectory = hasDirectoryPathFromRoot('app');\n const hasRootPagesDirectory = hasDirectoryPathFromRoot('pages');\n const hasSrcDirectory = hasDirectoryPathFromRoot('src');\n\n let instrumentationHookLocation: 'src' | 'root' | 'does-not-exist';\n\n const instrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.ts'),\n );\n const instrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.js'),\n );\n const srcInstrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.ts'),\n );\n const srcInstrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.js'),\n );\n\n // https://nextjs.org/docs/app/building-your-application/configuring/src-directory\n // https://nextjs.org/docs/app/api-reference/file-conventions/instrumentation\n // The logic for where Next.js picks up the instrumentation file is as follows:\n // - If there is either an `app` folder or a `pages` folder in the root directory of your Next.js app, Next.js looks\n // for an `instrumentation.ts` file in the root of the Next.js app.\n // - Otherwise, if there is neither an `app` folder or a `pages` folder in the rood directory of your Next.js app,\n // AND if there is an `src` folder, Next.js will look for the `instrumentation.ts` file in the `src` folder.\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n if (instrumentationJsExists || instrumentationTsExists) {\n instrumentationHookLocation = 'root';\n } else {\n instrumentationHookLocation = 'does-not-exist';\n }\n } else {\n if (srcInstrumentationTsExists || srcInstrumentationJsExists) {\n instrumentationHookLocation = 'src';\n } else {\n instrumentationHookLocation = 'does-not-exist';\n }\n }\n\n const newInstrumentationFileName = `instrumentation.${\n typeScriptDetected ? 'ts' : 'js'\n }`;\n\n if (instrumentationHookLocation === 'does-not-exist') {\n let newInstrumentationHookLocation: 'root' | 'src';\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n newInstrumentationHookLocation = 'root';\n } else if (hasSrcDirectory) {\n newInstrumentationHookLocation = 'src';\n } else {\n newInstrumentationHookLocation = 'root';\n }\n\n const newInstrumentationHookPath =\n newInstrumentationHookLocation === 'root'\n ? path.join(process.cwd(), newInstrumentationFileName)\n : path.join(process.cwd(), 'src', newInstrumentationFileName);\n\n const successfullyCreated = await createNewConfigFile(\n newInstrumentationHookPath,\n getInstrumentationHookContent(newInstrumentationHookLocation),\n );\n\n if (!successfullyCreated) {\n await showCopyPasteInstructions(\n newInstrumentationFileName,\n getInstrumentationHookCopyPasteSnippet(\n newInstrumentationHookLocation,\n ),\n \"create the file if it doesn't already exist\",\n );\n }\n } else {\n await showCopyPasteInstructions(\n srcInstrumentationTsExists || instrumentationTsExists\n ? 'instrumentation.ts'\n : srcInstrumentationJsExists || instrumentationJsExists\n ? 'instrumentation.js'\n : newInstrumentationFileName,\n getInstrumentationHookCopyPasteSnippet(instrumentationHookLocation),\n );\n }\n });\n\n await traceStep('setup-instrumentation-client-hook', async () => {\n const hasRootAppDirectory = hasDirectoryPathFromRoot('app');\n const hasRootPagesDirectory = hasDirectoryPathFromRoot('pages');\n const hasSrcDirectory = hasDirectoryPathFromRoot('src');\n\n let instrumentationClientHookLocation: 'src' | 'root' | 'does-not-exist';\n\n const instrumentationClientTsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation-client.ts'),\n );\n const instrumentationClientJsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation-client.js'),\n );\n const srcInstrumentationClientTsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation-client.ts'),\n );\n const srcInstrumentationClientJsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation-client.js'),\n );\n\n // https://nextjs.org/docs/app/building-your-application/configuring/src-directory\n // https://nextjs.org/docs/app/api-reference/file-conventions/instrumentation\n // The logic for where Next.js picks up the instrumentation file is as follows:\n // - If there is either an `app` folder or a `pages` folder in the root directory of your Next.js app, Next.js looks\n // for an `instrumentation.ts` file in the root of the Next.js app.\n // - Otherwise, if there is neither an `app` folder or a `pages` folder in the rood directory of your Next.js app,\n // AND if there is an `src` folder, Next.js will look for the `instrumentation.ts` file in the `src` folder.\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n if (instrumentationClientJsExists || instrumentationClientTsExists) {\n instrumentationClientHookLocation = 'root';\n } else {\n instrumentationClientHookLocation = 'does-not-exist';\n }\n } else {\n if (\n srcInstrumentationClientTsExists ||\n srcInstrumentationClientJsExists\n ) {\n instrumentationClientHookLocation = 'src';\n } else {\n instrumentationClientHookLocation = 'does-not-exist';\n }\n }\n\n const newInstrumentationClientFileName = `instrumentation-client.${\n typeScriptDetected ? 'ts' : 'js'\n }`;\n\n if (instrumentationClientHookLocation === 'does-not-exist') {\n let newInstrumentationClientHookLocation: 'root' | 'src';\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n newInstrumentationClientHookLocation = 'root';\n } else if (hasSrcDirectory) {\n newInstrumentationClientHookLocation = 'src';\n } else {\n newInstrumentationClientHookLocation = 'root';\n }\n\n const newInstrumentationClientHookPath =\n newInstrumentationClientHookLocation === 'root'\n ? path.join(process.cwd(), newInstrumentationClientFileName)\n : path.join(process.cwd(), 'src', newInstrumentationClientFileName);\n\n const successfullyCreated = await createNewConfigFile(\n newInstrumentationClientHookPath,\n getInstrumentationClientFileContents(\n selectedProject.keys[0].dsn.public,\n selectedFeatures,\n ),\n );\n\n if (!successfullyCreated) {\n await showCopyPasteInstructions(\n newInstrumentationClientFileName,\n getInstrumentationClientHookCopyPasteSnippet(\n selectedProject.keys[0].dsn.public,\n selectedFeatures,\n ),\n \"create the file if it doesn't already exist\",\n );\n }\n } else {\n await showCopyPasteInstructions(\n srcInstrumentationClientTsExists || instrumentationClientTsExists\n ? 'instrumentation-client.ts'\n : srcInstrumentationClientJsExists || instrumentationClientJsExists\n ? 'instrumentation-client.js'\n : newInstrumentationClientFileName,\n getInstrumentationClientHookCopyPasteSnippet(\n selectedProject.keys[0].dsn.public,\n selectedFeatures,\n ),\n );\n }\n });\n\n await traceStep('setup-next-config', async () => {\n const withSentryConfigOptionsTemplate = getWithSentryConfigOptionsTemplate({\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n selfHosted,\n sentryUrl,\n tunnelRoute: sdkConfigOptions.tunnelRoute,\n });\n\n const nextConfigPossibleFilesMap = {\n js: 'next.config.js',\n mjs: 'next.config.mjs',\n cjs: 'next.config.cjs',\n ts: 'next.config.ts',\n mts: 'next.config.mts',\n cts: 'next.config.cts',\n };\n\n const foundNextConfigFile = Object.entries(nextConfigPossibleFilesMap).find(\n ([, fileName]) => fs.existsSync(path.join(process.cwd(), fileName)),\n );\n\n if (!foundNextConfigFile) {\n Sentry.setTag('next-config-strategy', 'create');\n\n // Try to figure out whether the user prefers ESM\n let isTypeModule = false;\n try {\n const packageJsonText = await fs.promises.readFile(\n path.join(process.cwd(), 'package.json'),\n 'utf8',\n );\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const packageJson = JSON.parse(packageJsonText);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (packageJson.type === 'module') {\n isTypeModule = true;\n }\n } catch {\n // noop\n }\n\n // We are creating `next.config.(m)js` files by default as they are supported by the most Next.js versions\n const configFilename = isTypeModule\n ? nextConfigPossibleFilesMap.mjs\n : nextConfigPossibleFilesMap.js;\n const configContent = isTypeModule\n ? getNextjsConfigMjsTemplate(withSentryConfigOptionsTemplate)\n : getNextjsConfigCjsTemplate(withSentryConfigOptionsTemplate);\n\n await fs.promises.writeFile(\n path.join(process.cwd(), configFilename),\n configContent,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(configFilename)} with Sentry configuration.`,\n );\n\n return;\n }\n\n const [foundNextConfigFileType, foundNextConfigFileFilename] =\n foundNextConfigFile;\n\n if (foundNextConfigFileType === 'js' || foundNextConfigFileType === 'cjs') {\n Sentry.setTag('next-config-strategy', 'modify');\n\n const nextConfigCjsContent = fs.readFileSync(\n path.join(process.cwd(), foundNextConfigFileFilename),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigCjsContent.includes('@sentry/nextjs') &&\n nextConfigCjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n foundNextConfigFileFilename,\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(), foundNextConfigFileFilename),\n getNextjsConfigCjsAppendix(withSentryConfigOptionsTemplate),\n 'utf8',\n );\n\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n }\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n\n if (\n foundNextConfigFileType === 'mjs' ||\n foundNextConfigFileType === 'mts' ||\n foundNextConfigFileType === 'cts' ||\n foundNextConfigFileType === 'ts'\n ) {\n const nextConfigMjsContent = fs.readFileSync(\n path.join(process.cwd(), foundNextConfigFileFilename),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigMjsContent.includes('@sentry/nextjs') &&\n nextConfigMjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n foundNextConfigFileFilename,\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(nextConfigMjsContent);\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 ${withSentryConfigOptionsTemplate}\n)`);\n const newCode = mod.generate().code;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), foundNextConfigFileFilename),\n newCode,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n } catch {\n Sentry.setTag('next-config-mod-result', 'fail');\n clack.log.warn(\n chalk.yellow(\n `Something went wrong writing to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}.`,\n ),\n );\n clack.log.info(\n `Please put the following code snippet into ${chalk.cyan(\n foundNextConfigFileFilename,\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(withSentryConfigOptionsTemplate),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Are you done putting the snippet above into ${chalk.cyan(\n foundNextConfigFileFilename,\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}\n\nfunction hasDirectoryPathFromRoot(dirnameOrDirs: string | string[]): boolean {\n const dirPath = Array.isArray(dirnameOrDirs)\n ? path.join(process.cwd(), ...dirnameOrDirs)\n : path.join(process.cwd(), dirnameOrDirs);\n\n return fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();\n}\n\nasync function createExamplePage(\n selfHosted: boolean,\n selectedProject: SentryProjectData,\n sentryUrl: string,\n): Promise<void> {\n const hasSrcDirectory = hasDirectoryPathFromRoot('src');\n const hasRootAppDirectory = hasDirectoryPathFromRoot('app');\n const hasRootPagesDirectory = hasDirectoryPathFromRoot('pages');\n const hasSrcAppDirectory = hasDirectoryPathFromRoot(['src', 'app']);\n const hasSrcPagesDirectory = hasDirectoryPathFromRoot(['src', 'pages']);\n\n Sentry.setTag('nextjs-app-dir', hasRootAppDirectory || hasSrcAppDirectory);\n\n const typeScriptDetected = isUsingTypeScript();\n\n // If `pages` or an `app` directory exists in the root, we'll put the example page there.\n // `app` directory takes priority over `pages` directory when they coexist, so we prioritize that.\n // https://nextjs.org/docs/app/building-your-application/routing#the-app-router\n\n const appFolderLocation = hasRootAppDirectory\n ? ['app']\n : hasSrcAppDirectory\n ? ['src', 'app']\n : undefined;\n\n let pagesFolderLocation = hasRootPagesDirectory\n ? ['pages']\n : hasSrcPagesDirectory\n ? ['src', 'pages']\n : undefined;\n\n // If the user has neither pages nor app directory we create a pages folder for them\n if (!appFolderLocation && !pagesFolderLocation) {\n const newPagesFolderLocation = hasSrcDirectory\n ? ['src', 'pages']\n : ['pages'];\n fs.mkdirSync(path.join(process.cwd(), ...newPagesFolderLocation), {\n recursive: true,\n });\n\n pagesFolderLocation = newPagesFolderLocation;\n }\n\n if (appFolderLocation) {\n const appFolderPath = path.join(process.cwd(), ...appFolderLocation);\n\n const hasRootLayout = ['jsx', 'tsx', 'js'].some((ext) =>\n fs.existsSync(path.join(appFolderPath, `layout.${ext}`)),\n );\n\n if (!hasRootLayout) {\n // In case no root layout file exists, we create a simple one so that\n // the example page can be rendered correctly.\n const newRootLayoutFilename = `layout.${\n typeScriptDetected ? 'tsx' : 'jsx'\n }`;\n\n await fs.promises.writeFile(\n path.join(appFolderPath, newRootLayoutFilename),\n getRootLayout(typeScriptDetected),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appFolderLocation, newRootLayoutFilename),\n )}.`,\n );\n }\n\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n sentryUrl,\n useClient: true,\n });\n\n fs.mkdirSync(path.join(appFolderPath, 'sentry-example-page'), {\n recursive: true,\n });\n\n const newPageFileName = `page.${typeScriptDetected ? 'tsx' : 'jsx'}`;\n\n await fs.promises.writeFile(\n path.join(appFolderPath, 'sentry-example-page', newPageFileName),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appFolderLocation, 'sentry-example-page', newPageFileName),\n )}.`,\n );\n\n fs.mkdirSync(path.join(appFolderPath, 'api', 'sentry-example-api'), {\n recursive: true,\n });\n\n const newRouteFileName = `route.${typeScriptDetected ? 'ts' : 'js'}`;\n\n await fs.promises.writeFile(\n path.join(appFolderPath, 'api', 'sentry-example-api', newRouteFileName),\n getSentryExampleAppDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(\n ...appFolderLocation,\n 'api',\n 'sentry-example-api',\n newRouteFileName,\n ),\n )}.`,\n );\n } else if (pagesFolderLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n sentryUrl,\n useClient: false,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesFolderLocation,\n 'sentry-example-page.jsx',\n ),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesFolderLocation, 'sentry-example-page.js'),\n )}.`,\n );\n\n fs.mkdirSync(path.join(process.cwd(), ...pagesFolderLocation, 'api'), {\n recursive: true,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesFolderLocation,\n 'api',\n 'sentry-example-api.js',\n ),\n getSentryExamplePagesDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesFolderLocation, 'api', 'sentry-example-api.js'),\n )}.`,\n );\n }\n}\n\n/**\n * Ask users if they want to set the tunnelRoute option.\n * We can't set this by default because it potentially increases hosting bills.\n * It's valuable enough to for users to justify asking the additional question.\n */\nasync function askShouldSetTunnelRoute() {\n return await traceStep('ask-tunnelRoute-option', async (span) => {\n const shouldSetTunnelRoute = await abortIfCancelled(\n clack.select({\n message:\n 'Do you want to route Sentry requests in the browser through your Next.js server to avoid ad blockers?',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'Can increase your server load and hosting bill',\n },\n {\n label: 'No',\n value: false,\n hint: 'Browser errors and events might be blocked by ad blockers before being sent to Sentry',\n },\n ],\n initialValue: true,\n }),\n );\n\n if (!shouldSetTunnelRoute) {\n clack.log.info(\n \"Sounds good! We'll leave the option commented for later, just in case :)\",\n );\n }\n\n span?.setAttribute('tunnelRoute', shouldSetTunnelRoute);\n Sentry.setTag('tunnelRoute', shouldSetTunnelRoute);\n\n return shouldSetTunnelRoute;\n });\n}\n\n/**\n * Returns true or false depending on whether we think the user is using Turbopack. May return null in case we aren't sure.\n */\nasync function checkIfLikelyIsUsingTurbopack(): Promise<boolean | null> {\n let packageJsonContent: string;\n try {\n packageJsonContent = await fs.promises.readFile(\n path.join(process.cwd(), 'package.json'),\n 'utf8',\n );\n } catch {\n return null;\n }\n\n return packageJsonContent.includes('--turbo');\n}\n"]}
1
+ {"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8BAA8B;AAC9B,+EAA+E;AAC/E,6DAAmC;AACnC,kDAA0B;AAC1B,uCAAyB;AACzB,kFAAkF;AAClF,uCAA+D;AAC/D,2CAA6B;AAE7B,qDAAuC;AAEvC,uEAA0D;AAC1D,4CAAwD;AACxD,0CAiBwB;AACxB,wDAA+E;AAE/E,2CAoBqB;AACrB,mCAAiD;AAEjD,SAAgB,eAAe,CAAC,OAAsB;IACpD,OAAO,IAAA,yBAAa,EAClB;QACE,OAAO,EAAE,OAAO,CAAC,gBAAgB;QACjC,WAAW,EAAE,QAAQ;QACrB,aAAa,EAAE,OAAO;KACvB,EACD,GAAG,EAAE,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAC5C,CAAC;AACJ,CAAC;AATD,0CASC;AAEM,KAAK,UAAU,4BAA4B,CAChD,OAAsB;IAEtB,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAE9D,IAAA,oBAAY,EAAC;QACX,UAAU,EAAE,uBAAuB;QACnC,SAAS;QACT,gBAAgB;KACjB,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,IAAA,yBAAiB,GAAE,CAAC;IAE/C,MAAM,IAAA,yCAAiC,EAAC;QACtC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;IAE9C,MAAM,IAAA,gCAAwB,EAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,IAAA,gCAAiB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3D,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAA,8BAAsB,EAAC,WAAW,CAAC,CAAC,CAAC;IAErE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,GACzD,MAAM,IAAA,8BAAsB,EAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAE7D,MAAM,mBAAmB,GAAG,IAAA,kCAAmB,EAC7C,gBAAgB,EAChB,WAAW,CACZ,CAAC;IACF,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,CAAC,CAAC;IAE5D,MAAM,EAAE,cAAc,EAAE,6BAA6B,EAAE,GACrD,MAAM,IAAA,sBAAc,EAAC;QACnB,WAAW,EAAE,uBAAuB;QACpC,uBAAuB,EAAE,gBAAgB;QACzC,gBAAgB,EAAE,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,gBAAgB,CAAC;QACjE,YAAY;KACb,CAAC,CAAC;IAEL,MAAM,IAAA,qBAAS,EAAC,eAAe,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,WAAW,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAEpD,MAAM,wBAAwB,CAAC,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE;YACrE,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,IAAA,qBAAS,EAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAExD,MAAM,aAAa,GACjB,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;YAChC,EAAE,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE;YAC3C,CAAC,CAAC,CAAC,OAAO,CAAC;YACX,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,oBAAoB,CAAC;gBACnC,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,WAAW,EAAE;gBAClD,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC;gBAClB,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,CAAC,aAAa,EAAE;YAClB,OAAO;SACR;QAED,MAAM,uBAAuB,GAAG,EAAE,CAAC,UAAU,CAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,aAAa,EAAE,YAAY,CAAC,CACzD;YACC,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,aAAa,EAAE,WAAW,CAAC,CAAC;gBACxE,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,aAAa,EAAE,YAAY,CAAC,CAAC;oBACzE,CAAC,CAAC,YAAY;oBACd,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,aAAa,EAAE,WAAW,CAAC,CAAC;wBACxE,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,CAAC,uBAAuB,EAAE;YAC5B,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,aAAa,EAAE,YAAY,CAAC,EACxD,IAAA,+CAAmC,GAAE,EACrC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,CAAC;YAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,WAAW,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,aAAa,EAAE,YAAY,CAAC,CAAC,GAAG,CACpE,CAAC;SACH;aAAM,IACL,EAAE;aACC,YAAY,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,aAAa,EAAE,uBAAuB,CAAC,EACnE,MAAM,CACP;aACA,QAAQ,CAAC,iBAAiB,CAAC,EAC9B;YACA,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,wGAAwG,eAAK,CAAC,IAAI,CAChH,iBAAiB,CAClB,yCAAyC,eAAK,CAAC,IAAI,CAClD,IAAI,CAAC,IAAI,CAAC,GAAG,aAAa,EAAE,uBAAuB,CAAC,CACrD,GAAG,CACL,CAAC;YAEF,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,IAAA,oDAAwC,GAAE,CAAC,CAAC;YAExD,MAAM,cAAc,GAAG,MAAM,IAAA,wBAAgB,EAC3C,iBAAK,CAAC,OAAO,CAAC;gBACZ,OAAO,EAAE,uBAAuB,eAAK,CAAC,IAAI,CACxC,IAAI,CAAC,IAAI,CAAC,GAAG,aAAa,EAAE,uBAAuB,CAAC,CACrD,2BAA2B;gBAC5B,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,wBAAwB;aACnC,CAAC,CACH,CAAC;YAEF,IAAI,CAAC,cAAc,EAAE;gBACnB,MAAM,IAAA,aAAK,GAAE,CAAC;aACf;SACF;aAAM;YACL,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,sHAAsH,eAAK,CAAC,IAAI,CAC9H,IAAI,CAAC,IAAI,CAAC,GAAG,aAAa,EAAE,uBAAuB,CAAC,CACrD,GAAG,CACL,CAAC;YAEF,sCAAsC;YACtC,OAAO,CAAC,GAAG,CACT,IAAA,kDAAsC,EACpC,uBAAuB,KAAK,WAAW;gBACrC,uBAAuB,KAAK,YAAY,CAC3C,CACF,CAAC;YAEF,MAAM,cAAc,GAAG,MAAM,IAAA,wBAAgB,EAC3C,iBAAK,CAAC,OAAO,CAAC;gBACZ,OAAO,EAAE,gCAAgC,eAAK,CAAC,IAAI,CACjD,IAAI,CAAC,IAAI,CAAC,GAAG,aAAa,EAAE,uBAAuB,CAAC,CACrD,2BAA2B;gBAC5B,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,wBAAwB;aACnC,CAAC,CACH,CAAC;YAEF,IAAI,CAAC,cAAc,EAAE;gBACnB,MAAM,IAAA,aAAK,GAAE,CAAC;aACf;SACF;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAA,qBAAS,EAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACxD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAElE,MAAM,cAAc,GAClB,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE;YACzC,CAAC,CAAC,CAAC,KAAK,CAAC;YACT,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC;gBACjC,EAAE,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE;gBAChD,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC;gBAChB,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO;SACR;QAED,MAAM,mBAAmB,GAAG,EAAE,CAAC,UAAU,CACvC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,cAAc,EAAE,kBAAkB,CAAC,CAChE;YACC,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,EAAE,CAAC,UAAU,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,cAAc,EAAE,iBAAiB,CAAC,CAC/D;gBACH,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,EAAE,CAAC,UAAU,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,cAAc,EAAE,kBAAkB,CAAC,CAChE;oBACH,CAAC,CAAC,kBAAkB;oBACpB,CAAC,CAAC,EAAE,CAAC,UAAU,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,cAAc,EAAE,iBAAiB,CAAC,CAC/D;wBACH,CAAC,CAAC,iBAAiB;wBACnB,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,CAAC,mBAAmB,EAAE;YACxB,MAAM,sBAAsB,GAAG,gBAC7B,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAC/B,EAAE,CAAC;YAEH,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,cAAc,EAAE,sBAAsB,CAAC,EACnE,IAAA,2CAA+B,EAAC,kBAAkB,CAAC,EACnD,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,CAAC;YAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,WAAW,eAAK,CAAC,IAAI,CACnB,IAAI,CAAC,IAAI,CAAC,GAAG,cAAc,EAAE,sBAAsB,CAAC,CACrD,GAAG,CACL,CAAC;SACH;aAAM;YACL,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,6IAA6I,eAAK,CAAC,IAAI,CACrJ,IAAI,CAAC,IAAI,CAAC,GAAG,cAAc,EAAE,mBAAmB,CAAC,CAClD,KAAK,CACP,CAAC;YAEF,sCAAsC;YACtC,OAAO,CAAC,GAAG,CACT,IAAA,0CAA8B,EAC5B,mBAAmB,KAAK,iBAAiB;gBACvC,mBAAmB,KAAK,kBAAkB,CAC7C,CACF,CAAC;YAEF,MAAM,cAAc,GAAG,MAAM,IAAA,wBAAgB,EAC3C,iBAAK,CAAC,OAAO,CAAC;gBACZ,OAAO,EAAE,gCAAgC,eAAK,CAAC,IAAI,CACjD,IAAI,CAAC,IAAI,CAAC,GAAG,cAAc,EAAE,mBAAmB,CAAC,CAClD,2BAA2B;gBAC5B,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,wBAAwB;aACnC,CAAC,CACH,CAAC;YAEF,IAAI,CAAC,cAAc,EAAE;gBACnB,MAAM,IAAA,aAAK,GAAE,CAAC;aACf;SACF;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,uBAAuB,GAAG,MAAM,IAAA,kCAA0B,GAAE,CAAC;IACnE,IAAI,uBAAuB,EAAE;QAC3B,MAAM,IAAA,qBAAS,EAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAChD,iBAAiB,CAAC,UAAU,EAAE,eAAe,EAAE,SAAS,CAAC,CAC1D,CAAC;KACH;IAED,MAAM,IAAA,sCAA8B,EAAC,SAAS,CAAC,CAAC;IAEhD,MAAM,sBAAsB,GAAG,MAAM,6BAA6B,EAAE,CAAC;IACrE,IAAI,sBAAsB,IAAI,sBAAsB,KAAK,IAAI,EAAE;QAC7D,MAAM,IAAA,wBAAgB,EACpB,iBAAK,CAAC,MAAM,CAAC;YACX,OAAO,EAAE,sHAAsH,eAAK,CAAC,IAAI,CACvI,wQAAwQ,CACzQ,EAAE;YACH,OAAO,EAAE;gBACP;oBACE,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,aAAa;oBACnB,KAAK,EAAE,IAAI;iBACZ;aACF;YACD,YAAY,EAAE,IAAI;SACnB,CAAC,CACH,CAAC;KACH;IAED,MAAM,kBAAkB,GAAG,EAAE,CAAC,UAAU,CACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CACxC,CAAC;IAEF,IAAI,kBAAkB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;QAC7C,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ;yGACmG,CACpG,CAAC;KACH;SAAM;QACL,MAAM,IAAA,2BAAO,EAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;KACxD;IAED,MAAM,sBAAsB,GAC1B,6BAA6B,IAAI,CAAC,MAAM,IAAA,yBAAiB,GAAE,CAAC,CAAC;IAC/D,MAAM,IAAA,8BAAsB,EAAC;QAC3B,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IAEH,iBAAK,CAAC,KAAK,CAAC;EACZ,eAAK,CAAC,KAAK,CAAC,gDAAgD,CAAC,IAC3D,uBAAuB;QACrB,CAAC,CAAC,8EAA8E,eAAK,CAAC,IAAI,CACtF,GAAG,sBAAsB,CAAC,gBAAgB,MAAM,CACjD,kBAAkB,eAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE;QAC3D,CAAC,CAAC,EACN,GACE,uBAAuB,IAAI,sBAAsB;QAC/C,CAAC,CAAC,kKAAkK;QACpK,CAAC,CAAC,EACN;;EAEA,eAAK,CAAC,GAAG,CACT,sGAAsG,CACvG,EAAE,CAAC,CAAC;AACL,CAAC;AA1SD,oEA0SC;AAMD,KAAK,UAAU,wBAAwB,CACrC,eAAkC,EAClC,UAAmB,EACnB,SAAiB,EACjB,gBAAkC;IAElC,MAAM,gBAAgB,GAAG,MAAM,IAAA,8BAAsB,EAAC;QACpD;YACE,EAAE,EAAE,aAAa;YACjB,MAAM,EAAE,yBAAyB,eAAK,CAAC,IAAI,CACzC,SAAS,CACV,gDAAgD;YACjD,WAAW,EAAE,aAAa;SAC3B;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,MAAM,EAAE,yBAAyB,eAAK,CAAC,IAAI,CACzC,gBAAgB,CACjB,oEAAoE;YACrE,WAAW,EAAE,wCAAwC;SACtD;KACO,CAAC,CAAC;IAEZ,MAAM,kBAAkB,GAAG,IAAA,yBAAiB,GAAE,CAAC;IAE/C,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAU,CAAC;IAEnD,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;QAC1C,MAAM,IAAA,qBAAS,EAAC,iBAAiB,aAAa,SAAS,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,QAAQ,GAAG,UAAU,aAAa,YAAY,CAAC;YACrD,MAAM,QAAQ,GAAG,UAAU,aAAa,YAAY,CAAC;YAErD,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;YACzE,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEzE,IAAI,eAAe,GAAG,IAAI,CAAC;YAE3B,IAAI,cAAc,IAAI,cAAc,EAAE;gBACpC,MAAM,eAAe,GAAG,EAAE,CAAC;gBAE3B,IAAI,cAAc,EAAE;oBAClB,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAChC;gBAED,IAAI,cAAc,EAAE;oBAClB,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAChC;gBAED,MAAM,wBAAwB,GAAG,MAAM,IAAA,wBAAgB,EACrD,iBAAK,CAAC,OAAO,CAAC;oBACZ,OAAO,EAAE,yBAAyB,aAAa,YAAY,eAAe,CAAC,IAAI,CAC7E,IAAI,CACL,gBAAgB,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG;iBAC/D,CAAC,CACH,CAAC;gBACF,MAAM,CAAC,MAAM,CACX,aAAa,aAAa,SAAS,EACnC,wBAAwB,CACzB,CAAC;gBAEF,eAAe,GAAG,wBAAwB,CAAC;gBAE3C,IAAI,wBAAwB,EAAE;oBAC5B,IAAI,cAAc,EAAE;wBAClB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;wBAClD,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;qBAC7D;oBACD,IAAI,cAAc,EAAE;wBAClB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;wBAClD,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;qBAC7D;iBACF;aACF;YAED,IAAI,eAAe,EAAE;gBACnB,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAClE,IAAA,6CAAiC,EAC/B,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAClC,aAAa,EACb,gBAAgB,CACjB,EACD,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,CAAC;gBACF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,iBAAiB,eAAK,CAAC,IAAI,CACzB,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CACzC,GAAG,CACL,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,WAAW,aAAa,SAAS,EAAE,IAAI,CAAC,CAAC;aACxD;QACH,CAAC,CAAC,CAAC;KACJ;IAED,MAAM,IAAA,qBAAS,EAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,eAAe,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAExD,IAAI,2BAA8D,CAAC;QAEnE,MAAM,uBAAuB,GAAG,EAAE,CAAC,UAAU,CAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAC/C,CAAC;QACF,MAAM,uBAAuB,GAAG,EAAE,CAAC,UAAU,CAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAC/C,CAAC;QACF,MAAM,0BAA0B,GAAG,EAAE,CAAC,UAAU,CAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,CAAC,CACtD,CAAC;QACF,MAAM,0BAA0B,GAAG,EAAE,CAAC,UAAU,CAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,CAAC,CACtD,CAAC;QAEF,kFAAkF;QAClF,6EAA6E;QAC7E,+EAA+E;QAC/E,oHAAoH;QACpH,mEAAmE;QACnE,kHAAkH;QAClH,4GAA4G;QAC5G,IAAI,qBAAqB,IAAI,mBAAmB,EAAE;YAChD,IAAI,uBAAuB,IAAI,uBAAuB,EAAE;gBACtD,2BAA2B,GAAG,MAAM,CAAC;aACtC;iBAAM;gBACL,2BAA2B,GAAG,gBAAgB,CAAC;aAChD;SACF;aAAM;YACL,IAAI,0BAA0B,IAAI,0BAA0B,EAAE;gBAC5D,2BAA2B,GAAG,KAAK,CAAC;aACrC;iBAAM;gBACL,2BAA2B,GAAG,gBAAgB,CAAC;aAChD;SACF;QAED,MAAM,0BAA0B,GAAG,mBACjC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAC9B,EAAE,CAAC;QAEH,IAAI,2BAA2B,KAAK,gBAAgB,EAAE;YACpD,IAAI,8BAA8C,CAAC;YACnD,IAAI,qBAAqB,IAAI,mBAAmB,EAAE;gBAChD,8BAA8B,GAAG,MAAM,CAAC;aACzC;iBAAM,IAAI,eAAe,EAAE;gBAC1B,8BAA8B,GAAG,KAAK,CAAC;aACxC;iBAAM;gBACL,8BAA8B,GAAG,MAAM,CAAC;aACzC;YAED,MAAM,0BAA0B,GAC9B,8BAA8B,KAAK,MAAM;gBACvC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC;gBACtD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,0BAA0B,CAAC,CAAC;YAElE,MAAM,mBAAmB,GAAG,MAAM,IAAA,2BAAmB,EACnD,0BAA0B,EAC1B,IAAA,yCAA6B,EAAC,8BAA8B,CAAC,CAC9D,CAAC;YAEF,IAAI,CAAC,mBAAmB,EAAE;gBACxB,MAAM,IAAA,iCAAyB,EAAC;oBAC9B,QAAQ,EAAE,0BAA0B;oBACpC,WAAW,EAAE,IAAA,kDAAsC,EACjD,8BAA8B,CAC/B;oBACD,IAAI,EAAE,6CAA6C;iBACpD,CAAC,CAAC;aACJ;SACF;aAAM;YACL,MAAM,IAAA,iCAAyB,EAAC;gBAC9B,QAAQ,EACN,0BAA0B,IAAI,uBAAuB;oBACnD,CAAC,CAAC,oBAAoB;oBACtB,CAAC,CAAC,0BAA0B,IAAI,uBAAuB;wBACvD,CAAC,CAAC,oBAAoB;wBACtB,CAAC,CAAC,0BAA0B;gBAChC,WAAW,EAAE,IAAA,kDAAsC,EACjD,2BAA2B,CAC5B;aACF,CAAC,CAAC;SACJ;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAA,qBAAS,EAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,eAAe,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAExD,IAAI,iCAAoE,CAAC;QAEzE,MAAM,6BAA6B,GAAG,EAAE,CAAC,UAAU,CACjD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2BAA2B,CAAC,CACtD,CAAC;QACF,MAAM,6BAA6B,GAAG,EAAE,CAAC,UAAU,CACjD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2BAA2B,CAAC,CACtD,CAAC;QACF,MAAM,gCAAgC,GAAG,EAAE,CAAC,UAAU,CACpD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,2BAA2B,CAAC,CAC7D,CAAC;QACF,MAAM,gCAAgC,GAAG,EAAE,CAAC,UAAU,CACpD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,2BAA2B,CAAC,CAC7D,CAAC;QAEF,kFAAkF;QAClF,6EAA6E;QAC7E,+EAA+E;QAC/E,oHAAoH;QACpH,mEAAmE;QACnE,kHAAkH;QAClH,4GAA4G;QAC5G,IAAI,qBAAqB,IAAI,mBAAmB,EAAE;YAChD,IAAI,6BAA6B,IAAI,6BAA6B,EAAE;gBAClE,iCAAiC,GAAG,MAAM,CAAC;aAC5C;iBAAM;gBACL,iCAAiC,GAAG,gBAAgB,CAAC;aACtD;SACF;aAAM;YACL,IACE,gCAAgC;gBAChC,gCAAgC,EAChC;gBACA,iCAAiC,GAAG,KAAK,CAAC;aAC3C;iBAAM;gBACL,iCAAiC,GAAG,gBAAgB,CAAC;aACtD;SACF;QAED,MAAM,gCAAgC,GAAG,0BACvC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAC9B,EAAE,CAAC;QAEH,IAAI,iCAAiC,KAAK,gBAAgB,EAAE;YAC1D,IAAI,oCAAoD,CAAC;YACzD,IAAI,qBAAqB,IAAI,mBAAmB,EAAE;gBAChD,oCAAoC,GAAG,MAAM,CAAC;aAC/C;iBAAM,IAAI,eAAe,EAAE;gBAC1B,oCAAoC,GAAG,KAAK,CAAC;aAC9C;iBAAM;gBACL,oCAAoC,GAAG,MAAM,CAAC;aAC/C;YAED,MAAM,gCAAgC,GACpC,oCAAoC,KAAK,MAAM;gBAC7C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gCAAgC,CAAC;gBAC5D,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,gCAAgC,CAAC,CAAC;YAExE,MAAM,mBAAmB,GAAG,MAAM,IAAA,2BAAmB,EACnD,gCAAgC,EAChC,IAAA,gDAAoC,EAClC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAClC,gBAAgB,CACjB,CACF,CAAC;YAEF,IAAI,CAAC,mBAAmB,EAAE;gBACxB,MAAM,IAAA,iCAAyB,EAAC;oBAC9B,QAAQ,EAAE,gCAAgC;oBAC1C,WAAW,EAAE,IAAA,wDAA4C,EACvD,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAClC,gBAAgB,CACjB;oBACD,IAAI,EAAE,6CAA6C;iBACpD,CAAC,CAAC;aACJ;SACF;aAAM;YACL,MAAM,IAAA,iCAAyB,EAAC;gBAC9B,QAAQ,EACN,gCAAgC,IAAI,6BAA6B;oBAC/D,CAAC,CAAC,2BAA2B;oBAC7B,CAAC,CAAC,gCAAgC,IAAI,6BAA6B;wBACnE,CAAC,CAAC,2BAA2B;wBAC7B,CAAC,CAAC,gCAAgC;gBACtC,WAAW,EAAE,IAAA,wDAA4C,EACvD,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAClC,gBAAgB,CACjB;aACF,CAAC,CAAC;SACJ;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAA,qBAAS,EAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,+BAA+B,GAAG,IAAA,8CAAkC,EAAC;YACzE,OAAO,EAAE,eAAe,CAAC,YAAY,CAAC,IAAI;YAC1C,WAAW,EAAE,eAAe,CAAC,IAAI;YACjC,UAAU;YACV,SAAS;YACT,WAAW,EAAE,gBAAgB,CAAC,WAAW;SAC1C,CAAC,CAAC;QAEH,MAAM,0BAA0B,GAAG;YACjC,EAAE,EAAE,gBAAgB;YACpB,GAAG,EAAE,iBAAiB;YACtB,GAAG,EAAE,iBAAiB;YACtB,EAAE,EAAE,gBAAgB;YACpB,GAAG,EAAE,iBAAiB;YACtB,GAAG,EAAE,iBAAiB;SACvB,CAAC;QAEF,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,IAAI,CACzE,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CACpE,CAAC;QAEF,IAAI,CAAC,mBAAmB,EAAE;YACxB,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;YAEhD,iDAAiD;YACjD,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,IAAI;gBACF,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAChD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EACxC,MAAM,CACP,CAAC;gBACF,mEAAmE;gBACnE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBAChD,sEAAsE;gBACtE,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE;oBACjC,YAAY,GAAG,IAAI,CAAC;iBACrB;aACF;YAAC,MAAM;gBACN,OAAO;aACR;YAED,0GAA0G;YAC1G,MAAM,cAAc,GAAG,YAAY;gBACjC,CAAC,CAAC,0BAA0B,CAAC,GAAG;gBAChC,CAAC,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAClC,MAAM,aAAa,GAAG,YAAY;gBAChC,CAAC,CAAC,IAAA,sCAA0B,EAAC,+BAA+B,CAAC;gBAC7D,CAAC,CAAC,IAAA,sCAA0B,EAAC,+BAA+B,CAAC,CAAC;YAEhE,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EACxC,aAAa,EACb,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,CAAC;YAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,WAAW,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,6BAA6B,CACnE,CAAC;YAEF,OAAO;SACR;QAED,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,CAAC,GAC1D,mBAAmB,CAAC;QAEtB,IAAI,uBAAuB,KAAK,IAAI,IAAI,uBAAuB,KAAK,KAAK,EAAE;YACzE,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;YAEhD,MAAM,oBAAoB,GAAG,EAAE,CAAC,YAAY,CAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2BAA2B,CAAC,EACrD,MAAM,CACP,CAAC;YAEF,MAAM,mBAAmB,GACvB,oBAAoB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBAC/C,oBAAoB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAEpD,IAAI,YAAY,GAAG,IAAI,CAAC;YAExB,IAAI,mBAAmB,EAAE;gBACvB,MAAM,YAAY,GAAG,MAAM,IAAA,wBAAgB,EACzC,iBAAK,CAAC,OAAO,CAAC;oBACZ,OAAO,EAAE,GAAG,eAAK,CAAC,IAAI,CACpB,2BAA2B,CAC5B,kFAAkF;iBACpF,CAAC,CACH,CAAC;gBAEF,YAAY,GAAG,YAAY,CAAC;aAC7B;YAED,IAAI,YAAY,EAAE;gBAChB,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2BAA2B,CAAC,EACrD,IAAA,sCAA0B,EAAC,+BAA+B,CAAC,EAC3D,MAAM,CACP,CAAC;gBAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,iCAAiC,eAAK,CAAC,IAAI,CACzC,2BAA2B,CAC5B,KAAK,eAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,EAAE,CACjE,CAAC;aACH;YAED,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;SACpD;QAED,IACE,uBAAuB,KAAK,KAAK;YACjC,uBAAuB,KAAK,KAAK;YACjC,uBAAuB,KAAK,KAAK;YACjC,uBAAuB,KAAK,IAAI,EAChC;YACA,MAAM,oBAAoB,GAAG,EAAE,CAAC,YAAY,CAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2BAA2B,CAAC,EACrD,MAAM,CACP,CAAC;YAEF,MAAM,mBAAmB,GACvB,oBAAoB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBAC/C,oBAAoB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAEpD,IAAI,YAAY,GAAG,IAAI,CAAC;YAExB,IAAI,mBAAmB,EAAE;gBACvB,MAAM,YAAY,GAAG,MAAM,IAAA,wBAAgB,EACzC,iBAAK,CAAC,OAAO,CAAC;oBACZ,OAAO,EAAE,GAAG,eAAK,CAAC,IAAI,CACpB,2BAA2B,CAC5B,kFAAkF;iBACpF,CAAC,CACH,CAAC;gBAEF,YAAY,GAAG,YAAY,CAAC;aAC7B;YAED,IAAI;gBACF,IAAI,YAAY,EAAE;oBAChB,MAAM,GAAG,GAAG,IAAA,sBAAW,EAAC,oBAAoB,CAAC,CAAC;oBAC9C,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,gBAAgB;wBACtB,QAAQ,EAAE,kBAAkB;wBAC5B,KAAK,EAAE,kBAAkB;qBAC1B,CAAC,CAAC;oBACH,6GAA6G;oBAC7G,MAAM,gBAAgB,GAAG,IAAA,uBAAY,EAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;oBACrE,mEAAmE;oBACnE,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,mBAAQ,CAAC,GAAG,CAAC;QACrC,gBAAgB;QAChB,+BAA+B;EACrC,CAAC,CAAC;oBACM,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC;oBAEpC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2BAA2B,CAAC,EACrD,OAAO,EACP;wBACE,QAAQ,EAAE,MAAM;wBAChB,IAAI,EAAE,GAAG;qBACV,CACF,CAAC;oBACF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,iCAAiC,eAAK,CAAC,IAAI,CACzC,2BAA2B,CAC5B,KAAK,eAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,EAAE,CACjE,CAAC;oBAEF,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;iBACpD;aACF;YAAC,MAAM;gBACN,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;gBAChD,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,eAAK,CAAC,MAAM,CACV,mCAAmC,eAAK,CAAC,IAAI,CAC3C,2BAA2B,CAC5B,GAAG,CACL,CACF,CAAC;gBACF,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,8CAA8C,eAAK,CAAC,IAAI,CACtD,2BAA2B,CAC5B,KAAK,eAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,IAAI,CAC/D,CAAC;gBAEF,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CACT,IAAA,8CAAkC,EAAC,+BAA+B,CAAC,CACpE,CAAC;gBAEF,MAAM,cAAc,GAAG,MAAM,IAAA,wBAAgB,EAC3C,iBAAK,CAAC,OAAO,CAAC;oBACZ,OAAO,EAAE,+CAA+C,eAAK,CAAC,IAAI,CAChE,2BAA2B,CAC5B,GAAG;oBACJ,MAAM,EAAE,KAAK;oBACb,QAAQ,EAAE,wBAAwB;iBACnC,CAAC,CACH,CAAC;gBAEF,IAAI,CAAC,cAAc,EAAE;oBACnB,MAAM,IAAA,aAAK,GAAE,CAAC;iBACf;aACF;SACF;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB,CAAC,aAAgC;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,aAAa,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;IAE5C,OAAO,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACvE,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,UAAmB,EACnB,eAAkC,EAClC,SAAiB;IAEjB,MAAM,eAAe,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACpE,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAExE,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,IAAI,kBAAkB,CAAC,CAAC;IAE3E,MAAM,kBAAkB,GAAG,IAAA,yBAAiB,GAAE,CAAC;IAE/C,yFAAyF;IACzF,kGAAkG;IAClG,+EAA+E;IAE/E,MAAM,iBAAiB,GAAG,mBAAmB;QAC3C,CAAC,CAAC,CAAC,KAAK,CAAC;QACT,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC;YAChB,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,mBAAmB,GAAG,qBAAqB;QAC7C,CAAC,CAAC,CAAC,OAAO,CAAC;QACX,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC;YAClB,CAAC,CAAC,SAAS,CAAC;IAEd,oFAAoF;IACpF,IAAI,CAAC,iBAAiB,IAAI,CAAC,mBAAmB,EAAE;QAC9C,MAAM,sBAAsB,GAAG,eAAe;YAC5C,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC;YAClB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACd,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,sBAAsB,CAAC,EAAE;YAChE,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,mBAAmB,GAAG,sBAAsB,CAAC;KAC9C;IAED,IAAI,iBAAiB,EAAE;QACrB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,iBAAiB,CAAC,CAAC;QAErE,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACtD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,EAAE,CAAC,CAAC,CACzD,CAAC;QAEF,IAAI,CAAC,aAAa,EAAE;YAClB,qEAAqE;YACrE,8CAA8C;YAC9C,MAAM,qBAAqB,GAAG,UAC5B,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAC/B,EAAE,CAAC;YAEH,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,qBAAqB,CAAC,EAC/C,IAAA,yBAAa,EAAC,kBAAkB,CAAC,EACjC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,CAAC;YAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,WAAW,eAAK,CAAC,IAAI,CACnB,IAAI,CAAC,IAAI,CAAC,GAAG,iBAAiB,EAAE,qBAAqB,CAAC,CACvD,GAAG,CACL,CAAC;SACH;QAED,MAAM,mBAAmB,GAAG,IAAA,wCAA4B,EAAC;YACvD,UAAU;YACV,OAAO,EAAE,eAAe,CAAC,YAAY,CAAC,IAAI;YAC1C,SAAS,EAAE,eAAe,CAAC,EAAE;YAC7B,SAAS;YACT,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,qBAAqB,CAAC,EAAE;YAC5D,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,QAAQ,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAErE,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,qBAAqB,EAAE,eAAe,CAAC,EAChE,mBAAmB,EACnB,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,CAAC;QAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,WAAW,eAAK,CAAC,IAAI,CACnB,IAAI,CAAC,IAAI,CAAC,GAAG,iBAAiB,EAAE,qBAAqB,EAAE,eAAe,CAAC,CACxE,GAAG,CACL,CAAC;QAEF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,oBAAoB,CAAC,EAAE;YAClE,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,SAAS,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAErE,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,EACvE,IAAA,0CAA8B,GAAE,EAChC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,CAAC;QAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,WAAW,eAAK,CAAC,IAAI,CACnB,IAAI,CAAC,IAAI,CACP,GAAG,iBAAiB,EACpB,KAAK,EACL,oBAAoB,EACpB,gBAAgB,CACjB,CACF,GAAG,CACL,CAAC;KACH;SAAM,IAAI,mBAAmB,EAAE;QAC9B,MAAM,mBAAmB,GAAG,IAAA,wCAA4B,EAAC;YACvD,UAAU;YACV,OAAO,EAAE,eAAe,CAAC,YAAY,CAAC,IAAI;YAC1C,SAAS,EAAE,eAAe,CAAC,EAAE;YAC7B,SAAS;YACT,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CACP,OAAO,CAAC,GAAG,EAAE,EACb,GAAG,mBAAmB,EACtB,yBAAyB,CAC1B,EACD,mBAAmB,EACnB,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,CAAC;QAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,WAAW,eAAK,CAAC,IAAI,CACnB,IAAI,CAAC,IAAI,CAAC,GAAG,mBAAmB,EAAE,wBAAwB,CAAC,CAC5D,GAAG,CACL,CAAC;QAEF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,mBAAmB,EAAE,KAAK,CAAC,EAAE;YACpE,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,IAAI,CACP,OAAO,CAAC,GAAG,EAAE,EACb,GAAG,mBAAmB,EACtB,KAAK,EACL,uBAAuB,CACxB,EACD,IAAA,4CAAgC,GAAE,EAClC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAChC,CAAC;QAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,WAAW,eAAK,CAAC,IAAI,CACnB,IAAI,CAAC,IAAI,CAAC,GAAG,mBAAmB,EAAE,KAAK,EAAE,uBAAuB,CAAC,CAClE,GAAG,CACL,CAAC;KACH;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,uBAAuB;IACpC,OAAO,MAAM,IAAA,qBAAS,EAAC,wBAAwB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC9D,MAAM,oBAAoB,GAAG,MAAM,IAAA,wBAAgB,EACjD,iBAAK,CAAC,MAAM,CAAC;YACX,OAAO,EACL,uGAAuG;YACzG,OAAO,EAAE;gBACP;oBACE,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,IAAI;oBACX,IAAI,EAAE,gDAAgD;iBACvD;gBACD;oBACE,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,KAAK;oBACZ,IAAI,EAAE,uFAAuF;iBAC9F;aACF;YACD,YAAY,EAAE,IAAI;SACnB,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,oBAAoB,EAAE;YACzB,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,0EAA0E,CAC3E,CAAC;SACH;QAED,IAAI,EAAE,YAAY,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;QAEnD,OAAO,oBAAoB,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,6BAA6B;IAC1C,IAAI,kBAA0B,CAAC;IAC/B,IAAI;QACF,kBAAkB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAC7C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EACxC,MAAM,CACP,CAAC;KACH;IAAC,MAAM;QACN,OAAO,IAAI,CAAC;KACb;IAED,OAAO,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAChD,CAAC","sourcesContent":["/* eslint-disable max-lines */\n// @ts-expect-error - 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-expect-error - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, parseModule } from 'magicast';\nimport * as path from 'path';\n\nimport * as Sentry from '@sentry/node';\n\nimport { setupCI } from '../sourcemaps/sourcemaps-wizard';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n abort,\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n createNewConfigFile,\n ensurePackageIsInstalled,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n runPrettierIfInstalled,\n showCopyPasteInstructions,\n} from '../utils/clack';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport type { SentryProjectData, WizardOptions } from '../utils/types';\nimport {\n getFullUnderscoreErrorCopyPasteSnippet,\n getGlobalErrorCopyPasteSnippet,\n getInstrumentationHookContent,\n getInstrumentationHookCopyPasteSnippet,\n getNextjsConfigCjsAppendix,\n getNextjsConfigCjsTemplate,\n getNextjsConfigEsmCopyPasteSnippet,\n getNextjsConfigMjsTemplate,\n getRootLayout,\n getSentryServersideConfigContents,\n getInstrumentationClientFileContents,\n getSentryDefaultGlobalErrorPage,\n getSentryDefaultUnderscoreErrorPage,\n getSentryExampleAppDirApiRoute,\n getSentryExamplePageContents,\n getSentryExamplePagesDirApiRoute,\n getSimpleUnderscoreErrorCopyPasteSnippet,\n getWithSentryConfigOptionsTemplate,\n getInstrumentationClientHookCopyPasteSnippet,\n} from './templates';\nimport { getNextJsVersionBucket } from './utils';\n\nexport function runNextjsWizard(options: WizardOptions) {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'nextjs',\n wizardOptions: options,\n },\n () => runNextjsWizardWithTelemetry(options),\n );\n}\n\nexport async function runNextjsWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry Next.js Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n const typeScriptDetected = isUsingTypeScript();\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n Sentry.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n const { selectedProject, authToken, selfHosted, sentryUrl } =\n await getOrAskForProjectData(options, 'javascript-nextjs');\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/nextjs',\n packageJson,\n );\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n const { packageManager: packageManagerFromInstallStep } =\n await installPackage({\n packageName: '@sentry/nextjs@latest',\n packageNameDisplayLabel: '@sentry/nextjs',\n alreadyInstalled: !!packageJson?.dependencies?.['@sentry/nextjs'],\n forceInstall,\n });\n\n await traceStep('configure-sdk', async () => {\n const tunnelRoute = await askShouldSetTunnelRoute();\n\n await createOrMergeNextJsFiles(selectedProject, selfHosted, sentryUrl, {\n tunnelRoute,\n });\n });\n\n await traceStep('create-underscoreerror-page', async () => {\n const srcDir = path.join(process.cwd(), 'src');\n const maybePagesDirPath = path.join(process.cwd(), 'pages');\n const maybeSrcPagesDirPath = path.join(srcDir, 'pages');\n\n const 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 if (!pagesLocation) {\n return;\n }\n\n const underscoreErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...pagesLocation, '_error.tsx'),\n )\n ? '_error.tsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.ts'))\n ? '_error.ts'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.jsx'))\n ? '_error.jsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.js'))\n ? '_error.js'\n : undefined;\n\n if (!underscoreErrorPageFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), ...pagesLocation, '_error.jsx'),\n getSentryDefaultUnderscoreErrorPage(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(path.join(...pagesLocation, '_error.jsx'))}.`,\n );\n } else if (\n fs\n .readFileSync(\n path.join(process.cwd(), ...pagesLocation, underscoreErrorPageFile),\n 'utf8',\n )\n .includes('getInitialProps')\n ) {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease put the following function call in the ${chalk.bold(\n 'getInitialProps',\n )}\\nmethod of your custom error page at ${chalk.bold(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(getSimpleUnderscoreErrorCopyPasteSnippet());\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you modify your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n } else {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getFullUnderscoreErrorCopyPasteSnippet(\n underscoreErrorPageFile === '_error.ts' ||\n underscoreErrorPageFile === '_error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you add the code to your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\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 await traceStep('create-global-error-page', async () => {\n const maybeAppDirPath = path.join(process.cwd(), 'app');\n const maybeSrcAppDirPath = path.join(process.cwd(), 'src', 'app');\n\n const appDirLocation =\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 (!appDirLocation) {\n return;\n }\n\n const globalErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.tsx'),\n )\n ? 'global-error.tsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.ts'),\n )\n ? 'global-error.ts'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.jsx'),\n )\n ? 'global-error.jsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.js'),\n )\n ? 'global-error.js'\n : undefined;\n\n if (!globalErrorPageFile) {\n const newGlobalErrorFileName = `global-error.${\n typeScriptDetected ? 'tsx' : 'jsx'\n }`;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), ...appDirLocation, newGlobalErrorFileName),\n getSentryDefaultGlobalErrorPage(typeScriptDetected),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appDirLocation, newGlobalErrorFileName),\n )}.`,\n );\n } else {\n clack.log.info(\n `It seems like you already have a custom error page for your app directory.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )}:\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getGlobalErrorCopyPasteSnippet(\n globalErrorPageFile === 'global-error.ts' ||\n globalErrorPageFile === 'global-error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you add the code to your ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )} file as described above?`,\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 shouldCreateExamplePage = await askShouldCreateExamplePage();\n if (shouldCreateExamplePage) {\n await traceStep('create-example-page', async () =>\n createExamplePage(selfHosted, selectedProject, sentryUrl),\n );\n }\n\n await addDotEnvSentryBuildPluginFile(authToken);\n\n const isLikelyUsingTurbopack = await checkIfLikelyIsUsingTurbopack();\n if (isLikelyUsingTurbopack || isLikelyUsingTurbopack === null) {\n await abortIfCancelled(\n clack.select({\n message: `Warning: The Sentry SDK is only compatible with Turbopack on Next.js version 15.3.0 (or 15.3.0-canary.8) or later. ${chalk.bold(\n `If you are using Turbopack with an older Next.js version, temporarily remove \\`--turbo\\` or \\`--turbopack\\` from your dev command until you have verified the SDK is working as expected. Note that the SDK will continue to work for non-Turbopack production builds.`,\n )}`,\n options: [\n {\n label: 'I understand.',\n hint: 'press enter',\n value: true,\n },\n ],\n initialValue: true,\n }),\n );\n }\n\n const mightBeUsingVercel = fs.existsSync(\n path.join(process.cwd(), 'vercel.json'),\n );\n\n if (mightBeUsingVercel && !options.comingFrom) {\n clack.log.info(\n \"▲ It seems like you're using Vercel. We recommend using the Sentry Vercel \\\n integration to set up an auth token for Vercel deployments: https://vercel.com/integrations/sentry\",\n );\n } else {\n await setupCI('nextjs', authToken, options.comingFrom);\n }\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager());\n await runPrettierIfInstalled({\n cwd: undefined,\n });\n\n clack.outro(`\n${chalk.green('Successfully installed the Sentry Next.js SDK!')} ${\n shouldCreateExamplePage\n ? `\\n\\nYou can validate your setup by (re)starting your dev environment (e.g. ${chalk.cyan(\n `${packageManagerForOutro.runScriptCommand} dev`,\n )}) and visiting ${chalk.cyan('\"/sentry-example-page\"')}`\n : ''\n }${\n shouldCreateExamplePage && isLikelyUsingTurbopack\n ? `\\nDon't forget to remove \\`--turbo\\` or \\`--turbopack\\` from your dev command until you have verified the SDK is working. You can safely add it back afterwards.`\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\ntype SDKConfigOptions = {\n tunnelRoute: boolean;\n};\n\nasync function createOrMergeNextJsFiles(\n selectedProject: SentryProjectData,\n selfHosted: boolean,\n sentryUrl: string,\n sdkConfigOptions: SDKConfigOptions,\n) {\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'edge'] as const;\n\n for (const configVariant of configVariants) {\n await traceStep(`create-sentry-${configVariant}-config`, async () => {\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 Sentry.setTag(\n `overwrite-${configVariant}-config`,\n overwriteExistingConfigs,\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.cyan(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryServersideConfigContents(\n selectedProject.keys[0].dsn.public,\n configVariant,\n selectedFeatures,\n ),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created fresh ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n Sentry.setTag(`created-${configVariant}-config`, true);\n }\n });\n }\n\n await traceStep('setup-instrumentation-hook', async () => {\n const hasRootAppDirectory = hasDirectoryPathFromRoot('app');\n const hasRootPagesDirectory = hasDirectoryPathFromRoot('pages');\n const hasSrcDirectory = hasDirectoryPathFromRoot('src');\n\n let instrumentationHookLocation: 'src' | 'root' | 'does-not-exist';\n\n const instrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.ts'),\n );\n const instrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.js'),\n );\n const srcInstrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.ts'),\n );\n const srcInstrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.js'),\n );\n\n // https://nextjs.org/docs/app/building-your-application/configuring/src-directory\n // https://nextjs.org/docs/app/api-reference/file-conventions/instrumentation\n // The logic for where Next.js picks up the instrumentation file is as follows:\n // - If there is either an `app` folder or a `pages` folder in the root directory of your Next.js app, Next.js looks\n // for an `instrumentation.ts` file in the root of the Next.js app.\n // - Otherwise, if there is neither an `app` folder or a `pages` folder in the rood directory of your Next.js app,\n // AND if there is an `src` folder, Next.js will look for the `instrumentation.ts` file in the `src` folder.\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n if (instrumentationJsExists || instrumentationTsExists) {\n instrumentationHookLocation = 'root';\n } else {\n instrumentationHookLocation = 'does-not-exist';\n }\n } else {\n if (srcInstrumentationTsExists || srcInstrumentationJsExists) {\n instrumentationHookLocation = 'src';\n } else {\n instrumentationHookLocation = 'does-not-exist';\n }\n }\n\n const newInstrumentationFileName = `instrumentation.${\n typeScriptDetected ? 'ts' : 'js'\n }`;\n\n if (instrumentationHookLocation === 'does-not-exist') {\n let newInstrumentationHookLocation: 'root' | 'src';\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n newInstrumentationHookLocation = 'root';\n } else if (hasSrcDirectory) {\n newInstrumentationHookLocation = 'src';\n } else {\n newInstrumentationHookLocation = 'root';\n }\n\n const newInstrumentationHookPath =\n newInstrumentationHookLocation === 'root'\n ? path.join(process.cwd(), newInstrumentationFileName)\n : path.join(process.cwd(), 'src', newInstrumentationFileName);\n\n const successfullyCreated = await createNewConfigFile(\n newInstrumentationHookPath,\n getInstrumentationHookContent(newInstrumentationHookLocation),\n );\n\n if (!successfullyCreated) {\n await showCopyPasteInstructions({\n filename: newInstrumentationFileName,\n codeSnippet: getInstrumentationHookCopyPasteSnippet(\n newInstrumentationHookLocation,\n ),\n hint: \"create the file if it doesn't already exist\",\n });\n }\n } else {\n await showCopyPasteInstructions({\n filename:\n srcInstrumentationTsExists || instrumentationTsExists\n ? 'instrumentation.ts'\n : srcInstrumentationJsExists || instrumentationJsExists\n ? 'instrumentation.js'\n : newInstrumentationFileName,\n codeSnippet: getInstrumentationHookCopyPasteSnippet(\n instrumentationHookLocation,\n ),\n });\n }\n });\n\n await traceStep('setup-instrumentation-client-hook', async () => {\n const hasRootAppDirectory = hasDirectoryPathFromRoot('app');\n const hasRootPagesDirectory = hasDirectoryPathFromRoot('pages');\n const hasSrcDirectory = hasDirectoryPathFromRoot('src');\n\n let instrumentationClientHookLocation: 'src' | 'root' | 'does-not-exist';\n\n const instrumentationClientTsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation-client.ts'),\n );\n const instrumentationClientJsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation-client.js'),\n );\n const srcInstrumentationClientTsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation-client.ts'),\n );\n const srcInstrumentationClientJsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation-client.js'),\n );\n\n // https://nextjs.org/docs/app/building-your-application/configuring/src-directory\n // https://nextjs.org/docs/app/api-reference/file-conventions/instrumentation\n // The logic for where Next.js picks up the instrumentation file is as follows:\n // - If there is either an `app` folder or a `pages` folder in the root directory of your Next.js app, Next.js looks\n // for an `instrumentation.ts` file in the root of the Next.js app.\n // - Otherwise, if there is neither an `app` folder or a `pages` folder in the rood directory of your Next.js app,\n // AND if there is an `src` folder, Next.js will look for the `instrumentation.ts` file in the `src` folder.\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n if (instrumentationClientJsExists || instrumentationClientTsExists) {\n instrumentationClientHookLocation = 'root';\n } else {\n instrumentationClientHookLocation = 'does-not-exist';\n }\n } else {\n if (\n srcInstrumentationClientTsExists ||\n srcInstrumentationClientJsExists\n ) {\n instrumentationClientHookLocation = 'src';\n } else {\n instrumentationClientHookLocation = 'does-not-exist';\n }\n }\n\n const newInstrumentationClientFileName = `instrumentation-client.${\n typeScriptDetected ? 'ts' : 'js'\n }`;\n\n if (instrumentationClientHookLocation === 'does-not-exist') {\n let newInstrumentationClientHookLocation: 'root' | 'src';\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n newInstrumentationClientHookLocation = 'root';\n } else if (hasSrcDirectory) {\n newInstrumentationClientHookLocation = 'src';\n } else {\n newInstrumentationClientHookLocation = 'root';\n }\n\n const newInstrumentationClientHookPath =\n newInstrumentationClientHookLocation === 'root'\n ? path.join(process.cwd(), newInstrumentationClientFileName)\n : path.join(process.cwd(), 'src', newInstrumentationClientFileName);\n\n const successfullyCreated = await createNewConfigFile(\n newInstrumentationClientHookPath,\n getInstrumentationClientFileContents(\n selectedProject.keys[0].dsn.public,\n selectedFeatures,\n ),\n );\n\n if (!successfullyCreated) {\n await showCopyPasteInstructions({\n filename: newInstrumentationClientFileName,\n codeSnippet: getInstrumentationClientHookCopyPasteSnippet(\n selectedProject.keys[0].dsn.public,\n selectedFeatures,\n ),\n hint: \"create the file if it doesn't already exist\",\n });\n }\n } else {\n await showCopyPasteInstructions({\n filename:\n srcInstrumentationClientTsExists || instrumentationClientTsExists\n ? 'instrumentation-client.ts'\n : srcInstrumentationClientJsExists || instrumentationClientJsExists\n ? 'instrumentation-client.js'\n : newInstrumentationClientFileName,\n codeSnippet: getInstrumentationClientHookCopyPasteSnippet(\n selectedProject.keys[0].dsn.public,\n selectedFeatures,\n ),\n });\n }\n });\n\n await traceStep('setup-next-config', async () => {\n const withSentryConfigOptionsTemplate = getWithSentryConfigOptionsTemplate({\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n selfHosted,\n sentryUrl,\n tunnelRoute: sdkConfigOptions.tunnelRoute,\n });\n\n const nextConfigPossibleFilesMap = {\n js: 'next.config.js',\n mjs: 'next.config.mjs',\n cjs: 'next.config.cjs',\n ts: 'next.config.ts',\n mts: 'next.config.mts',\n cts: 'next.config.cts',\n };\n\n const foundNextConfigFile = Object.entries(nextConfigPossibleFilesMap).find(\n ([, fileName]) => fs.existsSync(path.join(process.cwd(), fileName)),\n );\n\n if (!foundNextConfigFile) {\n Sentry.setTag('next-config-strategy', 'create');\n\n // Try to figure out whether the user prefers ESM\n let isTypeModule = false;\n try {\n const packageJsonText = await fs.promises.readFile(\n path.join(process.cwd(), 'package.json'),\n 'utf8',\n );\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const packageJson = JSON.parse(packageJsonText);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (packageJson.type === 'module') {\n isTypeModule = true;\n }\n } catch {\n // noop\n }\n\n // We are creating `next.config.(m)js` files by default as they are supported by the most Next.js versions\n const configFilename = isTypeModule\n ? nextConfigPossibleFilesMap.mjs\n : nextConfigPossibleFilesMap.js;\n const configContent = isTypeModule\n ? getNextjsConfigMjsTemplate(withSentryConfigOptionsTemplate)\n : getNextjsConfigCjsTemplate(withSentryConfigOptionsTemplate);\n\n await fs.promises.writeFile(\n path.join(process.cwd(), configFilename),\n configContent,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(configFilename)} with Sentry configuration.`,\n );\n\n return;\n }\n\n const [foundNextConfigFileType, foundNextConfigFileFilename] =\n foundNextConfigFile;\n\n if (foundNextConfigFileType === 'js' || foundNextConfigFileType === 'cjs') {\n Sentry.setTag('next-config-strategy', 'modify');\n\n const nextConfigCjsContent = fs.readFileSync(\n path.join(process.cwd(), foundNextConfigFileFilename),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigCjsContent.includes('@sentry/nextjs') &&\n nextConfigCjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n foundNextConfigFileFilename,\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(), foundNextConfigFileFilename),\n getNextjsConfigCjsAppendix(withSentryConfigOptionsTemplate),\n 'utf8',\n );\n\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n }\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n\n if (\n foundNextConfigFileType === 'mjs' ||\n foundNextConfigFileType === 'mts' ||\n foundNextConfigFileType === 'cts' ||\n foundNextConfigFileType === 'ts'\n ) {\n const nextConfigMjsContent = fs.readFileSync(\n path.join(process.cwd(), foundNextConfigFileFilename),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigMjsContent.includes('@sentry/nextjs') &&\n nextConfigMjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n foundNextConfigFileFilename,\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(nextConfigMjsContent);\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 ${withSentryConfigOptionsTemplate}\n)`);\n const newCode = mod.generate().code;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), foundNextConfigFileFilename),\n newCode,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n } catch {\n Sentry.setTag('next-config-mod-result', 'fail');\n clack.log.warn(\n chalk.yellow(\n `Something went wrong writing to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}.`,\n ),\n );\n clack.log.info(\n `Please put the following code snippet into ${chalk.cyan(\n foundNextConfigFileFilename,\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(withSentryConfigOptionsTemplate),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Are you done putting the snippet above into ${chalk.cyan(\n foundNextConfigFileFilename,\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}\n\nfunction hasDirectoryPathFromRoot(dirnameOrDirs: string | string[]): boolean {\n const dirPath = Array.isArray(dirnameOrDirs)\n ? path.join(process.cwd(), ...dirnameOrDirs)\n : path.join(process.cwd(), dirnameOrDirs);\n\n return fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();\n}\n\nasync function createExamplePage(\n selfHosted: boolean,\n selectedProject: SentryProjectData,\n sentryUrl: string,\n): Promise<void> {\n const hasSrcDirectory = hasDirectoryPathFromRoot('src');\n const hasRootAppDirectory = hasDirectoryPathFromRoot('app');\n const hasRootPagesDirectory = hasDirectoryPathFromRoot('pages');\n const hasSrcAppDirectory = hasDirectoryPathFromRoot(['src', 'app']);\n const hasSrcPagesDirectory = hasDirectoryPathFromRoot(['src', 'pages']);\n\n Sentry.setTag('nextjs-app-dir', hasRootAppDirectory || hasSrcAppDirectory);\n\n const typeScriptDetected = isUsingTypeScript();\n\n // If `pages` or an `app` directory exists in the root, we'll put the example page there.\n // `app` directory takes priority over `pages` directory when they coexist, so we prioritize that.\n // https://nextjs.org/docs/app/building-your-application/routing#the-app-router\n\n const appFolderLocation = hasRootAppDirectory\n ? ['app']\n : hasSrcAppDirectory\n ? ['src', 'app']\n : undefined;\n\n let pagesFolderLocation = hasRootPagesDirectory\n ? ['pages']\n : hasSrcPagesDirectory\n ? ['src', 'pages']\n : undefined;\n\n // If the user has neither pages nor app directory we create a pages folder for them\n if (!appFolderLocation && !pagesFolderLocation) {\n const newPagesFolderLocation = hasSrcDirectory\n ? ['src', 'pages']\n : ['pages'];\n fs.mkdirSync(path.join(process.cwd(), ...newPagesFolderLocation), {\n recursive: true,\n });\n\n pagesFolderLocation = newPagesFolderLocation;\n }\n\n if (appFolderLocation) {\n const appFolderPath = path.join(process.cwd(), ...appFolderLocation);\n\n const hasRootLayout = ['jsx', 'tsx', 'js'].some((ext) =>\n fs.existsSync(path.join(appFolderPath, `layout.${ext}`)),\n );\n\n if (!hasRootLayout) {\n // In case no root layout file exists, we create a simple one so that\n // the example page can be rendered correctly.\n const newRootLayoutFilename = `layout.${\n typeScriptDetected ? 'tsx' : 'jsx'\n }`;\n\n await fs.promises.writeFile(\n path.join(appFolderPath, newRootLayoutFilename),\n getRootLayout(typeScriptDetected),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appFolderLocation, newRootLayoutFilename),\n )}.`,\n );\n }\n\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n sentryUrl,\n useClient: true,\n });\n\n fs.mkdirSync(path.join(appFolderPath, 'sentry-example-page'), {\n recursive: true,\n });\n\n const newPageFileName = `page.${typeScriptDetected ? 'tsx' : 'jsx'}`;\n\n await fs.promises.writeFile(\n path.join(appFolderPath, 'sentry-example-page', newPageFileName),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appFolderLocation, 'sentry-example-page', newPageFileName),\n )}.`,\n );\n\n fs.mkdirSync(path.join(appFolderPath, 'api', 'sentry-example-api'), {\n recursive: true,\n });\n\n const newRouteFileName = `route.${typeScriptDetected ? 'ts' : 'js'}`;\n\n await fs.promises.writeFile(\n path.join(appFolderPath, 'api', 'sentry-example-api', newRouteFileName),\n getSentryExampleAppDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(\n ...appFolderLocation,\n 'api',\n 'sentry-example-api',\n newRouteFileName,\n ),\n )}.`,\n );\n } else if (pagesFolderLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n sentryUrl,\n useClient: false,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesFolderLocation,\n 'sentry-example-page.jsx',\n ),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesFolderLocation, 'sentry-example-page.js'),\n )}.`,\n );\n\n fs.mkdirSync(path.join(process.cwd(), ...pagesFolderLocation, 'api'), {\n recursive: true,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesFolderLocation,\n 'api',\n 'sentry-example-api.js',\n ),\n getSentryExamplePagesDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesFolderLocation, 'api', 'sentry-example-api.js'),\n )}.`,\n );\n }\n}\n\n/**\n * Ask users if they want to set the tunnelRoute option.\n * We can't set this by default because it potentially increases hosting bills.\n * It's valuable enough to for users to justify asking the additional question.\n */\nasync function askShouldSetTunnelRoute() {\n return await traceStep('ask-tunnelRoute-option', async (span) => {\n const shouldSetTunnelRoute = await abortIfCancelled(\n clack.select({\n message:\n 'Do you want to route Sentry requests in the browser through your Next.js server to avoid ad blockers?',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'Can increase your server load and hosting bill',\n },\n {\n label: 'No',\n value: false,\n hint: 'Browser errors and events might be blocked by ad blockers before being sent to Sentry',\n },\n ],\n initialValue: true,\n }),\n );\n\n if (!shouldSetTunnelRoute) {\n clack.log.info(\n \"Sounds good! We'll leave the option commented for later, just in case :)\",\n );\n }\n\n span?.setAttribute('tunnelRoute', shouldSetTunnelRoute);\n Sentry.setTag('tunnelRoute', shouldSetTunnelRoute);\n\n return shouldSetTunnelRoute;\n });\n}\n\n/**\n * Returns true or false depending on whether we think the user is using Turbopack. May return null in case we aren't sure.\n */\nasync function checkIfLikelyIsUsingTurbopack(): Promise<boolean | null> {\n let packageJsonContent: string;\n try {\n packageJsonContent = await fs.promises.readFile(\n path.join(process.cwd(), 'package.json'),\n 'utf8',\n );\n } catch {\n return null;\n }\n\n return packageJsonContent.includes('--turbo');\n}\n"]}
@@ -172,7 +172,9 @@ Sentry.init({
172
172
 
173
173
  // Setting this option to true will print useful information to the console while you're setting up Sentry.
174
174
  debug: false,
175
- });`;
175
+ });
176
+
177
+ export const onRouterTransitionStart = Sentry.captureRouterTransitionStart;`;
176
178
  }
177
179
  exports.getInstrumentationClientFileContents = getInstrumentationClientFileContents;
178
180
  function getSentryExamplePageContents(options) {
@@ -181,10 +183,26 @@ function getSentryExamplePageContents(options) {
181
183
  : `https://${options.orgSlug}.sentry.io/issues/?project=${options.projectId}`;
182
184
  return `${options.useClient ? '"use client";\n\n' : ''}import Head from "next/head";
183
185
  import * as Sentry from "@sentry/nextjs";
184
- import { useState } from "react";
186
+ import { useState, useEffect } from "react";
187
+
188
+ class SentryExampleFrontendError extends Error {
189
+ constructor(message: string | undefined) {
190
+ super(message);
191
+ this.name = "SentryExampleFrontendError";
192
+ }
193
+ }
185
194
 
186
195
  export default function Page() {
187
196
  const [hasSentError, setHasSentError] = useState(false);
197
+ const [isConnected, setIsConnected] = useState(true);
198
+
199
+ useEffect(() => {
200
+ async function checkConnectivity() {
201
+ const result = await Sentry.diagnoseSdkConnectivity();
202
+ setIsConnected(result !== 'sentry-unreachable');
203
+ }
204
+ checkConnectivity();
205
+ }, []);
188
206
 
189
207
  return (
190
208
  <div>
@@ -217,7 +235,7 @@ export default function Page() {
217
235
  const res = await fetch("/api/sentry-example-api");
218
236
  if (!res.ok) {
219
237
  setHasSentError(true);
220
- throw new Error("Sentry Example Frontend Error");
238
+ throw new SentryExampleFrontendError("This error is raised on the frontend of the example page.");
221
239
  }
222
240
  });
223
241
  }}
@@ -231,11 +249,16 @@ export default function Page() {
231
249
  <p className="success">
232
250
  Sample error was sent to Sentry.
233
251
  </p>
252
+ ) : !isConnected ? (
253
+ <div className="connectivity-error">
254
+ <p>The Sentry SDK is not able to reach Sentry right now - this may be due to an adblocker. For more information, see <a target="_blank" href="https://docs.sentry.io/platforms/javascript/guides/nextjs/troubleshooting/#the-sdk-is-not-sending-any-data">the troubleshooting guide</a>.</p>
255
+ </div>
234
256
  ) : (
235
257
  <div className="success_placeholder" />
236
258
  )}
237
259
 
238
260
  <div className="flex-spacer" />
261
+
239
262
  <p className="description">
240
263
  Adblockers will prevent errors from being sent to Sentry.
241
264
  </p>
@@ -336,6 +359,22 @@ export default function Page() {
336
359
  .success_placeholder {
337
360
  height: 46px;
338
361
  }
362
+
363
+ .connectivity-error {
364
+ padding: 12px 16px;
365
+ background-color: #E50045;
366
+ border-radius: 8px;
367
+ width: 500px;
368
+ color: #FFFFFF;
369
+ border: 1px solid #A80033;
370
+ text-align: center;
371
+ margin: 0;
372
+ }
373
+
374
+ .connectivity-error a {
375
+ color: #FFFFFF;
376
+ text-decoration: underline;
377
+ }
339
378
  \`}</style>
340
379
  </div>
341
380
  );
@@ -344,10 +383,17 @@ export default function Page() {
344
383
  }
345
384
  exports.getSentryExamplePageContents = getSentryExamplePageContents;
346
385
  function getSentryExamplePagesDirApiRoute() {
347
- return `// A faulty API route to test Sentry's error monitoring
386
+ return `// Custom error class for Sentry testing
387
+ class SentryExampleAPIError extends Error {
388
+ constructor(message: string | undefined) {
389
+ super(message);
390
+ this.name = "SentryExampleAPIError";
391
+ }
392
+ }
393
+ // A faulty API route to test Sentry's error monitoring
348
394
  export default function handler(_req, res) {
349
- throw new Error("Sentry Example API Route Error");
350
- res.status(200).json({ name: "John Doe" });
395
+ throw new SentryExampleAPIError("This error is raised on the backend called by the example page.");
396
+ res.status(200).json({ name: "John Doe" });
351
397
  }
352
398
  `;
353
399
  }
@@ -356,10 +402,15 @@ function getSentryExampleAppDirApiRoute() {
356
402
  return `import { NextResponse } from "next/server";
357
403
 
358
404
  export const dynamic = "force-dynamic";
359
-
405
+ class SentryExampleAPIError extends Error {
406
+ constructor(message: string | undefined) {
407
+ super(message);
408
+ this.name = "SentryExampleAPIError";
409
+ }
410
+ }
360
411
  // A faulty API route to test Sentry's error monitoring
361
412
  export function GET() {
362
- throw new Error("Sentry Example API Route Error");
413
+ throw new SentryExampleAPIError("This error is raised on the backend called by the example page.");
363
414
  return NextResponse.json({ data: "Testing Sentry Error..." });
364
415
  }
365
416
  `;