{"version":3,"file":"util.js","sources":["../../../src/config/util.ts"],"sourcesContent":["import { parseSemver } from '@sentry/core';\nimport * as fs from 'fs';\nimport { createRequire } from 'module';\nimport * as path from 'path';\n\n/**\n * Returns the version of Next.js installed in the project, or undefined if it cannot be determined.\n */\nexport function getNextjsVersion(): string | undefined {\n const nextjsPackageJsonPath = resolveNextjsPackageJson();\n if (nextjsPackageJsonPath) {\n try {\n const nextjsPackageJson: { version: string } = JSON.parse(\n fs.readFileSync(nextjsPackageJsonPath, { encoding: 'utf-8' }),\n );\n return nextjsPackageJson.version;\n } catch {\n // noop\n }\n }\n\n return undefined;\n}\n\nfunction resolveNextjsPackageJson(): string | undefined {\n try {\n return createRequire(`${process.cwd()}/`).resolve('next/package.json');\n } catch {\n return undefined;\n }\n}\n\n/**\n * Checks if the current Next.js version supports the runAfterProductionCompile hook.\n * This hook was introduced in Next.js 15.4.1. (https://github.com/vercel/next.js/pull/77345)\n *\n * @param version - version string to check.\n * @returns true if Next.js version is 15.4.1 or higher\n */\nexport function supportsProductionCompileHook(version: string): boolean {\n const versionToCheck = version;\n if (!versionToCheck) {\n return false;\n }\n\n const { major, minor, patch } = parseSemver(versionToCheck);\n\n if (major === undefined || minor === undefined || patch === undefined) {\n return false;\n }\n\n if (major > 15) {\n return true;\n }\n\n // For major version 15, check if it's 15.4.1 or higher\n if (major === 15) {\n if (minor > 4) {\n return true;\n }\n if (minor === 4 && patch >= 1) {\n return true;\n }\n return false;\n }\n\n return false;\n}\n\n/**\n * Checks if the current Next.js version supports native debug ids for turbopack.\n * This feature was first introduced in Next.js v15.6.0-canary.36 and marked stable in Next.js v16\n *\n * @param version - version string to check.\n * @returns true if Next.js version supports native debug ids for turbopack builds\n */\nexport function supportsNativeDebugIds(version: string): boolean {\n if (!version) {\n return false;\n }\n\n const { major, minor, prerelease } = parseSemver(version);\n\n if (major === undefined || minor === undefined) {\n return false;\n }\n\n // Next.js 16+ supports native debug ids\n if (major >= 16) {\n return true;\n }\n\n // For Next.js 15, check if it's 15.6.0-canary.36+\n if (major === 15 && prerelease?.startsWith('canary.')) {\n // Any canary version 15.7+ supports native debug ids\n if (minor > 6) {\n return true;\n }\n\n // For 15.6 canary versions, check if it's canary.36 or higher\n if (minor === 6) {\n const canaryNumber = parseInt(prerelease.split('.')[1] || '0', 10);\n if (canaryNumber >= 36) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Checks if the given Next.js version requires the `experimental.instrumentationHook` option.\n * Next.js 15.0.0 and higher (including certain RC and canary versions) no longer require this option\n * and will print a warning if it is set.\n *\n * @param version - version string to check.\n * @returns true if the version requires the instrumentationHook option to be set\n */\nexport function requiresInstrumentationHook(version: string): boolean {\n if (!version) {\n return true; // Default to requiring it if version cannot be determined\n }\n\n const { major, minor, patch, prerelease } = parseSemver(version);\n\n if (major === undefined || minor === undefined || patch === undefined) {\n return true; // Default to requiring it if parsing fails\n }\n\n // Next.js 16+ never requires the hook\n if (major >= 16) {\n return false;\n }\n\n // Next.js 14 and below always require the hook\n if (major < 15) {\n return true;\n }\n\n // At this point, we know it's Next.js 15.x.y\n // Stable releases (15.0.0+) don't require the hook\n if (!prerelease) {\n return false;\n }\n\n // Next.js 15.x.y with x > 0 or y > 0 don't require the hook\n if (minor > 0 || patch > 0) {\n return false;\n }\n\n // Check specific prerelease versions that don't require the hook\n if (prerelease.startsWith('rc.')) {\n const rcNumber = parseInt(prerelease.split('.')[1] || '0', 10);\n return rcNumber === 0; // Only rc.0 requires the hook\n }\n\n if (prerelease.startsWith('canary.')) {\n const canaryNumber = parseInt(prerelease.split('.')[1] || '0', 10);\n return canaryNumber < 124; // canary.124+ doesn't require the hook\n }\n\n // All other 15.0.0 prerelease versions (alpha, beta, etc.) require the hook\n return true;\n}\n\n/**\n * Determines which bundler is actually being used based on environment variables,\n * and CLI flags.\n *\n * @returns 'turbopack' or 'webpack'\n */\nexport function detectActiveBundler(): 'turbopack' | 'webpack' {\n const turbopackEnv = process.env.TURBOPACK;\n\n // Check if TURBOPACK env var is set to a truthy value (excluding falsy strings like 'false', '0', '')\n const isTurbopackEnabled = turbopackEnv && turbopackEnv !== 'false' && turbopackEnv !== '0';\n\n if (isTurbopackEnabled || process.argv.includes('--turbo')) {\n return 'turbopack';\n } else {\n return 'webpack';\n }\n}\n\n/**\n * Extract modules from project directory's package.json\n */\nexport function getPackageModules(projectDir: string): Record {\n try {\n const packageJson = path.join(projectDir, 'package.json');\n const packageJsonContent = fs.readFileSync(packageJson, 'utf8');\n const packageJsonObject = JSON.parse(packageJsonContent) as {\n dependencies?: Record;\n devDependencies?: Record;\n };\n\n return {\n ...packageJsonObject.dependencies,\n ...packageJsonObject.devDependencies,\n };\n } catch {\n return {};\n }\n}\n"],"names":["createRequire","parseSemver"],"mappings":"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"}