@sentry/wizard 6.11.0 → 6.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/dist/bin.js +16 -1
  3. package/dist/bin.js.map +1 -1
  4. package/dist/e2e-tests/tests/angular-17.test.js +3 -4
  5. package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
  6. package/dist/e2e-tests/tests/angular-19.test.js +3 -4
  7. package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
  8. package/dist/e2e-tests/tests/cloudflare-worker.test.js +5 -0
  9. package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -1
  10. package/dist/e2e-tests/tests/flutter.test.js +60 -0
  11. package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
  12. package/dist/e2e-tests/tests/help-message.test.js +8 -3
  13. package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
  14. package/dist/e2e-tests/tests/nuxt-3.test.js +12 -6
  15. package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
  16. package/dist/e2e-tests/tests/nuxt-4.test.js +12 -6
  17. package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
  18. package/dist/e2e-tests/tests/pnpm-workspace.test.js +8 -4
  19. package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
  20. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js +96 -0
  21. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js.map +1 -0
  22. package/dist/e2e-tests/tests/react-router.test.js +6 -7
  23. package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
  24. package/dist/e2e-tests/tests/remix.test.js +2 -4
  25. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  26. package/dist/e2e-tests/tests/sveltekit-hooks.test.js +24 -8
  27. package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
  28. package/dist/e2e-tests/tests/sveltekit-tracing.test.js +8 -4
  29. package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
  30. package/dist/lib/Constants.d.ts +1 -0
  31. package/dist/lib/Constants.js +5 -0
  32. package/dist/lib/Constants.js.map +1 -1
  33. package/dist/lib/Steps/Integrations/Electron.js +2 -2
  34. package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
  35. package/dist/src/android/android-wizard.js +3 -0
  36. package/dist/src/android/android-wizard.js.map +1 -1
  37. package/dist/src/angular/codemods/main.d.ts +1 -1
  38. package/dist/src/angular/codemods/main.js +0 -1
  39. package/dist/src/angular/codemods/main.js.map +1 -1
  40. package/dist/src/apple/apple-wizard.js +2 -3
  41. package/dist/src/apple/apple-wizard.js.map +1 -1
  42. package/dist/src/apple/check-installed-cli.d.ts +1 -1
  43. package/dist/src/apple/check-installed-cli.js +13 -7
  44. package/dist/src/apple/check-installed-cli.js.map +1 -1
  45. package/dist/src/apple/code-tools.js +17 -3
  46. package/dist/src/apple/code-tools.js.map +1 -1
  47. package/dist/src/apple/configure-package-manager.js +18 -5
  48. package/dist/src/apple/configure-package-manager.js.map +1 -1
  49. package/dist/src/apple/configure-xcode-project.js +8 -1
  50. package/dist/src/apple/configure-xcode-project.js.map +1 -1
  51. package/dist/src/apple/lookup-xcode-project.d.ts +8 -5
  52. package/dist/src/apple/lookup-xcode-project.js +22 -17
  53. package/dist/src/apple/lookup-xcode-project.js.map +1 -1
  54. package/dist/src/apple/options.d.ts +5 -0
  55. package/dist/src/apple/options.js.map +1 -1
  56. package/dist/src/apple/sentry-swift-package.d.ts +4 -0
  57. package/dist/src/apple/sentry-swift-package.js +17 -0
  58. package/dist/src/apple/sentry-swift-package.js.map +1 -0
  59. package/dist/src/apple/snapshots/apple-snapshots-wizard.d.ts +2 -0
  60. package/dist/src/apple/snapshots/apple-snapshots-wizard.js +251 -0
  61. package/dist/src/apple/snapshots/apple-snapshots-wizard.js.map +1 -0
  62. package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.d.ts +13 -0
  63. package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.js +48 -0
  64. package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.js.map +1 -0
  65. package/dist/src/apple/snapshots/snapshot-test-file.d.ts +18 -0
  66. package/dist/src/apple/snapshots/snapshot-test-file.js +122 -0
  67. package/dist/src/apple/snapshots/snapshot-test-file.js.map +1 -0
  68. package/dist/src/apple/snapshots/snapshot-verification-scheme.d.ts +6 -0
  69. package/dist/src/apple/snapshots/snapshot-verification-scheme.js +147 -0
  70. package/dist/src/apple/snapshots/snapshot-verification-scheme.js.map +1 -0
  71. package/dist/src/apple/snapshots/snapshotpreviews-package.d.ts +4 -0
  72. package/dist/src/apple/snapshots/snapshotpreviews-package.js +8 -0
  73. package/dist/src/apple/snapshots/snapshotpreviews-package.js.map +1 -0
  74. package/dist/src/apple/snapshots/snapshots-cli-preflight.d.ts +23 -0
  75. package/dist/src/apple/snapshots/snapshots-cli-preflight.js +136 -0
  76. package/dist/src/apple/snapshots/snapshots-cli-preflight.js.map +1 -0
  77. package/dist/src/apple/xcode-manager.d.ts +59 -1
  78. package/dist/src/apple/xcode-manager.js +507 -106
  79. package/dist/src/apple/xcode-manager.js.map +1 -1
  80. package/dist/src/cloudflare/cloudflare-wizard.js +5 -0
  81. package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -1
  82. package/dist/src/cloudflare/sdk-setup.d.ts +1 -0
  83. package/dist/src/cloudflare/sdk-setup.js.map +1 -1
  84. package/dist/src/cloudflare/templates.d.ts +1 -0
  85. package/dist/src/cloudflare/templates.js +7 -1
  86. package/dist/src/cloudflare/templates.js.map +1 -1
  87. package/dist/src/cloudflare/wrap-worker.d.ts +1 -0
  88. package/dist/src/cloudflare/wrap-worker.js +7 -0
  89. package/dist/src/cloudflare/wrap-worker.js.map +1 -1
  90. package/dist/src/flutter/flutter-wizard.js +3 -0
  91. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  92. package/dist/src/nextjs/templates.js +12 -6
  93. package/dist/src/nextjs/templates.js.map +1 -1
  94. package/dist/src/nuxt/templates.js +12 -6
  95. package/dist/src/nuxt/templates.js.map +1 -1
  96. package/dist/src/react-native/expo.d.ts +6 -0
  97. package/dist/src/react-native/expo.js +27 -1
  98. package/dist/src/react-native/expo.js.map +1 -1
  99. package/dist/src/react-native/git.d.ts +5 -0
  100. package/dist/src/react-native/git.js +32 -1
  101. package/dist/src/react-native/git.js.map +1 -1
  102. package/dist/src/react-native/javascript.js +3 -1
  103. package/dist/src/react-native/javascript.js.map +1 -1
  104. package/dist/src/react-native/react-native-wizard.js +12 -6
  105. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  106. package/dist/src/react-router/codemods/client.entry.d.ts +1 -1
  107. package/dist/src/react-router/codemods/client.entry.js +124 -26
  108. package/dist/src/react-router/codemods/client.entry.js.map +1 -1
  109. package/dist/src/react-router/codemods/react-router-config.js +1 -1
  110. package/dist/src/react-router/codemods/react-router-config.js.map +1 -1
  111. package/dist/src/react-router/codemods/server-entry.d.ts +1 -1
  112. package/dist/src/react-router/codemods/server-entry.js +40 -4
  113. package/dist/src/react-router/codemods/server-entry.js.map +1 -1
  114. package/dist/src/react-router/codemods/vite.js +46 -1
  115. package/dist/src/react-router/codemods/vite.js.map +1 -1
  116. package/dist/src/react-router/react-router-wizard.js +62 -21
  117. package/dist/src/react-router/react-router-wizard.js.map +1 -1
  118. package/dist/src/react-router/sdk-setup.d.ts +5 -3
  119. package/dist/src/react-router/sdk-setup.js +44 -16
  120. package/dist/src/react-router/sdk-setup.js.map +1 -1
  121. package/dist/src/react-router/templates.d.ts +2 -4
  122. package/dist/src/react-router/templates.js +89 -87
  123. package/dist/src/react-router/templates.js.map +1 -1
  124. package/dist/src/remix/sdk-setup.js +1 -2
  125. package/dist/src/remix/sdk-setup.js.map +1 -1
  126. package/dist/src/run.d.ts +4 -1
  127. package/dist/src/run.js +13 -0
  128. package/dist/src/run.js.map +1 -1
  129. package/dist/src/sourcemaps/tools/remix.js +4 -4
  130. package/dist/src/sourcemaps/tools/remix.js.map +1 -1
  131. package/dist/src/sourcemaps/tools/vite.js +1 -1
  132. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  133. package/dist/src/sveltekit/sdk-setup/setup.js +17 -4
  134. package/dist/src/sveltekit/sdk-setup/setup.js.map +1 -1
  135. package/dist/src/sveltekit/sdk-setup/vite.js +1 -1
  136. package/dist/src/sveltekit/sdk-setup/vite.js.map +1 -1
  137. package/dist/src/sveltekit/templates.js +12 -6
  138. package/dist/src/sveltekit/templates.js.map +1 -1
  139. package/dist/src/utils/ast-utils.d.ts +10 -0
  140. package/dist/src/utils/ast-utils.js +19 -1
  141. package/dist/src/utils/ast-utils.js.map +1 -1
  142. package/dist/src/utils/clack/index.d.ts +2 -1
  143. package/dist/src/utils/clack/index.js +17 -6
  144. package/dist/src/utils/clack/index.js.map +1 -1
  145. package/dist/src/utils/files.d.ts +2 -0
  146. package/dist/src/utils/files.js +58 -0
  147. package/dist/src/utils/files.js.map +1 -0
  148. package/dist/src/utils/git.d.ts +3 -1
  149. package/dist/src/utils/git.js +2 -1
  150. package/dist/src/utils/git.js.map +1 -1
  151. package/dist/src/utils/line-endings.d.ts +1 -0
  152. package/dist/src/utils/line-endings.js +76 -0
  153. package/dist/src/utils/line-endings.js.map +1 -0
  154. package/dist/src/version.d.ts +1 -1
  155. package/dist/src/version.js +1 -1
  156. package/dist/src/version.js.map +1 -1
  157. package/dist/test/angular/angular-wizard.test.js +0 -5
  158. package/dist/test/angular/angular-wizard.test.js.map +1 -1
  159. package/dist/test/apple/code-tools.test.js +78 -0
  160. package/dist/test/apple/code-tools.test.js.map +1 -1
  161. package/dist/test/apple/configure-package-manager.test.d.ts +1 -0
  162. package/dist/test/apple/configure-package-manager.test.js +161 -0
  163. package/dist/test/apple/configure-package-manager.test.js.map +1 -0
  164. package/dist/test/apple/lookup-xcode-project.test.d.ts +1 -0
  165. package/dist/test/apple/lookup-xcode-project.test.js +167 -0
  166. package/dist/test/apple/lookup-xcode-project.test.js.map +1 -0
  167. package/dist/test/apple/snapshots/apple-snapshots-wizard.test.d.ts +1 -0
  168. package/dist/test/apple/snapshots/apple-snapshots-wizard.test.js +487 -0
  169. package/dist/test/apple/snapshots/apple-snapshots-wizard.test.js.map +1 -0
  170. package/dist/test/apple/snapshots/hosted-test-target-fixture.d.ts +24 -0
  171. package/dist/test/apple/snapshots/hosted-test-target-fixture.js +191 -0
  172. package/dist/test/apple/snapshots/hosted-test-target-fixture.js.map +1 -0
  173. package/dist/test/apple/snapshots/snapshot-test-file.test.d.ts +1 -0
  174. package/dist/test/apple/snapshots/snapshot-test-file.test.js +110 -0
  175. package/dist/test/apple/snapshots/snapshot-test-file.test.js.map +1 -0
  176. package/dist/test/apple/snapshots/snapshot-verification-scheme.test.d.ts +1 -0
  177. package/dist/test/apple/snapshots/snapshot-verification-scheme.test.js +146 -0
  178. package/dist/test/apple/snapshots/snapshot-verification-scheme.test.js.map +1 -0
  179. package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.d.ts +1 -0
  180. package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.js +186 -0
  181. package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.js.map +1 -0
  182. package/dist/test/apple/snapshots/snapshots-cli-preflight.test.d.ts +1 -0
  183. package/dist/test/apple/snapshots/snapshots-cli-preflight.test.js +192 -0
  184. package/dist/test/apple/snapshots/snapshots-cli-preflight.test.js.map +1 -0
  185. package/dist/test/apple/snapshots/source-file-insertion.test.d.ts +1 -0
  186. package/dist/test/apple/snapshots/source-file-insertion.test.js +77 -0
  187. package/dist/test/apple/snapshots/source-file-insertion.test.js.map +1 -0
  188. package/dist/test/apple/xcode-manager.test.js +452 -43
  189. package/dist/test/apple/xcode-manager.test.js.map +1 -1
  190. package/dist/test/cloudflare/sdk-setup.test.js +20 -2
  191. package/dist/test/cloudflare/sdk-setup.test.js.map +1 -1
  192. package/dist/test/cloudflare/templates.test.js +54 -0
  193. package/dist/test/cloudflare/templates.test.js.map +1 -1
  194. package/dist/test/cloudflare/wrap-worker.test.js +74 -11
  195. package/dist/test/cloudflare/wrap-worker.test.js.map +1 -1
  196. package/dist/test/constants.test.d.ts +1 -0
  197. package/dist/test/constants.test.js +12 -0
  198. package/dist/test/constants.test.js.map +1 -0
  199. package/dist/test/nextjs/templates.test.js +66 -33
  200. package/dist/test/nextjs/templates.test.js.map +1 -1
  201. package/dist/test/nuxt/templates.test.js +66 -36
  202. package/dist/test/nuxt/templates.test.js.map +1 -1
  203. package/dist/test/react-native/expo.test.js +140 -0
  204. package/dist/test/react-native/expo.test.js.map +1 -1
  205. package/dist/test/react-native/git.test.d.ts +1 -0
  206. package/dist/test/react-native/git.test.js +160 -0
  207. package/dist/test/react-native/git.test.js.map +1 -0
  208. package/dist/test/react-router/codemods/client-entry.test.js +38 -5
  209. package/dist/test/react-router/codemods/client-entry.test.js.map +1 -1
  210. package/dist/test/react-router/codemods/server-entry.test.js +83 -0
  211. package/dist/test/react-router/codemods/server-entry.test.js.map +1 -1
  212. package/dist/test/react-router/codemods/vite.test.js +89 -0
  213. package/dist/test/react-router/codemods/vite.test.js.map +1 -1
  214. package/dist/test/react-router/sdk-setup.test.js +98 -6
  215. package/dist/test/react-router/sdk-setup.test.js.map +1 -1
  216. package/dist/test/react-router/templates.test.js +50 -38
  217. package/dist/test/react-router/templates.test.js.map +1 -1
  218. package/dist/test/remix/build-script.test.d.ts +1 -0
  219. package/dist/test/remix/build-script.test.js +124 -0
  220. package/dist/test/remix/build-script.test.js.map +1 -0
  221. package/dist/test/remix/client-entry.test.js +4 -10
  222. package/dist/test/remix/client-entry.test.js.map +1 -1
  223. package/dist/test/run.test.d.ts +1 -0
  224. package/dist/test/run.test.js +137 -0
  225. package/dist/test/run.test.js.map +1 -0
  226. package/dist/test/sourcemaps/tools/vite.test.js +12 -8
  227. package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
  228. package/dist/test/sveltekit/templates.test.js +78 -27
  229. package/dist/test/sveltekit/templates.test.js.map +1 -1
  230. package/dist/test/utils/ast-utils.test.js +22 -0
  231. package/dist/test/utils/ast-utils.test.js.map +1 -1
  232. package/dist/test/utils/clack/index.test.js +101 -0
  233. package/dist/test/utils/clack/index.test.js.map +1 -1
  234. package/dist/test/utils/git.test.js +10 -0
  235. package/dist/test/utils/git.test.js.map +1 -1
  236. package/dist/test/utils/line-endings.test.d.ts +1 -0
  237. package/dist/test/utils/line-endings.test.js +103 -0
  238. package/dist/test/utils/line-endings.test.js.map +1 -0
  239. package/package.json +2 -2
  240. package/dist/src/react-router/codemods/root.d.ts +0 -1
  241. package/dist/src/react-router/codemods/root.js +0 -171
  242. package/dist/src/react-router/codemods/root.js.map +0 -1
  243. package/dist/test/react-router/codemods/root.test.js +0 -178
  244. package/dist/test/react-router/codemods/root.test.js.map +0 -1
  245. /package/dist/{test/react-router/codemods/root.test.d.ts → e2e-tests/tests/react-router-instrumentation-api.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"react-router-wizard.js","sourceRoot":"","sources":["../../../src/react-router/react-router-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\n\nimport type { WizardOptions } from '../utils/types';\nimport { withTelemetry, traceStep } from '../telemetry';\nimport {\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n isUsingTypeScript,\n printWelcome,\n installPackage,\n addDotEnvSentryBuildPluginFile,\n showCopyPasteInstructions,\n makeCodeSnippet,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { offerProjectScopedMcpConfig } from '../utils/clack/mcp-config';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport { debug } from '../utils/debug';\nimport { createExamplePage } from './sdk-example';\nimport {\n isReactRouterV7,\n runReactRouterReveal,\n initializeSentryOnEntryClient,\n instrumentRootRoute,\n createServerInstrumentationFile,\n updatePackageJsonScripts,\n instrumentSentryOnEntryServer,\n configureReactRouterConfig,\n configureReactRouterVitePlugin,\n} from './sdk-setup';\nimport {\n getManualClientEntryContent,\n getManualServerEntryContent,\n getManualRootContent,\n getManualServerInstrumentContent,\n getManualReactRouterConfigContent,\n getManualViteConfigContent,\n} from './templates';\nimport { abortIfSpotlightNotSupported } from '../utils/abort-if-sportlight-not-supported';\n\nexport async function runReactRouterWizard(\n options: WizardOptions,\n): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'reactRouter',\n wizardOptions: options,\n },\n () => runReactRouterWizardWithTelemetry(options),\n );\n}\n\nasync function runReactRouterWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry React Router Wizard',\n promoCode: options.promoCode,\n });\n\n const packageJson = await getPackageDotJson();\n\n if (!packageJson) {\n clack.log.error(\n 'Could not find a package.json file in the current directory',\n );\n return;\n }\n\n const typeScriptDetected = isUsingTypeScript();\n\n if (!isReactRouterV7(packageJson)) {\n clack.log.error(\n 'This wizard requires React Router v7. Please upgrade your React Router version to v7.0.0 or higher.\\n\\nFor upgrade instructions, visit: https://react-router.dev/upgrade/v7',\n );\n return;\n }\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const sentryAlreadyInstalled = hasPackageInstalled(\n '@sentry/react-router',\n packageJson,\n );\n\n const projectData = await getOrAskForProjectData(\n options,\n 'javascript-react-router',\n );\n\n if (projectData.spotlight) {\n return abortIfSpotlightNotSupported('React Router');\n }\n\n const { selectedProject, authToken, selfHosted, sentryUrl } = projectData;\n\n await installPackage({\n packageName: '@sentry/react-router',\n alreadyInstalled: sentryAlreadyInstalled,\n });\n\n const featureSelection = 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 {\n id: 'logs',\n prompt: `Do you want to enable ${chalk.bold(\n 'Logs',\n )} to send your application logs to Sentry?`,\n enabledHint: 'recommended',\n },\n {\n id: 'profiling',\n prompt: `Do you want to enable ${chalk.bold(\n 'Profiling',\n )} to track application performance in detail?`,\n enabledHint: 'recommended for production debugging',\n },\n ]);\n\n if (featureSelection.profiling) {\n const profilingAlreadyInstalled = hasPackageInstalled(\n '@sentry/profiling-node',\n packageJson,\n );\n\n await installPackage({\n packageName: '@sentry/profiling-node',\n alreadyInstalled: profilingAlreadyInstalled,\n });\n }\n\n const createExamplePageSelection = await askShouldCreateExamplePage();\n\n traceStep('Reveal missing entry files', () => {\n try {\n runReactRouterReveal();\n clack.log.success('Entry files are ready for instrumentation');\n } catch (e) {\n clack.log.warn(`Could not run 'npx react-router reveal'.\nPlease create your entry files manually using React Router v7 commands.`);\n debug(e);\n }\n });\n\n await traceStep('Initialize Sentry on client entry', async () => {\n try {\n await initializeSentryOnEntryClient(\n selectedProject.keys[0].dsn.public,\n featureSelection.performance,\n featureSelection.replay,\n featureSelection.logs,\n typeScriptDetected,\n );\n } catch (e) {\n clack.log.warn(\n `Could not initialize Sentry on client entry automatically.`,\n );\n\n const clientEntryFilename = `entry.client.${\n typeScriptDetected ? 'tsx' : 'jsx'\n }`;\n\n const manualClientContent = getManualClientEntryContent(\n selectedProject.keys[0].dsn.public,\n featureSelection.performance,\n featureSelection.replay,\n featureSelection.logs,\n );\n\n await showCopyPasteInstructions({\n filename: clientEntryFilename,\n codeSnippet: manualClientContent,\n hint: 'This enables error tracking and performance monitoring for your React Router app',\n });\n\n debug(e);\n }\n });\n\n await traceStep('Instrument root route', async () => {\n try {\n await instrumentRootRoute(typeScriptDetected);\n } catch (e) {\n clack.log.warn(`Could not instrument root route automatically.`);\n\n const rootFilename = `app/root.${typeScriptDetected ? 'tsx' : 'jsx'}`;\n const manualRootContent = getManualRootContent(typeScriptDetected);\n\n await showCopyPasteInstructions({\n filename: rootFilename,\n codeSnippet: manualRootContent,\n hint: 'This adds error boundary integration to capture exceptions in your React Router app',\n });\n\n debug(e);\n }\n });\n\n await traceStep('Instrument server entry', async () => {\n try {\n await instrumentSentryOnEntryServer(typeScriptDetected);\n } catch (e) {\n clack.log.warn(\n `Could not initialize Sentry on server entry automatically.`,\n );\n\n const serverEntryFilename = `entry.server.${\n typeScriptDetected ? 'tsx' : 'jsx'\n }`;\n const manualServerContent = getManualServerEntryContent();\n\n await showCopyPasteInstructions({\n filename: serverEntryFilename,\n codeSnippet: manualServerContent,\n hint: 'This configures server-side request handling and error tracking',\n });\n\n debug(e);\n }\n });\n\n await traceStep('Create server instrumentation file', async () => {\n try {\n createServerInstrumentationFile(selectedProject.keys[0].dsn.public, {\n performance: featureSelection.performance,\n replay: featureSelection.replay,\n logs: featureSelection.logs,\n profiling: featureSelection.profiling,\n });\n } catch (e) {\n clack.log.warn(\n 'Could not create a server instrumentation file automatically.',\n );\n\n const manualServerInstrumentContent = getManualServerInstrumentContent(\n selectedProject.keys[0].dsn.public,\n featureSelection.performance,\n featureSelection.profiling,\n featureSelection.logs,\n );\n\n await showCopyPasteInstructions({\n filename: 'instrument.server.mjs',\n codeSnippet: manualServerInstrumentContent,\n hint: 'Create the file if it does not exist - this initializes Sentry before your application starts',\n });\n\n debug(e);\n }\n });\n\n await traceStep('Update package.json scripts', async () => {\n try {\n await updatePackageJsonScripts();\n } catch (e) {\n clack.log.warn('Could not update start script automatically.');\n\n await showCopyPasteInstructions({\n filename: 'package.json',\n codeSnippet: makeCodeSnippet(true, (unchanged, plus, minus) => {\n return unchanged(`{\n scripts: {\n ${minus('\"start\": \"react-router dev\"')}\n ${plus(\n '\"start\": \"NODE_OPTIONS=\\'--import ./instrument.server.mjs\\' react-router-serve ./build/server/index.js\"',\n )}\n ${minus('\"dev\": \"react-router dev\"')}\n ${plus(\n '\"dev\": \"NODE_OPTIONS=\\'--import ./instrument.server.mjs\\' react-router dev\"',\n )}\n },\n // ... rest of your package.json\n }`);\n }),\n });\n\n debug(e);\n }\n });\n\n await traceStep('Create build plugin env file', async () => {\n try {\n await addDotEnvSentryBuildPluginFile(authToken);\n } catch (e) {\n clack.log.warn(\n 'Could not create .env.sentry-build-plugin file. Please create it manually.',\n );\n debug(e);\n }\n });\n\n // Validate auth token before configuring sourcemap uploads\n if (!authToken) {\n clack.log.warn(\n `${chalk.yellow(\n 'Warning:',\n )} No auth token found. Sourcemap uploads will not work without ${chalk.cyan(\n 'SENTRY_AUTH_TOKEN',\n )}.\\n` +\n `Please set ${chalk.cyan('SENTRY_AUTH_TOKEN')} in your ${chalk.cyan(\n '.env.sentry-build-plugin',\n )} file or environment variables.`,\n );\n }\n\n // Configure Vite plugin for sourcemap uploads\n await traceStep('Configure Vite plugin for sourcemap uploads', async () => {\n try {\n await configureReactRouterVitePlugin(\n selectedProject.organization.slug,\n selectedProject.slug,\n );\n } catch (e) {\n clack.log.warn(\n `Could not configure Vite plugin for sourcemap uploads automatically.`,\n );\n\n await showCopyPasteInstructions({\n filename: `vite.config.${typeScriptDetected ? 'ts' : 'js'}`,\n codeSnippet: getManualViteConfigContent(\n selectedProject.organization.slug,\n selectedProject.slug,\n ),\n hint: 'This enables automatic sourcemap uploads during build for better error tracking',\n });\n\n debug(e);\n }\n });\n\n // Configure React Router config for build hook\n await traceStep('Configure React Router build hook', async () => {\n try {\n await configureReactRouterConfig(typeScriptDetected);\n } catch (e) {\n clack.log.warn(\n `Could not configure React Router build hook automatically.`,\n );\n\n await showCopyPasteInstructions({\n filename: `react-router.config.${typeScriptDetected ? 'ts' : 'js'}`,\n codeSnippet: getManualReactRouterConfigContent(typeScriptDetected),\n hint: 'This enables automatic sourcemap uploads at the end of the build process',\n });\n\n debug(e);\n }\n });\n\n // Create example page if requested\n if (createExamplePageSelection) {\n await traceStep('Create example page', async () => {\n await createExamplePage({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\n isTS: typeScriptDetected,\n projectDir: process.cwd(),\n });\n });\n }\n\n await runPrettierIfInstalled({ cwd: undefined });\n\n // Offer optional project-scoped MCP config for Sentry with org and project scope\n await offerProjectScopedMcpConfig(\n selectedProject.organization.slug,\n selectedProject.slug,\n );\n\n clack.outro(\n `${chalk.green('Successfully installed the Sentry React Router SDK!')}${\n createExamplePageSelection\n ? `\\n\\nYou can validate your setup by visiting ${chalk.cyan(\n '\"/sentry-example-page\"',\n )} in your application.`\n : ''\n }`,\n );\n}\n"]}
1
+ {"version":3,"file":"react-router-wizard.js","sourceRoot":"","sources":["../../../src/react-router/react-router-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["// @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 Sentry from '@sentry/node';\n\nimport type { WizardOptions } from '../utils/types';\nimport { withTelemetry, traceStep } from '../telemetry';\nimport {\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n isUsingTypeScript,\n printWelcome,\n installPackage,\n addDotEnvSentryBuildPluginFile,\n showCopyPasteInstructions,\n makeCodeSnippet,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { offerProjectScopedMcpConfig } from '../utils/clack/mcp-config';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport { debug } from '../utils/debug';\nimport { createExamplePage } from './sdk-example';\nimport {\n isReactRouterV7,\n getReactRouterVersion,\n supportsInstrumentationAPI,\n supportsOnError,\n runReactRouterReveal,\n initializeSentryOnEntryClient,\n createServerInstrumentationFile,\n updatePackageJsonScripts,\n instrumentSentryOnEntryServer,\n configureReactRouterConfig,\n configureReactRouterVitePlugin,\n} from './sdk-setup';\nimport {\n getManualClientEntryContent,\n getManualServerEntryContent,\n getManualServerInstrumentContent,\n getManualReactRouterConfigContent,\n getManualViteConfigContent,\n} from './templates';\nimport { abortIfSpotlightNotSupported } from '../utils/abort-if-sportlight-not-supported';\n\nexport async function runReactRouterWizard(\n options: WizardOptions,\n): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'reactRouter',\n wizardOptions: options,\n },\n () => runReactRouterWizardWithTelemetry(options),\n );\n}\n\nasync function runReactRouterWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry React Router Wizard',\n promoCode: options.promoCode,\n });\n\n const packageJson = await getPackageDotJson();\n\n if (!packageJson) {\n clack.log.error(\n 'Could not find a package.json file in the current directory',\n );\n return;\n }\n\n const typeScriptDetected = isUsingTypeScript();\n\n if (!isReactRouterV7(packageJson)) {\n clack.log.error(\n 'This wizard requires React Router v7. Please upgrade your React Router version to v7.0.0 or higher.\\n\\nFor upgrade instructions, visit: https://react-router.dev/upgrade/v7',\n );\n return;\n }\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const sentryAlreadyInstalled = hasPackageInstalled(\n '@sentry/react-router',\n packageJson,\n );\n\n const projectData = await getOrAskForProjectData(\n options,\n 'javascript-react-router',\n );\n\n if (projectData.spotlight) {\n return abortIfSpotlightNotSupported('React Router');\n }\n\n const { selectedProject, authToken, selfHosted, sentryUrl } = projectData;\n\n await installPackage({\n packageName: '@sentry/react-router',\n alreadyInstalled: sentryAlreadyInstalled,\n });\n\n const featureSelection = 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 {\n id: 'logs',\n prompt: `Do you want to enable ${chalk.bold(\n 'Logs',\n )} to send your application logs to Sentry?`,\n enabledHint: 'recommended',\n },\n {\n id: 'profiling',\n prompt: `Do you want to enable ${chalk.bold(\n 'Profiling',\n )} to track application performance in detail?`,\n enabledHint: 'recommended for production debugging',\n },\n ]);\n\n // Only ask about Instrumentation API when Tracing is enabled, since it depends on it\n let instrumentationAPISelected = false;\n if (featureSelection.performance) {\n const instrumentationAPISelection = await featureSelectionPrompt([\n {\n id: 'instrumentationAPI',\n prompt: `Do you want to use the ${chalk.bold(\n 'Instrumentation API',\n )} for automatic tracing of loaders, actions, and middleware?`,\n enabledHint: 'recommended',\n },\n ]);\n instrumentationAPISelected = instrumentationAPISelection.instrumentationAPI;\n }\n\n if (featureSelection.profiling) {\n const profilingAlreadyInstalled = hasPackageInstalled(\n '@sentry/profiling-node',\n packageJson,\n );\n\n await installPackage({\n packageName: '@sentry/profiling-node',\n alreadyInstalled: profilingAlreadyInstalled,\n });\n }\n\n const createExamplePageSelection = await askShouldCreateExamplePage();\n\n traceStep('Reveal missing entry files', () => {\n try {\n runReactRouterReveal();\n clack.log.success('Entry files are ready for instrumentation');\n } catch (e) {\n clack.log.warn(`Could not run 'npx react-router reveal'.\nPlease create your entry files manually using React Router v7 commands.`);\n debug(e);\n }\n });\n\n Sentry.setTag('instrumentation-api-selected', instrumentationAPISelected);\n\n let useInstrumentationAPI = instrumentationAPISelected;\n\n if (useInstrumentationAPI && !supportsInstrumentationAPI(packageJson)) {\n Sentry.setTag('instrumentation-api-version-guard', true);\n const detectedVersion = getReactRouterVersion(packageJson) ?? 'unknown';\n clack.log.warn(\n `The Instrumentation API requires React Router ${chalk.cyan(\n '>=7.15.0',\n )} (detected ${chalk.cyan(\n detectedVersion,\n )}). Your version does not meet this requirement.\\n` +\n `Continuing without the Instrumentation API. Please upgrade React Router to use this feature:\\n` +\n chalk.dim(\n 'https://docs.sentry.io/platforms/javascript/guides/react-router/',\n ),\n );\n useInstrumentationAPI = false;\n }\n\n Sentry.setTag('use-instrumentation-api', useInstrumentationAPI);\n\n let useOnError = true;\n\n if (!supportsOnError(packageJson)) {\n Sentry.setTag('on-error-version-guard', true);\n const detectedVersion = getReactRouterVersion(packageJson) ?? 'unknown';\n clack.log.warn(\n `The ${chalk.cyan(\n 'onError',\n )} prop on HydratedRouter requires React Router ${chalk.cyan(\n '>=7.11.0',\n )} (detected ${chalk.cyan(detectedVersion)}).\\n` +\n `Skipping automatic error handler setup. Please upgrade React Router and follow the manual setup guide:\\n` +\n chalk.dim(\n 'https://docs.sentry.io/platforms/javascript/guides/react-router/',\n ),\n );\n useOnError = false;\n }\n\n Sentry.setTag('use-on-error', useOnError);\n\n await traceStep('Initialize Sentry on client entry', async () => {\n try {\n await initializeSentryOnEntryClient(\n selectedProject.keys[0].dsn.public,\n featureSelection.performance,\n featureSelection.replay,\n featureSelection.logs,\n typeScriptDetected,\n useInstrumentationAPI,\n useOnError,\n );\n } catch (e) {\n clack.log.warn(\n `Could not initialize Sentry on client entry automatically.`,\n );\n\n const clientEntryFilename = `entry.client.${\n typeScriptDetected ? 'tsx' : 'jsx'\n }`;\n\n const manualClientContent = getManualClientEntryContent(\n selectedProject.keys[0].dsn.public,\n featureSelection.performance,\n featureSelection.replay,\n featureSelection.logs,\n useInstrumentationAPI,\n useOnError,\n );\n\n await showCopyPasteInstructions({\n filename: clientEntryFilename,\n codeSnippet: manualClientContent,\n hint: 'This enables error tracking and performance monitoring for your React Router app',\n });\n\n debug(e);\n }\n });\n\n await traceStep('Instrument server entry', async () => {\n try {\n await instrumentSentryOnEntryServer(\n typeScriptDetected,\n useInstrumentationAPI,\n );\n } catch (e) {\n clack.log.warn(\n `Could not initialize Sentry on server entry automatically.`,\n );\n\n const serverEntryFilename = `entry.server.${\n typeScriptDetected ? 'tsx' : 'jsx'\n }`;\n const manualServerContent = getManualServerEntryContent(\n useInstrumentationAPI,\n );\n\n await showCopyPasteInstructions({\n filename: serverEntryFilename,\n codeSnippet: manualServerContent,\n hint: 'This configures server-side request handling and error tracking',\n });\n\n debug(e);\n }\n });\n\n await traceStep('Create server instrumentation file', async () => {\n try {\n createServerInstrumentationFile(selectedProject.keys[0].dsn.public, {\n performance: featureSelection.performance,\n replay: featureSelection.replay,\n logs: featureSelection.logs,\n profiling: featureSelection.profiling,\n });\n } catch (e) {\n clack.log.warn(\n 'Could not create a server instrumentation file automatically.',\n );\n\n const manualServerInstrumentContent = getManualServerInstrumentContent(\n selectedProject.keys[0].dsn.public,\n featureSelection.performance,\n featureSelection.profiling,\n featureSelection.logs,\n );\n\n await showCopyPasteInstructions({\n filename: 'instrument.server.mjs',\n codeSnippet: manualServerInstrumentContent,\n hint: 'Create the file if it does not exist - this initializes Sentry before your application starts',\n });\n\n debug(e);\n }\n });\n\n await traceStep('Update package.json scripts', async () => {\n try {\n await updatePackageJsonScripts();\n } catch (e) {\n clack.log.warn('Could not update start script automatically.');\n\n await showCopyPasteInstructions({\n filename: 'package.json',\n codeSnippet: makeCodeSnippet(true, (unchanged, plus, minus) => {\n return unchanged(`{\n scripts: {\n ${minus('\"start\": \"react-router dev\"')}\n ${plus(\n '\"start\": \"NODE_ENV=production NODE_OPTIONS=\\'--import ./instrument.server.mjs\\' react-router-serve ./build/server/index.js\"',\n )}\n ${minus('\"dev\": \"react-router dev\"')}\n ${plus(\n '\"dev\": \"NODE_OPTIONS=\\'--import ./instrument.server.mjs\\' react-router dev\"',\n )}\n },\n // ... rest of your package.json\n }`);\n }),\n });\n\n debug(e);\n }\n });\n\n await traceStep('Create build plugin env file', async () => {\n try {\n await addDotEnvSentryBuildPluginFile(authToken);\n } catch (e) {\n clack.log.warn(\n 'Could not create .env.sentry-build-plugin file. Please create it manually.',\n );\n debug(e);\n }\n });\n\n // Validate auth token before configuring sourcemap uploads\n if (!authToken) {\n clack.log.warn(\n `${chalk.yellow(\n 'Warning:',\n )} No auth token found. Sourcemap uploads will not work without ${chalk.cyan(\n 'SENTRY_AUTH_TOKEN',\n )}.\\n` +\n `Please set ${chalk.cyan('SENTRY_AUTH_TOKEN')} in your ${chalk.cyan(\n '.env.sentry-build-plugin',\n )} file or environment variables.`,\n );\n }\n\n // Configure Vite plugin for sourcemap uploads\n await traceStep('Configure Vite plugin for sourcemap uploads', async () => {\n try {\n await configureReactRouterVitePlugin(\n selectedProject.organization.slug,\n selectedProject.slug,\n );\n } catch (e) {\n clack.log.warn(\n `Could not configure Vite plugin for sourcemap uploads automatically.`,\n );\n\n await showCopyPasteInstructions({\n filename: `vite.config.${typeScriptDetected ? 'ts' : 'js'}`,\n codeSnippet: getManualViteConfigContent(\n selectedProject.organization.slug,\n selectedProject.slug,\n ),\n hint: 'This enables automatic sourcemap uploads during build for better error tracking',\n });\n\n debug(e);\n }\n });\n\n // Configure React Router config for build hook\n await traceStep('Configure React Router build hook', async () => {\n try {\n await configureReactRouterConfig(typeScriptDetected);\n } catch (e) {\n clack.log.warn(\n `Could not configure React Router build hook automatically.`,\n );\n\n await showCopyPasteInstructions({\n filename: `react-router.config.${typeScriptDetected ? 'ts' : 'js'}`,\n codeSnippet: getManualReactRouterConfigContent(typeScriptDetected),\n hint: 'This enables automatic sourcemap uploads at the end of the build process',\n });\n\n debug(e);\n }\n });\n\n // Create example page if requested\n if (createExamplePageSelection) {\n await traceStep('Create example page', async () => {\n await createExamplePage({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\n isTS: typeScriptDetected,\n projectDir: process.cwd(),\n });\n });\n }\n\n await runPrettierIfInstalled({ cwd: undefined });\n\n // Offer optional project-scoped MCP config for Sentry with org and project scope\n await offerProjectScopedMcpConfig(\n selectedProject.organization.slug,\n selectedProject.slug,\n );\n\n clack.outro(\n `${chalk.green('Successfully installed the Sentry React Router SDK!')}${\n createExamplePageSelection\n ? `\\n\\nYou can validate your setup by visiting ${chalk.cyan(\n '\"/sentry-example-page\"',\n )} in your application.`\n : ''\n }`,\n );\n}\n"]}
@@ -3,8 +3,10 @@ export declare function getRouteFilePath(filename: string, isTS: boolean): strin
3
3
  export declare function tryRevealAndGetManualInstructions(missingFilename: string, filePath: string): Promise<boolean>;
4
4
  export declare function runReactRouterReveal(): void;
5
5
  export declare function isReactRouterV7(packageJson: PackageDotJson): boolean;
6
- export declare function initializeSentryOnEntryClient(dsn: string, enableTracing: boolean, enableReplay: boolean, enableLogs: boolean, isTS: boolean): Promise<void>;
7
- export declare function instrumentRootRoute(isTS: boolean): Promise<void>;
6
+ export declare function getReactRouterVersion(packageJson: PackageDotJson): string | undefined;
7
+ export declare function supportsOnError(packageJson: PackageDotJson): boolean;
8
+ export declare function supportsInstrumentationAPI(packageJson: PackageDotJson): boolean;
9
+ export declare function initializeSentryOnEntryClient(dsn: string, enableTracing: boolean, enableReplay: boolean, enableLogs: boolean, isTS: boolean, useInstrumentationAPI?: boolean, useOnError?: boolean): Promise<void>;
8
10
  export declare function createServerInstrumentationFile(dsn: string, selectedFeatures: {
9
11
  performance: boolean;
10
12
  replay: boolean;
@@ -12,6 +14,6 @@ export declare function createServerInstrumentationFile(dsn: string, selectedFea
12
14
  profiling: boolean;
13
15
  }): string;
14
16
  export declare function updatePackageJsonScripts(): Promise<void>;
15
- export declare function instrumentSentryOnEntryServer(isTS: boolean): Promise<void>;
17
+ export declare function instrumentSentryOnEntryServer(isTS: boolean, useInstrumentationAPI?: boolean): Promise<void>;
16
18
  export declare function configureReactRouterVitePlugin(orgSlug: string, projectSlug: string): Promise<void>;
17
19
  export declare function configureReactRouterConfig(isTS: boolean): Promise<void>;
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.configureReactRouterConfig = exports.configureReactRouterVitePlugin = exports.instrumentSentryOnEntryServer = exports.updatePackageJsonScripts = exports.createServerInstrumentationFile = exports.instrumentRootRoute = exports.initializeSentryOnEntryClient = exports.isReactRouterV7 = exports.runReactRouterReveal = exports.tryRevealAndGetManualInstructions = exports.getRouteFilePath = void 0;
29
+ exports.configureReactRouterConfig = exports.configureReactRouterVitePlugin = exports.instrumentSentryOnEntryServer = exports.updatePackageJsonScripts = exports.createServerInstrumentationFile = exports.initializeSentryOnEntryClient = exports.supportsInstrumentationAPI = exports.supportsOnError = exports.getReactRouterVersion = exports.isReactRouterV7 = exports.runReactRouterReveal = exports.tryRevealAndGetManualInstructions = exports.getRouteFilePath = void 0;
30
30
  const fs = __importStar(require("fs"));
31
31
  const path = __importStar(require("path"));
32
32
  const childProcess = __importStar(require("child_process"));
@@ -37,7 +37,6 @@ const semver_1 = require("semver");
37
37
  const package_json_1 = require("../utils/package-json");
38
38
  const debug_1 = require("../utils/debug");
39
39
  const templates_1 = require("./templates");
40
- const root_1 = require("./codemods/root");
41
40
  const server_entry_1 = require("./codemods/server-entry");
42
41
  const clack_1 = require("../utils/clack");
43
42
  const client_entry_1 = require("./codemods/client.entry");
@@ -128,24 +127,47 @@ function isReactRouterV7(packageJson) {
128
127
  return (0, semver_1.gte)(minVer, '7.0.0');
129
128
  }
130
129
  exports.isReactRouterV7 = isReactRouterV7;
131
- async function initializeSentryOnEntryClient(dsn, enableTracing, enableReplay, enableLogs, isTS) {
130
+ function getReactRouterVersion(packageJson) {
131
+ const rangeVersion = (0, package_json_1.getPackageVersion)('@react-router/dev', packageJson);
132
+ if (!rangeVersion) {
133
+ return undefined;
134
+ }
135
+ const coerced = (0, semver_1.coerce)(rangeVersion);
136
+ return coerced ? coerced.version : rangeVersion;
137
+ }
138
+ exports.getReactRouterVersion = getReactRouterVersion;
139
+ function supportsOnError(packageJson) {
140
+ const reactRouterVersion = (0, package_json_1.getPackageVersion)('@react-router/dev', packageJson);
141
+ if (!reactRouterVersion) {
142
+ return false;
143
+ }
144
+ const minVer = (0, semver_1.minVersion)(reactRouterVersion);
145
+ if (!minVer) {
146
+ return false;
147
+ }
148
+ return (0, semver_1.gte)(minVer, '7.11.0');
149
+ }
150
+ exports.supportsOnError = supportsOnError;
151
+ function supportsInstrumentationAPI(packageJson) {
152
+ const reactRouterVersion = (0, package_json_1.getPackageVersion)('@react-router/dev', packageJson);
153
+ if (!reactRouterVersion) {
154
+ return false;
155
+ }
156
+ const minVer = (0, semver_1.minVersion)(reactRouterVersion);
157
+ if (!minVer) {
158
+ return false;
159
+ }
160
+ return (0, semver_1.gte)(minVer, '7.15.0');
161
+ }
162
+ exports.supportsInstrumentationAPI = supportsInstrumentationAPI;
163
+ async function initializeSentryOnEntryClient(dsn, enableTracing, enableReplay, enableLogs, isTS, useInstrumentationAPI = false, useOnError = false) {
132
164
  const clientEntryPath = getAppFilePath('entry.client', isTS);
133
165
  const clientEntryFilename = path.basename(clientEntryPath);
134
166
  await ensureEntryFileExists(clientEntryFilename, clientEntryPath);
135
- await (0, client_entry_1.instrumentClientEntry)(clientEntryPath, dsn, enableTracing, enableReplay, enableLogs);
167
+ await (0, client_entry_1.instrumentClientEntry)(clientEntryPath, dsn, enableTracing, enableReplay, enableLogs, useInstrumentationAPI, useOnError);
136
168
  prompts_1.default.log.success(`Updated ${chalk_1.default.cyan(clientEntryFilename)} with Sentry initialization.`);
137
169
  }
138
170
  exports.initializeSentryOnEntryClient = initializeSentryOnEntryClient;
139
- async function instrumentRootRoute(isTS) {
140
- const rootPath = getAppFilePath('root', isTS);
141
- const rootFilename = path.basename(rootPath);
142
- if (!fs.existsSync(rootPath)) {
143
- throw new Error(`${rootFilename} not found in app directory. Please ensure your React Router v7 app has a root.tsx/jsx file in the app folder.`);
144
- }
145
- await (0, root_1.instrumentRoot)(rootFilename);
146
- prompts_1.default.log.success(`Updated ${chalk_1.default.cyan(rootFilename)} with ErrorBoundary.`);
147
- }
148
- exports.instrumentRootRoute = instrumentRootRoute;
149
171
  function createServerInstrumentationFile(dsn, selectedFeatures) {
150
172
  const instrumentationPath = path.join(process.cwd(), INSTRUMENTATION_FILE);
151
173
  const content = (0, templates_1.getSentryInstrumentationServerContent)(dsn, selectedFeatures.performance, selectedFeatures.profiling, selectedFeatures.logs);
@@ -192,14 +214,20 @@ async function updatePackageJsonScripts() {
192
214
  else {
193
215
  packageJson.scripts.start = mergeNodeOptions(startScript);
194
216
  }
217
+ // Prevent React CJS dev/prod bundle mismatch when --import loads react
218
+ // before react-router-serve sets NODE_ENV
219
+ if (packageJson.scripts.start.includes('--import') &&
220
+ !packageJson.scripts.start.includes('NODE_ENV=')) {
221
+ packageJson.scripts.start = `NODE_ENV=production ${packageJson.scripts.start}`;
222
+ }
195
223
  await fs.promises.writeFile('package.json', JSON.stringify(packageJson, null, 2));
196
224
  }
197
225
  exports.updatePackageJsonScripts = updatePackageJsonScripts;
198
- async function instrumentSentryOnEntryServer(isTS) {
226
+ async function instrumentSentryOnEntryServer(isTS, useInstrumentationAPI = false) {
199
227
  const serverEntryPath = getAppFilePath('entry.server', isTS);
200
228
  const serverEntryFilename = path.basename(serverEntryPath);
201
229
  await ensureEntryFileExists(serverEntryFilename, serverEntryPath);
202
- await (0, server_entry_1.instrumentServerEntry)(serverEntryPath);
230
+ await (0, server_entry_1.instrumentServerEntry)(serverEntryPath, useInstrumentationAPI);
203
231
  prompts_1.default.log.success(`Updated ${chalk_1.default.cyan(serverEntryFilename)} with Sentry error handling.`);
204
232
  }
205
233
  exports.instrumentSentryOnEntryServer = instrumentSentryOnEntryServer;
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/react-router/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as childProcess from 'child_process';\n\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 { gte, minVersion } from 'semver';\n\nimport type { PackageDotJson } from '../utils/package-json';\nimport { getPackageVersion } from '../utils/package-json';\nimport { debug } from '../utils/debug';\nimport { getSentryInstrumentationServerContent } from './templates';\nimport { instrumentRoot } from './codemods/root';\nimport { instrumentServerEntry } from './codemods/server-entry';\nimport { getPackageDotJson } from '../utils/clack';\nimport { instrumentClientEntry } from './codemods/client.entry';\nimport { instrumentViteConfig } from './codemods/vite';\nimport { instrumentReactRouterConfig } from './codemods/react-router-config';\n\nconst REACT_ROUTER_REVEAL_COMMAND = 'npx react-router reveal';\nconst INSTRUMENTATION_FILE = 'instrument.server.mjs';\nconst APP_DIRECTORY = 'app';\nconst ROUTES_DIRECTORY = 'routes';\n\nfunction _formatConfigErrorMessage(\n filename: string,\n errorMessage: string,\n fallbackHint: string,\n): string {\n return (\n `Could not automatically configure ${filename}. ${errorMessage}\\n` +\n `This may happen if your config has an unusual format. ` +\n `${fallbackHint}`\n );\n}\n\nfunction getAppFilePath(\n filename: string,\n isTS: boolean,\n isPage = true,\n): string {\n const ext = isPage ? (isTS ? 'tsx' : 'jsx') : isTS ? 'ts' : 'js';\n return path.join(process.cwd(), APP_DIRECTORY, `${filename}.${ext}`);\n}\n\nexport function getRouteFilePath(filename: string, isTS: boolean): string {\n const ext = isTS ? 'tsx' : 'jsx';\n return path.join(\n process.cwd(),\n APP_DIRECTORY,\n ROUTES_DIRECTORY,\n `${filename}.${ext}`,\n );\n}\n\nexport async function tryRevealAndGetManualInstructions(\n missingFilename: string,\n filePath: string,\n): Promise<boolean> {\n const shouldTryReveal = await clack.confirm({\n message: `Would you like to try running ${chalk.cyan(\n REACT_ROUTER_REVEAL_COMMAND,\n )} to generate entry files?`,\n initialValue: true,\n });\n\n if (shouldTryReveal) {\n try {\n clack.log.info(`Running ${chalk.cyan(REACT_ROUTER_REVEAL_COMMAND)}...`);\n const output = childProcess.execSync(REACT_ROUTER_REVEAL_COMMAND, {\n encoding: 'utf8',\n stdio: 'pipe',\n });\n clack.log.info(output);\n\n if (fs.existsSync(filePath)) {\n clack.log.success(\n `Found ${chalk.cyan(missingFilename)} after running reveal.`,\n );\n return true;\n } else {\n clack.log.warn(\n `${chalk.cyan(\n missingFilename,\n )} still not found after running reveal.`,\n );\n }\n } catch (e) {\n debug('Failed to run React Router reveal command:', e);\n clack.log.warn(\n `Failed to run ${chalk.cyan(\n REACT_ROUTER_REVEAL_COMMAND,\n )}. This command generates entry files for React Router v7.`,\n );\n }\n }\n\n return false; // File still doesn't exist, manual intervention needed\n}\n\nasync function ensureEntryFileExists(\n filename: string,\n filePath: string,\n): Promise<void> {\n if (fs.existsSync(filePath)) {\n return; // File exists, nothing to do\n }\n\n clack.log.warn(`Could not find ${chalk.cyan(filename)}.`);\n\n const fileExists = await tryRevealAndGetManualInstructions(\n filename,\n filePath,\n );\n\n if (!fileExists) {\n throw new Error(\n `Failed to create or find ${filename}. Please create this file manually or ensure your React Router v7 project structure is correct.`,\n );\n }\n}\n\nexport function runReactRouterReveal(): void {\n if (\n !fs.existsSync(path.join(process.cwd(), 'app', 'entry.client.tsx')) &&\n !fs.existsSync(path.join(process.cwd(), 'app', 'entry.client.jsx'))\n ) {\n try {\n childProcess.execSync(REACT_ROUTER_REVEAL_COMMAND, {\n encoding: 'utf8',\n stdio: 'pipe',\n });\n } catch (e) {\n debug('Failed to run React Router reveal command:', e);\n throw e;\n }\n }\n}\n\nexport function isReactRouterV7(packageJson: PackageDotJson): boolean {\n const reactRouterVersion = getPackageVersion(\n '@react-router/dev',\n packageJson,\n );\n if (!reactRouterVersion) {\n return false;\n }\n\n const minVer = minVersion(reactRouterVersion);\n\n if (!minVer) {\n return false;\n }\n\n return gte(minVer, '7.0.0');\n}\n\nexport async function initializeSentryOnEntryClient(\n dsn: string,\n enableTracing: boolean,\n enableReplay: boolean,\n enableLogs: boolean,\n isTS: boolean,\n): Promise<void> {\n const clientEntryPath = getAppFilePath('entry.client', isTS);\n const clientEntryFilename = path.basename(clientEntryPath);\n\n await ensureEntryFileExists(clientEntryFilename, clientEntryPath);\n\n await instrumentClientEntry(\n clientEntryPath,\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n clack.log.success(\n `Updated ${chalk.cyan(clientEntryFilename)} with Sentry initialization.`,\n );\n}\n\nexport async function instrumentRootRoute(isTS: boolean): Promise<void> {\n const rootPath = getAppFilePath('root', isTS);\n const rootFilename = path.basename(rootPath);\n\n if (!fs.existsSync(rootPath)) {\n throw new Error(\n `${rootFilename} not found in app directory. Please ensure your React Router v7 app has a root.tsx/jsx file in the app folder.`,\n );\n }\n\n await instrumentRoot(rootFilename);\n clack.log.success(`Updated ${chalk.cyan(rootFilename)} with ErrorBoundary.`);\n}\n\nexport function createServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n profiling: boolean;\n },\n): string {\n const instrumentationPath = path.join(process.cwd(), INSTRUMENTATION_FILE);\n\n const content = getSentryInstrumentationServerContent(\n dsn,\n selectedFeatures.performance,\n selectedFeatures.profiling,\n selectedFeatures.logs,\n );\n\n fs.writeFileSync(instrumentationPath, content);\n clack.log.success(`Created ${chalk.cyan(INSTRUMENTATION_FILE)}.`);\n return instrumentationPath;\n}\n\nexport async function updatePackageJsonScripts(): Promise<void> {\n const packageJson = await getPackageDotJson();\n\n if (!packageJson?.scripts) {\n throw new Error(\n 'Could not find a `scripts` section in your package.json file. Please add scripts manually or ensure your package.json is valid.',\n );\n }\n\n if (!packageJson.scripts.start) {\n throw new Error(\n 'Could not find a `start` script in your package.json. Please add: \"start\": \"react-router-serve ./build/server/index.js\" and re-run the wizard.',\n );\n }\n\n function mergeNodeOptions(\n scriptCommand: string,\n instrumentPath = './instrument.server.mjs',\n ): string {\n if (scriptCommand.includes(instrumentPath)) {\n return scriptCommand;\n }\n\n const quotedMatch = scriptCommand.match(/NODE_OPTIONS=(['\"])([^'\"]*)\\1/);\n if (quotedMatch) {\n const existingOptions = quotedMatch[2];\n const mergedOptions =\n `${existingOptions} --import ${instrumentPath}`.trim();\n return scriptCommand.replace(\n /NODE_OPTIONS=(['\"])([^'\"]*)\\1/,\n `NODE_OPTIONS='${mergedOptions}'`,\n );\n }\n\n const unquotedMatch = scriptCommand.match(\n /NODE_OPTIONS=([^\\s]+(?:\\s+[^\\s]+)*?)(\\s+(?:react-router-serve|react-router|node|npx|tsx))/,\n );\n if (unquotedMatch) {\n const existingOptions = unquotedMatch[1];\n const commandPart = unquotedMatch[2];\n const mergedOptions =\n `${existingOptions} --import ${instrumentPath}`.trim();\n return scriptCommand.replace(\n /NODE_OPTIONS=([^\\s]+(?:\\s+[^\\s]+)*?)(\\s+(?:react-router-serve|react-router|node|npx|tsx))/,\n `NODE_OPTIONS='${mergedOptions}'${commandPart}`,\n );\n }\n\n return `NODE_OPTIONS='--import ${instrumentPath}' ${scriptCommand}`;\n }\n\n if (packageJson.scripts.dev) {\n packageJson.scripts.dev = mergeNodeOptions(packageJson.scripts.dev);\n }\n\n const startScript = packageJson.scripts.start;\n if (\n !startScript.includes(INSTRUMENTATION_FILE) &&\n !startScript.includes('NODE_OPTIONS')\n ) {\n packageJson.scripts.start = `NODE_OPTIONS='--import ./${INSTRUMENTATION_FILE}' react-router-serve ./build/server/index.js`;\n } else {\n packageJson.scripts.start = mergeNodeOptions(startScript);\n }\n\n await fs.promises.writeFile(\n 'package.json',\n JSON.stringify(packageJson, null, 2),\n );\n}\n\nexport async function instrumentSentryOnEntryServer(\n isTS: boolean,\n): Promise<void> {\n const serverEntryPath = getAppFilePath('entry.server', isTS);\n const serverEntryFilename = path.basename(serverEntryPath);\n\n await ensureEntryFileExists(serverEntryFilename, serverEntryPath);\n\n await instrumentServerEntry(serverEntryPath);\n\n clack.log.success(\n `Updated ${chalk.cyan(serverEntryFilename)} with Sentry error handling.`,\n );\n}\n\nexport async function configureReactRouterVitePlugin(\n orgSlug: string,\n projectSlug: string,\n): Promise<void> {\n const configPath = fs.existsSync(path.join(process.cwd(), 'vite.config.ts'))\n ? path.join(process.cwd(), 'vite.config.ts')\n : path.join(process.cwd(), 'vite.config.js');\n const filename = chalk.cyan(path.basename(configPath));\n\n try {\n const { wasConverted } = await instrumentViteConfig(orgSlug, projectSlug);\n\n clack.log.success(`Updated ${filename} with sentryReactRouter plugin.`);\n\n if (wasConverted) {\n clack.log.info(\n `Converted your Vite config to function form ${chalk.dim(\n '(defineConfig(config => ({ ... })))',\n )} to support the Sentry React Router plugin.`,\n );\n }\n } catch (e) {\n debug('Failed to modify vite config:', e);\n const errorMessage = e instanceof Error ? e.message : String(e);\n throw new Error(\n _formatConfigErrorMessage(\n filename,\n errorMessage,\n 'You may need to add the plugin manually.',\n ),\n );\n }\n}\n\nexport async function configureReactRouterConfig(isTS: boolean): Promise<void> {\n const configFilename = `react-router.config.${isTS ? 'ts' : 'js'}`;\n const configPath = path.join(process.cwd(), configFilename);\n const filename = chalk.cyan(configFilename);\n\n try {\n const fileExistedBefore = fs.existsSync(configPath);\n\n const { ssrWasChanged } = await instrumentReactRouterConfig(isTS);\n\n if (fileExistedBefore) {\n clack.log.success(`Updated ${filename} with Sentry buildEnd hook.`);\n } else {\n clack.log.success(`Created ${filename} with Sentry buildEnd hook.`);\n }\n\n if (ssrWasChanged) {\n clack.log.warn(\n `${chalk.yellow(\n 'Note:',\n )} SSR has been enabled in your React Router config (${chalk.cyan(\n 'ssr: true',\n )}). This is required for Sentry sourcemap uploads to work correctly.`,\n );\n }\n } catch (e) {\n debug('Failed to modify react-router.config:', e);\n const errorMessage = e instanceof Error ? e.message : String(e);\n throw new Error(\n _formatConfigErrorMessage(\n filename,\n errorMessage,\n 'You may need to add the buildEnd hook manually.',\n ),\n );\n }\n}\n"]}
1
+ {"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/react-router/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as childProcess from 'child_process';\n\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 { gte, minVersion, coerce } from 'semver';\n\nimport type { PackageDotJson } from '../utils/package-json';\nimport { getPackageVersion } from '../utils/package-json';\nimport { debug } from '../utils/debug';\nimport { getSentryInstrumentationServerContent } from './templates';\nimport { instrumentServerEntry } from './codemods/server-entry';\nimport { getPackageDotJson } from '../utils/clack';\nimport { instrumentClientEntry } from './codemods/client.entry';\nimport { instrumentViteConfig } from './codemods/vite';\nimport { instrumentReactRouterConfig } from './codemods/react-router-config';\n\nconst REACT_ROUTER_REVEAL_COMMAND = 'npx react-router reveal';\nconst INSTRUMENTATION_FILE = 'instrument.server.mjs';\nconst APP_DIRECTORY = 'app';\nconst ROUTES_DIRECTORY = 'routes';\n\nfunction _formatConfigErrorMessage(\n filename: string,\n errorMessage: string,\n fallbackHint: string,\n): string {\n return (\n `Could not automatically configure ${filename}. ${errorMessage}\\n` +\n `This may happen if your config has an unusual format. ` +\n `${fallbackHint}`\n );\n}\n\nfunction getAppFilePath(\n filename: string,\n isTS: boolean,\n isPage = true,\n): string {\n const ext = isPage ? (isTS ? 'tsx' : 'jsx') : isTS ? 'ts' : 'js';\n return path.join(process.cwd(), APP_DIRECTORY, `${filename}.${ext}`);\n}\n\nexport function getRouteFilePath(filename: string, isTS: boolean): string {\n const ext = isTS ? 'tsx' : 'jsx';\n return path.join(\n process.cwd(),\n APP_DIRECTORY,\n ROUTES_DIRECTORY,\n `${filename}.${ext}`,\n );\n}\n\nexport async function tryRevealAndGetManualInstructions(\n missingFilename: string,\n filePath: string,\n): Promise<boolean> {\n const shouldTryReveal = await clack.confirm({\n message: `Would you like to try running ${chalk.cyan(\n REACT_ROUTER_REVEAL_COMMAND,\n )} to generate entry files?`,\n initialValue: true,\n });\n\n if (shouldTryReveal) {\n try {\n clack.log.info(`Running ${chalk.cyan(REACT_ROUTER_REVEAL_COMMAND)}...`);\n const output = childProcess.execSync(REACT_ROUTER_REVEAL_COMMAND, {\n encoding: 'utf8',\n stdio: 'pipe',\n });\n clack.log.info(output);\n\n if (fs.existsSync(filePath)) {\n clack.log.success(\n `Found ${chalk.cyan(missingFilename)} after running reveal.`,\n );\n return true;\n } else {\n clack.log.warn(\n `${chalk.cyan(\n missingFilename,\n )} still not found after running reveal.`,\n );\n }\n } catch (e) {\n debug('Failed to run React Router reveal command:', e);\n clack.log.warn(\n `Failed to run ${chalk.cyan(\n REACT_ROUTER_REVEAL_COMMAND,\n )}. This command generates entry files for React Router v7.`,\n );\n }\n }\n\n return false; // File still doesn't exist, manual intervention needed\n}\n\nasync function ensureEntryFileExists(\n filename: string,\n filePath: string,\n): Promise<void> {\n if (fs.existsSync(filePath)) {\n return; // File exists, nothing to do\n }\n\n clack.log.warn(`Could not find ${chalk.cyan(filename)}.`);\n\n const fileExists = await tryRevealAndGetManualInstructions(\n filename,\n filePath,\n );\n\n if (!fileExists) {\n throw new Error(\n `Failed to create or find ${filename}. Please create this file manually or ensure your React Router v7 project structure is correct.`,\n );\n }\n}\n\nexport function runReactRouterReveal(): void {\n if (\n !fs.existsSync(path.join(process.cwd(), 'app', 'entry.client.tsx')) &&\n !fs.existsSync(path.join(process.cwd(), 'app', 'entry.client.jsx'))\n ) {\n try {\n childProcess.execSync(REACT_ROUTER_REVEAL_COMMAND, {\n encoding: 'utf8',\n stdio: 'pipe',\n });\n } catch (e) {\n debug('Failed to run React Router reveal command:', e);\n throw e;\n }\n }\n}\n\nexport function isReactRouterV7(packageJson: PackageDotJson): boolean {\n const reactRouterVersion = getPackageVersion(\n '@react-router/dev',\n packageJson,\n );\n if (!reactRouterVersion) {\n return false;\n }\n\n const minVer = minVersion(reactRouterVersion);\n\n if (!minVer) {\n return false;\n }\n\n return gte(minVer, '7.0.0');\n}\n\nexport function getReactRouterVersion(\n packageJson: PackageDotJson,\n): string | undefined {\n const rangeVersion = getPackageVersion('@react-router/dev', packageJson);\n if (!rangeVersion) {\n return undefined;\n }\n\n const coerced = coerce(rangeVersion);\n return coerced ? coerced.version : rangeVersion;\n}\n\nexport function supportsOnError(packageJson: PackageDotJson): boolean {\n const reactRouterVersion = getPackageVersion(\n '@react-router/dev',\n packageJson,\n );\n if (!reactRouterVersion) {\n return false;\n }\n\n const minVer = minVersion(reactRouterVersion);\n\n if (!minVer) {\n return false;\n }\n\n return gte(minVer, '7.11.0');\n}\n\nexport function supportsInstrumentationAPI(\n packageJson: PackageDotJson,\n): boolean {\n const reactRouterVersion = getPackageVersion(\n '@react-router/dev',\n packageJson,\n );\n if (!reactRouterVersion) {\n return false;\n }\n\n const minVer = minVersion(reactRouterVersion);\n\n if (!minVer) {\n return false;\n }\n\n return gte(minVer, '7.15.0');\n}\n\nexport async function initializeSentryOnEntryClient(\n dsn: string,\n enableTracing: boolean,\n enableReplay: boolean,\n enableLogs: boolean,\n isTS: boolean,\n useInstrumentationAPI = false,\n useOnError = false,\n): Promise<void> {\n const clientEntryPath = getAppFilePath('entry.client', isTS);\n const clientEntryFilename = path.basename(clientEntryPath);\n\n await ensureEntryFileExists(clientEntryFilename, clientEntryPath);\n\n await instrumentClientEntry(\n clientEntryPath,\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n useInstrumentationAPI,\n useOnError,\n );\n\n clack.log.success(\n `Updated ${chalk.cyan(clientEntryFilename)} with Sentry initialization.`,\n );\n}\n\nexport function createServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n profiling: boolean;\n },\n): string {\n const instrumentationPath = path.join(process.cwd(), INSTRUMENTATION_FILE);\n\n const content = getSentryInstrumentationServerContent(\n dsn,\n selectedFeatures.performance,\n selectedFeatures.profiling,\n selectedFeatures.logs,\n );\n\n fs.writeFileSync(instrumentationPath, content);\n clack.log.success(`Created ${chalk.cyan(INSTRUMENTATION_FILE)}.`);\n return instrumentationPath;\n}\n\nexport async function updatePackageJsonScripts(): Promise<void> {\n const packageJson = await getPackageDotJson();\n\n if (!packageJson?.scripts) {\n throw new Error(\n 'Could not find a `scripts` section in your package.json file. Please add scripts manually or ensure your package.json is valid.',\n );\n }\n\n if (!packageJson.scripts.start) {\n throw new Error(\n 'Could not find a `start` script in your package.json. Please add: \"start\": \"react-router-serve ./build/server/index.js\" and re-run the wizard.',\n );\n }\n\n function mergeNodeOptions(\n scriptCommand: string,\n instrumentPath = './instrument.server.mjs',\n ): string {\n if (scriptCommand.includes(instrumentPath)) {\n return scriptCommand;\n }\n\n const quotedMatch = scriptCommand.match(/NODE_OPTIONS=(['\"])([^'\"]*)\\1/);\n if (quotedMatch) {\n const existingOptions = quotedMatch[2];\n const mergedOptions =\n `${existingOptions} --import ${instrumentPath}`.trim();\n return scriptCommand.replace(\n /NODE_OPTIONS=(['\"])([^'\"]*)\\1/,\n `NODE_OPTIONS='${mergedOptions}'`,\n );\n }\n\n const unquotedMatch = scriptCommand.match(\n /NODE_OPTIONS=([^\\s]+(?:\\s+[^\\s]+)*?)(\\s+(?:react-router-serve|react-router|node|npx|tsx))/,\n );\n if (unquotedMatch) {\n const existingOptions = unquotedMatch[1];\n const commandPart = unquotedMatch[2];\n const mergedOptions =\n `${existingOptions} --import ${instrumentPath}`.trim();\n return scriptCommand.replace(\n /NODE_OPTIONS=([^\\s]+(?:\\s+[^\\s]+)*?)(\\s+(?:react-router-serve|react-router|node|npx|tsx))/,\n `NODE_OPTIONS='${mergedOptions}'${commandPart}`,\n );\n }\n\n return `NODE_OPTIONS='--import ${instrumentPath}' ${scriptCommand}`;\n }\n\n if (packageJson.scripts.dev) {\n packageJson.scripts.dev = mergeNodeOptions(packageJson.scripts.dev);\n }\n\n const startScript = packageJson.scripts.start;\n if (\n !startScript.includes(INSTRUMENTATION_FILE) &&\n !startScript.includes('NODE_OPTIONS')\n ) {\n packageJson.scripts.start = `NODE_OPTIONS='--import ./${INSTRUMENTATION_FILE}' react-router-serve ./build/server/index.js`;\n } else {\n packageJson.scripts.start = mergeNodeOptions(startScript);\n }\n\n // Prevent React CJS dev/prod bundle mismatch when --import loads react\n // before react-router-serve sets NODE_ENV\n if (\n packageJson.scripts.start.includes('--import') &&\n !packageJson.scripts.start.includes('NODE_ENV=')\n ) {\n packageJson.scripts.start = `NODE_ENV=production ${packageJson.scripts.start}`;\n }\n\n await fs.promises.writeFile(\n 'package.json',\n JSON.stringify(packageJson, null, 2),\n );\n}\n\nexport async function instrumentSentryOnEntryServer(\n isTS: boolean,\n useInstrumentationAPI = false,\n): Promise<void> {\n const serverEntryPath = getAppFilePath('entry.server', isTS);\n const serverEntryFilename = path.basename(serverEntryPath);\n\n await ensureEntryFileExists(serverEntryFilename, serverEntryPath);\n\n await instrumentServerEntry(serverEntryPath, useInstrumentationAPI);\n\n clack.log.success(\n `Updated ${chalk.cyan(serverEntryFilename)} with Sentry error handling.`,\n );\n}\n\nexport async function configureReactRouterVitePlugin(\n orgSlug: string,\n projectSlug: string,\n): Promise<void> {\n const configPath = fs.existsSync(path.join(process.cwd(), 'vite.config.ts'))\n ? path.join(process.cwd(), 'vite.config.ts')\n : path.join(process.cwd(), 'vite.config.js');\n const filename = chalk.cyan(path.basename(configPath));\n\n try {\n const { wasConverted } = await instrumentViteConfig(orgSlug, projectSlug);\n\n clack.log.success(`Updated ${filename} with sentryReactRouter plugin.`);\n\n if (wasConverted) {\n clack.log.info(\n `Converted your Vite config to function form ${chalk.dim(\n '(defineConfig(config => ({ ... })))',\n )} to support the Sentry React Router plugin.`,\n );\n }\n } catch (e) {\n debug('Failed to modify vite config:', e);\n const errorMessage = e instanceof Error ? e.message : String(e);\n throw new Error(\n _formatConfigErrorMessage(\n filename,\n errorMessage,\n 'You may need to add the plugin manually.',\n ),\n );\n }\n}\n\nexport async function configureReactRouterConfig(isTS: boolean): Promise<void> {\n const configFilename = `react-router.config.${isTS ? 'ts' : 'js'}`;\n const configPath = path.join(process.cwd(), configFilename);\n const filename = chalk.cyan(configFilename);\n\n try {\n const fileExistedBefore = fs.existsSync(configPath);\n\n const { ssrWasChanged } = await instrumentReactRouterConfig(isTS);\n\n if (fileExistedBefore) {\n clack.log.success(`Updated ${filename} with Sentry buildEnd hook.`);\n } else {\n clack.log.success(`Created ${filename} with Sentry buildEnd hook.`);\n }\n\n if (ssrWasChanged) {\n clack.log.warn(\n `${chalk.yellow(\n 'Note:',\n )} SSR has been enabled in your React Router config (${chalk.cyan(\n 'ssr: true',\n )}). This is required for Sentry sourcemap uploads to work correctly.`,\n );\n }\n } catch (e) {\n debug('Failed to modify react-router.config:', e);\n const errorMessage = e instanceof Error ? e.message : String(e);\n throw new Error(\n _formatConfigErrorMessage(\n filename,\n errorMessage,\n 'You may need to add the buildEnd hook manually.',\n ),\n );\n }\n}\n"]}
@@ -1,11 +1,9 @@
1
- export declare const ERROR_BOUNDARY_TEMPLATE: string;
2
1
  export declare const EXAMPLE_PAGE_TEMPLATE_TSX = "import type { Route } from \"./+types/sentry-example-page\";\n\nexport async function loader() {\n throw new Error(\"some error thrown in a loader\");\n}\n\nexport default function SentryExamplePage() {\n return <div>Loading this page will throw an error</div>;\n}";
3
2
  export declare const EXAMPLE_PAGE_TEMPLATE_JSX = "export async function loader() {\n throw new Error(\"some error thrown in a loader\");\n}\n\nexport default function SentryExamplePage() {\n return <div>Loading this page will throw an error</div>;\n}";
4
3
  export declare const getSentryInstrumentationServerContent: (dsn: string, enableTracing: boolean, enableProfiling?: boolean, enableLogs?: boolean) => string;
5
- export declare const getManualClientEntryContent: (dsn: string, enableTracing: boolean, enableReplay: boolean, enableLogs: boolean) => string;
6
- export declare const getManualServerEntryContent: () => string;
4
+ export declare const getManualClientEntryContent: (dsn: string, enableTracing: boolean, enableReplay: boolean, enableLogs: boolean, useInstrumentationAPI?: boolean, useOnError?: boolean) => string;
5
+ export declare const getManualServerEntryContent: (useInstrumentationAPI?: boolean) => string;
7
6
  export declare const getManualHandleRequestContent: () => string;
8
- export declare const getManualRootContent: (isTs: boolean) => string;
9
7
  export declare const getManualServerInstrumentContent: (dsn: string, enableTracing: boolean, enableProfiling: boolean, enableLogs?: boolean) => string;
10
8
  export declare const getManualReactRouterConfigContent: (isTS?: boolean) => string;
11
9
  export declare const getManualViteConfigContent: (orgSlug: string, projectSlug: string) => string;
@@ -1,45 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getManualViteConfigContent = exports.getManualReactRouterConfigContent = exports.getManualServerInstrumentContent = exports.getManualRootContent = exports.getManualHandleRequestContent = exports.getManualServerEntryContent = exports.getManualClientEntryContent = exports.getSentryInstrumentationServerContent = exports.EXAMPLE_PAGE_TEMPLATE_JSX = exports.EXAMPLE_PAGE_TEMPLATE_TSX = exports.ERROR_BOUNDARY_TEMPLATE = void 0;
3
+ exports.getManualViteConfigContent = exports.getManualReactRouterConfigContent = exports.getManualServerInstrumentContent = exports.getManualHandleRequestContent = exports.getManualServerEntryContent = exports.getManualClientEntryContent = exports.getSentryInstrumentationServerContent = exports.EXAMPLE_PAGE_TEMPLATE_JSX = exports.EXAMPLE_PAGE_TEMPLATE_TSX = void 0;
4
4
  const clack_1 = require("../utils/clack");
5
- function generateErrorBoundaryTemplate(isTypeScript, forManualInstructions = false) {
6
- const typeAnnotations = isTypeScript
7
- ? { stack: ': string | undefined', props: ': Route.ErrorBoundaryProps' }
8
- : { stack: '', props: '' };
9
- const commentLine = forManualInstructions
10
- ? '// you only want to capture non 404-errors that reach the boundary\n '
11
- : '// Only capture non-404 errors (all errors here are already non-RouteErrorResponse)\n ';
12
- return `function ErrorBoundary({ error }${typeAnnotations.props}) {
13
- let message = "Oops!";
14
- let details = "An unexpected error occurred.";
15
- let stack${typeAnnotations.stack};
16
-
17
- if (isRouteErrorResponse(error)) {
18
- message = error.status === 404 ? "404" : "Error";
19
- details =
20
- error.status === 404
21
- ? "The requested page could not be found."
22
- : error.statusText || details;
23
- } else if (error && error instanceof Error) {
24
- ${commentLine}Sentry.captureException(error);
25
- details = error.message;
26
- stack = error.stack;
27
- }
28
-
29
- return (
30
- <main>
31
- <h1>{message}</h1>
32
- <p>{details}</p>
33
- {stack && (
34
- <pre>
35
- <code>{stack}</code>
36
- </pre>
37
- )}
38
- </main>
39
- );
40
- }`;
41
- }
42
- exports.ERROR_BOUNDARY_TEMPLATE = generateErrorBoundaryTemplate(false);
43
5
  exports.EXAMPLE_PAGE_TEMPLATE_TSX = `import type { Route } from "./+types/sentry-example-page";
44
6
 
45
7
  export async function loader() {
@@ -64,9 +26,12 @@ function generateServerInstrumentationCode(dsn, enableTracing, enableProfiling,
64
26
  Sentry.init({
65
27
  dsn: "${dsn}",
66
28
 
67
- // Adds request headers and IP for users, for more info visit:
68
- // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#sendDefaultPii
69
- sendDefaultPii: true,${enableLogs
29
+ dataCollection: {
30
+ // To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
31
+ // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#dataCollection
32
+ // userInfo: false,
33
+ // httpBodies: [],
34
+ },${enableLogs
70
35
  ? '\n\n // Enable logs to be sent to Sentry\n enableLogs: true,'
71
36
  : ''}${enableProfiling ? '\n\n integrations: [nodeProfilingIntegration()],' : ''}
72
37
  tracesSampleRate: ${enableTracing ? '1.0' : '0'}, ${enableTracing ? '// Capture 100% of the transactions' : ''}${enableProfiling
@@ -92,7 +57,54 @@ const getSentryInstrumentationServerContent = (dsn, enableTracing, enableProfili
92
57
  return generateServerInstrumentationCode(dsn, enableTracing, enableProfiling, enableLogs);
93
58
  };
94
59
  exports.getSentryInstrumentationServerContent = getSentryInstrumentationServerContent;
95
- const getManualClientEntryContent = (dsn, enableTracing, enableReplay, enableLogs) => {
60
+ const getManualClientEntryContent = (dsn, enableTracing, enableReplay, enableLogs, useInstrumentationAPI = false, useOnError = false) => {
61
+ if (useInstrumentationAPI && enableTracing) {
62
+ const integrations = ['tracing'];
63
+ if (enableReplay) {
64
+ integrations.push('Sentry.replayIntegration()');
65
+ }
66
+ const integrationsStr = integrations.join(',\n ');
67
+ return (0, clack_1.makeCodeSnippet)(true, (unchanged, plus) => unchanged(`${plus("import * as Sentry from '@sentry/react-router';")}
68
+ import { startTransition, StrictMode } from 'react';
69
+ import { hydrateRoot } from 'react-dom/client';
70
+ import { HydratedRouter } from 'react-router/dom';
71
+
72
+ ${plus(`const tracing = Sentry.reactRouterTracingIntegration();`)}
73
+
74
+ ${plus(`Sentry.init({
75
+ dsn: "${dsn}",
76
+
77
+ dataCollection: {
78
+ // To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
79
+ // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#dataCollection
80
+ // userInfo: false,
81
+ // httpBodies: [],
82
+ },
83
+
84
+ integrations: [
85
+ ${integrationsStr}
86
+ ],
87
+
88
+ ${enableLogs
89
+ ? '// Enable logs to be sent to Sentry\n enableLogs: true,\n\n '
90
+ : ''}tracesSampleRate: 1.0, // Capture 100% of the transactions
91
+
92
+ // Set \`tracePropagationTargets\` to declare which URL(s) should have trace propagation enabled
93
+ // In production, replace "yourserver.io" with your actual backend domain
94
+ tracePropagationTargets: [/^\\//, /^https:\\/\\/yourserver\\.io\\/api/],${enableReplay
95
+ ? '\n\n // Capture Replay for 10% of all sessions,\n // plus 100% of sessions with an error\n replaysSessionSampleRate: 0.1,\n replaysOnErrorSampleRate: 1.0,'
96
+ : ''}
97
+ });`)}
98
+
99
+ startTransition(() => {
100
+ hydrateRoot(
101
+ document,
102
+ <StrictMode>
103
+ ${plus(`<HydratedRouter${useOnError ? ' onError={Sentry.sentryOnError}' : ''} instrumentations={[tracing.clientInstrumentation]} />`)}
104
+ </StrictMode>
105
+ );
106
+ });`));
107
+ }
96
108
  const integrations = [];
97
109
  if (enableTracing) {
98
110
  integrations.push('Sentry.reactRouterTracingIntegration()');
@@ -109,9 +121,12 @@ import { HydratedRouter } from 'react-router/dom';
109
121
  ${plus(`Sentry.init({
110
122
  dsn: "${dsn}",
111
123
 
112
- // Adds request headers and IP for users, for more info visit:
113
- // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#sendDefaultPii
114
- sendDefaultPii: true,
124
+ dataCollection: {
125
+ // To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
126
+ // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#dataCollection
127
+ // userInfo: false,
128
+ // httpBodies: [],
129
+ },
115
130
 
116
131
  integrations: [
117
132
  ${integrationsStr}
@@ -130,13 +145,36 @@ startTransition(() => {
130
145
  hydrateRoot(
131
146
  document,
132
147
  <StrictMode>
133
- <HydratedRouter />
148
+ ${plus(`<HydratedRouter${useOnError ? ' onError={Sentry.sentryOnError}' : ''} />`)}
134
149
  </StrictMode>
135
150
  );
136
151
  });`));
137
152
  };
138
153
  exports.getManualClientEntryContent = getManualClientEntryContent;
139
- const getManualServerEntryContent = () => {
154
+ const getManualServerEntryContent = (useInstrumentationAPI = false) => {
155
+ if (useInstrumentationAPI) {
156
+ return (0, clack_1.makeCodeSnippet)(true, (unchanged, plus) => unchanged(`${plus("import * as Sentry from '@sentry/react-router';")}
157
+ import { createReadableStreamFromReadable } from '@react-router/node';
158
+ import { renderToPipeableStream } from 'react-dom/server';
159
+ import { ServerRouter } from 'react-router';
160
+
161
+ ${plus(`const handleRequest = Sentry.createSentryHandleRequest({
162
+ ServerRouter,
163
+ renderToPipeableStream,
164
+ createReadableStreamFromReadable,
165
+ });`)}
166
+
167
+ export default handleRequest;
168
+
169
+ ${plus(`export const handleError = Sentry.createSentryHandleError({
170
+ logErrors: false
171
+ });`)}
172
+
173
+ ${plus(`// Enable automatic server-side instrumentation for loaders, actions, middleware
174
+ export const instrumentations = [Sentry.createSentryServerInstrumentation()];`)}
175
+
176
+ // ... rest of your server entry`));
177
+ }
140
178
  return (0, clack_1.makeCodeSnippet)(true, (unchanged, plus) => unchanged(`${plus("import * as Sentry from '@sentry/react-router';")}
141
179
  import { createReadableStreamFromReadable } from '@react-router/node';
142
180
  import { renderToPipeableStream } from 'react-dom/server';
@@ -176,45 +214,6 @@ ${plus(`// If you have a custom handleRequest implementation, wrap it like this:
176
214
  export default handleRequest;`));
177
215
  };
178
216
  exports.getManualHandleRequestContent = getManualHandleRequestContent;
179
- const getManualRootContent = (isTs) => {
180
- const typeAnnotations = isTs
181
- ? { stack: ': string | undefined', props: ': Route.ErrorBoundaryProps' }
182
- : { stack: '', props: '' };
183
- return (0, clack_1.makeCodeSnippet)(true, (unchanged, plus) => unchanged(`${plus("import * as Sentry from '@sentry/react-router';")}
184
-
185
- export function ErrorBoundary({ error }${typeAnnotations.props}) {
186
- let message = "Oops!";
187
- let details = "An unexpected error occurred.";
188
- let stack${typeAnnotations.stack};
189
-
190
- if (isRouteErrorResponse(error)) {
191
- message = error.status === 404 ? "404" : "Error";
192
- details =
193
- error.status === 404
194
- ? "The requested page could not be found."
195
- : error.statusText || details;
196
- } else if (error && error instanceof Error) {
197
- // you only want to capture non 404-errors that reach the boundary
198
- ${plus('Sentry.captureException(error);')}
199
- details = error.message;
200
- stack = error.stack;
201
- }
202
-
203
- return (
204
- <main>
205
- <h1>{message}</h1>
206
- <p>{details}</p>
207
- {stack && (
208
- <pre>
209
- <code>{stack}</code>
210
- </pre>
211
- )}
212
- </main>
213
- );
214
- }
215
- // ...`));
216
- };
217
- exports.getManualRootContent = getManualRootContent;
218
217
  const getManualServerInstrumentContent = (dsn, enableTracing, enableProfiling, enableLogs = false) => {
219
218
  return (0, clack_1.makeCodeSnippet)(true, (unchanged, plus) => plus(generateServerInstrumentationCode(dsn, enableTracing, enableProfiling, enableLogs)));
220
219
  };
@@ -266,6 +265,9 @@ export default defineConfig(config => {
266
265
  authToken: process.env.SENTRY_AUTH_TOKEN,
267
266
  }, config),`)}
268
267
  ],
268
+ ${plus(`optimizeDeps: {
269
+ exclude: ['@sentry/react-router'],
270
+ },`)}
269
271
  };
270
272
  });`));
271
273
  };