@sentry/wizard 6.4.0 → 6.6.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 +18 -0
- package/dist/e2e-tests/tests/angular-17.test.js +1 -0
- package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
- package/dist/e2e-tests/tests/angular-19.test.js +1 -0
- package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
- package/dist/e2e-tests/tests/expo.test.js +13 -3
- package/dist/e2e-tests/tests/expo.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-3.test.js +6 -0
- package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-4.test.js +6 -0
- package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-native.test.js +14 -4
- package/dist/e2e-tests/tests/react-native.test.js.map +1 -1
- package/dist/e2e-tests/tests/remix.test.js +2 -1
- package/dist/e2e-tests/tests/remix.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js +13 -2
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js +4 -0
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
- package/dist/src/android/android-wizard.js +9 -1
- package/dist/src/android/android-wizard.js.map +1 -1
- package/dist/src/android/manifest.d.ts +1 -1
- package/dist/src/android/manifest.js +2 -2
- package/dist/src/android/manifest.js.map +1 -1
- package/dist/src/android/templates.d.ts +1 -1
- package/dist/src/android/templates.js +4 -1
- package/dist/src/android/templates.js.map +1 -1
- package/dist/src/angular/codemods/main.js +1 -0
- package/dist/src/angular/codemods/main.js.map +1 -1
- package/dist/src/apple/templates.js +0 -2
- package/dist/src/apple/templates.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +1 -1
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.js +6 -4
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/nuxt/templates.js +10 -2
- package/dist/src/nuxt/templates.js.map +1 -1
- package/dist/src/react-native/javascript.d.ts +6 -4
- package/dist/src/react-native/javascript.js +11 -7
- package/dist/src/react-native/javascript.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.js +9 -0
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-native/xcode.js +5 -3
- package/dist/src/react-native/xcode.js.map +1 -1
- package/dist/src/remix/sdk-setup.js +1 -0
- package/dist/src/remix/sdk-setup.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup/setup.d.ts +6 -0
- package/dist/src/sveltekit/sdk-setup/setup.js +4 -1
- package/dist/src/sveltekit/sdk-setup/setup.js.map +1 -1
- package/dist/src/sveltekit/templates.js +9 -0
- package/dist/src/sveltekit/templates.js.map +1 -1
- package/dist/src/utils/clack/index.js +4 -1
- package/dist/src/utils/clack/index.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/test/angular/angular-wizard.test.js +113 -17
- package/dist/test/angular/angular-wizard.test.js.map +1 -1
- package/dist/test/apple/code-tools.test.js +0 -3
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/apple/templates.test.js +0 -4
- package/dist/test/apple/templates.test.js.map +1 -1
- package/dist/test/nextjs/templates.test.js +33 -22
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/nuxt/templates.test.js +50 -10
- package/dist/test/nuxt/templates.test.js.map +1 -1
- package/dist/test/react-native/javascript.test.js +225 -0
- package/dist/test/react-native/javascript.test.js.map +1 -1
- package/dist/test/react-native/xcode.test.js +20 -2
- package/dist/test/react-native/xcode.test.js.map +1 -1
- package/dist/test/remix/client-entry.test.js +10 -4
- package/dist/test/remix/client-entry.test.js.map +1 -1
- package/dist/test/sveltekit/templates.test.js +214 -0
- package/dist/test/sveltekit/templates.test.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/remix/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n\nimport type { Program } from '@babel/types';\n\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport type { Proxified, ProxifiedModule } from 'magicast';\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as url from 'url';\nimport * as childProcess from 'child_process';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport { gte, minVersion } from 'semver';\n\nimport {\n builders,\n generateCode,\n loadFile,\n parseModule,\n writeFile,\n // @ts-expect-error - magicast is ESM and TS complains about that. It works though\n} from 'magicast';\nimport type { PackageDotJson } from '../utils/package-json';\nimport { getPackageVersion } from '../utils/package-json';\nimport {\n getAfterImportsInsertionIndex,\n hasSentryContent,\n serverHasInstrumentationImport,\n} from './utils';\nimport { instrumentRoot } from './codemods/root';\nimport { instrumentHandleError } from './codemods/handle-error';\nimport { getPackageDotJson } from '../utils/clack';\nimport { findCustomExpressServerImplementation } from './codemods/express-server';\n\nexport type PartialRemixConfig = {\n unstable_dev?: boolean;\n};\n\nconst REMIX_CONFIG_FILE = 'remix.config.js';\nconst REMIX_REVEAL_COMMAND = 'npx remix reveal';\n\nexport function runRemixReveal(isTS: boolean): void {\n // Check if entry files already exist\n const clientEntryFilename = `entry.client.${isTS ? 'tsx' : 'jsx'}`;\n const serverEntryFilename = `entry.server.${isTS ? 'tsx' : 'jsx'}`;\n\n const clientEntryPath = path.join(process.cwd(), 'app', clientEntryFilename);\n const serverEntryPath = path.join(process.cwd(), 'app', serverEntryFilename);\n\n if (fs.existsSync(clientEntryPath) && fs.existsSync(serverEntryPath)) {\n clack.log.info(\n `Found entry files ${chalk.cyan(clientEntryFilename)} and ${chalk.cyan(\n serverEntryFilename,\n )}.`,\n );\n } else {\n clack.log.info(\n `Couldn't find entry files in your project. Trying to run ${chalk.cyan(\n REMIX_REVEAL_COMMAND,\n )}...`,\n );\n\n clack.log.info(childProcess.execSync(REMIX_REVEAL_COMMAND).toString());\n }\n}\n\ninterface SdkAstOptions {\n dsn: string;\n tracesSampleRate?: number;\n replaysSessionSampleRate?: number;\n replaysOnErrorSampleRate?: number;\n integrations?: Array<Proxified>;\n enableLogs?: boolean;\n}\n\nfunction getInitCallArgs(\n dsn: string,\n type: 'client' | 'server',\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n) {\n const initCallArgs: SdkAstOptions = {\n dsn,\n };\n\n // Adding tracing sample rate for both client and server\n if (selectedFeatures.performance) {\n initCallArgs.tracesSampleRate = 1.0;\n }\n\n // Adding logs for both client and server\n if (selectedFeatures.logs) {\n initCallArgs.enableLogs = true;\n }\n\n // Adding integrations and replay options only for client\n if (\n type === 'client' &&\n (selectedFeatures.performance || selectedFeatures.replay)\n ) {\n initCallArgs.integrations = [] as Array<Proxified>;\n\n if (selectedFeatures.performance) {\n initCallArgs.integrations.push(\n builders.functionCall(\n 'browserTracingIntegration',\n builders.raw('{ useEffect, useLocation, useMatches }'),\n ),\n );\n }\n\n if (selectedFeatures.replay) {\n initCallArgs.integrations.push(\n builders.functionCall('replayIntegration', {\n maskAllText: true,\n blockAllMedia: true,\n }),\n );\n\n initCallArgs.replaysSessionSampleRate = 0.1;\n initCallArgs.replaysOnErrorSampleRate = 1.0;\n }\n }\n\n return initCallArgs;\n}\n\nfunction insertClientInitCall(\n dsn: string,\n // MagicAst returns `ProxifiedModule<any>` so therefore we have to use `any` here\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalHooksMod: ProxifiedModule<any>,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n): void {\n const initCallArgs = getInitCallArgs(dsn, 'client', selectedFeatures);\n const initCall = builders.functionCall('init', initCallArgs);\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n const initCallInsertionIndex =\n getAfterImportsInsertionIndex(originalHooksModAST);\n\n originalHooksModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n}\n\nexport function generateServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n) {\n // create an empty file named `instrument.server.mjs`\n const instrumentationFile = 'instrumentation.server.mjs';\n const instrumentationFileMod = parseModule('');\n\n instrumentationFileMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n const initCallArgs = getInitCallArgs(dsn, 'server', selectedFeatures);\n const initCall = builders.functionCall('Sentry.init', initCallArgs);\n\n const instrumentationFileModAST = instrumentationFileMod.$ast as Program;\n\n const initCallInsertionIndex = getAfterImportsInsertionIndex(\n instrumentationFileModAST,\n );\n\n instrumentationFileModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n\n return { instrumentationFile, instrumentationFileMod };\n}\n\nexport async function createServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n) {\n const { instrumentationFile, instrumentationFileMod } =\n generateServerInstrumentationFile(dsn, selectedFeatures);\n\n await writeFile(instrumentationFileMod.$ast, instrumentationFile);\n\n return instrumentationFile;\n}\n\nexport async function insertServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n) {\n const instrumentationFile = await createServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n\n const expressServerPath = await findCustomExpressServerImplementation();\n\n if (!expressServerPath) {\n return false;\n }\n\n const originalExpressServerMod = await loadFile(expressServerPath);\n\n if (\n serverHasInstrumentationImport(\n expressServerPath,\n originalExpressServerMod.$code,\n )\n ) {\n clack.log.warn(\n `File ${chalk.cyan(\n path.basename(expressServerPath),\n )} already contains instrumentation import.\nSkipping adding instrumentation functionality to ${chalk.cyan(\n path.basename(expressServerPath),\n )}.`,\n );\n\n return true;\n }\n\n originalExpressServerMod.$code = `import './${instrumentationFile}';\\n${originalExpressServerMod.$code}`;\n\n fs.writeFileSync(expressServerPath, originalExpressServerMod.$code);\n\n return true;\n}\n\nexport function isRemixV2(packageJson: PackageDotJson): boolean {\n const remixVersion = getPackageVersion('@remix-run/react', packageJson);\n if (!remixVersion) {\n return false;\n }\n\n const minVer = minVersion(remixVersion);\n\n if (!minVer) {\n return false;\n }\n\n return gte(minVer, '2.0.0');\n}\n\nexport async function loadRemixConfig(): Promise<PartialRemixConfig> {\n const configFilePath = path.join(process.cwd(), REMIX_CONFIG_FILE);\n\n try {\n if (!fs.existsSync(configFilePath)) {\n return {};\n }\n\n const configUrl = url.pathToFileURL(configFilePath).href;\n const remixConfigModule = (await import(configUrl)) as {\n default: PartialRemixConfig;\n };\n\n return remixConfigModule?.default || {};\n } catch (e: unknown) {\n clack.log.error(`Couldn't load ${REMIX_CONFIG_FILE}.`);\n clack.log.info(\n chalk.dim(\n typeof e === 'object' && e != null && 'toString' in e\n ? e.toString()\n : typeof e === 'string'\n ? e\n : 'Unknown error',\n ),\n );\n\n return {};\n }\n}\n\nexport async function instrumentRootRoute(isTS?: boolean): Promise<void> {\n const rootFilename = `root.${isTS ? 'tsx' : 'jsx'}`;\n\n await instrumentRoot(rootFilename);\n\n clack.log.success(\n `Successfully instrumented root route ${chalk.cyan(rootFilename)}.`,\n );\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n}\n\nexport async function updateBuildScript(args: {\n org: string;\n project: string;\n url?: string;\n isHydrogen: boolean;\n}): Promise<void> {\n const packageJson = await getPackageDotJson();\n\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n\n const buildCommand = args.isHydrogen\n ? 'shopify hydrogen build'\n : 'remix build';\n\n const instrumentedBuildCommand =\n `${buildCommand} --sourcemap && sentry-upload-sourcemaps --org ${args.org} --project ${args.project}` +\n (args.url ? ` --url ${args.url}` : '') +\n (args.isHydrogen ? ' --buildPath ./dist' : '');\n\n if (!packageJson.scripts.build) {\n packageJson.scripts.build = instrumentedBuildCommand;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n } else if (packageJson.scripts.build.includes(buildCommand)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n packageJson.scripts.build = packageJson.scripts.build.replace(\n buildCommand,\n instrumentedBuildCommand,\n );\n } else {\n throw new Error(\n \"`build` script doesn't contain a known build command. Please update it manually.\",\n );\n }\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageJson, null, 2),\n );\n\n clack.log.success(\n `Successfully updated ${chalk.cyan('build')} script in ${chalk.cyan(\n 'package.json',\n )} to generate and upload sourcemaps.`,\n );\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n}\n\nexport function updateEntryClientMod(\n // MagicAst returns `ProxifiedModule<any>` so therefore we have to use `any` here\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalEntryClientMod: ProxifiedModule<any>,\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): ProxifiedModule<any> {\n const imports = ['init'];\n if (selectedFeatures.replay) {\n imports.push('replayIntegration');\n }\n if (selectedFeatures.performance) {\n imports.push('browserTracingIntegration');\n }\n originalEntryClientMod.imports.$add({\n from: '@sentry/remix',\n imported: `${imports.join(', ')}`,\n });\n\n if (selectedFeatures.performance) {\n originalEntryClientMod.imports.$add({\n from: '@remix-run/react',\n imported: 'useLocation',\n local: 'useLocation',\n });\n\n originalEntryClientMod.imports.$add({\n from: '@remix-run/react',\n imported: 'useMatches',\n local: 'useMatches',\n });\n\n originalEntryClientMod.imports.$add({\n from: 'react',\n imported: 'useEffect',\n local: 'useEffect',\n });\n }\n\n insertClientInitCall(dsn, originalEntryClientMod, selectedFeatures);\n\n return originalEntryClientMod;\n}\n\nexport async function initializeSentryOnEntryClient(\n dsn: string,\n isTS: boolean,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n): Promise<void> {\n const clientEntryFilename = `entry.client.${isTS ? 'tsx' : 'jsx'}`;\n\n const originalEntryClient = path.join(\n process.cwd(),\n 'app',\n clientEntryFilename,\n );\n\n const originalEntryClientMod = await loadFile(originalEntryClient);\n\n if (hasSentryContent(originalEntryClient, originalEntryClientMod.$code)) {\n return;\n }\n\n const updatedEntryClientMod = updateEntryClientMod(\n originalEntryClientMod,\n dsn,\n selectedFeatures,\n );\n\n await writeFile(\n updatedEntryClientMod.$ast,\n path.join(process.cwd(), 'app', clientEntryFilename),\n );\n\n clack.log.success(\n `Successfully initialized Sentry on client entry point ${chalk.cyan(\n clientEntryFilename,\n )}`,\n );\n}\n\nexport async function updateStartScript(instrumentationFile: string) {\n const packageJson = await getPackageDotJson();\n\n if (!packageJson.scripts || !packageJson.scripts.start) {\n throw new Error(\n \"Couldn't find a `start` script in your package.json. Please add one manually.\",\n );\n }\n\n if (packageJson.scripts.start.includes('NODE_OPTIONS')) {\n clack.log.warn(\n `Found existing NODE_OPTIONS in ${chalk.cyan(\n 'start',\n )} script. Skipping adding Sentry initialization.`,\n );\n\n return;\n }\n\n if (\n !packageJson.scripts.start.includes('remix-serve') &&\n // Adding a following empty space not to match a path that includes `node`\n !packageJson.scripts.start.includes('node ')\n ) {\n clack.log.warn(\n `Found a ${chalk.cyan('start')} script that doesn't use ${chalk.cyan(\n 'remix-serve',\n )} or ${chalk.cyan('node')}. Skipping adding Sentry initialization.`,\n );\n\n return;\n }\n\n const startCommand = packageJson.scripts.start;\n\n packageJson.scripts.start = `NODE_OPTIONS='--import ./${instrumentationFile}' ${startCommand}`;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageJson, null, 2),\n );\n\n clack.log.success(\n `Successfully updated ${chalk.cyan('start')} script in ${chalk.cyan(\n 'package.json',\n )} to include Sentry initialization on start.`,\n );\n}\n\nexport async function instrumentSentryOnEntryServer(\n isTS: boolean,\n): Promise<void> {\n const serverEntryFilename = `entry.server.${isTS ? 'tsx' : 'jsx'}`;\n\n const originalEntryServer = path.join(\n process.cwd(),\n 'app',\n serverEntryFilename,\n );\n\n const originalEntryServerMod = await loadFile(originalEntryServer);\n\n if (hasSentryContent(originalEntryServer, originalEntryServerMod.$code)) {\n return;\n }\n\n originalEntryServerMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n const handleErrorInstrumented = instrumentHandleError(\n originalEntryServerMod,\n serverEntryFilename,\n );\n\n if (handleErrorInstrumented) {\n clack.log.success(\n `Instrumented ${chalk.cyan('handleError')} in ${chalk.cyan(\n `${serverEntryFilename}`,\n )}`,\n );\n }\n\n await writeFile(\n originalEntryServerMod.$ast,\n path.join(process.cwd(), 'app', serverEntryFilename),\n );\n\n clack.log.success(\n `Successfully initialized Sentry on server entry point ${chalk.cyan(\n serverEntryFilename,\n )}.`,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/remix/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n\nimport type { Program } from '@babel/types';\n\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport type { Proxified, ProxifiedModule } from 'magicast';\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as url from 'url';\nimport * as childProcess from 'child_process';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport { gte, minVersion } from 'semver';\n\nimport {\n builders,\n generateCode,\n loadFile,\n parseModule,\n writeFile,\n // @ts-expect-error - magicast is ESM and TS complains about that. It works though\n} from 'magicast';\nimport type { PackageDotJson } from '../utils/package-json';\nimport { getPackageVersion } from '../utils/package-json';\nimport {\n getAfterImportsInsertionIndex,\n hasSentryContent,\n serverHasInstrumentationImport,\n} from './utils';\nimport { instrumentRoot } from './codemods/root';\nimport { instrumentHandleError } from './codemods/handle-error';\nimport { getPackageDotJson } from '../utils/clack';\nimport { findCustomExpressServerImplementation } from './codemods/express-server';\n\nexport type PartialRemixConfig = {\n unstable_dev?: boolean;\n};\n\nconst REMIX_CONFIG_FILE = 'remix.config.js';\nconst REMIX_REVEAL_COMMAND = 'npx remix reveal';\n\nexport function runRemixReveal(isTS: boolean): void {\n // Check if entry files already exist\n const clientEntryFilename = `entry.client.${isTS ? 'tsx' : 'jsx'}`;\n const serverEntryFilename = `entry.server.${isTS ? 'tsx' : 'jsx'}`;\n\n const clientEntryPath = path.join(process.cwd(), 'app', clientEntryFilename);\n const serverEntryPath = path.join(process.cwd(), 'app', serverEntryFilename);\n\n if (fs.existsSync(clientEntryPath) && fs.existsSync(serverEntryPath)) {\n clack.log.info(\n `Found entry files ${chalk.cyan(clientEntryFilename)} and ${chalk.cyan(\n serverEntryFilename,\n )}.`,\n );\n } else {\n clack.log.info(\n `Couldn't find entry files in your project. Trying to run ${chalk.cyan(\n REMIX_REVEAL_COMMAND,\n )}...`,\n );\n\n clack.log.info(childProcess.execSync(REMIX_REVEAL_COMMAND).toString());\n }\n}\n\ninterface SdkAstOptions {\n dsn: string;\n tracesSampleRate?: number;\n replaysSessionSampleRate?: number;\n replaysOnErrorSampleRate?: number;\n integrations?: Array<Proxified>;\n enableLogs?: boolean;\n sendDefaultPii?: boolean;\n}\n\nfunction getInitCallArgs(\n dsn: string,\n type: 'client' | 'server',\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n) {\n const initCallArgs: SdkAstOptions = {\n dsn,\n };\n\n // Adding tracing sample rate for both client and server\n if (selectedFeatures.performance) {\n initCallArgs.tracesSampleRate = 1.0;\n }\n\n // Adding logs for both client and server\n if (selectedFeatures.logs) {\n initCallArgs.enableLogs = true;\n }\n\n // Adding integrations and replay options only for client\n if (\n type === 'client' &&\n (selectedFeatures.performance || selectedFeatures.replay)\n ) {\n initCallArgs.integrations = [] as Array<Proxified>;\n\n if (selectedFeatures.performance) {\n initCallArgs.integrations.push(\n builders.functionCall(\n 'browserTracingIntegration',\n builders.raw('{ useEffect, useLocation, useMatches }'),\n ),\n );\n }\n\n if (selectedFeatures.replay) {\n initCallArgs.integrations.push(\n builders.functionCall('replayIntegration', {\n maskAllText: true,\n blockAllMedia: true,\n }),\n );\n\n initCallArgs.replaysSessionSampleRate = 0.1;\n initCallArgs.replaysOnErrorSampleRate = 1.0;\n }\n\n initCallArgs.sendDefaultPii = true;\n }\n\n return initCallArgs;\n}\n\nfunction insertClientInitCall(\n dsn: string,\n // MagicAst returns `ProxifiedModule<any>` so therefore we have to use `any` here\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalHooksMod: ProxifiedModule<any>,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n): void {\n const initCallArgs = getInitCallArgs(dsn, 'client', selectedFeatures);\n const initCall = builders.functionCall('init', initCallArgs);\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n const initCallInsertionIndex =\n getAfterImportsInsertionIndex(originalHooksModAST);\n\n originalHooksModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n}\n\nexport function generateServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n) {\n // create an empty file named `instrument.server.mjs`\n const instrumentationFile = 'instrumentation.server.mjs';\n const instrumentationFileMod = parseModule('');\n\n instrumentationFileMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n const initCallArgs = getInitCallArgs(dsn, 'server', selectedFeatures);\n const initCall = builders.functionCall('Sentry.init', initCallArgs);\n\n const instrumentationFileModAST = instrumentationFileMod.$ast as Program;\n\n const initCallInsertionIndex = getAfterImportsInsertionIndex(\n instrumentationFileModAST,\n );\n\n instrumentationFileModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n\n return { instrumentationFile, instrumentationFileMod };\n}\n\nexport async function createServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n) {\n const { instrumentationFile, instrumentationFileMod } =\n generateServerInstrumentationFile(dsn, selectedFeatures);\n\n await writeFile(instrumentationFileMod.$ast, instrumentationFile);\n\n return instrumentationFile;\n}\n\nexport async function insertServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n) {\n const instrumentationFile = await createServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n\n const expressServerPath = await findCustomExpressServerImplementation();\n\n if (!expressServerPath) {\n return false;\n }\n\n const originalExpressServerMod = await loadFile(expressServerPath);\n\n if (\n serverHasInstrumentationImport(\n expressServerPath,\n originalExpressServerMod.$code,\n )\n ) {\n clack.log.warn(\n `File ${chalk.cyan(\n path.basename(expressServerPath),\n )} already contains instrumentation import.\nSkipping adding instrumentation functionality to ${chalk.cyan(\n path.basename(expressServerPath),\n )}.`,\n );\n\n return true;\n }\n\n originalExpressServerMod.$code = `import './${instrumentationFile}';\\n${originalExpressServerMod.$code}`;\n\n fs.writeFileSync(expressServerPath, originalExpressServerMod.$code);\n\n return true;\n}\n\nexport function isRemixV2(packageJson: PackageDotJson): boolean {\n const remixVersion = getPackageVersion('@remix-run/react', packageJson);\n if (!remixVersion) {\n return false;\n }\n\n const minVer = minVersion(remixVersion);\n\n if (!minVer) {\n return false;\n }\n\n return gte(minVer, '2.0.0');\n}\n\nexport async function loadRemixConfig(): Promise<PartialRemixConfig> {\n const configFilePath = path.join(process.cwd(), REMIX_CONFIG_FILE);\n\n try {\n if (!fs.existsSync(configFilePath)) {\n return {};\n }\n\n const configUrl = url.pathToFileURL(configFilePath).href;\n const remixConfigModule = (await import(configUrl)) as {\n default: PartialRemixConfig;\n };\n\n return remixConfigModule?.default || {};\n } catch (e: unknown) {\n clack.log.error(`Couldn't load ${REMIX_CONFIG_FILE}.`);\n clack.log.info(\n chalk.dim(\n typeof e === 'object' && e != null && 'toString' in e\n ? e.toString()\n : typeof e === 'string'\n ? e\n : 'Unknown error',\n ),\n );\n\n return {};\n }\n}\n\nexport async function instrumentRootRoute(isTS?: boolean): Promise<void> {\n const rootFilename = `root.${isTS ? 'tsx' : 'jsx'}`;\n\n await instrumentRoot(rootFilename);\n\n clack.log.success(\n `Successfully instrumented root route ${chalk.cyan(rootFilename)}.`,\n );\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n}\n\nexport async function updateBuildScript(args: {\n org: string;\n project: string;\n url?: string;\n isHydrogen: boolean;\n}): Promise<void> {\n const packageJson = await getPackageDotJson();\n\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n\n const buildCommand = args.isHydrogen\n ? 'shopify hydrogen build'\n : 'remix build';\n\n const instrumentedBuildCommand =\n `${buildCommand} --sourcemap && sentry-upload-sourcemaps --org ${args.org} --project ${args.project}` +\n (args.url ? ` --url ${args.url}` : '') +\n (args.isHydrogen ? ' --buildPath ./dist' : '');\n\n if (!packageJson.scripts.build) {\n packageJson.scripts.build = instrumentedBuildCommand;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n } else if (packageJson.scripts.build.includes(buildCommand)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n packageJson.scripts.build = packageJson.scripts.build.replace(\n buildCommand,\n instrumentedBuildCommand,\n );\n } else {\n throw new Error(\n \"`build` script doesn't contain a known build command. Please update it manually.\",\n );\n }\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageJson, null, 2),\n );\n\n clack.log.success(\n `Successfully updated ${chalk.cyan('build')} script in ${chalk.cyan(\n 'package.json',\n )} to generate and upload sourcemaps.`,\n );\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n}\n\nexport function updateEntryClientMod(\n // MagicAst returns `ProxifiedModule<any>` so therefore we have to use `any` here\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalEntryClientMod: ProxifiedModule<any>,\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): ProxifiedModule<any> {\n const imports = ['init'];\n if (selectedFeatures.replay) {\n imports.push('replayIntegration');\n }\n if (selectedFeatures.performance) {\n imports.push('browserTracingIntegration');\n }\n originalEntryClientMod.imports.$add({\n from: '@sentry/remix',\n imported: `${imports.join(', ')}`,\n });\n\n if (selectedFeatures.performance) {\n originalEntryClientMod.imports.$add({\n from: '@remix-run/react',\n imported: 'useLocation',\n local: 'useLocation',\n });\n\n originalEntryClientMod.imports.$add({\n from: '@remix-run/react',\n imported: 'useMatches',\n local: 'useMatches',\n });\n\n originalEntryClientMod.imports.$add({\n from: 'react',\n imported: 'useEffect',\n local: 'useEffect',\n });\n }\n\n insertClientInitCall(dsn, originalEntryClientMod, selectedFeatures);\n\n return originalEntryClientMod;\n}\n\nexport async function initializeSentryOnEntryClient(\n dsn: string,\n isTS: boolean,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n): Promise<void> {\n const clientEntryFilename = `entry.client.${isTS ? 'tsx' : 'jsx'}`;\n\n const originalEntryClient = path.join(\n process.cwd(),\n 'app',\n clientEntryFilename,\n );\n\n const originalEntryClientMod = await loadFile(originalEntryClient);\n\n if (hasSentryContent(originalEntryClient, originalEntryClientMod.$code)) {\n return;\n }\n\n const updatedEntryClientMod = updateEntryClientMod(\n originalEntryClientMod,\n dsn,\n selectedFeatures,\n );\n\n await writeFile(\n updatedEntryClientMod.$ast,\n path.join(process.cwd(), 'app', clientEntryFilename),\n );\n\n clack.log.success(\n `Successfully initialized Sentry on client entry point ${chalk.cyan(\n clientEntryFilename,\n )}`,\n );\n}\n\nexport async function updateStartScript(instrumentationFile: string) {\n const packageJson = await getPackageDotJson();\n\n if (!packageJson.scripts || !packageJson.scripts.start) {\n throw new Error(\n \"Couldn't find a `start` script in your package.json. Please add one manually.\",\n );\n }\n\n if (packageJson.scripts.start.includes('NODE_OPTIONS')) {\n clack.log.warn(\n `Found existing NODE_OPTIONS in ${chalk.cyan(\n 'start',\n )} script. Skipping adding Sentry initialization.`,\n );\n\n return;\n }\n\n if (\n !packageJson.scripts.start.includes('remix-serve') &&\n // Adding a following empty space not to match a path that includes `node`\n !packageJson.scripts.start.includes('node ')\n ) {\n clack.log.warn(\n `Found a ${chalk.cyan('start')} script that doesn't use ${chalk.cyan(\n 'remix-serve',\n )} or ${chalk.cyan('node')}. Skipping adding Sentry initialization.`,\n );\n\n return;\n }\n\n const startCommand = packageJson.scripts.start;\n\n packageJson.scripts.start = `NODE_OPTIONS='--import ./${instrumentationFile}' ${startCommand}`;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageJson, null, 2),\n );\n\n clack.log.success(\n `Successfully updated ${chalk.cyan('start')} script in ${chalk.cyan(\n 'package.json',\n )} to include Sentry initialization on start.`,\n );\n}\n\nexport async function instrumentSentryOnEntryServer(\n isTS: boolean,\n): Promise<void> {\n const serverEntryFilename = `entry.server.${isTS ? 'tsx' : 'jsx'}`;\n\n const originalEntryServer = path.join(\n process.cwd(),\n 'app',\n serverEntryFilename,\n );\n\n const originalEntryServerMod = await loadFile(originalEntryServer);\n\n if (hasSentryContent(originalEntryServer, originalEntryServerMod.$code)) {\n return;\n }\n\n originalEntryServerMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n const handleErrorInstrumented = instrumentHandleError(\n originalEntryServerMod,\n serverEntryFilename,\n );\n\n if (handleErrorInstrumented) {\n clack.log.success(\n `Instrumented ${chalk.cyan('handleError')} in ${chalk.cyan(\n `${serverEntryFilename}`,\n )}`,\n );\n }\n\n await writeFile(\n originalEntryServerMod.$ast,\n path.join(process.cwd(), 'app', serverEntryFilename),\n );\n\n clack.log.success(\n `Successfully initialized Sentry on server entry point ${chalk.cyan(\n serverEntryFilename,\n )}.`,\n );\n}\n"]}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import type { ProxifiedModule } from 'magicast';
|
|
1
2
|
import { type PartialBackwardsForwardsCompatibleSvelteConfig } from './svelte-config';
|
|
2
3
|
import { ProjectInfo } from './types';
|
|
3
4
|
export declare function createOrMergeSvelteKitFiles(projectInfo: ProjectInfo, svelteConfig: PartialBackwardsForwardsCompatibleSvelteConfig, setupForSvelteKitTracing: boolean): Promise<void>;
|
|
5
|
+
export declare function insertClientInitCall(dsn: string, originalHooksMod: ProxifiedModule<any>, selectedFeatures: {
|
|
6
|
+
performance: boolean;
|
|
7
|
+
replay: boolean;
|
|
8
|
+
logs: boolean;
|
|
9
|
+
}): 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.createOrMergeSvelteKitFiles = void 0;
|
|
29
|
+
exports.insertClientInitCall = exports.createOrMergeSvelteKitFiles = void 0;
|
|
30
30
|
const fs = __importStar(require("fs"));
|
|
31
31
|
const path = __importStar(require("path"));
|
|
32
32
|
const chalk_1 = __importDefault(require("chalk"));
|
|
@@ -256,6 +256,7 @@ originalHooksMod, selectedFeatures) {
|
|
|
256
256
|
if (selectedFeatures.logs) {
|
|
257
257
|
initArgs.enableLogs = true;
|
|
258
258
|
}
|
|
259
|
+
initArgs.sendDefaultPii = true;
|
|
259
260
|
// This assignment of any values is fine because we're just creating a function call in magicast
|
|
260
261
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
261
262
|
const initCall = magicast_1.builders.functionCall('Sentry.init', initArgs);
|
|
@@ -270,6 +271,7 @@ originalHooksMod, selectedFeatures) {
|
|
|
270
271
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
271
272
|
(0, magicast_1.generateCode)(initCallWithComment).code);
|
|
272
273
|
}
|
|
274
|
+
exports.insertClientInitCall = insertClientInitCall;
|
|
273
275
|
function insertServerInitCall(dsn,
|
|
274
276
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
275
277
|
originalMod, selectedFeatures) {
|
|
@@ -282,6 +284,7 @@ originalMod, selectedFeatures) {
|
|
|
282
284
|
if (selectedFeatures.logs) {
|
|
283
285
|
initArgs.enableLogs = true;
|
|
284
286
|
}
|
|
287
|
+
initArgs.sendDefaultPii = true;
|
|
285
288
|
// This assignment of any values is fine because we're just creating a function call in magicast
|
|
286
289
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
287
290
|
const initCall = magicast_1.builders.functionCall('Sentry.init', initArgs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/sveltekit/sdk-setup/setup.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExportNamedDeclaration, Program } from '@babel/types';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\n\nimport * as Sentry from '@sentry/node';\n\n//@ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport type { ProxifiedModule } from 'magicast';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, loadFile } from 'magicast';\nimport {\n getClientHooksTemplate,\n getInstrumentationServerTemplate,\n getServerHooksTemplate,\n} from '../templates';\nimport {\n featureSelectionPrompt,\n isUsingTypeScript,\n showCopyPasteInstructions,\n} from '../../utils/clack';\nimport { findFile, hasSentryContent } from '../../utils/ast-utils';\n\nimport * as recast from 'recast';\nimport x = recast.types;\nimport t = x.namedTypes;\nimport {\n enableTracingAndInstrumentation,\n type PartialBackwardsForwardsCompatibleSvelteConfig,\n} from './svelte-config';\nimport { ProjectInfo } from './types';\nimport { modifyViteConfig } from './vite';\nimport { modifyAndRecordFail } from './utils';\nimport { debug } from '../../utils/debug';\n\nexport async function createOrMergeSvelteKitFiles(\n projectInfo: ProjectInfo,\n svelteConfig: PartialBackwardsForwardsCompatibleSvelteConfig,\n setupForSvelteKitTracing: boolean,\n): Promise<void> {\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n {\n id: 'logs',\n prompt: `Do you want to enable ${chalk.bold(\n 'Logs',\n )} to send your application logs to Sentry?`,\n enabledHint: 'recommended',\n },\n ] as const);\n\n const { clientHooksPath, serverHooksPath } = getHooksConfigDirs(svelteConfig);\n\n // full file paths with correct file ending (or undefined if not found)\n const originalClientHooksFile = findFile(clientHooksPath);\n const originalServerHooksFile = findFile(serverHooksPath);\n const originalInstrumentationServerFile = findFile(\n path.resolve(process.cwd(), 'src', 'instrumentation.server'),\n );\n\n const viteConfig = findFile(path.resolve(process.cwd(), 'vite.config'));\n\n const fileEnding = isUsingTypeScript() ? 'ts' : 'js';\n\n const { dsn } = projectInfo;\n\n if (setupForSvelteKitTracing) {\n await enableTracingAndInstrumentation(\n svelteConfig,\n selectedFeatures.performance,\n );\n\n try {\n if (!originalInstrumentationServerFile) {\n await createNewInstrumentationServerFile(dsn, selectedFeatures);\n } else {\n await mergeInstrumentationServerFile(\n originalInstrumentationServerFile,\n dsn,\n selectedFeatures,\n );\n }\n } catch (e) {\n clack.log.warn(\n `Failed to automatically set up ${chalk.cyan(\n `instrumentation.server.${\n fileEnding ?? isUsingTypeScript() ? 'ts' : 'js'\n }`,\n )}.`,\n );\n debug(e);\n\n await showCopyPasteInstructions({\n codeSnippet: getInstrumentationServerTemplate(dsn, selectedFeatures),\n filename: `instrumentation.server.${\n fileEnding ?? isUsingTypeScript() ? 'ts' : 'js'\n }`,\n });\n\n Sentry.setTag('created-instrumentation-server', 'fail');\n }\n }\n\n Sentry.setTag(\n 'server-hooks-file-strategy',\n originalServerHooksFile ? 'merge' : 'create',\n );\n\n if (!originalServerHooksFile) {\n await createNewHooksFile(\n `${serverHooksPath}.${fileEnding}`,\n 'server',\n dsn,\n selectedFeatures,\n !setupForSvelteKitTracing,\n );\n } else {\n await mergeHooksFile(\n originalServerHooksFile,\n 'server',\n dsn,\n selectedFeatures,\n !setupForSvelteKitTracing,\n );\n }\n\n Sentry.setTag(\n 'client-hooks-file-strategy',\n originalClientHooksFile ? 'merge' : 'create',\n );\n if (!originalClientHooksFile) {\n await createNewHooksFile(\n `${clientHooksPath}.${fileEnding}`,\n 'client',\n dsn,\n selectedFeatures,\n true,\n );\n } else {\n await mergeHooksFile(\n originalClientHooksFile,\n 'client',\n dsn,\n selectedFeatures,\n true,\n );\n }\n\n if (viteConfig) {\n await modifyViteConfig(viteConfig, projectInfo);\n }\n}\n\n/**\n * Attempts to read the svelte.config.js file to find the location of the hooks files.\n * If users specified a custom location, we'll use that. Otherwise, we'll use the default.\n */\nfunction getHooksConfigDirs(\n svelteConfig: PartialBackwardsForwardsCompatibleSvelteConfig,\n): {\n clientHooksPath: string;\n serverHooksPath: string;\n} {\n const relativeUserClientHooksPath = svelteConfig?.kit?.files?.hooks?.client;\n const relativeUserServerHooksPath = svelteConfig?.kit?.files?.hooks?.server;\n const userClientHooksPath =\n relativeUserClientHooksPath &&\n path.resolve(process.cwd(), relativeUserClientHooksPath);\n const userServerHooksPath =\n relativeUserServerHooksPath &&\n path.resolve(process.cwd(), relativeUserServerHooksPath);\n\n const defaulHooksDir = path.resolve(process.cwd(), 'src');\n const defaultClientHooksPath = path.resolve(defaulHooksDir, 'hooks.client'); // file ending missing on purpose\n const defaultServerHooksPath = path.resolve(defaulHooksDir, 'hooks.server'); // same here\n\n return {\n clientHooksPath: userClientHooksPath || defaultClientHooksPath,\n serverHooksPath: userServerHooksPath || defaultServerHooksPath,\n };\n}\n\n/**\n * Reads the template, replaces the dsn placeholder with the actual dsn and writes the file to @param hooksFileDest\n */\nasync function createNewHooksFile(\n hooksFileDest: string,\n hooktype: 'client' | 'server',\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n setupForSvelteKitTracing: boolean,\n): Promise<void> {\n const filledTemplate =\n hooktype === 'client'\n ? getClientHooksTemplate(dsn, selectedFeatures)\n : getServerHooksTemplate(dsn, selectedFeatures, setupForSvelteKitTracing);\n\n await fs.promises.mkdir(path.dirname(hooksFileDest), { recursive: true });\n await fs.promises.writeFile(hooksFileDest, filledTemplate);\n\n clack.log.success(`Created ${hooksFileDest}`);\n Sentry.setTag(`created-${hooktype}-hooks`, 'success');\n}\n\nasync function createNewInstrumentationServerFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n logs: boolean;\n },\n): Promise<void> {\n const filledTemplate = getInstrumentationServerTemplate(\n dsn,\n selectedFeatures,\n );\n\n const fileEnding = isUsingTypeScript() ? 'ts' : 'js';\n\n const instrumentationServerFile = path.resolve(\n process.cwd(),\n 'src',\n `instrumentation.server.${fileEnding}`,\n );\n\n await fs.promises.mkdir(path.dirname(instrumentationServerFile), {\n recursive: true,\n });\n\n await fs.promises.writeFile(instrumentationServerFile, filledTemplate);\n\n clack.log.success(\n `Created ${chalk.cyan(path.basename(instrumentationServerFile))}`,\n );\n Sentry.setTag('created-instrumentation-server', 'success');\n}\n\n/**\n * Merges the users' hooks file with Sentry-related code.\n *\n * Both hooks:\n * - add import * as Sentry\n * - add Sentry.init\n * - add handleError hook wrapper\n *\n * Additionally in Server hook:\n * - add handle hook handler\n */\nasync function mergeHooksFile(\n hooksFile: string,\n hookType: 'client' | 'server',\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n includeSentryInit: boolean,\n): Promise<void> {\n const originalHooksMod = await loadFile(hooksFile);\n\n const file: 'server-hooks' | 'client-hooks' = `${hookType}-hooks`;\n\n if (hasSentryContent(originalHooksMod.$ast as t.Program)) {\n // We don't want to mess with files that already have Sentry content.\n // Let's just bail out at this point.\n clack.log.warn(\n `File ${chalk.cyan(\n path.basename(hooksFile),\n )} already contains Sentry code.\nSkipping adding Sentry functionality to.`,\n );\n Sentry.setTag(`modified-${file}`, 'fail');\n Sentry.setTag(`${file}-fail-reason`, 'has-sentry-content');\n return;\n }\n\n await modifyAndRecordFail(\n () =>\n originalHooksMod.imports.$add({\n from: '@sentry/sveltekit',\n imported: '*',\n local: 'Sentry',\n }),\n 'import-injection',\n file,\n );\n\n if (hookType === 'client' || includeSentryInit) {\n await modifyAndRecordFail(\n () => {\n if (hookType === 'client') {\n insertClientInitCall(dsn, originalHooksMod, selectedFeatures);\n } else {\n insertServerInitCall(dsn, originalHooksMod, selectedFeatures);\n }\n },\n 'init-call-injection',\n file,\n );\n }\n\n await modifyAndRecordFail(\n () => wrapHandleError(originalHooksMod),\n 'wrap-handle-error',\n file,\n );\n\n if (hookType === 'server') {\n await modifyAndRecordFail(\n () => wrapHandle(originalHooksMod),\n 'wrap-handle',\n 'server-hooks',\n );\n }\n\n await modifyAndRecordFail(\n async () => {\n const modifiedCode = originalHooksMod.generate().code;\n await fs.promises.writeFile(hooksFile, modifiedCode);\n },\n 'write-file',\n file,\n );\n\n clack.log.success(`Added Sentry code to ${hooksFile}`);\n Sentry.setTag(`modified-${hookType}-hooks`, 'success');\n}\n\n/**\n * Merges the users' instrumentation.server file with Sentry-related code.\n *\n * Both hooks:\n * - add import * as Sentry\n * - add Sentry.init\n * - add handleError hook wrapper\n *\n * Additionally in Server hook:\n * - add handle hook handler\n */\nasync function mergeInstrumentationServerFile(\n instrumentationServerFilePath: string,\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n): Promise<void> {\n const originalInstrumentationServerMod = await loadFile(\n instrumentationServerFilePath,\n );\n const filename = path.basename(instrumentationServerFilePath);\n\n if (hasSentryContent(originalInstrumentationServerMod.$ast as t.Program)) {\n // We don't want to mess with files that already have Sentry content.\n // Let's just bail out at this point.\n clack.log.warn(\n `File ${chalk.cyan(filename)} already contains Sentry code.\nSkipping adding Sentry functionality to it.`,\n );\n Sentry.setTag(`modified-instrumentation-server`, 'fail');\n Sentry.setTag(`instrumentation-server-fail-reason`, 'has-sentry-content');\n return;\n }\n\n await modifyAndRecordFail(\n () =>\n originalInstrumentationServerMod.imports.$add({\n from: '@sentry/sveltekit',\n imported: '*',\n local: 'Sentry',\n }),\n 'import-injection',\n 'instrumentation-server',\n );\n\n await modifyAndRecordFail(\n () => {\n insertServerInitCall(\n dsn,\n originalInstrumentationServerMod,\n selectedFeatures,\n );\n },\n 'init-call-injection',\n 'instrumentation-server',\n );\n\n await modifyAndRecordFail(\n async () => {\n const modifiedCode = originalInstrumentationServerMod.generate().code;\n await fs.promises.writeFile(instrumentationServerFilePath, modifiedCode);\n },\n 'write-file',\n 'instrumentation-server',\n );\n\n clack.log.success(`Added Sentry.init code to ${chalk.cyan(filename)}`);\n Sentry.setTag(`modified-instrumentation-server`, 'success');\n}\n\nfunction insertClientInitCall(\n dsn: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalHooksMod: ProxifiedModule<any>,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n): void {\n const initCallComment = `\n // If you don't want to use Session Replay, remove the \\`Replay\\` integration,\n // \\`replaysSessionSampleRate\\` and \\`replaysOnErrorSampleRate\\` options.`;\n\n const initArgs: {\n dsn: string;\n tracesSampleRate?: number;\n replaysSessionSampleRate?: number;\n replaysOnErrorSampleRate?: number;\n integrations?: string[];\n enableLogs?: boolean;\n } = {\n dsn,\n };\n\n if (selectedFeatures.performance) {\n initArgs.tracesSampleRate = 1.0;\n }\n\n if (selectedFeatures.replay) {\n initArgs.replaysSessionSampleRate = 0.1;\n initArgs.replaysOnErrorSampleRate = 1.0;\n initArgs.integrations = [builders.functionCall('Sentry.replayIntegration')];\n }\n\n if (selectedFeatures.logs) {\n initArgs.enableLogs = true;\n }\n\n // This assignment of any values is fine because we're just creating a function call in magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCall = builders.functionCall('Sentry.init', initArgs);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCallWithComment = builders.raw(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n `${initCallComment}\\n${generateCode(initCall).code}`,\n );\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n\n const initCallInsertionIndex = getInitCallInsertionIndex(originalHooksModAST);\n\n originalHooksModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCallWithComment).code,\n );\n}\n\nfunction insertServerInitCall(\n dsn: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalMod: ProxifiedModule<any>,\n selectedFeatures: {\n performance: boolean;\n logs: boolean;\n },\n): void {\n const initArgs: {\n dsn: string;\n tracesSampleRate?: number;\n enableLogs?: boolean;\n } = {\n dsn,\n };\n\n if (selectedFeatures.performance) {\n initArgs.tracesSampleRate = 1.0;\n }\n\n if (selectedFeatures.logs) {\n initArgs.enableLogs = true;\n }\n\n // This assignment of any values is fine because we're just creating a function call in magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCall = builders.functionCall('Sentry.init', initArgs);\n\n const originalModAST = originalMod.$ast as Program;\n\n const initCallInsertionIndex = getInitCallInsertionIndex(originalModAST);\n\n originalModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction wrapHandleError(mod: ProxifiedModule<any>): void {\n const modAst = mod.exports.$ast as Program;\n const namedExports = modAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n let foundHandleError = false;\n\n namedExports.forEach((modExport) => {\n const declaration = modExport.declaration;\n if (!declaration) {\n return;\n }\n if (declaration.type === 'FunctionDeclaration') {\n if (!declaration.id || declaration.id.name !== 'handleError') {\n return;\n }\n foundHandleError = true;\n const userCode = generateCode(declaration).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handleError = builders.raw(\n `Sentry.handleErrorWithSentry(${userCode.replace(\n 'handleError',\n '_handleError',\n )})`,\n );\n // because magicast doesn't overwrite the original function export, we need to remove it manually\n modAst.body = modAst.body.filter((node) => node !== modExport);\n } else if (declaration.type === 'VariableDeclaration') {\n const declarations = declaration.declarations;\n declarations.forEach((declaration) => {\n // @ts-expect-error - id should always have a name in this case\n if (!declaration.id || declaration.id.name !== 'handleError') {\n return;\n }\n foundHandleError = true;\n const userCode = declaration.init;\n const stringifiedUserCode = userCode ? generateCode(userCode).code : '';\n // @ts-expect-error - we can just place a string here, magicast will convert it to a node\n declaration.init = `Sentry.handleErrorWithSentry(${stringifiedUserCode})`;\n });\n }\n });\n\n if (!foundHandleError) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handleError = builders.functionCall(\n 'Sentry.handleErrorWithSentry',\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction wrapHandle(mod: ProxifiedModule<any>): void {\n const modAst = mod.exports.$ast as Program;\n const namedExports = modAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n let foundHandle = false;\n\n namedExports.forEach((modExport) => {\n const declaration = modExport.declaration;\n if (!declaration) {\n return;\n }\n if (declaration.type === 'FunctionDeclaration') {\n if (!declaration.id || declaration.id.name !== 'handle') {\n return;\n }\n foundHandle = true;\n const userCode = generateCode(declaration).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handle = builders.raw(\n `sequence(Sentry.sentryHandle(), ${userCode.replace(\n 'handle',\n '_handle',\n )})`,\n );\n // because of an issue with magicast, we need to remove the original export\n modAst.body = modAst.body.filter((node) => node !== modExport);\n } else if (declaration.type === 'VariableDeclaration') {\n const declarations = declaration.declarations;\n declarations.forEach((declaration) => {\n if (\n !declaration.id ||\n declaration.id.type !== 'Identifier' ||\n (declaration.id.name && declaration.id.name !== 'handle')\n ) {\n return;\n }\n const userCode = declaration.init;\n const stringifiedUserCode = userCode ? generateCode(userCode).code : '';\n // @ts-expect-error - we can just place a string here, magicast will convert it to a node\n declaration.init = `sequence(Sentry.sentryHandle(), ${stringifiedUserCode})`;\n foundHandle = true;\n });\n }\n });\n\n if (!foundHandle) {\n // can't use builders.functionCall here because it doesn't yet\n // support member expressions (Sentry.sentryHandle()) in args\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handle = builders.raw('sequence(Sentry.sentryHandle())');\n }\n\n try {\n mod.imports.$add({\n from: '@sveltejs/kit/hooks',\n imported: 'sequence',\n local: 'sequence',\n });\n } catch (_) {\n // It's possible sequence is already imported. in this case, magicast throws but that's fine.\n }\n}\n\n/**\n * We want to insert the init call on top of the file but after all import statements\n */\nfunction getInitCallInsertionIndex(originalModAST: Program): number {\n // We need to deep-copy here because reverse mutates in place\n const copiedBodyNodes = [...originalModAST.body];\n const lastImportDeclaration = copiedBodyNodes\n .reverse()\n .find((node) => node.type === 'ImportDeclaration');\n\n const initCallInsertionIndex = lastImportDeclaration\n ? originalModAST.body.indexOf(lastImportDeclaration) + 1\n : 0;\n return initCallInsertionIndex;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/sveltekit/sdk-setup/setup.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExportNamedDeclaration, Program } from '@babel/types';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\n\nimport * as Sentry from '@sentry/node';\n\n//@ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport type { ProxifiedModule } from 'magicast';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, loadFile } from 'magicast';\nimport {\n getClientHooksTemplate,\n getInstrumentationServerTemplate,\n getServerHooksTemplate,\n} from '../templates';\nimport {\n featureSelectionPrompt,\n isUsingTypeScript,\n showCopyPasteInstructions,\n} from '../../utils/clack';\nimport { findFile, hasSentryContent } from '../../utils/ast-utils';\n\nimport * as recast from 'recast';\nimport x = recast.types;\nimport t = x.namedTypes;\nimport {\n enableTracingAndInstrumentation,\n type PartialBackwardsForwardsCompatibleSvelteConfig,\n} from './svelte-config';\nimport { ProjectInfo } from './types';\nimport { modifyViteConfig } from './vite';\nimport { modifyAndRecordFail } from './utils';\nimport { debug } from '../../utils/debug';\n\nexport async function createOrMergeSvelteKitFiles(\n projectInfo: ProjectInfo,\n svelteConfig: PartialBackwardsForwardsCompatibleSvelteConfig,\n setupForSvelteKitTracing: boolean,\n): Promise<void> {\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n {\n id: 'logs',\n prompt: `Do you want to enable ${chalk.bold(\n 'Logs',\n )} to send your application logs to Sentry?`,\n enabledHint: 'recommended',\n },\n ] as const);\n\n const { clientHooksPath, serverHooksPath } = getHooksConfigDirs(svelteConfig);\n\n // full file paths with correct file ending (or undefined if not found)\n const originalClientHooksFile = findFile(clientHooksPath);\n const originalServerHooksFile = findFile(serverHooksPath);\n const originalInstrumentationServerFile = findFile(\n path.resolve(process.cwd(), 'src', 'instrumentation.server'),\n );\n\n const viteConfig = findFile(path.resolve(process.cwd(), 'vite.config'));\n\n const fileEnding = isUsingTypeScript() ? 'ts' : 'js';\n\n const { dsn } = projectInfo;\n\n if (setupForSvelteKitTracing) {\n await enableTracingAndInstrumentation(\n svelteConfig,\n selectedFeatures.performance,\n );\n\n try {\n if (!originalInstrumentationServerFile) {\n await createNewInstrumentationServerFile(dsn, selectedFeatures);\n } else {\n await mergeInstrumentationServerFile(\n originalInstrumentationServerFile,\n dsn,\n selectedFeatures,\n );\n }\n } catch (e) {\n clack.log.warn(\n `Failed to automatically set up ${chalk.cyan(\n `instrumentation.server.${\n fileEnding ?? isUsingTypeScript() ? 'ts' : 'js'\n }`,\n )}.`,\n );\n debug(e);\n\n await showCopyPasteInstructions({\n codeSnippet: getInstrumentationServerTemplate(dsn, selectedFeatures),\n filename: `instrumentation.server.${\n fileEnding ?? isUsingTypeScript() ? 'ts' : 'js'\n }`,\n });\n\n Sentry.setTag('created-instrumentation-server', 'fail');\n }\n }\n\n Sentry.setTag(\n 'server-hooks-file-strategy',\n originalServerHooksFile ? 'merge' : 'create',\n );\n\n if (!originalServerHooksFile) {\n await createNewHooksFile(\n `${serverHooksPath}.${fileEnding}`,\n 'server',\n dsn,\n selectedFeatures,\n !setupForSvelteKitTracing,\n );\n } else {\n await mergeHooksFile(\n originalServerHooksFile,\n 'server',\n dsn,\n selectedFeatures,\n !setupForSvelteKitTracing,\n );\n }\n\n Sentry.setTag(\n 'client-hooks-file-strategy',\n originalClientHooksFile ? 'merge' : 'create',\n );\n if (!originalClientHooksFile) {\n await createNewHooksFile(\n `${clientHooksPath}.${fileEnding}`,\n 'client',\n dsn,\n selectedFeatures,\n true,\n );\n } else {\n await mergeHooksFile(\n originalClientHooksFile,\n 'client',\n dsn,\n selectedFeatures,\n true,\n );\n }\n\n if (viteConfig) {\n await modifyViteConfig(viteConfig, projectInfo);\n }\n}\n\n/**\n * Attempts to read the svelte.config.js file to find the location of the hooks files.\n * If users specified a custom location, we'll use that. Otherwise, we'll use the default.\n */\nfunction getHooksConfigDirs(\n svelteConfig: PartialBackwardsForwardsCompatibleSvelteConfig,\n): {\n clientHooksPath: string;\n serverHooksPath: string;\n} {\n const relativeUserClientHooksPath = svelteConfig?.kit?.files?.hooks?.client;\n const relativeUserServerHooksPath = svelteConfig?.kit?.files?.hooks?.server;\n const userClientHooksPath =\n relativeUserClientHooksPath &&\n path.resolve(process.cwd(), relativeUserClientHooksPath);\n const userServerHooksPath =\n relativeUserServerHooksPath &&\n path.resolve(process.cwd(), relativeUserServerHooksPath);\n\n const defaulHooksDir = path.resolve(process.cwd(), 'src');\n const defaultClientHooksPath = path.resolve(defaulHooksDir, 'hooks.client'); // file ending missing on purpose\n const defaultServerHooksPath = path.resolve(defaulHooksDir, 'hooks.server'); // same here\n\n return {\n clientHooksPath: userClientHooksPath || defaultClientHooksPath,\n serverHooksPath: userServerHooksPath || defaultServerHooksPath,\n };\n}\n\n/**\n * Reads the template, replaces the dsn placeholder with the actual dsn and writes the file to @param hooksFileDest\n */\nasync function createNewHooksFile(\n hooksFileDest: string,\n hooktype: 'client' | 'server',\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n setupForSvelteKitTracing: boolean,\n): Promise<void> {\n const filledTemplate =\n hooktype === 'client'\n ? getClientHooksTemplate(dsn, selectedFeatures)\n : getServerHooksTemplate(dsn, selectedFeatures, setupForSvelteKitTracing);\n\n await fs.promises.mkdir(path.dirname(hooksFileDest), { recursive: true });\n await fs.promises.writeFile(hooksFileDest, filledTemplate);\n\n clack.log.success(`Created ${hooksFileDest}`);\n Sentry.setTag(`created-${hooktype}-hooks`, 'success');\n}\n\nasync function createNewInstrumentationServerFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n logs: boolean;\n },\n): Promise<void> {\n const filledTemplate = getInstrumentationServerTemplate(\n dsn,\n selectedFeatures,\n );\n\n const fileEnding = isUsingTypeScript() ? 'ts' : 'js';\n\n const instrumentationServerFile = path.resolve(\n process.cwd(),\n 'src',\n `instrumentation.server.${fileEnding}`,\n );\n\n await fs.promises.mkdir(path.dirname(instrumentationServerFile), {\n recursive: true,\n });\n\n await fs.promises.writeFile(instrumentationServerFile, filledTemplate);\n\n clack.log.success(\n `Created ${chalk.cyan(path.basename(instrumentationServerFile))}`,\n );\n Sentry.setTag('created-instrumentation-server', 'success');\n}\n\n/**\n * Merges the users' hooks file with Sentry-related code.\n *\n * Both hooks:\n * - add import * as Sentry\n * - add Sentry.init\n * - add handleError hook wrapper\n *\n * Additionally in Server hook:\n * - add handle hook handler\n */\nasync function mergeHooksFile(\n hooksFile: string,\n hookType: 'client' | 'server',\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n includeSentryInit: boolean,\n): Promise<void> {\n const originalHooksMod = await loadFile(hooksFile);\n\n const file: 'server-hooks' | 'client-hooks' = `${hookType}-hooks`;\n\n if (hasSentryContent(originalHooksMod.$ast as t.Program)) {\n // We don't want to mess with files that already have Sentry content.\n // Let's just bail out at this point.\n clack.log.warn(\n `File ${chalk.cyan(\n path.basename(hooksFile),\n )} already contains Sentry code.\nSkipping adding Sentry functionality to.`,\n );\n Sentry.setTag(`modified-${file}`, 'fail');\n Sentry.setTag(`${file}-fail-reason`, 'has-sentry-content');\n return;\n }\n\n await modifyAndRecordFail(\n () =>\n originalHooksMod.imports.$add({\n from: '@sentry/sveltekit',\n imported: '*',\n local: 'Sentry',\n }),\n 'import-injection',\n file,\n );\n\n if (hookType === 'client' || includeSentryInit) {\n await modifyAndRecordFail(\n () => {\n if (hookType === 'client') {\n insertClientInitCall(dsn, originalHooksMod, selectedFeatures);\n } else {\n insertServerInitCall(dsn, originalHooksMod, selectedFeatures);\n }\n },\n 'init-call-injection',\n file,\n );\n }\n\n await modifyAndRecordFail(\n () => wrapHandleError(originalHooksMod),\n 'wrap-handle-error',\n file,\n );\n\n if (hookType === 'server') {\n await modifyAndRecordFail(\n () => wrapHandle(originalHooksMod),\n 'wrap-handle',\n 'server-hooks',\n );\n }\n\n await modifyAndRecordFail(\n async () => {\n const modifiedCode = originalHooksMod.generate().code;\n await fs.promises.writeFile(hooksFile, modifiedCode);\n },\n 'write-file',\n file,\n );\n\n clack.log.success(`Added Sentry code to ${hooksFile}`);\n Sentry.setTag(`modified-${hookType}-hooks`, 'success');\n}\n\n/**\n * Merges the users' instrumentation.server file with Sentry-related code.\n *\n * Both hooks:\n * - add import * as Sentry\n * - add Sentry.init\n * - add handleError hook wrapper\n *\n * Additionally in Server hook:\n * - add handle hook handler\n */\nasync function mergeInstrumentationServerFile(\n instrumentationServerFilePath: string,\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n): Promise<void> {\n const originalInstrumentationServerMod = await loadFile(\n instrumentationServerFilePath,\n );\n const filename = path.basename(instrumentationServerFilePath);\n\n if (hasSentryContent(originalInstrumentationServerMod.$ast as t.Program)) {\n // We don't want to mess with files that already have Sentry content.\n // Let's just bail out at this point.\n clack.log.warn(\n `File ${chalk.cyan(filename)} already contains Sentry code.\nSkipping adding Sentry functionality to it.`,\n );\n Sentry.setTag(`modified-instrumentation-server`, 'fail');\n Sentry.setTag(`instrumentation-server-fail-reason`, 'has-sentry-content');\n return;\n }\n\n await modifyAndRecordFail(\n () =>\n originalInstrumentationServerMod.imports.$add({\n from: '@sentry/sveltekit',\n imported: '*',\n local: 'Sentry',\n }),\n 'import-injection',\n 'instrumentation-server',\n );\n\n await modifyAndRecordFail(\n () => {\n insertServerInitCall(\n dsn,\n originalInstrumentationServerMod,\n selectedFeatures,\n );\n },\n 'init-call-injection',\n 'instrumentation-server',\n );\n\n await modifyAndRecordFail(\n async () => {\n const modifiedCode = originalInstrumentationServerMod.generate().code;\n await fs.promises.writeFile(instrumentationServerFilePath, modifiedCode);\n },\n 'write-file',\n 'instrumentation-server',\n );\n\n clack.log.success(`Added Sentry.init code to ${chalk.cyan(filename)}`);\n Sentry.setTag(`modified-instrumentation-server`, 'success');\n}\n\nexport function insertClientInitCall(\n dsn: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalHooksMod: ProxifiedModule<any>,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n): void {\n const initCallComment = `\n // If you don't want to use Session Replay, remove the \\`Replay\\` integration,\n // \\`replaysSessionSampleRate\\` and \\`replaysOnErrorSampleRate\\` options.`;\n\n const initArgs: {\n dsn: string;\n tracesSampleRate?: number;\n replaysSessionSampleRate?: number;\n replaysOnErrorSampleRate?: number;\n integrations?: string[];\n enableLogs?: boolean;\n sendDefaultPii?: boolean;\n } = {\n dsn,\n };\n\n if (selectedFeatures.performance) {\n initArgs.tracesSampleRate = 1.0;\n }\n\n if (selectedFeatures.replay) {\n initArgs.replaysSessionSampleRate = 0.1;\n initArgs.replaysOnErrorSampleRate = 1.0;\n initArgs.integrations = [builders.functionCall('Sentry.replayIntegration')];\n }\n\n if (selectedFeatures.logs) {\n initArgs.enableLogs = true;\n }\n\n initArgs.sendDefaultPii = true;\n\n // This assignment of any values is fine because we're just creating a function call in magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCall = builders.functionCall('Sentry.init', initArgs);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCallWithComment = builders.raw(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n `${initCallComment}\\n${generateCode(initCall).code}`,\n );\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n\n const initCallInsertionIndex = getInitCallInsertionIndex(originalHooksModAST);\n\n originalHooksModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCallWithComment).code,\n );\n}\n\nfunction insertServerInitCall(\n dsn: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalMod: ProxifiedModule<any>,\n selectedFeatures: {\n performance: boolean;\n logs: boolean;\n },\n): void {\n const initArgs: {\n dsn: string;\n tracesSampleRate?: number;\n enableLogs?: boolean;\n sendDefaultPii?: boolean;\n } = {\n dsn,\n };\n\n if (selectedFeatures.performance) {\n initArgs.tracesSampleRate = 1.0;\n }\n\n if (selectedFeatures.logs) {\n initArgs.enableLogs = true;\n }\n\n initArgs.sendDefaultPii = true;\n\n // This assignment of any values is fine because we're just creating a function call in magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const initCall = builders.functionCall('Sentry.init', initArgs);\n\n const originalModAST = originalMod.$ast as Program;\n\n const initCallInsertionIndex = getInitCallInsertionIndex(originalModAST);\n\n originalModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction wrapHandleError(mod: ProxifiedModule<any>): void {\n const modAst = mod.exports.$ast as Program;\n const namedExports = modAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n let foundHandleError = false;\n\n namedExports.forEach((modExport) => {\n const declaration = modExport.declaration;\n if (!declaration) {\n return;\n }\n if (declaration.type === 'FunctionDeclaration') {\n if (!declaration.id || declaration.id.name !== 'handleError') {\n return;\n }\n foundHandleError = true;\n const userCode = generateCode(declaration).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handleError = builders.raw(\n `Sentry.handleErrorWithSentry(${userCode.replace(\n 'handleError',\n '_handleError',\n )})`,\n );\n // because magicast doesn't overwrite the original function export, we need to remove it manually\n modAst.body = modAst.body.filter((node) => node !== modExport);\n } else if (declaration.type === 'VariableDeclaration') {\n const declarations = declaration.declarations;\n declarations.forEach((declaration) => {\n // @ts-expect-error - id should always have a name in this case\n if (!declaration.id || declaration.id.name !== 'handleError') {\n return;\n }\n foundHandleError = true;\n const userCode = declaration.init;\n const stringifiedUserCode = userCode ? generateCode(userCode).code : '';\n // @ts-expect-error - we can just place a string here, magicast will convert it to a node\n declaration.init = `Sentry.handleErrorWithSentry(${stringifiedUserCode})`;\n });\n }\n });\n\n if (!foundHandleError) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handleError = builders.functionCall(\n 'Sentry.handleErrorWithSentry',\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction wrapHandle(mod: ProxifiedModule<any>): void {\n const modAst = mod.exports.$ast as Program;\n const namedExports = modAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n let foundHandle = false;\n\n namedExports.forEach((modExport) => {\n const declaration = modExport.declaration;\n if (!declaration) {\n return;\n }\n if (declaration.type === 'FunctionDeclaration') {\n if (!declaration.id || declaration.id.name !== 'handle') {\n return;\n }\n foundHandle = true;\n const userCode = generateCode(declaration).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handle = builders.raw(\n `sequence(Sentry.sentryHandle(), ${userCode.replace(\n 'handle',\n '_handle',\n )})`,\n );\n // because of an issue with magicast, we need to remove the original export\n modAst.body = modAst.body.filter((node) => node !== modExport);\n } else if (declaration.type === 'VariableDeclaration') {\n const declarations = declaration.declarations;\n declarations.forEach((declaration) => {\n if (\n !declaration.id ||\n declaration.id.type !== 'Identifier' ||\n (declaration.id.name && declaration.id.name !== 'handle')\n ) {\n return;\n }\n const userCode = declaration.init;\n const stringifiedUserCode = userCode ? generateCode(userCode).code : '';\n // @ts-expect-error - we can just place a string here, magicast will convert it to a node\n declaration.init = `sequence(Sentry.sentryHandle(), ${stringifiedUserCode})`;\n foundHandle = true;\n });\n }\n });\n\n if (!foundHandle) {\n // can't use builders.functionCall here because it doesn't yet\n // support member expressions (Sentry.sentryHandle()) in args\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.handle = builders.raw('sequence(Sentry.sentryHandle())');\n }\n\n try {\n mod.imports.$add({\n from: '@sveltejs/kit/hooks',\n imported: 'sequence',\n local: 'sequence',\n });\n } catch (_) {\n // It's possible sequence is already imported. in this case, magicast throws but that's fine.\n }\n}\n\n/**\n * We want to insert the init call on top of the file but after all import statements\n */\nfunction getInitCallInsertionIndex(originalModAST: Program): number {\n // We need to deep-copy here because reverse mutates in place\n const copiedBodyNodes = [...originalModAST.body];\n const lastImportDeclaration = copiedBodyNodes\n .reverse()\n .find((node) => node.type === 'ImportDeclaration');\n\n const initCallInsertionIndex = lastImportDeclaration\n ? originalModAST.body.indexOf(lastImportDeclaration) + 1\n : 0;\n return initCallInsertionIndex;\n}\n"]}
|
|
@@ -29,6 +29,10 @@ ${selectedFeatures.replay
|
|
|
29
29
|
// If you don't want to use Session Replay, just remove the line below:
|
|
30
30
|
integrations: [replayIntegration()],`
|
|
31
31
|
: ''}
|
|
32
|
+
|
|
33
|
+
// Enable sending user PII (Personally Identifiable Information)
|
|
34
|
+
// https://docs.sentry.io/platforms/javascript/guides/sveltekit/configuration/options/#sendDefaultPii
|
|
35
|
+
sendDefaultPii: true,
|
|
32
36
|
});
|
|
33
37
|
|
|
34
38
|
// If you have a custom error handler, pass it to \`handleErrorWithSentry\`
|
|
@@ -52,6 +56,11 @@ ${selectedFeatures.logs
|
|
|
52
56
|
enableLogs: true,
|
|
53
57
|
`
|
|
54
58
|
: ''}
|
|
59
|
+
|
|
60
|
+
// Enable sending user PII (Personally Identifiable Information)
|
|
61
|
+
// https://docs.sentry.io/platforms/javascript/guides/sveltekit/configuration/options/#sendDefaultPii
|
|
62
|
+
sendDefaultPii: true,
|
|
63
|
+
|
|
55
64
|
// uncomment the line below to enable Spotlight (https://spotlightjs.com)
|
|
56
65
|
// spotlight: import.meta.env.DEV,
|
|
57
66
|
});`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/sveltekit/templates.ts"],"names":[],"mappings":";;;AAAA,SAAgB,sBAAsB,CACpC,GAAW,EACX,gBAIC;IAED,OAAO;;;;UAIC,GAAG;EAEX,gBAAgB,CAAC,WAAW;QAC1B,CAAC,CAAC;;CAEL;QACG,CAAC,CAAC,EACN;EAEE,gBAAgB,CAAC,IAAI;QACnB,CAAC,CAAC;;CAEL;QACG,CAAC,CAAC,EACN;EAEE,gBAAgB,CAAC,MAAM;QACrB,CAAC,CAAC;;;;;;;;;uCASiC;QACnC,CAAC,CAAC,EACN;;;;;CAKC,CAAC;AACF,CAAC;AA9CD,wDA8CC;AAED,SAAgB,sBAAsB,CACpC,GAAW,EACX,gBAIC,EACD,iBAA0B;IAE1B,MAAM,UAAU,GAAG,iBAAiB;QAClC,CAAC,CAAC;;;UAGI,GAAG;EAEX,gBAAgB,CAAC,WAAW;YAC1B,CAAC,CAAC;;CAEL;YACG,CAAC,CAAC,EACN;EAEE,gBAAgB,CAAC,IAAI;YACnB,CAAC,CAAC;;CAEL;YACG,CAAC,CAAC,EACN;;;IAGI;QACA,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;EAEP,UAAU;;;;;;;CAOX,CAAC;AACF,CAAC;AA3CD,wDA2CC;AAED,SAAgB,gCAAgC,CAC9C,GAAW,EACX,gBAGC;IAED,OAAO;;;UAGC,GAAG;EAEX,gBAAgB,CAAC,WAAW;QAC1B,CAAC,CAAC;;CAEL;QACG,CAAC,CAAC,EACN;EAEE,gBAAgB,CAAC,IAAI;QACnB,CAAC,CAAC;;CAEL;QACG,CAAC,CAAC,EACN;;;IAGI,CAAC;AACL,CAAC;AA5BD,4EA4BC;AAED;;GAEG;AACH,SAAgB,0BAA0B,CAAC,OAK1C;IACC,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU;QACvC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,iBAAiB,OAAO,CAAC,OAAO,oBAAoB,OAAO,CAAC,SAAS,EAAE;QACvF,CAAC,CAAC,WAAW,OAAO,CAAC,OAAO,8BAA8B,OAAO,CAAC,SAAS,EAAE,CAAC;IAEhF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iGAiDwF,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkK9G,CAAC;AACF,CAAC;AA9ND,gEA8NC;AAED,SAAgB,wBAAwB;IACtC,OAAO;;;;;;CAMR,CAAC;AACF,CAAC;AARD,4DAQC","sourcesContent":["export function getClientHooksTemplate(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n) {\n return `import { handleErrorWithSentry, replayIntegration } from \"@sentry/sveltekit\";\nimport * as Sentry from '@sentry/sveltekit';\n\nSentry.init({\n dsn: '${dsn}',\n${\n selectedFeatures.performance\n ? `\n tracesSampleRate: 1.0,\n`\n : ''\n}\n${\n selectedFeatures.logs\n ? ` // Enable logs to be sent to Sentry\n enableLogs: true,\n`\n : ''\n}\n${\n selectedFeatures.replay\n ? ` // This sets the sample rate to be 10%. You may want this to be 100% while\n // in development and sample at a lower rate in production\n replaysSessionSampleRate: 0.1,\n\n // If the entire session is not sampled, use the below sample rate to sample\n // sessions when an error occurs.\n replaysOnErrorSampleRate: 1.0,\n\n // If you don't want to use Session Replay, just remove the line below:\n integrations: [replayIntegration()],`\n : ''\n}\n});\n\n// If you have a custom error handler, pass it to \\`handleErrorWithSentry\\`\nexport const handleError = handleErrorWithSentry();\n`;\n}\n\nexport function getServerHooksTemplate(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n includeSentryInit: boolean,\n) {\n const sentryInit = includeSentryInit\n ? `import * as Sentry from '@sentry/sveltekit';\n\nSentry.init({\n dsn: '${dsn}',\n${\n selectedFeatures.performance\n ? `\n tracesSampleRate: 1.0,\n`\n : ''\n}\n${\n selectedFeatures.logs\n ? ` // Enable logs to be sent to Sentry\n enableLogs: true,\n`\n : ''\n}\n // uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // spotlight: import.meta.env.DEV,\n});`\n : ``;\n\n return `import { sequence } from \"@sveltejs/kit/hooks\";\nimport { handleErrorWithSentry, sentryHandle } from \"@sentry/sveltekit\";\n${sentryInit}\n\n// If you have custom handlers, make sure to place them after \\`sentryHandle()\\` in the \\`sequence\\` function.\nexport const handle = sequence(sentryHandle());\n\n// If you have a custom error handler, pass it to \\`handleErrorWithSentry\\`\nexport const handleError = handleErrorWithSentry();\n`;\n}\n\nexport function getInstrumentationServerTemplate(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n logs: boolean;\n },\n) {\n return `import * as Sentry from '@sentry/sveltekit';\n\nSentry.init({\n dsn: '${dsn}',\n${\n selectedFeatures.performance\n ? `\n tracesSampleRate: 1.0,\n`\n : ''\n}\n${\n selectedFeatures.logs\n ? ` // Enable logs to be sent to Sentry\n enableLogs: true,\n`\n : ''\n}\n // uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // spotlight: import.meta.env.DEV,\n});`;\n}\n\n/**\n * +page.svelte with Sentry example\n */\nexport function getSentryExampleSveltePage(options: {\n selfHosted: boolean;\n url: string;\n orgSlug: string;\n projectId: string;\n}) {\n const issuesPageLink = options.selfHosted\n ? `${options.url}organizations/${options.orgSlug}/issues/?project=${options.projectId}`\n : `https://${options.orgSlug}.sentry.io/issues/?project=${options.projectId}`;\n\n return `<!--\nThis is just a very simple page with a button to throw an example error.\nFeel free to delete this file and the entire sentry route.\n-->\n\n<script>\n import * as Sentry from '@sentry/sveltekit';\n import { onMount } from 'svelte';\n \n // Svelte Runes (requires Svelte 5)\n // let hasSentError = $state(false);\n let hasSentError = false;\n let isConnected = true;\n\n onMount(async () => {\n const result = await Sentry.diagnoseSdkConnectivity();\n isConnected = result !== 'sentry-unreachable';\n });\n\n function getSentryData() {\n Sentry.startSpan(\n {\n name: 'Example Frontend Span',\n op: 'test'\n },\n async () => {\n const res = await fetch('/sentry-example-page');\n if (!res.ok) {\n hasSentError = true;\n throw new Error('Sentry Example Frontend Error');\n }\n }\n );\n }\n</script>\n\n<title>sentry-example-page</title>\n\n<div>\n <main>\n <div class=\"flex-spacer\"></div>\n <svg height=\"40\" width=\"40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.85 2.995a3.698 3.698 0 0 1 1.353 1.354l16.303 28.278a3.703 3.703 0 0 1-1.354 5.053 3.694 3.694 0 0 1-1.848.496h-3.828a31.149 31.149 0 0 0 0-3.09h3.815a.61.61 0 0 0 .537-.917L20.523 5.893a.61.61 0 0 0-1.057 0l-3.739 6.494a28.948 28.948 0 0 1 9.63 10.453 28.988 28.988 0 0 1 3.499 13.78v1.542h-9.852v-1.544a19.106 19.106 0 0 0-2.182-8.85 19.08 19.08 0 0 0-6.032-6.829l-1.85 3.208a15.377 15.377 0 0 1 6.382 12.484v1.542H3.696A3.694 3.694 0 0 1 0 34.473c0-.648.17-1.286.494-1.849l2.33-4.074a8.562 8.562 0 0 1 2.689 1.536L3.158 34.17a.611.611 0 0 0 .538.917h8.448a12.481 12.481 0 0 0-6.037-9.09l-1.344-.772 4.908-8.545 1.344.77a22.16 22.16 0 0 1 7.705 7.444 22.193 22.193 0 0 1 3.316 10.193h3.699a25.892 25.892 0 0 0-3.811-12.033 25.856 25.856 0 0 0-9.046-8.796l-1.344-.772 5.269-9.136a3.698 3.698 0 0 1 3.2-1.849c.648 0 1.285.17 1.847.495Z\" fill=\"currentcolor\"/>\n </svg>\n <h1>\n sentry-example-page\n </h1>\n\n <p class=\"description\">\n Click the button below, and view the sample error on the Sentry <a target=\"_blank\" href=\"${issuesPageLink}\">Issues Page</a>. \n For more details about setting up Sentry, <a target=\"_blank\" href=\"https://docs.sentry.io/platforms/javascript/guides/sveltekit/\">read our docs</a>.\n </p>\n\n <button\n type=\"button\"\n onclick={getSentryData}\n disabled={!isConnected}\n >\n <span>\n Throw Sample Error\n </span>\n </button>\n\n {#if hasSentError}\n <p class=\"success\">\n Sample error was sent to Sentry.\n </p>\n {:else if !isConnected}\n <div class=\"connectivity-error\">\n <p>It looks like network requests to Sentry are being blocked, which will prevent errors from being captured. Try disabling your ad-blocker to complete the test.</p>\n </div>\n {:else}\n <div class=\"success_placeholder\"></div>\n {/if}\n <div class=\"flex-spacer\"></div>\n </main>\n</div>\n\n<style>\n :global(body) {\n margin: 0;\n\n @media (prefers-color-scheme: dark) {\n color: #ededed;\n background-color: #0a0a0a;\n }\n }\n\n main {\n display: flex;\n min-height: 100vh;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n box-sizing: border-box;\n gap: 16px;\n margin: 0;\n padding: 16px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", sans-serif;\n }\n\n h1 {\n padding: 0px 4px;\n border-radius: 4px;\n background-color: rgba(24, 20, 35, 0.03);\n font-family: monospace;\n font-size: 20px;\n line-height: 1.2;\n }\n\n p {\n margin: 0;\n font-size: 20px;\n }\n\n a {\n color: #6341F0;\n text-decoration: underline;\n cursor: pointer;\n\n @media (prefers-color-scheme: dark) {\n color: #B3A1FF;\n }\n }\n\n button {\n border-radius: 8px;\n color: white;\n cursor: pointer;\n background-color: #553DB8;\n border: none;\n padding: 0;\n margin-top: 4px;\n\n & > span {\n display: inline-block;\n padding: 12px 16px;\n border-radius: inherit;\n font-size: 20px;\n font-weight: bold;\n line-height: 1;\n background-color: #7553FF;\n border: 1px solid #553DB8;\n transform: translateY(-4px);\n }\n\n &:hover > span {\n transform: translateY(-8px);\n }\n\n &:active > span {\n transform: translateY(0);\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n\n & > span {\n transform: translateY(0);\n border: none;\n }\n }\n }\n\n .description {\n text-align: center;\n color: #6E6C75;\n max-width: 500px;\n line-height: 1.5;\n font-size: 20px;\n\n @media (prefers-color-scheme: dark) {\n color: #A49FB5;\n }\n }\n\n .flex-spacer {\n flex: 1;\n }\n\n .success {\n padding: 12px 16px;\n border-radius: 8px;\n font-size: 20px;\n line-height: 1;\n background-color: #00F261;\n border: 1px solid #00BF4D;\n color: #181423;\n }\n\n .success_placeholder {\n height: 46px;\n }\n\n .connectivity-error {\n padding: 12px 16px;\n background-color: #E50045;\n border-radius: 8px;\n width: 500px;\n color: #FFFFFF;\n border: 1px solid #A80033;\n text-align: center;\n margin: 0;\n }\n \n .connectivity-error a {\n color: #FFFFFF;\n text-decoration: underline;\n }\n</style>\n`;\n}\n\nexport function getSentryExampleApiRoute() {\n return `// This is just a very simple API route that throws an example error.\n// Feel free to delete this file and the entire sentry route.\n\nexport const GET = async () => {\n throw new Error(\"Sentry Example API Route Error\");\n};\n`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/sveltekit/templates.ts"],"names":[],"mappings":";;;AAAA,SAAgB,sBAAsB,CACpC,GAAW,EACX,gBAIC;IAED,OAAO;;;;UAIC,GAAG;EAEX,gBAAgB,CAAC,WAAW;QAC1B,CAAC,CAAC;;CAEL;QACG,CAAC,CAAC,EACN;EAEE,gBAAgB,CAAC,IAAI;QACnB,CAAC,CAAC;;CAEL;QACG,CAAC,CAAC,EACN;EAEE,gBAAgB,CAAC,MAAM;QACrB,CAAC,CAAC;;;;;;;;;uCASiC;QACnC,CAAC,CAAC,EACN;;;;;;;;;CASC,CAAC;AACF,CAAC;AAlDD,wDAkDC;AAED,SAAgB,sBAAsB,CACpC,GAAW,EACX,gBAIC,EACD,iBAA0B;IAE1B,MAAM,UAAU,GAAG,iBAAiB;QAClC,CAAC,CAAC;;;UAGI,GAAG;EAEX,gBAAgB,CAAC,WAAW;YAC1B,CAAC,CAAC;;CAEL;YACG,CAAC,CAAC,EACN;EAEE,gBAAgB,CAAC,IAAI;YACnB,CAAC,CAAC;;CAEL;YACG,CAAC,CAAC,EACN;;;;;;;;IAQI;QACA,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;EAEP,UAAU;;;;;;;CAOX,CAAC;AACF,CAAC;AAhDD,wDAgDC;AAED,SAAgB,gCAAgC,CAC9C,GAAW,EACX,gBAGC;IAED,OAAO;;;UAGC,GAAG;EAEX,gBAAgB,CAAC,WAAW;QAC1B,CAAC,CAAC;;CAEL;QACG,CAAC,CAAC,EACN;EAEE,gBAAgB,CAAC,IAAI;QACnB,CAAC,CAAC;;CAEL;QACG,CAAC,CAAC,EACN;;;IAGI,CAAC;AACL,CAAC;AA5BD,4EA4BC;AAED;;GAEG;AACH,SAAgB,0BAA0B,CAAC,OAK1C;IACC,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU;QACvC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,iBAAiB,OAAO,CAAC,OAAO,oBAAoB,OAAO,CAAC,SAAS,EAAE;QACvF,CAAC,CAAC,WAAW,OAAO,CAAC,OAAO,8BAA8B,OAAO,CAAC,SAAS,EAAE,CAAC;IAEhF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iGAiDwF,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkK9G,CAAC;AACF,CAAC;AA9ND,gEA8NC;AAED,SAAgB,wBAAwB;IACtC,OAAO;;;;;;CAMR,CAAC;AACF,CAAC;AARD,4DAQC","sourcesContent":["export function getClientHooksTemplate(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n) {\n return `import { handleErrorWithSentry, replayIntegration } from \"@sentry/sveltekit\";\nimport * as Sentry from '@sentry/sveltekit';\n\nSentry.init({\n dsn: '${dsn}',\n${\n selectedFeatures.performance\n ? `\n tracesSampleRate: 1.0,\n`\n : ''\n}\n${\n selectedFeatures.logs\n ? ` // Enable logs to be sent to Sentry\n enableLogs: true,\n`\n : ''\n}\n${\n selectedFeatures.replay\n ? ` // This sets the sample rate to be 10%. You may want this to be 100% while\n // in development and sample at a lower rate in production\n replaysSessionSampleRate: 0.1,\n\n // If the entire session is not sampled, use the below sample rate to sample\n // sessions when an error occurs.\n replaysOnErrorSampleRate: 1.0,\n\n // If you don't want to use Session Replay, just remove the line below:\n integrations: [replayIntegration()],`\n : ''\n}\n\n // Enable sending user PII (Personally Identifiable Information)\n // https://docs.sentry.io/platforms/javascript/guides/sveltekit/configuration/options/#sendDefaultPii\n sendDefaultPii: true,\n});\n\n// If you have a custom error handler, pass it to \\`handleErrorWithSentry\\`\nexport const handleError = handleErrorWithSentry();\n`;\n}\n\nexport function getServerHooksTemplate(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n logs: boolean;\n },\n includeSentryInit: boolean,\n) {\n const sentryInit = includeSentryInit\n ? `import * as Sentry from '@sentry/sveltekit';\n\nSentry.init({\n dsn: '${dsn}',\n${\n selectedFeatures.performance\n ? `\n tracesSampleRate: 1.0,\n`\n : ''\n}\n${\n selectedFeatures.logs\n ? ` // Enable logs to be sent to Sentry\n enableLogs: true,\n`\n : ''\n}\n\n // Enable sending user PII (Personally Identifiable Information)\n // https://docs.sentry.io/platforms/javascript/guides/sveltekit/configuration/options/#sendDefaultPii\n sendDefaultPii: true,\n\n // uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // spotlight: import.meta.env.DEV,\n});`\n : ``;\n\n return `import { sequence } from \"@sveltejs/kit/hooks\";\nimport { handleErrorWithSentry, sentryHandle } from \"@sentry/sveltekit\";\n${sentryInit}\n\n// If you have custom handlers, make sure to place them after \\`sentryHandle()\\` in the \\`sequence\\` function.\nexport const handle = sequence(sentryHandle());\n\n// If you have a custom error handler, pass it to \\`handleErrorWithSentry\\`\nexport const handleError = handleErrorWithSentry();\n`;\n}\n\nexport function getInstrumentationServerTemplate(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n logs: boolean;\n },\n) {\n return `import * as Sentry from '@sentry/sveltekit';\n\nSentry.init({\n dsn: '${dsn}',\n${\n selectedFeatures.performance\n ? `\n tracesSampleRate: 1.0,\n`\n : ''\n}\n${\n selectedFeatures.logs\n ? ` // Enable logs to be sent to Sentry\n enableLogs: true,\n`\n : ''\n}\n // uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // spotlight: import.meta.env.DEV,\n});`;\n}\n\n/**\n * +page.svelte with Sentry example\n */\nexport function getSentryExampleSveltePage(options: {\n selfHosted: boolean;\n url: string;\n orgSlug: string;\n projectId: string;\n}) {\n const issuesPageLink = options.selfHosted\n ? `${options.url}organizations/${options.orgSlug}/issues/?project=${options.projectId}`\n : `https://${options.orgSlug}.sentry.io/issues/?project=${options.projectId}`;\n\n return `<!--\nThis is just a very simple page with a button to throw an example error.\nFeel free to delete this file and the entire sentry route.\n-->\n\n<script>\n import * as Sentry from '@sentry/sveltekit';\n import { onMount } from 'svelte';\n \n // Svelte Runes (requires Svelte 5)\n // let hasSentError = $state(false);\n let hasSentError = false;\n let isConnected = true;\n\n onMount(async () => {\n const result = await Sentry.diagnoseSdkConnectivity();\n isConnected = result !== 'sentry-unreachable';\n });\n\n function getSentryData() {\n Sentry.startSpan(\n {\n name: 'Example Frontend Span',\n op: 'test'\n },\n async () => {\n const res = await fetch('/sentry-example-page');\n if (!res.ok) {\n hasSentError = true;\n throw new Error('Sentry Example Frontend Error');\n }\n }\n );\n }\n</script>\n\n<title>sentry-example-page</title>\n\n<div>\n <main>\n <div class=\"flex-spacer\"></div>\n <svg height=\"40\" width=\"40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.85 2.995a3.698 3.698 0 0 1 1.353 1.354l16.303 28.278a3.703 3.703 0 0 1-1.354 5.053 3.694 3.694 0 0 1-1.848.496h-3.828a31.149 31.149 0 0 0 0-3.09h3.815a.61.61 0 0 0 .537-.917L20.523 5.893a.61.61 0 0 0-1.057 0l-3.739 6.494a28.948 28.948 0 0 1 9.63 10.453 28.988 28.988 0 0 1 3.499 13.78v1.542h-9.852v-1.544a19.106 19.106 0 0 0-2.182-8.85 19.08 19.08 0 0 0-6.032-6.829l-1.85 3.208a15.377 15.377 0 0 1 6.382 12.484v1.542H3.696A3.694 3.694 0 0 1 0 34.473c0-.648.17-1.286.494-1.849l2.33-4.074a8.562 8.562 0 0 1 2.689 1.536L3.158 34.17a.611.611 0 0 0 .538.917h8.448a12.481 12.481 0 0 0-6.037-9.09l-1.344-.772 4.908-8.545 1.344.77a22.16 22.16 0 0 1 7.705 7.444 22.193 22.193 0 0 1 3.316 10.193h3.699a25.892 25.892 0 0 0-3.811-12.033 25.856 25.856 0 0 0-9.046-8.796l-1.344-.772 5.269-9.136a3.698 3.698 0 0 1 3.2-1.849c.648 0 1.285.17 1.847.495Z\" fill=\"currentcolor\"/>\n </svg>\n <h1>\n sentry-example-page\n </h1>\n\n <p class=\"description\">\n Click the button below, and view the sample error on the Sentry <a target=\"_blank\" href=\"${issuesPageLink}\">Issues Page</a>. \n For more details about setting up Sentry, <a target=\"_blank\" href=\"https://docs.sentry.io/platforms/javascript/guides/sveltekit/\">read our docs</a>.\n </p>\n\n <button\n type=\"button\"\n onclick={getSentryData}\n disabled={!isConnected}\n >\n <span>\n Throw Sample Error\n </span>\n </button>\n\n {#if hasSentError}\n <p class=\"success\">\n Sample error was sent to Sentry.\n </p>\n {:else if !isConnected}\n <div class=\"connectivity-error\">\n <p>It looks like network requests to Sentry are being blocked, which will prevent errors from being captured. Try disabling your ad-blocker to complete the test.</p>\n </div>\n {:else}\n <div class=\"success_placeholder\"></div>\n {/if}\n <div class=\"flex-spacer\"></div>\n </main>\n</div>\n\n<style>\n :global(body) {\n margin: 0;\n\n @media (prefers-color-scheme: dark) {\n color: #ededed;\n background-color: #0a0a0a;\n }\n }\n\n main {\n display: flex;\n min-height: 100vh;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n box-sizing: border-box;\n gap: 16px;\n margin: 0;\n padding: 16px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", sans-serif;\n }\n\n h1 {\n padding: 0px 4px;\n border-radius: 4px;\n background-color: rgba(24, 20, 35, 0.03);\n font-family: monospace;\n font-size: 20px;\n line-height: 1.2;\n }\n\n p {\n margin: 0;\n font-size: 20px;\n }\n\n a {\n color: #6341F0;\n text-decoration: underline;\n cursor: pointer;\n\n @media (prefers-color-scheme: dark) {\n color: #B3A1FF;\n }\n }\n\n button {\n border-radius: 8px;\n color: white;\n cursor: pointer;\n background-color: #553DB8;\n border: none;\n padding: 0;\n margin-top: 4px;\n\n & > span {\n display: inline-block;\n padding: 12px 16px;\n border-radius: inherit;\n font-size: 20px;\n font-weight: bold;\n line-height: 1;\n background-color: #7553FF;\n border: 1px solid #553DB8;\n transform: translateY(-4px);\n }\n\n &:hover > span {\n transform: translateY(-8px);\n }\n\n &:active > span {\n transform: translateY(0);\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n\n & > span {\n transform: translateY(0);\n border: none;\n }\n }\n }\n\n .description {\n text-align: center;\n color: #6E6C75;\n max-width: 500px;\n line-height: 1.5;\n font-size: 20px;\n\n @media (prefers-color-scheme: dark) {\n color: #A49FB5;\n }\n }\n\n .flex-spacer {\n flex: 1;\n }\n\n .success {\n padding: 12px 16px;\n border-radius: 8px;\n font-size: 20px;\n line-height: 1;\n background-color: #00F261;\n border: 1px solid #00BF4D;\n color: #181423;\n }\n\n .success_placeholder {\n height: 46px;\n }\n\n .connectivity-error {\n padding: 12px 16px;\n background-color: #E50045;\n border-radius: 8px;\n width: 500px;\n color: #FFFFFF;\n border: 1px solid #A80033;\n text-align: center;\n margin: 0;\n }\n \n .connectivity-error a {\n color: #FFFFFF;\n text-decoration: underline;\n }\n</style>\n`;\n}\n\nexport function getSentryExampleApiRoute() {\n return `// This is just a very simple API route that throws an example error.\n// Feel free to delete this file and the entire sentry route.\n\nexport const GET = async () => {\n throw new Error(\"Sentry Example API Route Error\");\n};\n`;\n}\n"]}
|
|
@@ -1019,8 +1019,9 @@ async function createNewConfigFile(filepath, codeSnippet, moreInformation) {
|
|
|
1019
1019
|
exports.createNewConfigFile = createNewConfigFile;
|
|
1020
1020
|
async function askShouldCreateExamplePage(customRoute) {
|
|
1021
1021
|
const route = chalk_1.default.cyan(customRoute ?? '/sentry-example-page');
|
|
1022
|
-
|
|
1022
|
+
const createExamplePage = await (0, telemetry_1.traceStep)('ask-create-example-page', () => abortIfCancelled(clack.select({
|
|
1023
1023
|
message: `Do you want to create an example page ("${route}") to test your Sentry setup?`,
|
|
1024
|
+
initialValue: true,
|
|
1024
1025
|
options: [
|
|
1025
1026
|
{
|
|
1026
1027
|
value: true,
|
|
@@ -1030,6 +1031,8 @@ async function askShouldCreateExamplePage(customRoute) {
|
|
|
1030
1031
|
{ value: false, label: 'No' },
|
|
1031
1032
|
],
|
|
1032
1033
|
})));
|
|
1034
|
+
Sentry.setTag('create-example-page', createExamplePage);
|
|
1035
|
+
return createExamplePage;
|
|
1033
1036
|
}
|
|
1034
1037
|
exports.askShouldCreateExamplePage = askShouldCreateExamplePage;
|
|
1035
1038
|
async function askShouldCreateExampleComponent() {
|