{"version":3,"file":"session.cjs","names":["pathToFileURL","fetchBosConfigFromFastKv","existsSync","readFileSync","isAbsolute","resolve","isAppDescriptorPath","loadAppDescriptorConfig","parseAppDescriptorModule","ConfigLoadError","CircularExtendsError","parseBosRef","resolveSourceDir","dirname","resolveExtendsRef","parseExtendsTarget","getConfigBaseDir","mergeBosConfigWithExtends","ConfigExtendsError","findConfigPath","defaultConfigEnv","ConfigNotfoundError","runWithConfigWarningSink","buildRuntimeConfig","readWorkspaceCatalog","join","DEV_OVERLAY_FILENAME","parseDevOverlayModule","applyDevOverlay","resolveConfigComposableEntries","BosConfigSchema","buildRuntimePluginsForConfig"],"sources":["../../src/resolution/session.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { readWorkspaceCatalog, resolveSourceDir } from \"../cli/init\";\nimport { parseBosRef } from \"../cli/utils/helpers\";\nimport {\n  BosConfigSchema,\n  type BosEnv,\n  buildRuntimeConfig,\n  buildRuntimePluginsForConfig,\n  CircularExtendsError,\n  ConfigExtendsError,\n  ConfigLoadError,\n  ConfigNotfoundError,\n  DEV_OVERLAY_FILENAME,\n  defaultConfigEnv,\n  findConfigPath,\n  getConfigBaseDir,\n  isAppDescriptorPath,\n  loadAppDescriptorConfig,\n  parseAppDescriptorModule,\n  parseDevOverlayModule,\n  parseExtendsTarget,\n  resolveConfigComposableEntries,\n  runWithConfigWarningSink,\n} from \"../config\";\nimport { applyDevOverlay } from \"../descriptor/resolve\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport { mergeBosConfigWithExtends, resolveExtendsRef } from \"../merge\";\nimport type {\n  BosConfig,\n  BosConfigInput,\n  ExtendsConfig,\n  RuntimeConfig,\n  RuntimePluginConfig,\n} from \"../types\";\n\nexport interface ResolutionRequest {\n  cwd?: string;\n  path?: string;\n  bosUrl?: string;\n  account?: string;\n  gateway?: string;\n  registry?: string;\n  sourceDir?: string;\n  env?: BosEnv;\n  remotePlugins?: string[];\n  collectCatalogs?: boolean;\n}\n\nexport interface ResolutionIo {\n  fetchBosConfig?: (bosUrl: string, registry?: string) => Promise<unknown>;\n  readFileOrNull?: (path: string) => Promise<string | null>;\n  importModule?: (path: string) => Promise<Record<string, unknown>>;\n}\n\nexport interface RuntimeSources {\n  uiSource?: \"local\" | \"remote\";\n  apiSource?: \"local\" | \"remote\";\n  authSource?: \"local\" | \"remote\";\n  hostSource?: \"local\" | \"remote\";\n  env?: \"development\" | \"production\";\n  plugins?: Record<string, unknown>;\n}\n\nexport interface WalkLink {\n  ref: string;\n  config: BosConfigInput;\n  baseDir: string;\n  sourceDir?: string;\n  isLeaf: boolean;\n}\n\ninterface ResolvedIo {\n  fetchBosConfig: (bosUrl: string, registry?: string) => Promise<unknown>;\n  readFileOrNull: (path: string) => Promise<string | null>;\n  importModule: (path: string) => Promise<Record<string, unknown>>;\n}\n\ninterface EntryDispatch {\n  entry: string;\n  baseDir: string;\n  root: string;\n  path: string | null;\n  remote: boolean;\n}\n\ninterface WalkOptions {\n  env: BosEnv;\n  registry?: string;\n  io: ResolvedIo;\n  collectCatalogs: boolean;\n  visit?: (link: WalkLink) => Promise<void>;\n  registerCleanup?: (fn: () => Promise<void>) => void;\n}\n\ninterface SessionParts {\n  config: BosConfig;\n  runtime: RuntimeConfig;\n  root: string;\n  path: string | null;\n  chain: string[];\n  rawConfig: BosConfigInput | null;\n  catalog: Record<string, string> | null;\n  repository: string | undefined;\n  env: BosEnv;\n  warnings: string[];\n}\n\nasync function defaultImportModule(path: string): Promise<Record<string, unknown>> {\n  return import(/* webpackIgnore: true */ pathToFileURL(path).href);\n}\n\nfunction resolveIo(io?: ResolutionIo): ResolvedIo {\n  return {\n    fetchBosConfig:\n      io?.fetchBosConfig ??\n      (async (bosUrl, registry) => fetchBosConfigFromFastKv(bosUrl, registry)),\n    readFileOrNull:\n      io?.readFileOrNull ??\n      (async (path) => (existsSync(path) ? readFileSync(path, \"utf-8\") : null)),\n    importModule: io?.importModule ?? defaultImportModule,\n  };\n}\n\nasync function loadNodeConfig(\n  ref: string,\n  baseDir: string,\n  io: ResolvedIo,\n  registry?: string,\n): Promise<BosConfigInput> {\n  if (ref.startsWith(\"bos://\")) {\n    return (await io.fetchBosConfig(ref, registry)) as BosConfigInput;\n  }\n\n  const resolvedPath = isAbsolute(ref) ? ref : resolve(baseDir, ref);\n  if (isAppDescriptorPath(resolvedPath)) {\n    return io.importModule === defaultImportModule\n      ? loadAppDescriptorConfig(resolvedPath)\n      : parseAppDescriptorModule(await io.importModule(resolvedPath), resolvedPath);\n  }\n\n  const content = await io.readFileOrNull(resolvedPath);\n  if (content === null) {\n    throw new ConfigLoadError({\n      path: resolvedPath,\n      message: `Config file not found: ${resolvedPath}`,\n    });\n  }\n  return JSON.parse(content) as BosConfigInput;\n}\n\nasync function walkExtends(\n  ref: string,\n  baseDir: string,\n  visited: Set<string>,\n  chain: string[],\n  options: WalkOptions,\n): Promise<BosConfigInput> {\n  if (visited.has(ref)) {\n    throw new CircularExtendsError({\n      chain: [...visited, ref],\n      message: `Circular extends detected: ${[...visited, ref].join(\" -> \")}`,\n    });\n  }\n\n  let config: BosConfigInput;\n  let nodeBaseDir = baseDir;\n  let sourceDir: string | undefined;\n\n  if (ref.startsWith(\"bos://\") && options.collectCatalogs) {\n    const parsed = parseBosRef(ref);\n    if (!parsed) {\n      throw new ConfigLoadError({ path: ref, message: `Invalid bos ref: ${ref}` });\n    }\n    const sourceResult = await resolveSourceDir({\n      extendsAccount: parsed.account,\n      extendsGateway: parsed.gateway,\n    });\n    config = sourceResult.parentConfig as BosConfigInput;\n    sourceDir = sourceResult.sourceDir || undefined;\n    options.registerCleanup?.(sourceResult.cleanup);\n    nodeBaseDir = sourceDir ?? baseDir;\n  } else if (ref.startsWith(\"bos://\")) {\n    config = await loadNodeConfig(ref, baseDir, options.io, options.registry);\n  } else {\n    const resolvedPath = isAbsolute(ref) ? ref : resolve(baseDir, ref);\n    nodeBaseDir = dirname(resolvedPath);\n    config = await loadNodeConfig(ref, nodeBaseDir, options.io, options.registry);\n  }\n\n  chain.push(ref);\n\n  const extendsRef = config.extends\n    ? resolveExtendsRef(config.extends as string | ExtendsConfig, options.env)\n    : undefined;\n\n  if (!extendsRef) {\n    await options.visit?.({ ref, config, baseDir: nodeBaseDir, sourceDir, isLeaf: true });\n    return config;\n  }\n\n  const parsedParentRef = parseExtendsTarget(extendsRef);\n  const parentBaseDir = getConfigBaseDir(parsedParentRef.configPath, nodeBaseDir);\n\n  if (\n    options.collectCatalogs &&\n    !canResolveExtendsRef(parsedParentRef.configPath, sourceDir ?? nodeBaseDir)\n  ) {\n    await options.visit?.({ ref, config, baseDir: nodeBaseDir, sourceDir, isLeaf: true });\n    return config;\n  }\n\n  const nextVisited = new Set(visited);\n  nextVisited.add(ref);\n  const parent = await walkExtends(\n    parsedParentRef.configPath,\n    parentBaseDir,\n    nextVisited,\n    chain,\n    options,\n  );\n\n  await options.visit?.({ ref, config, baseDir: nodeBaseDir, sourceDir, isLeaf: false });\n  return mergeBosConfigWithExtends(parent, config);\n}\n\nfunction canResolveExtendsRef(parentRef: string, baseDir: string | undefined): boolean {\n  if (parentRef.startsWith(\"bos://\")) {\n    return parseBosRef(parentRef) !== null;\n  }\n  if (!baseDir) {\n    return false;\n  }\n  return existsSync(resolve(baseDir, parentRef));\n}\n\nfunction dispatchEntry(request: ResolutionRequest | undefined, cwd: string): EntryDispatch | null {\n  if (request?.path) {\n    const configPath = request.path;\n    if (configPath.startsWith(\"bos://\")) {\n      return { entry: configPath, baseDir: cwd, root: cwd, path: configPath, remote: true };\n    }\n    const baseDir = dirname(configPath);\n    return { entry: configPath, baseDir, root: baseDir, path: configPath, remote: false };\n  }\n\n  if (request?.bosUrl) {\n    return { entry: request.bosUrl, baseDir: cwd, root: cwd, path: null, remote: true };\n  }\n\n  if (request?.account) {\n    if (!request.gateway) {\n      throw new ConfigExtendsError({\n        message: `Remote account \"${request.account}\" requires a gateway`,\n      });\n    }\n    return {\n      entry: `bos://${request.account}/${request.gateway}`,\n      baseDir: cwd,\n      root: cwd,\n      path: null,\n      remote: true,\n    };\n  }\n\n  if (request?.sourceDir) {\n    const sourceRoot = resolve(request.sourceDir);\n    const configPath = findConfigPath(sourceRoot);\n    if (!configPath) return null;\n    const baseDir = dirname(configPath);\n    return { entry: configPath, baseDir, root: sourceRoot, path: configPath, remote: false };\n  }\n\n  const configPath = findConfigPath(cwd);\n  if (!configPath) {\n    return null;\n  }\n  const baseDir = dirname(configPath);\n  return { entry: configPath, baseDir, root: baseDir, path: configPath, remote: false };\n}\n\nfunction isConfigNotFound(error: unknown): boolean {\n  return error instanceof Error && error.message.startsWith(\"No config found for \");\n}\n\nexport class ResolutionSession {\n  readonly config: BosConfig | null;\n  readonly runtime: RuntimeConfig | null;\n  readonly root: string;\n  readonly path: string | null;\n  readonly chain: readonly string[];\n  readonly rawConfig: BosConfigInput | null;\n  readonly catalog: Record<string, string> | null;\n  readonly repository: string | undefined;\n\n  #env: BosEnv;\n  #warnings: string[];\n\n  constructor(parts: SessionParts) {\n    this.config = parts.config;\n    this.runtime = parts.runtime;\n    this.root = parts.root;\n    this.path = parts.path;\n    this.chain = parts.chain;\n    this.rawConfig = parts.rawConfig;\n    this.catalog = parts.catalog;\n    this.repository = parts.repository;\n    this.#env = parts.env;\n    this.#warnings = parts.warnings;\n  }\n\n  static fromParts(parts: {\n    config: BosConfig;\n    runtime: RuntimeConfig;\n    root: string;\n    source?: { path?: string; extended?: string[]; remote?: boolean };\n    warnings?: string[];\n  }): ResolutionSession {\n    return new ResolutionSession({\n      config: parts.config,\n      runtime: parts.runtime,\n      root: parts.root,\n      path: parts.source?.path ?? null,\n      chain: parts.source?.extended ?? [],\n      rawConfig: null,\n      catalog: null,\n      repository: undefined,\n      env: defaultConfigEnv(),\n      warnings: [...(parts.warnings ?? [])],\n    });\n  }\n\n  get warnings(): readonly string[] {\n    const drained = [...this.#warnings];\n    this.#warnings.length = 0;\n    return drained;\n  }\n\n  async buildRuntime(sources?: RuntimeSources): Promise<RuntimeConfig> {\n    if (!this.config) {\n      throw new ConfigNotfoundError({\n        message: \"No config loaded in this resolution session\",\n      });\n    }\n    const config = this.config;\n    const env = sources?.env ?? this.#env;\n    return runWithConfigWarningSink(this.#warnings, () =>\n      buildRuntimeConfig(config, this.root, env, {\n        plugins: (sources?.plugins ?? {}) as Record<string, RuntimePluginConfig>,\n        uiSource: sources?.uiSource,\n        apiSource: sources?.apiSource,\n        authSource: sources?.authSource,\n        hostSource: sources?.hostSource,\n      }),\n    );\n  }\n}\n\n/**\n * Opens a resolution session for the requested config source. In development,\n * a local leaf's `bos.dev.ts` overlay (beside the discovered entry config) is\n * merged child-wins over the extended input before parsing; overlays are never\n * read for `bos://` entries or in production/staging.\n */\nexport async function openResolution(\n  request?: ResolutionRequest,\n  io?: ResolutionIo,\n): Promise<ResolutionSession | null> {\n  const resolvedIo = resolveIo(io);\n  const env = request?.env ?? defaultConfigEnv();\n  const runtimeEnv: BosEnv = env === \"staging\" ? \"production\" : env;\n  const cwd = request?.cwd ?? process.cwd();\n  const collectCatalogs = request?.collectCatalogs === true;\n\n  const warnings: string[] = [];\n  const cleanups: Array<() => Promise<void>> = [];\n\n  try {\n    const parts = await runWithConfigWarningSink(warnings, async () => {\n      const dispatch = dispatchEntry(request, cwd);\n      if (!dispatch) return null;\n\n      const chain: string[] = [];\n      const catalogs: Record<string, string>[] = [];\n      let repository: string | undefined;\n      let rawConfig: BosConfigInput | undefined;\n\n      try {\n        const mergedRaw = await walkExtends(dispatch.entry, dispatch.baseDir, new Set(), chain, {\n          env,\n          registry: request?.registry,\n          io: resolvedIo,\n          collectCatalogs,\n          registerCleanup: (fn) => cleanups.push(fn),\n          visit: async (link) => {\n            if (link.ref === dispatch.entry) {\n              rawConfig = link.config;\n            }\n            if (!collectCatalogs) return;\n            catalogs.push(link.sourceDir ? readWorkspaceCatalog(link.sourceDir) : {});\n            const repositoryValue = (link.config as Record<string, unknown>).repository;\n            if (typeof repositoryValue === \"string\") {\n              repository = repositoryValue;\n            }\n          },\n        });\n\n        let overlayMerged = mergedRaw;\n        if (env === \"development\" && !dispatch.remote) {\n          const overlayPath = join(dirname(dispatch.entry), DEV_OVERLAY_FILENAME);\n          if ((await resolvedIo.readFileOrNull(overlayPath)) !== null) {\n            const overlay = parseDevOverlayModule(\n              await resolvedIo.importModule(overlayPath),\n              overlayPath,\n            );\n            overlayMerged = applyDevOverlay(mergedRaw, overlay);\n          }\n        }\n\n        const config = await resolveConfigComposableEntries(\n          BosConfigSchema.parse(overlayMerged),\n          dispatch.baseDir,\n          runtimeEnv,\n        );\n        const pluginRuntime =\n          (await buildRuntimePluginsForConfig(\n            config,\n            dispatch.baseDir,\n            runtimeEnv,\n            request?.remotePlugins,\n          )) ?? {};\n        const runtime = await buildRuntimeConfig(config, dispatch.baseDir, runtimeEnv, {\n          plugins: pluginRuntime,\n        });\n\n        return {\n          config,\n          runtime,\n          root: dispatch.root,\n          path: dispatch.path,\n          chain,\n          rawConfig: rawConfig ?? null,\n          catalog: collectCatalogs ? Object.assign({}, ...[...catalogs].reverse()) : null,\n          repository,\n        } satisfies Omit<SessionParts, \"env\" | \"warnings\">;\n      } catch (error) {\n        if (dispatch.remote && isConfigNotFound(error)) {\n          return null;\n        }\n        throw error;\n      }\n    });\n\n    if (!parts) return null;\n\n    return new ResolutionSession({\n      ...parts,\n      env: runtimeEnv,\n      warnings,\n    });\n  } finally {\n    for (const cleanup of [...cleanups].reverse()) {\n      await cleanup();\n    }\n  }\n}\n\nexport async function walkExtendsChain(\n  entry: string,\n  options: {\n    env?: BosEnv;\n    io?: ResolutionIo;\n    registry?: string;\n    collectCatalogs?: boolean;\n    visit: (link: WalkLink) => Promise<void>;\n    registerCleanup?: (fn: () => Promise<void>) => void;\n  },\n): Promise<{ chain: string[]; config: BosConfigInput }> {\n  const baseDir = entry.startsWith(\"bos://\") ? process.cwd() : dirname(entry);\n  const chain: string[] = [];\n  const ownedCleanups: Array<() => Promise<void>> = [];\n  try {\n    const config = await walkExtends(entry, baseDir, new Set(), chain, {\n      env: options.env ?? \"development\",\n      registry: options.registry,\n      io: resolveIo(options.io),\n      collectCatalogs: options.collectCatalogs === true,\n      visit: options.visit,\n      registerCleanup: options.registerCleanup ?? ((fn) => ownedCleanups.push(fn)),\n    });\n    return { chain, config };\n  } finally {\n    for (const cleanup of [...ownedCleanups].reverse()) {\n      await cleanup();\n    }\n  }\n}\n\n/**\n * @internal — resolves the fully merged (parent-merged, un-parsed)\n * `BosConfigInput` for a config entry. Used by config.ts's\n * `resolveComposableReference` for plugin-entry extends resolution.\n */\nexport async function resolveMergedConfigInput(\n  entry: string,\n  options?: { baseDir?: string; env?: BosEnv; io?: ResolutionIo; registry?: string },\n): Promise<BosConfigInput> {\n  const baseDir = options?.baseDir ?? process.cwd();\n  return walkExtends(entry, baseDir, new Set(), [], {\n    env: options?.env ?? \"development\",\n    registry: options?.registry,\n    io: resolveIo(options?.io),\n    collectCatalogs: false,\n  });\n}\n"],"mappings":"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"}