@djangocfg/nextjs 2.1.29 → 2.1.30

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.
@@ -14,7 +14,7 @@ var require_package = __commonJS({
14
14
  "package.json"(exports, module) {
15
15
  module.exports = {
16
16
  name: "@djangocfg/nextjs",
17
- version: "2.1.29",
17
+ version: "2.1.30",
18
18
  description: "Next.js server utilities: sitemap, health, OG images, contact forms, navigation, config",
19
19
  keywords: [
20
20
  "nextjs",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../package.json","../../src/config/constants.ts","../../src/config/utils/deepMerge.ts","../../src/config/utils/env.ts","../../src/config/plugins/devStartup.ts","../../src/ai/constants.ts","../../src/config/utils/version.ts","../../src/config/packages/installer.ts","../../src/config/packages/checker.ts","../../src/config/packages/definitions.ts","../../src/config/packages/updater.ts","../../src/config/plugins/compression.ts","../../src/config/createNextConfig.ts"],"sourcesContent":["{\n \"name\": \"@djangocfg/nextjs\",\n \"version\": \"2.1.29\",\n \"description\": \"Next.js server utilities: sitemap, health, OG images, contact forms, navigation, config\",\n \"keywords\": [\n \"nextjs\",\n \"sitemap\",\n \"health\",\n \"og-image\",\n \"navigation\",\n \"config\",\n \"react\",\n \"typescript\"\n ],\n \"author\": {\n \"name\": \"DjangoCFG\",\n \"url\": \"https://djangocfg.com\"\n },\n \"homepage\": \"https://djangocfg.com\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/markolofsen/django-cfg.git\",\n \"directory\": \"packages/nextjs\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/markolofsen/django-cfg/issues\"\n },\n \"license\": \"MIT\",\n \"main\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.mts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.mts\",\n \"import\": \"./dist/index.mjs\",\n \"default\": \"./dist/index.mjs\"\n },\n \"./sitemap\": {\n \"types\": \"./dist/sitemap/index.d.mts\",\n \"import\": \"./dist/sitemap/index.mjs\",\n \"default\": \"./dist/sitemap/index.mjs\"\n },\n \"./health\": {\n \"types\": \"./dist/health/index.d.mts\",\n \"import\": \"./dist/health/index.mjs\",\n \"default\": \"./dist/health/index.mjs\"\n },\n \"./og-image\": {\n \"types\": \"./dist/og-image/index.d.mts\",\n \"import\": \"./dist/og-image/index.mjs\",\n \"default\": \"./dist/og-image/index.mjs\"\n },\n \"./og-image/utils\": {\n \"types\": \"./dist/og-image/utils/index.d.mts\",\n \"import\": \"./dist/og-image/utils/index.mjs\",\n \"default\": \"./dist/og-image/utils/index.mjs\"\n },\n \"./og-image/components\": {\n \"types\": \"./dist/og-image/components/index.d.mts\",\n \"import\": \"./dist/og-image/components/index.mjs\",\n \"default\": \"./dist/og-image/components/index.mjs\"\n },\n \"./navigation\": {\n \"types\": \"./dist/navigation/index.d.mts\",\n \"import\": \"./dist/navigation/index.mjs\",\n \"default\": \"./dist/navigation/index.mjs\"\n },\n \"./config\": {\n \"types\": \"./dist/config/index.d.mts\",\n \"import\": \"./dist/config/index.mjs\",\n \"default\": \"./dist/config/index.mjs\"\n },\n \"./ai\": {\n \"types\": \"./dist/ai/index.d.mts\",\n \"import\": \"./dist/ai/index.mjs\",\n \"default\": \"./dist/ai/index.mjs\"\n },\n \"./scripts\": {\n \"types\": \"./dist/scripts/index.d.mts\",\n \"import\": \"./dist/scripts/index.mjs\",\n \"default\": \"./dist/scripts/index.mjs\"\n }\n },\n \"files\": [\n \"dist\",\n \"src\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"bin\": {\n \"djangocfg-docs\": \"./dist/ai/cli.mjs\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"clean\": \"rm -rf dist\",\n \"lint\": \"eslint .\",\n \"check\": \"tsc --noEmit\",\n \"check-links\": \"tsx src/scripts/check-links.ts\",\n \"ai-docs\": \"tsx src/ai/cli.ts\"\n },\n \"peerDependencies\": {\n \"next\": \"^15.5.9\"\n },\n \"devDependencies\": {\n \"@djangocfg/imgai\": \"workspace:*\",\n \"@djangocfg/layouts\": \"workspace:*\",\n \"@djangocfg/typescript-config\": \"workspace:*\",\n \"@types/node\": \"^24.7.2\",\n \"@types/react\": \"19.2.2\",\n \"@types/react-dom\": \"19.2.1\",\n \"@types/semver\": \"^7.7.1\",\n \"@types/webpack\": \"^5.28.5\",\n \"@vercel/og\": \"^0.8.5\",\n \"eslint\": \"^9.37.0\",\n \"linkinator\": \"^7.5.0\",\n \"lucide-react\": \"^0.545.0\",\n \"picocolors\": \"^1.1.1\",\n \"prompts\": \"^2.4.2\",\n \"tsup\": \"^8.0.1\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"^5.9.3\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.3.0\",\n \"conf\": \"^15.0.2\",\n \"consola\": \"^3.4.2\",\n \"semver\": \"^7.7.3\"\n }\n}","/**\n * Shared Constants for DjangoCFG Next.js Configuration\n */\n\n// Package name for version checks\nexport const PACKAGE_NAME = '@djangocfg/nextjs';\n\n// Version cache TTL (1 hour)\nexport const VERSION_CACHE_TTL_MS = 60 * 60 * 1000;\n\n// ASCII Art Banner for Django CFG\nexport const DJANGO_CFG_BANNER = `\n██████╗ ██╗ █████╗ ███╗ ██╗ ██████╗ ██████╗ ██████╗███████╗ ██████╗\n██╔══██╗ ██║██╔══██╗████╗ ██║██╔════╝ ██╔═══██╗ ██╔════╝██╔════╝██╔════╝\n██║ ██║ ██║███████║██╔██╗ ██║██║ ███╗██║ ██║ ██║ █████╗ ██║ ███╗\n██║ ██║██ ██║██╔══██║██║╚██╗██║██║ ██║██║ ██║ ██║ ██╔══╝ ██║ ██║\n██████╔╝╚█████╔╝██║ ██║██║ ╚████║╚██████╔╝╚██████╔╝ ╚██████╗██║ ╚██████╔╝\n╚═════╝ ╚════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝╚═╝ ╚═════╝\n`;\n\n// All @djangocfg packages that can be updated together\nexport const DJANGOCFG_PACKAGES = [\n '@djangocfg/ui-core',\n '@djangocfg/ui-nextjs',\n '@djangocfg/layouts',\n '@djangocfg/nextjs',\n '@djangocfg/api',\n '@djangocfg/centrifugo',\n '@djangocfg/eslint-config',\n '@djangocfg/typescript-config',\n] as const;\n\n// Default packages to transpile\nexport const DEFAULT_TRANSPILE_PACKAGES = [\n '@djangocfg/ui-core',\n '@djangocfg/ui-nextjs',\n '@djangocfg/layouts',\n '@djangocfg/api',\n '@djangocfg/centrifugo',\n] as const;\n\n// Default packages to optimize imports\nexport const DEFAULT_OPTIMIZE_PACKAGES = [\n '@djangocfg/ui-core',\n '@djangocfg/ui-nextjs',\n '@djangocfg/layouts',\n 'lucide-react',\n 'recharts',\n] as const;\n","/**\n * Deep Merge Utility\n *\n * Recursively merges objects, replacing arrays instead of merging them.\n */\n\nexport function deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const output = { ...target };\n\n for (const key in source) {\n if (source[key] === undefined) continue;\n\n // Arrays: replace (don't merge arrays)\n if (Array.isArray(source[key])) {\n output[key] = source[key] as any;\n }\n // Objects: deep merge\n else if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n const targetValue = output[key];\n if (targetValue && typeof targetValue === 'object' && !Array.isArray(targetValue)) {\n output[key] = deepMerge(targetValue, source[key] as any);\n } else {\n output[key] = source[key] as any;\n }\n }\n // Primitives: replace\n else {\n output[key] = source[key] as any;\n }\n }\n\n return output;\n}\n","/**\n * Environment Variable Utilities\n */\n\nexport const isStaticBuild = process.env.NEXT_PUBLIC_STATIC_BUILD === 'true';\nexport const isDev = process.env.NODE_ENV === 'development';\nexport const isProduction = process.env.NODE_ENV === 'production';\nexport const isCI = process.env.CI === 'true';\n\n/**\n * Get base path for static builds\n */\nexport function getBasePath(isDefaultCfgAdmin?: boolean): string {\n if (!isStaticBuild) return '';\n return isDefaultCfgAdmin ? '/cfg/admin' : '/cfg/nextjs-admin';\n}\n\n/**\n * Get API URL (empty for static builds)\n */\nexport function getApiUrl(): string {\n return isStaticBuild ? '' : (process.env.NEXT_PUBLIC_API_URL || '');\n}\n\n/**\n * Get Site URL (empty for static builds)\n */\nexport function getSiteUrl(): string {\n return isStaticBuild ? '' : (process.env.NEXT_PUBLIC_SITE_URL || '');\n}\n","/**\n * Dev Startup Webpack Plugin\n *\n * Handles banner display, version checking, package updates, and browser auto-open.\n */\n\nimport type { Compiler } from 'webpack';\nimport chalk from 'chalk';\nimport { DJANGO_CFG_BANNER } from '../constants';\nimport { AI_DOCS_HINT } from '../../ai/constants';\nimport { getCurrentVersion } from '../utils/version';\nimport { checkAndInstallPackages } from '../packages/installer';\nimport { checkAndUpdatePackages } from '../packages/updater';\n\n// Track if startup tasks were already run (persists across HMR)\nlet startupDone = false;\nlet browserOpened = false;\n\nexport interface DevStartupPluginOptions {\n /** Auto-open browser */\n openBrowser?: boolean;\n /** Check for missing optional packages (default: true) */\n checkPackages?: boolean;\n /** Auto-install missing packages without prompting */\n autoInstall?: boolean;\n /** Check for @djangocfg/* package updates (default: true) */\n checkUpdates?: boolean;\n /** Auto-update packages without prompting */\n autoUpdate?: boolean;\n /** Force check workspace:* packages (for testing in monorepo) */\n forceCheckWorkspace?: boolean;\n}\n\n/**\n * Webpack plugin for dev startup tasks\n */\nexport class DevStartupPlugin {\n private options: DevStartupPluginOptions;\n\n constructor(options: DevStartupPluginOptions = {}) {\n this.options = options;\n }\n\n apply(compiler: Compiler): void {\n // Use tapPromise for proper async handling\n compiler.hooks.done.tapPromise('DevStartupPlugin', async () => {\n // Run startup tasks only once\n if (!startupDone) {\n startupDone = true;\n await this.runStartupTasks();\n }\n\n // Auto-open browser if enabled\n if (this.options.openBrowser && !browserOpened) {\n browserOpened = true;\n this.openBrowser();\n }\n });\n }\n\n private async runStartupTasks(): Promise<void> {\n // 1. Print banner\n console.log('\\n' + chalk.yellowBright.bold(DJANGO_CFG_BANNER));\n\n // 2. Print current version\n const version = getCurrentVersion();\n if (version) {\n console.log(chalk.dim(` 📦 @djangocfg/nextjs v${version}`));\n }\n\n // 3. Print AI docs hint\n console.log(chalk.magenta(` ${AI_DOCS_HINT}\\n`));\n\n // 4. Check for package updates\n if (this.options.checkUpdates !== false) {\n try {\n await checkAndUpdatePackages({\n autoUpdate: this.options.autoUpdate,\n forceCheckWorkspace: this.options.forceCheckWorkspace,\n force: true, // Force check ignoring cooldown\n });\n } catch (err) {\n console.log(chalk.red(' Update check failed:'), err);\n }\n }\n\n // 5. Check for missing optional packages\n if (this.options.checkPackages !== false) {\n await checkAndInstallPackages({\n autoInstall: this.options.autoInstall,\n });\n }\n }\n\n private openBrowser(): void {\n // Delay to ensure server is ready\n setTimeout(async () => {\n try {\n const { exec } = await import('child_process');\n const port = process.env.PORT || '3000';\n const url = `http://localhost:${port}`;\n\n const command = process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'start'\n : 'xdg-open';\n\n exec(`${command} ${url}`, (error) => {\n if (error) {\n console.warn(`Failed to open browser: ${error.message}`);\n }\n });\n } catch (error) {\n console.warn('Failed to open browser');\n }\n }, 2000);\n }\n}\n\n/**\n * Reset plugin state (useful for tests)\n */\nexport function resetDevStartupState(): void {\n startupDone = false;\n browserOpened = false;\n}\n","/**\n * AI Documentation Constants\n */\n\n// MCP Server URLs\nexport const MCP_BASE_URL = 'https://mcp.djangocfg.com';\nexport const MCP_SERVER_URL = `${MCP_BASE_URL}/mcp`;\nexport const MCP_API_URL = `${MCP_BASE_URL}/api/search`;\n\n// API Endpoints\nexport const API_SEARCH_ENDPOINT = '/api/search';\nexport const API_INFO_ENDPOINT = '/api/info';\nexport const DEFAULT_TIMEOUT = 10000; // ms\n\n// AI Hint for console output\nexport const AI_DOCS_HINT = `🤖 AI Docs: ${MCP_SERVER_URL} | pnpm ai-docs search \"query\"`;\n\n// Full AI Hint description\nexport const AI_HINT = `\nDjangoCFG Documentation is available via MCP server.\n\nTo get help with DjangoCFG configuration:\n1. Use the MCP server: ${MCP_SERVER_URL}\n2. Or search directly: ${MCP_API_URL}?q=YOUR_QUERY&limit=5\n\nExample queries:\n- \"How to configure PostgreSQL database?\"\n- \"What is DatabaseConfig?\"\n- \"How to setup Redis cache?\"\n- \"Email configuration with SMTP\"\n`;\n","/**\n * Version Checking Utilities\n */\n\nimport chalk from 'chalk';\nimport semver from 'semver';\nimport consola from 'consola';\nimport Conf from 'conf';\nimport { PACKAGE_NAME, VERSION_CACHE_TTL_MS, DJANGOCFG_PACKAGES } from '../constants';\n\n// Version cache using conf (stores in ~/.config/djangocfg-nextjs/)\nconst versionCache = new Conf<{\n latestVersion?: string;\n lastCheck?: number;\n}>({\n projectName: 'djangocfg-nextjs',\n projectVersion: '1.0.0',\n});\n\n/**\n * Get current package version from package.json\n */\nexport function getCurrentVersion(): string | null {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const packageJson = require('../../../package.json');\n return packageJson.version || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch latest version from npm registry (with 1 hour caching via conf)\n */\nexport async function fetchLatestVersion(): Promise<string | null> {\n // Check cache first\n const lastCheck = versionCache.get('lastCheck') || 0;\n const cachedVersion = versionCache.get('latestVersion');\n\n if (cachedVersion && (Date.now() - lastCheck) < VERSION_CACHE_TTL_MS) {\n return cachedVersion;\n }\n\n // Fetch from npm registry\n try {\n const https = await import('https');\n return new Promise((resolve) => {\n const req = https.get(\n `https://registry.npmjs.org/${PACKAGE_NAME}/latest`,\n { timeout: 5000 },\n (res: any) => {\n let data = '';\n res.on('data', (chunk: string) => { data += chunk; });\n res.on('end', () => {\n try {\n const json = JSON.parse(data);\n const version = json.version || null;\n if (version) {\n versionCache.set('latestVersion', version);\n versionCache.set('lastCheck', Date.now());\n }\n resolve(version);\n } catch {\n resolve(cachedVersion || null);\n }\n });\n }\n );\n req.on('error', () => resolve(cachedVersion || null));\n req.on('timeout', () => { req.destroy(); resolve(cachedVersion || null); });\n });\n } catch {\n return cachedVersion || null;\n }\n}\n\n/**\n * Check if update is available\n */\nexport async function checkForUpdate(): Promise<{\n hasUpdate: boolean;\n currentVersion: string | null;\n latestVersion: string | null;\n}> {\n const currentVersion = getCurrentVersion();\n if (!currentVersion) {\n return { hasUpdate: false, currentVersion: null, latestVersion: null };\n }\n\n const latestVersion = await fetchLatestVersion();\n const hasUpdate = !!(latestVersion && semver.gt(latestVersion, currentVersion));\n\n return { hasUpdate, currentVersion, latestVersion };\n}\n\n/**\n * Get update command for all djangocfg packages\n */\nexport function getUpdateCommand(): string {\n return `pnpm add ${DJANGOCFG_PACKAGES.map(p => `${p}@latest`).join(' ')}`;\n}\n\n/**\n * Print version info and update notification\n */\nexport async function printVersionInfo(): Promise<void> {\n const { hasUpdate, currentVersion, latestVersion } = await checkForUpdate();\n\n if (!currentVersion) return;\n\n // Print current version\n consola.box(`📦 @djangocfg/nextjs v${currentVersion}`);\n\n // Show update notification if available\n if (hasUpdate && latestVersion) {\n consola.warn(`Update Available! ${chalk.red(currentVersion)} → ${chalk.green(latestVersion)}`);\n consola.info(`Run: ${chalk.cyan(getUpdateCommand())}`);\n console.log('');\n }\n}\n","/**\n * Package Installer\n *\n * Provides auto-installation functionality with user confirmation and progress indication.\n */\n\nimport { execSync, spawn } from 'child_process';\nimport { createInterface } from 'readline';\nimport chalk from 'chalk';\nimport consola from 'consola';\nimport Conf from 'conf';\nimport type { MissingPackage } from './checker';\nimport { getMissingPackages } from './checker';\nimport { isCI } from '../utils/env';\n\n// Installer preferences cache\nconst installerCache = new Conf<{\n autoInstall?: boolean;\n skipPackages?: string[];\n lastPrompt?: number;\n}>({\n projectName: 'djangocfg-nextjs-installer',\n projectVersion: '1.0.0',\n});\n\n// Don't prompt more than once per hour\nconst PROMPT_COOLDOWN_MS = 60 * 60 * 1000;\n\n// Spinner frames for progress\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport interface InstallOptions {\n /** Auto-install without prompting */\n autoInstall?: boolean;\n /** Skip specific packages */\n skipPackages?: string[];\n /** Force prompt even if recently prompted */\n force?: boolean;\n}\n\nexport interface InstallProgress {\n current: number;\n total: number;\n package: string;\n status: 'pending' | 'installing' | 'done' | 'error';\n}\n\n/**\n * Detect package manager\n */\nexport function detectPackageManager(): 'pnpm' | 'yarn' | 'npm' {\n try {\n // Check for lockfiles\n const fs = require('fs');\n const path = require('path');\n const cwd = process.cwd();\n\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (fs.existsSync(path.join(cwd, 'yarn.lock'))) return 'yarn';\n if (fs.existsSync(path.join(cwd, 'package-lock.json'))) return 'npm';\n\n // Check for global package manager\n try {\n execSync('pnpm --version', { stdio: 'ignore' });\n return 'pnpm';\n } catch {\n try {\n execSync('yarn --version', { stdio: 'ignore' });\n return 'yarn';\n } catch {\n return 'npm';\n }\n }\n } catch {\n return 'npm';\n }\n}\n\n/**\n * Build install command for a single package\n */\nexport function buildSingleInstallCommand(\n packageName: string,\n isDev: boolean,\n pm: 'pnpm' | 'yarn' | 'npm'\n): string {\n const devFlag = isDev ? '-D ' : '';\n switch (pm) {\n case 'pnpm':\n return `pnpm add ${devFlag}${packageName}`;\n case 'yarn':\n return `yarn add ${devFlag}${packageName}`;\n case 'npm':\n return `npm install ${devFlag}${packageName}`;\n }\n}\n\n/**\n * Build install command for multiple packages (for display)\n */\nexport function buildInstallCommand(packages: MissingPackage[], pm: 'pnpm' | 'yarn' | 'npm'): string {\n const devPackages = packages.filter(p => p.devDependency).map(p => p.name);\n const prodPackages = packages.filter(p => !p.devDependency).map(p => p.name);\n\n const commands: string[] = [];\n\n if (devPackages.length > 0) {\n switch (pm) {\n case 'pnpm':\n commands.push(`pnpm add -D ${devPackages.join(' ')}`);\n break;\n case 'yarn':\n commands.push(`yarn add -D ${devPackages.join(' ')}`);\n break;\n case 'npm':\n commands.push(`npm install -D ${devPackages.join(' ')}`);\n break;\n }\n }\n\n if (prodPackages.length > 0) {\n switch (pm) {\n case 'pnpm':\n commands.push(`pnpm add ${prodPackages.join(' ')}`);\n break;\n case 'yarn':\n commands.push(`yarn add ${prodPackages.join(' ')}`);\n break;\n case 'npm':\n commands.push(`npm install ${prodPackages.join(' ')}`);\n break;\n }\n }\n\n return commands.join(' && ');\n}\n\n/**\n * Ask user for confirmation via readline\n */\nasync function askConfirmation(question: string): Promise<boolean> {\n // Skip prompt in CI or non-TTY environments\n if (isCI || !process.stdin.isTTY) {\n return false;\n }\n\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(question, (answer) => {\n rl.close();\n const normalized = answer.toLowerCase().trim();\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\n });\n });\n}\n\n/**\n * Create a simple spinner\n */\nfunction createSpinner(text: string) {\n let frameIndex = 0;\n let interval: NodeJS.Timeout | null = null;\n let currentText = text;\n\n const render = () => {\n const frame = SPINNER_FRAMES[frameIndex];\n process.stdout.write(`\\r${chalk.cyan(frame)} ${currentText}`);\n frameIndex = (frameIndex + 1) % SPINNER_FRAMES.length;\n };\n\n return {\n start() {\n if (process.stdout.isTTY) {\n interval = setInterval(render, 80);\n render();\n } else {\n console.log(` ${currentText}`);\n }\n return this;\n },\n text(newText: string) {\n currentText = newText;\n if (!process.stdout.isTTY) {\n console.log(` ${newText}`);\n }\n return this;\n },\n succeed(text?: string) {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write(`\\r${chalk.green('✓')} ${text || currentText}\\n`);\n } else {\n console.log(` ${chalk.green('✓')} ${text || currentText}`);\n }\n return this;\n },\n fail(text?: string) {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write(`\\r${chalk.red('✗')} ${text || currentText}\\n`);\n } else {\n console.log(` ${chalk.red('✗')} ${text || currentText}`);\n }\n return this;\n },\n stop() {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write('\\r\\x1b[K'); // Clear line\n }\n return this;\n },\n };\n}\n\n/**\n * Install a single package with progress\n */\nasync function installSinglePackage(\n pkg: MissingPackage,\n pm: 'pnpm' | 'yarn' | 'npm',\n index: number,\n total: number\n): Promise<boolean> {\n const command = buildSingleInstallCommand(pkg.name, pkg.devDependency, pm);\n const progress = `[${index + 1}/${total}]`;\n const spinner = createSpinner(`${chalk.dim(progress)} Installing ${chalk.cyan(pkg.name)}...`);\n\n spinner.start();\n\n return new Promise((resolve) => {\n const [cmd, ...args] = command.split(' ');\n const proc = spawn(cmd, args, {\n shell: true,\n cwd: process.cwd(),\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let stderr = '';\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n spinner.succeed(`${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.green('installed')}`);\n resolve(true);\n } else {\n spinner.fail(`${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.red('failed')}`);\n if (stderr) {\n console.log(chalk.dim(` ${stderr.split('\\n')[0]}`));\n }\n resolve(false);\n }\n });\n\n proc.on('error', () => {\n spinner.fail(`${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.red('failed')}`);\n resolve(false);\n });\n });\n}\n\n/**\n * Install packages with progress indication\n */\nexport async function installPackagesWithProgress(packages: MissingPackage[]): Promise<boolean> {\n if (packages.length === 0) return true;\n\n const pm = detectPackageManager();\n const total = packages.length;\n\n console.log('');\n console.log(chalk.bold(` Installing ${total} package${total > 1 ? 's' : ''}...`));\n console.log('');\n\n let successCount = 0;\n let failedPackages: string[] = [];\n\n for (let i = 0; i < packages.length; i++) {\n const success = await installSinglePackage(packages[i], pm, i, total);\n if (success) {\n successCount++;\n } else {\n failedPackages.push(packages[i].name);\n }\n }\n\n console.log('');\n\n if (failedPackages.length === 0) {\n consola.success(`All ${total} packages installed successfully!`);\n return true;\n } else if (successCount > 0) {\n consola.warn(`${successCount}/${total} packages installed. Failed: ${failedPackages.join(', ')}`);\n return false;\n } else {\n consola.error(`Failed to install packages: ${failedPackages.join(', ')}`);\n return false;\n }\n}\n\n/**\n * Install packages (simple version without per-package progress)\n */\nexport async function installPackages(packages: MissingPackage[]): Promise<boolean> {\n // Use progress version for multiple packages in TTY\n if (packages.length > 1 && process.stdout.isTTY) {\n return installPackagesWithProgress(packages);\n }\n\n // Simple installation for single package or non-TTY\n if (packages.length === 0) return true;\n\n const pm = detectPackageManager();\n const command = buildInstallCommand(packages, pm);\n\n consola.info(`Installing: ${chalk.cyan(packages.map(p => p.name).join(', '))}`);\n\n const spinner = createSpinner('Installing packages...');\n spinner.start();\n\n return new Promise((resolve) => {\n const proc = spawn(command, {\n shell: true,\n cwd: process.cwd(),\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n spinner.succeed('Packages installed successfully!');\n resolve(true);\n } else {\n spinner.fail('Failed to install packages');\n resolve(false);\n }\n });\n\n proc.on('error', () => {\n spinner.fail('Installation failed');\n resolve(false);\n });\n });\n}\n\n/**\n * Check and prompt for missing packages\n *\n * Returns true if all packages are available (either already installed or just installed)\n */\nexport async function checkAndInstallPackages(options: InstallOptions = {}): Promise<boolean> {\n const missing = getMissingPackages();\n\n // Filter out skipped packages\n const skipList = options.skipPackages || installerCache.get('skipPackages') || [];\n const toInstall = missing.filter(p => !skipList.includes(p.name));\n\n if (toInstall.length === 0) {\n return true;\n }\n\n // Check cooldown (don't prompt too often)\n const lastPrompt = installerCache.get('lastPrompt') || 0;\n if (!options.force && (Date.now() - lastPrompt) < PROMPT_COOLDOWN_MS) {\n // Show info but don't prompt\n printMissingPackagesInfo(toInstall);\n return false;\n }\n\n // Auto-install if configured\n if (options.autoInstall || installerCache.get('autoInstall')) {\n return installPackages(toInstall);\n }\n\n // Show missing packages\n console.log('');\n consola.box('📦 Missing Optional Packages');\n console.log('');\n\n for (const pkg of toInstall) {\n console.log(` ${chalk.yellow('•')} ${chalk.bold(pkg.name)}`);\n console.log(` ${chalk.dim(pkg.description)}`);\n console.log(` ${chalk.dim(pkg.reason)}`);\n console.log('');\n }\n\n // Build install command for display\n const pm = detectPackageManager();\n const command = buildInstallCommand(toInstall, pm);\n\n console.log(` ${chalk.cyan('Command:')} ${command}`);\n console.log('');\n\n // Ask for confirmation\n installerCache.set('lastPrompt', Date.now());\n\n const shouldInstall = await askConfirmation(\n `${chalk.green('?')} Install these packages now? ${chalk.dim('[Y/n]')} `\n );\n\n if (shouldInstall) {\n const success = await installPackages(toInstall);\n\n // Ask if user wants to enable auto-install for future\n if (success) {\n const enableAuto = await askConfirmation(\n `${chalk.green('?')} Enable auto-install for future? ${chalk.dim('[y/N]')} `\n );\n if (enableAuto) {\n installerCache.set('autoInstall', true);\n consola.info('Auto-install enabled. Run with --no-auto-install to disable.');\n }\n }\n\n return success;\n }\n\n // User declined, ask if they want to skip these packages permanently\n const skipPermanently = await askConfirmation(\n `${chalk.green('?')} Skip these packages in future prompts? ${chalk.dim('[y/N]')} `\n );\n\n if (skipPermanently) {\n const currentSkip = installerCache.get('skipPackages') || [];\n installerCache.set('skipPackages', [...currentSkip, ...toInstall.map(p => p.name)]);\n consola.info('Packages added to skip list.');\n }\n\n return false;\n}\n\n/**\n * Print info about missing packages without prompting\n */\nfunction printMissingPackagesInfo(packages: MissingPackage[]): void {\n if (packages.length === 0) return;\n\n const pm = detectPackageManager();\n const command = buildInstallCommand(packages, pm);\n\n consola.warn(`Missing optional packages: ${packages.map(p => p.name).join(', ')}`);\n consola.info(`Install with: ${chalk.cyan(command)}`);\n}\n\n/**\n * Reset installer preferences\n */\nexport function resetInstallerPreferences(): void {\n installerCache.clear();\n consola.success('Installer preferences reset');\n}\n","/**\n * Package Checker\n *\n * Checks which optional packages are missing and need to be installed.\n */\n\nimport { createRequire } from 'module';\nimport { join } from 'path';\nimport type { PackageDefinition } from './definitions';\nimport { getPackagesForContext, OPTIONAL_PACKAGES } from './definitions';\nimport { isStaticBuild, isDev } from '../utils/env';\n\nexport interface MissingPackage extends PackageDefinition {\n /** Why is this package needed? */\n reason: string;\n}\n\n/**\n * Check if a package is installed in the consumer's project\n * Uses process.cwd() to check from the consumer's context, not the library's\n */\nexport function isPackageInstalled(packageName: string): boolean {\n try {\n // Create require from consumer's cwd to check their node_modules\n const consumerRequire = createRequire(join(process.cwd(), 'package.json'));\n consumerRequire.resolve(packageName);\n return true;\n } catch {\n // Fallback: try regular require (for packages hoisted to root)\n try {\n require.resolve(packageName);\n return true;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Get all missing packages for current context\n */\nexport function getMissingPackages(): MissingPackage[] {\n const neededPackages = getPackagesForContext({ isStaticBuild, isDev });\n const missing: MissingPackage[] = [];\n\n for (const pkg of neededPackages) {\n if (!isPackageInstalled(pkg.name)) {\n missing.push({\n ...pkg,\n reason: getReasonText(pkg),\n });\n }\n }\n\n return missing;\n}\n\n/**\n * Check specific packages\n */\nexport function checkPackages(packageNames: string[]): MissingPackage[] {\n const missing: MissingPackage[] = [];\n\n for (const name of packageNames) {\n if (!isPackageInstalled(name)) {\n const definition = OPTIONAL_PACKAGES.find(p => p.name === name);\n missing.push({\n name,\n description: definition?.description || 'Optional package',\n condition: definition?.condition || 'always',\n devDependency: definition?.devDependency ?? true,\n reason: definition ? getReasonText(definition) : 'Requested by configuration',\n });\n }\n }\n\n return missing;\n}\n\n/**\n * Get human-readable reason for package requirement\n */\nfunction getReasonText(pkg: PackageDefinition): string {\n switch (pkg.condition) {\n case 'static-build':\n return 'Required for static build (NEXT_PUBLIC_STATIC_BUILD=true)';\n case 'dev':\n return 'Required for development mode';\n case 'always':\n return 'Required for all builds';\n default:\n return 'Optional feature';\n }\n}\n","/**\n * Package Definitions\n *\n * Defines optional packages that can be auto-installed when needed.\n */\n\nexport interface PackageDefinition {\n /** npm package name */\n name: string;\n /** Human-readable description */\n description: string;\n /** When is this package needed? */\n condition: 'static-build' | 'dev' | 'always';\n /** Is this a dev dependency? */\n devDependency: boolean;\n /** Feature flag that enables this package */\n featureFlag?: string;\n}\n\n/**\n * Optional packages that can be auto-installed\n */\nexport const OPTIONAL_PACKAGES: PackageDefinition[] = [\n {\n name: 'compression-webpack-plugin',\n description: 'Gzip and Brotli compression for static builds',\n condition: 'static-build',\n devDependency: true,\n },\n {\n name: '@next/bundle-analyzer',\n description: 'Bundle analyzer for analyzing build output',\n condition: 'dev',\n devDependency: true,\n featureFlag: 'ANALYZE',\n },\n];\n\n/**\n * Required peer dependencies (should already be installed)\n */\nexport const PEER_DEPENDENCIES = [\n 'next',\n 'react',\n 'react-dom',\n] as const;\n\n/**\n * Get packages needed for current build context\n */\nexport function getPackagesForContext(options: {\n isStaticBuild: boolean;\n isDev: boolean;\n}): PackageDefinition[] {\n return OPTIONAL_PACKAGES.filter(pkg => {\n switch (pkg.condition) {\n case 'static-build':\n return options.isStaticBuild;\n case 'dev':\n return options.isDev;\n case 'always':\n return true;\n default:\n return false;\n }\n });\n}\n","/**\n * Package Updater\n *\n * Checks for outdated @djangocfg/* packages and offers to update them.\n */\n\nimport { spawn } from 'child_process';\nimport { createInterface } from 'readline';\nimport { createRequire } from 'module';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport consola from 'consola';\nimport Conf from 'conf';\nimport semver from 'semver';\nimport { DJANGOCFG_PACKAGES, PACKAGE_NAME } from '../constants';\nimport { isCI } from '../utils/env';\nimport { detectPackageManager } from './installer';\n\n// Updater preferences cache\nconst updaterCache = new Conf<{\n autoUpdate?: boolean;\n lastCheck?: number;\n skippedVersions?: Record<string, string>;\n}>({\n projectName: 'djangocfg-nextjs-updater',\n projectVersion: '1.0.0',\n});\n\n// Check for updates once per hour\nconst UPDATE_CHECK_COOLDOWN_MS = 60 * 60 * 1000;\n\n// Spinner frames\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport interface PackageVersion {\n name: string;\n current: string | null;\n latest: string | null;\n hasUpdate: boolean;\n}\n\nexport interface UpdateOptions {\n /** Auto-update without prompting */\n autoUpdate?: boolean;\n /** Force check even if recently checked (ignores cooldown) */\n force?: boolean;\n /** Force check even for workspace:* packages (for testing) */\n forceCheckWorkspace?: boolean;\n}\n\n/**\n * Check if package is a workspace dependency\n */\nfunction isWorkspacePackage(packageName: string): boolean {\n try {\n const fs = require('fs');\n const pkgJsonPath = join(process.cwd(), 'package.json');\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n\n const deps = { ...pkgJson.dependencies, ...pkgJson.devDependencies };\n const version = deps[packageName];\n\n return version?.startsWith('workspace:') || false;\n } catch {\n return false;\n }\n}\n\n/**\n * Get installed version of a package from consumer's project\n * Uses multiple fallback strategies for monorepo compatibility\n */\nexport function getInstalledVersion(packageName: string): string | null {\n const fs = require('fs');\n const cwd = process.cwd();\n\n // Strategy 1: Direct read from node_modules (works with symlinks)\n try {\n const directPath = join(cwd, 'node_modules', packageName, 'package.json');\n if (fs.existsSync(directPath)) {\n const pkg = JSON.parse(fs.readFileSync(directPath, 'utf-8'));\n return pkg.version || null;\n }\n } catch {\n // Continue to next strategy\n }\n\n // Strategy 2: Use createRequire from cwd\n try {\n const consumerRequire = createRequire(join(cwd, 'package.json'));\n const pkgPath = consumerRequire.resolve(`${packageName}/package.json`);\n const pkg = require(pkgPath);\n return pkg.version || null;\n } catch {\n // Continue to next strategy\n }\n\n // Strategy 3: Try global require\n try {\n const pkgPath = require.resolve(`${packageName}/package.json`);\n const pkg = require(pkgPath);\n return pkg.version || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if we should skip update checking for this package\n * (e.g., workspace packages shouldn't be checked against npm)\n */\nexport function shouldCheckUpdates(packageName: string): boolean {\n return !isWorkspacePackage(packageName);\n}\n\n/**\n * Fetch latest version from npm registry\n */\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\n try {\n const https = await import('https');\n return new Promise((resolve) => {\n const req = https.get(\n `https://registry.npmjs.org/${packageName}/latest`,\n { timeout: 5000 },\n (res: any) => {\n let data = '';\n res.on('data', (chunk: string) => { data += chunk; });\n res.on('end', () => {\n try {\n const json = JSON.parse(data);\n resolve(json.version || null);\n } catch {\n resolve(null);\n }\n });\n }\n );\n req.on('error', () => resolve(null));\n req.on('timeout', () => { req.destroy(); resolve(null); });\n });\n } catch {\n return null;\n }\n}\n\n/**\n * Check all @djangocfg packages for updates\n * All packages are aligned to the version of @djangocfg/nextjs (master package)\n * Skips workspace:* packages unless forceCheckWorkspace is true\n */\nexport async function checkForUpdates(options: { forceCheckWorkspace?: boolean } = {}): Promise<PackageVersion[]> {\n const results: PackageVersion[] = [];\n\n // First, get the latest version of master package (@djangocfg/nextjs)\n // All other packages should align to this version\n const masterLatest = await fetchLatestVersion(PACKAGE_NAME);\n if (!masterLatest) {\n // Can't determine target version, skip update check\n return results;\n }\n\n // Check packages against master version\n const checks = DJANGOCFG_PACKAGES.map(async (name) => {\n // Skip workspace packages unless force mode\n const isWorkspace = !shouldCheckUpdates(name);\n if (!options.forceCheckWorkspace && isWorkspace) {\n return null;\n }\n\n const current = getInstalledVersion(name);\n if (!current) {\n return null;\n }\n\n // All packages should update to master package version\n const hasUpdate = !!(masterLatest && current && semver.gt(masterLatest, current));\n\n return { name, current, latest: masterLatest, hasUpdate };\n });\n\n const checkResults = await Promise.all(checks);\n\n for (const result of checkResults) {\n if (result) {\n results.push(result);\n }\n }\n\n return results;\n}\n\n/**\n * Get packages that need updating\n */\nexport async function getOutdatedPackages(options: { forceCheckWorkspace?: boolean } = {}): Promise<PackageVersion[]> {\n const all = await checkForUpdates(options);\n const skipped = updaterCache.get('skippedVersions') || {};\n\n return all.filter(pkg => {\n if (!pkg.hasUpdate) return false;\n // Skip if user chose to skip this specific version\n if (skipped[pkg.name] === pkg.latest) return false;\n return true;\n });\n}\n\n/**\n * Create a simple spinner\n */\nfunction createSpinner(text: string) {\n let frameIndex = 0;\n let interval: NodeJS.Timeout | null = null;\n let currentText = text;\n\n const render = () => {\n const frame = SPINNER_FRAMES[frameIndex];\n process.stdout.write(`\\r${chalk.cyan(frame)} ${currentText}`);\n frameIndex = (frameIndex + 1) % SPINNER_FRAMES.length;\n };\n\n return {\n start() {\n if (process.stdout.isTTY) {\n interval = setInterval(render, 80);\n render();\n } else {\n console.log(` ${currentText}`);\n }\n return this;\n },\n text(newText: string) {\n currentText = newText;\n return this;\n },\n succeed(text?: string) {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write(`\\r${chalk.green('✓')} ${text || currentText}\\n`);\n } else {\n console.log(` ${chalk.green('✓')} ${text || currentText}`);\n }\n return this;\n },\n fail(text?: string) {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write(`\\r${chalk.red('✗')} ${text || currentText}\\n`);\n } else {\n console.log(` ${chalk.red('✗')} ${text || currentText}`);\n }\n return this;\n },\n stop() {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write('\\r\\x1b[K');\n }\n return this;\n },\n };\n}\n\n/**\n * Ask user for confirmation\n */\nasync function askConfirmation(question: string): Promise<boolean> {\n if (isCI || !process.stdin.isTTY) {\n return false;\n }\n\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(question, (answer) => {\n rl.close();\n const normalized = answer.toLowerCase().trim();\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\n });\n });\n}\n\n/**\n * Update a single package with progress\n */\nasync function updateSinglePackage(\n pkg: PackageVersion,\n pm: 'pnpm' | 'yarn' | 'npm',\n index: number,\n total: number\n): Promise<boolean> {\n const progress = `[${index + 1}/${total}]`;\n const versionInfo = `${chalk.red(pkg.current)} → ${chalk.green(pkg.latest)}`;\n const spinner = createSpinner(\n `${chalk.dim(progress)} Updating ${chalk.cyan(pkg.name)} ${versionInfo}`\n );\n\n spinner.start();\n\n // Always install with @latest to keep package.json consistent\n const command = pm === 'pnpm'\n ? `pnpm add ${pkg.name}@latest`\n : pm === 'yarn'\n ? `yarn add ${pkg.name}@latest`\n : `npm install ${pkg.name}@latest`;\n\n return new Promise((resolve) => {\n const proc = spawn(command, {\n shell: true,\n cwd: process.cwd(),\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n spinner.succeed(\n `${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.green(pkg.latest!)}`\n );\n resolve(true);\n } else {\n spinner.fail(\n `${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.red('failed')}`\n );\n resolve(false);\n }\n });\n\n proc.on('error', () => {\n spinner.fail(`${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.red('failed')}`);\n resolve(false);\n });\n });\n}\n\n/**\n * Update packages with progress\n */\nexport async function updatePackagesWithProgress(packages: PackageVersion[]): Promise<boolean> {\n if (packages.length === 0) return true;\n\n const pm = detectPackageManager();\n const total = packages.length;\n\n console.log('');\n console.log(chalk.bold(` Updating ${total} package${total > 1 ? 's' : ''}...`));\n console.log('');\n\n let successCount = 0;\n const failedPackages: string[] = [];\n\n for (let i = 0; i < packages.length; i++) {\n const success = await updateSinglePackage(packages[i], pm, i, total);\n if (success) {\n successCount++;\n } else {\n failedPackages.push(packages[i].name);\n }\n }\n\n console.log('');\n\n if (failedPackages.length === 0) {\n consola.success(`All ${total} packages updated successfully!`);\n return true;\n } else if (successCount > 0) {\n consola.warn(`${successCount}/${total} packages updated. Failed: ${failedPackages.join(', ')}`);\n return false;\n } else {\n consola.error(`Failed to update packages: ${failedPackages.join(', ')}`);\n return false;\n }\n}\n\n/**\n * Check and prompt for package updates\n */\nexport async function checkAndUpdatePackages(options: UpdateOptions = {}): Promise<boolean> {\n // Check cooldown\n const lastCheck = updaterCache.get('lastCheck') || 0;\n if (!options.force && (Date.now() - lastCheck) < UPDATE_CHECK_COOLDOWN_MS) {\n return true;\n }\n\n updaterCache.set('lastCheck', Date.now());\n\n // Check for updates\n const spinner = createSpinner('Checking for updates...');\n spinner.start();\n\n const outdated = await getOutdatedPackages({\n forceCheckWorkspace: options.forceCheckWorkspace,\n });\n\n spinner.stop();\n\n console.log(chalk.dim(` Found ${outdated.length} outdated package(s)`));\n\n if (outdated.length === 0) {\n console.log(chalk.green(' ✓ All packages are up to date'));\n return true;\n }\n\n // Auto-update if configured\n if (options.autoUpdate || updaterCache.get('autoUpdate')) {\n return updatePackagesWithProgress(outdated);\n }\n\n // Show outdated packages\n console.log('');\n consola.box('📦 Updates Available');\n console.log('');\n\n for (const pkg of outdated) {\n console.log(\n ` ${chalk.yellow('•')} ${chalk.bold(pkg.name)} ` +\n `${chalk.red(pkg.current)} → ${chalk.green(pkg.latest)}`\n );\n }\n console.log('');\n\n // Ask for confirmation\n const shouldUpdate = await askConfirmation(\n `${chalk.green('?')} Update these packages now? ${chalk.dim('[Y/n]')} `\n );\n\n if (shouldUpdate) {\n const success = await updatePackagesWithProgress(outdated);\n\n if (success) {\n const enableAuto = await askConfirmation(\n `${chalk.green('?')} Enable auto-update for future? ${chalk.dim('[y/N]')} `\n );\n if (enableAuto) {\n updaterCache.set('autoUpdate', true);\n consola.info('Auto-update enabled.');\n }\n }\n\n return success;\n }\n\n // User declined, ask if they want to skip these versions\n const skipVersions = await askConfirmation(\n `${chalk.green('?')} Skip these versions in future? ${chalk.dim('[y/N]')} `\n );\n\n if (skipVersions) {\n const skipped = updaterCache.get('skippedVersions') || {};\n for (const pkg of outdated) {\n if (pkg.latest) {\n skipped[pkg.name] = pkg.latest;\n }\n }\n updaterCache.set('skippedVersions', skipped);\n consola.info('Versions skipped. Will prompt again for newer versions.');\n }\n\n return false;\n}\n\n/**\n * Reset updater preferences\n */\nexport function resetUpdaterPreferences(): void {\n updaterCache.clear();\n consola.success('Updater preferences reset');\n}\n","/**\n * Compression Plugin Setup\n *\n * Adds Gzip and Brotli compression for static builds.\n */\n\nimport type { Configuration as WebpackConfig } from 'webpack';\nimport { isPackageInstalled } from '../packages/checker';\n\nexport interface CompressionPluginOptions {\n /** Enable gzip compression */\n gzip?: boolean;\n /** Enable brotli compression */\n brotli?: boolean;\n /** Minimum file size to compress (default: 8192) */\n threshold?: number;\n /** Minimum compression ratio (default: 0.8) */\n minRatio?: number;\n /** Brotli compression level (default: 8) */\n brotliLevel?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<CompressionPluginOptions> = {\n gzip: true,\n brotli: true,\n threshold: 8192,\n minRatio: 0.8,\n brotliLevel: 8,\n};\n\n/**\n * Add compression plugins to webpack config\n *\n * Returns true if plugins were added, false if compression-webpack-plugin is not installed\n */\nexport function addCompressionPlugins(\n config: WebpackConfig,\n options: CompressionPluginOptions = {}\n): boolean {\n // Check if compression-webpack-plugin is installed\n if (!isPackageInstalled('compression-webpack-plugin')) {\n return false;\n }\n\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n try {\n // Dynamic import to avoid bundling if not installed\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const CompressionPlugin = require('compression-webpack-plugin');\n\n if (!config.plugins) {\n config.plugins = [];\n }\n\n // Gzip compression\n if (opts.gzip) {\n config.plugins.push(\n new CompressionPlugin({\n filename: '[path][base].gz',\n algorithm: 'gzip',\n test: /\\.(js|css|html|svg|json)$/,\n threshold: opts.threshold,\n minRatio: opts.minRatio,\n })\n );\n }\n\n // Brotli compression\n if (opts.brotli) {\n config.plugins.push(\n new CompressionPlugin({\n filename: '[path][base].br',\n algorithm: 'brotliCompress',\n test: /\\.(js|css|html|svg|json)$/,\n threshold: opts.threshold,\n minRatio: opts.minRatio,\n compressionOptions: {\n level: opts.brotliLevel,\n },\n })\n );\n }\n\n return true;\n } catch (error) {\n // compression-webpack-plugin failed to load\n return false;\n }\n}\n\n/**\n * Check if compression is available\n */\nexport function isCompressionAvailable(): boolean {\n return isPackageInstalled('compression-webpack-plugin');\n}\n","/**\n * Base Next.js Configuration Factory\n *\n * Universal, reusable Next.js config for all DjangoCFG projects\n * Provides standard settings that can be extended per project\n *\n * @example\n * ```typescript\n * // In your project's next.config.ts\n * import { createBaseNextConfig } from '@djangocfg/nextjs/config';\n * import bundleAnalyzer from '@next/bundle-analyzer';\n *\n * const withBundleAnalyzer = bundleAnalyzer({\n * enabled: process.env.ANALYZE === 'true',\n * });\n *\n * export default withBundleAnalyzer(createBaseNextConfig({\n * // Your project-specific overrides\n * transpilePackages: ['my-custom-package'],\n * }));\n * ```\n */\n\nimport type { NextConfig } from 'next';\nimport type { Configuration as WebpackConfig } from 'webpack';\n\nimport { DEFAULT_TRANSPILE_PACKAGES, DEFAULT_OPTIMIZE_PACKAGES } from './constants';\nimport { deepMerge } from './utils/deepMerge';\nimport { isStaticBuild, isDev, getBasePath, getApiUrl, getSiteUrl } from './utils/env';\nimport { DevStartupPlugin } from './plugins/devStartup';\nimport { addCompressionPlugins } from './plugins/compression';\n\n// ─────────────────────────────────────────────────────────────────────────\n// Configuration Options\n// ─────────────────────────────────────────────────────────────────────────\n\nexport interface BaseNextConfigOptions {\n /** Static build path (used when NEXT_PUBLIC_STATIC_BUILD=true) */\n isDefaultCfgAdmin?: boolean;\n /** Additional transpile packages (merged with defaults) */\n transpilePackages?: string[];\n /** Additional optimize package imports (merged with defaults) */\n optimizePackageImports?: string[];\n /** Automatically open browser in dev mode (default: false) */\n openBrowser?: boolean;\n /** Check for @djangocfg/* package updates on startup (default: true) */\n checkUpdates?: boolean;\n /** Auto-update outdated packages without prompting (default: false) */\n autoUpdate?: boolean;\n /** Force check workspace:* packages for updates (for testing in monorepo) */\n forceCheckWorkspace?: boolean;\n /** Check for missing optional packages on startup (default: true) */\n checkPackages?: boolean;\n /** Auto-install missing packages without prompting (default: false) */\n autoInstall?: boolean;\n /**\n * Allow embedding this app in iframe from specified origins\n * Set to ['*'] to allow all origins, or specify domains like ['https://djangocfg.com']\n */\n allowIframeFrom?: string[];\n /** Custom webpack configuration function (called after base webpack logic) */\n webpack?: (\n config: WebpackConfig,\n options: { isServer: boolean; dev: boolean; [key: string]: any }\n ) => WebpackConfig | void;\n /** Custom experimental options (merged with defaults) */\n experimental?: NextConfig['experimental'];\n /** Custom env variables (merged with defaults) */\n env?: Record<string, string | undefined>;\n /** Override any Next.js config option */\n [key: string]: any;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Base Configuration Factory\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Create base Next.js configuration with standard DjangoCFG settings\n *\n * @param options - Custom configuration options to merge with base config\n * @returns Next.js configuration function\n */\nexport function createBaseNextConfig(\n options: BaseNextConfigOptions = {}\n): NextConfig {\n\n const basePath = getBasePath(options.isDefaultCfgAdmin);\n const apiUrl = getApiUrl();\n const siteUrl = getSiteUrl();\n\n // Base configuration\n const baseConfig: NextConfig = {\n reactStrictMode: true,\n trailingSlash: true,\n\n // Static export configuration\n ...(isStaticBuild && {\n output: 'export' as const,\n distDir: 'out',\n basePath: basePath,\n // Fix for Next.js 15.5.4: prevent 500.html generation issue\n generateBuildId: async () => {\n return 'static-build';\n },\n }),\n\n // Standalone output for Docker (only in production, not dev)\n ...(!isStaticBuild && !isDev && {\n output: 'standalone' as const,\n }),\n\n // Environment variables\n env: {\n NEXT_PUBLIC_BASE_PATH: basePath,\n NEXT_PUBLIC_API_URL: apiUrl,\n NEXT_PUBLIC_SITE_URL: siteUrl,\n // Disable Next.js telemetry (Next.js 15+ uses env var instead of config option)\n NEXT_TELEMETRY_DISABLED: '1',\n ...options.env,\n },\n\n // Images configuration\n images: {\n unoptimized: true,\n },\n\n // CORS headers for static files and iframe embedding\n async headers() {\n const headers: { source: string; headers: { key: string; value: string }[] }[] = [\n {\n source: '/static/:path*',\n headers: [\n { key: 'Access-Control-Allow-Origin', value: '*' },\n { key: 'Access-Control-Allow-Methods', value: 'GET, OPTIONS' },\n { key: 'Access-Control-Allow-Headers', value: 'Origin, Content-Type, Accept' },\n ],\n },\n ];\n\n // Add iframe embedding headers if allowIframeFrom is specified\n if (options.allowIframeFrom && options.allowIframeFrom.length > 0) {\n const frameAncestors = options.allowIframeFrom.includes('*')\n ? '*'\n : `'self' ${options.allowIframeFrom.join(' ')}`;\n\n headers.push({\n source: '/:path*',\n headers: [\n // Content-Security-Policy frame-ancestors directive\n { key: 'Content-Security-Policy', value: `frame-ancestors ${frameAncestors}` },\n // X-Frame-Options for older browsers (ALLOW-FROM is deprecated, use CSP instead)\n // Only set SAMEORIGIN if allowing all, otherwise browsers will use CSP\n ...(options.allowIframeFrom.includes('*')\n ? []\n : [{ key: 'X-Frame-Options', value: 'SAMEORIGIN' }]\n ),\n ],\n });\n }\n\n return headers;\n },\n\n // Transpile packages (merge with user-provided)\n transpilePackages: [\n ...DEFAULT_TRANSPILE_PACKAGES,\n ...(options.transpilePackages || []),\n ],\n\n // Experimental features\n experimental: {\n // Optimize package imports (only in production)\n ...(!isDev && {\n optimizePackageImports: [\n ...DEFAULT_OPTIMIZE_PACKAGES,\n ...(options.optimizePackageImports || []),\n ],\n }),\n // Dev mode optimizations\n ...(isDev && {\n optimizeCss: false,\n }),\n // User experimental options applied last (can override base settings)\n ...options.experimental,\n },\n\n // Webpack configuration\n webpack: (config: WebpackConfig, webpackOptions: { isServer: boolean; dev: boolean; [key: string]: any }) => {\n const { isServer, dev } = webpackOptions;\n\n // Add dev startup plugin (client-side only in dev)\n if (dev && !isServer) {\n if (!config.plugins) {\n config.plugins = [];\n }\n config.plugins.push(\n new DevStartupPlugin({\n openBrowser: options.openBrowser,\n checkUpdates: options.checkUpdates,\n autoUpdate: options.autoUpdate,\n forceCheckWorkspace: options.forceCheckWorkspace,\n checkPackages: options.checkPackages,\n autoInstall: options.autoInstall,\n })\n );\n }\n\n // Dev mode optimizations\n if (dev) {\n config.optimization = {\n ...config.optimization,\n removeAvailableModules: false,\n removeEmptyChunks: false,\n splitChunks: false, // Disable code splitting in dev for faster compilation\n };\n }\n\n // Filesystem cache (dev and production)\n config.cache = {\n type: 'filesystem',\n buildDependencies: {},\n };\n\n // Compression plugins (only for static build in production, client-side)\n if (!isServer && isStaticBuild && !dev) {\n addCompressionPlugins(config);\n }\n\n // Call user's webpack function if provided\n if (options.webpack) {\n return options.webpack(config, webpackOptions);\n }\n\n return config;\n },\n };\n\n // Deep merge user options with base config\n const finalConfig = deepMerge(baseConfig, options);\n\n // Cleanup: Remove custom options that are not part of NextConfig\n delete (finalConfig as any).optimizePackageImports;\n delete (finalConfig as any).isDefaultCfgAdmin;\n delete (finalConfig as any).openBrowser;\n delete (finalConfig as any).checkUpdates;\n delete (finalConfig as any).autoUpdate;\n delete (finalConfig as any).forceCheckWorkspace;\n delete (finalConfig as any).checkPackages;\n delete (finalConfig as any).autoInstall;\n delete (finalConfig as any).allowIframeFrom;\n\n return finalConfig;\n}\n"],"mappings":"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","names":["chalk","chalk","consola","Conf","Conf","isDev","chalk","text","consola","spawn","createInterface","createRequire","join","chalk","consola","Conf","semver","Conf","SPINNER_FRAMES","join","createRequire","fetchLatestVersion","semver","createSpinner","chalk","text","askConfirmation","createInterface","spawn","consola","chalk"]}
1
+ {"version":3,"sources":["../../package.json","../../src/config/constants.ts","../../src/config/utils/deepMerge.ts","../../src/config/utils/env.ts","../../src/config/plugins/devStartup.ts","../../src/ai/constants.ts","../../src/config/utils/version.ts","../../src/config/packages/installer.ts","../../src/config/packages/checker.ts","../../src/config/packages/definitions.ts","../../src/config/packages/updater.ts","../../src/config/plugins/compression.ts","../../src/config/createNextConfig.ts"],"sourcesContent":["{\n \"name\": \"@djangocfg/nextjs\",\n \"version\": \"2.1.30\",\n \"description\": \"Next.js server utilities: sitemap, health, OG images, contact forms, navigation, config\",\n \"keywords\": [\n \"nextjs\",\n \"sitemap\",\n \"health\",\n \"og-image\",\n \"navigation\",\n \"config\",\n \"react\",\n \"typescript\"\n ],\n \"author\": {\n \"name\": \"DjangoCFG\",\n \"url\": \"https://djangocfg.com\"\n },\n \"homepage\": \"https://djangocfg.com\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/markolofsen/django-cfg.git\",\n \"directory\": \"packages/nextjs\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/markolofsen/django-cfg/issues\"\n },\n \"license\": \"MIT\",\n \"main\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.mts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.mts\",\n \"import\": \"./dist/index.mjs\",\n \"default\": \"./dist/index.mjs\"\n },\n \"./sitemap\": {\n \"types\": \"./dist/sitemap/index.d.mts\",\n \"import\": \"./dist/sitemap/index.mjs\",\n \"default\": \"./dist/sitemap/index.mjs\"\n },\n \"./health\": {\n \"types\": \"./dist/health/index.d.mts\",\n \"import\": \"./dist/health/index.mjs\",\n \"default\": \"./dist/health/index.mjs\"\n },\n \"./og-image\": {\n \"types\": \"./dist/og-image/index.d.mts\",\n \"import\": \"./dist/og-image/index.mjs\",\n \"default\": \"./dist/og-image/index.mjs\"\n },\n \"./og-image/utils\": {\n \"types\": \"./dist/og-image/utils/index.d.mts\",\n \"import\": \"./dist/og-image/utils/index.mjs\",\n \"default\": \"./dist/og-image/utils/index.mjs\"\n },\n \"./og-image/components\": {\n \"types\": \"./dist/og-image/components/index.d.mts\",\n \"import\": \"./dist/og-image/components/index.mjs\",\n \"default\": \"./dist/og-image/components/index.mjs\"\n },\n \"./navigation\": {\n \"types\": \"./dist/navigation/index.d.mts\",\n \"import\": \"./dist/navigation/index.mjs\",\n \"default\": \"./dist/navigation/index.mjs\"\n },\n \"./config\": {\n \"types\": \"./dist/config/index.d.mts\",\n \"import\": \"./dist/config/index.mjs\",\n \"default\": \"./dist/config/index.mjs\"\n },\n \"./ai\": {\n \"types\": \"./dist/ai/index.d.mts\",\n \"import\": \"./dist/ai/index.mjs\",\n \"default\": \"./dist/ai/index.mjs\"\n },\n \"./scripts\": {\n \"types\": \"./dist/scripts/index.d.mts\",\n \"import\": \"./dist/scripts/index.mjs\",\n \"default\": \"./dist/scripts/index.mjs\"\n }\n },\n \"files\": [\n \"dist\",\n \"src\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"bin\": {\n \"djangocfg-docs\": \"./dist/ai/cli.mjs\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"clean\": \"rm -rf dist\",\n \"lint\": \"eslint .\",\n \"check\": \"tsc --noEmit\",\n \"check-links\": \"tsx src/scripts/check-links.ts\",\n \"ai-docs\": \"tsx src/ai/cli.ts\"\n },\n \"peerDependencies\": {\n \"next\": \"^15.5.9\"\n },\n \"devDependencies\": {\n \"@djangocfg/imgai\": \"workspace:*\",\n \"@djangocfg/layouts\": \"workspace:*\",\n \"@djangocfg/typescript-config\": \"workspace:*\",\n \"@types/node\": \"^24.7.2\",\n \"@types/react\": \"19.2.2\",\n \"@types/react-dom\": \"19.2.1\",\n \"@types/semver\": \"^7.7.1\",\n \"@types/webpack\": \"^5.28.5\",\n \"@vercel/og\": \"^0.8.5\",\n \"eslint\": \"^9.37.0\",\n \"linkinator\": \"^7.5.0\",\n \"lucide-react\": \"^0.545.0\",\n \"picocolors\": \"^1.1.1\",\n \"prompts\": \"^2.4.2\",\n \"tsup\": \"^8.0.1\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"^5.9.3\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.3.0\",\n \"conf\": \"^15.0.2\",\n \"consola\": \"^3.4.2\",\n \"semver\": \"^7.7.3\"\n }\n}","/**\n * Shared Constants for DjangoCFG Next.js Configuration\n */\n\n// Package name for version checks\nexport const PACKAGE_NAME = '@djangocfg/nextjs';\n\n// Version cache TTL (1 hour)\nexport const VERSION_CACHE_TTL_MS = 60 * 60 * 1000;\n\n// ASCII Art Banner for Django CFG\nexport const DJANGO_CFG_BANNER = `\n██████╗ ██╗ █████╗ ███╗ ██╗ ██████╗ ██████╗ ██████╗███████╗ ██████╗\n██╔══██╗ ██║██╔══██╗████╗ ██║██╔════╝ ██╔═══██╗ ██╔════╝██╔════╝██╔════╝\n██║ ██║ ██║███████║██╔██╗ ██║██║ ███╗██║ ██║ ██║ █████╗ ██║ ███╗\n██║ ██║██ ██║██╔══██║██║╚██╗██║██║ ██║██║ ██║ ██║ ██╔══╝ ██║ ██║\n██████╔╝╚█████╔╝██║ ██║██║ ╚████║╚██████╔╝╚██████╔╝ ╚██████╗██║ ╚██████╔╝\n╚═════╝ ╚════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝╚═╝ ╚═════╝\n`;\n\n// All @djangocfg packages that can be updated together\nexport const DJANGOCFG_PACKAGES = [\n '@djangocfg/ui-core',\n '@djangocfg/ui-nextjs',\n '@djangocfg/layouts',\n '@djangocfg/nextjs',\n '@djangocfg/api',\n '@djangocfg/centrifugo',\n '@djangocfg/eslint-config',\n '@djangocfg/typescript-config',\n] as const;\n\n// Default packages to transpile\nexport const DEFAULT_TRANSPILE_PACKAGES = [\n '@djangocfg/ui-core',\n '@djangocfg/ui-nextjs',\n '@djangocfg/layouts',\n '@djangocfg/api',\n '@djangocfg/centrifugo',\n] as const;\n\n// Default packages to optimize imports\nexport const DEFAULT_OPTIMIZE_PACKAGES = [\n '@djangocfg/ui-core',\n '@djangocfg/ui-nextjs',\n '@djangocfg/layouts',\n 'lucide-react',\n 'recharts',\n] as const;\n","/**\n * Deep Merge Utility\n *\n * Recursively merges objects, replacing arrays instead of merging them.\n */\n\nexport function deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const output = { ...target };\n\n for (const key in source) {\n if (source[key] === undefined) continue;\n\n // Arrays: replace (don't merge arrays)\n if (Array.isArray(source[key])) {\n output[key] = source[key] as any;\n }\n // Objects: deep merge\n else if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n const targetValue = output[key];\n if (targetValue && typeof targetValue === 'object' && !Array.isArray(targetValue)) {\n output[key] = deepMerge(targetValue, source[key] as any);\n } else {\n output[key] = source[key] as any;\n }\n }\n // Primitives: replace\n else {\n output[key] = source[key] as any;\n }\n }\n\n return output;\n}\n","/**\n * Environment Variable Utilities\n */\n\nexport const isStaticBuild = process.env.NEXT_PUBLIC_STATIC_BUILD === 'true';\nexport const isDev = process.env.NODE_ENV === 'development';\nexport const isProduction = process.env.NODE_ENV === 'production';\nexport const isCI = process.env.CI === 'true';\n\n/**\n * Get base path for static builds\n */\nexport function getBasePath(isDefaultCfgAdmin?: boolean): string {\n if (!isStaticBuild) return '';\n return isDefaultCfgAdmin ? '/cfg/admin' : '/cfg/nextjs-admin';\n}\n\n/**\n * Get API URL (empty for static builds)\n */\nexport function getApiUrl(): string {\n return isStaticBuild ? '' : (process.env.NEXT_PUBLIC_API_URL || '');\n}\n\n/**\n * Get Site URL (empty for static builds)\n */\nexport function getSiteUrl(): string {\n return isStaticBuild ? '' : (process.env.NEXT_PUBLIC_SITE_URL || '');\n}\n","/**\n * Dev Startup Webpack Plugin\n *\n * Handles banner display, version checking, package updates, and browser auto-open.\n */\n\nimport type { Compiler } from 'webpack';\nimport chalk from 'chalk';\nimport { DJANGO_CFG_BANNER } from '../constants';\nimport { AI_DOCS_HINT } from '../../ai/constants';\nimport { getCurrentVersion } from '../utils/version';\nimport { checkAndInstallPackages } from '../packages/installer';\nimport { checkAndUpdatePackages } from '../packages/updater';\n\n// Track if startup tasks were already run (persists across HMR)\nlet startupDone = false;\nlet browserOpened = false;\n\nexport interface DevStartupPluginOptions {\n /** Auto-open browser */\n openBrowser?: boolean;\n /** Check for missing optional packages (default: true) */\n checkPackages?: boolean;\n /** Auto-install missing packages without prompting */\n autoInstall?: boolean;\n /** Check for @djangocfg/* package updates (default: true) */\n checkUpdates?: boolean;\n /** Auto-update packages without prompting */\n autoUpdate?: boolean;\n /** Force check workspace:* packages (for testing in monorepo) */\n forceCheckWorkspace?: boolean;\n}\n\n/**\n * Webpack plugin for dev startup tasks\n */\nexport class DevStartupPlugin {\n private options: DevStartupPluginOptions;\n\n constructor(options: DevStartupPluginOptions = {}) {\n this.options = options;\n }\n\n apply(compiler: Compiler): void {\n // Use tapPromise for proper async handling\n compiler.hooks.done.tapPromise('DevStartupPlugin', async () => {\n // Run startup tasks only once\n if (!startupDone) {\n startupDone = true;\n await this.runStartupTasks();\n }\n\n // Auto-open browser if enabled\n if (this.options.openBrowser && !browserOpened) {\n browserOpened = true;\n this.openBrowser();\n }\n });\n }\n\n private async runStartupTasks(): Promise<void> {\n // 1. Print banner\n console.log('\\n' + chalk.yellowBright.bold(DJANGO_CFG_BANNER));\n\n // 2. Print current version\n const version = getCurrentVersion();\n if (version) {\n console.log(chalk.dim(` 📦 @djangocfg/nextjs v${version}`));\n }\n\n // 3. Print AI docs hint\n console.log(chalk.magenta(` ${AI_DOCS_HINT}\\n`));\n\n // 4. Check for package updates\n if (this.options.checkUpdates !== false) {\n try {\n await checkAndUpdatePackages({\n autoUpdate: this.options.autoUpdate,\n forceCheckWorkspace: this.options.forceCheckWorkspace,\n force: true, // Force check ignoring cooldown\n });\n } catch (err) {\n console.log(chalk.red(' Update check failed:'), err);\n }\n }\n\n // 5. Check for missing optional packages\n if (this.options.checkPackages !== false) {\n await checkAndInstallPackages({\n autoInstall: this.options.autoInstall,\n });\n }\n }\n\n private openBrowser(): void {\n // Delay to ensure server is ready\n setTimeout(async () => {\n try {\n const { exec } = await import('child_process');\n const port = process.env.PORT || '3000';\n const url = `http://localhost:${port}`;\n\n const command = process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'start'\n : 'xdg-open';\n\n exec(`${command} ${url}`, (error) => {\n if (error) {\n console.warn(`Failed to open browser: ${error.message}`);\n }\n });\n } catch (error) {\n console.warn('Failed to open browser');\n }\n }, 2000);\n }\n}\n\n/**\n * Reset plugin state (useful for tests)\n */\nexport function resetDevStartupState(): void {\n startupDone = false;\n browserOpened = false;\n}\n","/**\n * AI Documentation Constants\n */\n\n// MCP Server URLs\nexport const MCP_BASE_URL = 'https://mcp.djangocfg.com';\nexport const MCP_SERVER_URL = `${MCP_BASE_URL}/mcp`;\nexport const MCP_API_URL = `${MCP_BASE_URL}/api/search`;\n\n// API Endpoints\nexport const API_SEARCH_ENDPOINT = '/api/search';\nexport const API_INFO_ENDPOINT = '/api/info';\nexport const DEFAULT_TIMEOUT = 10000; // ms\n\n// AI Hint for console output\nexport const AI_DOCS_HINT = `🤖 AI Docs: ${MCP_SERVER_URL} | pnpm ai-docs search \"query\"`;\n\n// Full AI Hint description\nexport const AI_HINT = `\nDjangoCFG Documentation is available via MCP server.\n\nTo get help with DjangoCFG configuration:\n1. Use the MCP server: ${MCP_SERVER_URL}\n2. Or search directly: ${MCP_API_URL}?q=YOUR_QUERY&limit=5\n\nExample queries:\n- \"How to configure PostgreSQL database?\"\n- \"What is DatabaseConfig?\"\n- \"How to setup Redis cache?\"\n- \"Email configuration with SMTP\"\n`;\n","/**\n * Version Checking Utilities\n */\n\nimport chalk from 'chalk';\nimport semver from 'semver';\nimport consola from 'consola';\nimport Conf from 'conf';\nimport { PACKAGE_NAME, VERSION_CACHE_TTL_MS, DJANGOCFG_PACKAGES } from '../constants';\n\n// Version cache using conf (stores in ~/.config/djangocfg-nextjs/)\nconst versionCache = new Conf<{\n latestVersion?: string;\n lastCheck?: number;\n}>({\n projectName: 'djangocfg-nextjs',\n projectVersion: '1.0.0',\n});\n\n/**\n * Get current package version from package.json\n */\nexport function getCurrentVersion(): string | null {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const packageJson = require('../../../package.json');\n return packageJson.version || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch latest version from npm registry (with 1 hour caching via conf)\n */\nexport async function fetchLatestVersion(): Promise<string | null> {\n // Check cache first\n const lastCheck = versionCache.get('lastCheck') || 0;\n const cachedVersion = versionCache.get('latestVersion');\n\n if (cachedVersion && (Date.now() - lastCheck) < VERSION_CACHE_TTL_MS) {\n return cachedVersion;\n }\n\n // Fetch from npm registry\n try {\n const https = await import('https');\n return new Promise((resolve) => {\n const req = https.get(\n `https://registry.npmjs.org/${PACKAGE_NAME}/latest`,\n { timeout: 5000 },\n (res: any) => {\n let data = '';\n res.on('data', (chunk: string) => { data += chunk; });\n res.on('end', () => {\n try {\n const json = JSON.parse(data);\n const version = json.version || null;\n if (version) {\n versionCache.set('latestVersion', version);\n versionCache.set('lastCheck', Date.now());\n }\n resolve(version);\n } catch {\n resolve(cachedVersion || null);\n }\n });\n }\n );\n req.on('error', () => resolve(cachedVersion || null));\n req.on('timeout', () => { req.destroy(); resolve(cachedVersion || null); });\n });\n } catch {\n return cachedVersion || null;\n }\n}\n\n/**\n * Check if update is available\n */\nexport async function checkForUpdate(): Promise<{\n hasUpdate: boolean;\n currentVersion: string | null;\n latestVersion: string | null;\n}> {\n const currentVersion = getCurrentVersion();\n if (!currentVersion) {\n return { hasUpdate: false, currentVersion: null, latestVersion: null };\n }\n\n const latestVersion = await fetchLatestVersion();\n const hasUpdate = !!(latestVersion && semver.gt(latestVersion, currentVersion));\n\n return { hasUpdate, currentVersion, latestVersion };\n}\n\n/**\n * Get update command for all djangocfg packages\n */\nexport function getUpdateCommand(): string {\n return `pnpm add ${DJANGOCFG_PACKAGES.map(p => `${p}@latest`).join(' ')}`;\n}\n\n/**\n * Print version info and update notification\n */\nexport async function printVersionInfo(): Promise<void> {\n const { hasUpdate, currentVersion, latestVersion } = await checkForUpdate();\n\n if (!currentVersion) return;\n\n // Print current version\n consola.box(`📦 @djangocfg/nextjs v${currentVersion}`);\n\n // Show update notification if available\n if (hasUpdate && latestVersion) {\n consola.warn(`Update Available! ${chalk.red(currentVersion)} → ${chalk.green(latestVersion)}`);\n consola.info(`Run: ${chalk.cyan(getUpdateCommand())}`);\n console.log('');\n }\n}\n","/**\n * Package Installer\n *\n * Provides auto-installation functionality with user confirmation and progress indication.\n */\n\nimport { execSync, spawn } from 'child_process';\nimport { createInterface } from 'readline';\nimport chalk from 'chalk';\nimport consola from 'consola';\nimport Conf from 'conf';\nimport type { MissingPackage } from './checker';\nimport { getMissingPackages } from './checker';\nimport { isCI } from '../utils/env';\n\n// Installer preferences cache\nconst installerCache = new Conf<{\n autoInstall?: boolean;\n skipPackages?: string[];\n lastPrompt?: number;\n}>({\n projectName: 'djangocfg-nextjs-installer',\n projectVersion: '1.0.0',\n});\n\n// Don't prompt more than once per hour\nconst PROMPT_COOLDOWN_MS = 60 * 60 * 1000;\n\n// Spinner frames for progress\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport interface InstallOptions {\n /** Auto-install without prompting */\n autoInstall?: boolean;\n /** Skip specific packages */\n skipPackages?: string[];\n /** Force prompt even if recently prompted */\n force?: boolean;\n}\n\nexport interface InstallProgress {\n current: number;\n total: number;\n package: string;\n status: 'pending' | 'installing' | 'done' | 'error';\n}\n\n/**\n * Detect package manager\n */\nexport function detectPackageManager(): 'pnpm' | 'yarn' | 'npm' {\n try {\n // Check for lockfiles\n const fs = require('fs');\n const path = require('path');\n const cwd = process.cwd();\n\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (fs.existsSync(path.join(cwd, 'yarn.lock'))) return 'yarn';\n if (fs.existsSync(path.join(cwd, 'package-lock.json'))) return 'npm';\n\n // Check for global package manager\n try {\n execSync('pnpm --version', { stdio: 'ignore' });\n return 'pnpm';\n } catch {\n try {\n execSync('yarn --version', { stdio: 'ignore' });\n return 'yarn';\n } catch {\n return 'npm';\n }\n }\n } catch {\n return 'npm';\n }\n}\n\n/**\n * Build install command for a single package\n */\nexport function buildSingleInstallCommand(\n packageName: string,\n isDev: boolean,\n pm: 'pnpm' | 'yarn' | 'npm'\n): string {\n const devFlag = isDev ? '-D ' : '';\n switch (pm) {\n case 'pnpm':\n return `pnpm add ${devFlag}${packageName}`;\n case 'yarn':\n return `yarn add ${devFlag}${packageName}`;\n case 'npm':\n return `npm install ${devFlag}${packageName}`;\n }\n}\n\n/**\n * Build install command for multiple packages (for display)\n */\nexport function buildInstallCommand(packages: MissingPackage[], pm: 'pnpm' | 'yarn' | 'npm'): string {\n const devPackages = packages.filter(p => p.devDependency).map(p => p.name);\n const prodPackages = packages.filter(p => !p.devDependency).map(p => p.name);\n\n const commands: string[] = [];\n\n if (devPackages.length > 0) {\n switch (pm) {\n case 'pnpm':\n commands.push(`pnpm add -D ${devPackages.join(' ')}`);\n break;\n case 'yarn':\n commands.push(`yarn add -D ${devPackages.join(' ')}`);\n break;\n case 'npm':\n commands.push(`npm install -D ${devPackages.join(' ')}`);\n break;\n }\n }\n\n if (prodPackages.length > 0) {\n switch (pm) {\n case 'pnpm':\n commands.push(`pnpm add ${prodPackages.join(' ')}`);\n break;\n case 'yarn':\n commands.push(`yarn add ${prodPackages.join(' ')}`);\n break;\n case 'npm':\n commands.push(`npm install ${prodPackages.join(' ')}`);\n break;\n }\n }\n\n return commands.join(' && ');\n}\n\n/**\n * Ask user for confirmation via readline\n */\nasync function askConfirmation(question: string): Promise<boolean> {\n // Skip prompt in CI or non-TTY environments\n if (isCI || !process.stdin.isTTY) {\n return false;\n }\n\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(question, (answer) => {\n rl.close();\n const normalized = answer.toLowerCase().trim();\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\n });\n });\n}\n\n/**\n * Create a simple spinner\n */\nfunction createSpinner(text: string) {\n let frameIndex = 0;\n let interval: NodeJS.Timeout | null = null;\n let currentText = text;\n\n const render = () => {\n const frame = SPINNER_FRAMES[frameIndex];\n process.stdout.write(`\\r${chalk.cyan(frame)} ${currentText}`);\n frameIndex = (frameIndex + 1) % SPINNER_FRAMES.length;\n };\n\n return {\n start() {\n if (process.stdout.isTTY) {\n interval = setInterval(render, 80);\n render();\n } else {\n console.log(` ${currentText}`);\n }\n return this;\n },\n text(newText: string) {\n currentText = newText;\n if (!process.stdout.isTTY) {\n console.log(` ${newText}`);\n }\n return this;\n },\n succeed(text?: string) {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write(`\\r${chalk.green('✓')} ${text || currentText}\\n`);\n } else {\n console.log(` ${chalk.green('✓')} ${text || currentText}`);\n }\n return this;\n },\n fail(text?: string) {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write(`\\r${chalk.red('✗')} ${text || currentText}\\n`);\n } else {\n console.log(` ${chalk.red('✗')} ${text || currentText}`);\n }\n return this;\n },\n stop() {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write('\\r\\x1b[K'); // Clear line\n }\n return this;\n },\n };\n}\n\n/**\n * Install a single package with progress\n */\nasync function installSinglePackage(\n pkg: MissingPackage,\n pm: 'pnpm' | 'yarn' | 'npm',\n index: number,\n total: number\n): Promise<boolean> {\n const command = buildSingleInstallCommand(pkg.name, pkg.devDependency, pm);\n const progress = `[${index + 1}/${total}]`;\n const spinner = createSpinner(`${chalk.dim(progress)} Installing ${chalk.cyan(pkg.name)}...`);\n\n spinner.start();\n\n return new Promise((resolve) => {\n const [cmd, ...args] = command.split(' ');\n const proc = spawn(cmd, args, {\n shell: true,\n cwd: process.cwd(),\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let stderr = '';\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n spinner.succeed(`${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.green('installed')}`);\n resolve(true);\n } else {\n spinner.fail(`${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.red('failed')}`);\n if (stderr) {\n console.log(chalk.dim(` ${stderr.split('\\n')[0]}`));\n }\n resolve(false);\n }\n });\n\n proc.on('error', () => {\n spinner.fail(`${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.red('failed')}`);\n resolve(false);\n });\n });\n}\n\n/**\n * Install packages with progress indication\n */\nexport async function installPackagesWithProgress(packages: MissingPackage[]): Promise<boolean> {\n if (packages.length === 0) return true;\n\n const pm = detectPackageManager();\n const total = packages.length;\n\n console.log('');\n console.log(chalk.bold(` Installing ${total} package${total > 1 ? 's' : ''}...`));\n console.log('');\n\n let successCount = 0;\n let failedPackages: string[] = [];\n\n for (let i = 0; i < packages.length; i++) {\n const success = await installSinglePackage(packages[i], pm, i, total);\n if (success) {\n successCount++;\n } else {\n failedPackages.push(packages[i].name);\n }\n }\n\n console.log('');\n\n if (failedPackages.length === 0) {\n consola.success(`All ${total} packages installed successfully!`);\n return true;\n } else if (successCount > 0) {\n consola.warn(`${successCount}/${total} packages installed. Failed: ${failedPackages.join(', ')}`);\n return false;\n } else {\n consola.error(`Failed to install packages: ${failedPackages.join(', ')}`);\n return false;\n }\n}\n\n/**\n * Install packages (simple version without per-package progress)\n */\nexport async function installPackages(packages: MissingPackage[]): Promise<boolean> {\n // Use progress version for multiple packages in TTY\n if (packages.length > 1 && process.stdout.isTTY) {\n return installPackagesWithProgress(packages);\n }\n\n // Simple installation for single package or non-TTY\n if (packages.length === 0) return true;\n\n const pm = detectPackageManager();\n const command = buildInstallCommand(packages, pm);\n\n consola.info(`Installing: ${chalk.cyan(packages.map(p => p.name).join(', '))}`);\n\n const spinner = createSpinner('Installing packages...');\n spinner.start();\n\n return new Promise((resolve) => {\n const proc = spawn(command, {\n shell: true,\n cwd: process.cwd(),\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n spinner.succeed('Packages installed successfully!');\n resolve(true);\n } else {\n spinner.fail('Failed to install packages');\n resolve(false);\n }\n });\n\n proc.on('error', () => {\n spinner.fail('Installation failed');\n resolve(false);\n });\n });\n}\n\n/**\n * Check and prompt for missing packages\n *\n * Returns true if all packages are available (either already installed or just installed)\n */\nexport async function checkAndInstallPackages(options: InstallOptions = {}): Promise<boolean> {\n const missing = getMissingPackages();\n\n // Filter out skipped packages\n const skipList = options.skipPackages || installerCache.get('skipPackages') || [];\n const toInstall = missing.filter(p => !skipList.includes(p.name));\n\n if (toInstall.length === 0) {\n return true;\n }\n\n // Check cooldown (don't prompt too often)\n const lastPrompt = installerCache.get('lastPrompt') || 0;\n if (!options.force && (Date.now() - lastPrompt) < PROMPT_COOLDOWN_MS) {\n // Show info but don't prompt\n printMissingPackagesInfo(toInstall);\n return false;\n }\n\n // Auto-install if configured\n if (options.autoInstall || installerCache.get('autoInstall')) {\n return installPackages(toInstall);\n }\n\n // Show missing packages\n console.log('');\n consola.box('📦 Missing Optional Packages');\n console.log('');\n\n for (const pkg of toInstall) {\n console.log(` ${chalk.yellow('•')} ${chalk.bold(pkg.name)}`);\n console.log(` ${chalk.dim(pkg.description)}`);\n console.log(` ${chalk.dim(pkg.reason)}`);\n console.log('');\n }\n\n // Build install command for display\n const pm = detectPackageManager();\n const command = buildInstallCommand(toInstall, pm);\n\n console.log(` ${chalk.cyan('Command:')} ${command}`);\n console.log('');\n\n // Ask for confirmation\n installerCache.set('lastPrompt', Date.now());\n\n const shouldInstall = await askConfirmation(\n `${chalk.green('?')} Install these packages now? ${chalk.dim('[Y/n]')} `\n );\n\n if (shouldInstall) {\n const success = await installPackages(toInstall);\n\n // Ask if user wants to enable auto-install for future\n if (success) {\n const enableAuto = await askConfirmation(\n `${chalk.green('?')} Enable auto-install for future? ${chalk.dim('[y/N]')} `\n );\n if (enableAuto) {\n installerCache.set('autoInstall', true);\n consola.info('Auto-install enabled. Run with --no-auto-install to disable.');\n }\n }\n\n return success;\n }\n\n // User declined, ask if they want to skip these packages permanently\n const skipPermanently = await askConfirmation(\n `${chalk.green('?')} Skip these packages in future prompts? ${chalk.dim('[y/N]')} `\n );\n\n if (skipPermanently) {\n const currentSkip = installerCache.get('skipPackages') || [];\n installerCache.set('skipPackages', [...currentSkip, ...toInstall.map(p => p.name)]);\n consola.info('Packages added to skip list.');\n }\n\n return false;\n}\n\n/**\n * Print info about missing packages without prompting\n */\nfunction printMissingPackagesInfo(packages: MissingPackage[]): void {\n if (packages.length === 0) return;\n\n const pm = detectPackageManager();\n const command = buildInstallCommand(packages, pm);\n\n consola.warn(`Missing optional packages: ${packages.map(p => p.name).join(', ')}`);\n consola.info(`Install with: ${chalk.cyan(command)}`);\n}\n\n/**\n * Reset installer preferences\n */\nexport function resetInstallerPreferences(): void {\n installerCache.clear();\n consola.success('Installer preferences reset');\n}\n","/**\n * Package Checker\n *\n * Checks which optional packages are missing and need to be installed.\n */\n\nimport { createRequire } from 'module';\nimport { join } from 'path';\nimport type { PackageDefinition } from './definitions';\nimport { getPackagesForContext, OPTIONAL_PACKAGES } from './definitions';\nimport { isStaticBuild, isDev } from '../utils/env';\n\nexport interface MissingPackage extends PackageDefinition {\n /** Why is this package needed? */\n reason: string;\n}\n\n/**\n * Check if a package is installed in the consumer's project\n * Uses process.cwd() to check from the consumer's context, not the library's\n */\nexport function isPackageInstalled(packageName: string): boolean {\n try {\n // Create require from consumer's cwd to check their node_modules\n const consumerRequire = createRequire(join(process.cwd(), 'package.json'));\n consumerRequire.resolve(packageName);\n return true;\n } catch {\n // Fallback: try regular require (for packages hoisted to root)\n try {\n require.resolve(packageName);\n return true;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Get all missing packages for current context\n */\nexport function getMissingPackages(): MissingPackage[] {\n const neededPackages = getPackagesForContext({ isStaticBuild, isDev });\n const missing: MissingPackage[] = [];\n\n for (const pkg of neededPackages) {\n if (!isPackageInstalled(pkg.name)) {\n missing.push({\n ...pkg,\n reason: getReasonText(pkg),\n });\n }\n }\n\n return missing;\n}\n\n/**\n * Check specific packages\n */\nexport function checkPackages(packageNames: string[]): MissingPackage[] {\n const missing: MissingPackage[] = [];\n\n for (const name of packageNames) {\n if (!isPackageInstalled(name)) {\n const definition = OPTIONAL_PACKAGES.find(p => p.name === name);\n missing.push({\n name,\n description: definition?.description || 'Optional package',\n condition: definition?.condition || 'always',\n devDependency: definition?.devDependency ?? true,\n reason: definition ? getReasonText(definition) : 'Requested by configuration',\n });\n }\n }\n\n return missing;\n}\n\n/**\n * Get human-readable reason for package requirement\n */\nfunction getReasonText(pkg: PackageDefinition): string {\n switch (pkg.condition) {\n case 'static-build':\n return 'Required for static build (NEXT_PUBLIC_STATIC_BUILD=true)';\n case 'dev':\n return 'Required for development mode';\n case 'always':\n return 'Required for all builds';\n default:\n return 'Optional feature';\n }\n}\n","/**\n * Package Definitions\n *\n * Defines optional packages that can be auto-installed when needed.\n */\n\nexport interface PackageDefinition {\n /** npm package name */\n name: string;\n /** Human-readable description */\n description: string;\n /** When is this package needed? */\n condition: 'static-build' | 'dev' | 'always';\n /** Is this a dev dependency? */\n devDependency: boolean;\n /** Feature flag that enables this package */\n featureFlag?: string;\n}\n\n/**\n * Optional packages that can be auto-installed\n */\nexport const OPTIONAL_PACKAGES: PackageDefinition[] = [\n {\n name: 'compression-webpack-plugin',\n description: 'Gzip and Brotli compression for static builds',\n condition: 'static-build',\n devDependency: true,\n },\n {\n name: '@next/bundle-analyzer',\n description: 'Bundle analyzer for analyzing build output',\n condition: 'dev',\n devDependency: true,\n featureFlag: 'ANALYZE',\n },\n];\n\n/**\n * Required peer dependencies (should already be installed)\n */\nexport const PEER_DEPENDENCIES = [\n 'next',\n 'react',\n 'react-dom',\n] as const;\n\n/**\n * Get packages needed for current build context\n */\nexport function getPackagesForContext(options: {\n isStaticBuild: boolean;\n isDev: boolean;\n}): PackageDefinition[] {\n return OPTIONAL_PACKAGES.filter(pkg => {\n switch (pkg.condition) {\n case 'static-build':\n return options.isStaticBuild;\n case 'dev':\n return options.isDev;\n case 'always':\n return true;\n default:\n return false;\n }\n });\n}\n","/**\n * Package Updater\n *\n * Checks for outdated @djangocfg/* packages and offers to update them.\n */\n\nimport { spawn } from 'child_process';\nimport { createInterface } from 'readline';\nimport { createRequire } from 'module';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport consola from 'consola';\nimport Conf from 'conf';\nimport semver from 'semver';\nimport { DJANGOCFG_PACKAGES, PACKAGE_NAME } from '../constants';\nimport { isCI } from '../utils/env';\nimport { detectPackageManager } from './installer';\n\n// Updater preferences cache\nconst updaterCache = new Conf<{\n autoUpdate?: boolean;\n lastCheck?: number;\n skippedVersions?: Record<string, string>;\n}>({\n projectName: 'djangocfg-nextjs-updater',\n projectVersion: '1.0.0',\n});\n\n// Check for updates once per hour\nconst UPDATE_CHECK_COOLDOWN_MS = 60 * 60 * 1000;\n\n// Spinner frames\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport interface PackageVersion {\n name: string;\n current: string | null;\n latest: string | null;\n hasUpdate: boolean;\n}\n\nexport interface UpdateOptions {\n /** Auto-update without prompting */\n autoUpdate?: boolean;\n /** Force check even if recently checked (ignores cooldown) */\n force?: boolean;\n /** Force check even for workspace:* packages (for testing) */\n forceCheckWorkspace?: boolean;\n}\n\n/**\n * Check if package is a workspace dependency\n */\nfunction isWorkspacePackage(packageName: string): boolean {\n try {\n const fs = require('fs');\n const pkgJsonPath = join(process.cwd(), 'package.json');\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n\n const deps = { ...pkgJson.dependencies, ...pkgJson.devDependencies };\n const version = deps[packageName];\n\n return version?.startsWith('workspace:') || false;\n } catch {\n return false;\n }\n}\n\n/**\n * Get installed version of a package from consumer's project\n * Uses multiple fallback strategies for monorepo compatibility\n */\nexport function getInstalledVersion(packageName: string): string | null {\n const fs = require('fs');\n const cwd = process.cwd();\n\n // Strategy 1: Direct read from node_modules (works with symlinks)\n try {\n const directPath = join(cwd, 'node_modules', packageName, 'package.json');\n if (fs.existsSync(directPath)) {\n const pkg = JSON.parse(fs.readFileSync(directPath, 'utf-8'));\n return pkg.version || null;\n }\n } catch {\n // Continue to next strategy\n }\n\n // Strategy 2: Use createRequire from cwd\n try {\n const consumerRequire = createRequire(join(cwd, 'package.json'));\n const pkgPath = consumerRequire.resolve(`${packageName}/package.json`);\n const pkg = require(pkgPath);\n return pkg.version || null;\n } catch {\n // Continue to next strategy\n }\n\n // Strategy 3: Try global require\n try {\n const pkgPath = require.resolve(`${packageName}/package.json`);\n const pkg = require(pkgPath);\n return pkg.version || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if we should skip update checking for this package\n * (e.g., workspace packages shouldn't be checked against npm)\n */\nexport function shouldCheckUpdates(packageName: string): boolean {\n return !isWorkspacePackage(packageName);\n}\n\n/**\n * Fetch latest version from npm registry\n */\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\n try {\n const https = await import('https');\n return new Promise((resolve) => {\n const req = https.get(\n `https://registry.npmjs.org/${packageName}/latest`,\n { timeout: 5000 },\n (res: any) => {\n let data = '';\n res.on('data', (chunk: string) => { data += chunk; });\n res.on('end', () => {\n try {\n const json = JSON.parse(data);\n resolve(json.version || null);\n } catch {\n resolve(null);\n }\n });\n }\n );\n req.on('error', () => resolve(null));\n req.on('timeout', () => { req.destroy(); resolve(null); });\n });\n } catch {\n return null;\n }\n}\n\n/**\n * Check all @djangocfg packages for updates\n * All packages are aligned to the version of @djangocfg/nextjs (master package)\n * Skips workspace:* packages unless forceCheckWorkspace is true\n */\nexport async function checkForUpdates(options: { forceCheckWorkspace?: boolean } = {}): Promise<PackageVersion[]> {\n const results: PackageVersion[] = [];\n\n // First, get the latest version of master package (@djangocfg/nextjs)\n // All other packages should align to this version\n const masterLatest = await fetchLatestVersion(PACKAGE_NAME);\n if (!masterLatest) {\n // Can't determine target version, skip update check\n return results;\n }\n\n // Check packages against master version\n const checks = DJANGOCFG_PACKAGES.map(async (name) => {\n // Skip workspace packages unless force mode\n const isWorkspace = !shouldCheckUpdates(name);\n if (!options.forceCheckWorkspace && isWorkspace) {\n return null;\n }\n\n const current = getInstalledVersion(name);\n if (!current) {\n return null;\n }\n\n // All packages should update to master package version\n const hasUpdate = !!(masterLatest && current && semver.gt(masterLatest, current));\n\n return { name, current, latest: masterLatest, hasUpdate };\n });\n\n const checkResults = await Promise.all(checks);\n\n for (const result of checkResults) {\n if (result) {\n results.push(result);\n }\n }\n\n return results;\n}\n\n/**\n * Get packages that need updating\n */\nexport async function getOutdatedPackages(options: { forceCheckWorkspace?: boolean } = {}): Promise<PackageVersion[]> {\n const all = await checkForUpdates(options);\n const skipped = updaterCache.get('skippedVersions') || {};\n\n return all.filter(pkg => {\n if (!pkg.hasUpdate) return false;\n // Skip if user chose to skip this specific version\n if (skipped[pkg.name] === pkg.latest) return false;\n return true;\n });\n}\n\n/**\n * Create a simple spinner\n */\nfunction createSpinner(text: string) {\n let frameIndex = 0;\n let interval: NodeJS.Timeout | null = null;\n let currentText = text;\n\n const render = () => {\n const frame = SPINNER_FRAMES[frameIndex];\n process.stdout.write(`\\r${chalk.cyan(frame)} ${currentText}`);\n frameIndex = (frameIndex + 1) % SPINNER_FRAMES.length;\n };\n\n return {\n start() {\n if (process.stdout.isTTY) {\n interval = setInterval(render, 80);\n render();\n } else {\n console.log(` ${currentText}`);\n }\n return this;\n },\n text(newText: string) {\n currentText = newText;\n return this;\n },\n succeed(text?: string) {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write(`\\r${chalk.green('✓')} ${text || currentText}\\n`);\n } else {\n console.log(` ${chalk.green('✓')} ${text || currentText}`);\n }\n return this;\n },\n fail(text?: string) {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write(`\\r${chalk.red('✗')} ${text || currentText}\\n`);\n } else {\n console.log(` ${chalk.red('✗')} ${text || currentText}`);\n }\n return this;\n },\n stop() {\n if (interval) clearInterval(interval);\n if (process.stdout.isTTY) {\n process.stdout.write('\\r\\x1b[K');\n }\n return this;\n },\n };\n}\n\n/**\n * Ask user for confirmation\n */\nasync function askConfirmation(question: string): Promise<boolean> {\n if (isCI || !process.stdin.isTTY) {\n return false;\n }\n\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(question, (answer) => {\n rl.close();\n const normalized = answer.toLowerCase().trim();\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\n });\n });\n}\n\n/**\n * Update a single package with progress\n */\nasync function updateSinglePackage(\n pkg: PackageVersion,\n pm: 'pnpm' | 'yarn' | 'npm',\n index: number,\n total: number\n): Promise<boolean> {\n const progress = `[${index + 1}/${total}]`;\n const versionInfo = `${chalk.red(pkg.current)} → ${chalk.green(pkg.latest)}`;\n const spinner = createSpinner(\n `${chalk.dim(progress)} Updating ${chalk.cyan(pkg.name)} ${versionInfo}`\n );\n\n spinner.start();\n\n // Always install with @latest to keep package.json consistent\n const command = pm === 'pnpm'\n ? `pnpm add ${pkg.name}@latest`\n : pm === 'yarn'\n ? `yarn add ${pkg.name}@latest`\n : `npm install ${pkg.name}@latest`;\n\n return new Promise((resolve) => {\n const proc = spawn(command, {\n shell: true,\n cwd: process.cwd(),\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n spinner.succeed(\n `${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.green(pkg.latest!)}`\n );\n resolve(true);\n } else {\n spinner.fail(\n `${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.red('failed')}`\n );\n resolve(false);\n }\n });\n\n proc.on('error', () => {\n spinner.fail(`${chalk.dim(progress)} ${chalk.cyan(pkg.name)} ${chalk.red('failed')}`);\n resolve(false);\n });\n });\n}\n\n/**\n * Update packages with progress\n */\nexport async function updatePackagesWithProgress(packages: PackageVersion[]): Promise<boolean> {\n if (packages.length === 0) return true;\n\n const pm = detectPackageManager();\n const total = packages.length;\n\n console.log('');\n console.log(chalk.bold(` Updating ${total} package${total > 1 ? 's' : ''}...`));\n console.log('');\n\n let successCount = 0;\n const failedPackages: string[] = [];\n\n for (let i = 0; i < packages.length; i++) {\n const success = await updateSinglePackage(packages[i], pm, i, total);\n if (success) {\n successCount++;\n } else {\n failedPackages.push(packages[i].name);\n }\n }\n\n console.log('');\n\n if (failedPackages.length === 0) {\n consola.success(`All ${total} packages updated successfully!`);\n return true;\n } else if (successCount > 0) {\n consola.warn(`${successCount}/${total} packages updated. Failed: ${failedPackages.join(', ')}`);\n return false;\n } else {\n consola.error(`Failed to update packages: ${failedPackages.join(', ')}`);\n return false;\n }\n}\n\n/**\n * Check and prompt for package updates\n */\nexport async function checkAndUpdatePackages(options: UpdateOptions = {}): Promise<boolean> {\n // Check cooldown\n const lastCheck = updaterCache.get('lastCheck') || 0;\n if (!options.force && (Date.now() - lastCheck) < UPDATE_CHECK_COOLDOWN_MS) {\n return true;\n }\n\n updaterCache.set('lastCheck', Date.now());\n\n // Check for updates\n const spinner = createSpinner('Checking for updates...');\n spinner.start();\n\n const outdated = await getOutdatedPackages({\n forceCheckWorkspace: options.forceCheckWorkspace,\n });\n\n spinner.stop();\n\n console.log(chalk.dim(` Found ${outdated.length} outdated package(s)`));\n\n if (outdated.length === 0) {\n console.log(chalk.green(' ✓ All packages are up to date'));\n return true;\n }\n\n // Auto-update if configured\n if (options.autoUpdate || updaterCache.get('autoUpdate')) {\n return updatePackagesWithProgress(outdated);\n }\n\n // Show outdated packages\n console.log('');\n consola.box('📦 Updates Available');\n console.log('');\n\n for (const pkg of outdated) {\n console.log(\n ` ${chalk.yellow('•')} ${chalk.bold(pkg.name)} ` +\n `${chalk.red(pkg.current)} → ${chalk.green(pkg.latest)}`\n );\n }\n console.log('');\n\n // Ask for confirmation\n const shouldUpdate = await askConfirmation(\n `${chalk.green('?')} Update these packages now? ${chalk.dim('[Y/n]')} `\n );\n\n if (shouldUpdate) {\n const success = await updatePackagesWithProgress(outdated);\n\n if (success) {\n const enableAuto = await askConfirmation(\n `${chalk.green('?')} Enable auto-update for future? ${chalk.dim('[y/N]')} `\n );\n if (enableAuto) {\n updaterCache.set('autoUpdate', true);\n consola.info('Auto-update enabled.');\n }\n }\n\n return success;\n }\n\n // User declined, ask if they want to skip these versions\n const skipVersions = await askConfirmation(\n `${chalk.green('?')} Skip these versions in future? ${chalk.dim('[y/N]')} `\n );\n\n if (skipVersions) {\n const skipped = updaterCache.get('skippedVersions') || {};\n for (const pkg of outdated) {\n if (pkg.latest) {\n skipped[pkg.name] = pkg.latest;\n }\n }\n updaterCache.set('skippedVersions', skipped);\n consola.info('Versions skipped. Will prompt again for newer versions.');\n }\n\n return false;\n}\n\n/**\n * Reset updater preferences\n */\nexport function resetUpdaterPreferences(): void {\n updaterCache.clear();\n consola.success('Updater preferences reset');\n}\n","/**\n * Compression Plugin Setup\n *\n * Adds Gzip and Brotli compression for static builds.\n */\n\nimport type { Configuration as WebpackConfig } from 'webpack';\nimport { isPackageInstalled } from '../packages/checker';\n\nexport interface CompressionPluginOptions {\n /** Enable gzip compression */\n gzip?: boolean;\n /** Enable brotli compression */\n brotli?: boolean;\n /** Minimum file size to compress (default: 8192) */\n threshold?: number;\n /** Minimum compression ratio (default: 0.8) */\n minRatio?: number;\n /** Brotli compression level (default: 8) */\n brotliLevel?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<CompressionPluginOptions> = {\n gzip: true,\n brotli: true,\n threshold: 8192,\n minRatio: 0.8,\n brotliLevel: 8,\n};\n\n/**\n * Add compression plugins to webpack config\n *\n * Returns true if plugins were added, false if compression-webpack-plugin is not installed\n */\nexport function addCompressionPlugins(\n config: WebpackConfig,\n options: CompressionPluginOptions = {}\n): boolean {\n // Check if compression-webpack-plugin is installed\n if (!isPackageInstalled('compression-webpack-plugin')) {\n return false;\n }\n\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n try {\n // Dynamic import to avoid bundling if not installed\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const CompressionPlugin = require('compression-webpack-plugin');\n\n if (!config.plugins) {\n config.plugins = [];\n }\n\n // Gzip compression\n if (opts.gzip) {\n config.plugins.push(\n new CompressionPlugin({\n filename: '[path][base].gz',\n algorithm: 'gzip',\n test: /\\.(js|css|html|svg|json)$/,\n threshold: opts.threshold,\n minRatio: opts.minRatio,\n })\n );\n }\n\n // Brotli compression\n if (opts.brotli) {\n config.plugins.push(\n new CompressionPlugin({\n filename: '[path][base].br',\n algorithm: 'brotliCompress',\n test: /\\.(js|css|html|svg|json)$/,\n threshold: opts.threshold,\n minRatio: opts.minRatio,\n compressionOptions: {\n level: opts.brotliLevel,\n },\n })\n );\n }\n\n return true;\n } catch (error) {\n // compression-webpack-plugin failed to load\n return false;\n }\n}\n\n/**\n * Check if compression is available\n */\nexport function isCompressionAvailable(): boolean {\n return isPackageInstalled('compression-webpack-plugin');\n}\n","/**\n * Base Next.js Configuration Factory\n *\n * Universal, reusable Next.js config for all DjangoCFG projects\n * Provides standard settings that can be extended per project\n *\n * @example\n * ```typescript\n * // In your project's next.config.ts\n * import { createBaseNextConfig } from '@djangocfg/nextjs/config';\n * import bundleAnalyzer from '@next/bundle-analyzer';\n *\n * const withBundleAnalyzer = bundleAnalyzer({\n * enabled: process.env.ANALYZE === 'true',\n * });\n *\n * export default withBundleAnalyzer(createBaseNextConfig({\n * // Your project-specific overrides\n * transpilePackages: ['my-custom-package'],\n * }));\n * ```\n */\n\nimport type { NextConfig } from 'next';\nimport type { Configuration as WebpackConfig } from 'webpack';\n\nimport { DEFAULT_TRANSPILE_PACKAGES, DEFAULT_OPTIMIZE_PACKAGES } from './constants';\nimport { deepMerge } from './utils/deepMerge';\nimport { isStaticBuild, isDev, getBasePath, getApiUrl, getSiteUrl } from './utils/env';\nimport { DevStartupPlugin } from './plugins/devStartup';\nimport { addCompressionPlugins } from './plugins/compression';\n\n// ─────────────────────────────────────────────────────────────────────────\n// Configuration Options\n// ─────────────────────────────────────────────────────────────────────────\n\nexport interface BaseNextConfigOptions {\n /** Static build path (used when NEXT_PUBLIC_STATIC_BUILD=true) */\n isDefaultCfgAdmin?: boolean;\n /** Additional transpile packages (merged with defaults) */\n transpilePackages?: string[];\n /** Additional optimize package imports (merged with defaults) */\n optimizePackageImports?: string[];\n /** Automatically open browser in dev mode (default: false) */\n openBrowser?: boolean;\n /** Check for @djangocfg/* package updates on startup (default: true) */\n checkUpdates?: boolean;\n /** Auto-update outdated packages without prompting (default: false) */\n autoUpdate?: boolean;\n /** Force check workspace:* packages for updates (for testing in monorepo) */\n forceCheckWorkspace?: boolean;\n /** Check for missing optional packages on startup (default: true) */\n checkPackages?: boolean;\n /** Auto-install missing packages without prompting (default: false) */\n autoInstall?: boolean;\n /**\n * Allow embedding this app in iframe from specified origins\n * Set to ['*'] to allow all origins, or specify domains like ['https://djangocfg.com']\n */\n allowIframeFrom?: string[];\n /** Custom webpack configuration function (called after base webpack logic) */\n webpack?: (\n config: WebpackConfig,\n options: { isServer: boolean; dev: boolean; [key: string]: any }\n ) => WebpackConfig | void;\n /** Custom experimental options (merged with defaults) */\n experimental?: NextConfig['experimental'];\n /** Custom env variables (merged with defaults) */\n env?: Record<string, string | undefined>;\n /** Override any Next.js config option */\n [key: string]: any;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Base Configuration Factory\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Create base Next.js configuration with standard DjangoCFG settings\n *\n * @param options - Custom configuration options to merge with base config\n * @returns Next.js configuration function\n */\nexport function createBaseNextConfig(\n options: BaseNextConfigOptions = {}\n): NextConfig {\n\n const basePath = getBasePath(options.isDefaultCfgAdmin);\n const apiUrl = getApiUrl();\n const siteUrl = getSiteUrl();\n\n // Base configuration\n const baseConfig: NextConfig = {\n reactStrictMode: true,\n trailingSlash: true,\n\n // Static export configuration\n ...(isStaticBuild && {\n output: 'export' as const,\n distDir: 'out',\n basePath: basePath,\n // Fix for Next.js 15.5.4: prevent 500.html generation issue\n generateBuildId: async () => {\n return 'static-build';\n },\n }),\n\n // Standalone output for Docker (only in production, not dev)\n ...(!isStaticBuild && !isDev && {\n output: 'standalone' as const,\n }),\n\n // Environment variables\n env: {\n NEXT_PUBLIC_BASE_PATH: basePath,\n NEXT_PUBLIC_API_URL: apiUrl,\n NEXT_PUBLIC_SITE_URL: siteUrl,\n // Disable Next.js telemetry (Next.js 15+ uses env var instead of config option)\n NEXT_TELEMETRY_DISABLED: '1',\n ...options.env,\n },\n\n // Images configuration\n images: {\n unoptimized: true,\n },\n\n // CORS headers for static files and iframe embedding\n async headers() {\n const headers: { source: string; headers: { key: string; value: string }[] }[] = [\n {\n source: '/static/:path*',\n headers: [\n { key: 'Access-Control-Allow-Origin', value: '*' },\n { key: 'Access-Control-Allow-Methods', value: 'GET, OPTIONS' },\n { key: 'Access-Control-Allow-Headers', value: 'Origin, Content-Type, Accept' },\n ],\n },\n ];\n\n // Add iframe embedding headers if allowIframeFrom is specified\n if (options.allowIframeFrom && options.allowIframeFrom.length > 0) {\n const frameAncestors = options.allowIframeFrom.includes('*')\n ? '*'\n : `'self' ${options.allowIframeFrom.join(' ')}`;\n\n headers.push({\n source: '/:path*',\n headers: [\n // Content-Security-Policy frame-ancestors directive\n { key: 'Content-Security-Policy', value: `frame-ancestors ${frameAncestors}` },\n // X-Frame-Options for older browsers (ALLOW-FROM is deprecated, use CSP instead)\n // Only set SAMEORIGIN if allowing all, otherwise browsers will use CSP\n ...(options.allowIframeFrom.includes('*')\n ? []\n : [{ key: 'X-Frame-Options', value: 'SAMEORIGIN' }]\n ),\n ],\n });\n }\n\n return headers;\n },\n\n // Transpile packages (merge with user-provided)\n transpilePackages: [\n ...DEFAULT_TRANSPILE_PACKAGES,\n ...(options.transpilePackages || []),\n ],\n\n // Experimental features\n experimental: {\n // Optimize package imports (only in production)\n ...(!isDev && {\n optimizePackageImports: [\n ...DEFAULT_OPTIMIZE_PACKAGES,\n ...(options.optimizePackageImports || []),\n ],\n }),\n // Dev mode optimizations\n ...(isDev && {\n optimizeCss: false,\n }),\n // User experimental options applied last (can override base settings)\n ...options.experimental,\n },\n\n // Webpack configuration\n webpack: (config: WebpackConfig, webpackOptions: { isServer: boolean; dev: boolean; [key: string]: any }) => {\n const { isServer, dev } = webpackOptions;\n\n // Add dev startup plugin (client-side only in dev)\n if (dev && !isServer) {\n if (!config.plugins) {\n config.plugins = [];\n }\n config.plugins.push(\n new DevStartupPlugin({\n openBrowser: options.openBrowser,\n checkUpdates: options.checkUpdates,\n autoUpdate: options.autoUpdate,\n forceCheckWorkspace: options.forceCheckWorkspace,\n checkPackages: options.checkPackages,\n autoInstall: options.autoInstall,\n })\n );\n }\n\n // Dev mode optimizations\n if (dev) {\n config.optimization = {\n ...config.optimization,\n removeAvailableModules: false,\n removeEmptyChunks: false,\n splitChunks: false, // Disable code splitting in dev for faster compilation\n };\n }\n\n // Filesystem cache (dev and production)\n config.cache = {\n type: 'filesystem',\n buildDependencies: {},\n };\n\n // Compression plugins (only for static build in production, client-side)\n if (!isServer && isStaticBuild && !dev) {\n addCompressionPlugins(config);\n }\n\n // Call user's webpack function if provided\n if (options.webpack) {\n return options.webpack(config, webpackOptions);\n }\n\n return config;\n },\n };\n\n // Deep merge user options with base config\n const finalConfig = deepMerge(baseConfig, options);\n\n // Cleanup: Remove custom options that are not part of NextConfig\n delete (finalConfig as any).optimizePackageImports;\n delete (finalConfig as any).isDefaultCfgAdmin;\n delete (finalConfig as any).openBrowser;\n delete (finalConfig as any).checkUpdates;\n delete (finalConfig as any).autoUpdate;\n delete (finalConfig as any).forceCheckWorkspace;\n delete (finalConfig as any).checkPackages;\n delete (finalConfig as any).autoInstall;\n delete (finalConfig as any).allowIframeFrom;\n\n return finalConfig;\n}\n"],"mappings":"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","names":["chalk","chalk","consola","Conf","Conf","isDev","chalk","text","consola","spawn","createInterface","createRequire","join","chalk","consola","Conf","semver","Conf","SPINNER_FRAMES","join","createRequire","fetchLatestVersion","semver","createSpinner","chalk","text","askConfirmation","createInterface","spawn","consola","chalk"]}
package/dist/index.mjs CHANGED
@@ -14,7 +14,7 @@ var require_package = __commonJS({
14
14
  "package.json"(exports, module) {
15
15
  module.exports = {
16
16
  name: "@djangocfg/nextjs",
17
- version: "2.1.29",
17
+ version: "2.1.30",
18
18
  description: "Next.js server utilities: sitemap, health, OG images, contact forms, navigation, config",
19
19
  keywords: [
20
20
  "nextjs",