{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/config/index.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { loadConfigFromFile } from \"vite\";\nimport type { Adapter } from \"../adapters/index.js\";\nimport type { ImageFormat } from \"../image/index.js\";\nimport type { NixKitIntegration } from \"../integrations/index.js\";\nimport { runIntegrationHook } from \"../integrations/index.js\";\n\nexport type NixOutputMode = \"static\" | \"server\" | \"hybrid\";\nexport type TrailingSlashMode = \"always\" | \"never\" | \"ignore\";\n\nexport interface NixConfig {\n  root?: string;\n  appDir?: string;\n  islandsDir?: string;\n  contentDir?: string;\n  publicDir?: string;\n  outDir?: string;\n  site?: string;\n  base?: string;\n  trailingSlash?: TrailingSlashMode;\n  output?: NixOutputMode;\n  adapter?: Adapter;\n  images?: {\n    formats?: ImageFormat[];\n    quality?: number;\n    strict?: boolean;\n  };\n  cache?: {\n    dir?: string;\n    defaultRevalidate?: number;\n  };\n  security?: {\n    allowedOrigins?: string[];\n    strictOrigin?: boolean;\n    bodyLimit?: number;\n    /** Security response headers. Set to `false` to disable defaults. */\n    headers?: SecurityHeadersConfig | false;\n  };\n  router?: {\n    enabled?: boolean;\n    prefetch?: boolean;\n  };\n  integrations?: NixKitIntegration[];\n}\n\n/** Security headers configuration (runtime-security §14). */\nexport interface SecurityHeadersConfig {\n  /** X-Content-Type-Options: nosniff. Default: true. */\n  noSniff?: boolean;\n  /** Referrer-Policy. Default: \"strict-origin-when-cross-origin\". */\n  referrerPolicy?: string;\n  /**\n   * Content-Security-Policy. Set to a string to enable.\n   * Use \"nonce\" placeholder to inject per-request nonces.\n   */\n  contentSecurityPolicy?: string;\n  /** Strict-Transport-Security. Only applied under HTTPS. Default: unset. */\n  hsts?: string | true;\n  /** X-Frame-Options or CSP frame-ancestors. Default: \"SAMEORIGIN\". */\n  frameAncestors?: string;\n  /** Permissions-Policy. Default: unset. */\n  permissionsPolicy?: string;\n}\n\nexport interface ResolvedNixConfig {\n  root: string;\n  appDir: string;\n  islandsDir: string;\n  contentDir: string;\n  publicDir: string;\n  outDir: string;\n  site?: string;\n  base: string;\n  trailingSlash: TrailingSlashMode;\n  output: NixOutputMode;\n  adapter?: Adapter;\n  images: {\n    formats: ImageFormat[];\n    quality: number;\n    strict: boolean;\n  };\n  cache: {\n    dir: string;\n    defaultRevalidate?: number;\n  };\n  security: {\n    allowedOrigins: string[];\n    strictOrigin: boolean;\n    bodyLimit: number;\n    headers: SecurityHeadersConfig | false;\n  };\n  router: {\n    enabled: boolean;\n    prefetch: boolean;\n  };\n  integrations: NixKitIntegration[];\n  configFile?: string;\n}\n\nexport interface LoadNixConfigOptions {\n  root?: string;\n  configFile?: string;\n  command?: \"dev\" | \"build\" | \"preview\" | \"start\" | \"check\" | \"routes\" | \"doctor\";\n  mode?: string;\n  overrides?: NixConfig;\n}\n\nexport function defineConfig(config: NixConfig): NixConfig {\n  return config;\n}\n\nexport async function loadNixConfig(options: LoadNixConfigOptions = {}): Promise<ResolvedNixConfig> {\n  const initialRoot = resolve(options.root ?? process.cwd());\n  const configFile = options.configFile\n    ? resolve(initialRoot, options.configFile)\n    : await findConfigFile(initialRoot);\n  let loaded: NixConfig = {};\n\n  if (configFile) {\n    const result = await loadConfigFromFile(\n      { command: options.command === \"build\" ? \"build\" : \"serve\", mode: options.mode ?? \"development\" },\n      configFile,\n      initialRoot,\n    );\n    if (!result) throw new Error(`[nix-js-kit] Could not load config: ${configFile}`);\n    loaded = result.config as NixConfig;\n  }\n\n  const merged = mergeConfig(loaded, options.overrides ?? {});\n  const root = resolve(initialRoot, merged.root ?? \".\");\n  const resolved = resolveConfig(root, merged, configFile);\n  await runIntegrationHook(resolved.integrations, \"config\", [\n    resolved as unknown as Record<string, unknown>,\n    { root, command: options.command ?? \"dev\" },\n  ]);\n  return resolved;\n}\n\nfunction resolveConfig(root: string, config: NixConfig, configFile?: string): ResolvedNixConfig {\n  if (config.site) new URL(config.site);\n  const base = normalizeBase(config.base ?? \"/\");\n  const imageQuality = config.images?.quality ?? 80;\n  if (!Number.isFinite(imageQuality) || imageQuality < 1 || imageQuality > 100) {\n    throw new Error(\"[nix-js-kit] images.quality must be between 1 and 100\");\n  }\n\n  return {\n    root,\n    appDir: resolveInside(root, config.appDir ?? \"src/app\", \"appDir\"),\n    islandsDir: resolveInside(root, config.islandsDir ?? \"src/islands\", \"islandsDir\"),\n    contentDir: resolveInside(root, config.contentDir ?? \"src/content\", \"contentDir\"),\n    publicDir: resolveInside(root, config.publicDir ?? \"public\", \"publicDir\"),\n    outDir: resolveInside(root, config.outDir ?? \"dist\", \"outDir\"),\n    site: config.site,\n    base,\n    trailingSlash: config.trailingSlash ?? \"ignore\",\n    output: config.output ?? \"static\",\n    adapter: config.adapter,\n    images: {\n      formats: config.images?.formats ?? [\"webp\", \"avif\"],\n      quality: imageQuality,\n      strict: config.images?.strict ?? false,\n    },\n    cache: {\n      dir: resolveInside(root, config.cache?.dir ?? \".nix-js/cache\", \"cache.dir\"),\n      defaultRevalidate: config.cache?.defaultRevalidate,\n    },\n    security: {\n      allowedOrigins: config.security?.allowedOrigins ?? [],\n      strictOrigin: config.security?.strictOrigin ?? false,\n      bodyLimit: config.security?.bodyLimit ?? 1_048_576,\n      headers: config.security?.headers === false\n        ? false\n        : config.security?.headers ?? {},\n    },\n    router: {\n      enabled: config.router?.enabled ?? true,\n      prefetch: config.router?.prefetch ?? true,\n    },\n    integrations: config.integrations ?? [],\n    configFile,\n  };\n}\n\nfunction mergeConfig(base: NixConfig, override: NixConfig): NixConfig {\n  return {\n    ...base,\n    ...override,\n    images: { ...base.images, ...override.images },\n    cache: { ...base.cache, ...override.cache },\n    security: { ...base.security, ...override.security },\n    router: { ...base.router, ...override.router },\n    integrations: override.integrations ?? base.integrations,\n  };\n}\n\nfunction resolveInside(root: string, path: string, name: string): string {\n  const resolved = isAbsolute(path) ? resolve(path) : resolve(root, path);\n  const rel = relative(root, resolved);\n  if (rel === \"..\" || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n    throw new Error(`[nix-js-kit] ${name} must stay inside root: ${resolved}`);\n  }\n  return resolved;\n}\n\nfunction normalizeBase(base: string): string {\n  if (!base.startsWith(\"/\")) throw new Error(\"[nix-js-kit] base must start with /\");\n  return base === \"/\" ? base : `${base.replace(/\\/+$/, \"\")}/`;\n}\n\nconst PREFERRED_CONFIG_FILES = [\"nix-js.config.ts\", \"nix-js.config.js\", \"nix-js.config.mjs\"];\n// Legacy names kept for backward compatibility. Emit a deprecation warning\n// when a project still uses them so authors migrate to `nix-js.config.*`.\nconst LEGACY_CONFIG_FILES = [\"nix.config.ts\", \"nix.config.js\", \"nix.config.mjs\"];\n\nasync function findConfigFile(root: string): Promise<string | undefined> {\n  for (const name of PREFERRED_CONFIG_FILES) {\n    const path = resolve(root, name);\n    try {\n      await access(path);\n      return path;\n    } catch {\n    }\n  }\n  for (const name of LEGACY_CONFIG_FILES) {\n    const path = resolve(root, name);\n    try {\n      await access(path);\n      console.warn(\n        `[nix-js-kit] \"${name}\" is deprecated and will be removed in a future release. ` +\n        `Rename it to \"nix-js.config.${name.split(\".\").slice(1).join(\".\")}\" to keep your config working.`,\n      );\n      return path;\n    } catch {\n    }\n  }\n  return undefined;\n}\n"],"mappings":"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"}