@sentry/wizard 6.10.0 → 6.11.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 (144) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/ci-ensure-runtime-loaded.sh +82 -0
  3. package/dist/e2e-tests/tests/angular-17.test.js +72 -82
  4. package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
  5. package/dist/e2e-tests/tests/angular-19.test.js +71 -80
  6. package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
  7. package/dist/e2e-tests/tests/cloudflare-worker.test.d.ts +1 -0
  8. package/dist/e2e-tests/tests/cloudflare-worker.test.js +64 -0
  9. package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -0
  10. package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js +2 -5
  11. package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js.map +1 -1
  12. package/dist/e2e-tests/tests/expo.test.js +36 -61
  13. package/dist/e2e-tests/tests/expo.test.js.map +1 -1
  14. package/dist/e2e-tests/tests/flutter.test.js +63 -70
  15. package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
  16. package/dist/e2e-tests/tests/help-message.test.js +2 -2
  17. package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
  18. package/dist/e2e-tests/tests/nextjs-14.test.js +48 -76
  19. package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
  20. package/dist/e2e-tests/tests/nextjs-15.test.js +89 -99
  21. package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
  22. package/dist/e2e-tests/tests/nextjs-16.test.js +48 -45
  23. package/dist/e2e-tests/tests/nextjs-16.test.js.map +1 -1
  24. package/dist/e2e-tests/tests/nuxt-3.test.js +45 -58
  25. package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
  26. package/dist/e2e-tests/tests/nuxt-4.test.js +59 -73
  27. package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
  28. package/dist/e2e-tests/tests/pnpm-workspace.test.js +4 -7
  29. package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
  30. package/dist/e2e-tests/tests/react-native.test.js +44 -80
  31. package/dist/e2e-tests/tests/react-native.test.js.map +1 -1
  32. package/dist/e2e-tests/tests/react-router.test.js +163 -145
  33. package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
  34. package/dist/e2e-tests/tests/remix.test.js +162 -132
  35. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  36. package/dist/e2e-tests/tests/sveltekit-hooks.test.js +48 -36
  37. package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
  38. package/dist/e2e-tests/tests/sveltekit-tracing.test.js +3 -6
  39. package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
  40. package/dist/e2e-tests/utils/index.d.ts +15 -43
  41. package/dist/e2e-tests/utils/index.js +95 -185
  42. package/dist/e2e-tests/utils/index.js.map +1 -1
  43. package/dist/get-e2e-test-matrix.mjs +11 -0
  44. package/dist/lib/Constants.d.ts +1 -0
  45. package/dist/lib/Constants.js +5 -0
  46. package/dist/lib/Constants.js.map +1 -1
  47. package/dist/src/android/android-wizard.js +2 -4
  48. package/dist/src/android/android-wizard.js.map +1 -1
  49. package/dist/src/angular/angular-wizard.js +4 -6
  50. package/dist/src/angular/angular-wizard.js.map +1 -1
  51. package/dist/src/angular/sdk-setup.js +1 -1
  52. package/dist/src/angular/sdk-setup.js.map +1 -1
  53. package/dist/src/apple/apple-wizard.js +2 -4
  54. package/dist/src/apple/apple-wizard.js.map +1 -1
  55. package/dist/src/cloudflare/cloudflare-wizard.d.ts +3 -0
  56. package/dist/src/cloudflare/cloudflare-wizard.js +99 -0
  57. package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -0
  58. package/dist/src/cloudflare/sdk-setup.d.ts +7 -0
  59. package/dist/src/cloudflare/sdk-setup.js +47 -0
  60. package/dist/src/cloudflare/sdk-setup.js.map +1 -0
  61. package/dist/src/cloudflare/templates.d.ts +4 -0
  62. package/dist/src/cloudflare/templates.js +44 -0
  63. package/dist/src/cloudflare/templates.js.map +1 -0
  64. package/dist/src/cloudflare/wrangler/create-wrangler-config.d.ts +4 -0
  65. package/dist/src/cloudflare/wrangler/create-wrangler-config.js +27 -0
  66. package/dist/src/cloudflare/wrangler/create-wrangler-config.js.map +1 -0
  67. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.d.ts +4 -0
  68. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js +25 -0
  69. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js.map +1 -0
  70. package/dist/src/cloudflare/wrangler/find-wrangler-config.d.ts +4 -0
  71. package/dist/src/cloudflare/wrangler/find-wrangler-config.js +23 -0
  72. package/dist/src/cloudflare/wrangler/find-wrangler-config.js.map +1 -0
  73. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.d.ts +6 -0
  74. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js +52 -0
  75. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js.map +1 -0
  76. package/dist/src/cloudflare/wrangler/update-wrangler-config.d.ts +17 -0
  77. package/dist/src/cloudflare/wrangler/update-wrangler-config.js +173 -0
  78. package/dist/src/cloudflare/wrangler/update-wrangler-config.js.map +1 -0
  79. package/dist/src/cloudflare/wrap-worker.d.ts +32 -0
  80. package/dist/src/cloudflare/wrap-worker.js +109 -0
  81. package/dist/src/cloudflare/wrap-worker.js.map +1 -0
  82. package/dist/src/flutter/flutter-wizard.js +3 -6
  83. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  84. package/dist/src/nextjs/nextjs-wizard.js +0 -2
  85. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  86. package/dist/src/nuxt/nuxt-wizard.js +3 -5
  87. package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
  88. package/dist/src/react-native/react-native-wizard.js +2 -4
  89. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  90. package/dist/src/react-router/react-router-wizard.js +3 -5
  91. package/dist/src/react-router/react-router-wizard.js.map +1 -1
  92. package/dist/src/react-router/sdk-setup.d.ts +1 -1
  93. package/dist/src/react-router/sdk-setup.js +3 -4
  94. package/dist/src/react-router/sdk-setup.js.map +1 -1
  95. package/dist/src/remix/remix-wizard.js +2 -4
  96. package/dist/src/remix/remix-wizard.js.map +1 -1
  97. package/dist/src/run.d.ts +1 -1
  98. package/dist/src/run.js +5 -0
  99. package/dist/src/run.js.map +1 -1
  100. package/dist/src/sveltekit/sveltekit-wizard.js +2 -4
  101. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  102. package/dist/src/utils/abort-if-sportlight-not-supported.d.ts +5 -0
  103. package/dist/src/utils/abort-if-sportlight-not-supported.js +40 -0
  104. package/dist/src/utils/abort-if-sportlight-not-supported.js.map +1 -0
  105. package/dist/src/utils/ast-utils.d.ts +1 -1
  106. package/dist/src/utils/ast-utils.js.map +1 -1
  107. package/dist/src/utils/clack/index.d.ts +2 -2
  108. package/dist/src/utils/clack/index.js.map +1 -1
  109. package/dist/src/utils/clack/mcp-config.js +117 -59
  110. package/dist/src/utils/clack/mcp-config.js.map +1 -1
  111. package/dist/src/version.d.ts +1 -1
  112. package/dist/src/version.js +1 -1
  113. package/dist/src/version.js.map +1 -1
  114. package/dist/test/angular/angular-wizard.test.js +2 -4
  115. package/dist/test/angular/angular-wizard.test.js.map +1 -1
  116. package/dist/test/cloudflare/create-wrangler-config.test.d.ts +1 -0
  117. package/dist/test/cloudflare/create-wrangler-config.test.js +48 -0
  118. package/dist/test/cloudflare/create-wrangler-config.test.js.map +1 -0
  119. package/dist/test/cloudflare/ensure-wrangler-config.test.d.ts +1 -0
  120. package/dist/test/cloudflare/ensure-wrangler-config.test.js +61 -0
  121. package/dist/test/cloudflare/ensure-wrangler-config.test.js.map +1 -0
  122. package/dist/test/cloudflare/find-wrangler-config.test.d.ts +1 -0
  123. package/dist/test/cloudflare/find-wrangler-config.test.js +77 -0
  124. package/dist/test/cloudflare/find-wrangler-config.test.js.map +1 -0
  125. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.d.ts +1 -0
  126. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js +81 -0
  127. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js.map +1 -0
  128. package/dist/test/cloudflare/sdk-setup.test.d.ts +1 -0
  129. package/dist/test/cloudflare/sdk-setup.test.js +152 -0
  130. package/dist/test/cloudflare/sdk-setup.test.js.map +1 -0
  131. package/dist/test/cloudflare/templates.test.d.ts +1 -0
  132. package/dist/test/cloudflare/templates.test.js +68 -0
  133. package/dist/test/cloudflare/templates.test.js.map +1 -0
  134. package/dist/test/cloudflare/update-wrangler-config.test.d.ts +1 -0
  135. package/dist/test/cloudflare/update-wrangler-config.test.js +216 -0
  136. package/dist/test/cloudflare/update-wrangler-config.test.js.map +1 -0
  137. package/dist/test/cloudflare/wrap-worker.test.d.ts +1 -0
  138. package/dist/test/cloudflare/wrap-worker.test.js +143 -0
  139. package/dist/test/cloudflare/wrap-worker.test.js.map +1 -0
  140. package/dist/test/react-router/sdk-setup.test.js +2 -2
  141. package/dist/test/react-router/sdk-setup.test.js.map +1 -1
  142. package/dist/test/utils/clack/mcp-config.test.js +176 -51
  143. package/dist/test/utils/clack/mcp-config.test.js.map +1 -1
  144. package/package.json +5 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-wrangler-config.js","sourceRoot":"","sources":["../../../../src/cloudflare/wrangler/update-wrangler-config.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';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { findWranglerConfig } from './find-wrangler-config';\nimport { makeCodeSnippet, showCopyPasteInstructions } from '../../utils/clack';\nimport {\n getObjectProperty,\n parseJsonC,\n printJsonC,\n setOrUpdateObjectProperty,\n} from '../../utils/ast-utils';\nimport * as recast from 'recast';\n\nconst b = recast.types.builders;\n\ntype WranglerConfigUpdates = {\n compatibility_date?: string;\n compatibility_flags?: string[];\n version_metadata?: {\n binding: string;\n };\n [key: string]: unknown;\n};\n\nconst getTomlConfigSnippet = () => {\n return makeCodeSnippet(true, (unchanged, plus) =>\n plus(\n `\ncompatibility_flags = [\"nodejs_als\"]\ncompatibility_date = \"${new Date().toISOString().slice(0, 10)}\"\n\n[version_metadata]\nbinding = \"CF_VERSION_METADATA\"`,\n ),\n );\n};\n\n/**\n * Updates the wrangler config file with the provided configuration\n * Handles .toml (instructions only), .json, and .jsonc formats\n * For arrays: merges and deduplicates values\n * For objects: deep merges\n * For other types: overwrites\n */\nexport async function updateWranglerConfig(\n updates: WranglerConfigUpdates,\n): Promise<boolean> {\n const configFile = findWranglerConfig();\n\n if (!configFile) {\n clack.log.warn('No wrangler config file found.');\n\n return false;\n }\n\n const configPath = path.join(process.cwd(), configFile);\n\n try {\n const configContent = fs.readFileSync(configPath, 'utf-8');\n const extname = path.extname(configFile);\n\n switch (extname) {\n case '.jsonc':\n case '.json':\n updateJsoncConfig(configPath, configContent, updates);\n clack.log.success(\n `Updated ${chalk.cyan(configFile)} with Sentry configuration.`,\n );\n\n break;\n case '.toml':\n await showCopyPasteInstructions({\n filename: configFile,\n codeSnippet: getTomlConfigSnippet(),\n });\n break;\n }\n\n return true;\n } catch (error) {\n clack.log.error(\n `Failed to update ${chalk.cyan(configFile)}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n return false;\n }\n}\n\n/**\n * Sets a string property in a JSON/JSONC config object.\n * Overwrites any existing value.\n *\n * @param jsonObject The object expression to update\n * @param propertyName The name of the string property\n * @param value The string value to set\n */\nfunction setStringProperty(\n jsonObject: recast.types.namedTypes.ObjectExpression,\n propertyName: string,\n value: string,\n): void {\n setOrUpdateObjectProperty(jsonObject, propertyName, b.stringLiteral(value));\n}\n\n/**\n * Merges an array property in a JSON/JSONC config object.\n * Extracts existing array values, merges with new values, and deduplicates.\n *\n * @param jsonObject The object expression to update\n * @param propertyName The name of the array property\n * @param newValues The new array values to merge in\n */\nfunction mergeArrayProperty(\n jsonObject: recast.types.namedTypes.ObjectExpression,\n propertyName: string,\n newValues: string[],\n): void {\n const existingProperty = getObjectProperty(jsonObject, propertyName);\n const existingValues: string[] = [];\n\n // Extract existing values from the AST if they exist\n if (existingProperty && existingProperty.value.type === 'ArrayExpression') {\n existingProperty.value.elements.forEach((element) => {\n if (\n element &&\n (element.type === 'StringLiteral' || element.type === 'Literal') &&\n typeof element.value === 'string'\n ) {\n existingValues.push(element.value);\n }\n });\n }\n\n // Merge existing and new values, deduplicate\n const allValues = [...existingValues, ...newValues];\n const uniqueValues = Array.from(new Set(allValues));\n\n setOrUpdateObjectProperty(\n jsonObject,\n propertyName,\n b.arrayExpression(uniqueValues.map((value) => b.stringLiteral(value))),\n );\n}\n\n/**\n * Merges properties into a nested object property in a JSON/JSONC config object.\n * Gets or creates the nested ObjectExpression if it doesn't exist,\n * then merges the provided properties into it, preserving existing properties.\n *\n * @param jsonObject The object expression to update\n * @param propertyName The name of the nested object property\n * @param updates The properties to merge into the nested object\n */\nfunction setObjectProperty<T extends object>(\n jsonObject: recast.types.namedTypes.ObjectExpression,\n propertyName: string,\n updates: T,\n): void {\n const existingProperty = getObjectProperty(jsonObject, propertyName);\n let nestedObject: recast.types.namedTypes.ObjectExpression;\n\n if (existingProperty && existingProperty.value.type === 'ObjectExpression') {\n nestedObject = existingProperty.value;\n } else {\n nestedObject = b.objectExpression([]);\n setOrUpdateObjectProperty(jsonObject, propertyName, nestedObject);\n }\n\n updateJsoncObject(nestedObject, updates);\n}\n\nfunction updateJsoncObject<T extends object>(\n jsonObject: recast.types.namedTypes.ObjectExpression,\n updates: T,\n): void {\n for (const [key, value] of Object.entries(updates)) {\n if (value === null || value === undefined) {\n continue;\n }\n\n if (typeof value === 'string') {\n setStringProperty(jsonObject, key, value);\n } else if (Array.isArray(value)) {\n mergeArrayProperty(jsonObject, key, value as string[]);\n } else if (typeof value === 'object') {\n setObjectProperty(jsonObject, key, value);\n }\n }\n}\n\n/**\n * Updates a JSON/JSONC config file using jsonc-parser\n * Preserves comments and formatting while merging values\n */\nfunction updateJsoncConfig(\n configPath: string,\n content: string,\n updates: WranglerConfigUpdates,\n): void {\n const { jsonObject, ast } = parseJsonC(content);\n\n if (!jsonObject) {\n throw new Error('Failed to parse JSON/JSONC config file');\n }\n\n updateJsoncObject(jsonObject, updates);\n\n const code = printJsonC(ast);\n\n fs.writeFileSync(configPath, code, 'utf-8');\n}\n"]}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Wraps a Cloudflare Worker's default export with Sentry.withSentry()
3
+ *
4
+ * Before:
5
+ * ```
6
+ * export default {
7
+ * async fetch(request, env, ctx) { ... }
8
+ * } satisfies ExportedHandler<Env>;
9
+ * ```
10
+ *
11
+ * After:
12
+ * ```
13
+ * import * as Sentry from '@sentry/cloudflare';
14
+ *
15
+ * export default Sentry.withSentry(
16
+ * (env) => ({
17
+ * dsn: 'your-dsn',
18
+ * tracesSampleRate: 1,
19
+ * }),
20
+ * {
21
+ * async fetch(request, env, ctx) { ... }
22
+ * } satisfies ExportedHandler<Env>
23
+ * );
24
+ * ```
25
+ *
26
+ * @param workerFilePath - Path to the worker file to wrap
27
+ * @param dsn - Sentry DSN for initialization
28
+ * @param selectedFeatures - Feature flags for optional Sentry features
29
+ */
30
+ export declare function wrapWorkerWithSentry(workerFilePath: string, dsn: string, selectedFeatures: {
31
+ performance: boolean;
32
+ }): Promise<void>;
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.wrapWorkerWithSentry = void 0;
30
+ const recast = __importStar(require("recast"));
31
+ // @ts-expect-error - magicast is ESM and TS complains about that. It works though
32
+ const magicast_1 = require("magicast");
33
+ // @ts-expect-error - clack is ESM and TS complains about that. It works though
34
+ const clack = __importStar(require("@clack/prompts"));
35
+ const ast_utils_1 = require("../utils/ast-utils");
36
+ const chalk_1 = __importDefault(require("chalk"));
37
+ const b = recast.types.builders;
38
+ /**
39
+ * Wraps a Cloudflare Worker's default export with Sentry.withSentry()
40
+ *
41
+ * Before:
42
+ * ```
43
+ * export default {
44
+ * async fetch(request, env, ctx) { ... }
45
+ * } satisfies ExportedHandler<Env>;
46
+ * ```
47
+ *
48
+ * After:
49
+ * ```
50
+ * import * as Sentry from '@sentry/cloudflare';
51
+ *
52
+ * export default Sentry.withSentry(
53
+ * (env) => ({
54
+ * dsn: 'your-dsn',
55
+ * tracesSampleRate: 1,
56
+ * }),
57
+ * {
58
+ * async fetch(request, env, ctx) { ... }
59
+ * } satisfies ExportedHandler<Env>
60
+ * );
61
+ * ```
62
+ *
63
+ * @param workerFilePath - Path to the worker file to wrap
64
+ * @param dsn - Sentry DSN for initialization
65
+ * @param selectedFeatures - Feature flags for optional Sentry features
66
+ */
67
+ async function wrapWorkerWithSentry(workerFilePath, dsn, selectedFeatures) {
68
+ const workerAst = await (0, magicast_1.loadFile)(workerFilePath);
69
+ if ((0, ast_utils_1.hasSentryContent)(workerAst.$ast)) {
70
+ clack.log.warn(`Sentry is already configured in ${chalk_1.default.cyan(workerFilePath)}. Skipping wrapping with Sentry.`);
71
+ return;
72
+ }
73
+ workerAst.imports.$add({
74
+ from: '@sentry/cloudflare',
75
+ imported: '*',
76
+ local: 'Sentry',
77
+ });
78
+ recast.visit(workerAst.$ast, {
79
+ visitExportDefaultDeclaration(path) {
80
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
81
+ const originalDeclaration = path.value.declaration;
82
+ const sentryConfig = createSentryConfigFunction(dsn, selectedFeatures);
83
+ const wrappedExport = b.callExpression(b.memberExpression(b.identifier('Sentry'), b.identifier('withSentry')), [sentryConfig, originalDeclaration]);
84
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
85
+ path.value.declaration = wrappedExport;
86
+ return false;
87
+ },
88
+ });
89
+ await (0, magicast_1.writeFile)(workerAst.$ast, workerFilePath);
90
+ }
91
+ exports.wrapWorkerWithSentry = wrapWorkerWithSentry;
92
+ /**
93
+ * Creates the Sentry config function: (env) => ({ dsn: '...', ... })
94
+ */
95
+ function createSentryConfigFunction(dsn, selectedFeatures) {
96
+ const configProperties = [
97
+ b.objectProperty(b.identifier('dsn'), b.stringLiteral(dsn)),
98
+ ];
99
+ if (selectedFeatures.performance) {
100
+ const tracesSampleRateProperty = b.objectProperty(b.identifier('tracesSampleRate'), b.numericLiteral(1));
101
+ tracesSampleRateProperty.comments = [
102
+ b.commentLine(' Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control.', true, false),
103
+ ];
104
+ configProperties.push(tracesSampleRateProperty);
105
+ }
106
+ const configObject = b.objectExpression(configProperties);
107
+ return b.arrowFunctionExpression([b.identifier('env')], configObject);
108
+ }
109
+ //# sourceMappingURL=wrap-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-worker.js","sourceRoot":"","sources":["../../../src/cloudflare/wrap-worker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AAEjC,kFAAkF;AAClF,uCAA+C;AAC/C,+EAA+E;AAC/E,sDAAwC;AACxC,kDAAsD;AACtD,kDAA0B;AAG1B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACI,KAAK,UAAU,oBAAoB,CACxC,cAAsB,EACtB,GAAW,EACX,gBAEC;IAED,MAAM,SAAS,GAAG,MAAM,IAAA,mBAAQ,EAAC,cAAc,CAAC,CAAC;IAEjD,IAAI,IAAA,4BAAgB,EAAC,SAAS,CAAC,IAAiB,CAAC,EAAE;QACjD,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,mCAAmC,eAAK,CAAC,IAAI,CAC3C,cAAc,CACf,kCAAkC,CACpC,CAAC;QACF,OAAO;KACR;IAED,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;QACrB,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,GAAG;QACb,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE;QAC3B,6BAA6B,CAAC,IAAI;YAChC,+GAA+G;YAC/G,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,WAA6B,CAAC;YACrE,MAAM,YAAY,GAAG,0BAA0B,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;YACvE,MAAM,aAAa,GAAG,CAAC,CAAC,cAAc,CACpC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EACtE,CAAC,YAAY,EAAE,mBAAmB,CAAC,CACpC,CAAC;YAEF,sEAAsE;YACtE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,aAAa,CAAC;YAEvC,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,IAAA,oBAAS,EAAC,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AAClD,CAAC;AA1CD,oDA0CC;AAED;;GAEG;AACH,SAAS,0BAA0B,CACjC,GAAW,EACX,gBAEC;IAED,MAAM,gBAAgB,GAAuB;QAC3C,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;KAC5D,CAAC;IAEF,IAAI,gBAAgB,CAAC,WAAW,EAAE;QAChC,MAAM,wBAAwB,GAAG,CAAC,CAAC,cAAc,CAC/C,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAChC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CACpB,CAAC;QAEF,wBAAwB,CAAC,QAAQ,GAAG;YAClC,CAAC,CAAC,WAAW,CACX,mHAAmH,EACnH,IAAI,EACJ,KAAK,CACN;SACF,CAAC;QAEF,gBAAgB,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;KACjD;IAED,MAAM,YAAY,GAAG,CAAC,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAE1D,OAAO,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AACxE,CAAC","sourcesContent":["import * as recast from 'recast';\nimport type { namedTypes as t } from 'ast-types';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { loadFile, writeFile } from 'magicast';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport { hasSentryContent } from '../utils/ast-utils';\nimport chalk from 'chalk';\nimport { ExpressionKind } from 'ast-types/lib/gen/kinds';\n\nconst b = recast.types.builders;\n\n/**\n * Wraps a Cloudflare Worker's default export with Sentry.withSentry()\n *\n * Before:\n * ```\n * export default {\n * async fetch(request, env, ctx) { ... }\n * } satisfies ExportedHandler<Env>;\n * ```\n *\n * After:\n * ```\n * import * as Sentry from '@sentry/cloudflare';\n *\n * export default Sentry.withSentry(\n * (env) => ({\n * dsn: 'your-dsn',\n * tracesSampleRate: 1,\n * }),\n * {\n * async fetch(request, env, ctx) { ... }\n * } satisfies ExportedHandler<Env>\n * );\n * ```\n *\n * @param workerFilePath - Path to the worker file to wrap\n * @param dsn - Sentry DSN for initialization\n * @param selectedFeatures - Feature flags for optional Sentry features\n */\nexport async function wrapWorkerWithSentry(\n workerFilePath: string,\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n },\n): Promise<void> {\n const workerAst = await loadFile(workerFilePath);\n\n if (hasSentryContent(workerAst.$ast as t.Program)) {\n clack.log.warn(\n `Sentry is already configured in ${chalk.cyan(\n workerFilePath,\n )}. Skipping wrapping with Sentry.`,\n );\n return;\n }\n\n workerAst.imports.$add({\n from: '@sentry/cloudflare',\n imported: '*',\n local: 'Sentry',\n });\n\n recast.visit(workerAst.$ast, {\n visitExportDefaultDeclaration(path) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n const originalDeclaration = path.value.declaration as ExpressionKind;\n const sentryConfig = createSentryConfigFunction(dsn, selectedFeatures);\n const wrappedExport = b.callExpression(\n b.memberExpression(b.identifier('Sentry'), b.identifier('withSentry')),\n [sentryConfig, originalDeclaration],\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n path.value.declaration = wrappedExport;\n\n return false;\n },\n });\n\n await writeFile(workerAst.$ast, workerFilePath);\n}\n\n/**\n * Creates the Sentry config function: (env) => ({ dsn: '...', ... })\n */\nfunction createSentryConfigFunction(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n },\n): t.ArrowFunctionExpression {\n const configProperties: t.ObjectProperty[] = [\n b.objectProperty(b.identifier('dsn'), b.stringLiteral(dsn)),\n ];\n\n if (selectedFeatures.performance) {\n const tracesSampleRateProperty = b.objectProperty(\n b.identifier('tracesSampleRate'),\n b.numericLiteral(1),\n );\n\n tracesSampleRateProperty.comments = [\n b.commentLine(\n ' Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control.',\n true,\n false,\n ),\n ];\n\n configProperties.push(tracesSampleRateProperty);\n }\n\n const configObject = b.objectExpression(configProperties);\n\n return b.arrowFunctionExpression([b.identifier('env')], configObject);\n}\n"]}
@@ -40,6 +40,7 @@ const clack_1 = require("../utils/clack");
40
40
  const telemetry_1 = require("../telemetry");
41
41
  const code_tools_1 = require("./code-tools");
42
42
  const mcp_config_1 = require("../utils/clack/mcp-config");
43
+ const abort_if_sportlight_not_supported_1 = require("../utils/abort-if-sportlight-not-supported");
43
44
  async function runFlutterWizard(options) {
44
45
  return (0, telemetry_1.withTelemetry)({
45
46
  enabled: options.telemetryEnabled,
@@ -59,10 +60,7 @@ async function runFlutterWizardWithTelemetry(options) {
59
60
  });
60
61
  const projectData = await (0, clack_1.getOrAskForProjectData)(options, 'flutter');
61
62
  if (projectData.spotlight) {
62
- clack.log.warn('Spotlight mode is not yet supported for Flutter.');
63
- clack.log.info('Spotlight is currently only available for Next.js.');
64
- await (0, clack_1.abort)('Exiting wizard', 0);
65
- return;
63
+ return (0, abort_if_sportlight_not_supported_1.abortIfSpotlightNotSupported)('Flutter');
66
64
  }
67
65
  const { selectedProject, selfHosted, sentryUrl, authToken } = projectData;
68
66
  const projectDir = process.cwd();
@@ -119,8 +117,7 @@ Set the ${chalk_1.default.cyan('SENTRY_AUTH_TOKEN')} environment variable in you
119
117
  const issuesPageLink = selfHosted
120
118
  ? `${sentryUrl}organizations/${selectedProject.organization.slug}/issues/?project=${selectedProject.id}`
121
119
  : `https://${selectedProject.organization.slug}.sentry.io/issues/?project=${selectedProject.id}`;
122
- clack.outro(`
123
- ${chalk_1.default.greenBright('Successfully installed the Sentry Flutter SDK!')}
120
+ clack.outro(`${chalk_1.default.greenBright('Successfully installed the Sentry Flutter SDK!')}
124
121
 
125
122
  ${chalk_1.default.cyan('Next steps:')}
126
123
  1. Run ${chalk_1.default.bold('flutter run')} to test the setup - we've added a test error that will trigger on app start
@@ -1 +1 @@
1
- {"version":3,"file":"flutter-wizard.js","sourceRoot":"","sources":["../../../src/flutter/flutter-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fetchSdkVersion } from '../utils/release-registry';\nimport { WizardOptions } from '../utils/types';\nimport * as codetools from './code-tools';\nimport { initSnippetColored, pubspecSnippetColored } from './templates';\n// @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 {\n abort,\n confirmContinueIfNoOrDirtyGitRepo,\n getOrAskForProjectData,\n printWelcome,\n showCopyPasteInstructions,\n} from '../utils/clack';\n\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { findFile } from './code-tools';\nimport { offerProjectScopedMcpConfig } from '../utils/clack/mcp-config';\n\nexport async function runFlutterWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'flutter',\n wizardOptions: options,\n },\n () => runFlutterWizardWithTelemetry(options),\n );\n}\n\nasync function runFlutterWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Flutter Wizard',\n promoCode: options.promoCode,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const projectData = await getOrAskForProjectData(options, 'flutter');\n\n if (projectData.spotlight) {\n clack.log.warn('Spotlight mode is not yet supported for Flutter.');\n clack.log.info('Spotlight is currently only available for Next.js.');\n await abort('Exiting wizard', 0);\n return;\n }\n\n const { selectedProject, selfHosted, sentryUrl, authToken } = projectData;\n\n const projectDir = process.cwd();\n const pubspecFile = path.join(projectDir, 'pubspec.yaml');\n if (!fs.existsSync(pubspecFile)) {\n clack.log.error(\n `Could not find ${chalk.cyan(\n 'pubspec.yaml',\n )}. Make sure you run the wizard in the projects root folder.`,\n );\n return;\n }\n\n // ======== STEP 1. Add sentry_flutter and sentry_dart_plugin to pubspec.yaml ============\n\n clack.log.step(\n `Adding ${chalk.bold('Sentry')} to your apps ${chalk.cyan(\n 'pubspec.yaml',\n )} file.`,\n );\n\n const flutterVersion = await fetchSdkVersion('sentry.dart.flutter');\n const flutterVersionOrAny = flutterVersion ? `^${flutterVersion}` : 'any';\n\n const pluginVersion = await fetchSdkVersion('sentry.dart.plugin');\n const pluginVersionOrAny = pluginVersion ? `^${pluginVersion}` : 'any';\n\n const pubspecPatched = traceStep('Patch pubspec.yaml', () =>\n codetools.patchPubspec(\n pubspecFile,\n flutterVersionOrAny,\n pluginVersionOrAny,\n selectedProject.slug,\n selectedProject.organization.slug,\n ),\n );\n if (!pubspecPatched) {\n clack.log.warn(\n `Could not patch ${chalk.cyan(\n 'pubspec.yaml',\n )}. Add the dependencies to it.`,\n );\n await showCopyPasteInstructions({\n filename: 'pubspec.yaml',\n codeSnippet: pubspecSnippetColored(\n flutterVersionOrAny,\n pluginVersionOrAny,\n selectedProject.slug,\n selectedProject.organization.slug,\n ),\n hint: 'This ensures the Sentry SDK and plugin can be imported.',\n });\n }\n Sentry.setTag('pubspec-patched', pubspecPatched);\n\n // ======== STEP 2. Add sentry.properties with auth token ============\n\n const propertiesAdded = traceStep('Add sentry.properties', () =>\n codetools.addProperties(pubspecFile, authToken),\n );\n if (!propertiesAdded) {\n clack.log.warn(\n `We could not add ${chalk.cyan(\n 'sentry.properties',\n )} file in your project directory in order to provide an auth token for Sentry CLI. You'll have to add it manually, or you can set the SENTRY_AUTH_TOKEN environment variable instead. See https://docs.sentry.io/cli/configuration/#auth-token for more information.`,\n );\n } else {\n clack.log.info(\n `Created a ${chalk.cyan(\n 'sentry.properties',\n )} file in your project directory to provide an auth token for Sentry CLI.\nIt was also added to your ${chalk.cyan('.gitignore')} file.\nSet the ${chalk.cyan(\n 'SENTRY_AUTH_TOKEN',\n )} environment variable in your CI environment. See https://docs.sentry.io/cli/configuration/#auth-token for more information.`,\n );\n }\n Sentry.setTag('sentry-properties-added', pubspecPatched);\n\n // ======== STEP 3. Patch main.dart with setup and a test error snippet ============\n\n clack.log.step(\n `Next, the wizard will patch your ${chalk.cyan(\n 'main.dart',\n )} file with the SDK init and a test error snippet.`,\n );\n\n const mainFile = findFile(`${projectDir}/lib`, 'main.dart');\n const dsn = selectedProject.keys[0].dsn.public;\n const canEnableProfiling =\n fs.existsSync(`${projectDir}/ios`) || fs.existsSync(`${projectDir}/macos`);\n\n const mainPatched = await traceStep('Patch main.dart', () =>\n codetools.patchMain(mainFile, dsn, canEnableProfiling),\n );\n if (!mainPatched) {\n clack.log.warn(\n `Could not patch ${chalk.cyan(\n 'main.dart',\n )} file. Place the following code snippet within the apps main function.`,\n );\n await showCopyPasteInstructions({\n filename: 'main.dart',\n codeSnippet: initSnippetColored(dsn),\n hint: 'This ensures the Sentry SDK is ready to capture errors.',\n });\n }\n Sentry.setTag('main-patched', mainPatched);\n\n // ======== OUTRO ========\n\n // Offer optional project-scoped MCP config for Sentry with org and project scope\n await offerProjectScopedMcpConfig(\n selectedProject.organization.slug,\n selectedProject.slug,\n );\n\n const issuesPageLink = selfHosted\n ? `${sentryUrl}organizations/${selectedProject.organization.slug}/issues/?project=${selectedProject.id}`\n : `https://${selectedProject.organization.slug}.sentry.io/issues/?project=${selectedProject.id}`;\n\n clack.outro(`\n ${chalk.greenBright('Successfully installed the Sentry Flutter SDK!')}\n \n ${chalk.cyan('Next steps:')}\n 1. Run ${chalk.bold(\n 'flutter run',\n )} to test the setup - we've added a test error that will trigger on app start\n 2. For production builds, run ${chalk.bold(\n 'flutter build apk --obfuscate --split-debug-info=build/debug-info',\n )} (or ios/macos) then ${chalk.bold(\n 'flutter pub run sentry_dart_plugin',\n )} to upload debug symbols\n 3. View your test error and transaction data at ${issuesPageLink}\n \n ${chalk.cyan('Learn more:')}\n - Debug Symbols: https://docs.sentry.io/platforms/dart/guides/flutter/debug-symbols/\n - Performance Monitoring: https://docs.sentry.io/platforms/dart/guides/flutter/performance/\n - Integrations: https://docs.sentry.io/platforms/dart/guides/flutter/integrations/\n `);\n}\n"]}
1
+ {"version":3,"file":"flutter-wizard.js","sourceRoot":"","sources":["../../../src/flutter/flutter-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fetchSdkVersion } from '../utils/release-registry';\nimport { WizardOptions } from '../utils/types';\nimport * as codetools from './code-tools';\nimport { initSnippetColored, pubspecSnippetColored } from './templates';\n// @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 {\n confirmContinueIfNoOrDirtyGitRepo,\n getOrAskForProjectData,\n printWelcome,\n showCopyPasteInstructions,\n} from '../utils/clack';\n\nimport { traceStep, withTelemetry } from '../telemetry';\nimport { findFile } from './code-tools';\nimport { offerProjectScopedMcpConfig } from '../utils/clack/mcp-config';\nimport { abortIfSpotlightNotSupported } from '../utils/abort-if-sportlight-not-supported';\n\nexport async function runFlutterWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'flutter',\n wizardOptions: options,\n },\n () => runFlutterWizardWithTelemetry(options),\n );\n}\n\nasync function runFlutterWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Flutter Wizard',\n promoCode: options.promoCode,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const projectData = await getOrAskForProjectData(options, 'flutter');\n\n if (projectData.spotlight) {\n return abortIfSpotlightNotSupported('Flutter');\n }\n\n const { selectedProject, selfHosted, sentryUrl, authToken } = projectData;\n\n const projectDir = process.cwd();\n const pubspecFile = path.join(projectDir, 'pubspec.yaml');\n if (!fs.existsSync(pubspecFile)) {\n clack.log.error(\n `Could not find ${chalk.cyan(\n 'pubspec.yaml',\n )}. Make sure you run the wizard in the projects root folder.`,\n );\n return;\n }\n\n // ======== STEP 1. Add sentry_flutter and sentry_dart_plugin to pubspec.yaml ============\n\n clack.log.step(\n `Adding ${chalk.bold('Sentry')} to your apps ${chalk.cyan(\n 'pubspec.yaml',\n )} file.`,\n );\n\n const flutterVersion = await fetchSdkVersion('sentry.dart.flutter');\n const flutterVersionOrAny = flutterVersion ? `^${flutterVersion}` : 'any';\n\n const pluginVersion = await fetchSdkVersion('sentry.dart.plugin');\n const pluginVersionOrAny = pluginVersion ? `^${pluginVersion}` : 'any';\n\n const pubspecPatched = traceStep('Patch pubspec.yaml', () =>\n codetools.patchPubspec(\n pubspecFile,\n flutterVersionOrAny,\n pluginVersionOrAny,\n selectedProject.slug,\n selectedProject.organization.slug,\n ),\n );\n if (!pubspecPatched) {\n clack.log.warn(\n `Could not patch ${chalk.cyan(\n 'pubspec.yaml',\n )}. Add the dependencies to it.`,\n );\n await showCopyPasteInstructions({\n filename: 'pubspec.yaml',\n codeSnippet: pubspecSnippetColored(\n flutterVersionOrAny,\n pluginVersionOrAny,\n selectedProject.slug,\n selectedProject.organization.slug,\n ),\n hint: 'This ensures the Sentry SDK and plugin can be imported.',\n });\n }\n Sentry.setTag('pubspec-patched', pubspecPatched);\n\n // ======== STEP 2. Add sentry.properties with auth token ============\n\n const propertiesAdded = traceStep('Add sentry.properties', () =>\n codetools.addProperties(pubspecFile, authToken),\n );\n if (!propertiesAdded) {\n clack.log.warn(\n `We could not add ${chalk.cyan(\n 'sentry.properties',\n )} file in your project directory in order to provide an auth token for Sentry CLI. You'll have to add it manually, or you can set the SENTRY_AUTH_TOKEN environment variable instead. See https://docs.sentry.io/cli/configuration/#auth-token for more information.`,\n );\n } else {\n clack.log.info(\n `Created a ${chalk.cyan(\n 'sentry.properties',\n )} file in your project directory to provide an auth token for Sentry CLI.\nIt was also added to your ${chalk.cyan('.gitignore')} file.\nSet the ${chalk.cyan(\n 'SENTRY_AUTH_TOKEN',\n )} environment variable in your CI environment. See https://docs.sentry.io/cli/configuration/#auth-token for more information.`,\n );\n }\n Sentry.setTag('sentry-properties-added', pubspecPatched);\n\n // ======== STEP 3. Patch main.dart with setup and a test error snippet ============\n\n clack.log.step(\n `Next, the wizard will patch your ${chalk.cyan(\n 'main.dart',\n )} file with the SDK init and a test error snippet.`,\n );\n\n const mainFile = findFile(`${projectDir}/lib`, 'main.dart');\n const dsn = selectedProject.keys[0].dsn.public;\n const canEnableProfiling =\n fs.existsSync(`${projectDir}/ios`) || fs.existsSync(`${projectDir}/macos`);\n\n const mainPatched = await traceStep('Patch main.dart', () =>\n codetools.patchMain(mainFile, dsn, canEnableProfiling),\n );\n if (!mainPatched) {\n clack.log.warn(\n `Could not patch ${chalk.cyan(\n 'main.dart',\n )} file. Place the following code snippet within the apps main function.`,\n );\n await showCopyPasteInstructions({\n filename: 'main.dart',\n codeSnippet: initSnippetColored(dsn),\n hint: 'This ensures the Sentry SDK is ready to capture errors.',\n });\n }\n Sentry.setTag('main-patched', mainPatched);\n\n // ======== OUTRO ========\n\n // Offer optional project-scoped MCP config for Sentry with org and project scope\n await offerProjectScopedMcpConfig(\n selectedProject.organization.slug,\n selectedProject.slug,\n );\n\n const issuesPageLink = selfHosted\n ? `${sentryUrl}organizations/${selectedProject.organization.slug}/issues/?project=${selectedProject.id}`\n : `https://${selectedProject.organization.slug}.sentry.io/issues/?project=${selectedProject.id}`;\n\n clack.outro(`${chalk.greenBright(\n 'Successfully installed the Sentry Flutter SDK!',\n )}\n \n ${chalk.cyan('Next steps:')}\n 1. Run ${chalk.bold(\n 'flutter run',\n )} to test the setup - we've added a test error that will trigger on app start\n 2. For production builds, run ${chalk.bold(\n 'flutter build apk --obfuscate --split-debug-info=build/debug-info',\n )} (or ios/macos) then ${chalk.bold(\n 'flutter pub run sentry_dart_plugin',\n )} to upload debug symbols\n 3. View your test error and transaction data at ${issuesPageLink}\n \n ${chalk.cyan('Learn more:')}\n - Debug Symbols: https://docs.sentry.io/platforms/dart/guides/flutter/debug-symbols/\n - Performance Monitoring: https://docs.sentry.io/platforms/dart/guides/flutter/performance/\n - Integrations: https://docs.sentry.io/platforms/dart/guides/flutter/integrations/\n `);\n}\n"]}
@@ -256,8 +256,6 @@ async function runNextjsWizardWithTelemetry(options) {
256
256
  prompts_1.default.outro(`
257
257
  ${chalk_1.default.green('Successfully installed the Sentry Next.js SDK!')} ${shouldCreateExamplePage
258
258
  ? `\n\nYou can validate your setup by (re)starting your dev environment (e.g. ${chalk_1.default.cyan(`${packageManagerForOutro.runScriptCommand} dev`)}) and visiting ${chalk_1.default.cyan('"/sentry-example-page"')}`
259
- : ''}${shouldCreateExamplePage && isLikelyUsingTurbopack
260
- ? `\nDon't forget to remove \`--turbo\` or \`--turbopack\` from your dev command until you have verified the SDK is working. You can safely add it back afterwards.`
261
259
  : ''}
262
260
 
263
261
  ${chalk_1.default.dim('If you encounter any issues, let us know here: https://github.com/getsentry/sentry-javascript/issues')}`);