@sentry/wizard 3.22.3 → 3.23.1

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.
Files changed (38) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/package.json +1 -1
  3. package/dist/src/apple/xcode-manager.js +5 -3
  4. package/dist/src/apple/xcode-manager.js.map +1 -1
  5. package/dist/src/nextjs/nextjs-wizard.js +3 -3
  6. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  7. package/dist/src/nextjs/templates.d.ts +3 -3
  8. package/dist/src/nextjs/templates.js +3 -3
  9. package/dist/src/nextjs/templates.js.map +1 -1
  10. package/dist/src/react-native/javascript.js +1 -1
  11. package/dist/src/react-native/javascript.js.map +1 -1
  12. package/dist/src/react-native/metro.d.ts +6 -1
  13. package/dist/src/react-native/metro.js +166 -17
  14. package/dist/src/react-native/metro.js.map +1 -1
  15. package/dist/src/react-native/react-native-wizard.d.ts +1 -0
  16. package/dist/src/react-native/react-native-wizard.js +19 -20
  17. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  18. package/dist/src/utils/ast-utils.d.ts +1 -1
  19. package/dist/src/utils/ast-utils.js +2 -2
  20. package/dist/src/utils/ast-utils.js.map +1 -1
  21. package/dist/test/nextjs/templates.test.d.ts +1 -0
  22. package/dist/test/nextjs/templates.test.js +38 -0
  23. package/dist/test/nextjs/templates.test.js.map +1 -0
  24. package/dist/test/react-native/javascript.test.js +1 -1
  25. package/dist/test/react-native/javascript.test.js.map +1 -1
  26. package/dist/test/react-native/metro.test.js +115 -0
  27. package/dist/test/react-native/metro.test.js.map +1 -1
  28. package/package.json +1 -1
  29. package/src/apple/xcode-manager.ts +9 -5
  30. package/src/nextjs/nextjs-wizard.ts +3 -3
  31. package/src/nextjs/templates.ts +7 -5
  32. package/src/react-native/javascript.ts +3 -0
  33. package/src/react-native/metro.ts +208 -18
  34. package/src/react-native/react-native-wizard.ts +24 -7
  35. package/src/utils/ast-utils.ts +2 -2
  36. package/test/nextjs/templates.test.ts +147 -0
  37. package/test/react-native/javascript.test.ts +3 -0
  38. package/test/react-native/metro.test.ts +113 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.23.1
4
+
5
+ - fix(nextjs): Replace `url` with `sentryUrl` in `withSentryConfig` options (#579)
6
+
7
+ ## 3.23.0
8
+
9
+ - feat(apple): Disable build script sandboxing (#574)
10
+ - feat(reactnative): Added comment to add spotlight in Sentry.init for React Native config (#548)
11
+ - feat(reactnative): Added `withSentryConfig` Metro patch (#575)
12
+
3
13
  ## 3.22.3
4
14
 
5
15
  - feat(nextjs): Make example page resilient to
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/wizard",
3
- "version": "3.22.3",
3
+ "version": "3.23.1",
4
4
  "homepage": "https://github.com/getsentry/sentry-wizard",
5
5
  "repository": "https://github.com/getsentry/sentry-wizard",
6
6
  "description": "Sentry wizard helping you to configure your project",
@@ -37,7 +37,7 @@ var fs = __importStar(require("fs"));
37
37
  var templates = __importStar(require("./templates"));
38
38
  var path = __importStar(require("path"));
39
39
  var xcode = require('xcode');
40
- function setDebugInformationFormat(proj, targetName) {
40
+ function setDebugInformationFormatAndSandbox(proj, targetName) {
41
41
  var xcObjects = proj.hash.project.objects;
42
42
  var targetKey = Object.keys(xcObjects.PBXNativeTarget || {}).filter(function (key) {
43
43
  return (!key.endsWith('_comment') &&
@@ -45,7 +45,9 @@ function setDebugInformationFormat(proj, targetName) {
45
45
  })[0];
46
46
  var target = xcObjects.PBXNativeTarget[targetKey];
47
47
  xcObjects.XCConfigurationList[target.buildConfigurationList].buildConfigurations.forEach(function (buildConfig) {
48
- xcObjects.XCBuildConfiguration[buildConfig.value].buildSettings.DEBUG_INFORMATION_FORMAT = '"dwarf-with-dsym"';
48
+ var buildSettings = xcObjects.XCBuildConfiguration[buildConfig.value].buildSettings;
49
+ buildSettings.DEBUG_INFORMATION_FORMAT = '"dwarf-with-dsym"';
50
+ buildSettings.ENABLE_USER_SCRIPT_SANDBOXING = '"NO"';
49
51
  });
50
52
  }
51
53
  function addSentrySPM(proj, targetName) {
@@ -178,7 +180,7 @@ var XcodeProject = /** @class */ (function () {
178
180
  if (uploadSource === void 0) { uploadSource = true; }
179
181
  addUploadSymbolsScript(this.project, sentryProject, target, uploadSource);
180
182
  if (uploadSource) {
181
- setDebugInformationFormat(this.project, target);
183
+ setDebugInformationFormatAndSandbox(this.project, target);
182
184
  }
183
185
  if (addSPMReference) {
184
186
  addSentrySPM(this.project, target);
@@ -1 +1 @@
1
- {"version":3,"file":"xcode-manager.js","sourceRoot":"","sources":["../../../src/apple/xcode-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport * as fs from 'fs';\nimport { SentryProjectData } from '../utils/types';\nimport * as templates from './templates';\nimport * as path from 'path';\nconst xcode = require('xcode');\n\ninterface ProjetFile {\n key: string;\n path: string;\n}\n\nfunction setDebugInformationFormat(proj: any, targetName: string): void {\n const xcObjects = proj.hash.project.objects;\n const targetKey: string = Object.keys(xcObjects.PBXNativeTarget || {}).filter(\n (key) => {\n return (\n !key.endsWith('_comment') &&\n xcObjects.PBXNativeTarget[key].name === targetName\n );\n },\n )[0];\n const target = xcObjects.PBXNativeTarget[targetKey];\n\n xcObjects.XCConfigurationList[\n target.buildConfigurationList\n ].buildConfigurations.forEach((buildConfig: { value: string }) => {\n xcObjects.XCBuildConfiguration[\n buildConfig.value\n ].buildSettings.DEBUG_INFORMATION_FORMAT = '\"dwarf-with-dsym\"';\n });\n}\n\nfunction addSentrySPM(proj: any, targetName: string): void {\n const xcObjects = proj.hash.project.objects;\n\n const sentryFrameworkUUID = proj.generateUuid() as string;\n const sentrySPMUUID = proj.generateUuid() as string;\n\n //Check whether xcObjects already have sentry framework\n if (xcObjects.PBXFrameworksBuildPhase) {\n for (const key in xcObjects.PBXFrameworksBuildPhase || {}) {\n if (!key.endsWith('_comment')) {\n const frameworks = xcObjects.PBXFrameworksBuildPhase[key].files;\n for (const framework of frameworks) {\n if (framework.comment === 'Sentry in Frameworks') {\n return;\n }\n }\n }\n }\n }\n\n xcObjects.PBXBuildFile[sentryFrameworkUUID] = {\n isa: 'PBXBuildFile',\n productRef: sentrySPMUUID,\n productRef_comment: 'Sentry',\n };\n xcObjects.PBXBuildFile[sentryFrameworkUUID + '_comment'] =\n 'Sentry in Frameworks';\n\n for (const key in xcObjects.PBXFrameworksBuildPhase || {}) {\n if (!key.endsWith('_comment')) {\n const frameworks = xcObjects.PBXFrameworksBuildPhase[key].files;\n frameworks.push({\n value: sentryFrameworkUUID,\n comment: 'Sentry in Frameworks',\n });\n }\n }\n\n const targetKey: string = Object.keys(xcObjects.PBXNativeTarget || {}).filter(\n (key) => {\n return (\n !key.endsWith('_comment') &&\n xcObjects.PBXNativeTarget[key].name === targetName\n );\n },\n )[0];\n const target = xcObjects.PBXNativeTarget[targetKey];\n\n if (!target.packageProductDependencies) {\n target.packageProductDependencies = [];\n }\n target.packageProductDependencies.push({\n value: sentrySPMUUID,\n comment: 'Sentry',\n });\n\n const sentrySwiftPackageUUID = proj.generateUuid() as string;\n const xcProject = proj.getFirstProject().firstProject;\n if (!xcProject.packageReferences) {\n xcProject.packageReferences = [];\n }\n xcProject.packageReferences.push({\n value: sentrySwiftPackageUUID,\n comment: 'XCRemoteSwiftPackageReference \"sentry-cocoa\"',\n });\n\n if (!xcObjects.XCRemoteSwiftPackageReference) {\n xcObjects.XCRemoteSwiftPackageReference = {};\n }\n\n xcObjects.XCRemoteSwiftPackageReference[sentrySwiftPackageUUID] = {\n isa: 'XCRemoteSwiftPackageReference',\n repositoryURL: '\"https://github.com/getsentry/sentry-cocoa/\"',\n requirement: {\n kind: 'upToNextMajorVersion',\n minimumVersion: '8.0.0',\n },\n };\n xcObjects.XCRemoteSwiftPackageReference[sentrySwiftPackageUUID + '_comment'] =\n 'XCRemoteSwiftPackageReference \"sentry-cocoa\"';\n\n if (!xcObjects.XCSwiftPackageProductDependency) {\n xcObjects.XCSwiftPackageProductDependency = {};\n }\n xcObjects.XCSwiftPackageProductDependency[sentrySPMUUID] = {\n isa: 'XCSwiftPackageProductDependency',\n package: sentrySwiftPackageUUID,\n package_comment: 'XCRemoteSwiftPackageReference \"sentry-cocoa\"',\n productName: 'Sentry',\n };\n xcObjects.XCSwiftPackageProductDependency[sentrySPMUUID + '_comment'] =\n 'Sentry';\n\n clack.log.step('Added Sentry SPM dependency to your project');\n}\n\nfunction addUploadSymbolsScript(\n xcodeProject: any,\n sentryProject: SentryProjectData,\n targetName: string,\n uploadSource = true,\n): void {\n const xcObjects = xcodeProject.hash.project.objects;\n const targetKey: string = Object.keys(xcObjects.PBXNativeTarget || {}).filter(\n (key) => {\n return (\n !key.endsWith('_comment') &&\n xcObjects.PBXNativeTarget[key].name === targetName\n );\n },\n )[0];\n\n for (const scriptKey in xcObjects.PBXShellScriptBuildPhase || {}) {\n if (!scriptKey.endsWith('_comment')) {\n const script = xcObjects.PBXShellScriptBuildPhase[scriptKey].shellScript;\n //Sentry script already exists, update it\n if (script.includes('sentry-cli')) {\n delete xcObjects.PBXShellScriptBuildPhase[scriptKey];\n delete xcObjects.PBXShellScriptBuildPhase[scriptKey + '_comment'];\n break;\n }\n }\n }\n\n xcodeProject.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Upload Debug Symbols to Sentry',\n targetKey,\n {\n inputFileListPaths: [],\n outputFileListPaths: [],\n inputPaths: [templates.scriptInputPath],\n shellPath: '/bin/sh',\n shellScript: templates.getRunScriptTemplate(\n sentryProject.organization.slug,\n sentryProject.slug,\n uploadSource,\n ),\n },\n );\n clack.log.step(`Added Sentry upload script to \"${targetName}\" build phase`);\n}\n\nexport class XcodeProject {\n projectPath: string;\n project: any;\n objects: any;\n files: ProjetFile[] | undefined;\n\n public constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.project = xcode.project(projectPath);\n this.project.parseSync();\n this.objects = this.project.hash.project.objects;\n }\n\n public getAllTargets(): string[] {\n return Object.keys(this.objects.PBXNativeTarget || {})\n .filter((key) => {\n return (\n !key.endsWith('_comment') &&\n this.objects.PBXNativeTarget[key].productType.startsWith(\n '\"com.apple.product-type.application',\n )\n );\n })\n .map((key) => {\n return this.objects.PBXNativeTarget[key].name as string;\n });\n }\n\n public updateXcodeProject(\n sentryProject: SentryProjectData,\n target: string,\n apiKeys: { token: string },\n addSPMReference: boolean,\n uploadSource = true,\n ): void {\n addUploadSymbolsScript(this.project, sentryProject, target, uploadSource);\n if (uploadSource) {\n setDebugInformationFormat(this.project, target);\n }\n if (addSPMReference) {\n addSentrySPM(this.project, target);\n }\n const newContent = this.project.writeSync();\n fs.writeFileSync(this.projectPath, newContent);\n }\n\n public filesForTarget(target: string): string[] | undefined {\n const files = this.projectFiles();\n const fileDictionary: any = {};\n files.forEach((file) => {\n fileDictionary[file.key] = file.path;\n });\n\n const nativeTarget = Object.keys(this.objects.PBXNativeTarget || {}).filter(\n (key) => {\n return (\n !key.endsWith('_comment') &&\n this.objects.PBXNativeTarget[key].name === target\n );\n },\n )[0];\n\n if (nativeTarget === undefined) {\n return undefined;\n }\n\n const buildPhaseKey = this.objects.PBXNativeTarget[\n nativeTarget\n ].buildPhases.filter((phase: any) => {\n return this.objects.PBXSourcesBuildPhase[phase.value] !== undefined;\n })[0];\n\n if (buildPhaseKey === undefined) {\n return undefined;\n }\n\n const buildPhases = this.objects.PBXSourcesBuildPhase[buildPhaseKey.value];\n if (buildPhases === undefined) {\n return undefined;\n }\n\n const baseDir = path.dirname(path.dirname(this.projectPath));\n\n return buildPhases.files\n .map((file: any) => {\n const buildFile = fileDictionary[\n this.objects.PBXBuildFile[file.value].fileRef\n ] as string;\n if (!buildFile) {\n return '';\n }\n return path.join(baseDir, buildFile);\n })\n .filter((f: string) => f.length > 0) as string[];\n }\n\n projectFiles(): ProjetFile[] {\n if (this.files === undefined) {\n const proj = this.project.getFirstProject();\n const mainGroupKey = proj.firstProject.mainGroup;\n const mainGroup = this.objects.PBXGroup[mainGroupKey];\n this.files = this.buildGroup(mainGroup);\n }\n return this.files;\n }\n\n buildGroup(group: any, path = ''): ProjetFile[] {\n const result: ProjetFile[] = [];\n for (const child of group.children) {\n if (this.objects.PBXFileReference[child.value]) {\n const fileReference = this.objects.PBXFileReference[child.value];\n result.push({\n key: child.value,\n path: `${path}${fileReference.path.replace(/\"/g, '')}`,\n });\n } else if (this.objects.PBXGroup[child.value]) {\n const groupReference = this.objects.PBXGroup[child.value];\n const groupChildren = this.buildGroup(\n groupReference,\n groupReference.path\n ? `${path}${groupReference.path.replace(/\"/g, '')}/`\n : path,\n );\n result.push(...groupChildren);\n }\n }\n return result;\n }\n}\n"]}
1
+ {"version":3,"file":"xcode-manager.js","sourceRoot":"","sources":["../../../src/apple/xcode-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport * as fs from 'fs';\nimport { SentryProjectData } from '../utils/types';\nimport * as templates from './templates';\nimport * as path from 'path';\nconst xcode = require('xcode');\n\ninterface ProjetFile {\n key: string;\n path: string;\n}\n\nfunction setDebugInformationFormatAndSandbox(\n proj: any,\n targetName: string,\n): void {\n const xcObjects = proj.hash.project.objects;\n const targetKey: string = Object.keys(xcObjects.PBXNativeTarget || {}).filter(\n (key) => {\n return (\n !key.endsWith('_comment') &&\n xcObjects.PBXNativeTarget[key].name === targetName\n );\n },\n )[0];\n const target = xcObjects.PBXNativeTarget[targetKey];\n\n xcObjects.XCConfigurationList[\n target.buildConfigurationList\n ].buildConfigurations.forEach((buildConfig: { value: string }) => {\n const buildSettings =\n xcObjects.XCBuildConfiguration[buildConfig.value].buildSettings;\n buildSettings.DEBUG_INFORMATION_FORMAT = '\"dwarf-with-dsym\"';\n buildSettings.ENABLE_USER_SCRIPT_SANDBOXING = '\"NO\"';\n });\n}\n\nfunction addSentrySPM(proj: any, targetName: string): void {\n const xcObjects = proj.hash.project.objects;\n\n const sentryFrameworkUUID = proj.generateUuid() as string;\n const sentrySPMUUID = proj.generateUuid() as string;\n\n //Check whether xcObjects already have sentry framework\n if (xcObjects.PBXFrameworksBuildPhase) {\n for (const key in xcObjects.PBXFrameworksBuildPhase || {}) {\n if (!key.endsWith('_comment')) {\n const frameworks = xcObjects.PBXFrameworksBuildPhase[key].files;\n for (const framework of frameworks) {\n if (framework.comment === 'Sentry in Frameworks') {\n return;\n }\n }\n }\n }\n }\n\n xcObjects.PBXBuildFile[sentryFrameworkUUID] = {\n isa: 'PBXBuildFile',\n productRef: sentrySPMUUID,\n productRef_comment: 'Sentry',\n };\n xcObjects.PBXBuildFile[sentryFrameworkUUID + '_comment'] =\n 'Sentry in Frameworks';\n\n for (const key in xcObjects.PBXFrameworksBuildPhase || {}) {\n if (!key.endsWith('_comment')) {\n const frameworks = xcObjects.PBXFrameworksBuildPhase[key].files;\n frameworks.push({\n value: sentryFrameworkUUID,\n comment: 'Sentry in Frameworks',\n });\n }\n }\n\n const targetKey: string = Object.keys(xcObjects.PBXNativeTarget || {}).filter(\n (key) => {\n return (\n !key.endsWith('_comment') &&\n xcObjects.PBXNativeTarget[key].name === targetName\n );\n },\n )[0];\n const target = xcObjects.PBXNativeTarget[targetKey];\n\n if (!target.packageProductDependencies) {\n target.packageProductDependencies = [];\n }\n target.packageProductDependencies.push({\n value: sentrySPMUUID,\n comment: 'Sentry',\n });\n\n const sentrySwiftPackageUUID = proj.generateUuid() as string;\n const xcProject = proj.getFirstProject().firstProject;\n if (!xcProject.packageReferences) {\n xcProject.packageReferences = [];\n }\n xcProject.packageReferences.push({\n value: sentrySwiftPackageUUID,\n comment: 'XCRemoteSwiftPackageReference \"sentry-cocoa\"',\n });\n\n if (!xcObjects.XCRemoteSwiftPackageReference) {\n xcObjects.XCRemoteSwiftPackageReference = {};\n }\n\n xcObjects.XCRemoteSwiftPackageReference[sentrySwiftPackageUUID] = {\n isa: 'XCRemoteSwiftPackageReference',\n repositoryURL: '\"https://github.com/getsentry/sentry-cocoa/\"',\n requirement: {\n kind: 'upToNextMajorVersion',\n minimumVersion: '8.0.0',\n },\n };\n xcObjects.XCRemoteSwiftPackageReference[sentrySwiftPackageUUID + '_comment'] =\n 'XCRemoteSwiftPackageReference \"sentry-cocoa\"';\n\n if (!xcObjects.XCSwiftPackageProductDependency) {\n xcObjects.XCSwiftPackageProductDependency = {};\n }\n xcObjects.XCSwiftPackageProductDependency[sentrySPMUUID] = {\n isa: 'XCSwiftPackageProductDependency',\n package: sentrySwiftPackageUUID,\n package_comment: 'XCRemoteSwiftPackageReference \"sentry-cocoa\"',\n productName: 'Sentry',\n };\n xcObjects.XCSwiftPackageProductDependency[sentrySPMUUID + '_comment'] =\n 'Sentry';\n\n clack.log.step('Added Sentry SPM dependency to your project');\n}\n\nfunction addUploadSymbolsScript(\n xcodeProject: any,\n sentryProject: SentryProjectData,\n targetName: string,\n uploadSource = true,\n): void {\n const xcObjects = xcodeProject.hash.project.objects;\n const targetKey: string = Object.keys(xcObjects.PBXNativeTarget || {}).filter(\n (key) => {\n return (\n !key.endsWith('_comment') &&\n xcObjects.PBXNativeTarget[key].name === targetName\n );\n },\n )[0];\n\n for (const scriptKey in xcObjects.PBXShellScriptBuildPhase || {}) {\n if (!scriptKey.endsWith('_comment')) {\n const script = xcObjects.PBXShellScriptBuildPhase[scriptKey].shellScript;\n //Sentry script already exists, update it\n if (script.includes('sentry-cli')) {\n delete xcObjects.PBXShellScriptBuildPhase[scriptKey];\n delete xcObjects.PBXShellScriptBuildPhase[scriptKey + '_comment'];\n break;\n }\n }\n }\n\n xcodeProject.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Upload Debug Symbols to Sentry',\n targetKey,\n {\n inputFileListPaths: [],\n outputFileListPaths: [],\n inputPaths: [templates.scriptInputPath],\n shellPath: '/bin/sh',\n shellScript: templates.getRunScriptTemplate(\n sentryProject.organization.slug,\n sentryProject.slug,\n uploadSource,\n ),\n },\n );\n clack.log.step(`Added Sentry upload script to \"${targetName}\" build phase`);\n}\n\nexport class XcodeProject {\n projectPath: string;\n project: any;\n objects: any;\n files: ProjetFile[] | undefined;\n\n public constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.project = xcode.project(projectPath);\n this.project.parseSync();\n this.objects = this.project.hash.project.objects;\n }\n\n public getAllTargets(): string[] {\n return Object.keys(this.objects.PBXNativeTarget || {})\n .filter((key) => {\n return (\n !key.endsWith('_comment') &&\n this.objects.PBXNativeTarget[key].productType.startsWith(\n '\"com.apple.product-type.application',\n )\n );\n })\n .map((key) => {\n return this.objects.PBXNativeTarget[key].name as string;\n });\n }\n\n public updateXcodeProject(\n sentryProject: SentryProjectData,\n target: string,\n apiKeys: { token: string },\n addSPMReference: boolean,\n uploadSource = true,\n ): void {\n addUploadSymbolsScript(this.project, sentryProject, target, uploadSource);\n if (uploadSource) {\n setDebugInformationFormatAndSandbox(this.project, target);\n }\n if (addSPMReference) {\n addSentrySPM(this.project, target);\n }\n const newContent = this.project.writeSync();\n fs.writeFileSync(this.projectPath, newContent);\n }\n\n public filesForTarget(target: string): string[] | undefined {\n const files = this.projectFiles();\n const fileDictionary: any = {};\n files.forEach((file) => {\n fileDictionary[file.key] = file.path;\n });\n\n const nativeTarget = Object.keys(this.objects.PBXNativeTarget || {}).filter(\n (key) => {\n return (\n !key.endsWith('_comment') &&\n this.objects.PBXNativeTarget[key].name === target\n );\n },\n )[0];\n\n if (nativeTarget === undefined) {\n return undefined;\n }\n\n const buildPhaseKey = this.objects.PBXNativeTarget[\n nativeTarget\n ].buildPhases.filter((phase: any) => {\n return this.objects.PBXSourcesBuildPhase[phase.value] !== undefined;\n })[0];\n\n if (buildPhaseKey === undefined) {\n return undefined;\n }\n\n const buildPhases = this.objects.PBXSourcesBuildPhase[buildPhaseKey.value];\n if (buildPhases === undefined) {\n return undefined;\n }\n\n const baseDir = path.dirname(path.dirname(this.projectPath));\n\n return buildPhases.files\n .map((file: any) => {\n const buildFile = fileDictionary[\n this.objects.PBXBuildFile[file.value].fileRef\n ] as string;\n if (!buildFile) {\n return '';\n }\n return path.join(baseDir, buildFile);\n })\n .filter((f: string) => f.length > 0) as string[];\n }\n\n projectFiles(): ProjetFile[] {\n if (this.files === undefined) {\n const proj = this.project.getFirstProject();\n const mainGroupKey = proj.firstProject.mainGroup;\n const mainGroup = this.objects.PBXGroup[mainGroupKey];\n this.files = this.buildGroup(mainGroup);\n }\n return this.files;\n }\n\n buildGroup(group: any, path = ''): ProjetFile[] {\n const result: ProjetFile[] = [];\n for (const child of group.children) {\n if (this.objects.PBXFileReference[child.value]) {\n const fileReference = this.objects.PBXFileReference[child.value];\n result.push({\n key: child.value,\n path: `${path}${fileReference.path.replace(/\"/g, '')}`,\n });\n } else if (this.objects.PBXGroup[child.value]) {\n const groupReference = this.objects.PBXGroup[child.value];\n const groupChildren = this.buildGroup(\n groupReference,\n groupReference.path\n ? `${path}${groupReference.path.replace(/\"/g, '')}/`\n : path,\n );\n result.push(...groupChildren);\n }\n }\n return result;\n }\n}\n"]}
@@ -444,7 +444,7 @@ function createOrMergeNextJsFiles(selectedProject, selfHosted, sentryUrl, sdkCon
444
444
  orgSlug: selectedProject.organization.slug,
445
445
  projectSlug: selectedProject.slug,
446
446
  selfHosted: selfHosted,
447
- url: sentryUrl,
447
+ sentryUrl: sentryUrl,
448
448
  tunnelRoute: sdkConfigOptions.tunnelRoute,
449
449
  });
450
450
  nextConfigJs = 'next.config.js';
@@ -591,7 +591,7 @@ function createExamplePage(selfHosted, selectedProject, sentryUrl) {
591
591
  selfHosted: selfHosted,
592
592
  orgSlug: selectedProject.organization.slug,
593
593
  projectId: selectedProject.id,
594
- url: sentryUrl,
594
+ sentryUrl: sentryUrl,
595
595
  useClient: true,
596
596
  });
597
597
  fs.mkdirSync(path.join.apply(path, __spreadArray(__spreadArray([process.cwd()], appLocation, false), ['sentry-example-page'], false)), {
@@ -618,7 +618,7 @@ function createExamplePage(selfHosted, selectedProject, sentryUrl) {
618
618
  selfHosted: selfHosted,
619
619
  orgSlug: selectedProject.organization.slug,
620
620
  projectId: selectedProject.id,
621
- url: sentryUrl,
621
+ sentryUrl: sentryUrl,
622
622
  useClient: false,
623
623
  });
624
624
  return [4 /*yield*/, fs.promises.writeFile(path.join.apply(path, __spreadArray(__spreadArray([process.cwd()], pagesLocation, false), ['sentry-example-page.jsx'], false)), examplePageContents, { encoding: 'utf8', flag: 'w' })];
@@ -1 +1 @@
1
- {"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as fs from 'fs';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, parseModule } from 'magicast';\nimport * as path from 'path';\n\nimport * as Sentry from '@sentry/node';\n\nimport {\n abort,\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n createNewConfigFile,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n showCopyPasteInstructions,\n} from '../utils/clack-utils';\nimport { SentryProjectData, WizardOptions } from '../utils/types';\nimport {\n getFullUnderscoreErrorCopyPasteSnippet,\n getGlobalErrorCopyPasteSnippet,\n getInstrumentationHookContent,\n getInstrumentationHookCopyPasteSnippet,\n getNextjsConfigCjsAppendix,\n getNextjsConfigCjsTemplate,\n getNextjsConfigEsmCopyPasteSnippet,\n getSentryConfigContents,\n getSentryDefaultGlobalErrorPage,\n getSentryDefaultUnderscoreErrorPage,\n getSentryExampleApiRoute,\n getSentryExampleAppDirApiRoute,\n getSentryExamplePageContents,\n getSimpleUnderscoreErrorCopyPasteSnippet,\n getWithSentryConfigOptionsTemplate,\n} from './templates';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { getNextJsVersionBucket } from './utils';\nimport { configureCI } from '../sourcemaps/sourcemaps-wizard';\n\nexport function runNextjsWizard(options: WizardOptions) {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'nextjs',\n },\n () => runNextjsWizardWithTelemetry(options),\n );\n}\n\nexport async function runNextjsWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Next.js Wizard',\n promoCode: options.promoCode,\n telemetryEnabled: options.telemetryEnabled,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo();\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n Sentry.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n const { selectedProject, authToken, selfHosted, sentryUrl } =\n await getOrAskForProjectData(options, 'javascript-nextjs');\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/nextjs',\n packageJson,\n );\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n await installPackage({\n packageName: '@sentry/nextjs@^8',\n alreadyInstalled: !!packageJson?.dependencies?.['@sentry/nextjs'],\n });\n\n await traceStep('configure-sdk', async () => {\n const tunnelRoute = await askShouldSetTunnelRoute();\n\n await createOrMergeNextJsFiles(selectedProject, selfHosted, sentryUrl, {\n tunnelRoute,\n });\n });\n\n await traceStep('create-underscoreerror-page', async () => {\n const srcDir = path.join(process.cwd(), 'src');\n const maybePagesDirPath = path.join(process.cwd(), 'pages');\n const maybeSrcPagesDirPath = path.join(srcDir, 'pages');\n\n const pagesLocation =\n fs.existsSync(maybePagesDirPath) &&\n fs.lstatSync(maybePagesDirPath).isDirectory()\n ? ['pages']\n : fs.existsSync(maybeSrcPagesDirPath) &&\n fs.lstatSync(maybeSrcPagesDirPath).isDirectory()\n ? ['src', 'pages']\n : undefined;\n\n if (!pagesLocation) {\n return;\n }\n\n const underscoreErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...pagesLocation, '_error.tsx'),\n )\n ? '_error.tsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.ts'))\n ? '_error.ts'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.jsx'))\n ? '_error.jsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.js'))\n ? '_error.js'\n : undefined;\n\n if (!underscoreErrorPageFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), ...pagesLocation, '_error.jsx'),\n getSentryDefaultUnderscoreErrorPage(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(path.join(...pagesLocation, '_error.jsx'))}.`,\n );\n } else if (\n fs\n .readFileSync(\n path.join(process.cwd(), ...pagesLocation, underscoreErrorPageFile),\n 'utf8',\n )\n .includes('getInitialProps')\n ) {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease put the following function call in the ${chalk.bold(\n 'getInitialProps',\n )}\\nmethod of your custom error page at ${chalk.bold(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(getSimpleUnderscoreErrorCopyPasteSnippet());\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you modify your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n } else {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getFullUnderscoreErrorCopyPasteSnippet(\n underscoreErrorPageFile === '_error.ts' ||\n underscoreErrorPageFile === '_error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did add the code to your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n });\n\n await traceStep('create-global-error-page', async () => {\n const maybeAppDirPath = path.join(process.cwd(), 'app');\n const maybeSrcAppDirPath = path.join(process.cwd(), 'src', 'app');\n\n const appDirLocation =\n fs.existsSync(maybeAppDirPath) &&\n fs.lstatSync(maybeAppDirPath).isDirectory()\n ? ['app']\n : fs.existsSync(maybeSrcAppDirPath) &&\n fs.lstatSync(maybeSrcAppDirPath).isDirectory()\n ? ['src', 'app']\n : undefined;\n\n if (!appDirLocation) {\n return;\n }\n\n const globalErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.tsx'),\n )\n ? 'global-error.tsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.ts'),\n )\n ? 'global-error.ts'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.jsx'),\n )\n ? 'global-error.jsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.js'),\n )\n ? 'global-error.js'\n : undefined;\n\n if (!globalErrorPageFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), ...appDirLocation, 'global-error.jsx'),\n getSentryDefaultGlobalErrorPage(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appDirLocation, 'global-error.jsx'),\n )}.`,\n );\n } else {\n clack.log.info(\n `It seems like you already have a custom error page for your app directory.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )}:\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getGlobalErrorCopyPasteSnippet(\n globalErrorPageFile === 'global-error.ts' ||\n globalErrorPageFile === 'global-error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did add the code to your ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n });\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage();\n if (shouldCreateExamplePage) {\n await traceStep('create-example-page', async () =>\n createExamplePage(selfHosted, selectedProject, sentryUrl),\n );\n }\n\n await addDotEnvSentryBuildPluginFile(authToken);\n\n const mightBeUsingVercel = fs.existsSync(\n path.join(process.cwd(), 'vercel.json'),\n );\n\n if (mightBeUsingVercel) {\n clack.log.info(\n \"▲ It seems like you're using Vercel. We recommend using the Sentry Vercel integration to set up an auth token for Vercel deployments: https://vercel.com/integrations/sentry\",\n );\n } else {\n await traceStep('configure-ci', () => configureCI('nextjs', authToken));\n }\n\n clack.outro(`\n${chalk.green('Successfully installed the Sentry Next.js SDK!')} ${\n shouldCreateExamplePage\n ? `\\n\\nYou can validate your setup by restarting your dev environment (${chalk.cyan(\n `next dev`,\n )}) and visiting ${chalk.cyan('\"/sentry-example-page\"')}`\n : ''\n }\n\n${chalk.dim(\n 'If you encounter any issues, let us know here: https://github.com/getsentry/sentry-javascript/issues',\n)}`);\n}\n\ntype SDKConfigOptions = {\n tunnelRoute: boolean;\n};\n\nasync function createOrMergeNextJsFiles(\n selectedProject: SentryProjectData,\n selfHosted: boolean,\n sentryUrl: string,\n sdkConfigOptions: SDKConfigOptions,\n) {\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'client', 'edge'] as const;\n\n for (const configVariant of configVariants) {\n await traceStep(`create-sentry-${configVariant}-config`, async () => {\n const jsConfig = `sentry.${configVariant}.config.js`;\n const tsConfig = `sentry.${configVariant}.config.ts`;\n\n const jsConfigExists = fs.existsSync(path.join(process.cwd(), jsConfig));\n const tsConfigExists = fs.existsSync(path.join(process.cwd(), tsConfig));\n\n let shouldWriteFile = true;\n\n if (jsConfigExists || tsConfigExists) {\n const existingConfigs = [];\n\n if (jsConfigExists) {\n existingConfigs.push(jsConfig);\n }\n\n if (tsConfigExists) {\n existingConfigs.push(tsConfig);\n }\n\n const overwriteExistingConfigs = await abortIfCancelled(\n clack.confirm({\n message: `Found existing Sentry ${configVariant} config (${existingConfigs.join(\n ', ',\n )}). Overwrite ${existingConfigs.length > 1 ? 'them' : 'it'}?`,\n }),\n );\n Sentry.setTag(\n `overwrite-${configVariant}-config`,\n overwriteExistingConfigs,\n );\n\n shouldWriteFile = overwriteExistingConfigs;\n\n if (overwriteExistingConfigs) {\n if (jsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), jsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryConfigContents(\n selectedProject.keys[0].dsn.public,\n configVariant,\n ),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created fresh ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n Sentry.setTag(`created-${configVariant}-config`, true);\n }\n });\n }\n\n await traceStep('setup-instrumentation-hook', async () => {\n const srcInstrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.ts'),\n );\n const srcInstrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.js'),\n );\n const instrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.ts'),\n );\n const instrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.js'),\n );\n\n let instrumentationHookLocation: 'src' | 'root' | 'does-not-exist';\n if (srcInstrumentationTsExists || srcInstrumentationJsExists) {\n instrumentationHookLocation = 'src';\n } else if (instrumentationTsExists || instrumentationJsExists) {\n instrumentationHookLocation = 'root';\n } else {\n instrumentationHookLocation = 'does-not-exist';\n }\n\n if (instrumentationHookLocation === 'does-not-exist') {\n const srcFolderExists = fs.existsSync(path.join(process.cwd(), 'src'));\n\n const instrumentationHookPath = srcFolderExists\n ? path.join(process.cwd(), 'src', 'instrumentation.ts')\n : path.join(process.cwd(), 'instrumentation.ts');\n\n const successfullyCreated = await createNewConfigFile(\n instrumentationHookPath,\n getInstrumentationHookContent(srcFolderExists ? 'src' : 'root'),\n );\n\n if (!successfullyCreated) {\n await showCopyPasteInstructions(\n 'instrumentation.ts',\n getInstrumentationHookCopyPasteSnippet(\n srcFolderExists ? 'src' : 'root',\n ),\n );\n }\n } else {\n await showCopyPasteInstructions(\n srcInstrumentationTsExists\n ? 'instrumentation.ts'\n : srcInstrumentationJsExists\n ? 'instrumentation.js'\n : instrumentationTsExists\n ? 'instrumentation.ts'\n : 'instrumentation.js',\n getInstrumentationHookCopyPasteSnippet(instrumentationHookLocation),\n );\n }\n });\n\n await traceStep('setup-next-config', async () => {\n const withSentryConfigOptionsTemplate = getWithSentryConfigOptionsTemplate({\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n selfHosted,\n url: sentryUrl,\n tunnelRoute: sdkConfigOptions.tunnelRoute,\n });\n\n const nextConfigJs = 'next.config.js';\n const nextConfigMjs = 'next.config.mjs';\n\n const nextConfigJsExists = fs.existsSync(\n path.join(process.cwd(), nextConfigJs),\n );\n const nextConfigMjsExists = fs.existsSync(\n path.join(process.cwd(), nextConfigMjs),\n );\n\n if (!nextConfigJsExists && !nextConfigMjsExists) {\n Sentry.setTag('next-config-strategy', 'create');\n\n await fs.promises.writeFile(\n path.join(process.cwd(), nextConfigJs),\n getNextjsConfigCjsTemplate(withSentryConfigOptionsTemplate),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan('next.config.js')} with Sentry configuration.`,\n );\n }\n\n if (nextConfigJsExists) {\n Sentry.setTag('next-config-strategy', 'modify');\n\n const nextConfigJsContent = fs.readFileSync(\n path.join(process.cwd(), nextConfigJs),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigJsContent.includes('@sentry/nextjs') &&\n nextConfigJsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n nextConfigJs,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n if (shouldInject) {\n await fs.promises.appendFile(\n path.join(process.cwd(), nextConfigJs),\n getNextjsConfigCjsAppendix(withSentryConfigOptionsTemplate),\n 'utf8',\n );\n\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n nextConfigJs,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n }\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n\n if (nextConfigMjsExists) {\n const nextConfigMjsContent = fs.readFileSync(\n path.join(process.cwd(), nextConfigMjs),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigMjsContent.includes('@sentry/nextjs') &&\n nextConfigMjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n nextConfigMjs,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n try {\n if (shouldInject) {\n const mod = parseModule(nextConfigMjsContent);\n mod.imports.$add({\n from: '@sentry/nextjs',\n imported: 'withSentryConfig',\n local: 'withSentryConfig',\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n const expressionToWrap = generateCode(mod.exports.default.$ast).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.default = builders.raw(`withSentryConfig(\n ${expressionToWrap},\n ${withSentryConfigOptionsTemplate}\n)`);\n const newCode = mod.generate().code;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), nextConfigMjs),\n newCode,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n nextConfigMjs,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n } catch {\n Sentry.setTag('next-config-mod-result', 'fail');\n clack.log.warn(\n chalk.yellow(\n `Something went wrong writing to ${chalk.cyan(nextConfigMjs)}`,\n ),\n );\n clack.log.info(\n `Please put the following code snippet into ${chalk.cyan(\n nextConfigMjs,\n )}: ${chalk.dim('You probably have to clean it up a bit.')}\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getNextjsConfigEsmCopyPasteSnippet(withSentryConfigOptionsTemplate),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Are you done putting the snippet above into ${chalk.cyan(\n nextConfigMjs,\n )}?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n }\n });\n}\n\nasync function createExamplePage(\n selfHosted: boolean,\n selectedProject: SentryProjectData,\n sentryUrl: string,\n): Promise<void> {\n const srcDir = path.join(process.cwd(), 'src');\n const maybePagesDirPath = path.join(process.cwd(), 'pages');\n const maybeSrcPagesDirPath = path.join(srcDir, 'pages');\n const maybeAppDirPath = path.join(process.cwd(), 'app');\n const maybeSrcAppDirPath = path.join(srcDir, 'app');\n\n let pagesLocation =\n fs.existsSync(maybePagesDirPath) &&\n fs.lstatSync(maybePagesDirPath).isDirectory()\n ? ['pages']\n : fs.existsSync(maybeSrcPagesDirPath) &&\n fs.lstatSync(maybeSrcPagesDirPath).isDirectory()\n ? ['src', 'pages']\n : undefined;\n\n const appLocation =\n fs.existsSync(maybeAppDirPath) &&\n fs.lstatSync(maybeAppDirPath).isDirectory()\n ? ['app']\n : fs.existsSync(maybeSrcAppDirPath) &&\n fs.lstatSync(maybeSrcAppDirPath).isDirectory()\n ? ['src', 'app']\n : undefined;\n\n if (!pagesLocation && !appLocation) {\n pagesLocation =\n fs.existsSync(srcDir) && fs.lstatSync(srcDir).isDirectory()\n ? ['src', 'pages']\n : ['pages'];\n fs.mkdirSync(path.join(process.cwd(), ...pagesLocation), {\n recursive: true,\n });\n }\n\n Sentry.setTag('nextjs-app-dir', !!appLocation);\n\n if (appLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\n useClient: true,\n });\n\n fs.mkdirSync(\n path.join(process.cwd(), ...appLocation, 'sentry-example-page'),\n {\n recursive: true,\n },\n );\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appLocation,\n 'sentry-example-page',\n 'page.jsx',\n ),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appLocation, 'sentry-example-page', 'page.jsx'),\n )}.`,\n );\n\n fs.mkdirSync(\n path.join(process.cwd(), ...appLocation, 'api', 'sentry-example-api'),\n {\n recursive: true,\n },\n );\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appLocation,\n 'api',\n 'sentry-example-api',\n 'route.js',\n ),\n getSentryExampleAppDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appLocation, 'api', 'sentry-example-api', 'route.js'),\n )}.`,\n );\n } else if (pagesLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\n useClient: false,\n });\n\n await fs.promises.writeFile(\n path.join(process.cwd(), ...pagesLocation, 'sentry-example-page.jsx'),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesLocation, 'sentry-example-page.js'),\n )}.`,\n );\n\n fs.mkdirSync(path.join(process.cwd(), ...pagesLocation, 'api'), {\n recursive: true,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesLocation,\n 'api',\n 'sentry-example-api.js',\n ),\n getSentryExampleApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesLocation, 'api', 'sentry-example-api.js'),\n )}.`,\n );\n }\n}\n\n/**\n * Ask users if they want to set the tunnelRoute option.\n * We can't set this by default because it potentially increases hosting bills.\n * It's valuable enough to for users to justify asking the additional question.\n */\nasync function askShouldSetTunnelRoute() {\n return await traceStep('ask-tunnelRoute-option', async () => {\n const shouldSetTunnelRoute = await abortIfCancelled(\n clack.select({\n message:\n 'Do you want to route Sentry requests in the browser through your NextJS server to avoid ad blockers?',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'Can increase your server load and hosting bill',\n },\n {\n label: 'No',\n value: false,\n hint: 'Browser errors and events might be blocked by ad blockers before being sent to Sentry',\n },\n ],\n initialValue: false,\n }),\n );\n\n if (!shouldSetTunnelRoute) {\n clack.log.info(\n \"Sounds good! We'll leave the option commented for later, just in case :)\",\n );\n }\n\n return shouldSetTunnelRoute;\n });\n}\n"]}
1
+ {"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as fs from 'fs';\n// @ts-ignore - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, parseModule } from 'magicast';\nimport * as path from 'path';\n\nimport * as Sentry from '@sentry/node';\n\nimport {\n abort,\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n createNewConfigFile,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n showCopyPasteInstructions,\n} from '../utils/clack-utils';\nimport { SentryProjectData, WizardOptions } from '../utils/types';\nimport {\n getFullUnderscoreErrorCopyPasteSnippet,\n getGlobalErrorCopyPasteSnippet,\n getInstrumentationHookContent,\n getInstrumentationHookCopyPasteSnippet,\n getNextjsConfigCjsAppendix,\n getNextjsConfigCjsTemplate,\n getNextjsConfigEsmCopyPasteSnippet,\n getSentryConfigContents,\n getSentryDefaultGlobalErrorPage,\n getSentryDefaultUnderscoreErrorPage,\n getSentryExampleApiRoute,\n getSentryExampleAppDirApiRoute,\n getSentryExamplePageContents,\n getSimpleUnderscoreErrorCopyPasteSnippet,\n getWithSentryConfigOptionsTemplate,\n} from './templates';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { getNextJsVersionBucket } from './utils';\nimport { configureCI } from '../sourcemaps/sourcemaps-wizard';\n\nexport function runNextjsWizard(options: WizardOptions) {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'nextjs',\n },\n () => runNextjsWizardWithTelemetry(options),\n );\n}\n\nexport async function runNextjsWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Next.js Wizard',\n promoCode: options.promoCode,\n telemetryEnabled: options.telemetryEnabled,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo();\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n Sentry.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n const { selectedProject, authToken, selfHosted, sentryUrl } =\n await getOrAskForProjectData(options, 'javascript-nextjs');\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/nextjs',\n packageJson,\n );\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n await installPackage({\n packageName: '@sentry/nextjs@^8',\n alreadyInstalled: !!packageJson?.dependencies?.['@sentry/nextjs'],\n });\n\n await traceStep('configure-sdk', async () => {\n const tunnelRoute = await askShouldSetTunnelRoute();\n\n await createOrMergeNextJsFiles(selectedProject, selfHosted, sentryUrl, {\n tunnelRoute,\n });\n });\n\n await traceStep('create-underscoreerror-page', async () => {\n const srcDir = path.join(process.cwd(), 'src');\n const maybePagesDirPath = path.join(process.cwd(), 'pages');\n const maybeSrcPagesDirPath = path.join(srcDir, 'pages');\n\n const pagesLocation =\n fs.existsSync(maybePagesDirPath) &&\n fs.lstatSync(maybePagesDirPath).isDirectory()\n ? ['pages']\n : fs.existsSync(maybeSrcPagesDirPath) &&\n fs.lstatSync(maybeSrcPagesDirPath).isDirectory()\n ? ['src', 'pages']\n : undefined;\n\n if (!pagesLocation) {\n return;\n }\n\n const underscoreErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...pagesLocation, '_error.tsx'),\n )\n ? '_error.tsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.ts'))\n ? '_error.ts'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.jsx'))\n ? '_error.jsx'\n : fs.existsSync(path.join(process.cwd(), ...pagesLocation, '_error.js'))\n ? '_error.js'\n : undefined;\n\n if (!underscoreErrorPageFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), ...pagesLocation, '_error.jsx'),\n getSentryDefaultUnderscoreErrorPage(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(path.join(...pagesLocation, '_error.jsx'))}.`,\n );\n } else if (\n fs\n .readFileSync(\n path.join(process.cwd(), ...pagesLocation, underscoreErrorPageFile),\n 'utf8',\n )\n .includes('getInitialProps')\n ) {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease put the following function call in the ${chalk.bold(\n 'getInitialProps',\n )}\\nmethod of your custom error page at ${chalk.bold(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(getSimpleUnderscoreErrorCopyPasteSnippet());\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did you modify your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n } else {\n clack.log.info(\n `It seems like you already have a custom error page.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )}:`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getFullUnderscoreErrorCopyPasteSnippet(\n underscoreErrorPageFile === '_error.ts' ||\n underscoreErrorPageFile === '_error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did add the code to your ${chalk.cyan(\n path.join(...pagesLocation, underscoreErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n });\n\n await traceStep('create-global-error-page', async () => {\n const maybeAppDirPath = path.join(process.cwd(), 'app');\n const maybeSrcAppDirPath = path.join(process.cwd(), 'src', 'app');\n\n const appDirLocation =\n fs.existsSync(maybeAppDirPath) &&\n fs.lstatSync(maybeAppDirPath).isDirectory()\n ? ['app']\n : fs.existsSync(maybeSrcAppDirPath) &&\n fs.lstatSync(maybeSrcAppDirPath).isDirectory()\n ? ['src', 'app']\n : undefined;\n\n if (!appDirLocation) {\n return;\n }\n\n const globalErrorPageFile = fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.tsx'),\n )\n ? 'global-error.tsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.ts'),\n )\n ? 'global-error.ts'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.jsx'),\n )\n ? 'global-error.jsx'\n : fs.existsSync(\n path.join(process.cwd(), ...appDirLocation, 'global-error.js'),\n )\n ? 'global-error.js'\n : undefined;\n\n if (!globalErrorPageFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), ...appDirLocation, 'global-error.jsx'),\n getSentryDefaultGlobalErrorPage(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appDirLocation, 'global-error.jsx'),\n )}.`,\n );\n } else {\n clack.log.info(\n `It seems like you already have a custom error page for your app directory.\\n\\nPlease add the following code to your custom error page\\nat ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )}:\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getGlobalErrorCopyPasteSnippet(\n globalErrorPageFile === 'global-error.ts' ||\n globalErrorPageFile === 'global-error.tsx',\n ),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Did add the code to your ${chalk.cyan(\n path.join(...appDirLocation, globalErrorPageFile),\n )} file as described above?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n });\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage();\n if (shouldCreateExamplePage) {\n await traceStep('create-example-page', async () =>\n createExamplePage(selfHosted, selectedProject, sentryUrl),\n );\n }\n\n await addDotEnvSentryBuildPluginFile(authToken);\n\n const mightBeUsingVercel = fs.existsSync(\n path.join(process.cwd(), 'vercel.json'),\n );\n\n if (mightBeUsingVercel) {\n clack.log.info(\n \"▲ It seems like you're using Vercel. We recommend using the Sentry Vercel integration to set up an auth token for Vercel deployments: https://vercel.com/integrations/sentry\",\n );\n } else {\n await traceStep('configure-ci', () => configureCI('nextjs', authToken));\n }\n\n clack.outro(`\n${chalk.green('Successfully installed the Sentry Next.js SDK!')} ${\n shouldCreateExamplePage\n ? `\\n\\nYou can validate your setup by restarting your dev environment (${chalk.cyan(\n `next dev`,\n )}) and visiting ${chalk.cyan('\"/sentry-example-page\"')}`\n : ''\n }\n\n${chalk.dim(\n 'If you encounter any issues, let us know here: https://github.com/getsentry/sentry-javascript/issues',\n)}`);\n}\n\ntype SDKConfigOptions = {\n tunnelRoute: boolean;\n};\n\nasync function createOrMergeNextJsFiles(\n selectedProject: SentryProjectData,\n selfHosted: boolean,\n sentryUrl: string,\n sdkConfigOptions: SDKConfigOptions,\n) {\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'client', 'edge'] as const;\n\n for (const configVariant of configVariants) {\n await traceStep(`create-sentry-${configVariant}-config`, async () => {\n const jsConfig = `sentry.${configVariant}.config.js`;\n const tsConfig = `sentry.${configVariant}.config.ts`;\n\n const jsConfigExists = fs.existsSync(path.join(process.cwd(), jsConfig));\n const tsConfigExists = fs.existsSync(path.join(process.cwd(), tsConfig));\n\n let shouldWriteFile = true;\n\n if (jsConfigExists || tsConfigExists) {\n const existingConfigs = [];\n\n if (jsConfigExists) {\n existingConfigs.push(jsConfig);\n }\n\n if (tsConfigExists) {\n existingConfigs.push(tsConfig);\n }\n\n const overwriteExistingConfigs = await abortIfCancelled(\n clack.confirm({\n message: `Found existing Sentry ${configVariant} config (${existingConfigs.join(\n ', ',\n )}). Overwrite ${existingConfigs.length > 1 ? 'them' : 'it'}?`,\n }),\n );\n Sentry.setTag(\n `overwrite-${configVariant}-config`,\n overwriteExistingConfigs,\n );\n\n shouldWriteFile = overwriteExistingConfigs;\n\n if (overwriteExistingConfigs) {\n if (jsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), jsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryConfigContents(\n selectedProject.keys[0].dsn.public,\n configVariant,\n ),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created fresh ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n Sentry.setTag(`created-${configVariant}-config`, true);\n }\n });\n }\n\n await traceStep('setup-instrumentation-hook', async () => {\n const srcInstrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.ts'),\n );\n const srcInstrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'src', 'instrumentation.js'),\n );\n const instrumentationTsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.ts'),\n );\n const instrumentationJsExists = fs.existsSync(\n path.join(process.cwd(), 'instrumentation.js'),\n );\n\n let instrumentationHookLocation: 'src' | 'root' | 'does-not-exist';\n if (srcInstrumentationTsExists || srcInstrumentationJsExists) {\n instrumentationHookLocation = 'src';\n } else if (instrumentationTsExists || instrumentationJsExists) {\n instrumentationHookLocation = 'root';\n } else {\n instrumentationHookLocation = 'does-not-exist';\n }\n\n if (instrumentationHookLocation === 'does-not-exist') {\n const srcFolderExists = fs.existsSync(path.join(process.cwd(), 'src'));\n\n const instrumentationHookPath = srcFolderExists\n ? path.join(process.cwd(), 'src', 'instrumentation.ts')\n : path.join(process.cwd(), 'instrumentation.ts');\n\n const successfullyCreated = await createNewConfigFile(\n instrumentationHookPath,\n getInstrumentationHookContent(srcFolderExists ? 'src' : 'root'),\n );\n\n if (!successfullyCreated) {\n await showCopyPasteInstructions(\n 'instrumentation.ts',\n getInstrumentationHookCopyPasteSnippet(\n srcFolderExists ? 'src' : 'root',\n ),\n );\n }\n } else {\n await showCopyPasteInstructions(\n srcInstrumentationTsExists\n ? 'instrumentation.ts'\n : srcInstrumentationJsExists\n ? 'instrumentation.js'\n : instrumentationTsExists\n ? 'instrumentation.ts'\n : 'instrumentation.js',\n getInstrumentationHookCopyPasteSnippet(instrumentationHookLocation),\n );\n }\n });\n\n await traceStep('setup-next-config', async () => {\n const withSentryConfigOptionsTemplate = getWithSentryConfigOptionsTemplate({\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n selfHosted,\n sentryUrl,\n tunnelRoute: sdkConfigOptions.tunnelRoute,\n });\n\n const nextConfigJs = 'next.config.js';\n const nextConfigMjs = 'next.config.mjs';\n\n const nextConfigJsExists = fs.existsSync(\n path.join(process.cwd(), nextConfigJs),\n );\n const nextConfigMjsExists = fs.existsSync(\n path.join(process.cwd(), nextConfigMjs),\n );\n\n if (!nextConfigJsExists && !nextConfigMjsExists) {\n Sentry.setTag('next-config-strategy', 'create');\n\n await fs.promises.writeFile(\n path.join(process.cwd(), nextConfigJs),\n getNextjsConfigCjsTemplate(withSentryConfigOptionsTemplate),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan('next.config.js')} with Sentry configuration.`,\n );\n }\n\n if (nextConfigJsExists) {\n Sentry.setTag('next-config-strategy', 'modify');\n\n const nextConfigJsContent = fs.readFileSync(\n path.join(process.cwd(), nextConfigJs),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigJsContent.includes('@sentry/nextjs') &&\n nextConfigJsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n nextConfigJs,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n if (shouldInject) {\n await fs.promises.appendFile(\n path.join(process.cwd(), nextConfigJs),\n getNextjsConfigCjsAppendix(withSentryConfigOptionsTemplate),\n 'utf8',\n );\n\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n nextConfigJs,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n }\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n\n if (nextConfigMjsExists) {\n const nextConfigMjsContent = fs.readFileSync(\n path.join(process.cwd(), nextConfigMjs),\n 'utf8',\n );\n\n const probablyIncludesSdk =\n nextConfigMjsContent.includes('@sentry/nextjs') &&\n nextConfigMjsContent.includes('withSentryConfig');\n\n let shouldInject = true;\n\n if (probablyIncludesSdk) {\n const injectAnyhow = await abortIfCancelled(\n clack.confirm({\n message: `${chalk.cyan(\n nextConfigMjs,\n )} already contains Sentry SDK configuration. Should the wizard modify it anyways?`,\n }),\n );\n\n shouldInject = injectAnyhow;\n }\n\n try {\n if (shouldInject) {\n const mod = parseModule(nextConfigMjsContent);\n mod.imports.$add({\n from: '@sentry/nextjs',\n imported: 'withSentryConfig',\n local: 'withSentryConfig',\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n const expressionToWrap = generateCode(mod.exports.default.$ast).code;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n mod.exports.default = builders.raw(`withSentryConfig(\n ${expressionToWrap},\n ${withSentryConfigOptionsTemplate}\n)`);\n const newCode = mod.generate().code;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), nextConfigMjs),\n newCode,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Added Sentry configuration to ${chalk.cyan(\n nextConfigMjs,\n )}. ${chalk.dim('(you probably want to clean this up a bit!)')}`,\n );\n\n Sentry.setTag('next-config-mod-result', 'success');\n }\n } catch {\n Sentry.setTag('next-config-mod-result', 'fail');\n clack.log.warn(\n chalk.yellow(\n `Something went wrong writing to ${chalk.cyan(nextConfigMjs)}`,\n ),\n );\n clack.log.info(\n `Please put the following code snippet into ${chalk.cyan(\n nextConfigMjs,\n )}: ${chalk.dim('You probably have to clean it up a bit.')}\\n`,\n );\n\n // eslint-disable-next-line no-console\n console.log(\n getNextjsConfigEsmCopyPasteSnippet(withSentryConfigOptionsTemplate),\n );\n\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: `Are you done putting the snippet above into ${chalk.cyan(\n nextConfigMjs,\n )}?`,\n active: 'Yes',\n inactive: 'No, get me out of here',\n }),\n );\n\n if (!shouldContinue) {\n await abort();\n }\n }\n }\n });\n}\n\nasync function createExamplePage(\n selfHosted: boolean,\n selectedProject: SentryProjectData,\n sentryUrl: string,\n): Promise<void> {\n const srcDir = path.join(process.cwd(), 'src');\n const maybePagesDirPath = path.join(process.cwd(), 'pages');\n const maybeSrcPagesDirPath = path.join(srcDir, 'pages');\n const maybeAppDirPath = path.join(process.cwd(), 'app');\n const maybeSrcAppDirPath = path.join(srcDir, 'app');\n\n let pagesLocation =\n fs.existsSync(maybePagesDirPath) &&\n fs.lstatSync(maybePagesDirPath).isDirectory()\n ? ['pages']\n : fs.existsSync(maybeSrcPagesDirPath) &&\n fs.lstatSync(maybeSrcPagesDirPath).isDirectory()\n ? ['src', 'pages']\n : undefined;\n\n const appLocation =\n fs.existsSync(maybeAppDirPath) &&\n fs.lstatSync(maybeAppDirPath).isDirectory()\n ? ['app']\n : fs.existsSync(maybeSrcAppDirPath) &&\n fs.lstatSync(maybeSrcAppDirPath).isDirectory()\n ? ['src', 'app']\n : undefined;\n\n if (!pagesLocation && !appLocation) {\n pagesLocation =\n fs.existsSync(srcDir) && fs.lstatSync(srcDir).isDirectory()\n ? ['src', 'pages']\n : ['pages'];\n fs.mkdirSync(path.join(process.cwd(), ...pagesLocation), {\n recursive: true,\n });\n }\n\n Sentry.setTag('nextjs-app-dir', !!appLocation);\n\n if (appLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n sentryUrl,\n useClient: true,\n });\n\n fs.mkdirSync(\n path.join(process.cwd(), ...appLocation, 'sentry-example-page'),\n {\n recursive: true,\n },\n );\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appLocation,\n 'sentry-example-page',\n 'page.jsx',\n ),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appLocation, 'sentry-example-page', 'page.jsx'),\n )}.`,\n );\n\n fs.mkdirSync(\n path.join(process.cwd(), ...appLocation, 'api', 'sentry-example-api'),\n {\n recursive: true,\n },\n );\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...appLocation,\n 'api',\n 'sentry-example-api',\n 'route.js',\n ),\n getSentryExampleAppDirApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...appLocation, 'api', 'sentry-example-api', 'route.js'),\n )}.`,\n );\n } else if (pagesLocation) {\n const examplePageContents = getSentryExamplePageContents({\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n sentryUrl,\n useClient: false,\n });\n\n await fs.promises.writeFile(\n path.join(process.cwd(), ...pagesLocation, 'sentry-example-page.jsx'),\n examplePageContents,\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesLocation, 'sentry-example-page.js'),\n )}.`,\n );\n\n fs.mkdirSync(path.join(process.cwd(), ...pagesLocation, 'api'), {\n recursive: true,\n });\n\n await fs.promises.writeFile(\n path.join(\n process.cwd(),\n ...pagesLocation,\n 'api',\n 'sentry-example-api.js',\n ),\n getSentryExampleApiRoute(),\n { encoding: 'utf8', flag: 'w' },\n );\n\n clack.log.success(\n `Created ${chalk.cyan(\n path.join(...pagesLocation, 'api', 'sentry-example-api.js'),\n )}.`,\n );\n }\n}\n\n/**\n * Ask users if they want to set the tunnelRoute option.\n * We can't set this by default because it potentially increases hosting bills.\n * It's valuable enough to for users to justify asking the additional question.\n */\nasync function askShouldSetTunnelRoute() {\n return await traceStep('ask-tunnelRoute-option', async () => {\n const shouldSetTunnelRoute = await abortIfCancelled(\n clack.select({\n message:\n 'Do you want to route Sentry requests in the browser through your NextJS server to avoid ad blockers?',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'Can increase your server load and hosting bill',\n },\n {\n label: 'No',\n value: false,\n hint: 'Browser errors and events might be blocked by ad blockers before being sent to Sentry',\n },\n ],\n initialValue: false,\n }),\n );\n\n if (!shouldSetTunnelRoute) {\n clack.log.info(\n \"Sounds good! We'll leave the option commented for later, just in case :)\",\n );\n }\n\n return shouldSetTunnelRoute;\n });\n}\n"]}
@@ -2,17 +2,17 @@ type WithSentryConfigOptions = {
2
2
  orgSlug: string;
3
3
  projectSlug: string;
4
4
  selfHosted: boolean;
5
- url: string;
5
+ sentryUrl: string;
6
6
  tunnelRoute: boolean;
7
7
  };
8
- export declare function getWithSentryConfigOptionsTemplate({ orgSlug, projectSlug, selfHosted, tunnelRoute, url, }: WithSentryConfigOptions): string;
8
+ export declare function getWithSentryConfigOptionsTemplate({ orgSlug, projectSlug, selfHosted, tunnelRoute, sentryUrl, }: WithSentryConfigOptions): string;
9
9
  export declare function getNextjsConfigCjsTemplate(withSentryConfigOptionsTemplate: string): string;
10
10
  export declare function getNextjsConfigCjsAppendix(withSentryConfigOptionsTemplate: string): string;
11
11
  export declare function getNextjsConfigEsmCopyPasteSnippet(withSentryConfigOptionsTemplate: string): string;
12
12
  export declare function getSentryConfigContents(dsn: string, config: 'server' | 'client' | 'edge'): string;
13
13
  export declare function getSentryExamplePageContents(options: {
14
14
  selfHosted: boolean;
15
- url: string;
15
+ sentryUrl: string;
16
16
  orgSlug: string;
17
17
  projectId: string;
18
18
  useClient: boolean;
@@ -7,8 +7,8 @@ exports.getGlobalErrorCopyPasteSnippet = exports.getSentryDefaultGlobalErrorPage
7
7
  var chalk_1 = __importDefault(require("chalk"));
8
8
  var clack_utils_1 = require("../utils/clack-utils");
9
9
  function getWithSentryConfigOptionsTemplate(_a) {
10
- var orgSlug = _a.orgSlug, projectSlug = _a.projectSlug, selfHosted = _a.selfHosted, tunnelRoute = _a.tunnelRoute, url = _a.url;
11
- return "{\n // For all available options, see:\n // https://github.com/getsentry/sentry-webpack-plugin#options\n\n org: \"".concat(orgSlug, "\",\n project: \"").concat(projectSlug, "\",").concat(selfHosted ? "\n url: \"".concat(url, "\"") : '', "\n\n // Only print logs for uploading source maps in CI\n silent: !process.env.CI,\n\n // For all available options, see:\n // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/\n\n // Upload a larger set of source maps for prettier stack traces (increases build time)\n widenClientFileUpload: true,\n\n // ").concat(tunnelRoute ? 'Route' : 'Uncomment to route', " browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers.\n // This can increase your server load as well as your hosting bill.\n // Note: Check that the configured route will not match with your Next.js middleware, otherwise reporting of client-\n // side errors will fail.\n ").concat(tunnelRoute ? '' : '// ', "tunnelRoute: \"/monitoring\",\n\n // Hides source maps from generated client bundles\n hideSourceMaps: true,\n\n // Automatically tree-shake Sentry logger statements to reduce bundle size\n disableLogger: true,\n\n // Enables automatic instrumentation of Vercel Cron Monitors. (Does not yet work with App Router route handlers.)\n // See the following for more information:\n // https://docs.sentry.io/product/crons/\n // https://vercel.com/docs/cron-jobs\n automaticVercelMonitors: true,\n }");
10
+ var orgSlug = _a.orgSlug, projectSlug = _a.projectSlug, selfHosted = _a.selfHosted, tunnelRoute = _a.tunnelRoute, sentryUrl = _a.sentryUrl;
11
+ return "{\n // For all available options, see:\n // https://github.com/getsentry/sentry-webpack-plugin#options\n\n org: \"".concat(orgSlug, "\",\n project: \"").concat(projectSlug, "\",").concat(selfHosted ? "\n sentryUrl: \"".concat(sentryUrl, "\"") : '', "\n\n // Only print logs for uploading source maps in CI\n silent: !process.env.CI,\n\n // For all available options, see:\n // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/\n\n // Upload a larger set of source maps for prettier stack traces (increases build time)\n widenClientFileUpload: true,\n\n // ").concat(tunnelRoute ? 'Route' : 'Uncomment to route', " browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers.\n // This can increase your server load as well as your hosting bill.\n // Note: Check that the configured route will not match with your Next.js middleware, otherwise reporting of client-\n // side errors will fail.\n ").concat(tunnelRoute ? '' : '// ', "tunnelRoute: \"/monitoring\",\n\n // Hides source maps from generated client bundles\n hideSourceMaps: true,\n\n // Automatically tree-shake Sentry logger statements to reduce bundle size\n disableLogger: true,\n\n // Enables automatic instrumentation of Vercel Cron Monitors. (Does not yet work with App Router route handlers.)\n // See the following for more information:\n // https://docs.sentry.io/product/crons/\n // https://vercel.com/docs/cron-jobs\n automaticVercelMonitors: true,\n }");
12
12
  }
13
13
  exports.getWithSentryConfigOptionsTemplate = getWithSentryConfigOptionsTemplate;
14
14
  function getNextjsConfigCjsTemplate(withSentryConfigOptionsTemplate) {
@@ -48,7 +48,7 @@ function getSentryConfigContents(dsn, config) {
48
48
  exports.getSentryConfigContents = getSentryConfigContents;
49
49
  function getSentryExamplePageContents(options) {
50
50
  var issuesPageLink = options.selfHosted
51
- ? "".concat(options.url, "organizations/").concat(options.orgSlug, "/issues/?project=").concat(options.projectId)
51
+ ? "".concat(options.sentryUrl, "organizations/").concat(options.orgSlug, "/issues/?project=").concat(options.projectId)
52
52
  : "https://".concat(options.orgSlug, ".sentry.io/issues/?project=").concat(options.projectId);
53
53
  return "".concat(options.useClient ? '"use client";\n\n' : '', "import Head from \"next/head\";\nimport * as Sentry from \"@sentry/nextjs\";\n\nexport default function Page() {\n return (\n <div>\n <Head>\n <title>Sentry Onboarding</title>\n <meta name=\"description\" content=\"Test Sentry for your Next.js app!\" />\n </Head>\n\n <main\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <h1 style={{ fontSize: \"4rem\", margin: \"14px 0\" }}>\n <svg\n style={{\n height: \"1em\",\n }}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 200 44\"\n >\n <path\n fill=\"currentColor\"\n d=\"M124.32,28.28,109.56,9.22h-3.68V34.77h3.73V15.19l15.18,19.58h3.26V9.22h-3.73ZM87.15,23.54h13.23V20.22H87.14V12.53h14.93V9.21H83.34V34.77h18.92V31.45H87.14ZM71.59,20.3h0C66.44,19.06,65,18.08,65,15.7c0-2.14,1.89-3.59,4.71-3.59a12.06,12.06,0,0,1,7.07,2.55l2-2.83a14.1,14.1,0,0,0-9-3c-5.06,0-8.59,3-8.59,7.27,0,4.6,3,6.19,8.46,7.52C74.51,24.74,76,25.78,76,28.11s-2,3.77-5.09,3.77a12.34,12.34,0,0,1-8.3-3.26l-2.25,2.69a15.94,15.94,0,0,0,10.42,3.85c5.48,0,9-2.95,9-7.51C79.75,23.79,77.47,21.72,71.59,20.3ZM195.7,9.22l-7.69,12-7.64-12h-4.46L186,24.67V34.78h3.84V24.55L200,9.22Zm-64.63,3.46h8.37v22.1h3.84V12.68h8.37V9.22H131.08ZM169.41,24.8c3.86-1.07,6-3.77,6-7.63,0-4.91-3.59-8-9.38-8H154.67V34.76h3.8V25.58h6.45l6.48,9.2h4.44l-7-9.82Zm-10.95-2.5V12.6h7.17c3.74,0,5.88,1.77,5.88,4.84s-2.29,4.86-5.84,4.86Z M29,2.26a4.67,4.67,0,0,0-8,0L14.42,13.53A32.21,32.21,0,0,1,32.17,40.19H27.55A27.68,27.68,0,0,0,12.09,17.47L6,28a15.92,15.92,0,0,1,9.23,12.17H4.62A.76.76,0,0,1,4,39.06l2.94-5a10.74,10.74,0,0,0-3.36-1.9l-2.91,5a4.54,4.54,0,0,0,1.69,6.24A4.66,4.66,0,0,0,4.62,44H19.15a19.4,19.4,0,0,0-8-17.31l2.31-4A23.87,23.87,0,0,1,23.76,44H36.07a35.88,35.88,0,0,0-16.41-31.8l4.67-8a.77.77,0,0,1,1.05-.27c.53.29,20.29,34.77,20.66,35.17a.76.76,0,0,1-.68,1.13H40.6q.09,1.91,0,3.81h4.78A4.59,4.59,0,0,0,50,39.43a4.49,4.49,0,0,0-.62-2.28Z\"\n ></path>\n </svg>\n </h1>\n\n <p>Get started by sending us a sample error:</p>\n <button\n type=\"button\"\n style={{\n padding: \"12px\",\n cursor: \"pointer\",\n backgroundColor: \"#AD6CAA\",\n borderRadius: \"4px\",\n border: \"none\",\n color: \"white\",\n fontSize: \"14px\",\n margin: \"18px\",\n }}\n onClick={async () => {\n await Sentry.startSpan({\n name: 'Example Frontend Span',\n op: 'test'\n }, async () => {\n const res = await fetch(\"/api/sentry-example-api\");\n if (!res.ok) {\n throw new Error(\"Sentry Example Frontend Error\");\n }\n });\n }}\n >\n Throw error!\n </button>\n\n <p>\n Next, look for the error on the{\" \"}\n <a href=\"").concat(issuesPageLink, "\">Issues Page</a>.\n </p>\n <p style={{ marginTop: \"24px\" }}>\n For more information, see{\" \"}\n <a href=\"https://docs.sentry.io/platforms/javascript/guides/nextjs/\">\n https://docs.sentry.io/platforms/javascript/guides/nextjs/\n </a>\n </p>\n </main>\n </div>\n );\n}\n");
54
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/nextjs/templates.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { makeCodeSnippet } from '../utils/clack-utils';\n\ntype WithSentryConfigOptions = {\n orgSlug: string;\n projectSlug: string;\n selfHosted: boolean;\n url: string;\n tunnelRoute: boolean;\n};\n\nexport function getWithSentryConfigOptionsTemplate({\n orgSlug,\n projectSlug,\n selfHosted,\n tunnelRoute,\n url,\n}: WithSentryConfigOptions): string {\n return `{\n // For all available options, see:\n // https://github.com/getsentry/sentry-webpack-plugin#options\n\n org: \"${orgSlug}\",\n project: \"${projectSlug}\",${selfHosted ? `\\n url: \"${url}\"` : ''}\n\n // Only print logs for uploading source maps in CI\n silent: !process.env.CI,\n\n // For all available options, see:\n // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/\n\n // Upload a larger set of source maps for prettier stack traces (increases build time)\n widenClientFileUpload: true,\n\n // ${\n tunnelRoute ? 'Route' : 'Uncomment to route'\n } browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers.\n // This can increase your server load as well as your hosting bill.\n // Note: Check that the configured route will not match with your Next.js middleware, otherwise reporting of client-\n // side errors will fail.\n ${tunnelRoute ? '' : '// '}tunnelRoute: \"/monitoring\",\n\n // Hides source maps from generated client bundles\n hideSourceMaps: true,\n\n // Automatically tree-shake Sentry logger statements to reduce bundle size\n disableLogger: true,\n\n // Enables automatic instrumentation of Vercel Cron Monitors. (Does not yet work with App Router route handlers.)\n // See the following for more information:\n // https://docs.sentry.io/product/crons/\n // https://vercel.com/docs/cron-jobs\n automaticVercelMonitors: true,\n }`;\n}\n\nexport function getNextjsConfigCjsTemplate(\n withSentryConfigOptionsTemplate: string,\n): string {\n return `const { withSentryConfig } = require(\"@sentry/nextjs\");\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {};\n\nmodule.exports = withSentryConfig(\n nextConfig,\n ${withSentryConfigOptionsTemplate}\n);\n`;\n}\n\nexport function getNextjsConfigCjsAppendix(\n withSentryConfigOptionsTemplate: string,\n): string {\n return `\n\n// Injected content via Sentry wizard below\n\nconst { withSentryConfig } = require(\"@sentry/nextjs\");\n\nmodule.exports = withSentryConfig(\n module.exports,\n ${withSentryConfigOptionsTemplate}\n);\n`;\n}\n\nexport function getNextjsConfigEsmCopyPasteSnippet(\n withSentryConfigOptionsTemplate: string,\n): string {\n return `\n\n// next.config.mjs\nimport { withSentryConfig } from \"@sentry/nextjs\";\n\nexport default withSentryConfig(\n yourNextConfig,\n ${withSentryConfigOptionsTemplate}\n);\n`;\n}\n\nexport function getSentryConfigContents(\n dsn: string,\n config: 'server' | 'client' | 'edge',\n): string {\n let primer;\n if (config === 'server') {\n primer = `// This file configures the initialization of Sentry on the server.\n// The config you add here will be used whenever the server handles a request.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n } else if (config === 'client') {\n primer = `// This file configures the initialization of Sentry on the client.\n// The config you add here will be used whenever a users loads a page in their browser.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n } else if (config === 'edge') {\n primer = `// This file configures the initialization of Sentry for edge features (middleware, edge routes, and so on).\n// The config you add here will be used whenever one of the edge features is loaded.\n// Note that this config is unrelated to the Vercel Edge Runtime and is also required when running locally.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n }\n\n let additionalOptions = '';\n if (config === 'client') {\n additionalOptions = `\n\n replaysOnErrorSampleRate: 1.0,\n\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 // You can remove this option if you're not planning to use the Sentry Session Replay feature:\n integrations: [\n Sentry.replayIntegration({\n // Additional Replay configuration goes in here, for example:\n maskAllText: true,\n blockAllMedia: true,\n }),\n ],`;\n }\n\n let spotlightOption = '';\n if (config === 'server') {\n spotlightOption = `\n\n // Uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // spotlight: process.env.NODE_ENV === 'development',\n `;\n }\n\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return `${primer}\n\nimport * as Sentry from \"@sentry/nextjs\";\n\nSentry.init({\n dsn: \"${dsn}\",\n\n // Adjust this value in production, or use tracesSampler for greater control\n tracesSampleRate: 1,\n\n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,${additionalOptions}${spotlightOption}\n});\n`;\n}\n\nexport function getSentryExamplePageContents(options: {\n selfHosted: boolean;\n url: string;\n orgSlug: string;\n projectId: string;\n useClient: boolean;\n}): string {\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 `${\n options.useClient ? '\"use client\";\\n\\n' : ''\n }import Head from \"next/head\";\nimport * as Sentry from \"@sentry/nextjs\";\n\nexport default function Page() {\n return (\n <div>\n <Head>\n <title>Sentry Onboarding</title>\n <meta name=\"description\" content=\"Test Sentry for your Next.js app!\" />\n </Head>\n\n <main\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <h1 style={{ fontSize: \"4rem\", margin: \"14px 0\" }}>\n <svg\n style={{\n height: \"1em\",\n }}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 200 44\"\n >\n <path\n fill=\"currentColor\"\n d=\"M124.32,28.28,109.56,9.22h-3.68V34.77h3.73V15.19l15.18,19.58h3.26V9.22h-3.73ZM87.15,23.54h13.23V20.22H87.14V12.53h14.93V9.21H83.34V34.77h18.92V31.45H87.14ZM71.59,20.3h0C66.44,19.06,65,18.08,65,15.7c0-2.14,1.89-3.59,4.71-3.59a12.06,12.06,0,0,1,7.07,2.55l2-2.83a14.1,14.1,0,0,0-9-3c-5.06,0-8.59,3-8.59,7.27,0,4.6,3,6.19,8.46,7.52C74.51,24.74,76,25.78,76,28.11s-2,3.77-5.09,3.77a12.34,12.34,0,0,1-8.3-3.26l-2.25,2.69a15.94,15.94,0,0,0,10.42,3.85c5.48,0,9-2.95,9-7.51C79.75,23.79,77.47,21.72,71.59,20.3ZM195.7,9.22l-7.69,12-7.64-12h-4.46L186,24.67V34.78h3.84V24.55L200,9.22Zm-64.63,3.46h8.37v22.1h3.84V12.68h8.37V9.22H131.08ZM169.41,24.8c3.86-1.07,6-3.77,6-7.63,0-4.91-3.59-8-9.38-8H154.67V34.76h3.8V25.58h6.45l6.48,9.2h4.44l-7-9.82Zm-10.95-2.5V12.6h7.17c3.74,0,5.88,1.77,5.88,4.84s-2.29,4.86-5.84,4.86Z M29,2.26a4.67,4.67,0,0,0-8,0L14.42,13.53A32.21,32.21,0,0,1,32.17,40.19H27.55A27.68,27.68,0,0,0,12.09,17.47L6,28a15.92,15.92,0,0,1,9.23,12.17H4.62A.76.76,0,0,1,4,39.06l2.94-5a10.74,10.74,0,0,0-3.36-1.9l-2.91,5a4.54,4.54,0,0,0,1.69,6.24A4.66,4.66,0,0,0,4.62,44H19.15a19.4,19.4,0,0,0-8-17.31l2.31-4A23.87,23.87,0,0,1,23.76,44H36.07a35.88,35.88,0,0,0-16.41-31.8l4.67-8a.77.77,0,0,1,1.05-.27c.53.29,20.29,34.77,20.66,35.17a.76.76,0,0,1-.68,1.13H40.6q.09,1.91,0,3.81h4.78A4.59,4.59,0,0,0,50,39.43a4.49,4.49,0,0,0-.62-2.28Z\"\n ></path>\n </svg>\n </h1>\n\n <p>Get started by sending us a sample error:</p>\n <button\n type=\"button\"\n style={{\n padding: \"12px\",\n cursor: \"pointer\",\n backgroundColor: \"#AD6CAA\",\n borderRadius: \"4px\",\n border: \"none\",\n color: \"white\",\n fontSize: \"14px\",\n margin: \"18px\",\n }}\n onClick={async () => {\n await Sentry.startSpan({\n name: 'Example Frontend Span',\n op: 'test'\n }, async () => {\n const res = await fetch(\"/api/sentry-example-api\");\n if (!res.ok) {\n throw new Error(\"Sentry Example Frontend Error\");\n }\n });\n }}\n >\n Throw error!\n </button>\n\n <p>\n Next, look for the error on the{\" \"}\n <a href=\"${issuesPageLink}\">Issues Page</a>.\n </p>\n <p style={{ marginTop: \"24px\" }}>\n For more information, see{\" \"}\n <a href=\"https://docs.sentry.io/platforms/javascript/guides/nextjs/\">\n https://docs.sentry.io/platforms/javascript/guides/nextjs/\n </a>\n </p>\n </main>\n </div>\n );\n}\n`;\n}\n\nexport function getSentryExampleApiRoute() {\n return `// A faulty API route to test Sentry's error monitoring\nexport default function handler(_req, res) {\n throw new Error(\"Sentry Example API Route Error\");\n res.status(200).json({ name: \"John Doe\" });\n}\n`;\n}\n\nexport function getSentryExampleAppDirApiRoute() {\n return `import { NextResponse } from \"next/server\";\n\nexport const dynamic = \"force-dynamic\";\n\n// A faulty API route to test Sentry's error monitoring\nexport function GET() {\n throw new Error(\"Sentry Example API Route Error\");\n return NextResponse.json({ data: \"Testing Sentry Error...\" });\n}\n`;\n}\n\nexport function getSentryDefaultUnderscoreErrorPage() {\n return `import * as Sentry from \"@sentry/nextjs\";\nimport Error from \"next/error\";\n\nconst CustomErrorComponent = (props) => {\n return <Error statusCode={props.statusCode} />;\n};\n\nCustomErrorComponent.getInitialProps = async (contextData) => {\n // In case this is running in a serverless function, await this in order to give Sentry\n // time to send the error before the lambda exits\n await Sentry.captureUnderscoreErrorException(contextData);\n\n // This will contain the status code of the response\n return Error.getInitialProps(contextData);\n};\n\nexport default CustomErrorComponent;\n`;\n}\n\nexport function getSimpleUnderscoreErrorCopyPasteSnippet() {\n return `\n${chalk.green(`import * as Sentry from '@sentry/nextjs';`)}\n\n${chalk.dim(\n '// Replace \"YourCustomErrorComponent\" with your custom error component!',\n)}\nYourCustomErrorComponent.getInitialProps = async (${chalk.green(\n `contextData`,\n )}) => {\n ${chalk.green('await Sentry.captureUnderscoreErrorException(contextData);')}\n\n ${chalk.dim('// ...other getInitialProps code')}\n};\n`;\n}\n\nexport function getFullUnderscoreErrorCopyPasteSnippet(isTs: boolean) {\n return `\nimport * as Sentry from '@sentry/nextjs';${\n isTs ? '\\nimport type { NextPageContext } from \"next\";' : ''\n }\n\n${chalk.dim(\n '// Replace \"YourCustomErrorComponent\" with your custom error component!',\n)}\nYourCustomErrorComponent.getInitialProps = async (contextData${\n isTs ? ': NextPageContext' : ''\n }) => {\n await Sentry.captureUnderscoreErrorException(contextData);\n};\n`;\n}\n\nexport function getInstrumentationHookContent(\n instrumentationHookLocation: 'src' | 'root',\n) {\n return `export async function register() {\n if (process.env.NEXT_RUNTIME === 'nodejs') {\n await import('${\n instrumentationHookLocation === 'root' ? '.' : '..'\n }/sentry.server.config');\n }\n\n if (process.env.NEXT_RUNTIME === 'edge') {\n await import('${\n instrumentationHookLocation === 'root' ? '.' : '..'\n }/sentry.edge.config');\n }\n}\n`;\n}\n\nexport function getInstrumentationHookCopyPasteSnippet(\n instrumentationHookLocation: 'src' | 'root',\n) {\n return makeCodeSnippet(true, (unchanged, plus) => {\n return unchanged(`export ${plus('async')} function register() {\n ${plus(`if (process.env.NEXT_RUNTIME === 'nodejs') {\n await import('${\n instrumentationHookLocation === 'root' ? '.' : '..'\n }/sentry.server.config');\n }\n\n if (process.env.NEXT_RUNTIME === 'edge') {\n await import('${\n instrumentationHookLocation === 'root' ? '.' : '..'\n }/sentry.edge.config');\n }`)}\n}`);\n });\n}\n\nexport function getSentryDefaultGlobalErrorPage() {\n return `\"use client\";\n\nimport * as Sentry from \"@sentry/nextjs\";\nimport Error from \"next/error\";\nimport { useEffect } from \"react\";\n\nexport default function GlobalError({ error }) {\n useEffect(() => {\n Sentry.captureException(error);\n }, [error]);\n\n return (\n <html>\n <body>\n <Error />\n </body>\n </html>\n );\n}\n`;\n}\n\nexport function getGlobalErrorCopyPasteSnippet(isTs: boolean) {\n if (isTs) {\n return `\"use client\";\n\n${chalk.green('import * as Sentry from \"@sentry/nextjs\";')}\n${chalk.green('import Error from \"next/error\";')}\n${chalk.green('import { useEffect } from \"react\";')}\n\nexport default function GlobalError(${chalk.green(\n '{ error }: { error: Error }',\n )}) {\n ${chalk.green(`useEffect(() => {\n Sentry.captureException(error);\n }, [error]);`)}\n\n return (\n <html>\n <body>\n {/* Your Error component here... */}\n </body>\n </html>\n );\n}\n`;\n } else {\n return `\"use client\";\n\n${chalk.green('import * as Sentry from \"@sentry/nextjs\";')}\n${chalk.green('import Error from \"next/error\";')}\n${chalk.green('import { useEffect } from \"react\";')}\n\nexport default function GlobalError(${chalk.green('{ error }')}) {\n ${chalk.green(`useEffect(() => {\n Sentry.captureException(error);\n }, [error]);`)}\n\n return (\n <html>\n <body>\n {/* Your Error component here... */}\n </body>\n </html>\n );\n}\n`;\n }\n}\n"]}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/nextjs/templates.ts"],"names":[],"mappings":";;;;;;AAAA,gDAA0B;AAC1B,oDAAuD;AAUvD,SAAgB,kCAAkC,CAAC,EAMzB;QALxB,OAAO,aAAA,EACP,WAAW,iBAAA,EACX,UAAU,gBAAA,EACV,WAAW,iBAAA,EACX,SAAS,eAAA;IAET,OAAO,qIAIG,OAAO,iCACH,WAAW,gBACvB,UAAU,CAAC,CAAC,CAAC,6BAAqB,SAAS,OAAG,CAAC,CAAC,CAAC,EAAE,0WAajD,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,qUAK5C,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,6gBAa1B,CAAC;AACL,CAAC;AA7CD,gFA6CC;AAED,SAAgB,0BAA0B,CACxC,+BAAuC;IAEvC,OAAO,gMAOL,+BAA+B,WAElC,CAAC;AACF,CAAC;AAbD,gEAaC;AAED,SAAgB,0BAA0B,CACxC,+BAAuC;IAEvC,OAAO,mLAQL,+BAA+B,WAElC,CAAC;AACF,CAAC;AAdD,gEAcC;AAED,SAAgB,kCAAkC,CAChD,+BAAuC;IAEvC,OAAO,iJAOL,+BAA+B,WAElC,CAAC;AACF,CAAC;AAbD,gFAaC;AAED,SAAgB,uBAAuB,CACrC,GAAW,EACX,MAAoC;IAEpC,IAAI,MAAM,CAAC;IACX,IAAI,MAAM,KAAK,QAAQ,EAAE;QACvB,MAAM,GAAG,oNAEiD,CAAC;KAC5D;SAAM,IAAI,MAAM,KAAK,QAAQ,EAAE;QAC9B,MAAM,GAAG,6NAEiD,CAAC;KAC5D;SAAM,IAAI,MAAM,KAAK,MAAM,EAAE;QAC5B,MAAM,GAAG,gXAGiD,CAAC;KAC5D;IAED,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAC3B,IAAI,MAAM,KAAK,QAAQ,EAAE;QACvB,iBAAiB,GAAG,ufAenB,CAAC;KACH;IAED,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,MAAM,KAAK,QAAQ,EAAE;QACvB,eAAe,GAAG,8IAInB,CAAC;KACD;IAED,4EAA4E;IAC5E,OAAO,UAAG,MAAM,wFAKR,GAAG,4PAMI,iBAAiB,SAAG,eAAe,YAEnD,CAAC;AACF,CAAC;AAhED,0DAgEC;AAED,SAAgB,4BAA4B,CAAC,OAM5C;IACC,IAAM,cAAc,GAAG,OAAO,CAAC,UAAU;QACvC,CAAC,CAAC,UAAG,OAAO,CAAC,SAAS,2BAAiB,OAAO,CAAC,OAAO,8BAAoB,OAAO,CAAC,SAAS,CAAE;QAC7F,CAAC,CAAC,kBAAW,OAAO,CAAC,OAAO,wCAA8B,OAAO,CAAC,SAAS,CAAE,CAAC;IAEhF,OAAO,UACL,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,omGAkE3B,cAAc,8VAYlC,CAAC;AACF,CAAC;AA3FD,oEA2FC;AAED,SAAgB,wBAAwB;IACtC,OAAO,qNAKR,CAAC;AACF,CAAC;AAPD,4DAOC;AAED,SAAgB,8BAA8B;IAC5C,OAAO,iTASR,CAAC;AACF,CAAC;AAXD,wEAWC;AAED,SAAgB,mCAAmC;IACjD,OAAO,2lBAiBR,CAAC;AACF,CAAC;AAnBD,kFAmBC;AAED,SAAgB,wCAAwC;IACtD,OAAO,YACP,eAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,iBAExD,eAAK,CAAC,GAAG,CACT,yEAAyE,CAC1E,iEACmD,eAAK,CAAC,KAAK,CAC3D,aAAa,CACd,uBACC,eAAK,CAAC,KAAK,CAAC,4DAA4D,CAAC,mBAEzE,eAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,WAEhD,CAAC;AACF,CAAC;AAfD,4FAeC;AAED,SAAgB,sCAAsC,CAAC,IAAa;IAClE,OAAO,qDAEL,IAAI,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,EAAE,iBAG9D,eAAK,CAAC,GAAG,CACT,yEAAyE,CAC1E,4EAEG,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,+EAIlC,CAAC;AACF,CAAC;AAfD,wFAeC;AAED,SAAgB,6BAA6B,CAC3C,2BAA2C;IAE3C,OAAO,gHAGH,2BAA2B,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,8GAMnD,2BAA2B,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,qCAIxD,CAAC;AACF,CAAC;AAjBD,sEAiBC;AAED,SAAgB,sCAAsC,CACpD,2BAA2C;IAE3C,OAAO,IAAA,6BAAe,EAAC,IAAI,EAAE,UAAC,SAAS,EAAE,IAAI;QAC3C,OAAO,SAAS,CAAC,iBAAU,IAAI,CAAC,OAAO,CAAC,uCACxC,IAAI,CAAC,0EAEH,2BAA2B,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,8GAMnD,2BAA2B,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,gCAErD,CAAC,QACH,CAAC,CAAC;IACF,CAAC,CAAC,CAAC;AACL,CAAC;AAlBD,wFAkBC;AAED,SAAgB,+BAA+B;IAC7C,OAAO,yWAmBR,CAAC;AACF,CAAC;AArBD,0EAqBC;AAED,SAAgB,8BAA8B,CAAC,IAAa;IAC1D,IAAI,IAAI,EAAE;QACR,OAAO,6BAET,eAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,eACxD,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,eAC9C,eAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,qDAEb,eAAK,CAAC,KAAK,CAC3C,6BAA6B,CAC9B,oBACD,eAAK,CAAC,KAAK,CAAC,wEAED,CAAC,kIAUf,CAAC;KACC;SAAM;QACL,OAAO,6BAET,eAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,eACxD,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,eAC9C,eAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,qDAEb,eAAK,CAAC,KAAK,CAAC,WAAW,CAAC,oBAC1D,eAAK,CAAC,KAAK,CAAC,wEAED,CAAC,kIAUf,CAAC;KACC;AACH,CAAC;AA9CD,wEA8CC","sourcesContent":["import chalk from 'chalk';\nimport { makeCodeSnippet } from '../utils/clack-utils';\n\ntype WithSentryConfigOptions = {\n orgSlug: string;\n projectSlug: string;\n selfHosted: boolean;\n sentryUrl: string;\n tunnelRoute: boolean;\n};\n\nexport function getWithSentryConfigOptionsTemplate({\n orgSlug,\n projectSlug,\n selfHosted,\n tunnelRoute,\n sentryUrl,\n}: WithSentryConfigOptions): string {\n return `{\n // For all available options, see:\n // https://github.com/getsentry/sentry-webpack-plugin#options\n\n org: \"${orgSlug}\",\n project: \"${projectSlug}\",${\n selfHosted ? `\\n sentryUrl: \"${sentryUrl}\"` : ''\n }\n\n // Only print logs for uploading source maps in CI\n silent: !process.env.CI,\n\n // For all available options, see:\n // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/\n\n // Upload a larger set of source maps for prettier stack traces (increases build time)\n widenClientFileUpload: true,\n\n // ${\n tunnelRoute ? 'Route' : 'Uncomment to route'\n } browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers.\n // This can increase your server load as well as your hosting bill.\n // Note: Check that the configured route will not match with your Next.js middleware, otherwise reporting of client-\n // side errors will fail.\n ${tunnelRoute ? '' : '// '}tunnelRoute: \"/monitoring\",\n\n // Hides source maps from generated client bundles\n hideSourceMaps: true,\n\n // Automatically tree-shake Sentry logger statements to reduce bundle size\n disableLogger: true,\n\n // Enables automatic instrumentation of Vercel Cron Monitors. (Does not yet work with App Router route handlers.)\n // See the following for more information:\n // https://docs.sentry.io/product/crons/\n // https://vercel.com/docs/cron-jobs\n automaticVercelMonitors: true,\n }`;\n}\n\nexport function getNextjsConfigCjsTemplate(\n withSentryConfigOptionsTemplate: string,\n): string {\n return `const { withSentryConfig } = require(\"@sentry/nextjs\");\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {};\n\nmodule.exports = withSentryConfig(\n nextConfig,\n ${withSentryConfigOptionsTemplate}\n);\n`;\n}\n\nexport function getNextjsConfigCjsAppendix(\n withSentryConfigOptionsTemplate: string,\n): string {\n return `\n\n// Injected content via Sentry wizard below\n\nconst { withSentryConfig } = require(\"@sentry/nextjs\");\n\nmodule.exports = withSentryConfig(\n module.exports,\n ${withSentryConfigOptionsTemplate}\n);\n`;\n}\n\nexport function getNextjsConfigEsmCopyPasteSnippet(\n withSentryConfigOptionsTemplate: string,\n): string {\n return `\n\n// next.config.mjs\nimport { withSentryConfig } from \"@sentry/nextjs\";\n\nexport default withSentryConfig(\n yourNextConfig,\n ${withSentryConfigOptionsTemplate}\n);\n`;\n}\n\nexport function getSentryConfigContents(\n dsn: string,\n config: 'server' | 'client' | 'edge',\n): string {\n let primer;\n if (config === 'server') {\n primer = `// This file configures the initialization of Sentry on the server.\n// The config you add here will be used whenever the server handles a request.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n } else if (config === 'client') {\n primer = `// This file configures the initialization of Sentry on the client.\n// The config you add here will be used whenever a users loads a page in their browser.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n } else if (config === 'edge') {\n primer = `// This file configures the initialization of Sentry for edge features (middleware, edge routes, and so on).\n// The config you add here will be used whenever one of the edge features is loaded.\n// Note that this config is unrelated to the Vercel Edge Runtime and is also required when running locally.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n }\n\n let additionalOptions = '';\n if (config === 'client') {\n additionalOptions = `\n\n replaysOnErrorSampleRate: 1.0,\n\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 // You can remove this option if you're not planning to use the Sentry Session Replay feature:\n integrations: [\n Sentry.replayIntegration({\n // Additional Replay configuration goes in here, for example:\n maskAllText: true,\n blockAllMedia: true,\n }),\n ],`;\n }\n\n let spotlightOption = '';\n if (config === 'server') {\n spotlightOption = `\n\n // Uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // spotlight: process.env.NODE_ENV === 'development',\n `;\n }\n\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return `${primer}\n\nimport * as Sentry from \"@sentry/nextjs\";\n\nSentry.init({\n dsn: \"${dsn}\",\n\n // Adjust this value in production, or use tracesSampler for greater control\n tracesSampleRate: 1,\n\n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,${additionalOptions}${spotlightOption}\n});\n`;\n}\n\nexport function getSentryExamplePageContents(options: {\n selfHosted: boolean;\n sentryUrl: string;\n orgSlug: string;\n projectId: string;\n useClient: boolean;\n}): string {\n const issuesPageLink = options.selfHosted\n ? `${options.sentryUrl}organizations/${options.orgSlug}/issues/?project=${options.projectId}`\n : `https://${options.orgSlug}.sentry.io/issues/?project=${options.projectId}`;\n\n return `${\n options.useClient ? '\"use client\";\\n\\n' : ''\n }import Head from \"next/head\";\nimport * as Sentry from \"@sentry/nextjs\";\n\nexport default function Page() {\n return (\n <div>\n <Head>\n <title>Sentry Onboarding</title>\n <meta name=\"description\" content=\"Test Sentry for your Next.js app!\" />\n </Head>\n\n <main\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <h1 style={{ fontSize: \"4rem\", margin: \"14px 0\" }}>\n <svg\n style={{\n height: \"1em\",\n }}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 200 44\"\n >\n <path\n fill=\"currentColor\"\n d=\"M124.32,28.28,109.56,9.22h-3.68V34.77h3.73V15.19l15.18,19.58h3.26V9.22h-3.73ZM87.15,23.54h13.23V20.22H87.14V12.53h14.93V9.21H83.34V34.77h18.92V31.45H87.14ZM71.59,20.3h0C66.44,19.06,65,18.08,65,15.7c0-2.14,1.89-3.59,4.71-3.59a12.06,12.06,0,0,1,7.07,2.55l2-2.83a14.1,14.1,0,0,0-9-3c-5.06,0-8.59,3-8.59,7.27,0,4.6,3,6.19,8.46,7.52C74.51,24.74,76,25.78,76,28.11s-2,3.77-5.09,3.77a12.34,12.34,0,0,1-8.3-3.26l-2.25,2.69a15.94,15.94,0,0,0,10.42,3.85c5.48,0,9-2.95,9-7.51C79.75,23.79,77.47,21.72,71.59,20.3ZM195.7,9.22l-7.69,12-7.64-12h-4.46L186,24.67V34.78h3.84V24.55L200,9.22Zm-64.63,3.46h8.37v22.1h3.84V12.68h8.37V9.22H131.08ZM169.41,24.8c3.86-1.07,6-3.77,6-7.63,0-4.91-3.59-8-9.38-8H154.67V34.76h3.8V25.58h6.45l6.48,9.2h4.44l-7-9.82Zm-10.95-2.5V12.6h7.17c3.74,0,5.88,1.77,5.88,4.84s-2.29,4.86-5.84,4.86Z M29,2.26a4.67,4.67,0,0,0-8,0L14.42,13.53A32.21,32.21,0,0,1,32.17,40.19H27.55A27.68,27.68,0,0,0,12.09,17.47L6,28a15.92,15.92,0,0,1,9.23,12.17H4.62A.76.76,0,0,1,4,39.06l2.94-5a10.74,10.74,0,0,0-3.36-1.9l-2.91,5a4.54,4.54,0,0,0,1.69,6.24A4.66,4.66,0,0,0,4.62,44H19.15a19.4,19.4,0,0,0-8-17.31l2.31-4A23.87,23.87,0,0,1,23.76,44H36.07a35.88,35.88,0,0,0-16.41-31.8l4.67-8a.77.77,0,0,1,1.05-.27c.53.29,20.29,34.77,20.66,35.17a.76.76,0,0,1-.68,1.13H40.6q.09,1.91,0,3.81h4.78A4.59,4.59,0,0,0,50,39.43a4.49,4.49,0,0,0-.62-2.28Z\"\n ></path>\n </svg>\n </h1>\n\n <p>Get started by sending us a sample error:</p>\n <button\n type=\"button\"\n style={{\n padding: \"12px\",\n cursor: \"pointer\",\n backgroundColor: \"#AD6CAA\",\n borderRadius: \"4px\",\n border: \"none\",\n color: \"white\",\n fontSize: \"14px\",\n margin: \"18px\",\n }}\n onClick={async () => {\n await Sentry.startSpan({\n name: 'Example Frontend Span',\n op: 'test'\n }, async () => {\n const res = await fetch(\"/api/sentry-example-api\");\n if (!res.ok) {\n throw new Error(\"Sentry Example Frontend Error\");\n }\n });\n }}\n >\n Throw error!\n </button>\n\n <p>\n Next, look for the error on the{\" \"}\n <a href=\"${issuesPageLink}\">Issues Page</a>.\n </p>\n <p style={{ marginTop: \"24px\" }}>\n For more information, see{\" \"}\n <a href=\"https://docs.sentry.io/platforms/javascript/guides/nextjs/\">\n https://docs.sentry.io/platforms/javascript/guides/nextjs/\n </a>\n </p>\n </main>\n </div>\n );\n}\n`;\n}\n\nexport function getSentryExampleApiRoute() {\n return `// A faulty API route to test Sentry's error monitoring\nexport default function handler(_req, res) {\n throw new Error(\"Sentry Example API Route Error\");\n res.status(200).json({ name: \"John Doe\" });\n}\n`;\n}\n\nexport function getSentryExampleAppDirApiRoute() {\n return `import { NextResponse } from \"next/server\";\n\nexport const dynamic = \"force-dynamic\";\n\n// A faulty API route to test Sentry's error monitoring\nexport function GET() {\n throw new Error(\"Sentry Example API Route Error\");\n return NextResponse.json({ data: \"Testing Sentry Error...\" });\n}\n`;\n}\n\nexport function getSentryDefaultUnderscoreErrorPage() {\n return `import * as Sentry from \"@sentry/nextjs\";\nimport Error from \"next/error\";\n\nconst CustomErrorComponent = (props) => {\n return <Error statusCode={props.statusCode} />;\n};\n\nCustomErrorComponent.getInitialProps = async (contextData) => {\n // In case this is running in a serverless function, await this in order to give Sentry\n // time to send the error before the lambda exits\n await Sentry.captureUnderscoreErrorException(contextData);\n\n // This will contain the status code of the response\n return Error.getInitialProps(contextData);\n};\n\nexport default CustomErrorComponent;\n`;\n}\n\nexport function getSimpleUnderscoreErrorCopyPasteSnippet() {\n return `\n${chalk.green(`import * as Sentry from '@sentry/nextjs';`)}\n\n${chalk.dim(\n '// Replace \"YourCustomErrorComponent\" with your custom error component!',\n)}\nYourCustomErrorComponent.getInitialProps = async (${chalk.green(\n `contextData`,\n )}) => {\n ${chalk.green('await Sentry.captureUnderscoreErrorException(contextData);')}\n\n ${chalk.dim('// ...other getInitialProps code')}\n};\n`;\n}\n\nexport function getFullUnderscoreErrorCopyPasteSnippet(isTs: boolean) {\n return `\nimport * as Sentry from '@sentry/nextjs';${\n isTs ? '\\nimport type { NextPageContext } from \"next\";' : ''\n }\n\n${chalk.dim(\n '// Replace \"YourCustomErrorComponent\" with your custom error component!',\n)}\nYourCustomErrorComponent.getInitialProps = async (contextData${\n isTs ? ': NextPageContext' : ''\n }) => {\n await Sentry.captureUnderscoreErrorException(contextData);\n};\n`;\n}\n\nexport function getInstrumentationHookContent(\n instrumentationHookLocation: 'src' | 'root',\n) {\n return `export async function register() {\n if (process.env.NEXT_RUNTIME === 'nodejs') {\n await import('${\n instrumentationHookLocation === 'root' ? '.' : '..'\n }/sentry.server.config');\n }\n\n if (process.env.NEXT_RUNTIME === 'edge') {\n await import('${\n instrumentationHookLocation === 'root' ? '.' : '..'\n }/sentry.edge.config');\n }\n}\n`;\n}\n\nexport function getInstrumentationHookCopyPasteSnippet(\n instrumentationHookLocation: 'src' | 'root',\n) {\n return makeCodeSnippet(true, (unchanged, plus) => {\n return unchanged(`export ${plus('async')} function register() {\n ${plus(`if (process.env.NEXT_RUNTIME === 'nodejs') {\n await import('${\n instrumentationHookLocation === 'root' ? '.' : '..'\n }/sentry.server.config');\n }\n\n if (process.env.NEXT_RUNTIME === 'edge') {\n await import('${\n instrumentationHookLocation === 'root' ? '.' : '..'\n }/sentry.edge.config');\n }`)}\n}`);\n });\n}\n\nexport function getSentryDefaultGlobalErrorPage() {\n return `\"use client\";\n\nimport * as Sentry from \"@sentry/nextjs\";\nimport Error from \"next/error\";\nimport { useEffect } from \"react\";\n\nexport default function GlobalError({ error }) {\n useEffect(() => {\n Sentry.captureException(error);\n }, [error]);\n\n return (\n <html>\n <body>\n <Error />\n </body>\n </html>\n );\n}\n`;\n}\n\nexport function getGlobalErrorCopyPasteSnippet(isTs: boolean) {\n if (isTs) {\n return `\"use client\";\n\n${chalk.green('import * as Sentry from \"@sentry/nextjs\";')}\n${chalk.green('import Error from \"next/error\";')}\n${chalk.green('import { useEffect } from \"react\";')}\n\nexport default function GlobalError(${chalk.green(\n '{ error }: { error: Error }',\n )}) {\n ${chalk.green(`useEffect(() => {\n Sentry.captureException(error);\n }, [error]);`)}\n\n return (\n <html>\n <body>\n {/* Your Error component here... */}\n </body>\n </html>\n );\n}\n`;\n } else {\n return `\"use client\";\n\n${chalk.green('import * as Sentry from \"@sentry/nextjs\";')}\n${chalk.green('import Error from \"next/error\";')}\n${chalk.green('import { useEffect } from \"react\";')}\n\nexport default function GlobalError(${chalk.green('{ error }')}) {\n ${chalk.green(`useEffect(() => {\n Sentry.captureException(error);\n }, [error]);`)}\n\n return (\n <html>\n <body>\n {/* Your Error component here... */}\n </body>\n </html>\n );\n}\n`;\n }\n}\n"]}
@@ -19,7 +19,7 @@ function getSentryInitColoredCodeSnippet(dsn) {
19
19
  }
20
20
  exports.getSentryInitColoredCodeSnippet = getSentryInitColoredCodeSnippet;
21
21
  function getSentryInitPlainTextSnippet(dsn) {
22
- return "import * as Sentry from '@sentry/react-native';\n\nSentry.init({\n dsn: '".concat(dsn, "',\n});");
22
+ return "import * as Sentry from '@sentry/react-native';\n\nSentry.init({\n dsn: '".concat(dsn, "',\n\n // uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // enableSpotlight: __DEV__,\n});");
23
23
  }
24
24
  exports.getSentryInitPlainTextSnippet = getSentryInitPlainTextSnippet;
25
25
  //# sourceMappingURL=javascript.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/react-native/javascript.ts"],"names":[],"mappings":";;;AAAA,oDAAuD;AAEvD,SAAgB,0BAA0B,CACxC,EAAU,EACV,EAAwB;QAAtB,GAAG,SAAA;IAEL,OAAO,EAAE,CAAC,OAAO,CACf,6BAA6B,EAC7B,UAAC,KAAa,IAAK,OAAA,UAAG,KAAK,eAC7B,6BAA6B,CAAC,GAAG,CAAC,CAAE,EADf,CACe,CACnC,CAAC;AACJ,CAAC;AATD,gEASC;AAED,SAAgB,gCAAgC,CAC9C,EAAU,EACV,EAA8C;QAA5C,cAAc,oBAAA;IAEhB,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AACpC,CAAC;AALD,4EAKC;AAED,SAAgB,+BAA+B,CAAC,GAAW;IACzD,OAAO,IAAA,6BAAe,EAAC,IAAI,EAAE,UAAC,UAAU,EAAE,IAAI,EAAE,MAAM;QACpD,OAAO,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC;AAJD,0EAIC;AAED,SAAgB,6BAA6B,CAAC,GAAW;IACvD,OAAO,oFAGC,GAAG,YACT,CAAC;AACL,CAAC;AAND,sEAMC","sourcesContent":["import { makeCodeSnippet } from '../utils/clack-utils';\n\nexport function addSentryInitWithSdkImport(\n js: string,\n { dsn }: { dsn: string },\n): string {\n return js.replace(\n /^([^]*)(import\\s+[^;]*?;$)/m,\n (match: string) => `${match}\n${getSentryInitPlainTextSnippet(dsn)}`,\n );\n}\n\nexport function doesJsCodeIncludeSdkSentryImport(\n js: string,\n { sdkPackageName }: { sdkPackageName: string },\n): boolean {\n return !!js.match(sdkPackageName);\n}\n\nexport function getSentryInitColoredCodeSnippet(dsn: string) {\n return makeCodeSnippet(true, (_unchanged, plus, _minus) => {\n return plus(getSentryInitPlainTextSnippet(dsn));\n });\n}\n\nexport function getSentryInitPlainTextSnippet(dsn: string) {\n return `import * as Sentry from '@sentry/react-native';\n\nSentry.init({\n dsn: '${dsn}',\n});`;\n}\n"]}
1
+ {"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/react-native/javascript.ts"],"names":[],"mappings":";;;AAAA,oDAAuD;AAEvD,SAAgB,0BAA0B,CACxC,EAAU,EACV,EAAwB;QAAtB,GAAG,SAAA;IAEL,OAAO,EAAE,CAAC,OAAO,CACf,6BAA6B,EAC7B,UAAC,KAAa,IAAK,OAAA,UAAG,KAAK,eAC7B,6BAA6B,CAAC,GAAG,CAAC,CAAE,EADf,CACe,CACnC,CAAC;AACJ,CAAC;AATD,gEASC;AAED,SAAgB,gCAAgC,CAC9C,EAAU,EACV,EAA8C;QAA5C,cAAc,oBAAA;IAEhB,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AACpC,CAAC;AALD,4EAKC;AAED,SAAgB,+BAA+B,CAAC,GAAW;IACzD,OAAO,IAAA,6BAAe,EAAC,IAAI,EAAE,UAAC,UAAU,EAAE,IAAI,EAAE,MAAM;QACpD,OAAO,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC;AAJD,0EAIC;AAED,SAAgB,6BAA6B,CAAC,GAAW;IACvD,OAAO,oFAGC,GAAG,2HAIT,CAAC;AACL,CAAC;AATD,sEASC","sourcesContent":["import { makeCodeSnippet } from '../utils/clack-utils';\n\nexport function addSentryInitWithSdkImport(\n js: string,\n { dsn }: { dsn: string },\n): string {\n return js.replace(\n /^([^]*)(import\\s+[^;]*?;$)/m,\n (match: string) => `${match}\n${getSentryInitPlainTextSnippet(dsn)}`,\n );\n}\n\nexport function doesJsCodeIncludeSdkSentryImport(\n js: string,\n { sdkPackageName }: { sdkPackageName: string },\n): boolean {\n return !!js.match(sdkPackageName);\n}\n\nexport function getSentryInitColoredCodeSnippet(dsn: string) {\n return makeCodeSnippet(true, (_unchanged, plus, _minus) => {\n return plus(getSentryInitPlainTextSnippet(dsn));\n });\n}\n\nexport function getSentryInitPlainTextSnippet(dsn: string) {\n return `import * as Sentry from '@sentry/react-native';\n\nSentry.init({\n dsn: '${dsn}',\n\n // uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // enableSpotlight: __DEV__,\n});`;\n}\n"]}
@@ -1,13 +1,18 @@
1
+ import { ProxifiedModule } from 'magicast';
1
2
  import * as recast from 'recast';
2
3
  import x = recast.types;
3
4
  import t = x.namedTypes;
4
- export declare function patchMetroConfig(): Promise<void>;
5
+ export declare function patchMetroWithSentryConfig(): Promise<void>;
6
+ export declare function patchMetroWithSentryConfigInMemory(mod: ProxifiedModule, showInstructions: () => Promise<void>): Promise<boolean>;
7
+ export declare function patchMetroConfigWithSentrySerializer(): Promise<void>;
5
8
  export declare function unPatchMetroConfig(): Promise<void>;
6
9
  export declare function removeSentrySerializerFromMetroConfig(program: t.Program): boolean;
7
10
  export declare function removeSentryRequire(program: t.Program): boolean;
8
11
  export declare function addSentrySerializerToMetroConfig(configObj: t.ObjectExpression): boolean;
9
12
  export declare function addSentrySerializerRequireToMetroConfig(program: t.Program): boolean;
13
+ export declare function addSentryMetroRequireToMetroConfig(program: t.Program): boolean;
10
14
  /**
11
15
  * Returns value from `module.exports = value` or `const config = value`
12
16
  */
13
17
  export declare function getMetroConfigObject(program: t.Program): t.ObjectExpression | undefined;
18
+ export declare function getModuleExportsAssignmentRight(program: t.Program): t.Identifier | t.CallExpression | t.ObjectExpression | undefined;