UNPKG

@sentry/wizard

Version:

Sentry wizard helping you to configure your project

123 lines (121 loc) 5.87 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs = __importStar(require("node:fs")); const Constants_1 = require("../../lib/Constants"); const utils_1 = require("../utils"); const vitest_1 = require("vitest"); //@ts-expect-error - clifty is ESM only const clifty_1 = require("clifty"); (0, vitest_1.describe)('NextJS-16 with Prettier, Biome, and ESLint', () => { const integration = Constants_1.Integration.nextjs; let wizardExitCode; const { projectDir, cleanup } = (0, utils_1.createIsolatedTestEnv)('nextjs-16-test-app'); (0, vitest_1.beforeAll)(async () => { wizardExitCode = await (0, clifty_1.withEnv)({ cwd: projectDir, }) .defineInteraction() .whenAsked('Please select your package manager', { timeout: 300000, }) .respondWith(clifty_1.KEYS.ENTER) // Select npm (first option) .expectOutput('Installing @sentry/nextjs') .whenAsked('Do you want to route Sentry requests in the browser through your Next.js server', { timeout: 300000, // package installation can take a while in CI }) .respondWith(clifty_1.KEYS.ENTER) .whenAsked('to track the performance of your application?') .respondWith(clifty_1.KEYS.ENTER) .whenAsked('to get a video-like reproduction of errors during a user session?') .respondWith(clifty_1.KEYS.ENTER) .whenAsked('to send your application logs to Sentry?') .respondWith(clifty_1.KEYS.ENTER) .whenAsked('Do you want to create an example page') .respondWith(clifty_1.KEYS.DOWN, clifty_1.KEYS.ENTER) // Skip example page .whenAsked('Are you using a CI/CD tool') .respondWith(clifty_1.KEYS.DOWN, clifty_1.KEYS.ENTER) // Select No .whenAsked('Optionally add a project-scoped MCP server configuration for the Sentry MCP?') .respondWith(clifty_1.KEYS.DOWN, clifty_1.KEYS.ENTER) // Skip MCP config .whenAsked('Looks like you have Prettier and Biome in your project') .respondWith(clifty_1.KEYS.ENTER) // Accept formatter run .expectOutput('Running formatters on your files...') .expectOutput('Formatters have processed your files', { timeout: 60000 }) .expectOutput('Successfully installed the Sentry Next.js SDK!') .run((0, utils_1.getWizardCommand)(integration)); }); (0, vitest_1.afterAll)(() => { cleanup(); }); (0, vitest_1.test)('exits with exit code 0', () => { (0, vitest_1.expect)(wizardExitCode).toBe(0); }); (0, vitest_1.test)('package.json is updated correctly', () => { (0, utils_1.checkPackageJson)(projectDir, '@sentry/nextjs'); }); (0, vitest_1.test)('config files created', () => { (0, utils_1.checkFileExists)(`${projectDir}/sentry.server.config.ts`); (0, utils_1.checkFileExists)(`${projectDir}/sentry.edge.config.ts`); }); (0, vitest_1.test)('global error file exists', () => { (0, utils_1.checkFileExists)(`${projectDir}/app/global-error.tsx`); }); (0, vitest_1.test)('instrumentation files exist', () => { (0, utils_1.checkFileExists)(`${projectDir}/instrumentation.ts`); (0, utils_1.checkFileExists)(`${projectDir}/instrumentation-client.ts`); }); (0, vitest_1.test)('instrumentation file contains Sentry initialization', () => { (0, utils_1.checkFileContents)(`${projectDir}/instrumentation.ts`, [ 'import * as Sentry from "@sentry/nextjs";', `export async function register() { if (process.env.NEXT_RUNTIME === "nodejs") { await import("./sentry.server.config"); } if (process.env.NEXT_RUNTIME === "edge") { await import("./sentry.edge.config"); } } export const onRequestError = Sentry.captureRequestError;`, ]); }); (0, vitest_1.test)('next.config file contains Sentry wrapper', () => { (0, utils_1.checkFileContents)(`${projectDir}/next.config.ts`, [ 'import { withSentryConfig } from "@sentry/nextjs"', 'withSentryConfig(nextConfig, {', ]); }); (0, vitest_1.test)('Generated code has proper import formatting', () => { const configContent = fs.readFileSync(`${projectDir}/next.config.ts`, 'utf-8'); // Verify proper spacing: import { withSentryConfig } from (0, vitest_1.expect)(configContent).toMatch(/import\s+{\s+\w+\s+}\s+from/); }); (0, vitest_1.test)('builds correctly', async () => { await (0, utils_1.checkIfBuilds)(projectDir); }); (0, vitest_1.test)('lints correctly', async () => { await (0, utils_1.checkIfLints)(projectDir); }); }); //# sourceMappingURL=nextjs-16.test.js.map