@sentry/wizard 6.9.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.
- package/CHANGELOG.md +56 -1
- package/dist/ci-ensure-runtime-loaded.sh +82 -0
- package/dist/e2e-tests/tests/angular-17.test.js +72 -82
- package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
- package/dist/e2e-tests/tests/angular-19.test.js +71 -80
- package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
- package/dist/e2e-tests/tests/cloudflare-worker.test.d.ts +1 -0
- package/dist/e2e-tests/tests/cloudflare-worker.test.js +64 -0
- package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -0
- package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js +2 -5
- package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js.map +1 -1
- package/dist/e2e-tests/tests/expo.test.js +36 -61
- package/dist/e2e-tests/tests/expo.test.js.map +1 -1
- package/dist/e2e-tests/tests/flutter.test.js +63 -70
- package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
- package/dist/e2e-tests/tests/help-message.test.js +2 -2
- package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-14.test.js +54 -82
- package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-15.test.js +95 -105
- package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-16.test.d.ts +1 -0
- package/dist/e2e-tests/tests/nextjs-16.test.js +123 -0
- package/dist/e2e-tests/tests/nextjs-16.test.js.map +1 -0
- package/dist/e2e-tests/tests/nuxt-3.test.js +45 -58
- package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-4.test.js +59 -73
- package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
- package/dist/e2e-tests/tests/pnpm-workspace.test.js +4 -7
- package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-native.test.js +44 -80
- package/dist/e2e-tests/tests/react-native.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-router.test.js +163 -145
- package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
- package/dist/e2e-tests/tests/remix.test.js +162 -132
- package/dist/e2e-tests/tests/remix.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js +48 -36
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js +3 -6
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
- package/dist/e2e-tests/utils/index.d.ts +21 -43
- package/dist/e2e-tests/utils/index.js +108 -183
- package/dist/e2e-tests/utils/index.js.map +1 -1
- package/dist/get-e2e-test-matrix.mjs +11 -0
- package/dist/lib/Constants.d.ts +1 -0
- package/dist/lib/Constants.js +5 -0
- package/dist/lib/Constants.js.map +1 -1
- package/dist/src/android/android-wizard.js +2 -4
- package/dist/src/android/android-wizard.js.map +1 -1
- package/dist/src/angular/angular-wizard.js +4 -6
- package/dist/src/angular/angular-wizard.js.map +1 -1
- package/dist/src/angular/sdk-setup.js +1 -1
- package/dist/src/angular/sdk-setup.js.map +1 -1
- package/dist/src/apple/apple-wizard.js +2 -4
- package/dist/src/apple/apple-wizard.js.map +1 -1
- package/dist/src/cloudflare/cloudflare-wizard.d.ts +3 -0
- package/dist/src/cloudflare/cloudflare-wizard.js +99 -0
- package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -0
- package/dist/src/cloudflare/sdk-setup.d.ts +7 -0
- package/dist/src/cloudflare/sdk-setup.js +47 -0
- package/dist/src/cloudflare/sdk-setup.js.map +1 -0
- package/dist/src/cloudflare/templates.d.ts +4 -0
- package/dist/src/cloudflare/templates.js +44 -0
- package/dist/src/cloudflare/templates.js.map +1 -0
- package/dist/src/cloudflare/wrangler/create-wrangler-config.d.ts +4 -0
- package/dist/src/cloudflare/wrangler/create-wrangler-config.js +27 -0
- package/dist/src/cloudflare/wrangler/create-wrangler-config.js.map +1 -0
- package/dist/src/cloudflare/wrangler/ensure-wrangler-config.d.ts +4 -0
- package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js +25 -0
- package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js.map +1 -0
- package/dist/src/cloudflare/wrangler/find-wrangler-config.d.ts +4 -0
- package/dist/src/cloudflare/wrangler/find-wrangler-config.js +23 -0
- package/dist/src/cloudflare/wrangler/find-wrangler-config.js.map +1 -0
- package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.d.ts +6 -0
- package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js +52 -0
- package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js.map +1 -0
- package/dist/src/cloudflare/wrangler/update-wrangler-config.d.ts +17 -0
- package/dist/src/cloudflare/wrangler/update-wrangler-config.js +173 -0
- package/dist/src/cloudflare/wrangler/update-wrangler-config.js.map +1 -0
- package/dist/src/cloudflare/wrap-worker.d.ts +32 -0
- package/dist/src/cloudflare/wrap-worker.js +109 -0
- package/dist/src/cloudflare/wrap-worker.js.map +1 -0
- package/dist/src/flutter/flutter-wizard.js +3 -6
- package/dist/src/flutter/flutter-wizard.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +46 -10
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.d.ts +6 -3
- package/dist/src/nextjs/templates.js +144 -93
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/nuxt/nuxt-wizard.js +3 -5
- package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.js +2 -4
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-router/codemods/client.entry.js +4 -1
- package/dist/src/react-router/codemods/client.entry.js.map +1 -1
- package/dist/src/react-router/react-router-wizard.js +3 -5
- package/dist/src/react-router/react-router-wizard.js.map +1 -1
- package/dist/src/react-router/sdk-example.js +5 -2
- package/dist/src/react-router/sdk-example.js.map +1 -1
- package/dist/src/react-router/sdk-setup.d.ts +1 -1
- package/dist/src/react-router/sdk-setup.js +3 -4
- package/dist/src/react-router/sdk-setup.js.map +1 -1
- package/dist/src/remix/remix-wizard.js +2 -4
- package/dist/src/remix/remix-wizard.js.map +1 -1
- package/dist/src/run.d.ts +1 -1
- package/dist/src/run.js +5 -0
- package/dist/src/run.js.map +1 -1
- package/dist/src/sourcemaps/tools/sentry-cli.js +1 -1
- package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
- package/dist/src/sourcemaps/tools/wrangler.js +1 -1
- package/dist/src/sourcemaps/tools/wrangler.js.map +1 -1
- package/dist/src/sveltekit/sveltekit-wizard.js +4 -6
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
- package/dist/src/telemetry.d.ts +1 -1
- package/dist/src/telemetry.js +52 -31
- package/dist/src/telemetry.js.map +1 -1
- package/dist/src/utils/abort-if-sportlight-not-supported.d.ts +5 -0
- package/dist/src/utils/abort-if-sportlight-not-supported.js +40 -0
- package/dist/src/utils/abort-if-sportlight-not-supported.js.map +1 -0
- package/dist/src/utils/ast-utils.d.ts +1 -1
- package/dist/src/utils/ast-utils.js.map +1 -1
- package/dist/src/utils/clack/index.d.ts +19 -2
- package/dist/src/utils/clack/index.js +174 -12
- package/dist/src/utils/clack/index.js.map +1 -1
- package/dist/src/utils/clack/mcp-config.js +117 -59
- package/dist/src/utils/clack/mcp-config.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/test/angular/angular-wizard.test.js +2 -4
- package/dist/test/angular/angular-wizard.test.js.map +1 -1
- package/dist/test/apple/cocoapod.test.js +7 -3
- package/dist/test/apple/cocoapod.test.js.map +1 -1
- package/dist/test/apple/code-tools.test.js +8 -2
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/cloudflare/create-wrangler-config.test.d.ts +1 -0
- package/dist/test/cloudflare/create-wrangler-config.test.js +48 -0
- package/dist/test/cloudflare/create-wrangler-config.test.js.map +1 -0
- package/dist/test/cloudflare/ensure-wrangler-config.test.d.ts +1 -0
- package/dist/test/cloudflare/ensure-wrangler-config.test.js +61 -0
- package/dist/test/cloudflare/ensure-wrangler-config.test.js.map +1 -0
- package/dist/test/cloudflare/find-wrangler-config.test.d.ts +1 -0
- package/dist/test/cloudflare/find-wrangler-config.test.js +77 -0
- package/dist/test/cloudflare/find-wrangler-config.test.js.map +1 -0
- package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.d.ts +1 -0
- package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js +81 -0
- package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js.map +1 -0
- package/dist/test/cloudflare/sdk-setup.test.d.ts +1 -0
- package/dist/test/cloudflare/sdk-setup.test.js +152 -0
- package/dist/test/cloudflare/sdk-setup.test.js.map +1 -0
- package/dist/test/cloudflare/templates.test.d.ts +1 -0
- package/dist/test/cloudflare/templates.test.js +68 -0
- package/dist/test/cloudflare/templates.test.js.map +1 -0
- package/dist/test/cloudflare/update-wrangler-config.test.d.ts +1 -0
- package/dist/test/cloudflare/update-wrangler-config.test.js +216 -0
- package/dist/test/cloudflare/update-wrangler-config.test.js.map +1 -0
- package/dist/test/cloudflare/wrap-worker.test.d.ts +1 -0
- package/dist/test/cloudflare/wrap-worker.test.js +143 -0
- package/dist/test/cloudflare/wrap-worker.test.js.map +1 -0
- package/dist/test/nextjs/templates.test.js +156 -87
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/nextjs/wizard-double-wrap-prevention.test.js +12 -7
- package/dist/test/nextjs/wizard-double-wrap-prevention.test.js.map +1 -1
- package/dist/test/react-router/sdk-setup.test.js +2 -2
- package/dist/test/react-router/sdk-setup.test.js.map +1 -1
- package/dist/test/utils/clack/index.test.js +37 -29
- package/dist/test/utils/clack/index.test.js.map +1 -1
- package/dist/test/utils/clack/mcp-config.test.js +176 -51
- package/dist/test/utils/clack/mcp-config.test.js.map +1 -1
- package/package.json +6 -5
|
@@ -102,6 +102,19 @@ function getJetBrainsMcpJsonSnippet(orgSlug, projectSlug) {
|
|
|
102
102
|
};
|
|
103
103
|
return JSON.stringify(obj, null, 2);
|
|
104
104
|
}
|
|
105
|
+
function getOpenCodeMcpJsonSnippet(orgSlug, projectSlug) {
|
|
106
|
+
const obj = {
|
|
107
|
+
$schema: 'https://opencode.ai/config.json',
|
|
108
|
+
mcp: {
|
|
109
|
+
Sentry: {
|
|
110
|
+
type: 'remote',
|
|
111
|
+
url: getMcpUrl(orgSlug, projectSlug),
|
|
112
|
+
oauth: {},
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
return JSON.stringify(obj, null, 2);
|
|
117
|
+
}
|
|
105
118
|
function getGenericMcpJsonSnippet(orgSlug, projectSlug) {
|
|
106
119
|
const obj = {
|
|
107
120
|
mcpServers: {
|
|
@@ -176,6 +189,30 @@ async function addClaudeCodeMcpConfig(orgSlug, projectSlug) {
|
|
|
176
189
|
throw new Error('Failed to update .mcp.json');
|
|
177
190
|
}
|
|
178
191
|
}
|
|
192
|
+
async function addOpenCodeMcpConfig(orgSlug, projectSlug) {
|
|
193
|
+
const file = path.join(process.cwd(), 'opencode.json');
|
|
194
|
+
const existing = await readJsonIfExists(file);
|
|
195
|
+
if (!existing) {
|
|
196
|
+
await writeJson(file, JSON.parse(getOpenCodeMcpJsonSnippet(orgSlug, projectSlug)));
|
|
197
|
+
clack.log.success(chalk_1.default.cyan('opencode.json') + ' created.');
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
const updated = { ...existing };
|
|
202
|
+
updated.$schema ||= 'https://opencode.ai/config.json';
|
|
203
|
+
updated.mcp = updated.mcp || {};
|
|
204
|
+
updated.mcp['Sentry'] = {
|
|
205
|
+
type: 'remote',
|
|
206
|
+
url: getMcpUrl(orgSlug, projectSlug),
|
|
207
|
+
oauth: {},
|
|
208
|
+
};
|
|
209
|
+
await writeJson(file, updated);
|
|
210
|
+
clack.log.success('Updated opencode.json');
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
throw new Error('Failed to update opencode.json');
|
|
214
|
+
}
|
|
215
|
+
}
|
|
179
216
|
/**
|
|
180
217
|
* Copies text to clipboard across different platforms
|
|
181
218
|
*/
|
|
@@ -343,12 +380,13 @@ async function offerProjectScopedMcpConfig(orgSlug, projectSlug) {
|
|
|
343
380
|
return;
|
|
344
381
|
}
|
|
345
382
|
Sentry.setTag('mcp-configured', true);
|
|
346
|
-
const
|
|
347
|
-
message: 'Which editor do you want to configure?',
|
|
383
|
+
const editors = await (0, index_1.abortIfCancelled)(clack.multiselect({
|
|
384
|
+
message: 'Which editor(s) do you want to configure?',
|
|
348
385
|
options: [
|
|
349
386
|
{ value: 'cursor', label: 'Cursor (project .cursor/mcp.json)' },
|
|
350
387
|
{ value: 'vscode', label: 'VS Code (project .vscode/mcp.json)' },
|
|
351
388
|
{ value: 'claudeCode', label: 'Claude Code (project .mcp.json)' },
|
|
389
|
+
{ value: 'openCode', label: 'OpenCode (project opencode.json)' },
|
|
352
390
|
{
|
|
353
391
|
value: 'jetbrains',
|
|
354
392
|
label: 'JetBrains IDE (WebStorm, IntelliJ IDEA, PyCharm, etc.)',
|
|
@@ -360,66 +398,86 @@ async function offerProjectScopedMcpConfig(orgSlug, projectSlug) {
|
|
|
360
398
|
hint: "We'll show you the configuration to copy",
|
|
361
399
|
},
|
|
362
400
|
],
|
|
401
|
+
required: false,
|
|
363
402
|
}));
|
|
364
|
-
//
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
await addCursorMcpConfig(orgSlug, projectSlug);
|
|
370
|
-
clack.log.success('Added project-scoped Sentry MCP configuration.');
|
|
371
|
-
clack.log.info(chalk_1.default.dim('Note: You may need to reload your editor for MCP changes to take effect.'));
|
|
372
|
-
Sentry.setTag('mcp-config-success', true);
|
|
373
|
-
break;
|
|
374
|
-
case 'vscode':
|
|
375
|
-
await addVsCodeMcpConfig(orgSlug, projectSlug);
|
|
376
|
-
clack.log.success('Added project-scoped Sentry MCP configuration.');
|
|
377
|
-
clack.log.info(chalk_1.default.dim('Note: You may need to reload your editor for MCP changes to take effect.'));
|
|
378
|
-
Sentry.setTag('mcp-config-success', true);
|
|
379
|
-
break;
|
|
380
|
-
case 'claudeCode':
|
|
381
|
-
await addClaudeCodeMcpConfig(orgSlug, projectSlug);
|
|
382
|
-
clack.log.success('Added project-scoped Sentry MCP configuration.');
|
|
383
|
-
clack.log.info(chalk_1.default.dim('Note: You may need to reload your editor for MCP changes to take effect.'));
|
|
384
|
-
Sentry.setTag('mcp-config-success', true);
|
|
385
|
-
break;
|
|
386
|
-
case 'jetbrains':
|
|
387
|
-
await showJetBrainsMcpConfig(orgSlug, projectSlug);
|
|
388
|
-
Sentry.setTag('mcp-config-success', true);
|
|
389
|
-
Sentry.setTag('mcp-config-manual', true);
|
|
390
|
-
break;
|
|
391
|
-
case 'other':
|
|
392
|
-
await showGenericMcpConfig(orgSlug, projectSlug);
|
|
393
|
-
Sentry.setTag('mcp-config-success', true);
|
|
394
|
-
Sentry.setTag('mcp-config-manual', true);
|
|
395
|
-
break;
|
|
396
|
-
}
|
|
403
|
+
// If no editors were selected, return early
|
|
404
|
+
if (!editors || editors.length === 0) {
|
|
405
|
+
clack.log.info('No editors selected. You can add MCP configuration later.');
|
|
406
|
+
Sentry.setTag('mcp-configured', false);
|
|
407
|
+
return;
|
|
397
408
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
//
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
+
// Track number of editors selected
|
|
410
|
+
Sentry.setTag('mcp-editors-count', editors.length);
|
|
411
|
+
// Configure each selected editor
|
|
412
|
+
for (const editor of editors) {
|
|
413
|
+
// Track which editor is being configured
|
|
414
|
+
Sentry.setTag('mcp-editor', editor);
|
|
415
|
+
try {
|
|
416
|
+
switch (editor) {
|
|
417
|
+
case 'cursor':
|
|
418
|
+
await addCursorMcpConfig(orgSlug, projectSlug);
|
|
419
|
+
clack.log.success('Added project-scoped Sentry MCP configuration for Cursor.');
|
|
420
|
+
clack.log.info(chalk_1.default.dim('Note: You may need to reload your editor for MCP changes to take effect.'));
|
|
421
|
+
break;
|
|
422
|
+
case 'vscode':
|
|
423
|
+
await addVsCodeMcpConfig(orgSlug, projectSlug);
|
|
424
|
+
clack.log.success('Added project-scoped Sentry MCP configuration for VS Code.');
|
|
425
|
+
clack.log.info(chalk_1.default.dim('Note: You may need to reload your editor for MCP changes to take effect.'));
|
|
426
|
+
break;
|
|
427
|
+
case 'claudeCode':
|
|
428
|
+
await addClaudeCodeMcpConfig(orgSlug, projectSlug);
|
|
429
|
+
clack.log.success('Added project-scoped Sentry MCP configuration for Claude Code.');
|
|
430
|
+
clack.log.info(chalk_1.default.dim('Note: You may need to reload your editor for MCP changes to take effect.'));
|
|
431
|
+
break;
|
|
432
|
+
case 'openCode':
|
|
433
|
+
await addOpenCodeMcpConfig(orgSlug, projectSlug);
|
|
434
|
+
clack.log.success('Added project-scoped Sentry MCP configuration for OpenCode.');
|
|
435
|
+
clack.log.info(chalk_1.default.dim('Note: You may need to restart OpenCode for MCP changes to take effect.'));
|
|
436
|
+
break;
|
|
437
|
+
case 'jetbrains':
|
|
438
|
+
await showJetBrainsMcpConfig(orgSlug, projectSlug);
|
|
439
|
+
Sentry.setTag('mcp-config-manual', true);
|
|
440
|
+
break;
|
|
441
|
+
case 'other':
|
|
442
|
+
await showGenericMcpConfig(orgSlug, projectSlug);
|
|
443
|
+
Sentry.setTag('mcp-config-manual', true);
|
|
444
|
+
break;
|
|
445
|
+
}
|
|
446
|
+
Sentry.setTag(`mcp-config-${editor}-success`, true);
|
|
409
447
|
}
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
448
|
+
catch (e) {
|
|
449
|
+
Sentry.setTag(`mcp-config-${editor}-success`, false);
|
|
450
|
+
Sentry.setTag('mcp-config-fallback', true);
|
|
451
|
+
clack.log.warn(chalk_1.default.yellow(`Failed to write MCP config for ${editor} automatically. Please copy/paste the snippet below into your project config file.`));
|
|
452
|
+
// Fallback: show per-editor instructions
|
|
453
|
+
if (editor === 'cursor') {
|
|
454
|
+
await (0, index_1.showCopyPasteInstructions)({
|
|
455
|
+
filename: path.join('.cursor', 'mcp.json'),
|
|
456
|
+
codeSnippet: getCursorMcpJsonSnippet(orgSlug, projectSlug),
|
|
457
|
+
hint: 'create the file if it does not exist',
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
else if (editor === 'vscode') {
|
|
461
|
+
await (0, index_1.showCopyPasteInstructions)({
|
|
462
|
+
filename: path.join('.vscode', 'mcp.json'),
|
|
463
|
+
codeSnippet: getVsCodeMcpJsonSnippet(orgSlug, projectSlug),
|
|
464
|
+
hint: 'create the file if it does not exist',
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
else if (editor === 'claudeCode') {
|
|
468
|
+
await (0, index_1.showCopyPasteInstructions)({
|
|
469
|
+
filename: '.mcp.json',
|
|
470
|
+
codeSnippet: getClaudeCodeMcpJsonSnippet(orgSlug, projectSlug),
|
|
471
|
+
hint: 'create the file if it does not exist',
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
else if (editor === 'openCode') {
|
|
475
|
+
await (0, index_1.showCopyPasteInstructions)({
|
|
476
|
+
filename: 'opencode.json',
|
|
477
|
+
codeSnippet: getOpenCodeMcpJsonSnippet(orgSlug, projectSlug),
|
|
478
|
+
hint: 'create the file if it does not exist',
|
|
479
|
+
});
|
|
480
|
+
}
|
|
423
481
|
}
|
|
424
482
|
}
|
|
425
483
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../../src/utils/clack/mcp-config.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as childProcess from 'child_process';\nimport * as Sentry from '@sentry/node';\nimport chalk from 'chalk';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport { abortIfCancelled, showCopyPasteInstructions } from './index';\n\nconst SENTRY_MCP_BASE_URL = 'https://mcp.sentry.dev/mcp';\n\n// Type definitions for MCP configurations\ninterface CursorMcpConfig {\n mcpServers?: Record<string, { url: string }>;\n}\n\ninterface VsCodeMcpConfig {\n servers?: Record<string, { url: string; type: string }>;\n}\n\ninterface ClaudeCodeMcpConfig {\n mcpServers?: Record<string, { url: string }>;\n}\n\n/**\n * Constructs the MCP URL with optional org and project slugs\n */\nfunction getMcpUrl(orgSlug?: string, projectSlug?: string): string {\n if (orgSlug && projectSlug) {\n return `${SENTRY_MCP_BASE_URL}/${orgSlug}/${projectSlug}`;\n }\n return SENTRY_MCP_BASE_URL;\n}\n\nfunction ensureDir(dirpath: string): void {\n fs.mkdirSync(dirpath, { recursive: true });\n}\n\nasync function readJsonIfExists(filepath: string): Promise<unknown | null> {\n try {\n const txt = await fs.promises.readFile(filepath, 'utf8');\n return JSON.parse(txt) as unknown;\n } catch {\n return null;\n }\n}\n\nasync function writeJson(filepath: string, obj: unknown): Promise<void> {\n ensureDir(path.dirname(filepath));\n await fs.promises.writeFile(filepath, JSON.stringify(obj, null, 2), 'utf8');\n}\n\nfunction getCursorMcpJsonSnippet(\n orgSlug?: string,\n projectSlug?: string,\n): string {\n const obj = {\n mcpServers: {\n Sentry: {\n url: getMcpUrl(orgSlug, projectSlug),\n },\n },\n } as const;\n return JSON.stringify(obj, null, 2);\n}\n\nfunction getVsCodeMcpJsonSnippet(\n orgSlug?: string,\n projectSlug?: string,\n): string {\n const obj = {\n servers: {\n Sentry: {\n url: getMcpUrl(orgSlug, projectSlug),\n type: 'http',\n },\n },\n } as const;\n return JSON.stringify(obj, null, 2);\n}\n\nfunction getClaudeCodeMcpJsonSnippet(\n orgSlug?: string,\n projectSlug?: string,\n): string {\n const obj = {\n mcpServers: {\n Sentry: {\n url: getMcpUrl(orgSlug, projectSlug),\n },\n },\n } as const;\n return JSON.stringify(obj, null, 2);\n}\n\nfunction getJetBrainsMcpJsonSnippet(\n orgSlug?: string,\n projectSlug?: string,\n): string {\n const obj = {\n mcpServers: {\n Sentry: {\n url: getMcpUrl(orgSlug, projectSlug),\n },\n },\n } as const;\n return JSON.stringify(obj, null, 2);\n}\n\nfunction getGenericMcpJsonSnippet(\n orgSlug?: string,\n projectSlug?: string,\n): string {\n const obj = {\n mcpServers: {\n Sentry: {\n url: getMcpUrl(orgSlug, projectSlug),\n },\n },\n } as const;\n return JSON.stringify(obj, null, 2);\n}\n\nasync function addCursorMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n const file = path.join(process.cwd(), '.cursor', 'mcp.json');\n const existing = await readJsonIfExists(file);\n if (!existing) {\n await writeJson(\n file,\n JSON.parse(getCursorMcpJsonSnippet(orgSlug, projectSlug)),\n );\n clack.log.success(\n chalk.cyan(path.join('.cursor', 'mcp.json')) + ' created.',\n );\n return;\n }\n try {\n const updated = { ...existing } as CursorMcpConfig;\n updated.mcpServers = updated.mcpServers || {};\n updated.mcpServers['Sentry'] = {\n url: getMcpUrl(orgSlug, projectSlug),\n };\n await writeJson(file, updated);\n clack.log.success('Updated .cursor/mcp.json');\n } catch {\n throw new Error('Failed to update .cursor/mcp.json');\n }\n}\n\nasync function addVsCodeMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n const file = path.join(process.cwd(), '.vscode', 'mcp.json');\n const existing = await readJsonIfExists(file);\n if (!existing) {\n await writeJson(\n file,\n JSON.parse(getVsCodeMcpJsonSnippet(orgSlug, projectSlug)),\n );\n clack.log.success(\n chalk.cyan(path.join('.vscode', 'mcp.json')) + ' created.',\n );\n return;\n }\n try {\n const updated = { ...existing } as VsCodeMcpConfig;\n updated.servers = updated.servers || {};\n updated.servers['Sentry'] = {\n url: getMcpUrl(orgSlug, projectSlug),\n type: 'http',\n };\n await writeJson(file, updated);\n clack.log.success('Updated .vscode/mcp.json');\n } catch {\n throw new Error('Failed to update .vscode/mcp.json');\n }\n}\n\nasync function addClaudeCodeMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n const file = path.join(process.cwd(), '.mcp.json');\n const existing = await readJsonIfExists(file);\n if (!existing) {\n await writeJson(\n file,\n JSON.parse(getClaudeCodeMcpJsonSnippet(orgSlug, projectSlug)),\n );\n clack.log.success(chalk.cyan('.mcp.json') + ' created.');\n return;\n }\n try {\n const updated = { ...existing } as ClaudeCodeMcpConfig;\n updated.mcpServers = updated.mcpServers || {};\n updated.mcpServers['Sentry'] = {\n url: getMcpUrl(orgSlug, projectSlug),\n };\n await writeJson(file, updated);\n clack.log.success('Updated .mcp.json');\n } catch {\n throw new Error('Failed to update .mcp.json');\n }\n}\n\n/**\n * Copies text to clipboard across different platforms\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n try {\n const platform = process.platform;\n let command: string;\n\n if (platform === 'darwin') {\n command = 'pbcopy';\n } else if (platform === 'win32') {\n command = 'clip';\n } else {\n // Linux\n command = 'xclip -selection clipboard';\n }\n\n const proc = childProcess.spawn(command, [], { shell: true });\n proc.stdin.write(text);\n proc.stdin.end();\n\n return new Promise((resolve) => {\n proc.on('close', (code) => {\n resolve(code === 0);\n });\n proc.on('error', () => {\n resolve(false);\n });\n });\n } catch {\n return false;\n }\n}\n\n/**\n * Shows MCP configuration for JetBrains IDEs with copy-to-clipboard option\n */\nasync function showJetBrainsMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n const configSnippet = getJetBrainsMcpJsonSnippet(orgSlug, projectSlug);\n\n clack.log.info(\n chalk.cyan('For JetBrains IDEs (WebStorm, IntelliJ IDEA, PyCharm, etc.):'),\n );\n clack.log.info(\n chalk.dim(\n \"Add the following configuration to your IDE's MCP settings.\\n\" +\n 'See: https://www.jetbrains.com/help/webstorm/mcp-server.html',\n ),\n );\n\n // Display the configuration\n // eslint-disable-next-line no-console\n console.log('\\n' + chalk.green(configSnippet) + '\\n');\n\n // Ask if user wants to copy to clipboard\n const shouldCopy: boolean = await abortIfCancelled(\n clack.select({\n message: 'Copy configuration to clipboard?',\n options: [\n { label: 'Yes', value: true },\n { label: 'No', value: false },\n ],\n initialValue: true,\n }),\n );\n\n if (shouldCopy) {\n const copied = await copyToClipboard(configSnippet);\n\n if (copied) {\n clack.log.success('Configuration copied to clipboard!');\n Sentry.setTag('mcp-clipboard-copy', 'success');\n } else {\n clack.log.warn(\n 'Failed to copy to clipboard. Please copy the configuration above manually.',\n );\n Sentry.setTag('mcp-clipboard-copy', 'failed');\n }\n } else {\n Sentry.setTag('mcp-clipboard-copy', 'declined');\n }\n\n clack.log.info(\n chalk.dim(\n 'Note: You may need to restart your IDE for MCP changes to take effect.',\n ),\n );\n}\n\n/**\n * Shows generic MCP configuration for unsupported IDEs with copy-to-clipboard option\n */\nasync function showGenericMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n const configSnippet = getGenericMcpJsonSnippet(orgSlug, projectSlug);\n\n clack.log.info(chalk.cyan('Generic MCP configuration for your IDE:'));\n clack.log.info(\n chalk.dim(\n 'If your IDE supports MCP servers, you can use the following configuration.\\n' +\n \"Please consult your IDE's documentation for how to add MCP server configurations.\",\n ),\n );\n\n // Display the configuration\n // eslint-disable-next-line no-console\n console.log('\\n' + chalk.green(configSnippet) + '\\n');\n\n // Ask if user wants to copy to clipboard\n const shouldCopy: boolean = await abortIfCancelled(\n clack.select({\n message: 'Copy configuration to clipboard?',\n options: [\n { label: 'Yes', value: true },\n { label: 'No', value: false },\n ],\n initialValue: true,\n }),\n );\n\n if (shouldCopy) {\n const copied = await copyToClipboard(configSnippet);\n\n if (copied) {\n clack.log.success('Configuration copied to clipboard!');\n Sentry.setTag('mcp-clipboard-copy', 'success');\n } else {\n clack.log.warn(\n 'Failed to copy to clipboard. Please copy the configuration above manually.',\n );\n Sentry.setTag('mcp-clipboard-copy', 'failed');\n }\n } else {\n Sentry.setTag('mcp-clipboard-copy', 'declined');\n }\n\n clack.log.info(\n chalk.dim(\n 'Note: The exact configuration format may vary depending on your IDE.\\n' +\n \"If your IDE doesn't support MCP yet, please check back later or open an issue at:\\n\" +\n 'https://github.com/getsentry/sentry-wizard/issues',\n ),\n );\n}\n\n/**\n * Explains what MCP is and its benefits for Sentry users\n */\nasync function explainMCP(): Promise<boolean> {\n clack.log.info(chalk.cyan('What is MCP (Model Context Protocol)?'));\n\n clack.log.info(\n chalk.dim(\n 'MCP is a protocol that allows AI assistants in your IDE to interact with external tools and services.\\n\\n' +\n 'The Sentry MCP server enables AI assistants to:\\n' +\n ' • Query and analyze your Sentry issues directly from your IDE\\n' +\n ' • Get context about errors and performance problems\\n' +\n ' • Help debug issues with production data insights\\n' +\n ' • Suggest fixes based on real error patterns\\n\\n' +\n \"This makes it easier to fix bugs by bringing Sentry's insights directly into your development workflow.\\n\\n\" +\n 'Learn more: ' +\n chalk.cyan('https://docs.sentry.io/product/sentry-mcp/'),\n ),\n );\n\n // Ask again after explanation\n const shouldAddAfterExplanation: boolean = await abortIfCancelled(\n clack.select({\n message: 'Would you like to configure MCP for your IDE now?',\n options: [\n { label: 'Yes', value: true },\n { label: 'No', value: false, hint: 'You can add it later anytime' },\n ],\n initialValue: true,\n }),\n );\n\n return shouldAddAfterExplanation;\n}\n\n/**\n * Offers to add a project-scoped MCP server configuration for the Sentry MCP.\n * Supports Cursor, VS Code, and Claude Code.\n * @param orgSlug - Optional organization slug to include in the MCP URL\n * @param projectSlug - Optional project slug to include in the MCP URL\n */\nexport async function offerProjectScopedMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n type InitialChoice = 'yes' | 'no' | 'explain';\n\n const initialChoice: InitialChoice = await abortIfCancelled(\n clack.select<\n { value: InitialChoice; label: string; hint?: string }[],\n InitialChoice\n >({\n message:\n 'Optionally add a project-scoped MCP server configuration for the Sentry MCP?',\n options: [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no', hint: 'You can add it later anytime' },\n {\n label: 'What is MCP?',\n value: 'explain',\n hint: 'Learn about MCP benefits',\n },\n ],\n initialValue: 'yes',\n }),\n );\n\n let shouldAdd: boolean;\n\n if (initialChoice === 'explain') {\n Sentry.setTag('mcp-choice', 'explain');\n shouldAdd = await explainMCP();\n Sentry.setTag('mcp-configured-after-explain', shouldAdd);\n } else {\n shouldAdd = initialChoice === 'yes';\n Sentry.setTag('mcp-choice', initialChoice);\n }\n\n if (!shouldAdd) {\n Sentry.setTag('mcp-configured', false);\n return;\n }\n\n Sentry.setTag('mcp-configured', true);\n\n type EditorChoice =\n | 'cursor'\n | 'vscode'\n | 'claudeCode'\n | 'jetbrains'\n | 'other';\n const editor: EditorChoice = await abortIfCancelled(\n clack.select({\n message: 'Which editor do you want to configure?',\n options: [\n { value: 'cursor', label: 'Cursor (project .cursor/mcp.json)' },\n { value: 'vscode', label: 'VS Code (project .vscode/mcp.json)' },\n { value: 'claudeCode', label: 'Claude Code (project .mcp.json)' },\n {\n value: 'jetbrains',\n label: 'JetBrains IDE (WebStorm, IntelliJ IDEA, PyCharm, etc.)',\n hint: 'Manual configuration required',\n },\n {\n value: 'other',\n label: 'I use a different IDE',\n hint: \"We'll show you the configuration to copy\",\n },\n ],\n }),\n );\n\n // Track which editor was selected\n Sentry.setTag('mcp-editor', editor);\n\n try {\n switch (editor) {\n case 'cursor':\n await addCursorMcpConfig(orgSlug, projectSlug);\n clack.log.success('Added project-scoped Sentry MCP configuration.');\n clack.log.info(\n chalk.dim(\n 'Note: You may need to reload your editor for MCP changes to take effect.',\n ),\n );\n Sentry.setTag('mcp-config-success', true);\n break;\n case 'vscode':\n await addVsCodeMcpConfig(orgSlug, projectSlug);\n clack.log.success('Added project-scoped Sentry MCP configuration.');\n clack.log.info(\n chalk.dim(\n 'Note: You may need to reload your editor for MCP changes to take effect.',\n ),\n );\n Sentry.setTag('mcp-config-success', true);\n break;\n case 'claudeCode':\n await addClaudeCodeMcpConfig(orgSlug, projectSlug);\n clack.log.success('Added project-scoped Sentry MCP configuration.');\n clack.log.info(\n chalk.dim(\n 'Note: You may need to reload your editor for MCP changes to take effect.',\n ),\n );\n Sentry.setTag('mcp-config-success', true);\n break;\n case 'jetbrains':\n await showJetBrainsMcpConfig(orgSlug, projectSlug);\n Sentry.setTag('mcp-config-success', true);\n Sentry.setTag('mcp-config-manual', true);\n break;\n case 'other':\n await showGenericMcpConfig(orgSlug, projectSlug);\n Sentry.setTag('mcp-config-success', true);\n Sentry.setTag('mcp-config-manual', true);\n break;\n }\n } catch (e) {\n Sentry.setTag('mcp-config-success', false);\n Sentry.setTag('mcp-config-fallback', true);\n clack.log.warn(\n chalk.yellow(\n 'Failed to write MCP config automatically. Please copy/paste the snippet below into your project config file.',\n ),\n );\n // Fallback: show per-editor instructions\n if (editor === 'cursor') {\n await showCopyPasteInstructions({\n filename: path.join('.cursor', 'mcp.json'),\n codeSnippet: getCursorMcpJsonSnippet(orgSlug, projectSlug),\n hint: 'create the file if it does not exist',\n });\n } else if (editor === 'vscode') {\n await showCopyPasteInstructions({\n filename: path.join('.vscode', 'mcp.json'),\n codeSnippet: getVsCodeMcpJsonSnippet(orgSlug, projectSlug),\n hint: 'create the file if it does not exist',\n });\n } else if (editor === 'claudeCode') {\n await showCopyPasteInstructions({\n filename: '.mcp.json',\n codeSnippet: getClaudeCodeMcpJsonSnippet(orgSlug, projectSlug),\n hint: 'create the file if it does not exist',\n });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../../src/utils/clack/mcp-config.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as childProcess from 'child_process';\nimport * as Sentry from '@sentry/node';\nimport chalk from 'chalk';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport { abortIfCancelled, showCopyPasteInstructions } from './index';\n\nconst SENTRY_MCP_BASE_URL = 'https://mcp.sentry.dev/mcp';\n\n// Type definitions for MCP configurations\ninterface CursorMcpConfig {\n mcpServers?: Record<string, { url: string }>;\n}\n\ninterface VsCodeMcpConfig {\n servers?: Record<string, { url: string; type: string }>;\n}\n\ninterface ClaudeCodeMcpConfig {\n mcpServers?: Record<string, { url: string }>;\n}\n\ninterface OpenCodeMcpConfig {\n $schema?: string;\n mcp?: Record<string, { type: string; url: string; oauth?: object }>;\n}\n\n/**\n * Constructs the MCP URL with optional org and project slugs\n */\nfunction getMcpUrl(orgSlug?: string, projectSlug?: string): string {\n if (orgSlug && projectSlug) {\n return `${SENTRY_MCP_BASE_URL}/${orgSlug}/${projectSlug}`;\n }\n return SENTRY_MCP_BASE_URL;\n}\n\nfunction ensureDir(dirpath: string): void {\n fs.mkdirSync(dirpath, { recursive: true });\n}\n\nasync function readJsonIfExists(filepath: string): Promise<unknown | null> {\n try {\n const txt = await fs.promises.readFile(filepath, 'utf8');\n return JSON.parse(txt) as unknown;\n } catch {\n return null;\n }\n}\n\nasync function writeJson(filepath: string, obj: unknown): Promise<void> {\n ensureDir(path.dirname(filepath));\n await fs.promises.writeFile(filepath, JSON.stringify(obj, null, 2), 'utf8');\n}\n\nfunction getCursorMcpJsonSnippet(\n orgSlug?: string,\n projectSlug?: string,\n): string {\n const obj = {\n mcpServers: {\n Sentry: {\n url: getMcpUrl(orgSlug, projectSlug),\n },\n },\n } as const;\n return JSON.stringify(obj, null, 2);\n}\n\nfunction getVsCodeMcpJsonSnippet(\n orgSlug?: string,\n projectSlug?: string,\n): string {\n const obj = {\n servers: {\n Sentry: {\n url: getMcpUrl(orgSlug, projectSlug),\n type: 'http',\n },\n },\n } as const;\n return JSON.stringify(obj, null, 2);\n}\n\nfunction getClaudeCodeMcpJsonSnippet(\n orgSlug?: string,\n projectSlug?: string,\n): string {\n const obj = {\n mcpServers: {\n Sentry: {\n url: getMcpUrl(orgSlug, projectSlug),\n },\n },\n } as const;\n return JSON.stringify(obj, null, 2);\n}\n\nfunction getJetBrainsMcpJsonSnippet(\n orgSlug?: string,\n projectSlug?: string,\n): string {\n const obj = {\n mcpServers: {\n Sentry: {\n url: getMcpUrl(orgSlug, projectSlug),\n },\n },\n } as const;\n return JSON.stringify(obj, null, 2);\n}\n\nfunction getOpenCodeMcpJsonSnippet(\n orgSlug?: string,\n projectSlug?: string,\n): string {\n const obj = {\n $schema: 'https://opencode.ai/config.json',\n mcp: {\n Sentry: {\n type: 'remote',\n url: getMcpUrl(orgSlug, projectSlug),\n oauth: {},\n },\n },\n } as const;\n return JSON.stringify(obj, null, 2);\n}\n\nfunction getGenericMcpJsonSnippet(\n orgSlug?: string,\n projectSlug?: string,\n): string {\n const obj = {\n mcpServers: {\n Sentry: {\n url: getMcpUrl(orgSlug, projectSlug),\n },\n },\n } as const;\n return JSON.stringify(obj, null, 2);\n}\n\nasync function addCursorMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n const file = path.join(process.cwd(), '.cursor', 'mcp.json');\n const existing = await readJsonIfExists(file);\n if (!existing) {\n await writeJson(\n file,\n JSON.parse(getCursorMcpJsonSnippet(orgSlug, projectSlug)),\n );\n clack.log.success(\n chalk.cyan(path.join('.cursor', 'mcp.json')) + ' created.',\n );\n return;\n }\n try {\n const updated = { ...existing } as CursorMcpConfig;\n updated.mcpServers = updated.mcpServers || {};\n updated.mcpServers['Sentry'] = {\n url: getMcpUrl(orgSlug, projectSlug),\n };\n await writeJson(file, updated);\n clack.log.success('Updated .cursor/mcp.json');\n } catch {\n throw new Error('Failed to update .cursor/mcp.json');\n }\n}\n\nasync function addVsCodeMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n const file = path.join(process.cwd(), '.vscode', 'mcp.json');\n const existing = await readJsonIfExists(file);\n if (!existing) {\n await writeJson(\n file,\n JSON.parse(getVsCodeMcpJsonSnippet(orgSlug, projectSlug)),\n );\n clack.log.success(\n chalk.cyan(path.join('.vscode', 'mcp.json')) + ' created.',\n );\n return;\n }\n try {\n const updated = { ...existing } as VsCodeMcpConfig;\n updated.servers = updated.servers || {};\n updated.servers['Sentry'] = {\n url: getMcpUrl(orgSlug, projectSlug),\n type: 'http',\n };\n await writeJson(file, updated);\n clack.log.success('Updated .vscode/mcp.json');\n } catch {\n throw new Error('Failed to update .vscode/mcp.json');\n }\n}\n\nasync function addClaudeCodeMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n const file = path.join(process.cwd(), '.mcp.json');\n const existing = await readJsonIfExists(file);\n if (!existing) {\n await writeJson(\n file,\n JSON.parse(getClaudeCodeMcpJsonSnippet(orgSlug, projectSlug)),\n );\n clack.log.success(chalk.cyan('.mcp.json') + ' created.');\n return;\n }\n try {\n const updated = { ...existing } as ClaudeCodeMcpConfig;\n updated.mcpServers = updated.mcpServers || {};\n updated.mcpServers['Sentry'] = {\n url: getMcpUrl(orgSlug, projectSlug),\n };\n await writeJson(file, updated);\n clack.log.success('Updated .mcp.json');\n } catch {\n throw new Error('Failed to update .mcp.json');\n }\n}\n\nasync function addOpenCodeMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n const file = path.join(process.cwd(), 'opencode.json');\n const existing = await readJsonIfExists(file);\n if (!existing) {\n await writeJson(\n file,\n JSON.parse(getOpenCodeMcpJsonSnippet(orgSlug, projectSlug)),\n );\n clack.log.success(chalk.cyan('opencode.json') + ' created.');\n return;\n }\n try {\n const updated = { ...existing } as OpenCodeMcpConfig;\n updated.$schema ||= 'https://opencode.ai/config.json';\n updated.mcp = updated.mcp || {};\n updated.mcp['Sentry'] = {\n type: 'remote',\n url: getMcpUrl(orgSlug, projectSlug),\n oauth: {},\n };\n await writeJson(file, updated);\n clack.log.success('Updated opencode.json');\n } catch {\n throw new Error('Failed to update opencode.json');\n }\n}\n\n/**\n * Copies text to clipboard across different platforms\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n try {\n const platform = process.platform;\n let command: string;\n\n if (platform === 'darwin') {\n command = 'pbcopy';\n } else if (platform === 'win32') {\n command = 'clip';\n } else {\n // Linux\n command = 'xclip -selection clipboard';\n }\n\n const proc = childProcess.spawn(command, [], { shell: true });\n proc.stdin.write(text);\n proc.stdin.end();\n\n return new Promise((resolve) => {\n proc.on('close', (code) => {\n resolve(code === 0);\n });\n proc.on('error', () => {\n resolve(false);\n });\n });\n } catch {\n return false;\n }\n}\n\n/**\n * Shows MCP configuration for JetBrains IDEs with copy-to-clipboard option\n */\nasync function showJetBrainsMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n const configSnippet = getJetBrainsMcpJsonSnippet(orgSlug, projectSlug);\n\n clack.log.info(\n chalk.cyan('For JetBrains IDEs (WebStorm, IntelliJ IDEA, PyCharm, etc.):'),\n );\n clack.log.info(\n chalk.dim(\n \"Add the following configuration to your IDE's MCP settings.\\n\" +\n 'See: https://www.jetbrains.com/help/webstorm/mcp-server.html',\n ),\n );\n\n // Display the configuration\n // eslint-disable-next-line no-console\n console.log('\\n' + chalk.green(configSnippet) + '\\n');\n\n // Ask if user wants to copy to clipboard\n const shouldCopy: boolean = await abortIfCancelled(\n clack.select({\n message: 'Copy configuration to clipboard?',\n options: [\n { label: 'Yes', value: true },\n { label: 'No', value: false },\n ],\n initialValue: true,\n }),\n );\n\n if (shouldCopy) {\n const copied = await copyToClipboard(configSnippet);\n\n if (copied) {\n clack.log.success('Configuration copied to clipboard!');\n Sentry.setTag('mcp-clipboard-copy', 'success');\n } else {\n clack.log.warn(\n 'Failed to copy to clipboard. Please copy the configuration above manually.',\n );\n Sentry.setTag('mcp-clipboard-copy', 'failed');\n }\n } else {\n Sentry.setTag('mcp-clipboard-copy', 'declined');\n }\n\n clack.log.info(\n chalk.dim(\n 'Note: You may need to restart your IDE for MCP changes to take effect.',\n ),\n );\n}\n\n/**\n * Shows generic MCP configuration for unsupported IDEs with copy-to-clipboard option\n */\nasync function showGenericMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n const configSnippet = getGenericMcpJsonSnippet(orgSlug, projectSlug);\n\n clack.log.info(chalk.cyan('Generic MCP configuration for your IDE:'));\n clack.log.info(\n chalk.dim(\n 'If your IDE supports MCP servers, you can use the following configuration.\\n' +\n \"Please consult your IDE's documentation for how to add MCP server configurations.\",\n ),\n );\n\n // Display the configuration\n // eslint-disable-next-line no-console\n console.log('\\n' + chalk.green(configSnippet) + '\\n');\n\n // Ask if user wants to copy to clipboard\n const shouldCopy: boolean = await abortIfCancelled(\n clack.select({\n message: 'Copy configuration to clipboard?',\n options: [\n { label: 'Yes', value: true },\n { label: 'No', value: false },\n ],\n initialValue: true,\n }),\n );\n\n if (shouldCopy) {\n const copied = await copyToClipboard(configSnippet);\n\n if (copied) {\n clack.log.success('Configuration copied to clipboard!');\n Sentry.setTag('mcp-clipboard-copy', 'success');\n } else {\n clack.log.warn(\n 'Failed to copy to clipboard. Please copy the configuration above manually.',\n );\n Sentry.setTag('mcp-clipboard-copy', 'failed');\n }\n } else {\n Sentry.setTag('mcp-clipboard-copy', 'declined');\n }\n\n clack.log.info(\n chalk.dim(\n 'Note: The exact configuration format may vary depending on your IDE.\\n' +\n \"If your IDE doesn't support MCP yet, please check back later or open an issue at:\\n\" +\n 'https://github.com/getsentry/sentry-wizard/issues',\n ),\n );\n}\n\n/**\n * Explains what MCP is and its benefits for Sentry users\n */\nasync function explainMCP(): Promise<boolean> {\n clack.log.info(chalk.cyan('What is MCP (Model Context Protocol)?'));\n\n clack.log.info(\n chalk.dim(\n 'MCP is a protocol that allows AI assistants in your IDE to interact with external tools and services.\\n\\n' +\n 'The Sentry MCP server enables AI assistants to:\\n' +\n ' • Query and analyze your Sentry issues directly from your IDE\\n' +\n ' • Get context about errors and performance problems\\n' +\n ' • Help debug issues with production data insights\\n' +\n ' • Suggest fixes based on real error patterns\\n\\n' +\n \"This makes it easier to fix bugs by bringing Sentry's insights directly into your development workflow.\\n\\n\" +\n 'Learn more: ' +\n chalk.cyan('https://docs.sentry.io/product/sentry-mcp/'),\n ),\n );\n\n // Ask again after explanation\n const shouldAddAfterExplanation: boolean = await abortIfCancelled(\n clack.select({\n message: 'Would you like to configure MCP for your IDE now?',\n options: [\n { label: 'Yes', value: true },\n { label: 'No', value: false, hint: 'You can add it later anytime' },\n ],\n initialValue: true,\n }),\n );\n\n return shouldAddAfterExplanation;\n}\n\n/**\n * Offers to add a project-scoped MCP server configuration for the Sentry MCP.\n * Supports Cursor, VS Code, and Claude Code.\n * @param orgSlug - Optional organization slug to include in the MCP URL\n * @param projectSlug - Optional project slug to include in the MCP URL\n */\nexport async function offerProjectScopedMcpConfig(\n orgSlug?: string,\n projectSlug?: string,\n): Promise<void> {\n type InitialChoice = 'yes' | 'no' | 'explain';\n\n const initialChoice: InitialChoice = await abortIfCancelled(\n clack.select<\n { value: InitialChoice; label: string; hint?: string }[],\n InitialChoice\n >({\n message:\n 'Optionally add a project-scoped MCP server configuration for the Sentry MCP?',\n options: [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no', hint: 'You can add it later anytime' },\n {\n label: 'What is MCP?',\n value: 'explain',\n hint: 'Learn about MCP benefits',\n },\n ],\n initialValue: 'yes',\n }),\n );\n\n let shouldAdd: boolean;\n\n if (initialChoice === 'explain') {\n Sentry.setTag('mcp-choice', 'explain');\n shouldAdd = await explainMCP();\n Sentry.setTag('mcp-configured-after-explain', shouldAdd);\n } else {\n shouldAdd = initialChoice === 'yes';\n Sentry.setTag('mcp-choice', initialChoice);\n }\n\n if (!shouldAdd) {\n Sentry.setTag('mcp-configured', false);\n return;\n }\n\n Sentry.setTag('mcp-configured', true);\n\n type EditorChoice =\n | 'cursor'\n | 'vscode'\n | 'claudeCode'\n | 'openCode'\n | 'jetbrains'\n | 'other';\n const editors: EditorChoice[] = await abortIfCancelled(\n clack.multiselect({\n message: 'Which editor(s) do you want to configure?',\n options: [\n { value: 'cursor', label: 'Cursor (project .cursor/mcp.json)' },\n { value: 'vscode', label: 'VS Code (project .vscode/mcp.json)' },\n { value: 'claudeCode', label: 'Claude Code (project .mcp.json)' },\n { value: 'openCode', label: 'OpenCode (project opencode.json)' },\n {\n value: 'jetbrains',\n label: 'JetBrains IDE (WebStorm, IntelliJ IDEA, PyCharm, etc.)',\n hint: 'Manual configuration required',\n },\n {\n value: 'other',\n label: 'I use a different IDE',\n hint: \"We'll show you the configuration to copy\",\n },\n ],\n required: false,\n }),\n );\n\n // If no editors were selected, return early\n if (!editors || editors.length === 0) {\n clack.log.info('No editors selected. You can add MCP configuration later.');\n Sentry.setTag('mcp-configured', false);\n return;\n }\n\n // Track number of editors selected\n Sentry.setTag('mcp-editors-count', editors.length);\n\n // Configure each selected editor\n for (const editor of editors) {\n // Track which editor is being configured\n Sentry.setTag('mcp-editor', editor);\n\n try {\n switch (editor) {\n case 'cursor':\n await addCursorMcpConfig(orgSlug, projectSlug);\n clack.log.success(\n 'Added project-scoped Sentry MCP configuration for Cursor.',\n );\n clack.log.info(\n chalk.dim(\n 'Note: You may need to reload your editor for MCP changes to take effect.',\n ),\n );\n break;\n case 'vscode':\n await addVsCodeMcpConfig(orgSlug, projectSlug);\n clack.log.success(\n 'Added project-scoped Sentry MCP configuration for VS Code.',\n );\n clack.log.info(\n chalk.dim(\n 'Note: You may need to reload your editor for MCP changes to take effect.',\n ),\n );\n break;\n case 'claudeCode':\n await addClaudeCodeMcpConfig(orgSlug, projectSlug);\n clack.log.success(\n 'Added project-scoped Sentry MCP configuration for Claude Code.',\n );\n clack.log.info(\n chalk.dim(\n 'Note: You may need to reload your editor for MCP changes to take effect.',\n ),\n );\n break;\n case 'openCode':\n await addOpenCodeMcpConfig(orgSlug, projectSlug);\n clack.log.success(\n 'Added project-scoped Sentry MCP configuration for OpenCode.',\n );\n clack.log.info(\n chalk.dim(\n 'Note: You may need to restart OpenCode for MCP changes to take effect.',\n ),\n );\n break;\n case 'jetbrains':\n await showJetBrainsMcpConfig(orgSlug, projectSlug);\n Sentry.setTag('mcp-config-manual', true);\n break;\n case 'other':\n await showGenericMcpConfig(orgSlug, projectSlug);\n Sentry.setTag('mcp-config-manual', true);\n break;\n }\n Sentry.setTag(`mcp-config-${editor}-success`, true);\n } catch (e) {\n Sentry.setTag(`mcp-config-${editor}-success`, false);\n Sentry.setTag('mcp-config-fallback', true);\n clack.log.warn(\n chalk.yellow(\n `Failed to write MCP config for ${editor} automatically. Please copy/paste the snippet below into your project config file.`,\n ),\n );\n\n // Fallback: show per-editor instructions\n if (editor === 'cursor') {\n await showCopyPasteInstructions({\n filename: path.join('.cursor', 'mcp.json'),\n codeSnippet: getCursorMcpJsonSnippet(orgSlug, projectSlug),\n hint: 'create the file if it does not exist',\n });\n } else if (editor === 'vscode') {\n await showCopyPasteInstructions({\n filename: path.join('.vscode', 'mcp.json'),\n codeSnippet: getVsCodeMcpJsonSnippet(orgSlug, projectSlug),\n hint: 'create the file if it does not exist',\n });\n } else if (editor === 'claudeCode') {\n await showCopyPasteInstructions({\n filename: '.mcp.json',\n codeSnippet: getClaudeCodeMcpJsonSnippet(orgSlug, projectSlug),\n hint: 'create the file if it does not exist',\n });\n } else if (editor === 'openCode') {\n await showCopyPasteInstructions({\n filename: 'opencode.json',\n codeSnippet: getOpenCodeMcpJsonSnippet(orgSlug, projectSlug),\n hint: 'create the file if it does not exist',\n });\n }\n }\n }\n}\n"]}
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const WIZARD_VERSION = "6.
|
|
1
|
+
export declare const WIZARD_VERSION = "6.11.0";
|
package/dist/src/version.js
CHANGED
package/dist/src/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,2CAA2C;;;AAE9B,QAAA,cAAc,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,2CAA2C;;;AAE9B,QAAA,cAAc,GAAG,QAAQ,CAAC","sourcesContent":["// DO NOT modify this file manually!\n// This is file is updated at release time.\n\nexport const WIZARD_VERSION = '6.11.0';\n"]}
|
|
@@ -10,8 +10,7 @@ vitest_1.vi.mock('../../src/utils/clack/mcp-config', () => ({
|
|
|
10
10
|
(0, vitest_1.describe)('buildOutroMessage', () => {
|
|
11
11
|
(0, vitest_1.it)('returns the correct outro message if example component was created', () => {
|
|
12
12
|
(0, vitest_1.expect)((0, angular_wizard_1.buildOutroMessage)(true)).toMatchInlineSnapshot(`
|
|
13
|
-
"
|
|
14
|
-
Successfully installed the Sentry Angular SDK!
|
|
13
|
+
"Successfully installed the Sentry Angular SDK!
|
|
15
14
|
|
|
16
15
|
You can validate your setup by starting your dev environment (ng serve) and throwing an error in the example component.
|
|
17
16
|
|
|
@@ -21,8 +20,7 @@ vitest_1.vi.mock('../../src/utils/clack/mcp-config', () => ({
|
|
|
21
20
|
});
|
|
22
21
|
(0, vitest_1.it)('returns the correct outro message if example component creation was skipped', () => {
|
|
23
22
|
(0, vitest_1.expect)((0, angular_wizard_1.buildOutroMessage)(false)).toMatchInlineSnapshot(`
|
|
24
|
-
"
|
|
25
|
-
Successfully installed the Sentry Angular SDK!
|
|
23
|
+
"Successfully installed the Sentry Angular SDK!
|
|
26
24
|
|
|
27
25
|
Check out the SDK documentation for further configuration:
|
|
28
26
|
https://docs.sentry.io/platforms/javascript/guides/angular/"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular-wizard.test.js","sourceRoot":"","sources":["../../../test/angular/angular-wizard.test.ts"],"names":[],"mappings":";;AAAA,mCAAkD;AAElD,qEAAqE;AACrE,0DAAkE;AAElE,WAAE,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE,CAAC,CAAC;IACjD,2BAA2B,EAAE,WAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;CAClE,CAAC,CAAC,CAAC;AAEJ,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAA,WAAE,EAAC,oEAAoE,EAAE,GAAG,EAAE;YAC5E,IAAA,eAAM,EAAC,IAAA,kCAAiB,EAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC
|
|
1
|
+
{"version":3,"file":"angular-wizard.test.js","sourceRoot":"","sources":["../../../test/angular/angular-wizard.test.ts"],"names":[],"mappings":";;AAAA,mCAAkD;AAElD,qEAAqE;AACrE,0DAAkE;AAElE,WAAE,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE,CAAC,CAAC;IACjD,2BAA2B,EAAE,WAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;CAClE,CAAC,CAAC,CAAC;AAEJ,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAA,WAAE,EAAC,oEAAoE,EAAE,GAAG,EAAE;YAC5E,IAAA,eAAM,EAAC,IAAA,kCAAiB,EAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;OAOrD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAA,WAAE,EAAC,6EAA6E,EAAE,GAAG,EAAE;YACrF,IAAA,eAAM,EAAC,IAAA,kCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;OAKtD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAA,WAAE,EAAC,uEAAuE,EAAE,GAAG,EAAE;YAC/E,MAAM,IAAI,GAAG,IAAA,sBAAe,EAAC,qBAAqB,EAAE;gBAClD,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;YACH,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;OAalC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,sEAAsE,EAAE,GAAG,EAAE;YAC9E,MAAM,IAAI,GAAG,IAAA,sBAAe,EAAC,qBAAqB,EAAE;gBAClD,WAAW,EAAE,KAAK;gBAClB,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;OAWlC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,IAAI,GAAG,IAAA,sBAAe,EAAC,qBAAqB,EAAE;gBAClD,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;OAUlC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,IAAI,GAAG,IAAA,sBAAe,EAAC,qBAAqB,EAAE;gBAClD,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;OAYlC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,wEAAwE,EAAE,GAAG,EAAE;YAChF,MAAM,IAAI,GAAG,IAAA,sBAAe,EAAC,qBAAqB,EAAE;gBAClD,WAAW,EAAE,KAAK;gBAClB,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC;;;;;OAKlC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it, vi } from 'vitest';\n\nimport { buildOutroMessage } from '../../src/angular/angular-wizard';\nimport { getInitCallArgs } from '../../src/angular/codemods/main';\n\nvi.mock('../../src/utils/clack/mcp-config', () => ({\n offerProjectScopedMcpConfig: vi.fn().mockResolvedValue(undefined),\n}));\n\ndescribe('angular-wizard', () => {\n describe('buildOutroMessage', () => {\n it('returns the correct outro message if example component was created', () => {\n expect(buildOutroMessage(true)).toMatchInlineSnapshot(`\n \"Successfully installed the Sentry Angular SDK!\n\n You can validate your setup by starting your dev environment (ng serve) and throwing an error in the example component.\n\n Check out the SDK documentation for further configuration:\n https://docs.sentry.io/platforms/javascript/guides/angular/\"\n `);\n });\n it('returns the correct outro message if example component creation was skipped', () => {\n expect(buildOutroMessage(false)).toMatchInlineSnapshot(`\n \"Successfully installed the Sentry Angular SDK!\n\n Check out the SDK documentation for further configuration:\n https://docs.sentry.io/platforms/javascript/guides/angular/\"\n `);\n });\n });\n\n describe('getInitCallArgs', () => {\n it('returns the correct init call arguments when all features are enabled', () => {\n const args = getInitCallArgs('https://example.com', {\n performance: true,\n replay: true,\n logs: true,\n });\n expect(args).toMatchInlineSnapshot(`\n {\n \"dsn\": \"https://example.com\",\n \"enableLogs\": true,\n \"integrations\": [\n {},\n {},\n ],\n \"replaysOnErrorSampleRate\": 1,\n \"replaysSessionSampleRate\": 0.1,\n \"sendDefaultPii\": true,\n \"tracesSampleRate\": 1,\n }\n `);\n });\n\n it('returns the correct init call arguments when performance is disabled', () => {\n const args = getInitCallArgs('https://example.com', {\n performance: false,\n replay: true,\n logs: true,\n });\n\n expect(args).toMatchInlineSnapshot(`\n {\n \"dsn\": \"https://example.com\",\n \"enableLogs\": true,\n \"integrations\": [\n {},\n ],\n \"replaysOnErrorSampleRate\": 1,\n \"replaysSessionSampleRate\": 0.1,\n \"sendDefaultPii\": true,\n }\n `);\n });\n\n it('returns the correct init call arguments when replay is disabled', () => {\n const args = getInitCallArgs('https://example.com', {\n performance: true,\n replay: false,\n logs: true,\n });\n\n expect(args).toMatchInlineSnapshot(`\n {\n \"dsn\": \"https://example.com\",\n \"enableLogs\": true,\n \"integrations\": [\n {},\n ],\n \"sendDefaultPii\": true,\n \"tracesSampleRate\": 1,\n }\n `);\n });\n\n it('returns the correct init call arguments when logs are disabled', () => {\n const args = getInitCallArgs('https://example.com', {\n performance: true,\n replay: true,\n logs: false,\n });\n\n expect(args).toMatchInlineSnapshot(`\n {\n \"dsn\": \"https://example.com\",\n \"integrations\": [\n {},\n {},\n ],\n \"replaysOnErrorSampleRate\": 1,\n \"replaysSessionSampleRate\": 0.1,\n \"sendDefaultPii\": true,\n \"tracesSampleRate\": 1,\n }\n `);\n });\n\n it('returns the correct init call arguments when all features are disabled', () => {\n const args = getInitCallArgs('https://example.com', {\n performance: false,\n replay: false,\n logs: false,\n });\n\n expect(args).toMatchInlineSnapshot(`\n {\n \"dsn\": \"https://example.com\",\n \"sendDefaultPii\": true,\n }\n `);\n });\n });\n});\n"]}
|
|
@@ -37,10 +37,14 @@ vitest_1.vi.mock('@clack/prompts', async () => ({
|
|
|
37
37
|
...(await vitest_1.vi.importActual('@clack/prompts')),
|
|
38
38
|
}));
|
|
39
39
|
vitest_1.vi.mock('../../src/utils/bash');
|
|
40
|
-
vitest_1.vi.
|
|
41
|
-
|
|
40
|
+
vitest_1.vi.mock('@sentry/node', async () => {
|
|
41
|
+
const actual = await vitest_1.vi.importActual('@sentry/node');
|
|
42
|
+
return {
|
|
43
|
+
...actual,
|
|
44
|
+
setTag: vitest_1.vi.fn(),
|
|
45
|
+
captureException: vitest_1.vi.fn(() => 'id'),
|
|
46
|
+
};
|
|
42
47
|
});
|
|
43
|
-
vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
44
48
|
const clackSpinnerMock = {
|
|
45
49
|
start: vitest_1.vi.fn(),
|
|
46
50
|
stop: vitest_1.vi.fn(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cocoapod.test.js","sourceRoot":"","sources":["../../../test/apple/cocoapod.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport {\n addCocoaPods,\n podInstall,\n usesCocoaPod,\n} from '../../src/apple/cocoapod';\nimport * as bash from '../../src/utils/bash';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nvi.mock('@clack/prompts', async () => ({\n __esModule: true,\n ...(await vi.importActual<typeof clack>('@clack/prompts')),\n}));\n\nvi.mock('../../src/utils/bash');\nvi.spyOn(Sentry, 'setTag').mockImplementation(() => {\n /* empty */\n});\nvi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');\n\nconst clackSpinnerMock = {\n start: vi.fn(),\n stop: vi.fn(),\n message: vi.fn(),\n};\n\ndescribe('cocoapod', () => {\n beforeEach(() => {\n vi.spyOn(clack, 'spinner').mockReturnValue(clackSpinnerMock);\n vi.spyOn(clack.log, 'error').mockImplementation(() => {\n /* empty */\n });\n });\n\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n describe('usesCocoaPod', () => {\n describe('Podfile exists', () => {\n it('should return true', () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-with-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n const podfile = path.join(tempDir, 'Podfile');\n fs.writeFileSync(podfile, '');\n\n // -- Act --\n const result = usesCocoaPod(tempDir);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n\n describe('Podfile does not exist', () => {\n it('should return false', () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-without-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n // -- Act --\n const result = usesCocoaPod(tempDir);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n });\n\n describe('addCocoaPods', () => {\n describe('Podfile does not exist', () => {\n it('should throw an error', async () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-without-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n // -- Act & Assert --\n await expect(addCocoaPods(tempDir)).rejects.toThrow(\n 'ENOENT: no such file or directory, open',\n );\n });\n });\n\n describe('Podfile exists', () => {\n describe('Podfile includes Sentry pod', () => {\n const variations = [\n {\n case: 'simple',\n content: 'pod \"Sentry\"',\n },\n {\n case: 'with-swiftui',\n content: 'pod \"SentrySwiftUI\"',\n },\n {\n case: 'leading-space',\n content: ' pod \"Sentry\"',\n },\n {\n case: 'leading-space-and-swiftui',\n content: ' pod \"SentrySwiftUI\"',\n },\n {\n case: 'trailing-space',\n content: 'pod \"Sentry\" ',\n },\n {\n case: 'trailing-space-and-swiftui',\n content: 'pod \"SentrySwiftUI\" ',\n },\n {\n case: 'single-quotes',\n content: \"pod 'Sentry'\",\n },\n {\n case: 'double-quotes',\n content: 'pod \"Sentry\"',\n },\n ];\n for (const variation of variations) {\n it(`should not change the Podfile for ${variation.case}`, async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, variation.content, 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(variation.content);\n });\n }\n });\n\n describe('Podfile includes no other pods', () => {\n describe('Podfile does not include use_frameworks!', () => {\n it('should not change the Podfile', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, '', 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe('');\n });\n });\n\n describe('Podfile includes use_frameworks!', () => {\n it('should change the Podfile', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, `use_frameworks!`, 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(\n `use_frameworks!\\npod 'Sentry'\\n`,\n );\n });\n });\n });\n\n describe('Podfile includes other pods', () => {\n it('should append Sentry pod after last pod', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, 'pod \"OtherPod\"', 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(\n `pod \"OtherPod\"\\npod 'Sentry'\\n`,\n );\n });\n });\n });\n });\n\n describe('podInstall', () => {\n let workDir: string;\n\n beforeEach(() => {\n workDir = path.join(os.tmpdir(), 'test-project');\n });\n\n describe('any bash scripts fail', () => {\n beforeEach(() => {\n vi.spyOn(bash, 'execute').mockRejectedValue(new Error('test error'));\n });\n\n it('should not throw an error', async () => {\n // -- Act & Assert --\n await expect(podInstall(workDir)).resolves.not.toThrow();\n });\n\n it('should set tag', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', false);\n });\n\n it('should capture exception', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.captureException).toHaveBeenCalledWith(\n 'Sentry pod install failed.',\n );\n });\n\n it('should start and stop spinner', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(clackSpinnerMock.start).toHaveBeenCalledWith(\n \"Running 'pod install'. This may take a few minutes...\",\n );\n expect(clackSpinnerMock.stop).toHaveBeenCalledWith(\n 'Failed to install pods.',\n );\n });\n });\n\n describe('all bash scripts work', () => {\n beforeEach(() => {\n vi.spyOn(bash, 'execute').mockResolvedValue('');\n });\n\n it('should call pod update and install', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(bash.execute).toHaveBeenCalledWith(\n `cd ${workDir} && pod repo update`,\n );\n expect(bash.execute).toHaveBeenCalledWith(\n `cd ${workDir} && pod install --silent`,\n );\n });\n\n it('should set tag', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', true);\n });\n\n it('should start and stop spinner', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(clackSpinnerMock.start).toHaveBeenCalledWith(\n \"Running 'pod install'. This may take a few minutes...\",\n );\n expect(clackSpinnerMock.stop).toHaveBeenCalledWith('Pods installed.');\n });\n });\n\n describe('dir not given', () => {\n it('should use current directory', async () => {\n // -- Act --\n await podInstall();\n\n // -- Assert --\n expect(bash.execute).toHaveBeenCalledWith(`cd . && pod repo update`);\n expect(bash.execute).toHaveBeenCalledWith(\n `cd . && pod install --silent`,\n );\n });\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"cocoapod.test.js","sourceRoot":"","sources":["../../../test/apple/cocoapod.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport {\n addCocoaPods,\n podInstall,\n usesCocoaPod,\n} from '../../src/apple/cocoapod';\nimport * as bash from '../../src/utils/bash';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nvi.mock('@clack/prompts', async () => ({\n __esModule: true,\n ...(await vi.importActual<typeof clack>('@clack/prompts')),\n}));\n\nvi.mock('../../src/utils/bash');\nvi.mock('@sentry/node', async () => {\n const actual = await vi.importActual<typeof import('@sentry/node')>(\n '@sentry/node',\n );\n return {\n ...actual,\n setTag: vi.fn(),\n captureException: vi.fn(() => 'id'),\n };\n});\n\nconst clackSpinnerMock = {\n start: vi.fn(),\n stop: vi.fn(),\n message: vi.fn(),\n};\n\ndescribe('cocoapod', () => {\n beforeEach(() => {\n vi.spyOn(clack, 'spinner').mockReturnValue(clackSpinnerMock);\n vi.spyOn(clack.log, 'error').mockImplementation(() => {\n /* empty */\n });\n });\n\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n describe('usesCocoaPod', () => {\n describe('Podfile exists', () => {\n it('should return true', () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-with-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n const podfile = path.join(tempDir, 'Podfile');\n fs.writeFileSync(podfile, '');\n\n // -- Act --\n const result = usesCocoaPod(tempDir);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n\n describe('Podfile does not exist', () => {\n it('should return false', () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-without-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n // -- Act --\n const result = usesCocoaPod(tempDir);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n });\n\n describe('addCocoaPods', () => {\n describe('Podfile does not exist', () => {\n it('should throw an error', async () => {\n // -- Arrange --\n const projPath = path.join(os.tmpdir(), 'test-project-without-podfile');\n const tempDir = fs.mkdtempSync(projPath);\n\n // -- Act & Assert --\n await expect(addCocoaPods(tempDir)).rejects.toThrow(\n 'ENOENT: no such file or directory, open',\n );\n });\n });\n\n describe('Podfile exists', () => {\n describe('Podfile includes Sentry pod', () => {\n const variations = [\n {\n case: 'simple',\n content: 'pod \"Sentry\"',\n },\n {\n case: 'with-swiftui',\n content: 'pod \"SentrySwiftUI\"',\n },\n {\n case: 'leading-space',\n content: ' pod \"Sentry\"',\n },\n {\n case: 'leading-space-and-swiftui',\n content: ' pod \"SentrySwiftUI\"',\n },\n {\n case: 'trailing-space',\n content: 'pod \"Sentry\" ',\n },\n {\n case: 'trailing-space-and-swiftui',\n content: 'pod \"SentrySwiftUI\" ',\n },\n {\n case: 'single-quotes',\n content: \"pod 'Sentry'\",\n },\n {\n case: 'double-quotes',\n content: 'pod \"Sentry\"',\n },\n ];\n for (const variation of variations) {\n it(`should not change the Podfile for ${variation.case}`, async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, variation.content, 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(variation.content);\n });\n }\n });\n\n describe('Podfile includes no other pods', () => {\n describe('Podfile does not include use_frameworks!', () => {\n it('should not change the Podfile', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, '', 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe('');\n });\n });\n\n describe('Podfile includes use_frameworks!', () => {\n it('should change the Podfile', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, `use_frameworks!`, 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(\n `use_frameworks!\\npod 'Sentry'\\n`,\n );\n });\n });\n });\n\n describe('Podfile includes other pods', () => {\n it('should append Sentry pod after last pod', async () => {\n // -- Arrange --\n const projPath = fs.mkdtempSync(path.join(os.tmpdir(), 'project'));\n fs.mkdirSync(projPath, {\n recursive: true,\n });\n\n const podfile = path.join(projPath, 'Podfile');\n fs.writeFileSync(podfile, 'pod \"OtherPod\"', 'utf8');\n\n // -- Act --\n const result = await addCocoaPods(projPath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(fs.readFileSync(podfile, 'utf8')).toBe(\n `pod \"OtherPod\"\\npod 'Sentry'\\n`,\n );\n });\n });\n });\n });\n\n describe('podInstall', () => {\n let workDir: string;\n\n beforeEach(() => {\n workDir = path.join(os.tmpdir(), 'test-project');\n });\n\n describe('any bash scripts fail', () => {\n beforeEach(() => {\n vi.spyOn(bash, 'execute').mockRejectedValue(new Error('test error'));\n });\n\n it('should not throw an error', async () => {\n // -- Act & Assert --\n await expect(podInstall(workDir)).resolves.not.toThrow();\n });\n\n it('should set tag', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', false);\n });\n\n it('should capture exception', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.captureException).toHaveBeenCalledWith(\n 'Sentry pod install failed.',\n );\n });\n\n it('should start and stop spinner', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(clackSpinnerMock.start).toHaveBeenCalledWith(\n \"Running 'pod install'. This may take a few minutes...\",\n );\n expect(clackSpinnerMock.stop).toHaveBeenCalledWith(\n 'Failed to install pods.',\n );\n });\n });\n\n describe('all bash scripts work', () => {\n beforeEach(() => {\n vi.spyOn(bash, 'execute').mockResolvedValue('');\n });\n\n it('should call pod update and install', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(bash.execute).toHaveBeenCalledWith(\n `cd ${workDir} && pod repo update`,\n );\n expect(bash.execute).toHaveBeenCalledWith(\n `cd ${workDir} && pod install --silent`,\n );\n });\n\n it('should set tag', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(Sentry.setTag).toHaveBeenCalledWith('pods-installed', true);\n });\n\n it('should start and stop spinner', async () => {\n // -- Act --\n await podInstall(workDir);\n\n // -- Assert --\n expect(clackSpinnerMock.start).toHaveBeenCalledWith(\n \"Running 'pod install'. This may take a few minutes...\",\n );\n expect(clackSpinnerMock.stop).toHaveBeenCalledWith('Pods installed.');\n });\n });\n\n describe('dir not given', () => {\n it('should use current directory', async () => {\n // -- Act --\n await podInstall();\n\n // -- Assert --\n expect(bash.execute).toHaveBeenCalledWith(`cd . && pod repo update`);\n expect(bash.execute).toHaveBeenCalledWith(\n `cd . && pod install --silent`,\n );\n });\n });\n });\n});\n"]}
|
|
@@ -31,6 +31,14 @@ const code_tools_1 = require("../../src/apple/code-tools");
|
|
|
31
31
|
// @ts-expect-error - clack is ESM and TS complains about that. It works though
|
|
32
32
|
const clack = __importStar(require("@clack/prompts"));
|
|
33
33
|
const vitest_1 = require("vitest");
|
|
34
|
+
vitest_1.vi.mock('@sentry/node', async () => {
|
|
35
|
+
const actual = await vitest_1.vi.importActual('@sentry/node');
|
|
36
|
+
return {
|
|
37
|
+
...actual,
|
|
38
|
+
setTag: vitest_1.vi.fn(),
|
|
39
|
+
captureException: vitest_1.vi.fn(() => 'id'),
|
|
40
|
+
};
|
|
41
|
+
});
|
|
34
42
|
// Test Constants
|
|
35
43
|
const invalidAppDelegateSwift = `func application() {}`;
|
|
36
44
|
const validAppDelegateSwift = `
|
|
@@ -207,8 +215,6 @@ const prepareAppDelegateFile = (dir, content, ext) => {
|
|
|
207
215
|
const dsn = 'https://example.com/sentry-dsn';
|
|
208
216
|
// Mock Setup
|
|
209
217
|
vitest_1.vi.mock('../../src/utils/bash');
|
|
210
|
-
vitest_1.vi.spyOn(Sentry, 'setTag').mockImplementation(() => undefined);
|
|
211
|
-
vitest_1.vi.spyOn(Sentry, 'captureException').mockImplementation(() => 'id');
|
|
212
218
|
// Test Suite
|
|
213
219
|
(0, vitest_1.describe)('code-tools', () => {
|
|
214
220
|
(0, vitest_1.beforeEach)(() => {
|