@sentry/wizard 4.2.0 → 4.3.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 +12 -1
- package/dist/e2e-tests/tests/{nextjs.test.js → nextjs-14.test.js} +3 -3
- package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -0
- package/dist/e2e-tests/tests/nextjs-15.test.d.ts +1 -0
- package/dist/e2e-tests/tests/nextjs-15.test.js +123 -0
- package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -0
- package/dist/src/apple/apple-wizard.js +5 -1
- package/dist/src/apple/apple-wizard.js.map +1 -1
- package/dist/src/flutter/flutter-wizard.js +3 -1
- package/dist/src/flutter/flutter-wizard.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +5 -4
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nuxt/sdk-setup.js +1 -1
- package/dist/src/nuxt/sdk-setup.js.map +1 -1
- package/dist/src/remix/remix-wizard.js +1 -1
- package/dist/src/remix/remix-wizard.js.map +1 -1
- package/dist/src/sourcemaps/sourcemaps-wizard.d.ts +1 -0
- package/dist/src/sourcemaps/sourcemaps-wizard.js +14 -30
- package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
- package/dist/src/sourcemaps/utils/detect-tool.js +0 -2
- package/dist/src/sourcemaps/utils/detect-tool.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup.js +1 -1
- package/dist/src/sveltekit/sdk-setup.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/package.json +2 -2
- package/dist/e2e-tests/tests/nextjs.test.js.map +0 -1
- /package/dist/e2e-tests/tests/{nextjs.test.d.ts → nextjs-14.test.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as fs from 'fs';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, parseModule } from 'magicast';\nimport * as path from 'path';\n\nimport * as Sentry from '@sentry/node';\n\nimport {\n abort,\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n createNewConfigFile,\n ensurePackageIsInstalled,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n runPrettierIfInstalled,\n showCopyPasteInstructions,\n} from '../utils/clack-utils';\nimport type { SentryProjectData, WizardOptions } from '../utils/types';\nimport {\n getFullUnderscoreErrorCopyPasteSnippet,\n getGlobalErrorCopyPasteSnippet,\n getInstrumentationHookContent,\n getInstrumentationHookCopyPasteSnippet,\n getNextjsConfigCjsAppendix,\n getNextjsConfigCjsTemplate,\n getNextjsConfigEsmCopyPasteSnippet,\n getSentryConfigContents,\n getSentryDefaultGlobalErrorPage,\n getSentryDefaultUnderscoreErrorPage,\n getSentryExamplePagesDirApiRoute,\n getSentryExampleAppDirApiRoute,\n getSentryExamplePageContents,\n getSimpleUnderscoreErrorCopyPasteSnippet,\n getWithSentryConfigOptionsTemplate,\n getNextjsConfigMjsTemplate,\n} from './templates';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { getNextJsVersionBucket } from './utils';\nimport { configureCI } from '../sourcemaps/sourcemaps-wizard';\n\nexport function runNextjsWizard(options: WizardOptions) {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'nextjs',\n wizardOptions: options,\n },\n () => runNextjsWizardWithTelemetry(options),\n );\n}\n\nexport async function runNextjsWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry Next.js Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n const typeScriptDetected = isUsingTypeScript();\n\n await confirmContinueIfNoOrDirtyGitRepo();\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n Sentry.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n const { selectedProject, authToken, selfHosted, sentryUrl } =\n await getOrAskForProjectData(options, 'javascript-nextjs');\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/nextjs',\n packageJson,\n );\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n const { packageManager: packageManagerFromInstallStep } =\n await installPackage({\n packageName: '@sentry/nextjs@^9',\n packageNameDisplayLabel: '@sentry/nextjs',\n alreadyInstalled: !!packageJson?.dependencies?.['@sentry/nextjs'],\n forceInstall,\n });\n\n await traceStep('configure-sdk', async () => {\n const tunnelRoute = await askShouldSetTunnelRoute();\n const reactComponentAnnotation =\n await askShouldEnableReactComponentAnnotation();\n\n await createOrMergeNextJsFiles(selectedProject, selfHosted, sentryUrl, {\n tunnelRoute,\n reactComponentAnnotation,\n });\n });\n\n await traceStep('create-underscoreerror-page', async () => {\n const srcDir = path.join(process.cwd(), 'src');\n const maybePagesDirPath = path.join(process.cwd(), 'pages');\n const maybeSrcPagesDirPath = path.join(srcDir, 'pages');\n\n const pagesLocation =\n fs.existsSync(maybePagesDirPath) &&\n fs.lstatSync(maybePagesDirPath).isDirectory()\n ? ['pages']\n : fs.existsSync(maybeSrcPagesDirPath) &&\n fs.lstatSync(maybeSrcPagesDirPath).isDirectory()\n ? ['src', 'pages']\n : undefined;\n\n if (!pagesLocation) {\n return;\n }\n\n const underscoreErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...pagesLocation, '_error.tsx'),\n )\n ? '_error.tsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.ts'))\n ? '_error.ts'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.jsx'))\n ? '_error.jsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.js'))\n ? '_error.js'\n : undefined;\n\n if (!underscoreErrorPageFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), ...pagesLocation, '_error.jsx'),\n getSentryDefaultUnderscoreErrorPage(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(path.join(...pagesLocation, '_error.jsx'))}.`,\n );\n } else if (\n fs\n .readFileSync(\n path.join(process.cwd(), ...pagesLocation, underscoreErrorPageFile),\n 'utf8',\n )\n .includes('getInitialProps')\n ) {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease put the following function call in the ${chalk.bold(\n 'getInitialProps',\n )}\\nmethod of your custom error page at ${chalk.bold(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(getSimpleUnderscoreErrorCopyPasteSnippet());\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you modify your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n } else {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getFullUnderscoreErrorCopyPasteSnippet(\n underscoreErrorPageFile === '_error.ts' ||\n underscoreErrorPageFile === '_error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you add the code to your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n });\n\n await traceStep('create-global-error-page', async () => {\n const maybeAppDirPath = path.join(process.cwd(), 'app');\n const maybeSrcAppDirPath = path.join(process.cwd(), 'src', 'app');\n\n const appDirLocation =\n fs.existsSync(maybeAppDirPath) &&\n fs.lstatSync(maybeAppDirPath).isDirectory()\n ? ['app']\n : fs.existsSync(maybeSrcAppDirPath) &&\n fs.lstatSync(maybeSrcAppDirPath).isDirectory()\n ? ['src', 'app']\n : undefined;\n\n if (!appDirLocation) {\n return;\n }\n\n const globalErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.tsx'),\n )\n ? 'global-error.tsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.ts'),\n )\n ? 'global-error.ts'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.jsx'),\n )\n ? 'global-error.jsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.js'),\n )\n ? 'global-error.js'\n : undefined;\n\n if (!globalErrorPageFile) {\n const newGlobalErrorFileName = `global-error.${\n typeScriptDetected ? 'tsx' : 'jsx'\n }`;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), ...appDirLocation, newGlobalErrorFileName),\n getSentryDefaultGlobalErrorPage(typeScriptDetected),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appDirLocation, newGlobalErrorFileName),\n )}.`,\n );\n } else {\n clack.log.info(\n `It seems like you already have a custom error page for your app directory.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )}:\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getGlobalErrorCopyPasteSnippet(\n globalErrorPageFile === 'global-error.ts' ||\n globalErrorPageFile === 'global-error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you add the code to your ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n });\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage();\n if (shouldCreateExamplePage) {\n await traceStep('create-example-page', async () =>\n createExamplePage(selfHosted, selectedProject, sentryUrl),\n );\n }\n\n await addDotEnvSentryBuildPluginFile(authToken);\n\n const isLikelyUsingTurbopack = await checkIfLikelyIsUsingTurbopack();\n if (isLikelyUsingTurbopack || isLikelyUsingTurbopack === null) {\n await abortIfCancelled(\n clack.select({\n message: `Warning: The Sentry SDK doesn't yet fully support Turbopack in dev mode. The SDK will not be loaded in the browser, and serverside instrumentation will be inaccurate or incomplete. Production builds will still fully work. ${chalk.bold(\n `To continue this setup, if you are using Turbopack, temporarily remove \\`--turbo\\` or \\`--turbopack\\` from your dev command until you have verified the SDK is working as expected.`,\n )}`,\n options: [\n {\n label: 'I understand.',\n hint: 'press enter',\n value: true,\n },\n ],\n initialValue: true,\n }),\n );\n }\n\n const mightBeUsingVercel = fs.existsSync(\n path.join(process.cwd(), 'vercel.json'),\n );\n\n if (mightBeUsingVercel) {\n clack.log.info(\n \"▲ It seems like you're using Vercel. We recommend using the Sentry Vercel integration to set up an auth token for Vercel deployments: https://vercel.com/integrations/sentry\",\n );\n } else {\n await traceStep('configure-ci', () => configureCI('nextjs', authToken));\n }\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager());\n await runPrettierIfInstalled();\n\n clack.outro(`\n${chalk.green('Successfully installed the Sentry Next.js SDK!')} ${\n shouldCreateExamplePage\n ? `\\n\\nYou can validate your setup by (re)starting your dev environment (e.g. ${chalk.cyan(\n `${packageManagerForOutro.runScriptCommand} dev`,\n )}) and visiting ${chalk.cyan('\"/sentry-example-page\"')}`\n : ''\n }${\n shouldCreateExamplePage && isLikelyUsingTurbopack\n ? `\\nDon't forget to remove \\`--turbo\\` or \\`--turbopack\\` from your dev command until you have verified the SDK is working. You can safely add it back afterwards.`\n : ''\n }\n\n${chalk.dim(\n 'If you encounter any issues, let us know here: https://github.com/getsentry/sentry-javascript/issues',\n)}`);\n}\n\ntype SDKConfigOptions = {\n tunnelRoute: boolean;\n reactComponentAnnotation: boolean;\n};\n\nasync function createOrMergeNextJsFiles(\n selectedProject: SentryProjectData,\n selfHosted: boolean,\n sentryUrl: string,\n sdkConfigOptions: SDKConfigOptions,\n) {\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Sentry Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'client', 'edge'] as const;\n\n for (const configVariant of configVariants) {\n await traceStep(`create-sentry-${configVariant}-config`, async () => {\n const jsConfig = `sentry.${configVariant}.config.js`;\n const tsConfig = `sentry.${configVariant}.config.ts`;\n\n const jsConfigExists = fs.existsSync(path.join(process.cwd(), jsConfig));\n const tsConfigExists = fs.existsSync(path.join(process.cwd(), tsConfig));\n\n let shouldWriteFile = true;\n\n if (jsConfigExists || tsConfigExists) {\n const existingConfigs = [];\n\n if (jsConfigExists) {\n existingConfigs.push(jsConfig);\n }\n\n if (tsConfigExists) {\n existingConfigs.push(tsConfig);\n }\n\n const overwriteExistingConfigs = await abortIfCancelled(\n clack.confirm({\n message: `Found existing Sentry ${configVariant} config (${existingConfigs.join(\n ', ',\n )}). Overwrite ${existingConfigs.length > 1 ? 'them' : 'it'}?`,\n }),\n );\n Sentry.setTag(\n `overwrite-${configVariant}-config`,\n overwriteExistingConfigs,\n );\n\n shouldWriteFile = overwriteExistingConfigs;\n\n if (overwriteExistingConfigs) {\n if (jsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), jsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryConfigContents(\n selectedProject.keys[0].dsn.public,\n configVariant,\n selectedFeatures,\n ),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created fresh ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n Sentry.setTag(`created-${configVariant}-config`, true);\n }\n });\n }\n\n await traceStep('setup-instrumentation-hook', async () => {\n const hasRootAppDirectory = hasDirectoryPathFromRoot('app');\n const hasRootPagesDirectory = hasDirectoryPathFromRoot('pages');\n const hasSrcDirectory = hasDirectoryPathFromRoot('src');\n\n let instrumentationHookLocation: 'src' | 'root' | 'does-not-exist';\n\n const instrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.ts'),\n );\n const instrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.js'),\n );\n const srcInstrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.ts'),\n );\n const srcInstrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.js'),\n );\n\n // https://nextjs.org/docs/app/building-your-application/configuring/src-directory\n // https://nextjs.org/docs/app/api-reference/file-conventions/instrumentation\n // The logic for where Next.js picks up the instrumentation file is as follows:\n // - If there is either an `app` folder or a `pages` folder in the root directory of your Next.js app, Next.js looks\n // for an `instrumentation.ts` file in the root of the Next.js app.\n // - Otherwise, if there is neither an `app` folder or a `pages` folder in the rood directory of your Next.js app,\n // AND if there is an `src` folder, Next.js will look for the `instrumentation.ts` file in the `src` folder.\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n if (instrumentationJsExists || instrumentationTsExists) {\n instrumentationHookLocation = 'root';\n } else {\n instrumentationHookLocation = 'does-not-exist';\n }\n } else {\n if (srcInstrumentationTsExists || srcInstrumentationJsExists) {\n instrumentationHookLocation = 'src';\n } else {\n instrumentationHookLocation = 'does-not-exist';\n }\n }\n\n const newInstrumentationFileName = `instrumentation.${\n typeScriptDetected ? 'ts' : 'js'\n }`;\n\n if (instrumentationHookLocation === 'does-not-exist') {\n let newInstrumentationHookLocation: 'root' | 'src';\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n newInstrumentationHookLocation = 'root';\n } else if (hasSrcDirectory) {\n newInstrumentationHookLocation = 'src';\n } else {\n newInstrumentationHookLocation = 'root';\n }\n\n const newInstrumentationHookPath =\n newInstrumentationHookLocation === 'root'\n ? path.join(process.cwd(), newInstrumentationFileName)\n : path.join(process.cwd(), 'src', newInstrumentationFileName);\n\n const successfullyCreated = await createNewConfigFile(\n newInstrumentationHookPath,\n getInstrumentationHookContent(newInstrumentationHookLocation),\n );\n\n if (!successfullyCreated) {\n await showCopyPasteInstructions(\n newInstrumentationFileName,\n getInstrumentationHookCopyPasteSnippet(\n newInstrumentationHookLocation,\n ),\n );\n }\n } else {\n await showCopyPasteInstructions(\n srcInstrumentationTsExists || instrumentationTsExists\n ? 'instrumentation.ts'\n : srcInstrumentationJsExists || instrumentationJsExists\n ? 'instrumentation.js'\n : newInstrumentationFileName,\n getInstrumentationHookCopyPasteSnippet(instrumentationHookLocation),\n );\n }\n });\n\n await traceStep('setup-next-config', async () => {\n const withSentryConfigOptionsTemplate = getWithSentryConfigOptionsTemplate({\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n selfHosted,\n sentryUrl,\n tunnelRoute: sdkConfigOptions.tunnelRoute,\n reactComponentAnnotation: sdkConfigOptions.reactComponentAnnotation,\n });\n\n const nextConfigPossibleFilesMap = {\n js: 'next.config.js',\n mjs: 'next.config.mjs',\n cjs: 'next.config.cjs',\n ts: 'next.config.ts',\n mts: 'next.config.mts',\n cts: 'next.config.cts',\n };\n\n const foundNextConfigFile = Object.entries(nextConfigPossibleFilesMap).find(\n ([, fileName]) => fs.existsSync(path.join(process.cwd(), fileName)),\n );\n\n if (!foundNextConfigFile) {\n Sentry.setTag('next-config-strategy', 'create');\n\n // Try to figure out whether the user prefers ESM\n let isTypeModule = false;\n try {\n const packageJsonText = await fs.promises.readFile(\n path.join(process.cwd(), 'package.json'),\n 'utf8',\n );\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const packageJson = JSON.parse(packageJsonText);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (packageJson.type === 'module') {\n isTypeModule = true;\n }\n } catch {\n // noop\n }\n\n // We are creating `next.config.(m)js` files by default as they are supported by the most Next.js versions\n const configFilename = isTypeModule\n ? nextConfigPossibleFilesMap.mjs\n : nextConfigPossibleFilesMap.js;\n const configContent = isTypeModule\n ? getNextjsConfigMjsTemplate(withSentryConfigOptionsTemplate)\n : getNextjsConfigCjsTemplate(withSentryConfigOptionsTemplate);\n\n await fs.promises.writeFile(\n path.join(process.cwd(), configFilename),\n configContent,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(configFilename)} with Sentry configuration.`,\n );\n\n return;\n }\n\n const [foundNextConfigFileType, foundNextConfigFileFilename] =\n foundNextConfigFile;\n\n if (foundNextConfigFileType === 'js' || foundNextConfigFileType === 'cjs') {\n Sentry.setTag('next-config-strategy', 'modify');\n\n const nextConfigCjsContent = fs.readFileSync(\n path.join(process.cwd(), foundNextConfigFileFilename),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigCjsContent.includes('@sentry/nextjs') &&\n nextConfigCjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n foundNextConfigFileFilename,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n if (shouldInject) {\n await fs.promises.appendFile(\n path.join(process.cwd(), foundNextConfigFileFilename),\n getNextjsConfigCjsAppendix(withSentryConfigOptionsTemplate),\n 'utf8',\n );\n\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n }\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n\n if (\n foundNextConfigFileType === 'mjs' ||\n foundNextConfigFileType === 'mts' ||\n foundNextConfigFileType === 'cts' ||\n foundNextConfigFileType === 'ts'\n ) {\n const nextConfigMjsContent = fs.readFileSync(\n path.join(process.cwd(), foundNextConfigFileFilename),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigMjsContent.includes('@sentry/nextjs') &&\n nextConfigMjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n foundNextConfigFileFilename,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n try {\n if (shouldInject) {\n const mod = parseModule(nextConfigMjsContent);\n mod.imports.$add({\n from: '@sentry/nextjs',\n imported: 'withSentryConfig',\n local: 'withSentryConfig',\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n const expressionToWrap = generateCode(mod.exports.default.$ast).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.default = builders.raw(`withSentryConfig(\n ${expressionToWrap},\n ${withSentryConfigOptionsTemplate}\n)`);\n const newCode = mod.generate().code;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), foundNextConfigFileFilename),\n newCode,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n } catch {\n Sentry.setTag('next-config-mod-result', 'fail');\n clack.log.warn(\n chalk.yellow(\n `Something went wrong writing to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}.`,\n ),\n );\n clack.log.info(\n `Please put the following code snippet into ${chalk.cyan(\n foundNextConfigFileFilename,\n )}: ${chalk.dim('You probably have to clean it up a bit.')}\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getNextjsConfigEsmCopyPasteSnippet(withSentryConfigOptionsTemplate),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Are you done putting the snippet above into ${chalk.cyan(\n foundNextConfigFileFilename,\n )}?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n }\n });\n}\n\nfunction hasDirectoryPathFromRoot(dirnameOrDirs: string | string[]): boolean {\n const dirPath = Array.isArray(dirnameOrDirs)\n ? path.join(process.cwd(), ...dirnameOrDirs)\n : path.join(process.cwd(), dirnameOrDirs);\n\n return fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();\n}\n\nasync function createExamplePage(\n selfHosted: boolean,\n selectedProject: SentryProjectData,\n sentryUrl: string,\n): Promise<void> {\n const hasSrcDirectory = hasDirectoryPathFromRoot('src');\n const hasRootAppDirectory = hasDirectoryPathFromRoot('app');\n const hasRootPagesDirectory = hasDirectoryPathFromRoot('pages');\n const hasSrcAppDirectory = hasDirectoryPathFromRoot(['src', 'app']);\n const hasSrcPagesDirectory = hasDirectoryPathFromRoot(['src', 'pages']);\n\n Sentry.setTag('nextjs-app-dir', hasRootAppDirectory || hasSrcAppDirectory);\n\n const typeScriptDetected = isUsingTypeScript();\n\n // If `pages` or an `app` directory exists in the root, we'll put the example page there.\n // `app` directory takes priority over `pages` directory when they coexist, so we prioritize that.\n // https://nextjs.org/docs/app/building-your-application/routing#the-app-router\n\n const appFolderLocation = hasRootAppDirectory\n ? ['app']\n : hasSrcAppDirectory\n ? ['src', 'app']\n : undefined;\n\n let pagesFolderLocation = hasRootPagesDirectory\n ? ['pages']\n : hasSrcPagesDirectory\n ? ['src', 'pages']\n : undefined;\n\n // If the user has neither pages nor app directory we create a pages folder for them\n if (!appFolderLocation && !pagesFolderLocation) {\n const newPagesFolderLocation = hasSrcDirectory\n ? ['src', 'pages']\n : ['pages'];\n fs.mkdirSync(path.join(process.cwd(), ...newPagesFolderLocation), {\n recursive: true,\n });\n\n pagesFolderLocation = newPagesFolderLocation;\n }\n\n if (appFolderLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n sentryUrl,\n useClient: true,\n });\n\n fs.mkdirSync(\n path.join(process.cwd(), ...appFolderLocation, 'sentry-example-page'),\n {\n recursive: true,\n },\n );\n\n const newPageFileName = `page.${typeScriptDetected ? 'tsx' : 'jsx'}`;\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appFolderLocation,\n 'sentry-example-page',\n newPageFileName,\n ),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appFolderLocation, 'sentry-example-page', newPageFileName),\n )}.`,\n );\n\n fs.mkdirSync(\n path.join(\n process.cwd(),\n ...appFolderLocation,\n 'api',\n 'sentry-example-api',\n ),\n {\n recursive: true,\n },\n );\n\n const newRouteFileName = `route.${typeScriptDetected ? 'ts' : 'js'}`;\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appFolderLocation,\n 'api',\n 'sentry-example-api',\n newRouteFileName,\n ),\n getSentryExampleAppDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(\n ...appFolderLocation,\n 'api',\n 'sentry-example-api',\n newRouteFileName,\n ),\n )}.`,\n );\n } else if (pagesFolderLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n sentryUrl,\n useClient: false,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesFolderLocation,\n 'sentry-example-page.jsx',\n ),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesFolderLocation, 'sentry-example-page.js'),\n )}.`,\n );\n\n fs.mkdirSync(path.join(process.cwd(), ...pagesFolderLocation, 'api'), {\n recursive: true,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesFolderLocation,\n 'api',\n 'sentry-example-api.js',\n ),\n getSentryExamplePagesDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesFolderLocation, 'api', 'sentry-example-api.js'),\n )}.`,\n );\n }\n}\n\n/**\n * Ask users if they want to set the tunnelRoute option.\n * We can't set this by default because it potentially increases hosting bills.\n * It's valuable enough to for users to justify asking the additional question.\n */\nasync function askShouldSetTunnelRoute() {\n return await traceStep('ask-tunnelRoute-option', async (span) => {\n const shouldSetTunnelRoute = await abortIfCancelled(\n clack.select({\n message:\n 'Do you want to route Sentry requests in the browser through your Next.js server to avoid ad blockers?',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'Can increase your server load and hosting bill',\n },\n {\n label: 'No',\n value: false,\n hint: 'Browser errors and events might be blocked by ad blockers before being sent to Sentry',\n },\n ],\n initialValue: true,\n }),\n );\n\n if (!shouldSetTunnelRoute) {\n clack.log.info(\n \"Sounds good! We'll leave the option commented for later, just in case :)\",\n );\n }\n\n span?.setAttribute('tunnelRoute', shouldSetTunnelRoute);\n Sentry.setTag('tunnelRoute', shouldSetTunnelRoute);\n\n return shouldSetTunnelRoute;\n });\n}\n\nasync function askShouldEnableReactComponentAnnotation() {\n return await traceStep('ask-react-component-annotation-option', async () => {\n const shouldEnableReactComponentAnnotation = await abortIfCancelled(\n clack.select({\n message:\n 'Do you want to enable React component annotations to make breadcrumbs and session replays more readable?',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'Annotates React component names - increases bundle size',\n },\n {\n label: 'No',\n value: false,\n hint: 'Continue without React component annotations',\n },\n ],\n initialValue: true,\n }),\n );\n\n return shouldEnableReactComponentAnnotation;\n });\n}\n\n/**\n * Returns true or false depending on whether we think the user is using Turbopack. May return null in case we aren't sure.\n */\nasync function checkIfLikelyIsUsingTurbopack(): Promise<boolean | null> {\n let packageJsonContent: string;\n try {\n packageJsonContent = await fs.promises.readFile(\n path.join(process.cwd(), 'package.json'),\n 'utf8',\n );\n } catch {\n return null;\n }\n\n return packageJsonContent.includes('--turbo');\n}\n"]}
|
|
1
|
+
{"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as fs from 'fs';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, parseModule } from 'magicast';\nimport * as path from 'path';\n\nimport * as Sentry from '@sentry/node';\n\nimport {\n abort,\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n createNewConfigFile,\n ensurePackageIsInstalled,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n runPrettierIfInstalled,\n showCopyPasteInstructions,\n} from '../utils/clack-utils';\nimport type { SentryProjectData, WizardOptions } from '../utils/types';\nimport {\n getFullUnderscoreErrorCopyPasteSnippet,\n getGlobalErrorCopyPasteSnippet,\n getInstrumentationHookContent,\n getInstrumentationHookCopyPasteSnippet,\n getNextjsConfigCjsAppendix,\n getNextjsConfigCjsTemplate,\n getNextjsConfigEsmCopyPasteSnippet,\n getSentryConfigContents,\n getSentryDefaultGlobalErrorPage,\n getSentryDefaultUnderscoreErrorPage,\n getSentryExamplePagesDirApiRoute,\n getSentryExampleAppDirApiRoute,\n getSentryExamplePageContents,\n getSimpleUnderscoreErrorCopyPasteSnippet,\n getWithSentryConfigOptionsTemplate,\n getNextjsConfigMjsTemplate,\n} from './templates';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { getNextJsVersionBucket } from './utils';\nimport { setupCI } from '../sourcemaps/sourcemaps-wizard';\n\nexport function runNextjsWizard(options: WizardOptions) {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'nextjs',\n wizardOptions: options,\n },\n () => runNextjsWizardWithTelemetry(options),\n );\n}\n\nexport async function runNextjsWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry Next.js Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n const typeScriptDetected = isUsingTypeScript();\n\n await confirmContinueIfNoOrDirtyGitRepo();\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n Sentry.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n const { selectedProject, authToken, selfHosted, sentryUrl } =\n await getOrAskForProjectData(options, 'javascript-nextjs');\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/nextjs',\n packageJson,\n );\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n const { packageManager: packageManagerFromInstallStep } =\n await installPackage({\n packageName: '@sentry/nextjs@^9',\n packageNameDisplayLabel: '@sentry/nextjs',\n alreadyInstalled: !!packageJson?.dependencies?.['@sentry/nextjs'],\n forceInstall,\n });\n\n await traceStep('configure-sdk', async () => {\n const tunnelRoute = await askShouldSetTunnelRoute();\n const reactComponentAnnotation =\n await askShouldEnableReactComponentAnnotation();\n\n await createOrMergeNextJsFiles(selectedProject, selfHosted, sentryUrl, {\n tunnelRoute,\n reactComponentAnnotation,\n });\n });\n\n await traceStep('create-underscoreerror-page', async () => {\n const srcDir = path.join(process.cwd(), 'src');\n const maybePagesDirPath = path.join(process.cwd(), 'pages');\n const maybeSrcPagesDirPath = path.join(srcDir, 'pages');\n\n const pagesLocation =\n fs.existsSync(maybePagesDirPath) &&\n fs.lstatSync(maybePagesDirPath).isDirectory()\n ? ['pages']\n : fs.existsSync(maybeSrcPagesDirPath) &&\n fs.lstatSync(maybeSrcPagesDirPath).isDirectory()\n ? ['src', 'pages']\n : undefined;\n\n if (!pagesLocation) {\n return;\n }\n\n const underscoreErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...pagesLocation, '_error.tsx'),\n )\n ? '_error.tsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.ts'))\n ? '_error.ts'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.jsx'))\n ? '_error.jsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.js'))\n ? '_error.js'\n : undefined;\n\n if (!underscoreErrorPageFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), ...pagesLocation, '_error.jsx'),\n getSentryDefaultUnderscoreErrorPage(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(path.join(...pagesLocation, '_error.jsx'))}.`,\n );\n } else if (\n fs\n .readFileSync(\n path.join(process.cwd(), ...pagesLocation, underscoreErrorPageFile),\n 'utf8',\n )\n .includes('getInitialProps')\n ) {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease put the following function call in the ${chalk.bold(\n 'getInitialProps',\n )}\\nmethod of your custom error page at ${chalk.bold(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(getSimpleUnderscoreErrorCopyPasteSnippet());\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you modify your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n } else {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getFullUnderscoreErrorCopyPasteSnippet(\n underscoreErrorPageFile === '_error.ts' ||\n underscoreErrorPageFile === '_error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you add the code to your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n });\n\n await traceStep('create-global-error-page', async () => {\n const maybeAppDirPath = path.join(process.cwd(), 'app');\n const maybeSrcAppDirPath = path.join(process.cwd(), 'src', 'app');\n\n const appDirLocation =\n fs.existsSync(maybeAppDirPath) &&\n fs.lstatSync(maybeAppDirPath).isDirectory()\n ? ['app']\n : fs.existsSync(maybeSrcAppDirPath) &&\n fs.lstatSync(maybeSrcAppDirPath).isDirectory()\n ? ['src', 'app']\n : undefined;\n\n if (!appDirLocation) {\n return;\n }\n\n const globalErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.tsx'),\n )\n ? 'global-error.tsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.ts'),\n )\n ? 'global-error.ts'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.jsx'),\n )\n ? 'global-error.jsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.js'),\n )\n ? 'global-error.js'\n : undefined;\n\n if (!globalErrorPageFile) {\n const newGlobalErrorFileName = `global-error.${\n typeScriptDetected ? 'tsx' : 'jsx'\n }`;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), ...appDirLocation, newGlobalErrorFileName),\n getSentryDefaultGlobalErrorPage(typeScriptDetected),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appDirLocation, newGlobalErrorFileName),\n )}.`,\n );\n } else {\n clack.log.info(\n `It seems like you already have a custom error page for your app directory.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )}:\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getGlobalErrorCopyPasteSnippet(\n globalErrorPageFile === 'global-error.ts' ||\n globalErrorPageFile === 'global-error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you add the code to your ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n });\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage();\n if (shouldCreateExamplePage) {\n await traceStep('create-example-page', async () =>\n createExamplePage(selfHosted, selectedProject, sentryUrl),\n );\n }\n\n await addDotEnvSentryBuildPluginFile(authToken);\n\n const isLikelyUsingTurbopack = await checkIfLikelyIsUsingTurbopack();\n if (isLikelyUsingTurbopack || isLikelyUsingTurbopack === null) {\n await abortIfCancelled(\n clack.select({\n message: `Warning: The Sentry SDK doesn't yet fully support Turbopack in dev mode. The SDK will not be loaded in the browser, and serverside instrumentation will be inaccurate or incomplete. Production builds will still fully work. ${chalk.bold(\n `To continue this setup, if you are using Turbopack, temporarily remove \\`--turbo\\` or \\`--turbopack\\` from your dev command until you have verified the SDK is working as expected.`,\n )}`,\n options: [\n {\n label: 'I understand.',\n hint: 'press enter',\n value: true,\n },\n ],\n initialValue: true,\n }),\n );\n }\n\n const mightBeUsingVercel = fs.existsSync(\n path.join(process.cwd(), 'vercel.json'),\n );\n\n if (mightBeUsingVercel && !options.comingFrom) {\n clack.log.info(\n \"▲ It seems like you're using Vercel. We recommend using the Sentry Vercel \\\n integration to set up an auth token for Vercel deployments: https://vercel.com/integrations/sentry\",\n );\n } else {\n await setupCI('nextjs', authToken, options.comingFrom);\n }\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager());\n await runPrettierIfInstalled();\n\n clack.outro(`\n${chalk.green('Successfully installed the Sentry Next.js SDK!')} ${\n shouldCreateExamplePage\n ? `\\n\\nYou can validate your setup by (re)starting your dev environment (e.g. ${chalk.cyan(\n `${packageManagerForOutro.runScriptCommand} dev`,\n )}) and visiting ${chalk.cyan('\"/sentry-example-page\"')}`\n : ''\n }${\n shouldCreateExamplePage && isLikelyUsingTurbopack\n ? `\\nDon't forget to remove \\`--turbo\\` or \\`--turbopack\\` from your dev command until you have verified the SDK is working. You can safely add it back afterwards.`\n : ''\n }\n\n${chalk.dim(\n 'If you encounter any issues, let us know here: https://github.com/getsentry/sentry-javascript/issues',\n)}`);\n}\n\ntype SDKConfigOptions = {\n tunnelRoute: boolean;\n reactComponentAnnotation: boolean;\n};\n\nasync function createOrMergeNextJsFiles(\n selectedProject: SentryProjectData,\n selfHosted: boolean,\n sentryUrl: string,\n sdkConfigOptions: SDKConfigOptions,\n) {\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'client', 'edge'] as const;\n\n for (const configVariant of configVariants) {\n await traceStep(`create-sentry-${configVariant}-config`, async () => {\n const jsConfig = `sentry.${configVariant}.config.js`;\n const tsConfig = `sentry.${configVariant}.config.ts`;\n\n const jsConfigExists = fs.existsSync(path.join(process.cwd(), jsConfig));\n const tsConfigExists = fs.existsSync(path.join(process.cwd(), tsConfig));\n\n let shouldWriteFile = true;\n\n if (jsConfigExists || tsConfigExists) {\n const existingConfigs = [];\n\n if (jsConfigExists) {\n existingConfigs.push(jsConfig);\n }\n\n if (tsConfigExists) {\n existingConfigs.push(tsConfig);\n }\n\n const overwriteExistingConfigs = await abortIfCancelled(\n clack.confirm({\n message: `Found existing Sentry ${configVariant} config (${existingConfigs.join(\n ', ',\n )}). Overwrite ${existingConfigs.length > 1 ? 'them' : 'it'}?`,\n }),\n );\n Sentry.setTag(\n `overwrite-${configVariant}-config`,\n overwriteExistingConfigs,\n );\n\n shouldWriteFile = overwriteExistingConfigs;\n\n if (overwriteExistingConfigs) {\n if (jsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), jsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryConfigContents(\n selectedProject.keys[0].dsn.public,\n configVariant,\n selectedFeatures,\n ),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created fresh ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n Sentry.setTag(`created-${configVariant}-config`, true);\n }\n });\n }\n\n await traceStep('setup-instrumentation-hook', async () => {\n const hasRootAppDirectory = hasDirectoryPathFromRoot('app');\n const hasRootPagesDirectory = hasDirectoryPathFromRoot('pages');\n const hasSrcDirectory = hasDirectoryPathFromRoot('src');\n\n let instrumentationHookLocation: 'src' | 'root' | 'does-not-exist';\n\n const instrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.ts'),\n );\n const instrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.js'),\n );\n const srcInstrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.ts'),\n );\n const srcInstrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.js'),\n );\n\n // https://nextjs.org/docs/app/building-your-application/configuring/src-directory\n // https://nextjs.org/docs/app/api-reference/file-conventions/instrumentation\n // The logic for where Next.js picks up the instrumentation file is as follows:\n // - If there is either an `app` folder or a `pages` folder in the root directory of your Next.js app, Next.js looks\n // for an `instrumentation.ts` file in the root of the Next.js app.\n // - Otherwise, if there is neither an `app` folder or a `pages` folder in the rood directory of your Next.js app,\n // AND if there is an `src` folder, Next.js will look for the `instrumentation.ts` file in the `src` folder.\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n if (instrumentationJsExists || instrumentationTsExists) {\n instrumentationHookLocation = 'root';\n } else {\n instrumentationHookLocation = 'does-not-exist';\n }\n } else {\n if (srcInstrumentationTsExists || srcInstrumentationJsExists) {\n instrumentationHookLocation = 'src';\n } else {\n instrumentationHookLocation = 'does-not-exist';\n }\n }\n\n const newInstrumentationFileName = `instrumentation.${\n typeScriptDetected ? 'ts' : 'js'\n }`;\n\n if (instrumentationHookLocation === 'does-not-exist') {\n let newInstrumentationHookLocation: 'root' | 'src';\n if (hasRootPagesDirectory || hasRootAppDirectory) {\n newInstrumentationHookLocation = 'root';\n } else if (hasSrcDirectory) {\n newInstrumentationHookLocation = 'src';\n } else {\n newInstrumentationHookLocation = 'root';\n }\n\n const newInstrumentationHookPath =\n newInstrumentationHookLocation === 'root'\n ? path.join(process.cwd(), newInstrumentationFileName)\n : path.join(process.cwd(), 'src', newInstrumentationFileName);\n\n const successfullyCreated = await createNewConfigFile(\n newInstrumentationHookPath,\n getInstrumentationHookContent(newInstrumentationHookLocation),\n );\n\n if (!successfullyCreated) {\n await showCopyPasteInstructions(\n newInstrumentationFileName,\n getInstrumentationHookCopyPasteSnippet(\n newInstrumentationHookLocation,\n ),\n );\n }\n } else {\n await showCopyPasteInstructions(\n srcInstrumentationTsExists || instrumentationTsExists\n ? 'instrumentation.ts'\n : srcInstrumentationJsExists || instrumentationJsExists\n ? 'instrumentation.js'\n : newInstrumentationFileName,\n getInstrumentationHookCopyPasteSnippet(instrumentationHookLocation),\n );\n }\n });\n\n await traceStep('setup-next-config', async () => {\n const withSentryConfigOptionsTemplate = getWithSentryConfigOptionsTemplate({\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n selfHosted,\n sentryUrl,\n tunnelRoute: sdkConfigOptions.tunnelRoute,\n reactComponentAnnotation: sdkConfigOptions.reactComponentAnnotation,\n });\n\n const nextConfigPossibleFilesMap = {\n js: 'next.config.js',\n mjs: 'next.config.mjs',\n cjs: 'next.config.cjs',\n ts: 'next.config.ts',\n mts: 'next.config.mts',\n cts: 'next.config.cts',\n };\n\n const foundNextConfigFile = Object.entries(nextConfigPossibleFilesMap).find(\n ([, fileName]) => fs.existsSync(path.join(process.cwd(), fileName)),\n );\n\n if (!foundNextConfigFile) {\n Sentry.setTag('next-config-strategy', 'create');\n\n // Try to figure out whether the user prefers ESM\n let isTypeModule = false;\n try {\n const packageJsonText = await fs.promises.readFile(\n path.join(process.cwd(), 'package.json'),\n 'utf8',\n );\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const packageJson = JSON.parse(packageJsonText);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (packageJson.type === 'module') {\n isTypeModule = true;\n }\n } catch {\n // noop\n }\n\n // We are creating `next.config.(m)js` files by default as they are supported by the most Next.js versions\n const configFilename = isTypeModule\n ? nextConfigPossibleFilesMap.mjs\n : nextConfigPossibleFilesMap.js;\n const configContent = isTypeModule\n ? getNextjsConfigMjsTemplate(withSentryConfigOptionsTemplate)\n : getNextjsConfigCjsTemplate(withSentryConfigOptionsTemplate);\n\n await fs.promises.writeFile(\n path.join(process.cwd(), configFilename),\n configContent,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(configFilename)} with Sentry configuration.`,\n );\n\n return;\n }\n\n const [foundNextConfigFileType, foundNextConfigFileFilename] =\n foundNextConfigFile;\n\n if (foundNextConfigFileType === 'js' || foundNextConfigFileType === 'cjs') {\n Sentry.setTag('next-config-strategy', 'modify');\n\n const nextConfigCjsContent = fs.readFileSync(\n path.join(process.cwd(), foundNextConfigFileFilename),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigCjsContent.includes('@sentry/nextjs') &&\n nextConfigCjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n foundNextConfigFileFilename,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n if (shouldInject) {\n await fs.promises.appendFile(\n path.join(process.cwd(), foundNextConfigFileFilename),\n getNextjsConfigCjsAppendix(withSentryConfigOptionsTemplate),\n 'utf8',\n );\n\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n }\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n\n if (\n foundNextConfigFileType === 'mjs' ||\n foundNextConfigFileType === 'mts' ||\n foundNextConfigFileType === 'cts' ||\n foundNextConfigFileType === 'ts'\n ) {\n const nextConfigMjsContent = fs.readFileSync(\n path.join(process.cwd(), foundNextConfigFileFilename),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigMjsContent.includes('@sentry/nextjs') &&\n nextConfigMjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n foundNextConfigFileFilename,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n try {\n if (shouldInject) {\n const mod = parseModule(nextConfigMjsContent);\n mod.imports.$add({\n from: '@sentry/nextjs',\n imported: 'withSentryConfig',\n local: 'withSentryConfig',\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n const expressionToWrap = generateCode(mod.exports.default.$ast).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.default = builders.raw(`withSentryConfig(\n ${expressionToWrap},\n ${withSentryConfigOptionsTemplate}\n)`);\n const newCode = mod.generate().code;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), foundNextConfigFileFilename),\n newCode,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n } catch {\n Sentry.setTag('next-config-mod-result', 'fail');\n clack.log.warn(\n chalk.yellow(\n `Something went wrong writing to ${chalk.cyan(\n foundNextConfigFileFilename,\n )}.`,\n ),\n );\n clack.log.info(\n `Please put the following code snippet into ${chalk.cyan(\n foundNextConfigFileFilename,\n )}: ${chalk.dim('You probably have to clean it up a bit.')}\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getNextjsConfigEsmCopyPasteSnippet(withSentryConfigOptionsTemplate),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Are you done putting the snippet above into ${chalk.cyan(\n foundNextConfigFileFilename,\n )}?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n }\n });\n}\n\nfunction hasDirectoryPathFromRoot(dirnameOrDirs: string | string[]): boolean {\n const dirPath = Array.isArray(dirnameOrDirs)\n ? path.join(process.cwd(), ...dirnameOrDirs)\n : path.join(process.cwd(), dirnameOrDirs);\n\n return fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();\n}\n\nasync function createExamplePage(\n selfHosted: boolean,\n selectedProject: SentryProjectData,\n sentryUrl: string,\n): Promise<void> {\n const hasSrcDirectory = hasDirectoryPathFromRoot('src');\n const hasRootAppDirectory = hasDirectoryPathFromRoot('app');\n const hasRootPagesDirectory = hasDirectoryPathFromRoot('pages');\n const hasSrcAppDirectory = hasDirectoryPathFromRoot(['src', 'app']);\n const hasSrcPagesDirectory = hasDirectoryPathFromRoot(['src', 'pages']);\n\n Sentry.setTag('nextjs-app-dir', hasRootAppDirectory || hasSrcAppDirectory);\n\n const typeScriptDetected = isUsingTypeScript();\n\n // If `pages` or an `app` directory exists in the root, we'll put the example page there.\n // `app` directory takes priority over `pages` directory when they coexist, so we prioritize that.\n // https://nextjs.org/docs/app/building-your-application/routing#the-app-router\n\n const appFolderLocation = hasRootAppDirectory\n ? ['app']\n : hasSrcAppDirectory\n ? ['src', 'app']\n : undefined;\n\n let pagesFolderLocation = hasRootPagesDirectory\n ? ['pages']\n : hasSrcPagesDirectory\n ? ['src', 'pages']\n : undefined;\n\n // If the user has neither pages nor app directory we create a pages folder for them\n if (!appFolderLocation && !pagesFolderLocation) {\n const newPagesFolderLocation = hasSrcDirectory\n ? ['src', 'pages']\n : ['pages'];\n fs.mkdirSync(path.join(process.cwd(), ...newPagesFolderLocation), {\n recursive: true,\n });\n\n pagesFolderLocation = newPagesFolderLocation;\n }\n\n if (appFolderLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n sentryUrl,\n useClient: true,\n });\n\n fs.mkdirSync(\n path.join(process.cwd(), ...appFolderLocation, 'sentry-example-page'),\n {\n recursive: true,\n },\n );\n\n const newPageFileName = `page.${typeScriptDetected ? 'tsx' : 'jsx'}`;\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appFolderLocation,\n 'sentry-example-page',\n newPageFileName,\n ),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appFolderLocation, 'sentry-example-page', newPageFileName),\n )}.`,\n );\n\n fs.mkdirSync(\n path.join(\n process.cwd(),\n ...appFolderLocation,\n 'api',\n 'sentry-example-api',\n ),\n {\n recursive: true,\n },\n );\n\n const newRouteFileName = `route.${typeScriptDetected ? 'ts' : 'js'}`;\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appFolderLocation,\n 'api',\n 'sentry-example-api',\n newRouteFileName,\n ),\n getSentryExampleAppDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(\n ...appFolderLocation,\n 'api',\n 'sentry-example-api',\n newRouteFileName,\n ),\n )}.`,\n );\n } else if (pagesFolderLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n sentryUrl,\n useClient: false,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesFolderLocation,\n 'sentry-example-page.jsx',\n ),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesFolderLocation, 'sentry-example-page.js'),\n )}.`,\n );\n\n fs.mkdirSync(path.join(process.cwd(), ...pagesFolderLocation, 'api'), {\n recursive: true,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesFolderLocation,\n 'api',\n 'sentry-example-api.js',\n ),\n getSentryExamplePagesDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesFolderLocation, 'api', 'sentry-example-api.js'),\n )}.`,\n );\n }\n}\n\n/**\n * Ask users if they want to set the tunnelRoute option.\n * We can't set this by default because it potentially increases hosting bills.\n * It's valuable enough to for users to justify asking the additional question.\n */\nasync function askShouldSetTunnelRoute() {\n return await traceStep('ask-tunnelRoute-option', async (span) => {\n const shouldSetTunnelRoute = await abortIfCancelled(\n clack.select({\n message:\n 'Do you want to route Sentry requests in the browser through your Next.js server to avoid ad blockers?',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'Can increase your server load and hosting bill',\n },\n {\n label: 'No',\n value: false,\n hint: 'Browser errors and events might be blocked by ad blockers before being sent to Sentry',\n },\n ],\n initialValue: true,\n }),\n );\n\n if (!shouldSetTunnelRoute) {\n clack.log.info(\n \"Sounds good! We'll leave the option commented for later, just in case :)\",\n );\n }\n\n span?.setAttribute('tunnelRoute', shouldSetTunnelRoute);\n Sentry.setTag('tunnelRoute', shouldSetTunnelRoute);\n\n return shouldSetTunnelRoute;\n });\n}\n\nasync function askShouldEnableReactComponentAnnotation() {\n return await traceStep('ask-react-component-annotation-option', async () => {\n const shouldEnableReactComponentAnnotation = await abortIfCancelled(\n clack.select({\n message:\n 'Do you want to enable React component annotations to make breadcrumbs and session replays more readable?',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'Annotates React component names - increases bundle size',\n },\n {\n label: 'No',\n value: false,\n hint: 'Continue without React component annotations',\n },\n ],\n initialValue: true,\n }),\n );\n\n return shouldEnableReactComponentAnnotation;\n });\n}\n\n/**\n * Returns true or false depending on whether we think the user is using Turbopack. May return null in case we aren't sure.\n */\nasync function checkIfLikelyIsUsingTurbopack(): Promise<boolean | null> {\n let packageJsonContent: string;\n try {\n packageJsonContent = await fs.promises.readFile(\n path.join(process.cwd(), 'package.json'),\n 'utf8',\n );\n } catch {\n return null;\n }\n\n return packageJsonContent.includes('--turbo');\n}\n"]}
|
|
@@ -170,7 +170,7 @@ async function createConfigFiles(dsn) {
|
|
|
170
170
|
},
|
|
171
171
|
{
|
|
172
172
|
id: 'replay',
|
|
173
|
-
prompt: `Do you want to enable ${chalk_1.default.bold('
|
|
173
|
+
prompt: `Do you want to enable ${chalk_1.default.bold('Session Replay')} to get a video-like reproduction of errors during a user session?`,
|
|
174
174
|
enabledHint: 'recommended, but increases bundle size',
|
|
175
175
|
},
|
|
176
176
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/nuxt/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport * as Sentry from '@sentry/node';\nimport chalk from 'chalk';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { generateCode, loadFile } from 'magicast';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { addNuxtModule } from 'magicast/helpers';\nimport opn from 'opn';\nimport { type SemVer, lt } from 'semver';\nimport { traceStep } from '../telemetry';\nimport {\n abortIfCancelled,\n askShouldAddPackageOverride,\n askShouldInstallPackage,\n featureSelectionPrompt,\n installPackage,\n isUsingTypeScript,\n} from '../utils/clack-utils';\nimport {\n type PackageDotJson,\n hasPackageInstalled,\n} from '../utils/package-json';\nimport { PNPM, type PackageManager } from '../utils/package-manager';\nimport {\n getConfigBody,\n getDefaultNuxtConfig,\n getNuxtModuleFallbackTemplate,\n getSentryConfigContents,\n} from './templates';\nimport { type DeploymentPlatform, deploymentPlatforms } from './types';\n\nconst possibleNuxtConfig = [\n 'nuxt.config.js',\n 'nuxt.config.mjs',\n 'nuxt.config.cjs',\n 'nuxt.config.ts',\n 'nuxt.config.mts',\n 'nuxt.config.cts',\n];\n\nexport async function getNuxtConfig(): Promise<string> {\n let configFile = possibleNuxtConfig.find((fileName) =>\n fs.existsSync(path.join(process.cwd(), fileName)),\n );\n\n if (!configFile) {\n clack.log.info('No Nuxt config file found, creating a new one.');\n Sentry.setTag('nuxt-config-strategy', 'create');\n // nuxt recommends its config to be .ts by default\n configFile = 'nuxt.config.ts';\n\n await fs.promises.writeFile(\n path.join(process.cwd(), configFile),\n getDefaultNuxtConfig(),\n { encoding: 'utf-8', flag: 'w' },\n );\n\n clack.log.success(`Created ${chalk.cyan('nuxt.config.ts')}.`);\n }\n\n return path.join(process.cwd(), configFile);\n}\n\nexport async function askDeploymentPlatform(): Promise<\n DeploymentPlatform | symbol\n> {\n return await abortIfCancelled(\n clack.select({\n message: 'Please select your deployment platform.',\n options: deploymentPlatforms.map((platform) => ({\n value: platform,\n label: `${platform.charAt(0).toUpperCase()}${platform.slice(1)}`,\n })),\n }),\n );\n}\n\nexport async function addSDKModule(\n config: string,\n options: { org: string; project: string; url: string; selfHosted: boolean },\n deploymentPlatform: DeploymentPlatform | symbol,\n): Promise<void> {\n const failureTagKey = 'modify-nuxt-config-error';\n\n const shouldTopLevelImport =\n deploymentPlatform === 'vercel' || deploymentPlatform === 'netlify';\n\n if (shouldTopLevelImport) {\n clack.log.warn(\n `Sentry needs to be initialized before the application starts. ${chalk.cyan(\n `${deploymentPlatform\n .charAt(0)\n .toUpperCase()}${deploymentPlatform.slice(1)}`,\n )} does not support this yet.\\n\\nWe will inject the Sentry server-side config at the top of your Nuxt server entry file instead.\\n\\nThis comes with some restrictions, for more info see:\\n\\n${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/install/top-level-import/',\n )} `,\n );\n }\n\n let module;\n\n try {\n module = await loadFile(config);\n } catch (e) {\n if (e instanceof Error) {\n if (e instanceof SyntaxError || e.message.includes('Unexpected token')) {\n Sentry.setTag(failureTagKey, 'loadFile-failed-syntax-error');\n } else if (\n e.message.includes('ENOENT') ||\n e.message.includes('no such file')\n ) {\n Sentry.setTag(failureTagKey, 'loadFile-failed-file-not-found');\n }\n } else {\n Sentry.setTag(failureTagKey, 'loadFile-failed');\n }\n\n clack.log.error(\n `Error while loading Nuxt config file: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n try {\n addNuxtModule(module, '@sentry/nuxt/module', 'sentry', {\n sourceMapsUploadOptions: {\n org: options.org,\n project: options.project,\n ...(options.selfHosted && { url: options.url }),\n },\n ...(shouldTopLevelImport && {\n autoInjectServerSentry: 'top-level-import',\n }),\n });\n } catch (e) {\n Sentry.setTag(failureTagKey, 'adding-sentry-options-failed');\n\n clack.log.error(\n `Error while modifying 'sentry' in Nuxt config: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n try {\n addNuxtModule(module, '@sentry/nuxt/module', 'sourcemap', {\n client: 'hidden',\n });\n } catch (e) {\n Sentry.setTag(failureTagKey, 'adding-sourcemap-options-failed');\n\n clack.log.error(\n `Error while modifying 'sourcemap' in Nuxt config: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n let code;\n\n try {\n ({ code } = generateCode(module));\n } catch (e) {\n Sentry.setTag(failureTagKey, 'generateCode-failed');\n\n clack.log.error(\n `Error while generating module code: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n try {\n await fs.promises.writeFile(config, code, { encoding: 'utf-8', flag: 'w' });\n\n clack.log.success(\n `Added Sentry Nuxt Module to ${chalk.cyan(path.basename(config))}.`,\n );\n } catch (e: unknown) {\n Sentry.setTag(failureTagKey, 'writeFile-failed');\n\n clack.log.error(\n `Error while writing Nuxt config: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n}\n\nfunction showFallbackInstructions(\n config: string,\n options: { org: string; project: string; url: string; selfHosted: boolean },\n shouldTopLevelImport: boolean,\n) {\n clack.log.warn(\n `Please add the following settings to ${chalk.cyan(\n path.basename(config),\n )}:`,\n );\n // eslint-disable-next-line no-console\n console.log(\n `\\n\\n${getNuxtModuleFallbackTemplate(options, shouldTopLevelImport)}\\n\\n`,\n );\n}\n\nexport async function createConfigFiles(dsn: string) {\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 'Sentry Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'client'] as const;\n\n for (const configVariant of configVariants) {\n await traceStep(`create-sentry-${configVariant}-config`, async () => {\n const jsConfig = `sentry.${configVariant}.config.js`;\n const tsConfig = `sentry.${configVariant}.config.ts`;\n\n const jsConfigExists = fs.existsSync(path.join(process.cwd(), jsConfig));\n const tsConfigExists = fs.existsSync(path.join(process.cwd(), tsConfig));\n\n let shouldWriteFile = true;\n\n if (jsConfigExists || tsConfigExists) {\n const existingConfigs = [];\n\n if (jsConfigExists) {\n existingConfigs.push(jsConfig);\n }\n\n if (tsConfigExists) {\n existingConfigs.push(tsConfig);\n }\n\n const overwriteExistingConfigs = await abortIfCancelled(\n clack.confirm({\n message: `Found existing Sentry ${configVariant} config (${existingConfigs.join(\n ', ',\n )}). Overwrite ${existingConfigs.length > 1 ? 'them' : 'it'}?`,\n }),\n );\n Sentry.setTag(\n `overwrite-${configVariant}-config`,\n overwriteExistingConfigs,\n );\n\n shouldWriteFile = overwriteExistingConfigs;\n\n if (overwriteExistingConfigs) {\n if (jsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), jsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryConfigContents(dsn, configVariant, selectedFeatures),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created new ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n Sentry.setTag(`created-${configVariant}-config`, true);\n } else {\n clack.log.info(\n `Okay, here are the changes your ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )} should contain:`,\n );\n // eslint-disable-next-line no-console\n console.log(\n '\\n\\n ' +\n getConfigBody(dsn, configVariant, selectedFeatures) +\n '\\n\\n',\n );\n }\n });\n }\n}\n\nexport async function addNuxtOverrides(\n packageJson: PackageDotJson,\n packageManager: PackageManager,\n nuxtMinVer: SemVer | null,\n forceInstall?: boolean,\n) {\n const isPNPM = PNPM.detect();\n\n const overrides = [\n {\n pkgName: '@vercel/nft',\n pkgVersion: '^0.27.4',\n },\n ...(nuxtMinVer && lt(nuxtMinVer, '3.14.0')\n ? [{ pkgName: 'ofetch', pkgVersion: '^1.4.0' }]\n : []),\n ];\n\n clack.log.warn(\n `To ensure Sentry can properly instrument your code it needs to add version overrides for some Nuxt dependencies${\n isPNPM ? ` and install ${chalk.cyan('import-in-the-middle')}.` : '.'\n }\\n\\nFor more info see: ${chalk.underline(\n 'https://github.com/getsentry/sentry-javascript/issues/14514',\n )}${\n isPNPM\n ? `\\n\\nand ${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/troubleshooting/#pnpm-dev-cannot-find-package-import-in-the-middle',\n )}`\n : ''\n }`,\n );\n\n for (const { pkgName, pkgVersion } of overrides) {\n const shouldAddOverride = await askShouldAddPackageOverride(\n pkgName,\n pkgVersion,\n );\n\n if (shouldAddOverride) {\n await packageManager.addOverride(pkgName, pkgVersion);\n }\n }\n\n if (PNPM.detect()) {\n // For pnpm, we want to install iitm\n // See: https://docs.sentry.io/platforms/javascript/guides/nuxt/troubleshooting/#pnpm-dev-cannot-find-package-import-in-the-middle\n const iitmAlreadyInstalled = hasPackageInstalled(\n 'import-in-the-middle',\n packageJson,\n );\n Sentry.setTag('iitm-already-installed', iitmAlreadyInstalled);\n\n const shouldInstallIitm = await askShouldInstallPackage(\n 'import-in-the-middle',\n );\n\n if (shouldInstallIitm) {\n await installPackage({\n packageName: 'import-in-the-middle',\n alreadyInstalled: iitmAlreadyInstalled,\n packageManager,\n forceInstall,\n });\n }\n }\n}\n\nexport async function confirmReadImportDocs(\n deploymentPlatform: DeploymentPlatform | symbol,\n) {\n const canImportSentryServerConfigFile =\n deploymentPlatform !== 'vercel' && deploymentPlatform !== 'netlify';\n\n if (!canImportSentryServerConfigFile) {\n // Nothing to do, users have been set up with automatic top-level-import instead\n return;\n }\n\n const docsUrl =\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/install/cli-import/#initializing-sentry-with---import';\n\n clack.log.info(\n `After building your Nuxt app, you need to ${chalk.bold(\n '--import',\n )} the Sentry server config file when running your app.\\n\\nFor more info, see:\\n\\n${chalk.underline(\n docsUrl,\n )}`,\n );\n\n const shouldOpenDocs = await abortIfCancelled(\n clack.confirm({ message: 'Do you want to open the docs?' }),\n );\n\n Sentry.setTag('init-with-import-docs-opened', shouldOpenDocs);\n\n if (shouldOpenDocs) {\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n const noop = () => {}; // eslint-disable-line @typescript-eslint/no-empty-function\n opn(docsUrl, { wait: false }).then((cp) => cp.on('error', noop), noop);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/nuxt/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport * as Sentry from '@sentry/node';\nimport chalk from 'chalk';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { generateCode, loadFile } from 'magicast';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { addNuxtModule } from 'magicast/helpers';\nimport opn from 'opn';\nimport { type SemVer, lt } from 'semver';\nimport { traceStep } from '../telemetry';\nimport {\n abortIfCancelled,\n askShouldAddPackageOverride,\n askShouldInstallPackage,\n featureSelectionPrompt,\n installPackage,\n isUsingTypeScript,\n} from '../utils/clack-utils';\nimport {\n type PackageDotJson,\n hasPackageInstalled,\n} from '../utils/package-json';\nimport { PNPM, type PackageManager } from '../utils/package-manager';\nimport {\n getConfigBody,\n getDefaultNuxtConfig,\n getNuxtModuleFallbackTemplate,\n getSentryConfigContents,\n} from './templates';\nimport { type DeploymentPlatform, deploymentPlatforms } from './types';\n\nconst possibleNuxtConfig = [\n 'nuxt.config.js',\n 'nuxt.config.mjs',\n 'nuxt.config.cjs',\n 'nuxt.config.ts',\n 'nuxt.config.mts',\n 'nuxt.config.cts',\n];\n\nexport async function getNuxtConfig(): Promise<string> {\n let configFile = possibleNuxtConfig.find((fileName) =>\n fs.existsSync(path.join(process.cwd(), fileName)),\n );\n\n if (!configFile) {\n clack.log.info('No Nuxt config file found, creating a new one.');\n Sentry.setTag('nuxt-config-strategy', 'create');\n // nuxt recommends its config to be .ts by default\n configFile = 'nuxt.config.ts';\n\n await fs.promises.writeFile(\n path.join(process.cwd(), configFile),\n getDefaultNuxtConfig(),\n { encoding: 'utf-8', flag: 'w' },\n );\n\n clack.log.success(`Created ${chalk.cyan('nuxt.config.ts')}.`);\n }\n\n return path.join(process.cwd(), configFile);\n}\n\nexport async function askDeploymentPlatform(): Promise<\n DeploymentPlatform | symbol\n> {\n return await abortIfCancelled(\n clack.select({\n message: 'Please select your deployment platform.',\n options: deploymentPlatforms.map((platform) => ({\n value: platform,\n label: `${platform.charAt(0).toUpperCase()}${platform.slice(1)}`,\n })),\n }),\n );\n}\n\nexport async function addSDKModule(\n config: string,\n options: { org: string; project: string; url: string; selfHosted: boolean },\n deploymentPlatform: DeploymentPlatform | symbol,\n): Promise<void> {\n const failureTagKey = 'modify-nuxt-config-error';\n\n const shouldTopLevelImport =\n deploymentPlatform === 'vercel' || deploymentPlatform === 'netlify';\n\n if (shouldTopLevelImport) {\n clack.log.warn(\n `Sentry needs to be initialized before the application starts. ${chalk.cyan(\n `${deploymentPlatform\n .charAt(0)\n .toUpperCase()}${deploymentPlatform.slice(1)}`,\n )} does not support this yet.\\n\\nWe will inject the Sentry server-side config at the top of your Nuxt server entry file instead.\\n\\nThis comes with some restrictions, for more info see:\\n\\n${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/install/top-level-import/',\n )} `,\n );\n }\n\n let module;\n\n try {\n module = await loadFile(config);\n } catch (e) {\n if (e instanceof Error) {\n if (e instanceof SyntaxError || e.message.includes('Unexpected token')) {\n Sentry.setTag(failureTagKey, 'loadFile-failed-syntax-error');\n } else if (\n e.message.includes('ENOENT') ||\n e.message.includes('no such file')\n ) {\n Sentry.setTag(failureTagKey, 'loadFile-failed-file-not-found');\n }\n } else {\n Sentry.setTag(failureTagKey, 'loadFile-failed');\n }\n\n clack.log.error(\n `Error while loading Nuxt config file: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n try {\n addNuxtModule(module, '@sentry/nuxt/module', 'sentry', {\n sourceMapsUploadOptions: {\n org: options.org,\n project: options.project,\n ...(options.selfHosted && { url: options.url }),\n },\n ...(shouldTopLevelImport && {\n autoInjectServerSentry: 'top-level-import',\n }),\n });\n } catch (e) {\n Sentry.setTag(failureTagKey, 'adding-sentry-options-failed');\n\n clack.log.error(\n `Error while modifying 'sentry' in Nuxt config: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n try {\n addNuxtModule(module, '@sentry/nuxt/module', 'sourcemap', {\n client: 'hidden',\n });\n } catch (e) {\n Sentry.setTag(failureTagKey, 'adding-sourcemap-options-failed');\n\n clack.log.error(\n `Error while modifying 'sourcemap' in Nuxt config: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n let code;\n\n try {\n ({ code } = generateCode(module));\n } catch (e) {\n Sentry.setTag(failureTagKey, 'generateCode-failed');\n\n clack.log.error(\n `Error while generating module code: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n try {\n await fs.promises.writeFile(config, code, { encoding: 'utf-8', flag: 'w' });\n\n clack.log.success(\n `Added Sentry Nuxt Module to ${chalk.cyan(path.basename(config))}.`,\n );\n } catch (e: unknown) {\n Sentry.setTag(failureTagKey, 'writeFile-failed');\n\n clack.log.error(\n `Error while writing Nuxt config: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n}\n\nfunction showFallbackInstructions(\n config: string,\n options: { org: string; project: string; url: string; selfHosted: boolean },\n shouldTopLevelImport: boolean,\n) {\n clack.log.warn(\n `Please add the following settings to ${chalk.cyan(\n path.basename(config),\n )}:`,\n );\n // eslint-disable-next-line no-console\n console.log(\n `\\n\\n${getNuxtModuleFallbackTemplate(options, shouldTopLevelImport)}\\n\\n`,\n );\n}\n\nexport async function createConfigFiles(dsn: string) {\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'client'] as const;\n\n for (const configVariant of configVariants) {\n await traceStep(`create-sentry-${configVariant}-config`, async () => {\n const jsConfig = `sentry.${configVariant}.config.js`;\n const tsConfig = `sentry.${configVariant}.config.ts`;\n\n const jsConfigExists = fs.existsSync(path.join(process.cwd(), jsConfig));\n const tsConfigExists = fs.existsSync(path.join(process.cwd(), tsConfig));\n\n let shouldWriteFile = true;\n\n if (jsConfigExists || tsConfigExists) {\n const existingConfigs = [];\n\n if (jsConfigExists) {\n existingConfigs.push(jsConfig);\n }\n\n if (tsConfigExists) {\n existingConfigs.push(tsConfig);\n }\n\n const overwriteExistingConfigs = await abortIfCancelled(\n clack.confirm({\n message: `Found existing Sentry ${configVariant} config (${existingConfigs.join(\n ', ',\n )}). Overwrite ${existingConfigs.length > 1 ? 'them' : 'it'}?`,\n }),\n );\n Sentry.setTag(\n `overwrite-${configVariant}-config`,\n overwriteExistingConfigs,\n );\n\n shouldWriteFile = overwriteExistingConfigs;\n\n if (overwriteExistingConfigs) {\n if (jsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), jsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryConfigContents(dsn, configVariant, selectedFeatures),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created new ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n Sentry.setTag(`created-${configVariant}-config`, true);\n } else {\n clack.log.info(\n `Okay, here are the changes your ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )} should contain:`,\n );\n // eslint-disable-next-line no-console\n console.log(\n '\\n\\n ' +\n getConfigBody(dsn, configVariant, selectedFeatures) +\n '\\n\\n',\n );\n }\n });\n }\n}\n\nexport async function addNuxtOverrides(\n packageJson: PackageDotJson,\n packageManager: PackageManager,\n nuxtMinVer: SemVer | null,\n forceInstall?: boolean,\n) {\n const isPNPM = PNPM.detect();\n\n const overrides = [\n {\n pkgName: '@vercel/nft',\n pkgVersion: '^0.27.4',\n },\n ...(nuxtMinVer && lt(nuxtMinVer, '3.14.0')\n ? [{ pkgName: 'ofetch', pkgVersion: '^1.4.0' }]\n : []),\n ];\n\n clack.log.warn(\n `To ensure Sentry can properly instrument your code it needs to add version overrides for some Nuxt dependencies${\n isPNPM ? ` and install ${chalk.cyan('import-in-the-middle')}.` : '.'\n }\\n\\nFor more info see: ${chalk.underline(\n 'https://github.com/getsentry/sentry-javascript/issues/14514',\n )}${\n isPNPM\n ? `\\n\\nand ${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/troubleshooting/#pnpm-dev-cannot-find-package-import-in-the-middle',\n )}`\n : ''\n }`,\n );\n\n for (const { pkgName, pkgVersion } of overrides) {\n const shouldAddOverride = await askShouldAddPackageOverride(\n pkgName,\n pkgVersion,\n );\n\n if (shouldAddOverride) {\n await packageManager.addOverride(pkgName, pkgVersion);\n }\n }\n\n if (PNPM.detect()) {\n // For pnpm, we want to install iitm\n // See: https://docs.sentry.io/platforms/javascript/guides/nuxt/troubleshooting/#pnpm-dev-cannot-find-package-import-in-the-middle\n const iitmAlreadyInstalled = hasPackageInstalled(\n 'import-in-the-middle',\n packageJson,\n );\n Sentry.setTag('iitm-already-installed', iitmAlreadyInstalled);\n\n const shouldInstallIitm = await askShouldInstallPackage(\n 'import-in-the-middle',\n );\n\n if (shouldInstallIitm) {\n await installPackage({\n packageName: 'import-in-the-middle',\n alreadyInstalled: iitmAlreadyInstalled,\n packageManager,\n forceInstall,\n });\n }\n }\n}\n\nexport async function confirmReadImportDocs(\n deploymentPlatform: DeploymentPlatform | symbol,\n) {\n const canImportSentryServerConfigFile =\n deploymentPlatform !== 'vercel' && deploymentPlatform !== 'netlify';\n\n if (!canImportSentryServerConfigFile) {\n // Nothing to do, users have been set up with automatic top-level-import instead\n return;\n }\n\n const docsUrl =\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/install/cli-import/#initializing-sentry-with---import';\n\n clack.log.info(\n `After building your Nuxt app, you need to ${chalk.bold(\n '--import',\n )} the Sentry server config file when running your app.\\n\\nFor more info, see:\\n\\n${chalk.underline(\n docsUrl,\n )}`,\n );\n\n const shouldOpenDocs = await abortIfCancelled(\n clack.confirm({ message: 'Do you want to open the docs?' }),\n );\n\n Sentry.setTag('init-with-import-docs-opened', shouldOpenDocs);\n\n if (shouldOpenDocs) {\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n const noop = () => {}; // eslint-disable-line @typescript-eslint/no-empty-function\n opn(docsUrl, { wait: false }).then((cp) => cp.on('error', noop), noop);\n }\n}\n"]}
|
|
@@ -56,7 +56,7 @@ async function runRemixWizardWithTelemetry(options) {
|
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
id: 'replay',
|
|
59
|
-
prompt: `Do you want to enable ${chalk_1.default.bold('
|
|
59
|
+
prompt: `Do you want to enable ${chalk_1.default.bold('Session Replay')} to get a video-like reproduction of errors during a user session?`,
|
|
60
60
|
enabledHint: 'recommended, but increases bundle size',
|
|
61
61
|
},
|
|
62
62
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remix-wizard.js","sourceRoot":"","sources":["../../../src/remix/remix-wizard.ts"],"names":[],"mappings":";;;;;;AAAA,+EAA+E;AAC/E,6DAAmC;AACnC,kDAA0B;AAE1B,sDAa8B;AAC9B,wDAA4D;AAE5D,2CAWqB;AACrB,0CAAuC;AACvC,4CAAwD;AACxD,mCAAwC;AACxC,mDAAkD;AAClD,kDAA8C;AAC9C,mDAA+D;AAC/D,+CAAkD;AAE3C,KAAK,UAAU,cAAc,CAAC,OAAsB;IACzD,OAAO,IAAA,yBAAa,EAClB;QACE,OAAO,EAAE,OAAO,CAAC,gBAAgB;QACjC,WAAW,EAAE,OAAO;QACpB,aAAa,EAAE,OAAO;KACvB,EACD,GAAG,EAAE,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAC3C,CAAC;AACJ,CAAC;AATD,wCASC;AAED,KAAK,UAAU,2BAA2B,CACxC,OAAsB;IAEtB,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAE9D,IAAA,0BAAY,EAAC;QACX,UAAU,EAAE,qBAAqB;QACjC,SAAS;QACT,gBAAgB;KACjB,CAAC,CAAC;IAEH,MAAM,IAAA,+CAAiC,GAAE,CAAC;IAE1C,MAAM,WAAW,GAAG,MAAM,IAAA,2BAAe,GAAE,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,GAAE,CAAC;IAE9C,qEAAqE;IACrE,MAAM,IAAA,sCAAwB,EAAC,WAAW,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAEvE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,GACzD,MAAM,IAAA,oCAAsB,EAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAE5D,MAAM,IAAA,4BAAc,EAAC;QACnB,WAAW,EAAE,kBAAkB;QAC/B,uBAAuB,EAAE,eAAe;QACxC,gBAAgB,EAAE,IAAA,kCAAmB,EAAC,eAAe,EAAE,WAAW,CAAC;QACnE,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IAE/C,MAAM,IAAI,GAAG,IAAA,+BAAiB,GAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAA,qBAAS,EAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAA,oBAAQ,EAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,gBAAgB,GAAG,MAAM,IAAA,oCAAsB,EAAC;QACpD;YACE,EAAE,EAAE,aAAa;YACjB,MAAM,EAAE,yBAAyB,eAAK,CAAC,IAAI,CACzC,SAAS,CACV,gDAAgD;YACjD,WAAW,EAAE,aAAa;SAC3B;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,MAAM,EAAE,yBAAyB,eAAK,CAAC,IAAI,CACzC,uBAAuB,CACxB,oEAAoE;YACrE,WAAW,EAAE,wCAAwC;SACtD;KACO,CAAC,CAAC;IAEZ,IAAI,UAAU,EAAE;QACd,MAAM,IAAA,qBAAS,EACb,iDAAiD,EACjD,KAAK,IAAI,EAAE;YACT,IAAI;gBACF,MAAM,IAAA,0BAAmB,EAAC;oBACxB,OAAO,EAAE,eAAe,CAAC,YAAY,CAAC,IAAI;oBAC1C,WAAW,EAAE,eAAe,CAAC,IAAI;oBACjC,GAAG,EAAE,SAAS;oBACd,UAAU;oBACV,SAAS;iBACV,CAAC,CAAC;aACJ;YAAC,OAAO,CAAC,EAAE;gBACV,iBAAK,CAAC,GAAG;qBACN,IAAI,CAAC;gJAC8H,CAAC,CAAC;gBACxI,IAAA,aAAK,EAAC,CAAC,CAAC,CAAC;aACV;QACH,CAAC,CACF,CAAC;KACH;SAAM;QACL,MAAM,IAAA,qBAAS,EAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACtE,IAAI;gBACF,MAAM,IAAA,6BAAiB,EAAC;oBACtB,GAAG,EAAE,eAAe,CAAC,YAAY,CAAC,IAAI;oBACtC,OAAO,EAAE,eAAe,CAAC,IAAI;oBAC7B,GAAG,EAAE,SAAS,KAAK,uBAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;oBACtD,UAAU,EAAE,IAAA,qBAAa,EAAC,WAAW,CAAC;iBACvC,CAAC,CAAC;gBAEH,MAAM,IAAA,gCAAkB,EAAC,EAAE,SAAS,EAAE,EAAE,8BAAgB,CAAC,CAAC;aAC3D;YAAC,OAAO,CAAC,EAAE;gBACV,iBAAK,CAAC,GAAG;qBACN,IAAI,CAAC;wIACwH,CAAC,CAAC;gBAClI,IAAA,aAAK,EAAC,CAAC,CAAC,CAAC;aACV;QACH,CAAC,CAAC,CAAC;KACJ;IAED,MAAM,IAAA,qBAAS,EAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QAClD,IAAI;YACF,MAAM,IAAA,+BAAmB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SACvC;QAAC,OAAO,CAAC,EAAE;YACV,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC;uHACkG,CAAC,CAAC;YACnH,IAAA,aAAK,EAAC,CAAC,CAAC,CAAC;SACV;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,qBAAS,EAAC,4BAA4B,EAAE,GAAG,EAAE;QAC3C,IAAI;YACF,IAAA,0BAAc,EAAC,IAAI,CAAC,CAAC;SACtB;QAAC,OAAO,CAAC,EAAE;YACV,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC;0CACqB,CAAC,CAAC;YACtC,IAAA,aAAK,EAAC,CAAC,CAAC,CAAC;SACV;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAA,qBAAS,EAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAC9D,IAAI;YACF,MAAM,IAAA,yCAA6B,EAAC,GAAG,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;SAClE;QAAC,OAAO,CAAC,EAAE;YACV,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC;uHACkG,CAAC,CAAC;YACnH,IAAA,aAAK,EAAC,CAAC,CAAC,CAAC;SACV;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,mBAAmB,GAAG,EAAE,CAAC;IAE7B,MAAM,IAAA,qBAAS,EAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAC/D,IAAI;YACF,mBAAmB,GAAG,MAAM,IAAA,2CAA+B,EACzD,GAAG,EACH,gBAAgB,CACjB,CAAC;SACH;QAAC,OAAO,CAAC,EAAE;YACV,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,sKAAsK,CACvK,CAAC;YACF,IAAA,aAAK,EAAC,CAAC,CAAC,CAAC;SACV;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,sBAAsB,GAAG,KAAK,CAAC;IAEnC,MAAM,IAAA,qBAAS,EACb,kDAAkD,EAClD,KAAK,IAAI,EAAE;QACT,IAAI;YACF,sBAAsB,GAAG,MAAM,IAAA,2CAA+B,EAC5D,GAAG,EACH,gBAAgB,CACjB,CAAC;SACH;QAAC,OAAO,CAAC,EAAE;YACV,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,sKAAsK,CACvK,CAAC;YACF,IAAA,aAAK,EAAC,CAAC,CAAC,CAAC;SACV;IACH,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,sBAAsB,IAAI,mBAAmB,EAAE;QAClD,MAAM,IAAA,qBAAS,EACb,uDAAuD,EACvD,KAAK,IAAI,EAAE;YACT,IAAI;gBACF,MAAM,IAAA,6BAAiB,EAAC,mBAAmB,CAAC,CAAC;aAC9C;YAAC,OAAO,CAAC,EAAE;gBACV,iBAAK,CAAC,GAAG;qBACN,IAAI,CAAC;yHACuG,CAAC,CAAC;gBACjH,IAAA,aAAK,EAAC,CAAC,CAAC,CAAC;aACV;QACH,CAAC,CACF,CAAC;KACH;IAED,MAAM,IAAA,qBAAS,EAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC5D,IAAI;YACF,MAAM,IAAA,yCAA6B,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SACjD;QAAC,OAAO,CAAC,EAAE;YACV,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC;uHACkG,CAAC,CAAC;YACnH,IAAA,aAAK,EAAC,CAAC,CAAC,CAAC;SACV;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,uBAAuB,GAAG,MAAM,IAAA,wCAA0B,GAAE,CAAC;IAEnE,IAAI,uBAAuB,EAAE;QAC3B,MAAM,IAAA,qBAAS,EAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,IAAA,+BAAiB,EAAC;gBACtB,IAAI;gBACJ,UAAU;gBACV,OAAO,EAAE,eAAe,CAAC,YAAY,CAAC,IAAI;gBAC1C,SAAS,EAAE,eAAe,CAAC,EAAE;gBAC7B,GAAG,EAAE,SAAS;aACf,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;KACJ;IAED,MAAM,IAAA,oCAAsB,GAAE,CAAC;IAE/B,iBAAK,CAAC,KAAK,CAAC;EACZ,eAAK,CAAC,KAAK,CACX,iEAAiE,CAClE;;EAEC,eAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC;;EAEtE,eAAK,CAAC,IAAI,CACV;0DACwD,CACzD,EAAE,CAAC,CAAC;AACL,CAAC","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 {\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-utils';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport {\n initializeSentryOnEntryClient,\n instrumentSentryOnEntryServer,\n updateBuildScript,\n instrumentRootRoute,\n isRemixV2,\n loadRemixConfig,\n runRemixReveal,\n insertServerInstrumentationFile,\n createServerInstrumentationFile,\n updateStartScript,\n} from './sdk-setup';\nimport { debug } from '../utils/debug';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { isHydrogenApp } from './utils';\nimport { DEFAULT_URL } from '../../lib/Constants';\nimport { findFile } from '../utils/ast-utils';\nimport { configureVitePlugin } from '../sourcemaps/tools/vite';\nimport { createExamplePage } from './sdk-example';\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 await confirmContinueIfNoOrDirtyGitRepo();\n\n const remixConfig = await loadRemixConfig();\n const packageJson = await getPackageDotJson();\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 { selectedProject, authToken, sentryUrl, selfHosted } =\n await getOrAskForProjectData(options, 'javascript-remix');\n\n await installPackage({\n packageName: '@sentry/remix@^9',\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 isV2 = isRemixV2(remixConfig, packageJson);\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 'Sentry Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n 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(isV2, 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(isV2, 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();\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"]}
|
|
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 {\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-utils';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport {\n initializeSentryOnEntryClient,\n instrumentSentryOnEntryServer,\n updateBuildScript,\n instrumentRootRoute,\n isRemixV2,\n loadRemixConfig,\n runRemixReveal,\n insertServerInstrumentationFile,\n createServerInstrumentationFile,\n updateStartScript,\n} from './sdk-setup';\nimport { debug } from '../utils/debug';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { isHydrogenApp } from './utils';\nimport { DEFAULT_URL } from '../../lib/Constants';\nimport { findFile } from '../utils/ast-utils';\nimport { configureVitePlugin } from '../sourcemaps/tools/vite';\nimport { createExamplePage } from './sdk-example';\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 await confirmContinueIfNoOrDirtyGitRepo();\n\n const remixConfig = await loadRemixConfig();\n const packageJson = await getPackageDotJson();\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 { selectedProject, authToken, sentryUrl, selfHosted } =\n await getOrAskForProjectData(options, 'javascript-remix');\n\n await installPackage({\n packageName: '@sentry/remix@^9',\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 isV2 = isRemixV2(remixConfig, packageJson);\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 ] 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(isV2, 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(isV2, 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();\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"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WizardOptions } from '../utils/types';
|
|
2
2
|
import type { SupportedTools } from './utils/detect-tool';
|
|
3
3
|
export declare function runSourcemapsWizard(options: WizardOptions): Promise<void>;
|
|
4
|
+
export declare function setupCI(selectedTool: SupportedTools, authToken: string, comingFrom: WizardOptions['comingFrom']): Promise<void>;
|
|
4
5
|
export declare function configureCI(selectedTool: SupportedTools, authToken: string): Promise<void>;
|
|
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.configureCI = exports.runSourcemapsWizard = void 0;
|
|
29
|
+
exports.configureCI = exports.setupCI = exports.runSourcemapsWizard = void 0;
|
|
30
30
|
// @ts-ignore - clack is ESM and TS complains about that. It works though
|
|
31
31
|
const prompts_1 = __importDefault(require("@clack/prompts"));
|
|
32
32
|
const chalk_1 = __importDefault(require("chalk"));
|
|
@@ -45,8 +45,6 @@ const telemetry_1 = require("../telemetry");
|
|
|
45
45
|
const other_wizards_1 = require("./utils/other-wizards");
|
|
46
46
|
const angular_1 = require("./tools/angular");
|
|
47
47
|
const detect_tool_1 = require("./utils/detect-tool");
|
|
48
|
-
const nextjs_1 = require("./tools/nextjs");
|
|
49
|
-
const remix_1 = require("./tools/remix");
|
|
50
48
|
const package_manager_1 = require("../utils/package-manager");
|
|
51
49
|
const url_1 = require("../utils/url");
|
|
52
50
|
async function runSourcemapsWizard(options) {
|
|
@@ -77,14 +75,6 @@ You can turn this off by running the wizard with the '--disable-telemetry' flag.
|
|
|
77
75
|
await (0, clack_utils_1.confirmContinueIfNoOrDirtyGitRepo)();
|
|
78
76
|
await (0, telemetry_1.traceStep)('check-sdk-version', sdk_version_1.ensureMinimumSdkVersionIsInstalled);
|
|
79
77
|
const { selfHosted, selectedProject, sentryUrl, authToken } = await (0, clack_utils_1.getOrAskForProjectData)(options);
|
|
80
|
-
const wizardOptionsWithPreSelectedProject = {
|
|
81
|
-
...options,
|
|
82
|
-
preSelectedProject: {
|
|
83
|
-
project: selectedProject,
|
|
84
|
-
authToken,
|
|
85
|
-
selfHosted,
|
|
86
|
-
},
|
|
87
|
-
};
|
|
88
78
|
const selectedTool = await (0, telemetry_1.traceStep)('select-tool', askForUsedBundlerTool);
|
|
89
79
|
Sentry.setTag('selected-tool', selectedTool);
|
|
90
80
|
if (selectedTool === 'no-tool') {
|
|
@@ -98,8 +88,8 @@ You can turn this off by running the wizard with the '--disable-telemetry' flag.
|
|
|
98
88
|
selfHosted,
|
|
99
89
|
url: sentryUrl,
|
|
100
90
|
authToken,
|
|
101
|
-
}
|
|
102
|
-
await (0, telemetry_1.traceStep)('ci-setup', () =>
|
|
91
|
+
}));
|
|
92
|
+
await (0, telemetry_1.traceStep)('ci-setup', () => setupCI(selectedTool, authToken, options.comingFrom));
|
|
103
93
|
(0, telemetry_1.traceStep)('outro', () => printOutro(sentryUrl, selectedProject.organization.slug, selectedProject.id));
|
|
104
94
|
}
|
|
105
95
|
async function askForUsedBundlerTool() {
|
|
@@ -116,16 +106,6 @@ async function askForUsedBundlerTool() {
|
|
|
116
106
|
value: 'create-react-app',
|
|
117
107
|
hint: 'Select this option if you set up your app with Create React App.',
|
|
118
108
|
},
|
|
119
|
-
{
|
|
120
|
-
label: 'Next.js',
|
|
121
|
-
value: 'nextjs',
|
|
122
|
-
hint: 'Select this option if you want to set up source maps in a Next.js project.',
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
label: 'Remix',
|
|
126
|
-
value: 'remix',
|
|
127
|
-
hint: 'Select this option if you want to set up source maps in a Remix project.',
|
|
128
|
-
},
|
|
129
109
|
{
|
|
130
110
|
label: 'Webpack',
|
|
131
111
|
value: 'webpack',
|
|
@@ -166,7 +146,7 @@ async function askForUsedBundlerTool() {
|
|
|
166
146
|
}));
|
|
167
147
|
return selectedTool;
|
|
168
148
|
}
|
|
169
|
-
async function startToolSetupFlow(selctedTool, options
|
|
149
|
+
async function startToolSetupFlow(selctedTool, options) {
|
|
170
150
|
switch (selctedTool) {
|
|
171
151
|
case 'webpack':
|
|
172
152
|
await (0, webpack_1.configureWebPackPlugin)(options);
|
|
@@ -189,17 +169,21 @@ async function startToolSetupFlow(selctedTool, options, wizardOptions) {
|
|
|
189
169
|
case 'angular':
|
|
190
170
|
await (0, sentry_cli_1.configureSentryCLI)(options, angular_1.configureAngularSourcemapGenerationFlow);
|
|
191
171
|
break;
|
|
192
|
-
case 'nextjs':
|
|
193
|
-
await (0, nextjs_1.configureNextJsSourceMapsUpload)(options, wizardOptions);
|
|
194
|
-
break;
|
|
195
|
-
case 'remix':
|
|
196
|
-
await (0, remix_1.configureRemixSourceMapsUpload)(options, wizardOptions);
|
|
197
|
-
break;
|
|
198
172
|
default:
|
|
199
173
|
await (0, sentry_cli_1.configureSentryCLI)(options);
|
|
200
174
|
break;
|
|
201
175
|
}
|
|
202
176
|
}
|
|
177
|
+
async function setupCI(selectedTool, authToken, comingFrom) {
|
|
178
|
+
if (comingFrom === 'vercel') {
|
|
179
|
+
prompts_1.default.log.info('Sentry Vercel integration is already configured. Skipping CI setup.');
|
|
180
|
+
Sentry.setTag('using-ci', true);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
await (0, telemetry_1.traceStep)('configure-ci', () => configureCI(selectedTool, authToken));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.setupCI = setupCI;
|
|
203
187
|
async function configureCI(selectedTool, authToken) {
|
|
204
188
|
const isUsingCI = await (0, clack_utils_1.abortIfCancelled)(prompts_1.default.select({
|
|
205
189
|
message: `Are you using a CI/CD tool to build and deploy your application?`,
|