{"version":3,"sources":["../../src/core/config.ts"],"names":["findConfigPath","cwd","fileName","CONFIG_FILE_NAMES","configPath","path","fs","error","isEnoentError","findConfig","fileContent","configJson","ConfigSchema","z","loadConfigOrExit","config","logger","chalk","CONFIG_FILE_NAME_JSON","stateDirectoryCache","getStateDirectory","STATE_DIRECTORY_NAME","ensureStateDirExists","stateDirPath","createConfig","projectId","configContent","getProjectId","pkgJsonPath","pkgJson"],"mappings":"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","file":"config.cjs","sourcesContent":["import { z } from 'zod';\nimport path from 'path';\nimport { promises as fs } from 'fs';\nimport { type Config, ConfigSchema } from 'relaycode-core';\nimport { CONFIG_FILE_NAMES, STATE_DIRECTORY_NAME, CONFIG_FILE_NAME_JSON } from '../utils/constants';\nimport { logger, isEnoentError } from '../utils/logger';\nimport chalk from 'chalk';\n\nexport const findConfigPath = async (cwd: string = process.cwd()): Promise<string | null> => {\n  for (const fileName of CONFIG_FILE_NAMES) {\n    const configPath = path.join(cwd, fileName);\n    try {\n      await fs.access(configPath);\n      return configPath;\n    } catch (error) {\n      if (!isEnoentError(error)) {\n        // ignore other errors for now to keep searching\n      }\n    }\n  }\n  return null;\n};\n\nexport const findConfig = async (cwd: string = process.cwd()): Promise<Config | null> => {\n  const configPath = await findConfigPath(cwd);\n  if (!configPath) {\n    return null;\n  }\n  try {\n    const stats = await fs.stat(configPath);\n    if (stats.isDirectory()) {\n      return null; // Path is a directory, not a file\n    }\n    const fileContent = await fs.readFile(configPath, 'utf-8');\n    const configJson = JSON.parse(fileContent);\n    return ConfigSchema.parse(configJson);\n  } catch (error) {\n    if (isEnoentError(error)) {\n      return null;\n    }\n    if (error instanceof z.ZodError) {\n      throw new Error(`Invalid configuration in ${path.basename(configPath)}: ${error.message}`);\n    }\n    throw error;\n  }\n};\n\nexport const loadConfigOrExit = async (cwd: string = process.cwd()): Promise<Config> => {\n  const config = await findConfig(cwd);\n  if (!config) {\n    logger.error(`Configuration file ('${chalk.cyan(CONFIG_FILE_NAME_JSON)}') not found.`);\n    logger.info(`Please run ${chalk.magenta(\"'relay init'\")} to create one.`);\n    process.exit(1);\n  }\n  return config;\n};\n\nconst stateDirectoryCache = new Map<string, boolean>();\n\nexport const getStateDirectory = (cwd: string) => path.resolve(cwd, STATE_DIRECTORY_NAME);\n\nexport const ensureStateDirExists = async (cwd: string = process.cwd()): Promise<void> => {\n  const stateDirPath = getStateDirectory(cwd);\n  if (!stateDirectoryCache.has(stateDirPath)) {\n    await fs.mkdir(stateDirPath, { recursive: true });\n    stateDirectoryCache.set(stateDirPath, true);\n  }\n};\n\nexport const createConfig = async (projectId: string, cwd: string = process.cwd()): Promise<Config> => {\n\n  const defaultConfig = ConfigSchema.parse({ projectId });\n\n  const configContent = {\n    $schema: \"https://relay.noca.pro/schema.json\",\n    ...defaultConfig\n  };\n\n  const configPath = path.join(cwd, CONFIG_FILE_NAME_JSON);\n  await fs.writeFile(configPath, JSON.stringify(configContent, null, 2));\n\n  return configContent;\n};\n\nexport const getProjectId = async (cwd: string = process.cwd()): Promise<string> => {\n  try {\n    const pkgJsonPath = path.join(cwd, 'package.json');\n    const stats = await fs.stat(pkgJsonPath);\n    if (stats.isDirectory()) {\n      throw new Error('Path is a directory, not a file');\n    }\n    const fileContent = await fs.readFile(pkgJsonPath, 'utf-8');\n    const pkgJson = JSON.parse(fileContent);\n    if (pkgJson.name && typeof pkgJson.name === 'string') {\n      return pkgJson.name;\n    }\n  } catch (e) {\n    // Ignore if package.json doesn't exist or is invalid\n  }\n  return path.basename(cwd);\n};\n"]}