@sentry/wizard 6.10.0 → 6.12.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.
- package/CHANGELOG.md +69 -0
- package/dist/ci-ensure-runtime-loaded.sh +82 -0
- package/dist/e2e-tests/tests/angular-17.test.js +72 -82
- package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
- package/dist/e2e-tests/tests/angular-19.test.js +71 -80
- package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
- package/dist/e2e-tests/tests/cloudflare-worker.test.d.ts +1 -0
- package/dist/e2e-tests/tests/cloudflare-worker.test.js +69 -0
- package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -0
- package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js +2 -5
- package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js.map +1 -1
- package/dist/e2e-tests/tests/expo.test.js +36 -61
- package/dist/e2e-tests/tests/expo.test.js.map +1 -1
- package/dist/e2e-tests/tests/flutter.test.js +63 -70
- package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
- package/dist/e2e-tests/tests/help-message.test.js +2 -2
- package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-14.test.js +48 -76
- package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-15.test.js +89 -99
- package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-16.test.js +48 -45
- package/dist/e2e-tests/tests/nextjs-16.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-3.test.js +45 -58
- package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-4.test.js +59 -73
- package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
- package/dist/e2e-tests/tests/pnpm-workspace.test.js +6 -8
- package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-native.test.js +44 -80
- package/dist/e2e-tests/tests/react-native.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.d.ts +1 -0
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js +96 -0
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js.map +1 -0
- package/dist/e2e-tests/tests/react-router.test.js +165 -145
- package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
- package/dist/e2e-tests/tests/remix.test.js +162 -132
- package/dist/e2e-tests/tests/remix.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js +48 -36
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js +5 -7
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
- package/dist/e2e-tests/utils/index.d.ts +15 -43
- package/dist/e2e-tests/utils/index.js +95 -185
- package/dist/e2e-tests/utils/index.js.map +1 -1
- package/dist/get-e2e-test-matrix.mjs +11 -0
- package/dist/lib/Constants.d.ts +1 -0
- package/dist/lib/Constants.js +5 -0
- package/dist/lib/Constants.js.map +1 -1
- package/dist/src/android/android-wizard.js +2 -4
- package/dist/src/android/android-wizard.js.map +1 -1
- package/dist/src/angular/angular-wizard.js +4 -6
- package/dist/src/angular/angular-wizard.js.map +1 -1
- package/dist/src/angular/sdk-setup.js +1 -1
- package/dist/src/angular/sdk-setup.js.map +1 -1
- package/dist/src/apple/apple-wizard.js +2 -4
- package/dist/src/apple/apple-wizard.js.map +1 -1
- package/dist/src/apple/code-tools.js +17 -3
- package/dist/src/apple/code-tools.js.map +1 -1
- package/dist/src/apple/configure-package-manager.js +18 -5
- package/dist/src/apple/configure-package-manager.js.map +1 -1
- package/dist/src/cloudflare/cloudflare-wizard.d.ts +3 -0
- package/dist/src/cloudflare/cloudflare-wizard.js +104 -0
- package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -0
- package/dist/src/cloudflare/sdk-setup.d.ts +8 -0
- package/dist/src/cloudflare/sdk-setup.js +47 -0
- package/dist/src/cloudflare/sdk-setup.js.map +1 -0
- package/dist/src/cloudflare/templates.d.ts +5 -0
- package/dist/src/cloudflare/templates.js +50 -0
- package/dist/src/cloudflare/templates.js.map +1 -0
- package/dist/src/cloudflare/wrangler/create-wrangler-config.d.ts +4 -0
- package/dist/src/cloudflare/wrangler/create-wrangler-config.js +27 -0
- package/dist/src/cloudflare/wrangler/create-wrangler-config.js.map +1 -0
- package/dist/src/cloudflare/wrangler/ensure-wrangler-config.d.ts +4 -0
- package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js +25 -0
- package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js.map +1 -0
- package/dist/src/cloudflare/wrangler/find-wrangler-config.d.ts +4 -0
- package/dist/src/cloudflare/wrangler/find-wrangler-config.js +23 -0
- package/dist/src/cloudflare/wrangler/find-wrangler-config.js.map +1 -0
- package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.d.ts +6 -0
- package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js +52 -0
- package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js.map +1 -0
- package/dist/src/cloudflare/wrangler/update-wrangler-config.d.ts +17 -0
- package/dist/src/cloudflare/wrangler/update-wrangler-config.js +173 -0
- package/dist/src/cloudflare/wrangler/update-wrangler-config.js.map +1 -0
- package/dist/src/cloudflare/wrap-worker.d.ts +33 -0
- package/dist/src/cloudflare/wrap-worker.js +116 -0
- package/dist/src/cloudflare/wrap-worker.js.map +1 -0
- package/dist/src/flutter/flutter-wizard.js +3 -6
- package/dist/src/flutter/flutter-wizard.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +0 -2
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nuxt/nuxt-wizard.js +3 -5
- package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
- package/dist/src/react-native/expo.d.ts +6 -0
- package/dist/src/react-native/expo.js +27 -1
- package/dist/src/react-native/expo.js.map +1 -1
- package/dist/src/react-native/git.d.ts +5 -0
- package/dist/src/react-native/git.js +32 -1
- package/dist/src/react-native/git.js.map +1 -1
- package/dist/src/react-native/javascript.js +3 -1
- package/dist/src/react-native/javascript.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.js +14 -10
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-router/codemods/client.entry.d.ts +1 -1
- package/dist/src/react-router/codemods/client.entry.js +69 -12
- package/dist/src/react-router/codemods/client.entry.js.map +1 -1
- package/dist/src/react-router/codemods/react-router-config.js +1 -1
- package/dist/src/react-router/codemods/react-router-config.js.map +1 -1
- package/dist/src/react-router/codemods/root.js +1 -2
- package/dist/src/react-router/codemods/root.js.map +1 -1
- package/dist/src/react-router/codemods/server-entry.d.ts +1 -1
- package/dist/src/react-router/codemods/server-entry.js +39 -4
- package/dist/src/react-router/codemods/server-entry.js.map +1 -1
- package/dist/src/react-router/codemods/vite.js +46 -1
- package/dist/src/react-router/codemods/vite.js.map +1 -1
- package/dist/src/react-router/react-router-wizard.js +55 -10
- package/dist/src/react-router/react-router-wizard.js.map +1 -1
- package/dist/src/react-router/sdk-setup.d.ts +5 -3
- package/dist/src/react-router/sdk-setup.js +35 -9
- package/dist/src/react-router/sdk-setup.js.map +1 -1
- package/dist/src/react-router/templates.d.ts +2 -2
- package/dist/src/react-router/templates.js +72 -2
- package/dist/src/react-router/templates.js.map +1 -1
- package/dist/src/remix/remix-wizard.js +2 -4
- package/dist/src/remix/remix-wizard.js.map +1 -1
- package/dist/src/run.d.ts +1 -1
- package/dist/src/run.js +5 -0
- package/dist/src/run.js.map +1 -1
- package/dist/src/sourcemaps/tools/vite.js +1 -1
- package/dist/src/sourcemaps/tools/vite.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup/vite.js +1 -1
- package/dist/src/sveltekit/sdk-setup/vite.js.map +1 -1
- package/dist/src/sveltekit/sveltekit-wizard.js +2 -4
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
- package/dist/src/utils/abort-if-sportlight-not-supported.d.ts +5 -0
- package/dist/src/utils/abort-if-sportlight-not-supported.js +40 -0
- package/dist/src/utils/abort-if-sportlight-not-supported.js.map +1 -0
- package/dist/src/utils/ast-utils.d.ts +11 -1
- package/dist/src/utils/ast-utils.js +19 -1
- package/dist/src/utils/ast-utils.js.map +1 -1
- package/dist/src/utils/clack/index.d.ts +2 -2
- package/dist/src/utils/clack/index.js.map +1 -1
- package/dist/src/utils/clack/mcp-config.js +117 -59
- package/dist/src/utils/clack/mcp-config.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/test/angular/angular-wizard.test.js +2 -4
- package/dist/test/angular/angular-wizard.test.js.map +1 -1
- package/dist/test/apple/code-tools.test.js +78 -0
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/apple/configure-package-manager.test.d.ts +1 -0
- package/dist/test/apple/configure-package-manager.test.js +161 -0
- package/dist/test/apple/configure-package-manager.test.js.map +1 -0
- package/dist/test/cloudflare/create-wrangler-config.test.d.ts +1 -0
- package/dist/test/cloudflare/create-wrangler-config.test.js +48 -0
- package/dist/test/cloudflare/create-wrangler-config.test.js.map +1 -0
- package/dist/test/cloudflare/ensure-wrangler-config.test.d.ts +1 -0
- package/dist/test/cloudflare/ensure-wrangler-config.test.js +61 -0
- package/dist/test/cloudflare/ensure-wrangler-config.test.js.map +1 -0
- package/dist/test/cloudflare/find-wrangler-config.test.d.ts +1 -0
- package/dist/test/cloudflare/find-wrangler-config.test.js +77 -0
- package/dist/test/cloudflare/find-wrangler-config.test.js.map +1 -0
- package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.d.ts +1 -0
- package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js +81 -0
- package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js.map +1 -0
- package/dist/test/cloudflare/sdk-setup.test.d.ts +1 -0
- package/dist/test/cloudflare/sdk-setup.test.js +170 -0
- package/dist/test/cloudflare/sdk-setup.test.js.map +1 -0
- package/dist/test/cloudflare/templates.test.d.ts +1 -0
- package/dist/test/cloudflare/templates.test.js +122 -0
- package/dist/test/cloudflare/templates.test.js.map +1 -0
- package/dist/test/cloudflare/update-wrangler-config.test.d.ts +1 -0
- package/dist/test/cloudflare/update-wrangler-config.test.js +216 -0
- package/dist/test/cloudflare/update-wrangler-config.test.js.map +1 -0
- package/dist/test/cloudflare/wrap-worker.test.d.ts +1 -0
- package/dist/test/cloudflare/wrap-worker.test.js +206 -0
- package/dist/test/cloudflare/wrap-worker.test.js.map +1 -0
- package/dist/test/react-native/expo.test.js +140 -0
- package/dist/test/react-native/expo.test.js.map +1 -1
- package/dist/test/react-native/git.test.d.ts +1 -0
- package/dist/test/react-native/git.test.js +160 -0
- package/dist/test/react-native/git.test.js.map +1 -0
- package/dist/test/react-router/codemods/client-entry.test.js +29 -0
- package/dist/test/react-router/codemods/client-entry.test.js.map +1 -1
- package/dist/test/react-router/codemods/root.test.js +4 -0
- package/dist/test/react-router/codemods/root.test.js.map +1 -1
- package/dist/test/react-router/codemods/server-entry.test.js +70 -0
- package/dist/test/react-router/codemods/server-entry.test.js.map +1 -1
- package/dist/test/react-router/codemods/vite.test.js +89 -0
- package/dist/test/react-router/codemods/vite.test.js.map +1 -1
- package/dist/test/react-router/sdk-setup.test.js +64 -8
- package/dist/test/react-router/sdk-setup.test.js.map +1 -1
- package/dist/test/react-router/templates.test.js +50 -0
- package/dist/test/react-router/templates.test.js.map +1 -1
- package/dist/test/sourcemaps/tools/vite.test.js +12 -8
- package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
- package/dist/test/utils/ast-utils.test.js +22 -0
- package/dist/test/utils/ast-utils.test.js.map +1 -1
- package/dist/test/utils/clack/mcp-config.test.js +176 -51
- package/dist/test/utils/clack/mcp-config.test.js.map +1 -1
- package/package.json +6 -5
|
@@ -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.instrumentRootRoute = exports.initializeSentryOnEntryClient = exports.supportsInstrumentationAPI = 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"));
|
|
@@ -100,10 +100,9 @@ async function ensureEntryFileExists(filename, filePath) {
|
|
|
100
100
|
throw new Error(`Failed to create or find ${filename}. Please create this file manually or ensure your React Router v7 project structure is correct.`);
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
|
-
function runReactRouterReveal(
|
|
104
|
-
if (
|
|
105
|
-
|
|
106
|
-
!fs.existsSync(path.join(process.cwd(), 'app/entry.client.jsx')))) {
|
|
103
|
+
function runReactRouterReveal() {
|
|
104
|
+
if (!fs.existsSync(path.join(process.cwd(), 'app', 'entry.client.tsx')) &&
|
|
105
|
+
!fs.existsSync(path.join(process.cwd(), 'app', 'entry.client.jsx'))) {
|
|
107
106
|
try {
|
|
108
107
|
childProcess.execSync(REACT_ROUTER_REVEAL_COMMAND, {
|
|
109
108
|
encoding: 'utf8',
|
|
@@ -129,11 +128,32 @@ function isReactRouterV7(packageJson) {
|
|
|
129
128
|
return (0, semver_1.gte)(minVer, '7.0.0');
|
|
130
129
|
}
|
|
131
130
|
exports.isReactRouterV7 = isReactRouterV7;
|
|
132
|
-
|
|
131
|
+
function getReactRouterVersion(packageJson) {
|
|
132
|
+
const rangeVersion = (0, package_json_1.getPackageVersion)('@react-router/dev', packageJson);
|
|
133
|
+
if (!rangeVersion) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
const coerced = (0, semver_1.coerce)(rangeVersion);
|
|
137
|
+
return coerced ? coerced.version : rangeVersion;
|
|
138
|
+
}
|
|
139
|
+
exports.getReactRouterVersion = getReactRouterVersion;
|
|
140
|
+
function supportsInstrumentationAPI(packageJson) {
|
|
141
|
+
const reactRouterVersion = (0, package_json_1.getPackageVersion)('@react-router/dev', packageJson);
|
|
142
|
+
if (!reactRouterVersion) {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
const minVer = (0, semver_1.minVersion)(reactRouterVersion);
|
|
146
|
+
if (!minVer) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
return (0, semver_1.gte)(minVer, '7.9.5');
|
|
150
|
+
}
|
|
151
|
+
exports.supportsInstrumentationAPI = supportsInstrumentationAPI;
|
|
152
|
+
async function initializeSentryOnEntryClient(dsn, enableTracing, enableReplay, enableLogs, isTS, useInstrumentationAPI = false) {
|
|
133
153
|
const clientEntryPath = getAppFilePath('entry.client', isTS);
|
|
134
154
|
const clientEntryFilename = path.basename(clientEntryPath);
|
|
135
155
|
await ensureEntryFileExists(clientEntryFilename, clientEntryPath);
|
|
136
|
-
await (0, client_entry_1.instrumentClientEntry)(clientEntryPath, dsn, enableTracing, enableReplay, enableLogs);
|
|
156
|
+
await (0, client_entry_1.instrumentClientEntry)(clientEntryPath, dsn, enableTracing, enableReplay, enableLogs, useInstrumentationAPI);
|
|
137
157
|
prompts_1.default.log.success(`Updated ${chalk_1.default.cyan(clientEntryFilename)} with Sentry initialization.`);
|
|
138
158
|
}
|
|
139
159
|
exports.initializeSentryOnEntryClient = initializeSentryOnEntryClient;
|
|
@@ -193,14 +213,20 @@ async function updatePackageJsonScripts() {
|
|
|
193
213
|
else {
|
|
194
214
|
packageJson.scripts.start = mergeNodeOptions(startScript);
|
|
195
215
|
}
|
|
216
|
+
// Prevent React CJS dev/prod bundle mismatch when --import loads react
|
|
217
|
+
// before react-router-serve sets NODE_ENV
|
|
218
|
+
if (packageJson.scripts.start.includes('--import') &&
|
|
219
|
+
!packageJson.scripts.start.includes('NODE_ENV=')) {
|
|
220
|
+
packageJson.scripts.start = `NODE_ENV=production ${packageJson.scripts.start}`;
|
|
221
|
+
}
|
|
196
222
|
await fs.promises.writeFile('package.json', JSON.stringify(packageJson, null, 2));
|
|
197
223
|
}
|
|
198
224
|
exports.updatePackageJsonScripts = updatePackageJsonScripts;
|
|
199
|
-
async function instrumentSentryOnEntryServer(isTS) {
|
|
225
|
+
async function instrumentSentryOnEntryServer(isTS, useInstrumentationAPI = false) {
|
|
200
226
|
const serverEntryPath = getAppFilePath('entry.server', isTS);
|
|
201
227
|
const serverEntryFilename = path.basename(serverEntryPath);
|
|
202
228
|
await ensureEntryFileExists(serverEntryFilename, serverEntryPath);
|
|
203
|
-
await (0, server_entry_1.instrumentServerEntry)(serverEntryPath);
|
|
229
|
+
await (0, server_entry_1.instrumentServerEntry)(serverEntryPath, useInstrumentationAPI);
|
|
204
230
|
prompts_1.default.log.success(`Updated ${chalk_1.default.cyan(serverEntryFilename)} with Sentry error handling.`);
|
|
205
231
|
}
|
|
206
232
|
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(force = false): void {\n if (\n force ||\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,4DAA8C;AAE9C,+EAA+E;AAC/E,6DAAmC;AACnC,kDAA0B;AAC1B,mCAAiD;AAGjD,wDAA0D;AAC1D,0CAAuC;AACvC,2CAAoE;AACpE,0CAAiD;AACjD,0DAAgE;AAChE,0CAAmD;AACnD,0DAAgE;AAChE,0CAAuD;AACvD,wEAA6E;AAE7E,MAAM,2BAA2B,GAAG,yBAAyB,CAAC;AAC9D,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AACrD,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAElC,SAAS,yBAAyB,CAChC,QAAgB,EAChB,YAAoB,EACpB,YAAoB;IAEpB,OAAO,CACL,qCAAqC,QAAQ,KAAK,YAAY,IAAI;QAClE,wDAAwD;QACxD,GAAG,YAAY,EAAE,CAClB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,QAAgB,EAChB,IAAa,EACb,MAAM,GAAG,IAAI;IAEb,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,QAAQ,IAAI,GAAG,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,SAAgB,gBAAgB,CAAC,QAAgB,EAAE,IAAa;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACjC,OAAO,IAAI,CAAC,IAAI,CACd,OAAO,CAAC,GAAG,EAAE,EACb,aAAa,EACb,gBAAgB,EAChB,GAAG,QAAQ,IAAI,GAAG,EAAE,CACrB,CAAC;AACJ,CAAC;AARD,4CAQC;AAEM,KAAK,UAAU,iCAAiC,CACrD,eAAuB,EACvB,QAAgB;IAEhB,MAAM,eAAe,GAAG,MAAM,iBAAK,CAAC,OAAO,CAAC;QAC1C,OAAO,EAAE,iCAAiC,eAAK,CAAC,IAAI,CAClD,2BAA2B,CAC5B,2BAA2B;QAC5B,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,eAAe,EAAE;QACnB,IAAI;YACF,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,eAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,2BAA2B,EAAE;gBAChE,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YACH,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEvB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gBAC3B,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,SAAS,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAC7D,CAAC;gBACF,OAAO,IAAI,CAAC;aACb;iBAAM;gBACL,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,GAAG,eAAK,CAAC,IAAI,CACX,eAAe,CAChB,wCAAwC,CAC1C,CAAC;aACH;SACF;QAAC,OAAO,CAAC,EAAE;YACV,IAAA,aAAK,EAAC,4CAA4C,EAAE,CAAC,CAAC,CAAC;YACvD,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,iBAAiB,eAAK,CAAC,IAAI,CACzB,2BAA2B,CAC5B,2DAA2D,CAC7D,CAAC;SACH;KACF;IAED,OAAO,KAAK,CAAC,CAAC,uDAAuD;AACvE,CAAC;AA3CD,8EA2CC;AAED,KAAK,UAAU,qBAAqB,CAClC,QAAgB,EAChB,QAAgB;IAEhB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC3B,OAAO,CAAC,6BAA6B;KACtC;IAED,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE1D,MAAM,UAAU,GAAG,MAAM,iCAAiC,CACxD,QAAQ,EACR,QAAQ,CACT,CAAC;IAEF,IAAI,CAAC,UAAU,EAAE;QACf,MAAM,IAAI,KAAK,CACb,4BAA4B,QAAQ,iGAAiG,CACtI,CAAC;KACH;AACH,CAAC;AAED,SAAgB,oBAAoB;IAClC,IACE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACnE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC,EACnE;QACA,IAAI;YACF,YAAY,CAAC,QAAQ,CAAC,2BAA2B,EAAE;gBACjD,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;SACJ;QAAC,OAAO,CAAC,EAAE;YACV,IAAA,aAAK,EAAC,4CAA4C,EAAE,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,CAAC;SACT;KACF;AACH,CAAC;AAfD,oDAeC;AAED,SAAgB,eAAe,CAAC,WAA2B;IACzD,MAAM,kBAAkB,GAAG,IAAA,gCAAiB,EAC1C,mBAAmB,EACnB,WAAW,CACZ,CAAC;IACF,IAAI,CAAC,kBAAkB,EAAE;QACvB,OAAO,KAAK,CAAC;KACd;IAED,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,kBAAkB,CAAC,CAAC;IAE9C,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,KAAK,CAAC;KACd;IAED,OAAO,IAAA,YAAG,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AAhBD,0CAgBC;AAED,SAAgB,qBAAqB,CACnC,WAA2B;IAE3B,MAAM,YAAY,GAAG,IAAA,gCAAiB,EAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;IACzE,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,OAAO,GAAG,IAAA,eAAM,EAAC,YAAY,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;AAClD,CAAC;AAVD,sDAUC;AAED,SAAgB,0BAA0B,CACxC,WAA2B;IAE3B,MAAM,kBAAkB,GAAG,IAAA,gCAAiB,EAC1C,mBAAmB,EACnB,WAAW,CACZ,CAAC;IACF,IAAI,CAAC,kBAAkB,EAAE;QACvB,OAAO,KAAK,CAAC;KACd;IAED,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,kBAAkB,CAAC,CAAC;IAE9C,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,KAAK,CAAC;KACd;IAED,OAAO,IAAA,YAAG,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AAlBD,gEAkBC;AAEM,KAAK,UAAU,6BAA6B,CACjD,GAAW,EACX,aAAsB,EACtB,YAAqB,EACrB,UAAmB,EACnB,IAAa,EACb,qBAAqB,GAAG,KAAK;IAE7B,MAAM,eAAe,GAAG,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAE3D,MAAM,qBAAqB,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;IAElE,MAAM,IAAA,oCAAqB,EACzB,eAAe,EACf,GAAG,EACH,aAAa,EACb,YAAY,EACZ,UAAU,EACV,qBAAqB,CACtB,CAAC;IAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,WAAW,eAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,8BAA8B,CACzE,CAAC;AACJ,CAAC;AAzBD,sEAyBC;AAEM,KAAK,UAAU,mBAAmB,CAAC,IAAa;IACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC5B,MAAM,IAAI,KAAK,CACb,GAAG,YAAY,gHAAgH,CAChI,CAAC;KACH;IAED,MAAM,IAAA,qBAAc,EAAC,YAAY,CAAC,CAAC;IACnC,iBAAK,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;AAC/E,CAAC;AAZD,kDAYC;AAED,SAAgB,+BAA+B,CAC7C,GAAW,EACX,gBAKC;IAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAE3E,MAAM,OAAO,GAAG,IAAA,iDAAqC,EACnD,GAAG,EACH,gBAAgB,CAAC,WAAW,EAC5B,gBAAgB,CAAC,SAAS,EAC1B,gBAAgB,CAAC,IAAI,CACtB,CAAC;IAEF,EAAE,CAAC,aAAa,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC/C,iBAAK,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,eAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAClE,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AArBD,0EAqBC;AAEM,KAAK,UAAU,wBAAwB;IAC5C,MAAM,WAAW,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;IAE9C,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE;QACzB,MAAM,IAAI,KAAK,CACb,iIAAiI,CAClI,CAAC;KACH;IAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE;QAC9B,MAAM,IAAI,KAAK,CACb,gJAAgJ,CACjJ,CAAC;KACH;IAED,SAAS,gBAAgB,CACvB,aAAqB,EACrB,cAAc,GAAG,yBAAyB;QAE1C,IAAI,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;YAC1C,OAAO,aAAa,CAAC;SACtB;QAED,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACzE,IAAI,WAAW,EAAE;YACf,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,aAAa,GACjB,GAAG,eAAe,aAAa,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;YACzD,OAAO,aAAa,CAAC,OAAO,CAC1B,+BAA+B,EAC/B,iBAAiB,aAAa,GAAG,CAClC,CAAC;SACH;QAED,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CACvC,2FAA2F,CAC5F,CAAC;QACF,IAAI,aAAa,EAAE;YACjB,MAAM,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,aAAa,GACjB,GAAG,eAAe,aAAa,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;YACzD,OAAO,aAAa,CAAC,OAAO,CAC1B,2FAA2F,EAC3F,iBAAiB,aAAa,IAAI,WAAW,EAAE,CAChD,CAAC;SACH;QAED,OAAO,0BAA0B,cAAc,KAAK,aAAa,EAAE,CAAC;IACtE,CAAC;IAED,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE;QAC3B,WAAW,CAAC,OAAO,CAAC,GAAG,GAAG,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;KACrE;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;IAC9C,IACE,CAAC,WAAW,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC3C,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,EACrC;QACA,WAAW,CAAC,OAAO,CAAC,KAAK,GAAG,4BAA4B,oBAAoB,8CAA8C,CAAC;KAC5H;SAAM;QACL,WAAW,CAAC,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;KAC3D;IAED,uEAAuE;IACvE,0CAA0C;IAC1C,IACE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC9C,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAChD;QACA,WAAW,CAAC,OAAO,CAAC,KAAK,GAAG,uBAAuB,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;KAChF;IAED,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,cAAc,EACd,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CACrC,CAAC;AACJ,CAAC;AA9ED,4DA8EC;AAEM,KAAK,UAAU,6BAA6B,CACjD,IAAa,EACb,qBAAqB,GAAG,KAAK;IAE7B,MAAM,eAAe,GAAG,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAE3D,MAAM,qBAAqB,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;IAElE,MAAM,IAAA,oCAAqB,EAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;IAEpE,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,WAAW,eAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,8BAA8B,CACzE,CAAC;AACJ,CAAC;AAdD,sEAcC;AAEM,KAAK,UAAU,8BAA8B,CAClD,OAAe,EACf,WAAmB;IAEnB,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAC1E,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAEvD,IAAI;QACF,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAA,2BAAoB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAE1E,iBAAK,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,QAAQ,iCAAiC,CAAC,CAAC;QAExE,IAAI,YAAY,EAAE;YAChB,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,+CAA+C,eAAK,CAAC,GAAG,CACtD,qCAAqC,CACtC,6CAA6C,CAC/C,CAAC;SACH;KACF;IAAC,OAAO,CAAC,EAAE;QACV,IAAA,aAAK,EAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,yBAAyB,CACvB,QAAQ,EACR,YAAY,EACZ,0CAA0C,CAC3C,CACF,CAAC;KACH;AACH,CAAC;AAhCD,wEAgCC;AAEM,KAAK,UAAU,0BAA0B,CAAC,IAAa;IAC5D,MAAM,cAAc,GAAG,uBAAuB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAE5C,IAAI;QACF,MAAM,iBAAiB,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,IAAA,iDAA2B,EAAC,IAAI,CAAC,CAAC;QAElE,IAAI,iBAAiB,EAAE;YACrB,iBAAK,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,QAAQ,6BAA6B,CAAC,CAAC;SACrE;aAAM;YACL,iBAAK,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,QAAQ,6BAA6B,CAAC,CAAC;SACrE;QAED,IAAI,aAAa,EAAE;YACjB,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,GAAG,eAAK,CAAC,MAAM,CACb,OAAO,CACR,sDAAsD,eAAK,CAAC,IAAI,CAC/D,WAAW,CACZ,qEAAqE,CACvE,CAAC;SACH;KACF;IAAC,OAAO,CAAC,EAAE;QACV,IAAA,aAAK,EAAC,uCAAuC,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,yBAAyB,CACvB,QAAQ,EACR,YAAY,EACZ,iDAAiD,CAClD,CACF,CAAC;KACH;AACH,CAAC;AApCD,gEAoCC","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 { 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 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 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.9.5');\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): 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 );\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 // 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"]}
|
|
@@ -2,8 +2,8 @@ export declare const ERROR_BOUNDARY_TEMPLATE: string;
|
|
|
2
2
|
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
3
|
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
4
|
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;
|
|
5
|
+
export declare const getManualClientEntryContent: (dsn: string, enableTracing: boolean, enableReplay: boolean, enableLogs: boolean, useInstrumentationAPI?: boolean) => string;
|
|
6
|
+
export declare const getManualServerEntryContent: (useInstrumentationAPI?: boolean) => string;
|
|
7
7
|
export declare const getManualHandleRequestContent: () => string;
|
|
8
8
|
export declare const getManualRootContent: (isTs: boolean) => string;
|
|
9
9
|
export declare const getManualServerInstrumentContent: (dsn: string, enableTracing: boolean, enableProfiling: boolean, enableLogs?: boolean) => string;
|
|
@@ -92,7 +92,51 @@ const getSentryInstrumentationServerContent = (dsn, enableTracing, enableProfili
|
|
|
92
92
|
return generateServerInstrumentationCode(dsn, enableTracing, enableProfiling, enableLogs);
|
|
93
93
|
};
|
|
94
94
|
exports.getSentryInstrumentationServerContent = getSentryInstrumentationServerContent;
|
|
95
|
-
const getManualClientEntryContent = (dsn, enableTracing, enableReplay, enableLogs) => {
|
|
95
|
+
const getManualClientEntryContent = (dsn, enableTracing, enableReplay, enableLogs, useInstrumentationAPI = false) => {
|
|
96
|
+
if (useInstrumentationAPI && enableTracing) {
|
|
97
|
+
const integrations = ['tracing'];
|
|
98
|
+
if (enableReplay) {
|
|
99
|
+
integrations.push('Sentry.replayIntegration()');
|
|
100
|
+
}
|
|
101
|
+
const integrationsStr = integrations.join(',\n ');
|
|
102
|
+
return (0, clack_1.makeCodeSnippet)(true, (unchanged, plus) => unchanged(`${plus("import * as Sentry from '@sentry/react-router';")}
|
|
103
|
+
import { startTransition, StrictMode } from 'react';
|
|
104
|
+
import { hydrateRoot } from 'react-dom/client';
|
|
105
|
+
import { HydratedRouter } from 'react-router/dom';
|
|
106
|
+
|
|
107
|
+
${plus(`const tracing = Sentry.reactRouterTracingIntegration({ useInstrumentationAPI: true });`)}
|
|
108
|
+
|
|
109
|
+
${plus(`Sentry.init({
|
|
110
|
+
dsn: "${dsn}",
|
|
111
|
+
|
|
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,
|
|
115
|
+
|
|
116
|
+
integrations: [
|
|
117
|
+
${integrationsStr}
|
|
118
|
+
],
|
|
119
|
+
|
|
120
|
+
${enableLogs
|
|
121
|
+
? '// Enable logs to be sent to Sentry\n enableLogs: true,\n\n '
|
|
122
|
+
: ''}tracesSampleRate: 1.0, // Capture 100% of the transactions
|
|
123
|
+
|
|
124
|
+
// Set \`tracePropagationTargets\` to declare which URL(s) should have trace propagation enabled
|
|
125
|
+
// In production, replace "yourserver.io" with your actual backend domain
|
|
126
|
+
tracePropagationTargets: [/^\\//, /^https:\\/\\/yourserver\\.io\\/api/],${enableReplay
|
|
127
|
+
? '\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,'
|
|
128
|
+
: ''}
|
|
129
|
+
});`)}
|
|
130
|
+
|
|
131
|
+
startTransition(() => {
|
|
132
|
+
hydrateRoot(
|
|
133
|
+
document,
|
|
134
|
+
<StrictMode>
|
|
135
|
+
${plus('<HydratedRouter unstable_instrumentations={[tracing.clientInstrumentation]} />')}
|
|
136
|
+
</StrictMode>
|
|
137
|
+
);
|
|
138
|
+
});`));
|
|
139
|
+
}
|
|
96
140
|
const integrations = [];
|
|
97
141
|
if (enableTracing) {
|
|
98
142
|
integrations.push('Sentry.reactRouterTracingIntegration()');
|
|
@@ -136,7 +180,30 @@ startTransition(() => {
|
|
|
136
180
|
});`));
|
|
137
181
|
};
|
|
138
182
|
exports.getManualClientEntryContent = getManualClientEntryContent;
|
|
139
|
-
const getManualServerEntryContent = () => {
|
|
183
|
+
const getManualServerEntryContent = (useInstrumentationAPI = false) => {
|
|
184
|
+
if (useInstrumentationAPI) {
|
|
185
|
+
return (0, clack_1.makeCodeSnippet)(true, (unchanged, plus) => unchanged(`${plus("import * as Sentry from '@sentry/react-router';")}
|
|
186
|
+
import { createReadableStreamFromReadable } from '@react-router/node';
|
|
187
|
+
import { renderToPipeableStream } from 'react-dom/server';
|
|
188
|
+
import { ServerRouter } from 'react-router';
|
|
189
|
+
|
|
190
|
+
${plus(`const handleRequest = Sentry.createSentryHandleRequest({
|
|
191
|
+
ServerRouter,
|
|
192
|
+
renderToPipeableStream,
|
|
193
|
+
createReadableStreamFromReadable,
|
|
194
|
+
});`)}
|
|
195
|
+
|
|
196
|
+
export default handleRequest;
|
|
197
|
+
|
|
198
|
+
${plus(`export const handleError = Sentry.createSentryHandleError({
|
|
199
|
+
logErrors: false
|
|
200
|
+
});`)}
|
|
201
|
+
|
|
202
|
+
${plus(`// Enable automatic server-side instrumentation for loaders, actions, middleware
|
|
203
|
+
export const unstable_instrumentations = [Sentry.createSentryServerInstrumentation()];`)}
|
|
204
|
+
|
|
205
|
+
// ... rest of your server entry`));
|
|
206
|
+
}
|
|
140
207
|
return (0, clack_1.makeCodeSnippet)(true, (unchanged, plus) => unchanged(`${plus("import * as Sentry from '@sentry/react-router';")}
|
|
141
208
|
import { createReadableStreamFromReadable } from '@react-router/node';
|
|
142
209
|
import { renderToPipeableStream } from 'react-dom/server';
|
|
@@ -266,6 +333,9 @@ export default defineConfig(config => {
|
|
|
266
333
|
authToken: process.env.SENTRY_AUTH_TOKEN,
|
|
267
334
|
}, config),`)}
|
|
268
335
|
],
|
|
336
|
+
${plus(`optimizeDeps: {
|
|
337
|
+
exclude: ['@sentry/react-router'],
|
|
338
|
+
},`)}
|
|
269
339
|
};
|
|
270
340
|
});`));
|
|
271
341
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/react-router/templates.ts"],"names":[],"mappings":"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","sourcesContent":["import { makeCodeSnippet } from '../utils/clack';\n\nfunction generateErrorBoundaryTemplate(\n isTypeScript: boolean,\n forManualInstructions = false,\n): string {\n const typeAnnotations = isTypeScript\n ? { stack: ': string | undefined', props: ': Route.ErrorBoundaryProps' }\n : { stack: '', props: '' };\n\n const commentLine = forManualInstructions\n ? '// you only want to capture non 404-errors that reach the boundary\\n '\n : '// Only capture non-404 errors (all errors here are already non-RouteErrorResponse)\\n ';\n\n return `function ErrorBoundary({ error }${typeAnnotations.props}) {\n let message = \"Oops!\";\n let details = \"An unexpected error occurred.\";\n let stack${typeAnnotations.stack};\n\n if (isRouteErrorResponse(error)) {\n message = error.status === 404 ? \"404\" : \"Error\";\n details =\n error.status === 404\n ? \"The requested page could not be found.\"\n : error.statusText || details;\n } else if (error && error instanceof Error) {\n ${commentLine}Sentry.captureException(error);\n details = error.message;\n stack = error.stack;\n }\n\n return (\n <main>\n <h1>{message}</h1>\n <p>{details}</p>\n {stack && (\n <pre>\n <code>{stack}</code>\n </pre>\n )}\n </main>\n );\n}`;\n}\n\nexport const ERROR_BOUNDARY_TEMPLATE = generateErrorBoundaryTemplate(false);\n\nexport 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}`;\n\nexport 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}`;\n\nfunction generateServerInstrumentationCode(\n dsn: string,\n enableTracing: boolean,\n enableProfiling: boolean,\n enableLogs: boolean,\n): string {\n return `import * as Sentry from '@sentry/react-router';${\n enableProfiling\n ? `\\nimport { nodeProfilingIntegration } from '@sentry/profiling-node';`\n : ''\n }\n\nSentry.init({\n dsn: \"${dsn}\",\n\n // Adds request headers and IP for users, for more info visit:\n // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#sendDefaultPii\n sendDefaultPii: true,${\n enableLogs\n ? '\\n\\n // Enable logs to be sent to Sentry\\n enableLogs: true,'\n : ''\n }${enableProfiling ? '\\n\\n integrations: [nodeProfilingIntegration()],' : ''}\n tracesSampleRate: ${enableTracing ? '1.0' : '0'}, ${\n enableTracing ? '// Capture 100% of the transactions' : ''\n }${\n enableProfiling\n ? '\\n profilesSampleRate: 1.0, // profile every transaction'\n : ''\n }${\n enableTracing\n ? `\n\n // Set up performance monitoring\n beforeSend(event) {\n // Filter out 404s from error reporting\n if (event.exception) {\n const error = event.exception.values?.[0];\n if (error?.type === \"NotFoundException\" || error?.value?.includes(\"404\")) {\n return null;\n }\n }\n return event;\n },`\n : ''\n }\n});`;\n}\n\nexport const getSentryInstrumentationServerContent = (\n dsn: string,\n enableTracing: boolean,\n enableProfiling = false,\n enableLogs = false,\n) => {\n return generateServerInstrumentationCode(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n};\n\nexport const getManualClientEntryContent = (\n dsn: string,\n enableTracing: boolean,\n enableReplay: boolean,\n enableLogs: boolean,\n) => {\n const integrations = [];\n\n if (enableTracing) {\n integrations.push('Sentry.reactRouterTracingIntegration()');\n }\n\n if (enableReplay) {\n integrations.push('Sentry.replayIntegration()');\n }\n\n const integrationsStr =\n integrations.length > 0 ? integrations.join(',\\n ') : '';\n\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\"import * as Sentry from '@sentry/react-router';\")}\nimport { startTransition, StrictMode } from 'react';\nimport { hydrateRoot } from 'react-dom/client';\nimport { HydratedRouter } from 'react-router/dom';\n\n${plus(`Sentry.init({\n dsn: \"${dsn}\",\n\n // Adds request headers and IP for users, for more info visit:\n // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#sendDefaultPii\n sendDefaultPii: true,\n\n integrations: [\n ${integrationsStr}\n ],\n\n ${\n enableLogs\n ? '// Enable logs to be sent to Sentry\\n enableLogs: true,\\n\\n '\n : ''\n }tracesSampleRate: ${enableTracing ? '1.0' : '0'},${\n enableTracing ? ' // Capture 100% of the transactions' : ''\n}${\n enableTracing\n ? '\\n\\n // Set `tracePropagationTargets` to declare which URL(s) should have trace propagation enabled\\n // In production, replace \"yourserver.io\" with your actual backend domain\\n tracePropagationTargets: [/^\\\\//, /^https:\\\\/\\\\/yourserver\\\\.io\\\\/api/],'\n : ''\n}${\n enableReplay\n ? '\\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,'\n : ''\n}\n});`)}\n\nstartTransition(() => {\n hydrateRoot(\n document,\n <StrictMode>\n <HydratedRouter />\n </StrictMode>\n );\n});`),\n );\n};\n\nexport const getManualServerEntryContent = () => {\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\"import * as Sentry from '@sentry/react-router';\")}\nimport { createReadableStreamFromReadable } from '@react-router/node';\nimport { renderToPipeableStream } from 'react-dom/server';\nimport { ServerRouter } from 'react-router';\n\n${plus(`const handleRequest = Sentry.createSentryHandleRequest({\n ServerRouter,\n renderToPipeableStream,\n createReadableStreamFromReadable,\n});`)}\n\nexport default handleRequest;\n\n${plus(`export const handleError = Sentry.createSentryHandleError({\n logErrors: false\n});`)}\n\n// ... rest of your server entry`),\n );\n};\n\nexport const getManualHandleRequestContent = () => {\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\"import * as Sentry from '@sentry/react-router';\")}\nimport { createReadableStreamFromReadable } from '@react-router/node';\nimport { renderToPipeableStream } from 'react-dom/server';\nimport { ServerRouter } from 'react-router';\n\n${plus(`// Replace your existing handleRequest function with this Sentry-wrapped version:\nconst handleRequest = Sentry.createSentryHandleRequest({\n ServerRouter,\n renderToPipeableStream,\n createReadableStreamFromReadable,\n});`)}\n\n${plus(`// If you have a custom handleRequest implementation, wrap it like this:\n// export default Sentry.wrapSentryHandleRequest(yourCustomHandleRequest);`)}\n\nexport default handleRequest;`),\n );\n};\n\nexport const getManualRootContent = (isTs: boolean) => {\n const typeAnnotations = isTs\n ? { stack: ': string | undefined', props: ': Route.ErrorBoundaryProps' }\n : { stack: '', props: '' };\n\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\"import * as Sentry from '@sentry/react-router';\")}\n\nexport function ErrorBoundary({ error }${typeAnnotations.props}) {\n let message = \"Oops!\";\n let details = \"An unexpected error occurred.\";\n let stack${typeAnnotations.stack};\n\n if (isRouteErrorResponse(error)) {\n message = error.status === 404 ? \"404\" : \"Error\";\n details =\n error.status === 404\n ? \"The requested page could not be found.\"\n : error.statusText || details;\n } else if (error && error instanceof Error) {\n // you only want to capture non 404-errors that reach the boundary\n ${plus('Sentry.captureException(error);')}\n details = error.message;\n stack = error.stack;\n }\n\n return (\n <main>\n <h1>{message}</h1>\n <p>{details}</p>\n {stack && (\n <pre>\n <code>{stack}</code>\n </pre>\n )}\n </main>\n );\n}\n// ...`),\n );\n};\n\nexport const getManualServerInstrumentContent = (\n dsn: string,\n enableTracing: boolean,\n enableProfiling: boolean,\n enableLogs = false,\n) => {\n return makeCodeSnippet(true, (unchanged, plus) =>\n plus(\n generateServerInstrumentationCode(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n ),\n ),\n );\n};\n\nexport const getManualReactRouterConfigContent = (isTS = true) => {\n return makeCodeSnippet(true, (unchanged, plus) =>\n isTS\n ? unchanged(`${plus(\n 'import type { Config } from \"@react-router/dev/config\";',\n )}\n${plus(\"import { sentryOnBuildEnd } from '@sentry/react-router';\")}\n\nexport default {\n ${plus('ssr: true,')}\n ${plus(`buildEnd: async ({ viteConfig, reactRouterConfig, buildManifest }) => {\n await sentryOnBuildEnd({ viteConfig, reactRouterConfig, buildManifest });\n },`)}\n} satisfies Config;\n\n// If you already have a buildEnd hook, modify it to call sentryOnBuildEnd:\n// buildEnd: async (args) => {\n// await yourExistingLogic(args);\n// await sentryOnBuildEnd(args);\n// }`)\n : unchanged(`${plus(\n \"import { sentryOnBuildEnd } from '@sentry/react-router';\",\n )}\n\nexport default {\n ${plus('ssr: true,')}\n ${plus(`buildEnd: async ({ viteConfig, reactRouterConfig, buildManifest }) => {\n await sentryOnBuildEnd({ viteConfig, reactRouterConfig, buildManifest });\n },`)}\n};\n\n// If you already have a buildEnd hook, modify it to call sentryOnBuildEnd:\n// buildEnd: async (args) => {\n// await yourExistingLogic(args);\n// await sentryOnBuildEnd(args);\n// }`),\n );\n};\n\nexport const getManualViteConfigContent = (\n orgSlug: string,\n projectSlug: string,\n) => {\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\n \"import { sentryReactRouter } from '@sentry/react-router';\",\n )}\nimport { defineConfig } from 'vite';\n\nexport default defineConfig(config => {\n return {\n plugins: [\n // ... your existing plugins\n ${plus(`sentryReactRouter({\n org: \"${orgSlug}\",\n project: \"${projectSlug}\",\n authToken: process.env.SENTRY_AUTH_TOKEN,\n }, config),`)}\n ],\n };\n});`),\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/react-router/templates.ts"],"names":[],"mappings":"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","sourcesContent":["import { makeCodeSnippet } from '../utils/clack';\n\nfunction generateErrorBoundaryTemplate(\n isTypeScript: boolean,\n forManualInstructions = false,\n): string {\n const typeAnnotations = isTypeScript\n ? { stack: ': string | undefined', props: ': Route.ErrorBoundaryProps' }\n : { stack: '', props: '' };\n\n const commentLine = forManualInstructions\n ? '// you only want to capture non 404-errors that reach the boundary\\n '\n : '// Only capture non-404 errors (all errors here are already non-RouteErrorResponse)\\n ';\n\n return `function ErrorBoundary({ error }${typeAnnotations.props}) {\n let message = \"Oops!\";\n let details = \"An unexpected error occurred.\";\n let stack${typeAnnotations.stack};\n\n if (isRouteErrorResponse(error)) {\n message = error.status === 404 ? \"404\" : \"Error\";\n details =\n error.status === 404\n ? \"The requested page could not be found.\"\n : error.statusText || details;\n } else if (error && error instanceof Error) {\n ${commentLine}Sentry.captureException(error);\n details = error.message;\n stack = error.stack;\n }\n\n return (\n <main>\n <h1>{message}</h1>\n <p>{details}</p>\n {stack && (\n <pre>\n <code>{stack}</code>\n </pre>\n )}\n </main>\n );\n}`;\n}\n\nexport const ERROR_BOUNDARY_TEMPLATE = generateErrorBoundaryTemplate(false);\n\nexport 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}`;\n\nexport 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}`;\n\nfunction generateServerInstrumentationCode(\n dsn: string,\n enableTracing: boolean,\n enableProfiling: boolean,\n enableLogs: boolean,\n): string {\n return `import * as Sentry from '@sentry/react-router';${\n enableProfiling\n ? `\\nimport { nodeProfilingIntegration } from '@sentry/profiling-node';`\n : ''\n }\n\nSentry.init({\n dsn: \"${dsn}\",\n\n // Adds request headers and IP for users, for more info visit:\n // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#sendDefaultPii\n sendDefaultPii: true,${\n enableLogs\n ? '\\n\\n // Enable logs to be sent to Sentry\\n enableLogs: true,'\n : ''\n }${enableProfiling ? '\\n\\n integrations: [nodeProfilingIntegration()],' : ''}\n tracesSampleRate: ${enableTracing ? '1.0' : '0'}, ${\n enableTracing ? '// Capture 100% of the transactions' : ''\n }${\n enableProfiling\n ? '\\n profilesSampleRate: 1.0, // profile every transaction'\n : ''\n }${\n enableTracing\n ? `\n\n // Set up performance monitoring\n beforeSend(event) {\n // Filter out 404s from error reporting\n if (event.exception) {\n const error = event.exception.values?.[0];\n if (error?.type === \"NotFoundException\" || error?.value?.includes(\"404\")) {\n return null;\n }\n }\n return event;\n },`\n : ''\n }\n});`;\n}\n\nexport const getSentryInstrumentationServerContent = (\n dsn: string,\n enableTracing: boolean,\n enableProfiling = false,\n enableLogs = false,\n) => {\n return generateServerInstrumentationCode(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n};\n\nexport const getManualClientEntryContent = (\n dsn: string,\n enableTracing: boolean,\n enableReplay: boolean,\n enableLogs: boolean,\n useInstrumentationAPI = false,\n) => {\n if (useInstrumentationAPI && enableTracing) {\n const integrations = ['tracing'];\n if (enableReplay) {\n integrations.push('Sentry.replayIntegration()');\n }\n\n const integrationsStr = integrations.join(',\\n ');\n\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\"import * as Sentry from '@sentry/react-router';\")}\nimport { startTransition, StrictMode } from 'react';\nimport { hydrateRoot } from 'react-dom/client';\nimport { HydratedRouter } from 'react-router/dom';\n\n${plus(\n `const tracing = Sentry.reactRouterTracingIntegration({ useInstrumentationAPI: true });`,\n)}\n\n${plus(`Sentry.init({\n dsn: \"${dsn}\",\n\n // Adds request headers and IP for users, for more info visit:\n // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#sendDefaultPii\n sendDefaultPii: true,\n\n integrations: [\n ${integrationsStr}\n ],\n\n ${\n enableLogs\n ? '// Enable logs to be sent to Sentry\\n enableLogs: true,\\n\\n '\n : ''\n }tracesSampleRate: 1.0, // Capture 100% of the transactions\n\n // Set \\`tracePropagationTargets\\` to declare which URL(s) should have trace propagation enabled\n // In production, replace \"yourserver.io\" with your actual backend domain\n tracePropagationTargets: [/^\\\\//, /^https:\\\\/\\\\/yourserver\\\\.io\\\\/api/],${\n enableReplay\n ? '\\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,'\n : ''\n }\n});`)}\n\nstartTransition(() => {\n hydrateRoot(\n document,\n <StrictMode>\n ${plus(\n '<HydratedRouter unstable_instrumentations={[tracing.clientInstrumentation]} />',\n )}\n </StrictMode>\n );\n});`),\n );\n }\n\n const integrations = [];\n\n if (enableTracing) {\n integrations.push('Sentry.reactRouterTracingIntegration()');\n }\n\n if (enableReplay) {\n integrations.push('Sentry.replayIntegration()');\n }\n\n const integrationsStr =\n integrations.length > 0 ? integrations.join(',\\n ') : '';\n\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\"import * as Sentry from '@sentry/react-router';\")}\nimport { startTransition, StrictMode } from 'react';\nimport { hydrateRoot } from 'react-dom/client';\nimport { HydratedRouter } from 'react-router/dom';\n\n${plus(`Sentry.init({\n dsn: \"${dsn}\",\n\n // Adds request headers and IP for users, for more info visit:\n // https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options/#sendDefaultPii\n sendDefaultPii: true,\n\n integrations: [\n ${integrationsStr}\n ],\n\n ${\n enableLogs\n ? '// Enable logs to be sent to Sentry\\n enableLogs: true,\\n\\n '\n : ''\n }tracesSampleRate: ${enableTracing ? '1.0' : '0'},${\n enableTracing ? ' // Capture 100% of the transactions' : ''\n}${\n enableTracing\n ? '\\n\\n // Set `tracePropagationTargets` to declare which URL(s) should have trace propagation enabled\\n // In production, replace \"yourserver.io\" with your actual backend domain\\n tracePropagationTargets: [/^\\\\//, /^https:\\\\/\\\\/yourserver\\\\.io\\\\/api/],'\n : ''\n}${\n enableReplay\n ? '\\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,'\n : ''\n}\n});`)}\n\nstartTransition(() => {\n hydrateRoot(\n document,\n <StrictMode>\n <HydratedRouter />\n </StrictMode>\n );\n});`),\n );\n};\n\nexport const getManualServerEntryContent = (useInstrumentationAPI = false) => {\n if (useInstrumentationAPI) {\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\"import * as Sentry from '@sentry/react-router';\")}\nimport { createReadableStreamFromReadable } from '@react-router/node';\nimport { renderToPipeableStream } from 'react-dom/server';\nimport { ServerRouter } from 'react-router';\n\n${plus(`const handleRequest = Sentry.createSentryHandleRequest({\n ServerRouter,\n renderToPipeableStream,\n createReadableStreamFromReadable,\n});`)}\n\nexport default handleRequest;\n\n${plus(`export const handleError = Sentry.createSentryHandleError({\n logErrors: false\n});`)}\n\n${plus(`// Enable automatic server-side instrumentation for loaders, actions, middleware\nexport const unstable_instrumentations = [Sentry.createSentryServerInstrumentation()];`)}\n\n// ... rest of your server entry`),\n );\n }\n\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\"import * as Sentry from '@sentry/react-router';\")}\nimport { createReadableStreamFromReadable } from '@react-router/node';\nimport { renderToPipeableStream } from 'react-dom/server';\nimport { ServerRouter } from 'react-router';\n\n${plus(`const handleRequest = Sentry.createSentryHandleRequest({\n ServerRouter,\n renderToPipeableStream,\n createReadableStreamFromReadable,\n});`)}\n\nexport default handleRequest;\n\n${plus(`export const handleError = Sentry.createSentryHandleError({\n logErrors: false\n});`)}\n\n// ... rest of your server entry`),\n );\n};\n\nexport const getManualHandleRequestContent = () => {\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\"import * as Sentry from '@sentry/react-router';\")}\nimport { createReadableStreamFromReadable } from '@react-router/node';\nimport { renderToPipeableStream } from 'react-dom/server';\nimport { ServerRouter } from 'react-router';\n\n${plus(`// Replace your existing handleRequest function with this Sentry-wrapped version:\nconst handleRequest = Sentry.createSentryHandleRequest({\n ServerRouter,\n renderToPipeableStream,\n createReadableStreamFromReadable,\n});`)}\n\n${plus(`// If you have a custom handleRequest implementation, wrap it like this:\n// export default Sentry.wrapSentryHandleRequest(yourCustomHandleRequest);`)}\n\nexport default handleRequest;`),\n );\n};\n\nexport const getManualRootContent = (isTs: boolean) => {\n const typeAnnotations = isTs\n ? { stack: ': string | undefined', props: ': Route.ErrorBoundaryProps' }\n : { stack: '', props: '' };\n\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\"import * as Sentry from '@sentry/react-router';\")}\n\nexport function ErrorBoundary({ error }${typeAnnotations.props}) {\n let message = \"Oops!\";\n let details = \"An unexpected error occurred.\";\n let stack${typeAnnotations.stack};\n\n if (isRouteErrorResponse(error)) {\n message = error.status === 404 ? \"404\" : \"Error\";\n details =\n error.status === 404\n ? \"The requested page could not be found.\"\n : error.statusText || details;\n } else if (error && error instanceof Error) {\n // you only want to capture non 404-errors that reach the boundary\n ${plus('Sentry.captureException(error);')}\n details = error.message;\n stack = error.stack;\n }\n\n return (\n <main>\n <h1>{message}</h1>\n <p>{details}</p>\n {stack && (\n <pre>\n <code>{stack}</code>\n </pre>\n )}\n </main>\n );\n}\n// ...`),\n );\n};\n\nexport const getManualServerInstrumentContent = (\n dsn: string,\n enableTracing: boolean,\n enableProfiling: boolean,\n enableLogs = false,\n) => {\n return makeCodeSnippet(true, (unchanged, plus) =>\n plus(\n generateServerInstrumentationCode(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n ),\n ),\n );\n};\n\nexport const getManualReactRouterConfigContent = (isTS = true) => {\n return makeCodeSnippet(true, (unchanged, plus) =>\n isTS\n ? unchanged(`${plus(\n 'import type { Config } from \"@react-router/dev/config\";',\n )}\n${plus(\"import { sentryOnBuildEnd } from '@sentry/react-router';\")}\n\nexport default {\n ${plus('ssr: true,')}\n ${plus(`buildEnd: async ({ viteConfig, reactRouterConfig, buildManifest }) => {\n await sentryOnBuildEnd({ viteConfig, reactRouterConfig, buildManifest });\n },`)}\n} satisfies Config;\n\n// If you already have a buildEnd hook, modify it to call sentryOnBuildEnd:\n// buildEnd: async (args) => {\n// await yourExistingLogic(args);\n// await sentryOnBuildEnd(args);\n// }`)\n : unchanged(`${plus(\n \"import { sentryOnBuildEnd } from '@sentry/react-router';\",\n )}\n\nexport default {\n ${plus('ssr: true,')}\n ${plus(`buildEnd: async ({ viteConfig, reactRouterConfig, buildManifest }) => {\n await sentryOnBuildEnd({ viteConfig, reactRouterConfig, buildManifest });\n },`)}\n};\n\n// If you already have a buildEnd hook, modify it to call sentryOnBuildEnd:\n// buildEnd: async (args) => {\n// await yourExistingLogic(args);\n// await sentryOnBuildEnd(args);\n// }`),\n );\n};\n\nexport const getManualViteConfigContent = (\n orgSlug: string,\n projectSlug: string,\n) => {\n return makeCodeSnippet(true, (unchanged, plus) =>\n unchanged(`${plus(\n \"import { sentryReactRouter } from '@sentry/react-router';\",\n )}\nimport { defineConfig } from 'vite';\n\nexport default defineConfig(config => {\n return {\n plugins: [\n // ... your existing plugins\n ${plus(`sentryReactRouter({\n org: \"${orgSlug}\",\n project: \"${projectSlug}\",\n authToken: process.env.SENTRY_AUTH_TOKEN,\n }, config),`)}\n ],\n ${plus(`optimizeDeps: {\n exclude: ['@sentry/react-router'],\n },`)}\n };\n});`),\n );\n};\n"]}
|
|
@@ -18,6 +18,7 @@ const mcp_config_1 = require("../utils/clack/mcp-config");
|
|
|
18
18
|
const sdk_example_1 = require("./sdk-example");
|
|
19
19
|
const sdk_setup_1 = require("./sdk-setup");
|
|
20
20
|
const utils_1 = require("./utils");
|
|
21
|
+
const abort_if_sportlight_not_supported_1 = require("../utils/abort-if-sportlight-not-supported");
|
|
21
22
|
async function runRemixWizard(options) {
|
|
22
23
|
return (0, telemetry_1.withTelemetry)({
|
|
23
24
|
enabled: options.telemetryEnabled,
|
|
@@ -46,10 +47,7 @@ async function runRemixWizardWithTelemetry(options) {
|
|
|
46
47
|
await (0, clack_1.ensurePackageIsInstalled)(packageJson, '@remix-run/dev', 'Remix');
|
|
47
48
|
const projectData = await (0, clack_1.getOrAskForProjectData)(options, 'javascript-remix');
|
|
48
49
|
if (projectData.spotlight) {
|
|
49
|
-
|
|
50
|
-
prompts_1.default.log.info('Spotlight is currently only available for Next.js.');
|
|
51
|
-
await (0, clack_1.abort)('Exiting wizard', 0);
|
|
52
|
-
return;
|
|
50
|
+
return (0, abort_if_sportlight_not_supported_1.abortIfSpotlightNotSupported)('Remix');
|
|
53
51
|
}
|
|
54
52
|
const { selectedProject, authToken, sentryUrl, selfHosted } = projectData;
|
|
55
53
|
await (0, clack_1.installPackage)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remix-wizard.js","sourceRoot":"","sources":["../../../src/remix/remix-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 { DEFAULT_URL } from '../../lib/Constants';\nimport { configureVitePlugin } from '../sourcemaps/tools/vite';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { findFile } from '../utils/ast-utils';\nimport {\n abort,\n addSentryCliConfig,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n rcCliSetupConfig,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { debug } from '../utils/debug';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport { offerProjectScopedMcpConfig } from '../utils/clack/mcp-config';\nimport { createExamplePage } from './sdk-example';\nimport {\n createServerInstrumentationFile,\n initializeSentryOnEntryClient,\n insertServerInstrumentationFile,\n instrumentRootRoute,\n instrumentSentryOnEntryServer,\n isRemixV2,\n runRemixReveal,\n updateBuildScript,\n updateStartScript,\n} from './sdk-setup';\nimport { isHydrogenApp } from './utils';\n\nexport async function runRemixWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'remix',\n wizardOptions: options,\n },\n () => runRemixWizardWithTelemetry(options),\n );\n}\n\nasync function runRemixWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry Remix Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n const packageJson = await getPackageDotJson();\n\n if (!isRemixV2(packageJson)) {\n clack.log.error(\n `Sentry only supports Remix v2 and above. Please upgrade your Remix version to use Sentry.`,\n );\n return;\n }\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n // We expect `@remix-run/dev` to be installed for every Remix project\n await ensurePackageIsInstalled(packageJson, '@remix-run/dev', 'Remix');\n\n const projectData = await getOrAskForProjectData(options, 'javascript-remix');\n\n if (projectData.spotlight) {\n clack.log.warn('Spotlight mode is not yet supported for Remix.');\n clack.log.info('Spotlight is currently only available for Next.js.');\n await abort('Exiting wizard', 0);\n return;\n }\n\n const { selectedProject, authToken, sentryUrl, selfHosted } = projectData;\n\n await installPackage({\n packageName: '@sentry/remix@^10',\n packageNameDisplayLabel: '@sentry/remix',\n alreadyInstalled: hasPackageInstalled('@sentry/remix', packageJson),\n forceInstall,\n });\n\n const dsn = selectedProject.keys[0].dsn.public;\n\n const isTS = isUsingTypeScript();\n const viteConfig = findFile('vite.config');\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 {\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 ] as const);\n\n if (viteConfig) {\n await traceStep(\n 'Update vite configuration for sourcemap uploads',\n async () => {\n try {\n await configureVitePlugin({\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n url: sentryUrl,\n selfHosted,\n authToken,\n });\n } catch (e) {\n clack.log\n .warn(`Could not update vite configuration to generate and upload sourcemaps.\n Please update your vite configuration manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/sourcemaps/`);\n debug(e);\n }\n },\n );\n } else {\n await traceStep('Update build script for sourcemap uploads', async () => {\n try {\n await updateBuildScript({\n org: selectedProject.organization.slug,\n project: selectedProject.slug,\n url: sentryUrl === DEFAULT_URL ? undefined : sentryUrl,\n isHydrogen: isHydrogenApp(packageJson),\n });\n\n await addSentryCliConfig({ authToken }, rcCliSetupConfig);\n } catch (e) {\n clack.log\n .warn(`Could not update build script to generate and upload sourcemaps.\n Please update your build script manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/sourcemaps/`);\n debug(e);\n }\n });\n }\n\n await traceStep('Instrument root route', async () => {\n try {\n await instrumentRootRoute(isTS);\n } catch (e) {\n clack.log.warn(`Could not instrument root route.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n traceStep('Reveal missing entry files', () => {\n try {\n runRemixReveal(isTS);\n } catch (e) {\n clack.log.warn(`Could not run 'npx remix reveal'.\n Please create your entry files manually`);\n debug(e);\n }\n });\n\n await traceStep('Initialize Sentry on client entry', async () => {\n try {\n await initializeSentryOnEntryClient(dsn, isTS, selectedFeatures);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on client entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n let instrumentationFile = '';\n\n await traceStep('Create server instrumentation file', async () => {\n try {\n instrumentationFile = await createServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n } catch (e) {\n clack.log.warn(\n 'Could not create a server instrumentation file. Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/',\n );\n debug(e);\n }\n });\n\n let serverFileInstrumented = false;\n\n await traceStep(\n 'Create server instrumentation file and import it',\n async () => {\n try {\n serverFileInstrumented = await insertServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n } catch (e) {\n clack.log.warn(\n 'Could not create a server instrumentation file. Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/',\n );\n debug(e);\n }\n },\n );\n\n if (!serverFileInstrumented && instrumentationFile) {\n await traceStep(\n 'Update `start` script to import instrumentation file.',\n async () => {\n try {\n await updateStartScript(instrumentationFile);\n } catch (e) {\n clack.log\n .warn(`Could not automatically add Sentry initialization to server entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n },\n );\n }\n\n await traceStep('Instrument server `handleError`', async () => {\n try {\n await instrumentSentryOnEntryServer(isTS);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on server entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage();\n\n if (shouldCreateExamplePage) {\n await traceStep('Create example page', async () => {\n await createExamplePage({\n isTS,\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\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(\n 'Sentry has been successfully configured for your Remix project.',\n)}\n\n${chalk.cyan('You can now deploy your project to see Sentry in action.')}\n\n${chalk.cyan(\n `To learn more about how to use Sentry with Remix, visit our documentation:\nhttps://docs.sentry.io/platforms/javascript/guides/remix/`,\n)}`);\n}\n\n/**\n * Offers to add a project-scoped MCP server configuration for the Sentry MCP.\n * Supports Cursor, VS Code, and Claude Code.\n */\n"]}
|
|
1
|
+
{"version":3,"file":"remix-wizard.js","sourceRoot":"","sources":["../../../src/remix/remix-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 { DEFAULT_URL } from '../../lib/Constants';\nimport { configureVitePlugin } from '../sourcemaps/tools/vite';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { findFile } from '../utils/ast-utils';\nimport {\n addSentryCliConfig,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n rcCliSetupConfig,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { debug } from '../utils/debug';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport { offerProjectScopedMcpConfig } from '../utils/clack/mcp-config';\nimport { createExamplePage } from './sdk-example';\nimport {\n createServerInstrumentationFile,\n initializeSentryOnEntryClient,\n insertServerInstrumentationFile,\n instrumentRootRoute,\n instrumentSentryOnEntryServer,\n isRemixV2,\n runRemixReveal,\n updateBuildScript,\n updateStartScript,\n} from './sdk-setup';\nimport { isHydrogenApp } from './utils';\nimport { abortIfSpotlightNotSupported } from '../utils/abort-if-sportlight-not-supported';\n\nexport async function runRemixWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'remix',\n wizardOptions: options,\n },\n () => runRemixWizardWithTelemetry(options),\n );\n}\n\nasync function runRemixWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry Remix Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n const packageJson = await getPackageDotJson();\n\n if (!isRemixV2(packageJson)) {\n clack.log.error(\n `Sentry only supports Remix v2 and above. Please upgrade your Remix version to use Sentry.`,\n );\n return;\n }\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n // We expect `@remix-run/dev` to be installed for every Remix project\n await ensurePackageIsInstalled(packageJson, '@remix-run/dev', 'Remix');\n\n const projectData = await getOrAskForProjectData(options, 'javascript-remix');\n\n if (projectData.spotlight) {\n return abortIfSpotlightNotSupported('Remix');\n }\n\n const { selectedProject, authToken, sentryUrl, selfHosted } = projectData;\n\n await installPackage({\n packageName: '@sentry/remix@^10',\n packageNameDisplayLabel: '@sentry/remix',\n alreadyInstalled: hasPackageInstalled('@sentry/remix', packageJson),\n forceInstall,\n });\n\n const dsn = selectedProject.keys[0].dsn.public;\n\n const isTS = isUsingTypeScript();\n const viteConfig = findFile('vite.config');\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 {\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 ] as const);\n\n if (viteConfig) {\n await traceStep(\n 'Update vite configuration for sourcemap uploads',\n async () => {\n try {\n await configureVitePlugin({\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n url: sentryUrl,\n selfHosted,\n authToken,\n });\n } catch (e) {\n clack.log\n .warn(`Could not update vite configuration to generate and upload sourcemaps.\n Please update your vite configuration manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/sourcemaps/`);\n debug(e);\n }\n },\n );\n } else {\n await traceStep('Update build script for sourcemap uploads', async () => {\n try {\n await updateBuildScript({\n org: selectedProject.organization.slug,\n project: selectedProject.slug,\n url: sentryUrl === DEFAULT_URL ? undefined : sentryUrl,\n isHydrogen: isHydrogenApp(packageJson),\n });\n\n await addSentryCliConfig({ authToken }, rcCliSetupConfig);\n } catch (e) {\n clack.log\n .warn(`Could not update build script to generate and upload sourcemaps.\n Please update your build script manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/sourcemaps/`);\n debug(e);\n }\n });\n }\n\n await traceStep('Instrument root route', async () => {\n try {\n await instrumentRootRoute(isTS);\n } catch (e) {\n clack.log.warn(`Could not instrument root route.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n traceStep('Reveal missing entry files', () => {\n try {\n runRemixReveal(isTS);\n } catch (e) {\n clack.log.warn(`Could not run 'npx remix reveal'.\n Please create your entry files manually`);\n debug(e);\n }\n });\n\n await traceStep('Initialize Sentry on client entry', async () => {\n try {\n await initializeSentryOnEntryClient(dsn, isTS, selectedFeatures);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on client entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n let instrumentationFile = '';\n\n await traceStep('Create server instrumentation file', async () => {\n try {\n instrumentationFile = await createServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n } catch (e) {\n clack.log.warn(\n 'Could not create a server instrumentation file. Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/',\n );\n debug(e);\n }\n });\n\n let serverFileInstrumented = false;\n\n await traceStep(\n 'Create server instrumentation file and import it',\n async () => {\n try {\n serverFileInstrumented = await insertServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n } catch (e) {\n clack.log.warn(\n 'Could not create a server instrumentation file. Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/',\n );\n debug(e);\n }\n },\n );\n\n if (!serverFileInstrumented && instrumentationFile) {\n await traceStep(\n 'Update `start` script to import instrumentation file.',\n async () => {\n try {\n await updateStartScript(instrumentationFile);\n } catch (e) {\n clack.log\n .warn(`Could not automatically add Sentry initialization to server entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n },\n );\n }\n\n await traceStep('Instrument server `handleError`', async () => {\n try {\n await instrumentSentryOnEntryServer(isTS);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on server entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage();\n\n if (shouldCreateExamplePage) {\n await traceStep('Create example page', async () => {\n await createExamplePage({\n isTS,\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\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(\n 'Sentry has been successfully configured for your Remix project.',\n)}\n\n${chalk.cyan('You can now deploy your project to see Sentry in action.')}\n\n${chalk.cyan(\n `To learn more about how to use Sentry with Remix, visit our documentation:\nhttps://docs.sentry.io/platforms/javascript/guides/remix/`,\n)}`);\n}\n\n/**\n * Offers to add a project-scoped MCP server configuration for the Sentry MCP.\n * Supports Cursor, VS Code, and Claude Code.\n */\n"]}
|
package/dist/src/run.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Platform } from '../lib/Constants';
|
|
2
|
-
type WizardIntegration = 'angular' | 'reactNative' | 'flutter' | 'ios' | 'android' | 'cordova' | 'electron' | 'nextjs' | 'nuxt' | 'remix' | 'reactRouter' | 'sveltekit' | 'sourcemaps';
|
|
2
|
+
type WizardIntegration = 'angular' | 'reactNative' | 'flutter' | 'ios' | 'android' | 'cordova' | 'electron' | 'nextjs' | 'nuxt' | 'remix' | 'reactRouter' | 'sveltekit' | 'cloudflare' | 'sourcemaps';
|
|
3
3
|
type Args = {
|
|
4
4
|
integration?: WizardIntegration;
|
|
5
5
|
uninstall: boolean;
|
package/dist/src/run.js
CHANGED
|
@@ -41,6 +41,7 @@ const remix_wizard_1 = require("./remix/remix-wizard");
|
|
|
41
41
|
const sourcemaps_wizard_1 = require("./sourcemaps/sourcemaps-wizard");
|
|
42
42
|
const sveltekit_wizard_1 = require("./sveltekit/sveltekit-wizard");
|
|
43
43
|
const react_router_wizard_1 = require("./react-router/react-router-wizard");
|
|
44
|
+
const cloudflare_wizard_1 = require("./cloudflare/cloudflare-wizard");
|
|
44
45
|
const debug_1 = require("./utils/debug");
|
|
45
46
|
const version_1 = require("./version");
|
|
46
47
|
function preSelectedProjectArgsToObject(args) {
|
|
@@ -95,6 +96,7 @@ async function run(argv) {
|
|
|
95
96
|
{ value: 'remix', label: 'Remix' },
|
|
96
97
|
{ value: 'reactRouter', label: 'React Router' },
|
|
97
98
|
{ value: 'sveltekit', label: 'SvelteKit' },
|
|
99
|
+
{ value: 'cloudflare', label: 'Cloudflare' },
|
|
98
100
|
{ value: 'sourcemaps', label: 'Configure Source Maps Upload' },
|
|
99
101
|
],
|
|
100
102
|
}));
|
|
@@ -151,6 +153,9 @@ async function run(argv) {
|
|
|
151
153
|
case 'sveltekit':
|
|
152
154
|
await (0, sveltekit_wizard_1.runSvelteKitWizard)(wizardOptions);
|
|
153
155
|
break;
|
|
156
|
+
case 'cloudflare':
|
|
157
|
+
await (0, cloudflare_wizard_1.runCloudflareWizard)(wizardOptions);
|
|
158
|
+
break;
|
|
154
159
|
case 'sourcemaps':
|
|
155
160
|
await (0, sourcemaps_wizard_1.runSourcemapsWizard)(wizardOptions);
|
|
156
161
|
break;
|
package/dist/src/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport { runReactNativeWizard } from './react-native/react-native-wizard';\nimport { abortIfCancelled } from './utils/clack';\n\nimport { Integration, type Platform } from '../lib/Constants';\nimport { readEnvironment } from '../lib/Helper/Env';\nimport { run as legacyRun } from '../lib/Setup';\nimport { runAndroidWizard } from './android/android-wizard';\nimport { runAngularWizard } from './angular/angular-wizard';\nimport { runAppleWizard } from './apple/apple-wizard';\nimport { runFlutterWizard } from './flutter/flutter-wizard';\nimport { runNextjsWizard } from './nextjs/nextjs-wizard';\nimport { runNuxtWizard } from './nuxt/nuxt-wizard';\nimport { runRemixWizard } from './remix/remix-wizard';\nimport { runSourcemapsWizard } from './sourcemaps/sourcemaps-wizard';\nimport { runSvelteKitWizard } from './sveltekit/sveltekit-wizard';\nimport { runReactRouterWizard } from './react-router/react-router-wizard';\nimport { enableDebugLogs } from './utils/debug';\nimport type { PreselectedProject, WizardOptions } from './utils/types';\nimport { WIZARD_VERSION } from './version';\n\ntype WizardIntegration =\n | 'angular'\n | 'reactNative'\n | 'flutter'\n | 'ios'\n | 'android'\n | 'cordova'\n | 'electron'\n | 'nextjs'\n | 'nuxt'\n | 'remix'\n | 'reactRouter'\n | 'sveltekit'\n | 'sourcemaps';\n\ntype Args = {\n integration?: WizardIntegration;\n\n uninstall: boolean; // used in Cordova\n signup: boolean;\n skipConnect: boolean;\n debug: boolean;\n quiet: boolean;\n disableTelemetry: boolean;\n spotlight?: boolean;\n promoCode?: string;\n preSelectedProject?: {\n authToken: string;\n selfHosted: boolean;\n dsn: string;\n projectId: string;\n projectSlug: string;\n projectName: string;\n orgId: string;\n orgName: string;\n orgSlug: string;\n };\n url?: string;\n platform?: Platform[];\n org?: string;\n project?: string;\n saas?: boolean;\n forceInstall?: boolean;\n comingFrom?: string;\n ignoreGitChanges?: boolean;\n xcodeProjectDir?: string;\n};\n\nfunction preSelectedProjectArgsToObject(\n args: Args,\n): PreselectedProject | undefined {\n if (!args.preSelectedProject) {\n return undefined;\n }\n\n return {\n authToken: args.preSelectedProject.authToken,\n selfHosted: args.preSelectedProject.selfHosted,\n project: {\n id: args.preSelectedProject.projectId,\n keys: [\n {\n dsn: {\n public: args.preSelectedProject.dsn,\n },\n },\n ],\n organization: {\n id: args.preSelectedProject.orgId,\n name: args.preSelectedProject.orgName,\n slug: args.preSelectedProject.orgSlug,\n },\n slug: args.preSelectedProject.projectSlug,\n },\n };\n}\n\nexport async function run(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n // Enable debug logs if the user has passed the --debug flag\n if (finalArgs.debug) {\n enableDebugLogs();\n }\n\n let integration = finalArgs.integration;\n if (!integration) {\n clack.intro(`Sentry Wizard ${WIZARD_VERSION}`);\n\n integration = await abortIfCancelled(\n clack.select({\n message: 'What do you want to set up?',\n options: [\n { value: 'reactNative', label: 'React Native' },\n { value: 'flutter', label: 'Flutter' },\n { value: 'ios', label: 'iOS' },\n { value: 'angular', label: 'Angular' },\n { value: 'android', label: 'Android' },\n { value: 'cordova', label: 'Cordova' },\n { value: 'electron', label: 'Electron' },\n { value: 'nextjs', label: 'Next.js' },\n { value: 'nuxt', label: 'Nuxt' },\n { value: 'remix', label: 'Remix' },\n { value: 'reactRouter', label: 'React Router' },\n { value: 'sveltekit', label: 'SvelteKit' },\n { value: 'sourcemaps', label: 'Configure Source Maps Upload' },\n ],\n }),\n );\n\n if (!integration) {\n clack.log.error('No integration selected. Exiting.');\n return;\n }\n\n clack.outro(`Starting ${integration} setup`);\n }\n\n const wizardOptions: WizardOptions = {\n telemetryEnabled: !finalArgs.disableTelemetry,\n promoCode: finalArgs.promoCode,\n url: finalArgs.url,\n orgSlug: finalArgs.org,\n projectSlug: finalArgs.project,\n saas: finalArgs.saas,\n preSelectedProject: preSelectedProjectArgsToObject(finalArgs),\n forceInstall: finalArgs.forceInstall,\n comingFrom: finalArgs.comingFrom,\n ignoreGitChanges: finalArgs.ignoreGitChanges,\n spotlight: finalArgs.spotlight,\n };\n\n switch (integration) {\n case 'reactNative':\n await runReactNativeWizard(wizardOptions);\n break;\n\n case 'flutter':\n await runFlutterWizard(wizardOptions);\n break;\n\n case 'ios':\n await runAppleWizard({\n ...wizardOptions,\n projectDir: finalArgs.xcodeProjectDir,\n });\n break;\n\n case 'android':\n await runAndroidWizard(wizardOptions);\n break;\n\n case 'angular':\n await runAngularWizard(wizardOptions);\n break;\n\n case 'nextjs':\n await runNextjsWizard(wizardOptions);\n break;\n\n case 'nuxt':\n await runNuxtWizard(wizardOptions);\n break;\n\n case 'remix':\n await runRemixWizard(wizardOptions);\n break;\n\n case 'reactRouter':\n await runReactRouterWizard(wizardOptions);\n break;\n\n case 'sveltekit':\n await runSvelteKitWizard(wizardOptions);\n break;\n\n case 'sourcemaps':\n await runSourcemapsWizard(wizardOptions);\n break;\n\n case 'cordova':\n argv.integration = 'cordova';\n void legacyRun(\n {\n ...argv,\n url: argv.url ?? '',\n integration: Integration.cordova,\n platform: argv.platform ?? [],\n },\n wizardOptions,\n );\n break;\n\n case 'electron':\n argv.integration = 'electron';\n void legacyRun(\n {\n ...argv,\n url: argv.url ?? '',\n integration: Integration.electron,\n platform: argv.platform ?? [],\n },\n wizardOptions,\n );\n break;\n\n default:\n clack.log.error('No setup wizard selected!');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport { runReactNativeWizard } from './react-native/react-native-wizard';\nimport { abortIfCancelled } from './utils/clack';\n\nimport { Integration, type Platform } from '../lib/Constants';\nimport { readEnvironment } from '../lib/Helper/Env';\nimport { run as legacyRun } from '../lib/Setup';\nimport { runAndroidWizard } from './android/android-wizard';\nimport { runAngularWizard } from './angular/angular-wizard';\nimport { runAppleWizard } from './apple/apple-wizard';\nimport { runFlutterWizard } from './flutter/flutter-wizard';\nimport { runNextjsWizard } from './nextjs/nextjs-wizard';\nimport { runNuxtWizard } from './nuxt/nuxt-wizard';\nimport { runRemixWizard } from './remix/remix-wizard';\nimport { runSourcemapsWizard } from './sourcemaps/sourcemaps-wizard';\nimport { runSvelteKitWizard } from './sveltekit/sveltekit-wizard';\nimport { runReactRouterWizard } from './react-router/react-router-wizard';\nimport { runCloudflareWizard } from './cloudflare/cloudflare-wizard';\nimport { enableDebugLogs } from './utils/debug';\nimport type { PreselectedProject, WizardOptions } from './utils/types';\nimport { WIZARD_VERSION } from './version';\n\ntype WizardIntegration =\n | 'angular'\n | 'reactNative'\n | 'flutter'\n | 'ios'\n | 'android'\n | 'cordova'\n | 'electron'\n | 'nextjs'\n | 'nuxt'\n | 'remix'\n | 'reactRouter'\n | 'sveltekit'\n | 'cloudflare'\n | 'sourcemaps';\n\ntype Args = {\n integration?: WizardIntegration;\n\n uninstall: boolean; // used in Cordova\n signup: boolean;\n skipConnect: boolean;\n debug: boolean;\n quiet: boolean;\n disableTelemetry: boolean;\n spotlight?: boolean;\n promoCode?: string;\n preSelectedProject?: {\n authToken: string;\n selfHosted: boolean;\n dsn: string;\n projectId: string;\n projectSlug: string;\n projectName: string;\n orgId: string;\n orgName: string;\n orgSlug: string;\n };\n url?: string;\n platform?: Platform[];\n org?: string;\n project?: string;\n saas?: boolean;\n forceInstall?: boolean;\n comingFrom?: string;\n ignoreGitChanges?: boolean;\n xcodeProjectDir?: string;\n};\n\nfunction preSelectedProjectArgsToObject(\n args: Args,\n): PreselectedProject | undefined {\n if (!args.preSelectedProject) {\n return undefined;\n }\n\n return {\n authToken: args.preSelectedProject.authToken,\n selfHosted: args.preSelectedProject.selfHosted,\n project: {\n id: args.preSelectedProject.projectId,\n keys: [\n {\n dsn: {\n public: args.preSelectedProject.dsn,\n },\n },\n ],\n organization: {\n id: args.preSelectedProject.orgId,\n name: args.preSelectedProject.orgName,\n slug: args.preSelectedProject.orgSlug,\n },\n slug: args.preSelectedProject.projectSlug,\n },\n };\n}\n\nexport async function run(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n // Enable debug logs if the user has passed the --debug flag\n if (finalArgs.debug) {\n enableDebugLogs();\n }\n\n let integration = finalArgs.integration;\n if (!integration) {\n clack.intro(`Sentry Wizard ${WIZARD_VERSION}`);\n\n integration = await abortIfCancelled(\n clack.select({\n message: 'What do you want to set up?',\n options: [\n { value: 'reactNative', label: 'React Native' },\n { value: 'flutter', label: 'Flutter' },\n { value: 'ios', label: 'iOS' },\n { value: 'angular', label: 'Angular' },\n { value: 'android', label: 'Android' },\n { value: 'cordova', label: 'Cordova' },\n { value: 'electron', label: 'Electron' },\n { value: 'nextjs', label: 'Next.js' },\n { value: 'nuxt', label: 'Nuxt' },\n { value: 'remix', label: 'Remix' },\n { value: 'reactRouter', label: 'React Router' },\n { value: 'sveltekit', label: 'SvelteKit' },\n { value: 'cloudflare', label: 'Cloudflare' },\n { value: 'sourcemaps', label: 'Configure Source Maps Upload' },\n ],\n }),\n );\n\n if (!integration) {\n clack.log.error('No integration selected. Exiting.');\n return;\n }\n\n clack.outro(`Starting ${integration} setup`);\n }\n\n const wizardOptions: WizardOptions = {\n telemetryEnabled: !finalArgs.disableTelemetry,\n promoCode: finalArgs.promoCode,\n url: finalArgs.url,\n orgSlug: finalArgs.org,\n projectSlug: finalArgs.project,\n saas: finalArgs.saas,\n preSelectedProject: preSelectedProjectArgsToObject(finalArgs),\n forceInstall: finalArgs.forceInstall,\n comingFrom: finalArgs.comingFrom,\n ignoreGitChanges: finalArgs.ignoreGitChanges,\n spotlight: finalArgs.spotlight,\n };\n\n switch (integration) {\n case 'reactNative':\n await runReactNativeWizard(wizardOptions);\n break;\n\n case 'flutter':\n await runFlutterWizard(wizardOptions);\n break;\n\n case 'ios':\n await runAppleWizard({\n ...wizardOptions,\n projectDir: finalArgs.xcodeProjectDir,\n });\n break;\n\n case 'android':\n await runAndroidWizard(wizardOptions);\n break;\n\n case 'angular':\n await runAngularWizard(wizardOptions);\n break;\n\n case 'nextjs':\n await runNextjsWizard(wizardOptions);\n break;\n\n case 'nuxt':\n await runNuxtWizard(wizardOptions);\n break;\n\n case 'remix':\n await runRemixWizard(wizardOptions);\n break;\n\n case 'reactRouter':\n await runReactRouterWizard(wizardOptions);\n break;\n\n case 'sveltekit':\n await runSvelteKitWizard(wizardOptions);\n break;\n\n case 'cloudflare':\n await runCloudflareWizard(wizardOptions);\n break;\n\n case 'sourcemaps':\n await runSourcemapsWizard(wizardOptions);\n break;\n\n case 'cordova':\n argv.integration = 'cordova';\n void legacyRun(\n {\n ...argv,\n url: argv.url ?? '',\n integration: Integration.cordova,\n platform: argv.platform ?? [],\n },\n wizardOptions,\n );\n break;\n\n case 'electron':\n argv.integration = 'electron';\n void legacyRun(\n {\n ...argv,\n url: argv.url ?? '',\n integration: Integration.electron,\n platform: argv.platform ?? [],\n },\n wizardOptions,\n );\n break;\n\n default:\n clack.log.error('No setup wizard selected!');\n }\n}\n"]}
|
|
@@ -128,7 +128,7 @@ async function addVitePluginToConfig(viteConfigPath, options) {
|
|
|
128
128
|
...(selfHosted && { url }),
|
|
129
129
|
},
|
|
130
130
|
});
|
|
131
|
-
const code = (0, magicast_1.generateCode)(mod.$ast).code;
|
|
131
|
+
const code = (0, ast_utils_1.preserveTrailingNewline)(viteConfigContent, (0, magicast_1.generateCode)(mod.$ast).code);
|
|
132
132
|
await fs.promises.writeFile(viteConfigPath, code);
|
|
133
133
|
clack.log.success(`Added the Sentry Vite plugin to ${prettyViteConfigFilename} and enabled source maps`);
|
|
134
134
|
return true;
|