import ExternalLink from 'sentry/components/links/externalLink'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step'; import type { Docs, DocsParams, OnboardingConfig, } from 'sentry/components/onboarding/gettingStartedDoc/types'; import {getUploadSourceMapsStep} from 'sentry/components/onboarding/gettingStartedDoc/utils'; import { getCrashReportJavaScriptInstallStep, getCrashReportModalConfigDescription, getCrashReportModalIntroduction, } from 'sentry/components/onboarding/gettingStartedDoc/utils/feedbackOnboarding'; import {getJSServerMetricsOnboarding} from 'sentry/components/onboarding/gettingStartedDoc/utils/metricsOnboarding'; import replayOnboardingJsLoader from 'sentry/gettingStartedDocs/javascript/jsLoader/jsLoader'; import {t, tct} from 'sentry/locale'; import { getImportInstrumentSnippet, getInstallConfig, getSdkInitSnippet, getSentryImportSnippet, } from 'sentry/utils/gettingStartedDocs/node'; type Params = DocsParams; const getSdkSetupSnippet = () => ` ${getImportInstrumentSnippet()} // All other imports below ${getSentryImportSnippet('node')} const Fastify = require('fastify') const app = Fastify(); Sentry.setupFastifyErrorHandler(app); app.get("/", function rootHandler(req, res) { res.send("Hello world!"); }); app.listen(3000); `; const onboarding: OnboardingConfig = { introduction: () => tct('In this quick guide you’ll use [strong:npm] or [strong:yarn] to set up:', { strong: , }), install: (params: Params) => [ { type: StepType.INSTALL, description: t('Add the Sentry Node SDK as a dependency:'), configurations: getInstallConfig(params), }, ], configure: (params: Params) => [ { type: StepType.CONFIGURE, description: t( "Initialize Sentry as early as possible in your application's lifecycle." ), configurations: [ { description: tct( 'To initialize the SDK before everything else, create an external file called [code:instrument.js/mjs].', {code: } ), code: [ { label: 'JavaScript', value: 'javascript', language: 'javascript', filename: 'instrument.(js|mjs)', code: getSdkInitSnippet(params, 'node'), }, ], }, { description: tct( "Make sure to import [code:instrument.js/mjs] at the top of your file. Set up the error handler. This setup is typically done in your application's entry point file, which is usually [code:index.(js|ts)]. If you're running your application in ESM mode, or looking for alternative ways to set up Sentry, read about [docs:installation methods in our docs].", { code: , docs: ( ), } ), code: [ { label: 'JavaScript', value: 'javascript', language: 'javascript', filename: 'index.(js|mjs)', code: getSdkSetupSnippet(), }, ], }, ], }, getUploadSourceMapsStep({ guideLink: 'https://docs.sentry.io/platforms/javascript/guides/fastify/sourcemaps/', ...params, }), ], verify: () => [ { type: StepType.VERIFY, description: t( "This snippet contains an intentional error and can be used as a test to make sure that everything's working as expected." ), configurations: [ { language: 'javascript', code: ` app.get("/debug-sentry", function mainHandler(req, res) { throw new Error("My first Sentry error!"); }); `, }, ], }, ], }; const crashReportOnboarding: OnboardingConfig = { introduction: () => getCrashReportModalIntroduction(), install: (params: Params) => getCrashReportJavaScriptInstallStep(params), configure: () => [ { type: StepType.CONFIGURE, description: getCrashReportModalConfigDescription({ link: 'https://docs.sentry.io/platforms/javascript/guides/express/user-feedback/configuration/#crash-report-modal', }), }, ], verify: () => [], nextSteps: () => [], }; const docs: Docs = { onboarding, replayOnboardingJsLoader, customMetricsOnboarding: getJSServerMetricsOnboarding(), crashReportOnboarding, }; export default docs;