@djangocfg/nextjs 2.1.65 → 2.1.67

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.65",
17
+ version: "2.1.67",
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/pwa/plugin.ts","../../src/config/constants.ts","../../src/config/packages/checker.ts","../../src/config/utils/env.ts","../../src/config/packages/definitions.ts","../../src/config/plugins/compression.ts","../../src/config/plugins/devStartup.ts","../../src/ai/constants.ts","../../src/config/packages/installer.ts","../../src/config/packages/updater.ts","../../src/config/utils/version.ts","../../src/config/utils/deepMerge.ts","../../src/config/createNextConfig.ts"],"sourcesContent":["{\n \"name\": \"@djangocfg/nextjs\",\n \"version\": \"2.1.65\",\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 \"./pwa\": {\n \"types\": \"./dist/pwa/index.d.mts\",\n \"import\": \"./dist/pwa/index.mjs\",\n \"default\": \"./dist/pwa/index.mjs\"\n },\n \"./pwa/worker\": {\n \"types\": \"./dist/pwa/worker/index.d.mts\",\n \"import\": \"./dist/pwa/worker/index.mjs\",\n \"default\": \"./dist/pwa/worker/index.mjs\"\n },\n \"./worker\": {\n \"types\": \"./dist/pwa/worker/index.d.mts\",\n \"import\": \"./dist/pwa/worker/index.mjs\",\n \"default\": \"./dist/pwa/worker/index.mjs\"\n },\n \"./pwa/server\": {\n \"types\": \"./dist/pwa/server/index.d.mts\",\n \"import\": \"./dist/pwa/server/index.mjs\",\n \"default\": \"./dist/pwa/server/index.mjs\"\n },\n \"./pwa/server/routes\": {\n \"types\": \"./dist/pwa/server/routes.d.mts\",\n \"import\": \"./dist/pwa/server/routes.mjs\",\n \"default\": \"./dist/pwa/server/routes.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 \"djangocfg-pwa\": \"./dist/pwa/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 \"ai-docs\": \"tsx src/ai/cli.ts\",\n \"pwa\": \"tsx src/pwa/cli.ts\"\n },\n \"peerDependencies\": {\n \"next\": \"^16.0.10\"\n },\n \"dependencies\": {\n \"@serwist/next\": \"^9.2.3\",\n \"@serwist/sw\": \"^9.2.3\",\n \"chalk\": \"^5.3.0\",\n \"conf\": \"^15.0.2\",\n \"consola\": \"^3.4.2\",\n \"semver\": \"^7.7.3\",\n \"serwist\": \"^9.2.3\",\n \"web-push\": \"^3.6.7\"\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/web-push\": \"^3.6.4\",\n \"@types/webpack\": \"^5.28.5\",\n \"@vercel/og\": \"^0.8.5\",\n \"eslint\": \"^9.37.0\",\n \"lucide-react\": \"^0.545.0\",\n \"tsup\": \"^8.0.1\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"^5.9.3\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}","/**\n * PWA (Progressive Web App) Plugin\n *\n * Configures Serwist for service worker and offline support\n * Modern PWA solution for Next.js 15+ with App Router\n *\n * @see https://serwist.pages.dev/\n */\n\nimport type { NextConfig } from 'next';\nimport { consola } from 'consola';\n\nexport interface PWAPluginOptions {\n /**\n * Destination directory for service worker files\n * @default 'public'\n * @deprecated Use swDest instead\n */\n dest?: string;\n\n /**\n * Path to service worker source file (relative to project root)\n * @default 'app/sw.ts'\n */\n swSrc?: string;\n\n /**\n * Destination for compiled service worker\n * @default 'public/sw.js'\n */\n swDest?: string;\n\n /**\n * Disable PWA completely\n * @default false in production, true in development\n * @example disable: process.env.NODE_ENV === 'development'\n */\n disable?: boolean;\n\n /**\n * Cache on navigation - cache pages when navigating\n * @default true\n */\n cacheOnNavigation?: boolean;\n\n /**\n * Reload app when device goes back online\n * @default true\n */\n reloadOnOnline?: boolean;\n\n /**\n * Additional Serwist options\n * @see https://serwist.pages.dev/docs/next/configuring\n */\n serwistOptions?: Record<string, any>;\n}\n\n/**\n * Add PWA configuration to Next.js config using Serwist\n *\n * @example Basic usage\n * ```ts\n * import { createBaseNextConfig, withPWA } from '@djangocfg/nextjs/config';\n *\n * const nextConfig = createBaseNextConfig({...});\n *\n * export default withPWA(nextConfig, {\n * swSrc: 'app/sw.ts',\n * disable: process.env.NODE_ENV === 'development',\n * });\n * ```\n *\n * @example Integrated with createBaseNextConfig\n * ```ts\n * import { createBaseNextConfig } from '@djangocfg/nextjs/config';\n *\n * const config = createBaseNextConfig({\n * pwa: {\n * swSrc: 'app/sw.ts',\n * disable: false,\n * },\n * });\n *\n * export default config;\n * ```\n */\nexport function withPWA(\n nextConfig: NextConfig,\n options: PWAPluginOptions = {}\n): NextConfig {\n const isDev = process.env.NODE_ENV === 'development';\n const isStaticBuild = process.env.NEXT_PUBLIC_STATIC_BUILD === 'true';\n\n // Determine if PWA should be disabled:\n // - Explicitly disabled via options\n // - In development mode (default)\n // - Static build (output: 'export' doesn't support service workers)\n const shouldDisable = options.disable !== undefined\n ? options.disable\n : (isDev || isStaticBuild);\n\n const defaultOptions: PWAPluginOptions = {\n swSrc: 'app/sw.ts',\n swDest: 'public/sw.js',\n disable: shouldDisable,\n cacheOnNavigation: true,\n reloadOnOnline: true,\n ...options,\n };\n\n try {\n // Suppress Turbopack warning - it only applies to dev mode, not production builds\n // The warning is misleading when running `next build` with Turbopack\n // See: https://github.com/serwist/serwist/issues/54\n if (!process.env.SERWIST_SUPPRESS_TURBOPACK_WARNING) {\n process.env.SERWIST_SUPPRESS_TURBOPACK_WARNING = '1';\n }\n\n const withSerwistInit = require('@serwist/next').default;\n\n const withSerwist = withSerwistInit({\n swSrc: defaultOptions.swSrc,\n swDest: defaultOptions.swDest,\n disable: defaultOptions.disable,\n cacheOnNavigation: defaultOptions.cacheOnNavigation,\n reloadOnOnline: defaultOptions.reloadOnOnline,\n ...defaultOptions.serwistOptions,\n });\n\n return withSerwist(nextConfig);\n } catch (error) {\n consola.error('Failed to configure Serwist:', error);\n return nextConfig;\n }\n}\n\n/**\n * Get service worker template content\n *\n * Returns ready-to-use service worker code for app/sw.ts\n *\n * @example\n * ```ts\n * import { getServiceWorkerTemplate } from '@djangocfg/nextjs/config';\n *\n * // Copy this to your app/sw.ts file\n * console.log(getServiceWorkerTemplate());\n * ```\n */\nexport function getServiceWorkerTemplate(): string {\n return `/**\n * Service Worker (Serwist)\n *\n * Modern PWA service worker using Serwist\n */\n\nimport { defaultCache } from '@serwist/next/worker';\nimport { Serwist } from 'serwist';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndeclare const self: any;\n\nconst serwist = new Serwist({\n // Precache entries injected by Serwist build plugin\n precacheEntries: self.__SW_MANIFEST,\n\n // Skip waiting - activate new SW immediately\n skipWaiting: true,\n\n // Take control of all clients immediately\n clientsClaim: true,\n\n // Enable navigation preload for faster loads\n navigationPreload: true,\n\n // Use default Next.js runtime caching strategies\n runtimeCaching: defaultCache,\n\n // Fallback pages for offline\n fallbacks: {\n entries: [\n {\n url: '/_offline',\n matcher({ request }) {\n return request.destination === 'document';\n },\n },\n ],\n },\n});\n\nserwist.addEventListeners();\n`;\n}\n\n// Backward compatibility exports (deprecated)\nexport const defaultRuntimeCaching = [];\nexport function createApiCacheRule() {\n consola.warn('createApiCacheRule is deprecated with Serwist. Use defaultCache from @serwist/next/worker');\n return {};\n}\nexport function createStaticAssetRule() {\n consola.warn('createStaticAssetRule is deprecated with Serwist. Use defaultCache from @serwist/next/worker');\n return {};\n}\nexport function createCdnCacheRule() {\n consola.warn('createCdnCacheRule is deprecated with Serwist. Use defaultCache from @serwist/next/worker');\n return {};\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 * 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';\n\nimport { isDev, isStaticBuild } from '../utils/env';\nimport { getPackagesForContext, OPTIONAL_PACKAGES } from './definitions';\n\nimport type { PackageDefinition } from './definitions';\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 * 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 * 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 * 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 * Dev Startup Webpack Plugin\n *\n * Handles banner display, version checking, and package updates.\n */\n\nimport type { Compiler } from 'webpack';\nimport chalk from 'chalk';\n\nimport { AI_DOCS_HINT } from '../../ai/constants';\nimport { DJANGO_CFG_BANNER } from '../constants';\nimport { checkAndInstallPackages } from '../packages/installer';\nimport { checkAndUpdatePackages } from '../packages/updater';\nimport { getCurrentVersion } from '../utils/version';\n\n// Track if startup tasks were already run (persists across HMR)\nlet startupDone = false;\n\nexport interface DevStartupPluginOptions {\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 }\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. Check PWA setup\n this.checkPWASetup();\n\n // 4. Print AI docs hint\n console.log(chalk.magenta(` ${AI_DOCS_HINT}\\n`));\n\n // 5. 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 // 6. 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 checkPWASetup(): void {\n const fs = require('fs');\n const path = require('path');\n\n const cwd = process.cwd();\n const swPath = path.join(cwd, 'app', 'sw.ts');\n const manifestPath = path.join(cwd, 'app', 'manifest.ts');\n\n const hasSW = fs.existsSync(swPath);\n const hasManifest = fs.existsSync(manifestPath);\n\n if (hasSW || hasManifest) {\n console.log(chalk.cyan(' 📱 PWA Configuration:'));\n\n if (hasSW) {\n console.log(chalk.green(' ✓ Service Worker: app/sw.ts'));\n } else {\n console.log(chalk.yellow(' ⚠ Service Worker: not found'));\n }\n\n if (hasManifest) {\n console.log(chalk.green(' ✓ Manifest: app/manifest.ts'));\n } else {\n console.log(chalk.yellow(' ⚠ Manifest: not found'));\n }\n\n console.log(chalk.dim(' → Check: DevTools → Application → Service Workers'));\n console.log(chalk.dim(' → Test push: import from @djangocfg/nextjs/pwa'));\n }\n }\n}\n\n/**\n * Reset plugin state (useful for tests)\n */\nexport function resetDevStartupState(): void {\n startupDone = 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 * Package Installer\n *\n * Provides auto-installation functionality with user confirmation and progress indication.\n */\n\nimport chalk from 'chalk';\nimport { execSync, spawn } from 'child_process';\nimport Conf from 'conf';\nimport consola from 'consola';\nimport { createInterface } from 'readline';\n\nimport { isCI } from '../utils/env';\nimport { getMissingPackages } from './checker';\n\nimport type { MissingPackage } from './checker';\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 Updater\n *\n * Checks for outdated @djangocfg/* packages and offers to update them.\n */\n\nimport chalk from 'chalk';\nimport { spawn } from 'child_process';\nimport Conf from 'conf';\nimport consola from 'consola';\nimport { createRequire } from 'module';\nimport { join } from 'path';\nimport { createInterface } from 'readline';\nimport semver from 'semver';\n\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 * Version Checking Utilities\n */\n\nimport chalk from 'chalk';\nimport Conf from 'conf';\nimport consola from 'consola';\nimport semver from 'semver';\n\nimport { DJANGOCFG_PACKAGES, PACKAGE_NAME, VERSION_CACHE_TTL_MS } 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 * 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 * 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 { type PWAPluginOptions, withPWA } from '../pwa/plugin';\nimport { DEFAULT_OPTIMIZE_PACKAGES, DEFAULT_TRANSPILE_PACKAGES } from './constants';\nimport { addCompressionPlugins } from './plugins/compression';\nimport { DevStartupPlugin } from './plugins/devStartup';\nimport { deepMerge } from './utils/deepMerge';\nimport { getApiUrl, getBasePath, getSiteUrl, isDev, isStaticBuild } from './utils/env';\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 /** 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 /**\n * PWA configuration options\n * Set to false to disable PWA, or provide custom options\n * @default { enabled: true (in production), disable: true (in development) }\n */\n pwa?: PWAPluginOptions | false;\n /** Turbopack configuration (Next.js 16+ default bundler) */\n turbopack?: NextConfig['turbopack'];\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 /** Additional redirects (merged with base URL normalization redirects) */\n redirects?: NextConfig['redirects'];\n /** Additional headers (merged with base CORS/security headers) */\n headers?: NextConfig['headers'];\n /** Additional rewrites */\n rewrites?: NextConfig['rewrites'];\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 // Merge with user-provided headers\n const userHeaders = options.headers ? await options.headers() : [];\n return [...headers, ...userHeaders];\n },\n\n // Rewrites (user-provided only)\n ...(options.rewrites && {\n rewrites: options.rewrites,\n }),\n\n // Redirects for URL normalization\n // Fixes \"Failed to construct 'URL': Invalid URL\" error with double slashes\n async redirects() {\n const baseRedirects = [\n // Normalize double slashes in URL path (e.g., /foo//bar -> /foo/bar)\n {\n source: '/:path*(//)/:rest*',\n destination: '/:path*/:rest*',\n permanent: true,\n },\n // Handle root double slash (e.g., // -> /)\n {\n source: '//',\n destination: '/',\n permanent: true,\n },\n ];\n\n // Merge with user-provided redirects\n const userRedirects = options.redirects ? await options.redirects() : [];\n return [...baseRedirects, ...userRedirects];\n },\n\n // Transpile packages (merge with user-provided)\n transpilePackages: [\n ...DEFAULT_TRANSPILE_PACKAGES,\n ...(options.transpilePackages || []),\n ],\n\n // Turbopack configuration (Next.js 16+ default bundler)\n // Always set turbopack config to silence Next.js 16 warning about webpack config\n turbopack: options.turbopack || {},\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 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 let 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).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 delete (finalConfig as any).openBrowser;\n // Note: turbopack is a valid NextConfig option, don't delete it\n\n // Apply PWA wrapper only if explicitly configured (opt-in)\n // PWA requires sw.ts file in the app, so apps must explicitly enable it\n if (options.pwa) {\n finalConfig = withPWA(finalConfig, options.pwa);\n }\n delete (finalConfig as any).pwa;\n\n return finalConfig;\n}\n"],"mappings":"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","names":["isDev","isStaticBuild","chalk","consola","isDev","text","consola","chalk","spawn","Conf","consola","createRequire","join","createInterface","Conf","SPINNER_FRAMES","join","createRequire","createSpinner","chalk","text","askConfirmation","createInterface","spawn","consola","chalk","Conf","consola","semver","Conf","fetchLatestVersion","semver","consola","chalk","chalk"]}
1
+ {"version":3,"sources":["../../package.json","../../src/pwa/plugin.ts","../../src/config/constants.ts","../../src/config/packages/checker.ts","../../src/config/utils/env.ts","../../src/config/packages/definitions.ts","../../src/config/plugins/compression.ts","../../src/config/plugins/devStartup.ts","../../src/ai/constants.ts","../../src/config/packages/installer.ts","../../src/config/packages/updater.ts","../../src/config/utils/version.ts","../../src/config/utils/deepMerge.ts","../../src/config/createNextConfig.ts"],"sourcesContent":["{\n \"name\": \"@djangocfg/nextjs\",\n \"version\": \"2.1.67\",\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 \"./pwa\": {\n \"types\": \"./dist/pwa/index.d.mts\",\n \"import\": \"./dist/pwa/index.mjs\",\n \"default\": \"./dist/pwa/index.mjs\"\n },\n \"./pwa/worker\": {\n \"types\": \"./dist/pwa/worker/index.d.mts\",\n \"import\": \"./dist/pwa/worker/index.mjs\",\n \"default\": \"./dist/pwa/worker/index.mjs\"\n },\n \"./worker\": {\n \"types\": \"./dist/pwa/worker/index.d.mts\",\n \"import\": \"./dist/pwa/worker/index.mjs\",\n \"default\": \"./dist/pwa/worker/index.mjs\"\n },\n \"./pwa/server\": {\n \"types\": \"./dist/pwa/server/index.d.mts\",\n \"import\": \"./dist/pwa/server/index.mjs\",\n \"default\": \"./dist/pwa/server/index.mjs\"\n },\n \"./pwa/server/routes\": {\n \"types\": \"./dist/pwa/server/routes.d.mts\",\n \"import\": \"./dist/pwa/server/routes.mjs\",\n \"default\": \"./dist/pwa/server/routes.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 \"djangocfg-pwa\": \"./dist/pwa/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 \"ai-docs\": \"tsx src/ai/cli.ts\",\n \"pwa\": \"tsx src/pwa/cli.ts\"\n },\n \"peerDependencies\": {\n \"next\": \"^16.0.10\"\n },\n \"dependencies\": {\n \"@serwist/next\": \"^9.2.3\",\n \"@serwist/sw\": \"^9.2.3\",\n \"chalk\": \"^5.3.0\",\n \"conf\": \"^15.0.2\",\n \"consola\": \"^3.4.2\",\n \"semver\": \"^7.7.3\",\n \"serwist\": \"^9.2.3\",\n \"web-push\": \"^3.6.7\"\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/web-push\": \"^3.6.4\",\n \"@types/webpack\": \"^5.28.5\",\n \"@vercel/og\": \"^0.8.5\",\n \"eslint\": \"^9.37.0\",\n \"lucide-react\": \"^0.545.0\",\n \"tsup\": \"^8.0.1\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"^5.9.3\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}","/**\n * PWA (Progressive Web App) Plugin\n *\n * Configures Serwist for service worker and offline support\n * Modern PWA solution for Next.js 15+ with App Router\n *\n * @see https://serwist.pages.dev/\n */\n\nimport type { NextConfig } from 'next';\nimport { consola } from 'consola';\n\nexport interface PWAPluginOptions {\n /**\n * Destination directory for service worker files\n * @default 'public'\n * @deprecated Use swDest instead\n */\n dest?: string;\n\n /**\n * Path to service worker source file (relative to project root)\n * @default 'app/sw.ts'\n */\n swSrc?: string;\n\n /**\n * Destination for compiled service worker\n * @default 'public/sw.js'\n */\n swDest?: string;\n\n /**\n * Disable PWA completely\n * @default false in production, true in development\n * @example disable: process.env.NODE_ENV === 'development'\n */\n disable?: boolean;\n\n /**\n * Cache on navigation - cache pages when navigating\n * @default true\n */\n cacheOnNavigation?: boolean;\n\n /**\n * Reload app when device goes back online\n * @default true\n */\n reloadOnOnline?: boolean;\n\n /**\n * Additional Serwist options\n * @see https://serwist.pages.dev/docs/next/configuring\n */\n serwistOptions?: Record<string, any>;\n}\n\n/**\n * Add PWA configuration to Next.js config using Serwist\n *\n * @example Basic usage\n * ```ts\n * import { createBaseNextConfig, withPWA } from '@djangocfg/nextjs/config';\n *\n * const nextConfig = createBaseNextConfig({...});\n *\n * export default withPWA(nextConfig, {\n * swSrc: 'app/sw.ts',\n * disable: process.env.NODE_ENV === 'development',\n * });\n * ```\n *\n * @example Integrated with createBaseNextConfig\n * ```ts\n * import { createBaseNextConfig } from '@djangocfg/nextjs/config';\n *\n * const config = createBaseNextConfig({\n * pwa: {\n * swSrc: 'app/sw.ts',\n * disable: false,\n * },\n * });\n *\n * export default config;\n * ```\n */\nexport function withPWA(\n nextConfig: NextConfig,\n options: PWAPluginOptions = {}\n): NextConfig {\n const isDev = process.env.NODE_ENV === 'development';\n const isStaticBuild = process.env.NEXT_PUBLIC_STATIC_BUILD === 'true';\n\n // Determine if PWA should be disabled:\n // - Explicitly disabled via options\n // - In development mode (default)\n // - Static build (output: 'export' doesn't support service workers)\n const shouldDisable = options.disable !== undefined\n ? options.disable\n : (isDev || isStaticBuild);\n\n const defaultOptions: PWAPluginOptions = {\n swSrc: 'app/sw.ts',\n swDest: 'public/sw.js',\n disable: shouldDisable,\n cacheOnNavigation: true,\n reloadOnOnline: true,\n ...options,\n };\n\n try {\n // Suppress Turbopack warning - it only applies to dev mode, not production builds\n // The warning is misleading when running `next build` with Turbopack\n // See: https://github.com/serwist/serwist/issues/54\n if (!process.env.SERWIST_SUPPRESS_TURBOPACK_WARNING) {\n process.env.SERWIST_SUPPRESS_TURBOPACK_WARNING = '1';\n }\n\n const withSerwistInit = require('@serwist/next').default;\n\n const withSerwist = withSerwistInit({\n swSrc: defaultOptions.swSrc,\n swDest: defaultOptions.swDest,\n disable: defaultOptions.disable,\n cacheOnNavigation: defaultOptions.cacheOnNavigation,\n reloadOnOnline: defaultOptions.reloadOnOnline,\n ...defaultOptions.serwistOptions,\n });\n\n return withSerwist(nextConfig);\n } catch (error) {\n consola.error('Failed to configure Serwist:', error);\n return nextConfig;\n }\n}\n\n/**\n * Get service worker template content\n *\n * Returns ready-to-use service worker code for app/sw.ts\n *\n * @example\n * ```ts\n * import { getServiceWorkerTemplate } from '@djangocfg/nextjs/config';\n *\n * // Copy this to your app/sw.ts file\n * console.log(getServiceWorkerTemplate());\n * ```\n */\nexport function getServiceWorkerTemplate(): string {\n return `/**\n * Service Worker (Serwist)\n *\n * Modern PWA service worker using Serwist\n */\n\nimport { defaultCache } from '@serwist/next/worker';\nimport { Serwist } from 'serwist';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndeclare const self: any;\n\nconst serwist = new Serwist({\n // Precache entries injected by Serwist build plugin\n precacheEntries: self.__SW_MANIFEST,\n\n // Skip waiting - activate new SW immediately\n skipWaiting: true,\n\n // Take control of all clients immediately\n clientsClaim: true,\n\n // Enable navigation preload for faster loads\n navigationPreload: true,\n\n // Use default Next.js runtime caching strategies\n runtimeCaching: defaultCache,\n\n // Fallback pages for offline\n fallbacks: {\n entries: [\n {\n url: '/_offline',\n matcher({ request }) {\n return request.destination === 'document';\n },\n },\n ],\n },\n});\n\nserwist.addEventListeners();\n`;\n}\n\n// Backward compatibility exports (deprecated)\nexport const defaultRuntimeCaching = [];\nexport function createApiCacheRule() {\n consola.warn('createApiCacheRule is deprecated with Serwist. Use defaultCache from @serwist/next/worker');\n return {};\n}\nexport function createStaticAssetRule() {\n consola.warn('createStaticAssetRule is deprecated with Serwist. Use defaultCache from @serwist/next/worker');\n return {};\n}\nexport function createCdnCacheRule() {\n consola.warn('createCdnCacheRule is deprecated with Serwist. Use defaultCache from @serwist/next/worker');\n return {};\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 * 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';\n\nimport { isDev, isStaticBuild } from '../utils/env';\nimport { getPackagesForContext, OPTIONAL_PACKAGES } from './definitions';\n\nimport type { PackageDefinition } from './definitions';\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 * 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 * 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 * 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 * Dev Startup Webpack Plugin\n *\n * Handles banner display, version checking, and package updates.\n */\n\nimport type { Compiler } from 'webpack';\nimport chalk from 'chalk';\n\nimport { AI_DOCS_HINT } from '../../ai/constants';\nimport { DJANGO_CFG_BANNER } from '../constants';\nimport { checkAndInstallPackages } from '../packages/installer';\nimport { checkAndUpdatePackages } from '../packages/updater';\nimport { getCurrentVersion } from '../utils/version';\n\n// Track if startup tasks were already run (persists across HMR)\nlet startupDone = false;\n\nexport interface DevStartupPluginOptions {\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 }\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. Check PWA setup\n this.checkPWASetup();\n\n // 4. Print AI docs hint\n console.log(chalk.magenta(` ${AI_DOCS_HINT}\\n`));\n\n // 5. 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 // 6. 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 checkPWASetup(): void {\n const fs = require('fs');\n const path = require('path');\n\n const cwd = process.cwd();\n const swPath = path.join(cwd, 'app', 'sw.ts');\n const manifestPath = path.join(cwd, 'app', 'manifest.ts');\n\n const hasSW = fs.existsSync(swPath);\n const hasManifest = fs.existsSync(manifestPath);\n\n if (hasSW || hasManifest) {\n console.log(chalk.cyan(' 📱 PWA Configuration:'));\n\n if (hasSW) {\n console.log(chalk.green(' ✓ Service Worker: app/sw.ts'));\n } else {\n console.log(chalk.yellow(' ⚠ Service Worker: not found'));\n }\n\n if (hasManifest) {\n console.log(chalk.green(' ✓ Manifest: app/manifest.ts'));\n } else {\n console.log(chalk.yellow(' ⚠ Manifest: not found'));\n }\n\n console.log(chalk.dim(' → Check: DevTools → Application → Service Workers'));\n console.log(chalk.dim(' → Test push: import from @djangocfg/nextjs/pwa'));\n }\n }\n}\n\n/**\n * Reset plugin state (useful for tests)\n */\nexport function resetDevStartupState(): void {\n startupDone = 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 * Package Installer\n *\n * Provides auto-installation functionality with user confirmation and progress indication.\n */\n\nimport chalk from 'chalk';\nimport { execSync, spawn } from 'child_process';\nimport Conf from 'conf';\nimport consola from 'consola';\nimport { createInterface } from 'readline';\n\nimport { isCI } from '../utils/env';\nimport { getMissingPackages } from './checker';\n\nimport type { MissingPackage } from './checker';\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 Updater\n *\n * Checks for outdated @djangocfg/* packages and offers to update them.\n */\n\nimport chalk from 'chalk';\nimport { spawn } from 'child_process';\nimport Conf from 'conf';\nimport consola from 'consola';\nimport { createRequire } from 'module';\nimport { join } from 'path';\nimport { createInterface } from 'readline';\nimport semver from 'semver';\n\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 * Version Checking Utilities\n */\n\nimport chalk from 'chalk';\nimport Conf from 'conf';\nimport consola from 'consola';\nimport semver from 'semver';\n\nimport { DJANGOCFG_PACKAGES, PACKAGE_NAME, VERSION_CACHE_TTL_MS } 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 * 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 * 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 { type PWAPluginOptions, withPWA } from '../pwa/plugin';\nimport { DEFAULT_OPTIMIZE_PACKAGES, DEFAULT_TRANSPILE_PACKAGES } from './constants';\nimport { addCompressionPlugins } from './plugins/compression';\nimport { DevStartupPlugin } from './plugins/devStartup';\nimport { deepMerge } from './utils/deepMerge';\nimport { getApiUrl, getBasePath, getSiteUrl, isDev, isStaticBuild } from './utils/env';\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 /** 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 /**\n * PWA configuration options\n * Set to false to disable PWA, or provide custom options\n * @default { enabled: true (in production), disable: true (in development) }\n */\n pwa?: PWAPluginOptions | false;\n /** Turbopack configuration (Next.js 16+ default bundler) */\n turbopack?: NextConfig['turbopack'];\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 /** Additional redirects (merged with base URL normalization redirects) */\n redirects?: NextConfig['redirects'];\n /** Additional headers (merged with base CORS/security headers) */\n headers?: NextConfig['headers'];\n /** Additional rewrites */\n rewrites?: NextConfig['rewrites'];\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 // Merge with user-provided headers\n const userHeaders = options.headers ? await options.headers() : [];\n return [...headers, ...userHeaders];\n },\n\n // Rewrites (user-provided only)\n ...(options.rewrites && {\n rewrites: options.rewrites,\n }),\n\n // Redirects for URL normalization\n // Fixes \"Failed to construct 'URL': Invalid URL\" error with double slashes\n async redirects() {\n const baseRedirects = [\n // Normalize double slashes in URL path (e.g., /foo//bar -> /foo/bar)\n {\n source: '/:path*(//)/:rest*',\n destination: '/:path*/:rest*',\n permanent: true,\n },\n // Handle root double slash (e.g., // -> /)\n {\n source: '//',\n destination: '/',\n permanent: true,\n },\n ];\n\n // Merge with user-provided redirects\n const userRedirects = options.redirects ? await options.redirects() : [];\n return [...baseRedirects, ...userRedirects];\n },\n\n // Transpile packages (merge with user-provided)\n transpilePackages: [\n ...DEFAULT_TRANSPILE_PACKAGES,\n ...(options.transpilePackages || []),\n ],\n\n // Turbopack configuration (Next.js 16+ default bundler)\n // Always set turbopack config to silence Next.js 16 warning about webpack config\n turbopack: options.turbopack || {},\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 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 let 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).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 delete (finalConfig as any).openBrowser;\n // Note: turbopack is a valid NextConfig option, don't delete it\n\n // Apply PWA wrapper only if explicitly configured (opt-in)\n // PWA requires sw.ts file in the app, so apps must explicitly enable it\n if (options.pwa) {\n finalConfig = withPWA(finalConfig, options.pwa);\n }\n delete (finalConfig as any).pwa;\n\n return finalConfig;\n}\n"],"mappings":"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","names":["isDev","isStaticBuild","chalk","consola","isDev","text","consola","chalk","spawn","Conf","consola","createRequire","join","createInterface","Conf","SPINNER_FRAMES","join","createRequire","createSpinner","chalk","text","askConfirmation","createInterface","spawn","consola","chalk","Conf","consola","semver","Conf","fetchLatestVersion","semver","consola","chalk","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.65",
17
+ version: "2.1.67",
18
18
  description: "Next.js server utilities: sitemap, health, OG images, contact forms, navigation, config",
19
19
  keywords: [
20
20
  "nextjs",