import {Fragment} from 'react'; import ExternalLink from 'sentry/components/links/externalLink'; import List from 'sentry/components/list'; import ListItem from 'sentry/components/list/listItem'; import crashReportCallout from 'sentry/components/onboarding/gettingStartedDoc/feedback/crashReportCallout'; import widgetCallout from 'sentry/components/onboarding/gettingStartedDoc/feedback/widgetCallout'; import TracePropagationMessage from 'sentry/components/onboarding/gettingStartedDoc/replay/tracePropagationMessage'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step'; import type { Docs, DocsParams, OnboardingConfig, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import { getCrashReportJavaScriptInstallStep, getCrashReportModalConfigDescription, getCrashReportModalIntroduction, getFeedbackConfigureDescription, getFeedbackSDKSetupSnippet, } from 'sentry/components/onboarding/gettingStartedDoc/utils/feedbackOnboarding'; import {getJSMetricsOnboarding} from 'sentry/components/onboarding/gettingStartedDoc/utils/metricsOnboarding'; import { getReplayConfigureDescription, getReplaySDKSetupSnippet, } from 'sentry/components/onboarding/gettingStartedDoc/utils/replayOnboarding'; import {t, tct} from 'sentry/locale'; type Params = DocsParams; const getConfigStep = () => [ { description: tct( 'Configure your app automatically with the [wizardLink:Sentry wizard].', { wizardLink: ( ), } ), language: 'bash', code: `npx @sentry/wizard@latest -i remix`, }, ]; const getInstallConfig = () => [ { type: StepType.INSTALL, configurations: getConfigStep(), }, ]; const onboarding: OnboardingConfig = { introduction: () => tct("Sentry's integration with [remixLink:Remix] supports Remix 1.0.0 and above.", { remixLink: , }), install: () => getInstallConfig(), configure: () => [ { type: StepType.CONFIGURE, description: t( 'The Sentry wizard will automatically add code to your project to inialize and configure the Sentry SDK:' ), configurations: [ { description: ( {tct( "Create two files in the root directory of your project, [clientEntry:entry.client.tsx] and [serverEntry:entry.server.tsx] (if they don't already exist).", { clientEntry: , serverEntry: , } )} {tct( 'Add the default [sentryInitCode:Sentry.init] call to both, client and server entry files.', { sentryInitCode: , } )} {tct( 'Create a [cliRc:.sentryclirc] with an auth token to upload source maps (this file is automatically added to your [gitignore:.gitignore]).', { cliRc: , gitignore: , } )} {tct( 'Adjust your [buildscript:build] script in your [pkgJson:package.json] to automatically upload source maps to Sentry when you build your application.', { buildscript: , pkgJson: , } )} ), }, { description: tct( 'You can also further [manualConfigure:configure your SDK] or [manualSetupLink:set it up manually], without the wizard.', { manualConfigure: ( ), manualSetupLink: ( ), } ), }, ], }, ], verify: () => [], nextSteps: () => [], }; const replayOnboarding: OnboardingConfig = { install: () => getInstallConfig(), configure: (params: Params) => [ { type: StepType.CONFIGURE, description: getReplayConfigureDescription({ link: 'https://docs.sentry.io/platforms/javascript/guides/remix/session-replay/', }), configurations: [ { code: [ { label: 'JavaScript', value: 'javascript', language: 'javascript', code: getReplaySDKSetupSnippet({ importStatement: `import * as Sentry from "@sentry/remix";`, dsn: params.dsn.public, mask: params.replayOptions?.mask, block: params.replayOptions?.block, }), }, ], }, ], additionalInfo: ( {tct( 'Note: The Replay integration only needs to be added to your [entryClient:entry.client.tsx] file. It will not run if it is added into [sentryServer:sentry.server.config.js].', {entryClient: , sentryServer: } )} ), }, ], verify: () => [], nextSteps: () => [], }; const feedbackOnboarding: OnboardingConfig = { install: () => [ { type: StepType.INSTALL, description: tct( 'For the User Feedback integration to work, you must have the Sentry browser SDK package, or an equivalent framework SDK (e.g. [code:@sentry/remix]) installed, minimum version 7.85.0.', { code: , } ), configurations: getConfigStep(), }, ], configure: (params: Params) => [ { type: StepType.CONFIGURE, description: getFeedbackConfigureDescription({ linkConfig: 'https://docs.sentry.io/platforms/javascript/guides/remix/user-feedback/configuration/', linkButton: 'https://docs.sentry.io/platforms/javascript/guides/remix/user-feedback/configuration/#bring-your-own-button', }), configurations: [ { code: [ { label: 'JavaScript', value: 'javascript', language: 'javascript', code: getFeedbackSDKSetupSnippet({ importStatement: `import * as Sentry from "@sentry/remix";`, dsn: params.dsn.public, feedbackOptions: params.feedbackOptions, }), }, ], }, ], additionalInfo: crashReportCallout({ link: 'https://docs.sentry.io/platforms/javascript/guides/remix/user-feedback/#user-feedback-api', }), }, ], verify: () => [], nextSteps: () => [], }; const crashReportOnboarding: OnboardingConfig = { introduction: () => getCrashReportModalIntroduction(), install: (params: Params) => getCrashReportJavaScriptInstallStep(params), configure: () => [ { type: StepType.CONFIGURE, description: getCrashReportModalConfigDescription({ link: 'https://docs.sentry.io/platforms/javascript/guides/remix/user-feedback/configuration/#crash-report-modal', }), additionalInfo: widgetCallout({ link: 'https://docs.sentry.io/platforms/javascript/guides/remix/user-feedback/#user-feedback-widget', }), }, ], verify: () => [], nextSteps: () => [], }; const docs: Docs = { onboarding, feedbackOnboardingNpm: feedbackOnboarding, replayOnboardingNpm: replayOnboarding, customMetricsOnboarding: getJSMetricsOnboarding({getInstallConfig}), crashReportOnboarding, }; export default docs;