UNPKG

everything-dev

Version:

A consolidated product package for building Module Federation apps with oRPC APIs.

1 lines • 23.5 kB
{"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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"}