@sentry/wizard 6.1.1 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/e2e-tests/tests/flutter.test.js +16 -2
  3. package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
  4. package/dist/e2e-tests/tests/remix.test.js +3 -2
  5. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  6. package/dist/lib/Steps/Integrations/Electron.js +4 -0
  7. package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
  8. package/dist/src/angular/angular-wizard.js +1 -1
  9. package/dist/src/angular/angular-wizard.js.map +1 -1
  10. package/dist/src/apple/apple-wizard.js +10 -0
  11. package/dist/src/apple/apple-wizard.js.map +1 -1
  12. package/dist/src/apple/code-tools.d.ts +1 -1
  13. package/dist/src/apple/code-tools.js +3 -3
  14. package/dist/src/apple/code-tools.js.map +1 -1
  15. package/dist/src/apple/inject-code-snippet.d.ts +2 -1
  16. package/dist/src/apple/inject-code-snippet.js +2 -2
  17. package/dist/src/apple/inject-code-snippet.js.map +1 -1
  18. package/dist/src/apple/templates.d.ts +2 -2
  19. package/dist/src/apple/templates.js +22 -6
  20. package/dist/src/apple/templates.js.map +1 -1
  21. package/dist/src/flutter/code-tools.d.ts +1 -0
  22. package/dist/src/flutter/code-tools.js +6 -0
  23. package/dist/src/flutter/code-tools.js.map +1 -1
  24. package/dist/src/flutter/templates.d.ts +1 -0
  25. package/dist/src/flutter/templates.js +5 -0
  26. package/dist/src/flutter/templates.js.map +1 -1
  27. package/dist/src/nextjs/nextjs-wizard.js +12 -8
  28. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  29. package/dist/src/nextjs/utils.d.ts +8 -0
  30. package/dist/src/nextjs/utils.js +36 -1
  31. package/dist/src/nextjs/utils.js.map +1 -1
  32. package/dist/src/nuxt/nuxt-wizard.js +1 -1
  33. package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
  34. package/dist/src/react-native/expo-metro.d.ts +2 -2
  35. package/dist/src/react-native/expo-metro.js +32 -27
  36. package/dist/src/react-native/expo-metro.js.map +1 -1
  37. package/dist/src/react-native/metro.d.ts +4 -4
  38. package/dist/src/react-native/metro.js +39 -17
  39. package/dist/src/react-native/metro.js.map +1 -1
  40. package/dist/src/remix/codemods/root.d.ts +1 -0
  41. package/dist/src/remix/codemods/root.js +30 -2
  42. package/dist/src/remix/codemods/root.js.map +1 -1
  43. package/dist/src/remix/remix-wizard.js +1 -1
  44. package/dist/src/remix/remix-wizard.js.map +1 -1
  45. package/dist/src/sveltekit/sveltekit-wizard.js +1 -1
  46. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  47. package/dist/src/version.d.ts +1 -1
  48. package/dist/src/version.js +1 -1
  49. package/dist/src/version.js.map +1 -1
  50. package/dist/test/apple/code-tools.test.js +62 -14
  51. package/dist/test/apple/code-tools.test.js.map +1 -1
  52. package/dist/test/apple/templates.test.js +68 -2
  53. package/dist/test/apple/templates.test.js.map +1 -1
  54. package/dist/test/flutter/code-tools.test.js +1 -0
  55. package/dist/test/flutter/code-tools.test.js.map +1 -1
  56. package/dist/test/flutter/templates.test.js +28 -1
  57. package/dist/test/flutter/templates.test.js.map +1 -1
  58. package/dist/test/nextjs/wizard-double-wrap-prevention.test.d.ts +1 -0
  59. package/dist/test/nextjs/wizard-double-wrap-prevention.test.js +266 -0
  60. package/dist/test/nextjs/wizard-double-wrap-prevention.test.js.map +1 -0
  61. package/dist/test/react-native/expo-metro.test.js +3 -3
  62. package/dist/test/react-native/expo-metro.test.js.map +1 -1
  63. package/dist/test/react-native/metro.test.js +73 -15
  64. package/dist/test/react-native/metro.test.js.map +1 -1
  65. package/dist/test/remix/root.test.js +226 -0
  66. package/dist/test/remix/root.test.js.map +1 -1
  67. package/package.json +1 -9
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.instrumentRoot = exports.wrapAppWithSentry = void 0;
29
+ exports.instrumentRoot = exports.isWithSentryAlreadyUsed = exports.wrapAppWithSentry = void 0;
30
30
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
31
31
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
32
32
  /* eslint-disable @typescript-eslint/no-unsafe-call */
@@ -70,11 +70,28 @@ function wrapAppWithSentry(rootRouteAst, rootFileName) {
70
70
  });
71
71
  }
72
72
  exports.wrapAppWithSentry = wrapAppWithSentry;
73
+ function isWithSentryAlreadyUsed(rootRouteAst) {
74
+ // Check if withSentry is called anywhere in the code
75
+ let isUsed = false;
76
+ recast.visit(rootRouteAst.$ast, {
77
+ visitCallExpression(path) {
78
+ if (path.value.callee.type === 'Identifier' &&
79
+ path.value.callee.name === 'withSentry') {
80
+ isUsed = true;
81
+ return false; // Stop traversal
82
+ }
83
+ this.traverse(path);
84
+ },
85
+ });
86
+ return isUsed;
87
+ }
88
+ exports.isWithSentryAlreadyUsed = isWithSentryAlreadyUsed;
73
89
  async function instrumentRoot(rootFileName) {
74
90
  const rootRouteAst = await (0, magicast_1.loadFile)(path.join(process.cwd(), 'app', rootFileName));
75
91
  const exportsAst = rootRouteAst.exports.$ast;
76
92
  const namedExports = exportsAst.body.filter((node) => node.type === 'ExportNamedDeclaration');
77
93
  let foundErrorBoundary = false;
94
+ const withSentryAlreadyUsed = isWithSentryAlreadyUsed(rootRouteAst);
78
95
  namedExports.forEach((namedExport) => {
79
96
  const declaration = namedExport.declaration;
80
97
  if (!declaration) {
@@ -106,6 +123,10 @@ async function instrumentRoot(rootFileName) {
106
123
  imported: 'useRouteError',
107
124
  local: 'useRouteError',
108
125
  });
126
+ // Call wrapAppWithSentry if withSentry is not already used
127
+ if (!withSentryAlreadyUsed) {
128
+ wrapAppWithSentry(rootRouteAst, rootFileName);
129
+ }
109
130
  recast.visit(rootRouteAst.$ast, {
110
131
  visitExportDefaultDeclaration(path) {
111
132
  const implementation = recast.parse(templates_1.ERROR_BOUNDARY_TEMPLATE).program
@@ -122,7 +143,10 @@ async function instrumentRoot(rootFileName) {
122
143
  imported: 'captureRemixErrorBoundaryError',
123
144
  local: 'captureRemixErrorBoundaryError',
124
145
  });
125
- wrapAppWithSentry(rootRouteAst, rootFileName);
146
+ // Call wrapAppWithSentry if withSentry is not already used
147
+ if (!withSentryAlreadyUsed) {
148
+ wrapAppWithSentry(rootRouteAst, rootFileName);
149
+ }
126
150
  recast.visit(rootRouteAst.$ast, {
127
151
  visitExportNamedDeclaration(path) {
128
152
  // Find ErrorBoundary export
@@ -161,6 +185,10 @@ async function instrumentRoot(rootFileName) {
161
185
  },
162
186
  });
163
187
  }
188
+ else if (!withSentryAlreadyUsed) {
189
+ // Even if we have Sentry content but withSentry is not used, we should still wrap the app
190
+ wrapAppWithSentry(rootRouteAst, rootFileName);
191
+ }
164
192
  await (0, magicast_1.writeFile)(rootRouteAst.$ast, path.join(process.cwd(), 'app', rootFileName));
165
193
  }
166
194
  exports.instrumentRoot = instrumentRoot;
@@ -1 +1 @@
1
- {"version":3,"file":"root.js","sourceRoot":"","sources":["../../../../src/remix/codemods/root.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+DAA+D;AAC/D,4DAA4D;AAC5D,sDAAsD;AACtD,0DAA0D;AAC1D,+CAAiC;AACjC,2CAA6B;AAI7B,uCAOkB;AAElB,4CAAuD;AACvD,oCAA4C;AAC5C,kDAA0B;AAE1B,+EAA+E;AAC/E,sDAAwC;AAExC,SAAgB,iBAAiB,CAC/B,YAA6B,EAC7B,YAAoB;IAEpB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,YAAY;KACpB,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE;QAC9B,6BAA6B,CAAC,IAAI;YAChC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,qBAAqB,EAAE;gBACzD,+DAA+D;gBAC/D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAE1C,6CAA6C;gBAC7C,MAAM,YAAY,GAAW,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,IAAc,CAAC;gBAEtE,mCAAmC;gBACnC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CACvD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,EAC9C,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CACjD,CAAC;gBAEF,4DAA4D;gBAC5D,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,CAAC;aACvC;iBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,YAAY,EAAE;gBACvD,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;gBAErD,MAAM,gBAAgB,GAAG,IAAA,uBAAY,EAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;gBAEjE,YAAY,CAAC,OAAO,CAAC,OAAO,GAAG,mBAAQ,CAAC,GAAG,CACzC,cAAc,gBAAgB,GAAG,CAClC,CAAC;aACH;iBAAM;gBACL,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,eAAK,CAAC,MAAM,CACV,uBAAuB,eAAK,CAAC,IAAI,CAC/B,YAAY,CACb,kDAAkD,eAAK,CAAC,GAAG,CAC1D,cAAc,CACf,IAAI,CACN,CACF,CAAC;aACH;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAlDD,8CAkDC;AAEM,KAAK,UAAU,cAAc,CAAC,YAAoB;IACvD,MAAM,YAAY,GAAG,MAAM,IAAA,mBAAQ,EACjC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAC9C,CAAC;IAEF,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,IAAe,CAAC;IAExD,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CACzC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,wBAAwB,CACrB,CAAC;IAE9B,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;QACnC,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;QAE5C,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO;SACR;QAED,IAAI,WAAW,CAAC,IAAI,KAAK,qBAAqB,EAAE;YAC9C,IAAI,WAAW,CAAC,EAAE,EAAE,IAAI,KAAK,eAAe,EAAE;gBAC5C,kBAAkB,GAAG,IAAI,CAAC;aAC3B;SACF;aAAM,IAAI,WAAW,CAAC,IAAI,KAAK,qBAAqB,EAAE;YACrD,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;YAE9C,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;gBACnC,+DAA+D;gBAC/D,IAAI,WAAW,CAAC,EAAE,EAAE,IAAI,KAAK,eAAe,EAAE;oBAC5C,kBAAkB,GAAG,IAAI,CAAC;iBAC3B;YACH,CAAC,CAAC,CAAC;SACJ;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kBAAkB,EAAE;QACvB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;YACxB,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,gCAAgC;YAC1C,KAAK,EAAE,gCAAgC;SACxC,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;YACxB,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,eAAe;YACzB,KAAK,EAAE,eAAe;SACvB,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE;YAC9B,6BAA6B,CAAC,IAAI;gBAChC,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,mCAAuB,CAAC,CAAC,OAAO;qBACjE,IAAI,CAAC,CAAC,CAAC,CAAC;gBAEX,IAAI,CAAC,YAAY,CACf,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,CAC/D,CAAC;gBAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;SACF,CAAC,CAAC;QACH,iFAAiF;KAClF;SAAM,IAAI,CAAC,IAAA,wBAAgB,EAAC,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE;QAC9D,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;YACxB,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,gCAAgC;YAC1C,KAAK,EAAE,gCAAgC;SACxC,CAAC,CAAC;QAEH,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAE9C,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE;YAC9B,2BAA2B,CAAC,IAAI;gBAC9B,4BAA4B;gBAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,KAAK,eAAe,EAAE;oBACxD,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;oBAEnD,IAAI,eAAe,CAAC;oBAEpB,mCAAmC;oBACnC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE;wBAChC,wBAAwB,CAAC,IAAI;4BAC3B,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;4BACvD,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC;4BAE7C,IACE,WAAW,CAAC,IAAI,KAAK,gBAAgB;gCACrC,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,EAC3C;gCACA,eAAe,GAAG,mBAAmB,CAAC,EAAE,CAAC,IAAI,CAAC;6BAC/C;4BAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBACtB,CAAC;qBACF,CAAC,CAAC;oBAEH,uFAAuF;oBACvF,0CAA0C;oBAC1C,IAAI,CAAC,eAAe,EAAE;wBACpB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;4BACxB,IAAI,EAAE,kBAAkB;4BACxB,QAAQ,EAAE,eAAe;4BACzB,KAAK,EAAE,eAAe;yBACvB,CAAC,CAAC;wBAEH,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CACpC,gCAAgC,CACjC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAElB,0CAA0C;wBAC1C,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;qBAC/D;oBAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CACnC,wCAAwC,CACzC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAElB,uDAAuD;oBACvD,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAClC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EACxC,CAAC,EACD,gBAAgB,CACjB,CAAC;iBACH;gBACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;SACF,CAAC,CAAC;KACJ;IAED,MAAM,IAAA,oBAAS,EACb,YAAY,CAAC,IAAI,EACjB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAC9C,CAAC;AACJ,CAAC;AArID,wCAqIC","sourcesContent":["/* 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/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport * as recast from 'recast';\nimport * as path from 'path';\n\nimport type { ExportNamedDeclaration, Program } from '@babel/types';\n\nimport {\n builders,\n generateCode,\n loadFile,\n ProxifiedModule,\n writeFile,\n // @ts-expect-error - magicast is ESM and TS complains about that. It works though\n} from 'magicast';\n\nimport { ERROR_BOUNDARY_TEMPLATE } from '../templates';\nimport { hasSentryContent } from '../utils';\nimport chalk from 'chalk';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\n\nexport function wrapAppWithSentry(\n rootRouteAst: ProxifiedModule,\n rootFileName: string,\n) {\n rootRouteAst.imports.$add({\n from: '@sentry/remix',\n imported: 'withSentry',\n local: 'withSentry',\n });\n\n recast.visit(rootRouteAst.$ast, {\n visitExportDefaultDeclaration(path) {\n if (path.value.declaration.type === 'FunctionDeclaration') {\n // Move the function declaration just before the default export\n path.insertBefore(path.value.declaration);\n\n // Get the name of the function to be wrapped\n const functionName: string = path.value.declaration.id.name as string;\n\n // Create the wrapped function call\n const functionCall = recast.types.builders.callExpression(\n recast.types.builders.identifier('withSentry'),\n [recast.types.builders.identifier(functionName)],\n );\n\n // Replace the default export with the wrapped function call\n path.value.declaration = functionCall;\n } else if (path.value.declaration.type === 'Identifier') {\n const rootRouteExport = rootRouteAst.exports.default;\n\n const expressionToWrap = generateCode(rootRouteExport.$ast).code;\n\n rootRouteAst.exports.default = builders.raw(\n `withSentry(${expressionToWrap})`,\n );\n } else {\n clack.log.warn(\n chalk.yellow(\n `Couldn't instrument ${chalk.bold(\n rootFileName,\n )} automatically. Wrap your default export with: ${chalk.dim(\n 'withSentry()',\n )}\\n`,\n ),\n );\n }\n\n this.traverse(path);\n },\n });\n}\n\nexport async function instrumentRoot(rootFileName: string): Promise<void> {\n const rootRouteAst = await loadFile(\n path.join(process.cwd(), 'app', rootFileName),\n );\n\n const exportsAst = rootRouteAst.exports.$ast as Program;\n\n const namedExports = exportsAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n let foundErrorBoundary = false;\n\n namedExports.forEach((namedExport) => {\n const declaration = namedExport.declaration;\n\n if (!declaration) {\n return;\n }\n\n if (declaration.type === 'FunctionDeclaration') {\n if (declaration.id?.name === 'ErrorBoundary') {\n foundErrorBoundary = true;\n }\n } else if (declaration.type === 'VariableDeclaration') {\n const declarations = declaration.declarations;\n\n declarations.forEach((declaration) => {\n // @ts-expect-error - id should always have a name in this case\n if (declaration.id?.name === 'ErrorBoundary') {\n foundErrorBoundary = true;\n }\n });\n }\n });\n\n if (!foundErrorBoundary) {\n rootRouteAst.imports.$add({\n from: '@sentry/remix',\n imported: 'captureRemixErrorBoundaryError',\n local: 'captureRemixErrorBoundaryError',\n });\n\n rootRouteAst.imports.$add({\n from: '@remix-run/react',\n imported: 'useRouteError',\n local: 'useRouteError',\n });\n\n recast.visit(rootRouteAst.$ast, {\n visitExportDefaultDeclaration(path) {\n const implementation = recast.parse(ERROR_BOUNDARY_TEMPLATE).program\n .body[0];\n\n path.insertBefore(\n recast.types.builders.exportDeclaration(false, implementation),\n );\n\n this.traverse(path);\n },\n });\n // If there is already a ErrorBoundary export, and it doesn't have Sentry content\n } else if (!hasSentryContent(rootFileName, rootRouteAst.$code)) {\n rootRouteAst.imports.$add({\n from: '@sentry/remix',\n imported: 'captureRemixErrorBoundaryError',\n local: 'captureRemixErrorBoundaryError',\n });\n\n wrapAppWithSentry(rootRouteAst, rootFileName);\n\n recast.visit(rootRouteAst.$ast, {\n visitExportNamedDeclaration(path) {\n // Find ErrorBoundary export\n if (path.value.declaration?.id?.name === 'ErrorBoundary') {\n const errorBoundaryExport = path.value.declaration;\n\n let errorIdentifier;\n\n // check if useRouteError is called\n recast.visit(errorBoundaryExport, {\n visitVariableDeclaration(path) {\n const variableDeclaration = path.value.declarations[0];\n const initializer = variableDeclaration.init;\n\n if (\n initializer.type === 'CallExpression' &&\n initializer.callee.name === 'useRouteError'\n ) {\n errorIdentifier = variableDeclaration.id.name;\n }\n\n this.traverse(path);\n },\n });\n\n // We don't have an errorIdentifier, which means useRouteError is not called / imported\n // We need to add it and capture the error\n if (!errorIdentifier) {\n rootRouteAst.imports.$add({\n from: '@remix-run/react',\n imported: 'useRouteError',\n local: 'useRouteError',\n });\n\n const useRouteErrorCall = recast.parse(\n `const error = useRouteError();`,\n ).program.body[0];\n\n // Insert at the top of ErrorBoundary body\n errorBoundaryExport.body.body.splice(0, 0, useRouteErrorCall);\n }\n\n const captureErrorCall = recast.parse(\n `captureRemixErrorBoundaryError(error);`,\n ).program.body[0];\n\n // Insert just before the the fallback page is returned\n errorBoundaryExport.body.body.splice(\n errorBoundaryExport.body.body.length - 1,\n 0,\n captureErrorCall,\n );\n }\n this.traverse(path);\n },\n });\n }\n\n await writeFile(\n rootRouteAst.$ast,\n path.join(process.cwd(), 'app', rootFileName),\n );\n}\n"]}
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../../../../src/remix/codemods/root.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+DAA+D;AAC/D,4DAA4D;AAC5D,sDAAsD;AACtD,0DAA0D;AAC1D,+CAAiC;AACjC,2CAA6B;AAI7B,uCAOkB;AAElB,4CAAuD;AACvD,oCAA4C;AAC5C,kDAA0B;AAE1B,+EAA+E;AAC/E,sDAAwC;AAExC,SAAgB,iBAAiB,CAC/B,YAA6B,EAC7B,YAAoB;IAEpB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,YAAY;KACpB,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE;QAC9B,6BAA6B,CAAC,IAAI;YAChC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,qBAAqB,EAAE;gBACzD,+DAA+D;gBAC/D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAE1C,6CAA6C;gBAC7C,MAAM,YAAY,GAAW,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,IAAc,CAAC;gBAEtE,mCAAmC;gBACnC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CACvD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,EAC9C,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CACjD,CAAC;gBAEF,4DAA4D;gBAC5D,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,CAAC;aACvC;iBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,YAAY,EAAE;gBACvD,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;gBAErD,MAAM,gBAAgB,GAAG,IAAA,uBAAY,EAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;gBAEjE,YAAY,CAAC,OAAO,CAAC,OAAO,GAAG,mBAAQ,CAAC,GAAG,CACzC,cAAc,gBAAgB,GAAG,CAClC,CAAC;aACH;iBAAM;gBACL,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,eAAK,CAAC,MAAM,CACV,uBAAuB,eAAK,CAAC,IAAI,CAC/B,YAAY,CACb,kDAAkD,eAAK,CAAC,GAAG,CAC1D,cAAc,CACf,IAAI,CACN,CACF,CAAC;aACH;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAlDD,8CAkDC;AAED,SAAgB,uBAAuB,CACrC,YAA6B;IAE7B,qDAAqD;IACrD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE;QAC9B,mBAAmB,CAAC,IAAI;YACtB,IACE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;gBACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,EACvC;gBACA,MAAM,GAAG,IAAI,CAAC;gBACd,OAAO,KAAK,CAAC,CAAC,iBAAiB;aAChC;YACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;KACF,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAlBD,0DAkBC;AAEM,KAAK,UAAU,cAAc,CAAC,YAAoB;IACvD,MAAM,YAAY,GAAG,MAAM,IAAA,mBAAQ,EACjC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAC9C,CAAC;IAEF,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,IAAe,CAAC;IAExD,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CACzC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,wBAAwB,CACrB,CAAC;IAE9B,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,MAAM,qBAAqB,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAEpE,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;QACnC,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;QAE5C,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO;SACR;QAED,IAAI,WAAW,CAAC,IAAI,KAAK,qBAAqB,EAAE;YAC9C,IAAI,WAAW,CAAC,EAAE,EAAE,IAAI,KAAK,eAAe,EAAE;gBAC5C,kBAAkB,GAAG,IAAI,CAAC;aAC3B;SACF;aAAM,IAAI,WAAW,CAAC,IAAI,KAAK,qBAAqB,EAAE;YACrD,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;YAE9C,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;gBACnC,+DAA+D;gBAC/D,IAAI,WAAW,CAAC,EAAE,EAAE,IAAI,KAAK,eAAe,EAAE;oBAC5C,kBAAkB,GAAG,IAAI,CAAC;iBAC3B;YACH,CAAC,CAAC,CAAC;SACJ;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kBAAkB,EAAE;QACvB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;YACxB,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,gCAAgC;YAC1C,KAAK,EAAE,gCAAgC;SACxC,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;YACxB,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,eAAe;YACzB,KAAK,EAAE,eAAe;SACvB,CAAC,CAAC;QAEH,2DAA2D;QAC3D,IAAI,CAAC,qBAAqB,EAAE;YAC1B,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;SAC/C;QAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE;YAC9B,6BAA6B,CAAC,IAAI;gBAChC,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,mCAAuB,CAAC,CAAC,OAAO;qBACjE,IAAI,CAAC,CAAC,CAAC,CAAC;gBAEX,IAAI,CAAC,YAAY,CACf,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,CAC/D,CAAC;gBAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;SACF,CAAC,CAAC;QACH,iFAAiF;KAClF;SAAM,IAAI,CAAC,IAAA,wBAAgB,EAAC,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE;QAC9D,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;YACxB,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,gCAAgC;YAC1C,KAAK,EAAE,gCAAgC;SACxC,CAAC,CAAC;QAEH,2DAA2D;QAC3D,IAAI,CAAC,qBAAqB,EAAE;YAC1B,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;SAC/C;QAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE;YAC9B,2BAA2B,CAAC,IAAI;gBAC9B,4BAA4B;gBAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,KAAK,eAAe,EAAE;oBACxD,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;oBAEnD,IAAI,eAAe,CAAC;oBAEpB,mCAAmC;oBACnC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE;wBAChC,wBAAwB,CAAC,IAAI;4BAC3B,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;4BACvD,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC;4BAE7C,IACE,WAAW,CAAC,IAAI,KAAK,gBAAgB;gCACrC,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,EAC3C;gCACA,eAAe,GAAG,mBAAmB,CAAC,EAAE,CAAC,IAAI,CAAC;6BAC/C;4BAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBACtB,CAAC;qBACF,CAAC,CAAC;oBAEH,uFAAuF;oBACvF,0CAA0C;oBAC1C,IAAI,CAAC,eAAe,EAAE;wBACpB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;4BACxB,IAAI,EAAE,kBAAkB;4BACxB,QAAQ,EAAE,eAAe;4BACzB,KAAK,EAAE,eAAe;yBACvB,CAAC,CAAC;wBAEH,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CACpC,gCAAgC,CACjC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAElB,0CAA0C;wBAC1C,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;qBAC/D;oBAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CACnC,wCAAwC,CACzC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAElB,uDAAuD;oBACvD,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAClC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EACxC,CAAC,EACD,gBAAgB,CACjB,CAAC;iBACH;gBACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;SACF,CAAC,CAAC;KACJ;SAAM,IAAI,CAAC,qBAAqB,EAAE;QACjC,0FAA0F;QAC1F,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;KAC/C;IAED,MAAM,IAAA,oBAAS,EACb,YAAY,CAAC,IAAI,EACjB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAC9C,CAAC;AACJ,CAAC;AAjJD,wCAiJC","sourcesContent":["/* 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/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport * as recast from 'recast';\nimport * as path from 'path';\n\nimport type { ExportNamedDeclaration, Program } from '@babel/types';\n\nimport {\n builders,\n generateCode,\n loadFile,\n ProxifiedModule,\n writeFile,\n // @ts-expect-error - magicast is ESM and TS complains about that. It works though\n} from 'magicast';\n\nimport { ERROR_BOUNDARY_TEMPLATE } from '../templates';\nimport { hasSentryContent } from '../utils';\nimport chalk from 'chalk';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\n\nexport function wrapAppWithSentry(\n rootRouteAst: ProxifiedModule,\n rootFileName: string,\n) {\n rootRouteAst.imports.$add({\n from: '@sentry/remix',\n imported: 'withSentry',\n local: 'withSentry',\n });\n\n recast.visit(rootRouteAst.$ast, {\n visitExportDefaultDeclaration(path) {\n if (path.value.declaration.type === 'FunctionDeclaration') {\n // Move the function declaration just before the default export\n path.insertBefore(path.value.declaration);\n\n // Get the name of the function to be wrapped\n const functionName: string = path.value.declaration.id.name as string;\n\n // Create the wrapped function call\n const functionCall = recast.types.builders.callExpression(\n recast.types.builders.identifier('withSentry'),\n [recast.types.builders.identifier(functionName)],\n );\n\n // Replace the default export with the wrapped function call\n path.value.declaration = functionCall;\n } else if (path.value.declaration.type === 'Identifier') {\n const rootRouteExport = rootRouteAst.exports.default;\n\n const expressionToWrap = generateCode(rootRouteExport.$ast).code;\n\n rootRouteAst.exports.default = builders.raw(\n `withSentry(${expressionToWrap})`,\n );\n } else {\n clack.log.warn(\n chalk.yellow(\n `Couldn't instrument ${chalk.bold(\n rootFileName,\n )} automatically. Wrap your default export with: ${chalk.dim(\n 'withSentry()',\n )}\\n`,\n ),\n );\n }\n\n this.traverse(path);\n },\n });\n}\n\nexport function isWithSentryAlreadyUsed(\n rootRouteAst: ProxifiedModule,\n): boolean {\n // Check if withSentry is called anywhere in the code\n let isUsed = false;\n recast.visit(rootRouteAst.$ast, {\n visitCallExpression(path) {\n if (\n path.value.callee.type === 'Identifier' &&\n path.value.callee.name === 'withSentry'\n ) {\n isUsed = true;\n return false; // Stop traversal\n }\n this.traverse(path);\n },\n });\n return isUsed;\n}\n\nexport async function instrumentRoot(rootFileName: string): Promise<void> {\n const rootRouteAst = await loadFile(\n path.join(process.cwd(), 'app', rootFileName),\n );\n\n const exportsAst = rootRouteAst.exports.$ast as Program;\n\n const namedExports = exportsAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n let foundErrorBoundary = false;\n const withSentryAlreadyUsed = isWithSentryAlreadyUsed(rootRouteAst);\n\n namedExports.forEach((namedExport) => {\n const declaration = namedExport.declaration;\n\n if (!declaration) {\n return;\n }\n\n if (declaration.type === 'FunctionDeclaration') {\n if (declaration.id?.name === 'ErrorBoundary') {\n foundErrorBoundary = true;\n }\n } else if (declaration.type === 'VariableDeclaration') {\n const declarations = declaration.declarations;\n\n declarations.forEach((declaration) => {\n // @ts-expect-error - id should always have a name in this case\n if (declaration.id?.name === 'ErrorBoundary') {\n foundErrorBoundary = true;\n }\n });\n }\n });\n\n if (!foundErrorBoundary) {\n rootRouteAst.imports.$add({\n from: '@sentry/remix',\n imported: 'captureRemixErrorBoundaryError',\n local: 'captureRemixErrorBoundaryError',\n });\n\n rootRouteAst.imports.$add({\n from: '@remix-run/react',\n imported: 'useRouteError',\n local: 'useRouteError',\n });\n\n // Call wrapAppWithSentry if withSentry is not already used\n if (!withSentryAlreadyUsed) {\n wrapAppWithSentry(rootRouteAst, rootFileName);\n }\n\n recast.visit(rootRouteAst.$ast, {\n visitExportDefaultDeclaration(path) {\n const implementation = recast.parse(ERROR_BOUNDARY_TEMPLATE).program\n .body[0];\n\n path.insertBefore(\n recast.types.builders.exportDeclaration(false, implementation),\n );\n\n this.traverse(path);\n },\n });\n // If there is already a ErrorBoundary export, and it doesn't have Sentry content\n } else if (!hasSentryContent(rootFileName, rootRouteAst.$code)) {\n rootRouteAst.imports.$add({\n from: '@sentry/remix',\n imported: 'captureRemixErrorBoundaryError',\n local: 'captureRemixErrorBoundaryError',\n });\n\n // Call wrapAppWithSentry if withSentry is not already used\n if (!withSentryAlreadyUsed) {\n wrapAppWithSentry(rootRouteAst, rootFileName);\n }\n\n recast.visit(rootRouteAst.$ast, {\n visitExportNamedDeclaration(path) {\n // Find ErrorBoundary export\n if (path.value.declaration?.id?.name === 'ErrorBoundary') {\n const errorBoundaryExport = path.value.declaration;\n\n let errorIdentifier;\n\n // check if useRouteError is called\n recast.visit(errorBoundaryExport, {\n visitVariableDeclaration(path) {\n const variableDeclaration = path.value.declarations[0];\n const initializer = variableDeclaration.init;\n\n if (\n initializer.type === 'CallExpression' &&\n initializer.callee.name === 'useRouteError'\n ) {\n errorIdentifier = variableDeclaration.id.name;\n }\n\n this.traverse(path);\n },\n });\n\n // We don't have an errorIdentifier, which means useRouteError is not called / imported\n // We need to add it and capture the error\n if (!errorIdentifier) {\n rootRouteAst.imports.$add({\n from: '@remix-run/react',\n imported: 'useRouteError',\n local: 'useRouteError',\n });\n\n const useRouteErrorCall = recast.parse(\n `const error = useRouteError();`,\n ).program.body[0];\n\n // Insert at the top of ErrorBoundary body\n errorBoundaryExport.body.body.splice(0, 0, useRouteErrorCall);\n }\n\n const captureErrorCall = recast.parse(\n `captureRemixErrorBoundaryError(error);`,\n ).program.body[0];\n\n // Insert just before the the fallback page is returned\n errorBoundaryExport.body.body.splice(\n errorBoundaryExport.body.body.length - 1,\n 0,\n captureErrorCall,\n );\n }\n this.traverse(path);\n },\n });\n } else if (!withSentryAlreadyUsed) {\n // Even if we have Sentry content but withSentry is not used, we should still wrap the app\n wrapAppWithSentry(rootRouteAst, rootFileName);\n }\n\n await writeFile(\n rootRouteAst.$ast,\n path.join(process.cwd(), 'app', rootFileName),\n );\n}\n"]}
@@ -45,7 +45,7 @@ async function runRemixWizardWithTelemetry(options) {
45
45
  await (0, clack_1.ensurePackageIsInstalled)(packageJson, '@remix-run/dev', 'Remix');
46
46
  const { selectedProject, authToken, sentryUrl, selfHosted } = await (0, clack_1.getOrAskForProjectData)(options, 'javascript-remix');
47
47
  await (0, clack_1.installPackage)({
48
- packageName: '@sentry/remix@^9',
48
+ packageName: '@sentry/remix@^10',
49
49
  packageNameDisplayLabel: '@sentry/remix',
50
50
  alreadyInstalled: (0, package_json_1.hasPackageInstalled)('@sentry/remix', packageJson),
51
51
  forceInstall,
@@ -1 +1 @@
1
- {"version":3,"file":"remix-wizard.js","sourceRoot":"","sources":["../../../src/remix/remix-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\n\nimport { DEFAULT_URL } from '../../lib/Constants';\nimport { configureVitePlugin } from '../sourcemaps/tools/vite';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { findFile } from '../utils/ast-utils';\nimport {\n addSentryCliConfig,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n rcCliSetupConfig,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { debug } from '../utils/debug';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport { createExamplePage } from './sdk-example';\nimport {\n createServerInstrumentationFile,\n initializeSentryOnEntryClient,\n insertServerInstrumentationFile,\n instrumentRootRoute,\n instrumentSentryOnEntryServer,\n isRemixV2,\n runRemixReveal,\n updateBuildScript,\n updateStartScript,\n} from './sdk-setup';\nimport { isHydrogenApp } from './utils';\n\nexport async function runRemixWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'remix',\n wizardOptions: options,\n },\n () => runRemixWizardWithTelemetry(options),\n );\n}\n\nasync function runRemixWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry Remix Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n const packageJson = await getPackageDotJson();\n\n if (!isRemixV2(packageJson)) {\n clack.log.error(\n `Sentry only supports Remix v2 and above. Please upgrade your Remix version to use Sentry.`,\n );\n return;\n }\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n // We expect `@remix-run/dev` to be installed for every Remix project\n await ensurePackageIsInstalled(packageJson, '@remix-run/dev', 'Remix');\n\n const { selectedProject, authToken, sentryUrl, selfHosted } =\n await getOrAskForProjectData(options, 'javascript-remix');\n\n await installPackage({\n packageName: '@sentry/remix@^9',\n packageNameDisplayLabel: '@sentry/remix',\n alreadyInstalled: hasPackageInstalled('@sentry/remix', packageJson),\n forceInstall,\n });\n\n const dsn = selectedProject.keys[0].dsn.public;\n\n const isTS = isUsingTypeScript();\n const viteConfig = findFile('vite.config');\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n {\n id: 'logs',\n prompt: `Do you want to enable ${chalk.bold(\n 'Logs',\n )} to send your application logs to Sentry?`,\n enabledHint: 'recommended',\n },\n ] as const);\n\n if (viteConfig) {\n await traceStep(\n 'Update vite configuration for sourcemap uploads',\n async () => {\n try {\n await configureVitePlugin({\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n url: sentryUrl,\n selfHosted,\n authToken,\n });\n } catch (e) {\n clack.log\n .warn(`Could not update vite configuration to generate and upload sourcemaps.\n Please update your vite configuration manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/sourcemaps/`);\n debug(e);\n }\n },\n );\n } else {\n await traceStep('Update build script for sourcemap uploads', async () => {\n try {\n await updateBuildScript({\n org: selectedProject.organization.slug,\n project: selectedProject.slug,\n url: sentryUrl === DEFAULT_URL ? undefined : sentryUrl,\n isHydrogen: isHydrogenApp(packageJson),\n });\n\n await addSentryCliConfig({ authToken }, rcCliSetupConfig);\n } catch (e) {\n clack.log\n .warn(`Could not update build script to generate and upload sourcemaps.\n Please update your build script manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/sourcemaps/`);\n debug(e);\n }\n });\n }\n\n await traceStep('Instrument root route', async () => {\n try {\n await instrumentRootRoute(isTS);\n } catch (e) {\n clack.log.warn(`Could not instrument root route.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n traceStep('Reveal missing entry files', () => {\n try {\n runRemixReveal(isTS);\n } catch (e) {\n clack.log.warn(`Could not run 'npx remix reveal'.\n Please create your entry files manually`);\n debug(e);\n }\n });\n\n await traceStep('Initialize Sentry on client entry', async () => {\n try {\n await initializeSentryOnEntryClient(dsn, isTS, selectedFeatures);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on client entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n let instrumentationFile = '';\n\n await traceStep('Create server instrumentation file', async () => {\n try {\n instrumentationFile = await createServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n } catch (e) {\n clack.log.warn(\n 'Could not create a server instrumentation file. Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/',\n );\n debug(e);\n }\n });\n\n let serverFileInstrumented = false;\n\n await traceStep(\n 'Create server instrumentation file and import it',\n async () => {\n try {\n serverFileInstrumented = await insertServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n } catch (e) {\n clack.log.warn(\n 'Could not create a server instrumentation file. Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/',\n );\n debug(e);\n }\n },\n );\n\n if (!serverFileInstrumented && instrumentationFile) {\n await traceStep(\n 'Update `start` script to import instrumentation file.',\n async () => {\n try {\n await updateStartScript(instrumentationFile);\n } catch (e) {\n clack.log\n .warn(`Could not automatically add Sentry initialization to server entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n },\n );\n }\n\n await traceStep('Instrument server `handleError`', async () => {\n try {\n await instrumentSentryOnEntryServer(isTS);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on server entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage();\n\n if (shouldCreateExamplePage) {\n await traceStep('Create example page', async () => {\n await createExamplePage({\n isTS,\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\n });\n });\n }\n\n await runPrettierIfInstalled({ cwd: undefined });\n\n clack.outro(`\n${chalk.green(\n 'Sentry has been successfully configured for your Remix project.',\n)}\n\n${chalk.cyan('You can now deploy your project to see Sentry in action.')}\n\n${chalk.cyan(\n `To learn more about how to use Sentry with Remix, visit our documentation:\nhttps://docs.sentry.io/platforms/javascript/guides/remix/`,\n)}`);\n}\n"]}
1
+ {"version":3,"file":"remix-wizard.js","sourceRoot":"","sources":["../../../src/remix/remix-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\n\nimport { DEFAULT_URL } from '../../lib/Constants';\nimport { configureVitePlugin } from '../sourcemaps/tools/vite';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { findFile } from '../utils/ast-utils';\nimport {\n addSentryCliConfig,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n rcCliSetupConfig,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { debug } from '../utils/debug';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport { createExamplePage } from './sdk-example';\nimport {\n createServerInstrumentationFile,\n initializeSentryOnEntryClient,\n insertServerInstrumentationFile,\n instrumentRootRoute,\n instrumentSentryOnEntryServer,\n isRemixV2,\n runRemixReveal,\n updateBuildScript,\n updateStartScript,\n} from './sdk-setup';\nimport { isHydrogenApp } from './utils';\n\nexport async function runRemixWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'remix',\n wizardOptions: options,\n },\n () => runRemixWizardWithTelemetry(options),\n );\n}\n\nasync function runRemixWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry Remix Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n const packageJson = await getPackageDotJson();\n\n if (!isRemixV2(packageJson)) {\n clack.log.error(\n `Sentry only supports Remix v2 and above. Please upgrade your Remix version to use Sentry.`,\n );\n return;\n }\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n // We expect `@remix-run/dev` to be installed for every Remix project\n await ensurePackageIsInstalled(packageJson, '@remix-run/dev', 'Remix');\n\n const { selectedProject, authToken, sentryUrl, selfHosted } =\n await getOrAskForProjectData(options, 'javascript-remix');\n\n await installPackage({\n packageName: '@sentry/remix@^10',\n packageNameDisplayLabel: '@sentry/remix',\n alreadyInstalled: hasPackageInstalled('@sentry/remix', packageJson),\n forceInstall,\n });\n\n const dsn = selectedProject.keys[0].dsn.public;\n\n const isTS = isUsingTypeScript();\n const viteConfig = findFile('vite.config');\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n {\n id: 'logs',\n prompt: `Do you want to enable ${chalk.bold(\n 'Logs',\n )} to send your application logs to Sentry?`,\n enabledHint: 'recommended',\n },\n ] as const);\n\n if (viteConfig) {\n await traceStep(\n 'Update vite configuration for sourcemap uploads',\n async () => {\n try {\n await configureVitePlugin({\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n url: sentryUrl,\n selfHosted,\n authToken,\n });\n } catch (e) {\n clack.log\n .warn(`Could not update vite configuration to generate and upload sourcemaps.\n Please update your vite configuration manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/sourcemaps/`);\n debug(e);\n }\n },\n );\n } else {\n await traceStep('Update build script for sourcemap uploads', async () => {\n try {\n await updateBuildScript({\n org: selectedProject.organization.slug,\n project: selectedProject.slug,\n url: sentryUrl === DEFAULT_URL ? undefined : sentryUrl,\n isHydrogen: isHydrogenApp(packageJson),\n });\n\n await addSentryCliConfig({ authToken }, rcCliSetupConfig);\n } catch (e) {\n clack.log\n .warn(`Could not update build script to generate and upload sourcemaps.\n Please update your build script manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/sourcemaps/`);\n debug(e);\n }\n });\n }\n\n await traceStep('Instrument root route', async () => {\n try {\n await instrumentRootRoute(isTS);\n } catch (e) {\n clack.log.warn(`Could not instrument root route.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n traceStep('Reveal missing entry files', () => {\n try {\n runRemixReveal(isTS);\n } catch (e) {\n clack.log.warn(`Could not run 'npx remix reveal'.\n Please create your entry files manually`);\n debug(e);\n }\n });\n\n await traceStep('Initialize Sentry on client entry', async () => {\n try {\n await initializeSentryOnEntryClient(dsn, isTS, selectedFeatures);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on client entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n let instrumentationFile = '';\n\n await traceStep('Create server instrumentation file', async () => {\n try {\n instrumentationFile = await createServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n } catch (e) {\n clack.log.warn(\n 'Could not create a server instrumentation file. Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/',\n );\n debug(e);\n }\n });\n\n let serverFileInstrumented = false;\n\n await traceStep(\n 'Create server instrumentation file and import it',\n async () => {\n try {\n serverFileInstrumented = await insertServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n } catch (e) {\n clack.log.warn(\n 'Could not create a server instrumentation file. Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/',\n );\n debug(e);\n }\n },\n );\n\n if (!serverFileInstrumented && instrumentationFile) {\n await traceStep(\n 'Update `start` script to import instrumentation file.',\n async () => {\n try {\n await updateStartScript(instrumentationFile);\n } catch (e) {\n clack.log\n .warn(`Could not automatically add Sentry initialization to server entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n },\n );\n }\n\n await traceStep('Instrument server `handleError`', async () => {\n try {\n await instrumentSentryOnEntryServer(isTS);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on server entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/manual-setup/`);\n debug(e);\n }\n });\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage();\n\n if (shouldCreateExamplePage) {\n await traceStep('Create example page', async () => {\n await createExamplePage({\n isTS,\n selfHosted,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n url: sentryUrl,\n });\n });\n }\n\n await runPrettierIfInstalled({ cwd: undefined });\n\n clack.outro(`\n${chalk.green(\n 'Sentry has been successfully configured for your Remix project.',\n)}\n\n${chalk.cyan('You can now deploy your project to see Sentry in action.')}\n\n${chalk.cyan(\n `To learn more about how to use Sentry with Remix, visit our documentation:\nhttps://docs.sentry.io/platforms/javascript/guides/remix/`,\n)}`);\n}\n"]}
@@ -85,7 +85,7 @@ async function runSvelteKitWizardWithTelemetry(options) {
85
85
  const sdkAlreadyInstalled = (0, package_json_1.hasPackageInstalled)('@sentry/sveltekit', packageJson);
86
86
  Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);
87
87
  await (0, clack_1.installPackage)({
88
- packageName: '@sentry/sveltekit@^9',
88
+ packageName: '@sentry/sveltekit@^10',
89
89
  packageNameDisplayLabel: '@sentry/sveltekit',
90
90
  alreadyInstalled: sdkAlreadyInstalled,
91
91
  forceInstall,
@@ -1 +1 @@
1
- {"version":3,"file":"sveltekit-wizard.js","sourceRoot":"","sources":["../../../src/sveltekit/sveltekit-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\n\nimport * as Sentry from '@sentry/node';\n\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n abort,\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n printWelcome,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { NPM } from '../utils/package-manager';\nimport type { WizardOptions } from '../utils/types';\nimport { createExamplePage } from './sdk-example';\nimport { createOrMergeSvelteKitFiles, loadSvelteConfig } from './sdk-setup';\nimport { getKitVersionBucket, getSvelteVersionBucket } from './utils';\n\nexport async function runSvelteKitWizard(\n options: WizardOptions,\n): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'sveltekit',\n wizardOptions: options,\n },\n () => runSvelteKitWizardWithTelemetry(options),\n );\n}\n\nexport async function runSvelteKitWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry SvelteKit Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, '@sveltejs/kit', 'Sveltekit');\n\n const kitVersion = getPackageVersion('@sveltejs/kit', packageJson);\n const kitVersionBucket = getKitVersionBucket(kitVersion);\n Sentry.setTag('sveltekit-version', kitVersionBucket);\n\n if (kitVersionBucket === '0.x') {\n clack.log.warn(\n \"It seems you're using a SvelteKit version <1.0.0 which is not supported by Sentry.\\nWe recommend upgrading to the latest 1.x version before you continue.\",\n );\n const shouldContinue = await abortIfCancelled(\n clack.select({\n message: 'Do you want to continue anyway?',\n options: [\n {\n label: 'Yes, continue',\n hint: 'The SDK might not work correctly',\n value: true,\n },\n { label: \"No, I'll upgrade first\", value: false },\n ],\n }),\n );\n if (!shouldContinue) {\n await abort('Exiting Wizard', 0);\n return;\n }\n }\n\n Sentry.setTag(\n 'svelte-version',\n getSvelteVersionBucket(getPackageVersion('svelte', packageJson)),\n );\n\n const { selectedProject, selfHosted, sentryUrl, authToken } =\n await getOrAskForProjectData(options, 'javascript-sveltekit');\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/sveltekit',\n packageJson,\n );\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n await installPackage({\n packageName: '@sentry/sveltekit@^9',\n packageNameDisplayLabel: '@sentry/sveltekit',\n alreadyInstalled: sdkAlreadyInstalled,\n forceInstall,\n });\n\n await addDotEnvSentryBuildPluginFile(authToken);\n\n const svelteConfig = await traceStep('load-svelte-config', loadSvelteConfig);\n\n try {\n await traceStep('configure-sdk', () =>\n createOrMergeSvelteKitFiles(\n {\n dsn: selectedProject.keys[0].dsn.public,\n org: selectedProject.organization.slug,\n project: selectedProject.slug,\n selfHosted,\n url: sentryUrl,\n },\n svelteConfig,\n ),\n );\n } catch (e: unknown) {\n clack.log.error('Error while setting up the SvelteKit SDK:');\n clack.log.info(\n chalk.dim(\n typeof e === 'object' && e != null && 'toString' in e\n ? e.toString()\n : typeof e === 'string'\n ? e\n : 'Unknown error',\n ),\n );\n Sentry.captureException('Error while setting up the SvelteKit SDK');\n await abort('Exiting Wizard');\n return;\n }\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage(\n '/sentry-example-page',\n );\n\n if (shouldCreateExamplePage) {\n try {\n await traceStep('create-example-page', () =>\n createExamplePage(svelteConfig, {\n selfHosted,\n url: sentryUrl,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n }),\n );\n } catch (e: unknown) {\n clack.log.error('Error while creating an example page to test Sentry:');\n clack.log.info(\n chalk.dim(\n typeof e === 'object' && e != null && 'toString' in e\n ? e.toString()\n : typeof e === 'string'\n ? e\n : 'Unknown error',\n ),\n );\n Sentry.captureException(\n 'Error while creating an example Svelte page to test Sentry',\n );\n await abort('Exiting Wizard');\n return;\n }\n }\n\n await runPrettierIfInstalled({ cwd: undefined });\n\n clack.outro(await buildOutroMessage(shouldCreateExamplePage));\n}\n\nasync function buildOutroMessage(\n shouldCreateExamplePage: boolean,\n): Promise<string> {\n const packageManager = await getPackageManager(NPM);\n\n let msg = chalk.green('\\nSuccessfully installed the Sentry SvelteKit SDK!');\n\n if (shouldCreateExamplePage) {\n msg += `\\n\\nYou can validate your setup by starting your dev environment (${chalk.cyan(\n `\\`${packageManager.runScriptCommand} dev\\``,\n )}) and visiting ${chalk.cyan('\"/sentry-example-page\"')}.`;\n }\n\n msg += `\\n\\nCheck out the SDK documentation for further configuration:\nhttps://docs.sentry.io/platforms/javascript/guides/sveltekit/`;\n\n return msg;\n}\n"]}
1
+ {"version":3,"file":"sveltekit-wizard.js","sourceRoot":"","sources":["../../../src/sveltekit/sveltekit-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\n\nimport * as Sentry from '@sentry/node';\n\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n abort,\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n printWelcome,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { NPM } from '../utils/package-manager';\nimport type { WizardOptions } from '../utils/types';\nimport { createExamplePage } from './sdk-example';\nimport { createOrMergeSvelteKitFiles, loadSvelteConfig } from './sdk-setup';\nimport { getKitVersionBucket, getSvelteVersionBucket } from './utils';\n\nexport async function runSvelteKitWizard(\n options: WizardOptions,\n): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'sveltekit',\n wizardOptions: options,\n },\n () => runSvelteKitWizardWithTelemetry(options),\n );\n}\n\nexport async function runSvelteKitWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry SvelteKit Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, '@sveltejs/kit', 'Sveltekit');\n\n const kitVersion = getPackageVersion('@sveltejs/kit', packageJson);\n const kitVersionBucket = getKitVersionBucket(kitVersion);\n Sentry.setTag('sveltekit-version', kitVersionBucket);\n\n if (kitVersionBucket === '0.x') {\n clack.log.warn(\n \"It seems you're using a SvelteKit version <1.0.0 which is not supported by Sentry.\\nWe recommend upgrading to the latest 1.x version before you continue.\",\n );\n const shouldContinue = await abortIfCancelled(\n clack.select({\n message: 'Do you want to continue anyway?',\n options: [\n {\n label: 'Yes, continue',\n hint: 'The SDK might not work correctly',\n value: true,\n },\n { label: \"No, I'll upgrade first\", value: false },\n ],\n }),\n );\n if (!shouldContinue) {\n await abort('Exiting Wizard', 0);\n return;\n }\n }\n\n Sentry.setTag(\n 'svelte-version',\n getSvelteVersionBucket(getPackageVersion('svelte', packageJson)),\n );\n\n const { selectedProject, selfHosted, sentryUrl, authToken } =\n await getOrAskForProjectData(options, 'javascript-sveltekit');\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/sveltekit',\n packageJson,\n );\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n await installPackage({\n packageName: '@sentry/sveltekit@^10',\n packageNameDisplayLabel: '@sentry/sveltekit',\n alreadyInstalled: sdkAlreadyInstalled,\n forceInstall,\n });\n\n await addDotEnvSentryBuildPluginFile(authToken);\n\n const svelteConfig = await traceStep('load-svelte-config', loadSvelteConfig);\n\n try {\n await traceStep('configure-sdk', () =>\n createOrMergeSvelteKitFiles(\n {\n dsn: selectedProject.keys[0].dsn.public,\n org: selectedProject.organization.slug,\n project: selectedProject.slug,\n selfHosted,\n url: sentryUrl,\n },\n svelteConfig,\n ),\n );\n } catch (e: unknown) {\n clack.log.error('Error while setting up the SvelteKit SDK:');\n clack.log.info(\n chalk.dim(\n typeof e === 'object' && e != null && 'toString' in e\n ? e.toString()\n : typeof e === 'string'\n ? e\n : 'Unknown error',\n ),\n );\n Sentry.captureException('Error while setting up the SvelteKit SDK');\n await abort('Exiting Wizard');\n return;\n }\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage(\n '/sentry-example-page',\n );\n\n if (shouldCreateExamplePage) {\n try {\n await traceStep('create-example-page', () =>\n createExamplePage(svelteConfig, {\n selfHosted,\n url: sentryUrl,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n }),\n );\n } catch (e: unknown) {\n clack.log.error('Error while creating an example page to test Sentry:');\n clack.log.info(\n chalk.dim(\n typeof e === 'object' && e != null && 'toString' in e\n ? e.toString()\n : typeof e === 'string'\n ? e\n : 'Unknown error',\n ),\n );\n Sentry.captureException(\n 'Error while creating an example Svelte page to test Sentry',\n );\n await abort('Exiting Wizard');\n return;\n }\n }\n\n await runPrettierIfInstalled({ cwd: undefined });\n\n clack.outro(await buildOutroMessage(shouldCreateExamplePage));\n}\n\nasync function buildOutroMessage(\n shouldCreateExamplePage: boolean,\n): Promise<string> {\n const packageManager = await getPackageManager(NPM);\n\n let msg = chalk.green('\\nSuccessfully installed the Sentry SvelteKit SDK!');\n\n if (shouldCreateExamplePage) {\n msg += `\\n\\nYou can validate your setup by starting your dev environment (${chalk.cyan(\n `\\`${packageManager.runScriptCommand} dev\\``,\n )}) and visiting ${chalk.cyan('\"/sentry-example-page\"')}.`;\n }\n\n msg += `\\n\\nCheck out the SDK documentation for further configuration:\nhttps://docs.sentry.io/platforms/javascript/guides/sveltekit/`;\n\n return msg;\n}\n"]}
@@ -1 +1 @@
1
- export declare const WIZARD_VERSION = "6.1.1";
1
+ export declare const WIZARD_VERSION = "6.2.0";
@@ -3,5 +3,5 @@
3
3
  // This is file is updated at release time.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.WIZARD_VERSION = void 0;
6
- exports.WIZARD_VERSION = '6.1.1';
6
+ exports.WIZARD_VERSION = '6.2.0';
7
7
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,2CAA2C;;;AAE9B,QAAA,cAAc,GAAG,OAAO,CAAC","sourcesContent":["// DO NOT modify this file manually!\n// This is file is updated at release time.\n\nexport const WIZARD_VERSION = '6.1.1';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,2CAA2C;;;AAE9B,QAAA,cAAc,GAAG,OAAO,CAAC","sourcesContent":["// DO NOT modify this file manually!\n// This is file is updated at release time.\n\nexport const WIZARD_VERSION = '6.2.0';\n"]}
@@ -642,7 +642,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
642
642
  (0, vitest_1.describe)('app delegate file is not found', () => {
643
643
  (0, vitest_1.it)('should return false', () => {
644
644
  // -- Act --
645
- const result = (0, code_tools_1.addCodeSnippetToProject)(['AppDelegate.swift'], 'https://example.com/sentry-dsn');
645
+ const result = (0, code_tools_1.addCodeSnippetToProject)(['AppDelegate.swift'], 'https://example.com/sentry-dsn', false);
646
646
  // -- Assert --
647
647
  (0, vitest_1.expect)(result).toBeFalsy();
648
648
  });
@@ -666,7 +666,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
666
666
  });
667
667
  (0, vitest_1.it)('should add the code snippet', () => {
668
668
  // -- Act --
669
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
669
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
670
670
  // -- Assert --
671
671
  (0, vitest_1.expect)(result).toBeTruthy();
672
672
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -674,14 +674,14 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
674
674
  });
675
675
  (0, vitest_1.it)("should set tag 'code-language'", () => {
676
676
  // -- Act --
677
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
677
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
678
678
  // -- Assert --
679
679
  (0, vitest_1.expect)(result).toBeTruthy();
680
680
  (0, vitest_1.expect)(Sentry.setTag).toHaveBeenCalledWith('code-language', 'swift');
681
681
  });
682
682
  (0, vitest_1.it)("should set tag 'ui-engine'", () => {
683
683
  // -- Act --
684
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
684
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
685
685
  // -- Assert --
686
686
  (0, vitest_1.expect)(result).toBeTruthy();
687
687
  (0, vitest_1.expect)(Sentry.setTag).toHaveBeenCalledWith('ui-engine', 'uikit');
@@ -693,7 +693,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
693
693
  const tempDir = prepareTempDir();
694
694
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwiftWithSentry, 'swift');
695
695
  // -- Act --
696
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
696
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
697
697
  // -- Assert --
698
698
  (0, vitest_1.expect)(result).toBeTruthy();
699
699
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -710,7 +710,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
710
710
  });
711
711
  (0, vitest_1.it)('should add the code snippet', () => {
712
712
  // -- Act --
713
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
713
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
714
714
  // -- Assert --
715
715
  (0, vitest_1.expect)(result).toBeTruthy();
716
716
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -718,14 +718,14 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
718
718
  });
719
719
  (0, vitest_1.it)("should set tag 'code-language'", () => {
720
720
  // -- Act --
721
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
721
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
722
722
  // -- Assert --
723
723
  (0, vitest_1.expect)(result).toBeTruthy();
724
724
  (0, vitest_1.expect)(Sentry.setTag).toHaveBeenNthCalledWith(1, 'code-language', 'swift');
725
725
  });
726
726
  (0, vitest_1.it)("should set tag 'ui-engine'", () => {
727
727
  // -- Act --
728
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
728
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
729
729
  // -- Assert --
730
730
  (0, vitest_1.expect)(result).toBeTruthy();
731
731
  (0, vitest_1.expect)(Sentry.setTag).toHaveBeenNthCalledWith(2, 'ui-engine', 'swiftui');
@@ -737,7 +737,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
737
737
  const tempDir = prepareTempDir();
738
738
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwiftUIWithSentry, 'swift');
739
739
  // -- Act --
740
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
740
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
741
741
  // -- Assert --
742
742
  (0, vitest_1.expect)(result).toBeTruthy();
743
743
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -751,7 +751,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
751
751
  const tempDir = prepareTempDir();
752
752
  const filePath = prepareAppDelegateFile(tempDir, invalidAppDelegateSwiftUI, 'swift');
753
753
  // -- Act --
754
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
754
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
755
755
  // -- Assert --
756
756
  (0, vitest_1.expect)(result).toBeFalsy();
757
757
  });
@@ -764,7 +764,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
764
764
  const tempDir = prepareTempDir();
765
765
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
766
766
  // -- Act --
767
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
767
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
768
768
  // -- Assert --
769
769
  (0, vitest_1.expect)(result).toBeTruthy();
770
770
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -780,7 +780,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
780
780
  });
781
781
  (0, vitest_1.it)('should not add the code snippet', () => {
782
782
  // -- Act --
783
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
783
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
784
784
  // -- Assert --
785
785
  (0, vitest_1.expect)(result).toBeTruthy();
786
786
  const modifiedFileContent = fs.readFileSync(filePath, 'utf8');
@@ -788,7 +788,7 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
788
788
  });
789
789
  (0, vitest_1.it)('should log info', () => {
790
790
  // -- Act --
791
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
791
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
792
792
  // -- Assert --
793
793
  (0, vitest_1.expect)(result).toBeTruthy();
794
794
  (0, vitest_1.expect)(clack.log.info).toHaveBeenCalledWith('Sentry is already initialized in your AppDelegate. Skipping adding the code snippet.');
@@ -799,13 +799,61 @@ vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
799
799
  const tempDir = prepareTempDir();
800
800
  const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
801
801
  // -- Act --
802
- const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn);
802
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
803
803
  // -- Assert --
804
804
  (0, vitest_1.expect)(result).toBeTruthy();
805
805
  (0, vitest_1.expect)(Sentry.setTag).toHaveBeenCalledWith('code-language', 'objc');
806
806
  });
807
807
  });
808
808
  });
809
+ (0, vitest_1.describe)('with logs enabled', () => {
810
+ (0, vitest_1.it)('should add logs option to Swift file', () => {
811
+ // -- Arrange --
812
+ const tempDir = prepareTempDir();
813
+ const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
814
+ // -- Act --
815
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, true);
816
+ // -- Assert --
817
+ (0, vitest_1.expect)(result).toBeTruthy();
818
+ const fileContent = fs.readFileSync(filePath, 'utf8');
819
+ (0, vitest_1.expect)(fileContent).toContain('options.experimental.enableLogs = true');
820
+ });
821
+ (0, vitest_1.it)('should add logs option to Objective-C file', () => {
822
+ // -- Arrange --
823
+ const tempDir = prepareTempDir();
824
+ const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
825
+ // -- Act --
826
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, true);
827
+ // -- Assert --
828
+ (0, vitest_1.expect)(result).toBeTruthy();
829
+ const fileContent = fs.readFileSync(filePath, 'utf8');
830
+ (0, vitest_1.expect)(fileContent).toContain('options.experimental.enableLogs = YES;');
831
+ });
832
+ });
833
+ (0, vitest_1.describe)('with logs disabled', () => {
834
+ (0, vitest_1.it)('should not add logs option to Swift file', () => {
835
+ // -- Arrange --
836
+ const tempDir = prepareTempDir();
837
+ const filePath = prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');
838
+ // -- Act --
839
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
840
+ // -- Assert --
841
+ (0, vitest_1.expect)(result).toBeTruthy();
842
+ const fileContent = fs.readFileSync(filePath, 'utf8');
843
+ (0, vitest_1.expect)(fileContent).not.toContain('options.experimental.enableLogs = true');
844
+ });
845
+ (0, vitest_1.it)('should not add logs option to Objective-C file', () => {
846
+ // -- Arrange --
847
+ const tempDir = prepareTempDir();
848
+ const filePath = prepareAppDelegateFile(tempDir, validAppDelegateObjC, 'm');
849
+ // -- Act --
850
+ const result = (0, code_tools_1.addCodeSnippetToProject)([filePath], dsn, false);
851
+ // -- Assert --
852
+ (0, vitest_1.expect)(result).toBeTruthy();
853
+ const fileContent = fs.readFileSync(filePath, 'utf8');
854
+ (0, vitest_1.expect)(fileContent).not.toContain('options.experimental.enableLogs = YES;');
855
+ });
856
+ });
809
857
  });
810
858
  });
811
859
  //# sourceMappingURL=code-tools.test.js.map