everything-dev 1.50.0 → 1.51.1
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.
- package/dist/cli/parse.cjs +4 -1
- package/dist/cli/parse.cjs.map +1 -1
- package/dist/cli/parse.mjs +4 -1
- package/dist/cli/parse.mjs.map +1 -1
- package/dist/cli/sync.cjs +16 -1
- package/dist/cli/sync.cjs.map +1 -1
- package/dist/cli/sync.mjs +16 -1
- package/dist/cli/sync.mjs.map +1 -1
- package/dist/cli/upgrade.cjs +51 -1
- package/dist/cli/upgrade.cjs.map +1 -1
- package/dist/cli/upgrade.mjs +51 -1
- package/dist/cli/upgrade.mjs.map +1 -1
- package/dist/config.cjs +8 -4
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts.map +1 -1
- package/dist/config.d.mts.map +1 -1
- package/dist/config.mjs +8 -4
- package/dist/config.mjs.map +1 -1
- package/dist/contract.d.cts +16 -16
- package/dist/contract.d.mts +16 -16
- package/dist/infra/planner.cjs +7 -0
- package/dist/infra/planner.cjs.map +1 -1
- package/dist/infra/planner.mjs +7 -0
- package/dist/infra/planner.mjs.map +1 -1
- package/dist/plugin.cjs +7 -7
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +7 -7
- package/dist/plugin.d.mts +7 -7
- package/dist/plugin.mjs +7 -7
- package/dist/plugin.mjs.map +1 -1
- package/dist/types.d.cts +2 -2
- package/dist/types.d.mts +2 -2
- package/package.json +2 -2
- package/skills/api-and-auth/SKILL.md +38 -16
- package/skills/plugin-development/SKILL.md +8 -4
package/dist/config.mjs
CHANGED
|
@@ -353,7 +353,7 @@ function buildRuntimeConfig(config, baseDir, env, options) {
|
|
|
353
353
|
const authRuntime = authConfig ? env === "development" ? resolveDevelopmentTarget(authConfig.development, authConfig.production, baseDir, options?.authSource, "app.auth", authExtendsRef) : resolveRuntimeTarget(authConfig.production, baseDir, "remote") : void 0;
|
|
354
354
|
const hostConfig = config.app.host;
|
|
355
355
|
const hostRuntime = env === "development" ? resolveDevelopmentTarget(hostConfig.development, hostConfig.production, baseDir, options?.hostSource, "app.host") : resolveRuntimeTarget(hostConfig.production, baseDir, "remote");
|
|
356
|
-
const hostListeningUrl = env === "development" ? resolveDevelopmentHostUrl(hostConfig.development) : `http://localhost:${
|
|
356
|
+
const hostListeningUrl = env === "development" ? resolveDevelopmentHostUrl(hostConfig.development) : `http://localhost:${DEFAULT_HOST_PORT}`;
|
|
357
357
|
const hostIsRemote = hostRuntime.source === "remote";
|
|
358
358
|
const uiIsRemote = uiRuntime.source === "remote";
|
|
359
359
|
const apiIsRemote = apiRuntime.source === "remote";
|
|
@@ -371,7 +371,7 @@ function buildRuntimeConfig(config, baseDir, env, options) {
|
|
|
371
371
|
url: hostListeningUrl,
|
|
372
372
|
entry: `${hostListeningUrl}/mf-manifest.json`,
|
|
373
373
|
localPath: hostRuntime.localPath,
|
|
374
|
-
port: env === "development" ? parsePort(hostListeningUrl) :
|
|
374
|
+
port: env === "development" ? parsePort(hostListeningUrl) : DEFAULT_HOST_PORT,
|
|
375
375
|
secrets: hostConfig.secrets,
|
|
376
376
|
integrity: hostIsRemote ? hostConfig.integrity : void 0,
|
|
377
377
|
source: hostRuntime.source,
|
|
@@ -452,8 +452,12 @@ async function resolveRuntimePlugins(plugins, baseDir, env, remotePlugins) {
|
|
|
452
452
|
})).filter((entry) => entry.normalized !== null && entry.normalized !== false);
|
|
453
453
|
const resolved = await Promise.all(entries.map(async ({ pluginId, normalized }) => {
|
|
454
454
|
const resolvedReference = await resolveComposableReference(normalized, baseDir, env, `plugins.${pluginId}`);
|
|
455
|
-
const
|
|
456
|
-
|
|
455
|
+
const forceSource = remotePlugins === void 0 ? void 0 : remotePlugins.length === 0 || remotePlugins.includes(pluginId) ? "remote" : void 0;
|
|
456
|
+
const pluginRuntime = buildRuntimePluginConfig(pluginId, env, resolvedReference, forceSource);
|
|
457
|
+
if (!pluginRuntime.localPath && !pluginRuntime.url) {
|
|
458
|
+
if (forceSource === "remote") emitConfigWarning(`[Config] Plugin "${pluginId}" has no production URL in bos.config.json and cannot be resolved as remote. Add a "production" field or remove it from --remote-plugins.`);
|
|
459
|
+
return null;
|
|
460
|
+
}
|
|
457
461
|
if (pluginRuntime.source === "remote" && pluginRuntime.url && !pluginRuntime.localPath && typeof resolvedReference.entry.name !== "string") pluginRuntime.name = await resolveRemotePluginRuntimeName(pluginRuntime.url, pluginRuntime.name);
|
|
458
462
|
return [pluginId, pluginRuntime];
|
|
459
463
|
}));
|
package/dist/config.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fetchBosConfigFromFastKv } from \"./fastkv\";\nimport { fetchJsonOrNull } from \"./http-client\";\nimport {\n type BosEnv,\n bosConfigMerger,\n isPlainObject,\n mergeBosConfigWithExtends,\n type ResolvedConfigMeta,\n rebuildOrderedConfig,\n resolveExtendsRef,\n} from \"./merge\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport type {\n BosConfig,\n BosConfigInput,\n BosPluginRef,\n ExtendsConfig,\n JsonObject,\n JsonValue,\n PluginEntryValue,\n RuntimeConfig,\n RuntimePluginConfig,\n} from \"./types\";\nimport { BosConfigSchema } from \"./types\";\n\nconst LOCAL_PREFIX = \"local:\";\nconst DEFAULT_HOST_PORT = 3000;\nconst RESOLVED_CONFIG_FILENAME = \"bos.resolved-config.json\";\n\ntype RuntimeOverrideTarget = \"ui\" | \"api\" | \"plugins\" | `plugins.${string}`;\n\ninterface RuntimeTarget {\n source: \"local\" | \"remote\";\n url: string;\n localPath?: string;\n port?: number;\n}\n\nlet cachedConfig: BosConfig | null = null;\nlet projectRoot: string | null = null;\nlet configWarnings: string[] = [];\nlet suppressConfigWarnings = false;\n\nexport function clearConfigCache(): void {\n cachedConfig = null;\n projectRoot = null;\n configWarnings = [];\n}\n\nexport function suppressWarnings(): void {\n suppressConfigWarnings = true;\n}\n\nexport function resumeWarnings(): void {\n suppressConfigWarnings = false;\n}\n\nexport function drainConfigWarnings(): string[] {\n const warnings = [...configWarnings];\n configWarnings = [];\n return warnings;\n}\n\nfunction emitConfigWarning(message: string): void {\n if (suppressConfigWarnings) {\n configWarnings.push(message);\n } else {\n console.warn(message);\n }\n}\n\nconst configPathCache = new Map<string, string | null>();\n\nexport function findConfigPath(cwd?: string): string | null {\n const cacheKey = cwd ?? process.cwd();\n const cached = configPathCache.get(cacheKey);\n if (cached !== undefined) return cached;\n\n let dir = cacheKey;\n while (dir !== \"/\") {\n const configPath = join(dir, \"bos.config.json\");\n if (existsSync(configPath)) {\n configPathCache.set(cacheKey, configPath);\n return configPath;\n }\n dir = dirname(dir);\n }\n configPathCache.set(cacheKey, null);\n return null;\n}\n\nexport function getConfig(): BosConfig | null {\n return cachedConfig;\n}\n\nexport function getProjectRoot(): string {\n if (!projectRoot) {\n throw new Error(\"Config not loaded. Call loadResolvedConfig() first.\");\n }\n return projectRoot;\n}\n\nexport interface ConfigResult {\n config: BosConfig;\n runtime: RuntimeConfig;\n source: {\n path: string;\n extended?: string[];\n remote?: boolean;\n };\n warnings?: string[];\n}\n\nexport interface LocalConfigResult {\n config: BosConfigInput;\n source: {\n path: string;\n };\n}\n\nexport interface RemoteConfigResult {\n rawConfig: BosConfigInput;\n config: BosConfig;\n source: string;\n extendsChain: string[];\n}\n\nexport interface ResolvedComposableReference {\n entry: BosPluginRef;\n providerBaseDir: string;\n targetPath: string;\n associatedUi?: Record<string, unknown>;\n}\n\ninterface ParsedExtendsTarget {\n configPath: string;\n targetPath?: string;\n}\n\nexport async function loadLocalConfig(options?: {\n cwd?: string;\n path?: string;\n}): Promise<LocalConfigResult | null> {\n const configPath = options?.path ?? findConfigPath(options?.cwd);\n if (!configPath) {\n projectRoot = options?.cwd ?? process.cwd();\n return null;\n }\n\n const baseDir = dirname(configPath);\n const config = await loadConfigFile(configPath, baseDir);\n\n projectRoot = baseDir;\n\n return {\n config,\n source: {\n path: configPath,\n },\n };\n}\n\nexport async function loadResolvedConfig(options?: {\n cwd?: string;\n path?: string;\n env?: BosEnv;\n remotePlugins?: string[];\n}): Promise<ConfigResult | null> {\n const configPath = options?.path ?? findConfigPath(options?.cwd);\n if (!configPath) {\n projectRoot = options?.cwd ?? process.cwd();\n return null;\n }\n\n const baseDir = dirname(configPath);\n const env = options?.env ?? \"development\";\n const runtimeEnv: BosEnv = env === \"staging\" ? \"production\" : env;\n\n try {\n suppressWarnings();\n const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n configPath,\n baseDir,\n new Set(),\n extendedChain,\n env,\n );\n const config = await resolveConfigComposableEntries(\n BosConfigSchema.parse(parsed),\n baseDir,\n runtimeEnv,\n );\n\n cachedConfig = config;\n projectRoot = baseDir;\n\n const pluginRuntime = await resolveRuntimePlugins(\n config.plugins ?? {},\n baseDir,\n runtimeEnv,\n options?.remotePlugins,\n );\n const runtime = buildRuntimeConfig(config, baseDir, runtimeEnv, {\n plugins: pluginRuntime,\n });\n const warnings = drainConfigWarnings();\n resumeWarnings();\n\n return {\n config,\n runtime,\n source: {\n path: configPath,\n extended: extendedChain.length > 0 ? extendedChain : undefined,\n remote: extendedChain.some((entry) => entry.startsWith(\"bos://\")),\n },\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n } catch (error) {\n resumeWarnings();\n if (error instanceof Error) {\n throw new Error(`Failed to load config from ${configPath}: ${error.message}`, {\n cause: error,\n });\n }\n throw new Error(`Failed to load config from ${configPath}: ${String(error)}`);\n }\n}\n\nexport async function loadBosConfig(options?: {\n cwd?: string;\n path?: string;\n env?: BosEnv;\n}): Promise<RuntimeConfig> {\n const result = await loadResolvedConfig(options);\n if (!result) {\n throw new Error(\"No bos.config.json found\");\n }\n\n return result.runtime;\n}\n\nexport async function loadRemoteConfig(\n bosUrl: string,\n env: BosEnv = \"production\",\n): Promise<RemoteConfigResult> {\n const runtimeEnv: BosEnv = env === \"staging\" ? \"production\" : env;\n const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n bosUrl,\n process.cwd(),\n new Set(),\n extendedChain,\n env,\n );\n const config = await resolveConfigComposableEntries(\n BosConfigSchema.parse(parsed),\n process.cwd(),\n runtimeEnv,\n );\n\n return {\n rawConfig: await loadConfigFile(bosUrl, process.cwd()),\n config,\n source: bosUrl,\n extendsChain: extendedChain,\n };\n}\n\nexport function parseRuntimeOverrideTargets(value?: string | null): RuntimeOverrideTarget[] {\n if (!value) {\n return [];\n }\n\n return [\n ...new Set(\n value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean),\n ),\n ].map((entry) => {\n if (entry === \"ui\" || entry === \"api\" || entry === \"plugins\") {\n return entry;\n }\n\n if (entry.startsWith(\"plugins.\") && entry.length > \"plugins.\".length) {\n return entry as RuntimeOverrideTarget;\n }\n\n throw new Error(`Invalid runtime override target: ${entry}`);\n });\n}\n\nexport function isRuntimeOverrideAllowed(\n allowedTargets: ReadonlyArray<RuntimeOverrideTarget>,\n target: \"ui\" | \"api\" | \"plugins\" | `plugins.${string}`,\n): boolean {\n if (allowedTargets.includes(target as RuntimeOverrideTarget)) {\n return true;\n }\n\n if (target.startsWith(\"plugins.\")) {\n return allowedTargets.includes(\"plugins.*\");\n }\n\n return false;\n}\n\nexport async function buildRuntimePluginsForConfig(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n): Promise<Record<string, RuntimePluginConfig> | undefined> {\n const plugins = await resolveRuntimePlugins(config.plugins ?? {}, baseDir, env);\n return Object.keys(plugins).length > 0 ? plugins : undefined;\n}\n\nfunction getEntryAssociatedUi(entry: Partial<BosPluginRef>): Record<string, unknown> | undefined {\n if (!isPlainObject(entry.app)) {\n return undefined;\n }\n\n const app = entry.app as Record<string, unknown>;\n if (!isPlainObject(app.ui)) {\n return undefined;\n }\n\n const ui = app.ui as Record<string, unknown>;\n if (\"shared\" in ui) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n return ui;\n}\n\nfunction mergeAssociatedUi(\n parentUi: Record<string, unknown> | undefined,\n childUi: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!parentUi) {\n return childUi ? { ...childUi } : undefined;\n }\n\n if (!childUi) {\n return { ...parentUi };\n }\n\n return bosConfigMerger({ ...childUi }, parentUi) as Record<string, unknown>;\n}\n\nfunction withAssociatedUi(\n entry: BosPluginRef,\n associatedUi?: Record<string, unknown>,\n): BosPluginRef {\n if (!associatedUi) {\n return entry;\n }\n\n const app = isPlainObject(entry.app)\n ? ({ ...(entry.app as Record<string, unknown>) } as Record<string, unknown>)\n : {};\n app.ui = mergeAssociatedUi(getEntryAssociatedUi(entry), associatedUi);\n\n return {\n ...entry,\n app,\n };\n}\n\nexport async function resolveConfigComposableEntries(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n): Promise<BosConfig> {\n const [resolvedApi, resolvedAuth] = await Promise.all([\n resolveComposableReference(config.app.api as BosPluginRef, baseDir, env, \"app.api\"),\n config.app.auth\n ? resolveComposableReference(config.app.auth as BosPluginRef, baseDir, env, \"app.auth\")\n : Promise.resolve(undefined),\n ]);\n\n const resolvedPlugins = config.plugins\n ? Object.fromEntries(\n await Promise.all(\n Object.entries(config.plugins).map(async ([pluginId, pluginValue]) => {\n const resolvedPlugin = await resolveComposableReference(\n asComposableEntry(pluginValue),\n baseDir,\n env,\n `plugins.${pluginId}`,\n );\n\n return [\n pluginId,\n withAssociatedUi(resolvedPlugin.entry, resolvedPlugin.associatedUi),\n ] as const;\n }),\n ),\n )\n : undefined;\n\n return {\n ...config,\n app: {\n ...config.app,\n api: resolvedApi.entry,\n auth: resolvedAuth?.entry,\n },\n plugins: resolvedPlugins,\n };\n}\n\nexport function getResolvedConfigPath(configDir: string): string {\n return join(configDir, \".bos\", RESOLVED_CONFIG_FILENAME);\n}\n\nexport function loadGeneratedResolvedConfig(configDir: string): BosConfig | null {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (!existsSync(resolvedPath)) return null;\n try {\n const raw = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n if (!isPlainObject(raw)) return null;\n const { _resolved, ...configData } = raw;\n return BosConfigSchema.parse(configData);\n } catch {\n return null;\n }\n}\n\nexport function writeResolvedConfig(\n configDir: string,\n config: BosConfig,\n env: BosEnv,\n extendsChain?: string[],\n source?: string,\n): void {\n const resolvedPath = getResolvedConfigPath(configDir);\n const resolvedDir = dirname(resolvedPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(config);\n const meta: ResolvedConfigMeta = {\n env,\n resolvedAt: new Date().toISOString(),\n extendsChain: extendsChain ?? [],\n ...(source ? { source } : {}),\n };\n const output = {\n _resolved: meta,\n ...ordered,\n };\n\n const content = `${JSON.stringify(output, null, 2)}\\n`;\n try {\n if (readFileSync(resolvedPath, \"utf-8\") === content) return;\n } catch {\n // file doesn't exist yet\n }\n writeFileSync(resolvedPath, content);\n}\n\nexport function resolveBosConfigPath(configDir: string): string {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (existsSync(resolvedPath)) return resolvedPath;\n return join(configDir, \"bos.config.json\");\n}\n\nexport function readBosConfigForBuild(configDir: string): Record<string, unknown> {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (existsSync(resolvedPath)) {\n try {\n const raw = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n if (isPlainObject(raw)) {\n const { _resolved, ...configData } = raw;\n return configData as Record<string, unknown>;\n }\n } catch (e) {\n console.warn(\n `[Config] Failed to parse _resolved.json, falling back to bos.config.json: ${e}`,\n );\n }\n }\n const bosConfigPath = join(configDir, \"bos.config.json\");\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<string, unknown>;\n}\n\nfunction parseExtendsTarget(ref: string): ParsedExtendsTarget {\n const hashIndex = ref.indexOf(\"#\");\n if (hashIndex === -1) {\n return { configPath: ref };\n }\n\n const configPath = ref.slice(0, hashIndex);\n const targetPath = ref.slice(hashIndex + 1);\n return {\n configPath,\n targetPath: targetPath.length > 0 ? targetPath : undefined,\n };\n}\n\nfunction getConfigBaseDir(configPath: string, baseDir: string): string {\n if (configPath.startsWith(\"bos://\")) return baseDir;\n return dirname(isAbsolute(configPath) ? configPath : resolve(baseDir, configPath));\n}\n\nfunction asComposableEntry(value: unknown): BosPluginRef {\n if (value === undefined) {\n return {};\n }\n if (typeof value === \"string\") {\n return { extends: value };\n }\n if (!isPlainObject(value)) {\n throw new Error(`Expected config entry object, received ${typeof value}`);\n }\n return value as BosPluginRef;\n}\n\nfunction getTargetedEntry(config: BosConfigInput, targetPath: string): BosPluginRef {\n if (targetPath.startsWith(\"app.\")) {\n const entryKey = targetPath.slice(\"app.\".length);\n return asComposableEntry(config.app?.[entryKey]);\n }\n\n if (targetPath.startsWith(\"plugins.\")) {\n const pluginId = targetPath.slice(\"plugins.\".length);\n if (pluginId.length === 0) {\n throw new Error(`Invalid plugin target path: ${targetPath}`);\n }\n return asComposableEntry(config.plugins?.[pluginId]);\n }\n\n throw new Error(`Unsupported extends target path: ${targetPath}`);\n}\n\nfunction getAssociatedUi(\n config: BosConfigInput,\n _targetPath: string,\n): Record<string, unknown> | undefined {\n if (!isPlainObject(config.app?.ui)) {\n return undefined;\n }\n\n const ui = config.app.ui as Record<string, unknown>;\n if (\"shared\" in ui) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n return ui;\n}\n\nfunction mergeComposableEntries(\n parent: Partial<BosPluginRef>,\n child: Partial<BosPluginRef>,\n): BosPluginRef {\n return bosConfigMerger({ ...child }, parent) as BosPluginRef;\n}\n\nfunction stripUnsafeLocalDevelopment<T extends Record<string, unknown> | undefined>(\n entry: T,\n allowLocalPaths: boolean,\n): T {\n if (!entry || allowLocalPaths) {\n return entry;\n }\n\n if (typeof entry.development === \"string\" && entry.development.startsWith(LOCAL_PREFIX)) {\n const { development: _ignored, ...rest } = entry;\n return rest as T;\n }\n\n return entry;\n}\n\nexport async function resolveComposableReference(\n source: BosPluginRef,\n baseDir: string,\n env: BosEnv,\n defaultTargetPath: string,\n): Promise<ResolvedComposableReference> {\n let resolvedEntry: BosPluginRef = {};\n let providerBaseDir = baseDir;\n let targetPath = defaultTargetPath;\n let associatedUi = getEntryAssociatedUi(source);\n let allowLocalPaths = false;\n let extendsError: unknown;\n\n const extendsRef = source.extends ? resolveExtendsRef(source.extends, env) : undefined;\n if (extendsRef) {\n const parsed = parseExtendsTarget(extendsRef);\n targetPath = parsed.targetPath ?? defaultTargetPath;\n const extendsBaseDir = getConfigBaseDir(parsed.configPath, baseDir);\n try {\n const extendedConfig = await resolveConfigWithExtends(\n parsed.configPath,\n extendsBaseDir,\n new Set(),\n [],\n env,\n );\n resolvedEntry = mergeComposableEntries(\n resolvedEntry,\n getTargetedEntry(extendedConfig, targetPath),\n );\n providerBaseDir = extendsBaseDir;\n associatedUi = mergeAssociatedUi(associatedUi, getAssociatedUi(extendedConfig, targetPath));\n } catch (error) {\n extendsError = error;\n }\n }\n\n const localDevelopment =\n typeof source.development === \"string\" && source.development.startsWith(LOCAL_PREFIX)\n ? source.development\n : undefined;\n const localDevelopmentPath = localDevelopment\n ? resolve(baseDir, localDevelopment.slice(LOCAL_PREFIX.length).trim())\n : undefined;\n const hasUsableLocalDevelopment = Boolean(\n localDevelopmentPath && existsSync(localDevelopmentPath),\n );\n\n if (localDevelopmentPath) {\n const localPath = localDevelopmentPath;\n const localConfigPath = join(localPath, \"bos.config.json\");\n if (existsSync(localConfigPath)) {\n const localConfig = await resolveConfigWithExtends(\n localConfigPath,\n localPath,\n new Set(),\n [],\n env,\n );\n resolvedEntry = mergeComposableEntries(\n resolvedEntry,\n getTargetedEntry(localConfig, targetPath),\n );\n providerBaseDir = localPath;\n associatedUi = mergeAssociatedUi(associatedUi, getAssociatedUi(localConfig, targetPath));\n allowLocalPaths = true;\n }\n }\n\n const sourceOverrides = { ...source };\n if (allowLocalPaths && localDevelopment) {\n delete sourceOverrides.development;\n }\n\n resolvedEntry = mergeComposableEntries(resolvedEntry, sourceOverrides);\n associatedUi = mergeAssociatedUi(associatedUi, getEntryAssociatedUi(sourceOverrides));\n\n if (extendsError && !allowLocalPaths && !hasUsableLocalDevelopment) {\n throw extendsError;\n }\n\n return {\n entry: stripUnsafeLocalDevelopment(resolvedEntry, allowLocalPaths || Boolean(localDevelopment)),\n providerBaseDir,\n targetPath,\n associatedUi: stripUnsafeLocalDevelopment(associatedUi, allowLocalPaths),\n };\n}\n\nfunction resolveDevelopmentTarget(\n development: string | undefined,\n production: string | undefined,\n baseDir: string,\n forceSource?: \"local\" | \"remote\",\n target?: string,\n extendsRef?: string,\n): RuntimeTarget {\n if (forceSource === \"remote\") {\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n if (!development) {\n if (production && target) {\n if (extendsRef) {\n emitConfigWarning(`[Config] Resolving \"${target}\" from ${extendsRef}`);\n } else {\n emitConfigWarning(`[Config] No development target for \"${target}\", using production`);\n }\n }\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n const devTarget = resolveRuntimeTarget(development, baseDir);\n if (devTarget.source === \"local\" && (!devTarget.localPath || !existsSync(devTarget.localPath))) {\n if (production && target) {\n emitConfigWarning(`[Config] Could not load local target for \"${target}\", using production`);\n }\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n return devTarget;\n}\n\nexport interface BuildRuntimeConfigOptions {\n plugins?: Record<string, RuntimePluginConfig>;\n hostSource?: \"local\" | \"remote\";\n uiSource?: \"local\" | \"remote\";\n apiSource?: \"local\" | \"remote\";\n authSource?: \"local\" | \"remote\";\n proxy?: string;\n}\n\nexport function buildRuntimeConfig(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n options?: BuildRuntimeConfigOptions,\n): RuntimeConfig {\n const uiConfig = config.app.ui;\n const apiConfig = config.app.api;\n const authConfig = config.app.auth;\n const uiRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n uiConfig.development,\n uiConfig.production,\n baseDir,\n options?.uiSource,\n \"app.ui\",\n )\n : resolveRuntimeTarget(uiConfig.production, baseDir, \"remote\");\n const apiRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n apiConfig.development,\n apiConfig.production,\n baseDir,\n options?.apiSource,\n \"app.api\",\n )\n : resolveRuntimeTarget(apiConfig.production, baseDir, \"remote\");\n const authExtendsRef = authConfig?.extends\n ? resolveExtendsRef(authConfig.extends, env)\n : undefined;\n const authRuntime = authConfig\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n authConfig.development,\n authConfig.production,\n baseDir,\n options?.authSource,\n \"app.auth\",\n authExtendsRef,\n )\n : resolveRuntimeTarget(authConfig.production, baseDir, \"remote\")\n : undefined;\n\n const hostConfig = config.app.host;\n const hostRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n hostConfig.development,\n hostConfig.production,\n baseDir,\n options?.hostSource,\n \"app.host\",\n )\n : resolveRuntimeTarget(hostConfig.production, baseDir, \"remote\");\n\n const hostListeningUrl =\n env === \"development\"\n ? resolveDevelopmentHostUrl(hostConfig.development)\n : `http://localhost:${hostRuntime.port ?? DEFAULT_HOST_PORT}`;\n\n const hostIsRemote = hostRuntime.source === \"remote\";\n const uiIsRemote = uiRuntime.source === \"remote\";\n const apiIsRemote = apiRuntime.source === \"remote\";\n const resolvedApiName = resolvePluginRuntimeName(apiConfig.name, apiRuntime.localPath, \"api\");\n\n return {\n env,\n account: config.account,\n domain: config.domain,\n title: config.title,\n description: config.description,\n networkId: getNetworkIdForAccount(config.account),\n repository: config.repository,\n host: {\n name: \"host\",\n url: hostListeningUrl,\n entry: `${hostListeningUrl}/mf-manifest.json`,\n localPath: hostRuntime.localPath,\n port:\n env === \"development\"\n ? parsePort(hostListeningUrl)\n : (hostRuntime.port ?? DEFAULT_HOST_PORT),\n secrets: hostConfig.secrets,\n integrity: hostIsRemote ? hostConfig.integrity : undefined,\n source: hostRuntime.source,\n remoteUrl: hostIsRemote ? hostRuntime.url : undefined,\n },\n ui: {\n name: resolvePluginRuntimeName(uiConfig.name, uiRuntime.localPath, \"ui\"),\n url: uiRuntime.url,\n entry: uiRuntime.url ? `${uiRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: uiRuntime.localPath,\n port: uiRuntime.port,\n ssrUrl: uiIsRemote ? uiConfig.ssr : undefined,\n ssrIntegrity: uiIsRemote ? uiConfig.ssrIntegrity : undefined,\n integrity: uiIsRemote ? uiConfig.integrity : undefined,\n source: uiRuntime.source,\n },\n api: {\n name: resolvedApiName,\n url: apiRuntime.url,\n entry: apiRuntime.url ? `${apiRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: apiRuntime.localPath,\n port: apiRuntime.port,\n source: apiRuntime.source,\n proxy: options?.proxy ?? apiConfig.proxy,\n variables: apiConfig.variables,\n secrets: apiConfig.secrets,\n integrity: apiIsRemote ? apiConfig.integrity : undefined,\n shared: apiConfig.shared,\n },\n auth: (() => {\n if (!authConfig || !authRuntime) return undefined;\n if (!authRuntime.localPath && !authRuntime.url) return undefined;\n return {\n name: resolvePluginRuntimeName(authConfig.name, authRuntime.localPath, \"auth\"),\n extendsRef: authExtendsRef,\n url: authRuntime.url,\n entry: authRuntime.url ? `${authRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: authRuntime.localPath,\n port: authRuntime.port,\n source: authRuntime.source,\n proxy: authConfig.proxy,\n variables: authConfig.variables,\n secrets: authConfig.secrets,\n integrity: authRuntime.source === \"remote\" ? authConfig.integrity : undefined,\n shared: authConfig.shared,\n };\n })(),\n plugins:\n options?.plugins && Object.keys(options.plugins).length > 0 ? options.plugins : undefined,\n };\n}\n\nasync function loadConfigFile(configPath: string, baseDir: string): Promise<BosConfigInput> {\n if (configPath.startsWith(\"bos://\")) {\n return fetchBosConfigFromFastKv<BosConfigInput>(configPath);\n }\n\n const resolvedPath = isAbsolute(configPath) ? configPath : resolve(baseDir, configPath);\n return JSON.parse(readFileSync(resolvedPath, \"utf-8\")) as BosConfigInput;\n}\n\nasync function resolveConfigWithExtends(\n configPath: string,\n baseDir: string,\n visited: Set<string>,\n chain: string[],\n env: BosEnv = \"development\",\n): Promise<BosConfigInput> {\n if (visited.has(configPath)) {\n throw new Error(`Circular extends detected: ${[...visited, configPath].join(\" -> \")}`);\n }\n\n const config = await loadConfigFile(configPath, baseDir);\n chain.push(configPath);\n\n if (!config.extends) {\n return config;\n }\n\n const extendsRef = resolveExtendsRef(config.extends as string | ExtendsConfig, env);\n if (!extendsRef) {\n return config;\n }\n\n const parsedParentRef = parseExtendsTarget(extendsRef);\n\n const nextVisited = new Set(visited);\n nextVisited.add(configPath);\n const parentBaseDir = getConfigBaseDir(parsedParentRef.configPath, baseDir);\n const parent = await resolveConfigWithExtends(\n parsedParentRef.configPath,\n parentBaseDir,\n nextVisited,\n chain,\n env,\n );\n\n return mergeBosConfigWithExtends(parent, config);\n}\n\ntype PluginOverrideValue = PluginEntryValue | null | false;\n\nfunction normalizePluginEntry(raw: PluginOverrideValue): BosPluginRef | null | false {\n if (raw === null || raw === false) return raw;\n if (typeof raw === \"string\") {\n return { extends: raw };\n }\n return raw;\n}\n\nasync function resolveRuntimePlugins(\n plugins: Record<string, PluginOverrideValue>,\n baseDir: string,\n env: BosEnv,\n remotePlugins?: string[],\n): Promise<Record<string, RuntimePluginConfig>> {\n const entries = Object.entries(plugins)\n .map(([pluginId, rawInput]) => ({\n pluginId,\n normalized: normalizePluginEntry(rawInput),\n }))\n .filter(\n (entry): entry is { pluginId: string; normalized: BosPluginRef } =>\n entry.normalized !== null && entry.normalized !== false,\n );\n\n const resolved = await Promise.all(\n entries.map(async ({ pluginId, normalized }) => {\n const resolvedReference = await resolveComposableReference(\n normalized,\n baseDir,\n env,\n `plugins.${pluginId}`,\n );\n\n const forceSource = remotePlugins?.includes(pluginId) ? \"remote\" : undefined;\n const pluginRuntime = buildRuntimePluginConfig(pluginId, env, resolvedReference, forceSource);\n\n if (!pluginRuntime.localPath && !pluginRuntime.url) {\n return null;\n }\n\n if (\n pluginRuntime.source === \"remote\" &&\n pluginRuntime.url &&\n !pluginRuntime.localPath &&\n typeof resolvedReference.entry.name !== \"string\"\n ) {\n pluginRuntime.name = await resolveRemotePluginRuntimeName(\n pluginRuntime.url,\n pluginRuntime.name,\n );\n }\n\n return [pluginId, pluginRuntime] as const;\n }),\n );\n\n const out: Record<string, RuntimePluginConfig> = {};\n for (const entry of resolved) {\n if (entry) {\n out[entry[0]] = entry[1];\n }\n }\n\n return out;\n}\n\nasync function resolveRemotePluginRuntimeName(baseUrl: string, fallback: string): Promise<string> {\n const manifest = await fetchJsonOrNull<{\n plugin?: { name?: unknown };\n }>(`${baseUrl.replace(/\\/$/, \"\")}/plugin.manifest.json`, { retries: 0 });\n\n return typeof manifest?.plugin?.name === \"string\" && manifest.plugin.name.length > 0\n ? manifest.plugin.name\n : fallback;\n}\n\nfunction buildRuntimePluginConfig(\n pluginId: string,\n env: BosEnv,\n resolved: ResolvedComposableReference,\n forceSource?: \"local\" | \"remote\",\n): RuntimePluginConfig {\n const source = resolved.entry;\n const development = typeof source.development === \"string\" ? source.development : undefined;\n const production = typeof source.production === \"string\" ? source.production : undefined;\n\n if (production?.startsWith(\"bos://\")) {\n throw new Error(\n `Plugin \"${pluginId}\" has unsupported production target \"${production}\". Use extends: \"bos://account/domain\" for plugin configs or a CDN URL for production.`,\n );\n }\n\n const pluginExtendsRef = source.extends ? resolveExtendsRef(source.extends, env) : undefined;\n\n const runtimeTarget =\n env === \"development\"\n ? resolveDevelopmentTarget(\n development,\n production,\n resolved.providerBaseDir,\n forceSource,\n `plugins.${pluginId}`,\n pluginExtendsRef,\n )\n : resolveRuntimeTarget(production, resolved.providerBaseDir, \"remote\");\n const apiName = resolvePluginRuntimeName(source.name, runtimeTarget.localPath, pluginId);\n\n const uiConfig = resolved.associatedUi;\n const uiDevelopment =\n typeof uiConfig?.development === \"string\" ? uiConfig.development : undefined;\n const uiProduction = typeof uiConfig?.production === \"string\" ? uiConfig.production : undefined;\n const uiRuntime =\n uiConfig && (uiDevelopment || uiProduction)\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n uiDevelopment,\n uiProduction,\n resolved.providerBaseDir,\n forceSource,\n `plugins.${pluginId}.ui`,\n )\n : resolveRuntimeTarget(uiProduction, resolved.providerBaseDir, \"remote\")\n : undefined;\n\n const routes = source.routes;\n\n return {\n name: apiName,\n url: runtimeTarget.url,\n entry: runtimeTarget.url\n ? `${runtimeTarget.url.replace(/\\/$/, \"\")}/mf-manifest.json`\n : \"/mf-manifest.json\",\n source: runtimeTarget.source,\n extendsRef: pluginExtendsRef,\n localPath: runtimeTarget.localPath,\n port: runtimeTarget.port,\n proxy: typeof source.proxy === \"string\" ? source.proxy : undefined,\n variables: normalizeJsonRecord(source.variables),\n secrets: normalizeStringArray(source.secrets),\n shared: source.shared,\n integrity: runtimeTarget.source === \"remote\" ? source.integrity : undefined,\n ui: uiRuntime\n ? {\n name: typeof uiConfig?.name === \"string\" ? uiConfig.name : `${apiName}-ui`,\n url: uiRuntime.url,\n entry: uiRuntime.url\n ? `${uiRuntime.url.replace(/\\/$/, \"\")}/mf-manifest.json`\n : \"/mf-manifest.json\",\n source: uiRuntime.source,\n localPath: uiRuntime.localPath,\n port: uiRuntime.port,\n integrity:\n uiRuntime.source === \"remote\" && typeof uiConfig?.integrity === \"string\"\n ? uiConfig.integrity\n : undefined,\n }\n : undefined,\n routes,\n };\n}\n\nexport function resolvePluginRuntimeName(\n explicitName: string | undefined,\n localPath: string | undefined,\n fallback: string,\n): string {\n if (explicitName) {\n return explicitName;\n }\n\n if (!localPath) {\n return fallback;\n }\n\n try {\n const packageJsonPath = join(localPath, \"package.json\");\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as { name?: unknown };\n if (typeof packageJson.name === \"string\" && packageJson.name.length > 0) {\n return packageJson.name;\n }\n } catch (e) {\n console.warn(`[Config] Could not read package.json at ${localPath}: ${e}`);\n }\n\n return fallback;\n}\n\nfunction normalizeJsonValue(value: unknown): JsonValue | undefined {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value\n .map((item) => normalizeJsonValue(item))\n .filter((item): item is JsonValue => item !== undefined);\n }\n\n if (isPlainObject(value)) {\n const out: JsonObject = {};\n for (const [key, raw] of Object.entries(value)) {\n const normalized = normalizeJsonValue(raw);\n if (normalized !== undefined) {\n out[key] = normalized;\n }\n }\n return out;\n }\n\n return undefined;\n}\n\nfunction normalizeJsonRecord(value: unknown): JsonObject | undefined {\n if (!isPlainObject(value)) return undefined;\n const out: JsonObject = {};\n for (const [key, raw] of Object.entries(value)) {\n const normalized = normalizeJsonValue(raw);\n if (normalized !== undefined) {\n out[key] = normalized;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const out = value.filter((item): item is string => typeof item === \"string\" && item.length > 0);\n return out.length > 0 ? out : undefined;\n}\n\nfunction resolveRuntimeTarget(\n value: string | undefined,\n baseDir: string,\n defaultSource: \"local\" | \"remote\" = \"remote\",\n): RuntimeTarget {\n if (!value) {\n return { source: defaultSource, url: \"\" };\n }\n\n if (value.startsWith(LOCAL_PREFIX)) {\n const localTarget = value?.slice(LOCAL_PREFIX.length).trim();\n if (!localTarget) {\n throw new Error(`Invalid local development target: ${value}`);\n }\n\n const localPath = resolve(baseDir, localTarget);\n if (!existsSync(localPath)) {\n return { source: \"local\", url: \"\" };\n }\n\n return {\n source: \"local\",\n url: \"\",\n localPath,\n };\n }\n\n return {\n source: defaultSource,\n url: value.replace(/\\/$/, \"\"),\n port: parsePort(value),\n };\n}\n\nexport function isLocalDevelopmentTarget(\n value: string | undefined,\n): value is `${typeof LOCAL_PREFIX}${string}` {\n return typeof value === \"string\" && value.startsWith(LOCAL_PREFIX);\n}\n\nexport function resolveLocalDevelopmentPath(\n value: string | undefined,\n baseDir: string,\n): string | null {\n if (!isLocalDevelopmentTarget(value)) {\n return null;\n }\n\n const localTarget = value.slice(LOCAL_PREFIX.length).trim();\n return localTarget ? resolve(baseDir, localTarget) : null;\n}\n\nexport function resolveDevelopmentHostUrl(value: string | undefined): string {\n if (!value || isLocalDevelopmentTarget(value)) {\n return `http://localhost:${DEFAULT_HOST_PORT}`;\n }\n\n return value.replace(/\\/$/, \"\");\n}\n\nexport function getHostDevelopmentPort(value: string | undefined): number {\n return parsePort(resolveDevelopmentHostUrl(value));\n}\n\nexport function parsePort(url: string): number {\n try {\n const parsed = new URL(url);\n return parsed.port ? parseInt(parsed.port, 10) : parsed.protocol === \"https:\" ? 443 : 80;\n } catch {\n return 3000;\n }\n}\n\nexport {\n BOS_CONFIG_ORDER,\n mergeBosConfigWithExtends,\n rebuildOrderedConfig,\n resolveExtendsRef,\n} from \"./merge\";\nexport type { BosConfig, RuntimeConfig } from \"./types\";\nexport { BosConfigSchema } from \"./types\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fetchBosConfigFromFastKv } from \"./fastkv\";\nimport { fetchJsonOrNull } from \"./http-client\";\nimport {\n type BosEnv,\n bosConfigMerger,\n isPlainObject,\n mergeBosConfigWithExtends,\n type ResolvedConfigMeta,\n rebuildOrderedConfig,\n resolveExtendsRef,\n} from \"./merge\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport type {\n BosConfig,\n BosConfigInput,\n BosPluginRef,\n ExtendsConfig,\n JsonObject,\n JsonValue,\n PluginEntryValue,\n RuntimeConfig,\n RuntimePluginConfig,\n} from \"./types\";\nimport { BosConfigSchema } from \"./types\";\n\nconst LOCAL_PREFIX = \"local:\";\nconst DEFAULT_HOST_PORT = 3000;\nconst RESOLVED_CONFIG_FILENAME = \"bos.resolved-config.json\";\n\ntype RuntimeOverrideTarget = \"ui\" | \"api\" | \"plugins\" | `plugins.${string}`;\n\ninterface RuntimeTarget {\n source: \"local\" | \"remote\";\n url: string;\n localPath?: string;\n port?: number;\n}\n\nlet cachedConfig: BosConfig | null = null;\nlet projectRoot: string | null = null;\nlet configWarnings: string[] = [];\nlet suppressConfigWarnings = false;\n\nexport function clearConfigCache(): void {\n cachedConfig = null;\n projectRoot = null;\n configWarnings = [];\n}\n\nexport function suppressWarnings(): void {\n suppressConfigWarnings = true;\n}\n\nexport function resumeWarnings(): void {\n suppressConfigWarnings = false;\n}\n\nexport function drainConfigWarnings(): string[] {\n const warnings = [...configWarnings];\n configWarnings = [];\n return warnings;\n}\n\nfunction emitConfigWarning(message: string): void {\n if (suppressConfigWarnings) {\n configWarnings.push(message);\n } else {\n console.warn(message);\n }\n}\n\nconst configPathCache = new Map<string, string | null>();\n\nexport function findConfigPath(cwd?: string): string | null {\n const cacheKey = cwd ?? process.cwd();\n const cached = configPathCache.get(cacheKey);\n if (cached !== undefined) return cached;\n\n let dir = cacheKey;\n while (dir !== \"/\") {\n const configPath = join(dir, \"bos.config.json\");\n if (existsSync(configPath)) {\n configPathCache.set(cacheKey, configPath);\n return configPath;\n }\n dir = dirname(dir);\n }\n configPathCache.set(cacheKey, null);\n return null;\n}\n\nexport function getConfig(): BosConfig | null {\n return cachedConfig;\n}\n\nexport function getProjectRoot(): string {\n if (!projectRoot) {\n throw new Error(\"Config not loaded. Call loadResolvedConfig() first.\");\n }\n return projectRoot;\n}\n\nexport interface ConfigResult {\n config: BosConfig;\n runtime: RuntimeConfig;\n source: {\n path: string;\n extended?: string[];\n remote?: boolean;\n };\n warnings?: string[];\n}\n\nexport interface LocalConfigResult {\n config: BosConfigInput;\n source: {\n path: string;\n };\n}\n\nexport interface RemoteConfigResult {\n rawConfig: BosConfigInput;\n config: BosConfig;\n source: string;\n extendsChain: string[];\n}\n\nexport interface ResolvedComposableReference {\n entry: BosPluginRef;\n providerBaseDir: string;\n targetPath: string;\n associatedUi?: Record<string, unknown>;\n}\n\ninterface ParsedExtendsTarget {\n configPath: string;\n targetPath?: string;\n}\n\nexport async function loadLocalConfig(options?: {\n cwd?: string;\n path?: string;\n}): Promise<LocalConfigResult | null> {\n const configPath = options?.path ?? findConfigPath(options?.cwd);\n if (!configPath) {\n projectRoot = options?.cwd ?? process.cwd();\n return null;\n }\n\n const baseDir = dirname(configPath);\n const config = await loadConfigFile(configPath, baseDir);\n\n projectRoot = baseDir;\n\n return {\n config,\n source: {\n path: configPath,\n },\n };\n}\n\nexport async function loadResolvedConfig(options?: {\n cwd?: string;\n path?: string;\n env?: BosEnv;\n remotePlugins?: string[];\n}): Promise<ConfigResult | null> {\n const configPath = options?.path ?? findConfigPath(options?.cwd);\n if (!configPath) {\n projectRoot = options?.cwd ?? process.cwd();\n return null;\n }\n\n const baseDir = dirname(configPath);\n const env = options?.env ?? \"development\";\n const runtimeEnv: BosEnv = env === \"staging\" ? \"production\" : env;\n\n try {\n suppressWarnings();\n const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n configPath,\n baseDir,\n new Set(),\n extendedChain,\n env,\n );\n const config = await resolveConfigComposableEntries(\n BosConfigSchema.parse(parsed),\n baseDir,\n runtimeEnv,\n );\n\n cachedConfig = config;\n projectRoot = baseDir;\n\n const pluginRuntime = await resolveRuntimePlugins(\n config.plugins ?? {},\n baseDir,\n runtimeEnv,\n options?.remotePlugins,\n );\n const runtime = buildRuntimeConfig(config, baseDir, runtimeEnv, {\n plugins: pluginRuntime,\n });\n const warnings = drainConfigWarnings();\n resumeWarnings();\n\n return {\n config,\n runtime,\n source: {\n path: configPath,\n extended: extendedChain.length > 0 ? extendedChain : undefined,\n remote: extendedChain.some((entry) => entry.startsWith(\"bos://\")),\n },\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n } catch (error) {\n resumeWarnings();\n if (error instanceof Error) {\n throw new Error(`Failed to load config from ${configPath}: ${error.message}`, {\n cause: error,\n });\n }\n throw new Error(`Failed to load config from ${configPath}: ${String(error)}`);\n }\n}\n\nexport async function loadBosConfig(options?: {\n cwd?: string;\n path?: string;\n env?: BosEnv;\n}): Promise<RuntimeConfig> {\n const result = await loadResolvedConfig(options);\n if (!result) {\n throw new Error(\"No bos.config.json found\");\n }\n\n return result.runtime;\n}\n\nexport async function loadRemoteConfig(\n bosUrl: string,\n env: BosEnv = \"production\",\n): Promise<RemoteConfigResult> {\n const runtimeEnv: BosEnv = env === \"staging\" ? \"production\" : env;\n const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n bosUrl,\n process.cwd(),\n new Set(),\n extendedChain,\n env,\n );\n const config = await resolveConfigComposableEntries(\n BosConfigSchema.parse(parsed),\n process.cwd(),\n runtimeEnv,\n );\n\n return {\n rawConfig: await loadConfigFile(bosUrl, process.cwd()),\n config,\n source: bosUrl,\n extendsChain: extendedChain,\n };\n}\n\nexport function parseRuntimeOverrideTargets(value?: string | null): RuntimeOverrideTarget[] {\n if (!value) {\n return [];\n }\n\n return [\n ...new Set(\n value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean),\n ),\n ].map((entry) => {\n if (entry === \"ui\" || entry === \"api\" || entry === \"plugins\") {\n return entry;\n }\n\n if (entry.startsWith(\"plugins.\") && entry.length > \"plugins.\".length) {\n return entry as RuntimeOverrideTarget;\n }\n\n throw new Error(`Invalid runtime override target: ${entry}`);\n });\n}\n\nexport function isRuntimeOverrideAllowed(\n allowedTargets: ReadonlyArray<RuntimeOverrideTarget>,\n target: \"ui\" | \"api\" | \"plugins\" | `plugins.${string}`,\n): boolean {\n if (allowedTargets.includes(target as RuntimeOverrideTarget)) {\n return true;\n }\n\n if (target.startsWith(\"plugins.\")) {\n return allowedTargets.includes(\"plugins.*\");\n }\n\n return false;\n}\n\nexport async function buildRuntimePluginsForConfig(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n): Promise<Record<string, RuntimePluginConfig> | undefined> {\n const plugins = await resolveRuntimePlugins(config.plugins ?? {}, baseDir, env);\n return Object.keys(plugins).length > 0 ? plugins : undefined;\n}\n\nfunction getEntryAssociatedUi(entry: Partial<BosPluginRef>): Record<string, unknown> | undefined {\n if (!isPlainObject(entry.app)) {\n return undefined;\n }\n\n const app = entry.app as Record<string, unknown>;\n if (!isPlainObject(app.ui)) {\n return undefined;\n }\n\n const ui = app.ui as Record<string, unknown>;\n if (\"shared\" in ui) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n return ui;\n}\n\nfunction mergeAssociatedUi(\n parentUi: Record<string, unknown> | undefined,\n childUi: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!parentUi) {\n return childUi ? { ...childUi } : undefined;\n }\n\n if (!childUi) {\n return { ...parentUi };\n }\n\n return bosConfigMerger({ ...childUi }, parentUi) as Record<string, unknown>;\n}\n\nfunction withAssociatedUi(\n entry: BosPluginRef,\n associatedUi?: Record<string, unknown>,\n): BosPluginRef {\n if (!associatedUi) {\n return entry;\n }\n\n const app = isPlainObject(entry.app)\n ? ({ ...(entry.app as Record<string, unknown>) } as Record<string, unknown>)\n : {};\n app.ui = mergeAssociatedUi(getEntryAssociatedUi(entry), associatedUi);\n\n return {\n ...entry,\n app,\n };\n}\n\nexport async function resolveConfigComposableEntries(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n): Promise<BosConfig> {\n const [resolvedApi, resolvedAuth] = await Promise.all([\n resolveComposableReference(config.app.api as BosPluginRef, baseDir, env, \"app.api\"),\n config.app.auth\n ? resolveComposableReference(config.app.auth as BosPluginRef, baseDir, env, \"app.auth\")\n : Promise.resolve(undefined),\n ]);\n\n const resolvedPlugins = config.plugins\n ? Object.fromEntries(\n await Promise.all(\n Object.entries(config.plugins).map(async ([pluginId, pluginValue]) => {\n const resolvedPlugin = await resolveComposableReference(\n asComposableEntry(pluginValue),\n baseDir,\n env,\n `plugins.${pluginId}`,\n );\n\n return [\n pluginId,\n withAssociatedUi(resolvedPlugin.entry, resolvedPlugin.associatedUi),\n ] as const;\n }),\n ),\n )\n : undefined;\n\n return {\n ...config,\n app: {\n ...config.app,\n api: resolvedApi.entry,\n auth: resolvedAuth?.entry,\n },\n plugins: resolvedPlugins,\n };\n}\n\nexport function getResolvedConfigPath(configDir: string): string {\n return join(configDir, \".bos\", RESOLVED_CONFIG_FILENAME);\n}\n\nexport function loadGeneratedResolvedConfig(configDir: string): BosConfig | null {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (!existsSync(resolvedPath)) return null;\n try {\n const raw = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n if (!isPlainObject(raw)) return null;\n const { _resolved, ...configData } = raw;\n return BosConfigSchema.parse(configData);\n } catch {\n return null;\n }\n}\n\nexport function writeResolvedConfig(\n configDir: string,\n config: BosConfig,\n env: BosEnv,\n extendsChain?: string[],\n source?: string,\n): void {\n const resolvedPath = getResolvedConfigPath(configDir);\n const resolvedDir = dirname(resolvedPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(config);\n const meta: ResolvedConfigMeta = {\n env,\n resolvedAt: new Date().toISOString(),\n extendsChain: extendsChain ?? [],\n ...(source ? { source } : {}),\n };\n const output = {\n _resolved: meta,\n ...ordered,\n };\n\n const content = `${JSON.stringify(output, null, 2)}\\n`;\n try {\n if (readFileSync(resolvedPath, \"utf-8\") === content) return;\n } catch {\n // file doesn't exist yet\n }\n writeFileSync(resolvedPath, content);\n}\n\nexport function resolveBosConfigPath(configDir: string): string {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (existsSync(resolvedPath)) return resolvedPath;\n return join(configDir, \"bos.config.json\");\n}\n\nexport function readBosConfigForBuild(configDir: string): Record<string, unknown> {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (existsSync(resolvedPath)) {\n try {\n const raw = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n if (isPlainObject(raw)) {\n const { _resolved, ...configData } = raw;\n return configData as Record<string, unknown>;\n }\n } catch (e) {\n console.warn(\n `[Config] Failed to parse _resolved.json, falling back to bos.config.json: ${e}`,\n );\n }\n }\n const bosConfigPath = join(configDir, \"bos.config.json\");\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<string, unknown>;\n}\n\nfunction parseExtendsTarget(ref: string): ParsedExtendsTarget {\n const hashIndex = ref.indexOf(\"#\");\n if (hashIndex === -1) {\n return { configPath: ref };\n }\n\n const configPath = ref.slice(0, hashIndex);\n const targetPath = ref.slice(hashIndex + 1);\n return {\n configPath,\n targetPath: targetPath.length > 0 ? targetPath : undefined,\n };\n}\n\nfunction getConfigBaseDir(configPath: string, baseDir: string): string {\n if (configPath.startsWith(\"bos://\")) return baseDir;\n return dirname(isAbsolute(configPath) ? configPath : resolve(baseDir, configPath));\n}\n\nfunction asComposableEntry(value: unknown): BosPluginRef {\n if (value === undefined) {\n return {};\n }\n if (typeof value === \"string\") {\n return { extends: value };\n }\n if (!isPlainObject(value)) {\n throw new Error(`Expected config entry object, received ${typeof value}`);\n }\n return value as BosPluginRef;\n}\n\nfunction getTargetedEntry(config: BosConfigInput, targetPath: string): BosPluginRef {\n if (targetPath.startsWith(\"app.\")) {\n const entryKey = targetPath.slice(\"app.\".length);\n return asComposableEntry(config.app?.[entryKey]);\n }\n\n if (targetPath.startsWith(\"plugins.\")) {\n const pluginId = targetPath.slice(\"plugins.\".length);\n if (pluginId.length === 0) {\n throw new Error(`Invalid plugin target path: ${targetPath}`);\n }\n return asComposableEntry(config.plugins?.[pluginId]);\n }\n\n throw new Error(`Unsupported extends target path: ${targetPath}`);\n}\n\nfunction getAssociatedUi(\n config: BosConfigInput,\n _targetPath: string,\n): Record<string, unknown> | undefined {\n if (!isPlainObject(config.app?.ui)) {\n return undefined;\n }\n\n const ui = config.app.ui as Record<string, unknown>;\n if (\"shared\" in ui) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n return ui;\n}\n\nfunction mergeComposableEntries(\n parent: Partial<BosPluginRef>,\n child: Partial<BosPluginRef>,\n): BosPluginRef {\n return bosConfigMerger({ ...child }, parent) as BosPluginRef;\n}\n\nfunction stripUnsafeLocalDevelopment<T extends Record<string, unknown> | undefined>(\n entry: T,\n allowLocalPaths: boolean,\n): T {\n if (!entry || allowLocalPaths) {\n return entry;\n }\n\n if (typeof entry.development === \"string\" && entry.development.startsWith(LOCAL_PREFIX)) {\n const { development: _ignored, ...rest } = entry;\n return rest as T;\n }\n\n return entry;\n}\n\nexport async function resolveComposableReference(\n source: BosPluginRef,\n baseDir: string,\n env: BosEnv,\n defaultTargetPath: string,\n): Promise<ResolvedComposableReference> {\n let resolvedEntry: BosPluginRef = {};\n let providerBaseDir = baseDir;\n let targetPath = defaultTargetPath;\n let associatedUi = getEntryAssociatedUi(source);\n let allowLocalPaths = false;\n let extendsError: unknown;\n\n const extendsRef = source.extends ? resolveExtendsRef(source.extends, env) : undefined;\n if (extendsRef) {\n const parsed = parseExtendsTarget(extendsRef);\n targetPath = parsed.targetPath ?? defaultTargetPath;\n const extendsBaseDir = getConfigBaseDir(parsed.configPath, baseDir);\n try {\n const extendedConfig = await resolveConfigWithExtends(\n parsed.configPath,\n extendsBaseDir,\n new Set(),\n [],\n env,\n );\n resolvedEntry = mergeComposableEntries(\n resolvedEntry,\n getTargetedEntry(extendedConfig, targetPath),\n );\n providerBaseDir = extendsBaseDir;\n associatedUi = mergeAssociatedUi(associatedUi, getAssociatedUi(extendedConfig, targetPath));\n } catch (error) {\n extendsError = error;\n }\n }\n\n const localDevelopment =\n typeof source.development === \"string\" && source.development.startsWith(LOCAL_PREFIX)\n ? source.development\n : undefined;\n const localDevelopmentPath = localDevelopment\n ? resolve(baseDir, localDevelopment.slice(LOCAL_PREFIX.length).trim())\n : undefined;\n const hasUsableLocalDevelopment = Boolean(\n localDevelopmentPath && existsSync(localDevelopmentPath),\n );\n\n if (localDevelopmentPath) {\n const localPath = localDevelopmentPath;\n const localConfigPath = join(localPath, \"bos.config.json\");\n if (existsSync(localConfigPath)) {\n const localConfig = await resolveConfigWithExtends(\n localConfigPath,\n localPath,\n new Set(),\n [],\n env,\n );\n resolvedEntry = mergeComposableEntries(\n resolvedEntry,\n getTargetedEntry(localConfig, targetPath),\n );\n providerBaseDir = localPath;\n associatedUi = mergeAssociatedUi(associatedUi, getAssociatedUi(localConfig, targetPath));\n allowLocalPaths = true;\n }\n }\n\n const sourceOverrides = { ...source };\n if (allowLocalPaths && localDevelopment) {\n delete sourceOverrides.development;\n }\n\n resolvedEntry = mergeComposableEntries(resolvedEntry, sourceOverrides);\n associatedUi = mergeAssociatedUi(associatedUi, getEntryAssociatedUi(sourceOverrides));\n\n if (extendsError && !allowLocalPaths && !hasUsableLocalDevelopment) {\n throw extendsError;\n }\n\n return {\n entry: stripUnsafeLocalDevelopment(resolvedEntry, allowLocalPaths || Boolean(localDevelopment)),\n providerBaseDir,\n targetPath,\n associatedUi: stripUnsafeLocalDevelopment(associatedUi, allowLocalPaths),\n };\n}\n\nfunction resolveDevelopmentTarget(\n development: string | undefined,\n production: string | undefined,\n baseDir: string,\n forceSource?: \"local\" | \"remote\",\n target?: string,\n extendsRef?: string,\n): RuntimeTarget {\n if (forceSource === \"remote\") {\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n if (!development) {\n if (production && target) {\n if (extendsRef) {\n emitConfigWarning(`[Config] Resolving \"${target}\" from ${extendsRef}`);\n } else {\n emitConfigWarning(`[Config] No development target for \"${target}\", using production`);\n }\n }\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n const devTarget = resolveRuntimeTarget(development, baseDir);\n if (devTarget.source === \"local\" && (!devTarget.localPath || !existsSync(devTarget.localPath))) {\n if (production && target) {\n emitConfigWarning(`[Config] Could not load local target for \"${target}\", using production`);\n }\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n return devTarget;\n}\n\nexport interface BuildRuntimeConfigOptions {\n plugins?: Record<string, RuntimePluginConfig>;\n hostSource?: \"local\" | \"remote\";\n uiSource?: \"local\" | \"remote\";\n apiSource?: \"local\" | \"remote\";\n authSource?: \"local\" | \"remote\";\n proxy?: string;\n}\n\nexport function buildRuntimeConfig(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n options?: BuildRuntimeConfigOptions,\n): RuntimeConfig {\n const uiConfig = config.app.ui;\n const apiConfig = config.app.api;\n const authConfig = config.app.auth;\n const uiRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n uiConfig.development,\n uiConfig.production,\n baseDir,\n options?.uiSource,\n \"app.ui\",\n )\n : resolveRuntimeTarget(uiConfig.production, baseDir, \"remote\");\n const apiRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n apiConfig.development,\n apiConfig.production,\n baseDir,\n options?.apiSource,\n \"app.api\",\n )\n : resolveRuntimeTarget(apiConfig.production, baseDir, \"remote\");\n const authExtendsRef = authConfig?.extends\n ? resolveExtendsRef(authConfig.extends, env)\n : undefined;\n const authRuntime = authConfig\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n authConfig.development,\n authConfig.production,\n baseDir,\n options?.authSource,\n \"app.auth\",\n authExtendsRef,\n )\n : resolveRuntimeTarget(authConfig.production, baseDir, \"remote\")\n : undefined;\n\n const hostConfig = config.app.host;\n const hostRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n hostConfig.development,\n hostConfig.production,\n baseDir,\n options?.hostSource,\n \"app.host\",\n )\n : resolveRuntimeTarget(hostConfig.production, baseDir, \"remote\");\n\n const hostListeningUrl =\n env === \"development\"\n ? resolveDevelopmentHostUrl(hostConfig.development)\n : `http://localhost:${DEFAULT_HOST_PORT}`;\n\n const hostIsRemote = hostRuntime.source === \"remote\";\n const uiIsRemote = uiRuntime.source === \"remote\";\n const apiIsRemote = apiRuntime.source === \"remote\";\n const resolvedApiName = resolvePluginRuntimeName(apiConfig.name, apiRuntime.localPath, \"api\");\n\n return {\n env,\n account: config.account,\n domain: config.domain,\n title: config.title,\n description: config.description,\n networkId: getNetworkIdForAccount(config.account),\n repository: config.repository,\n host: {\n name: \"host\",\n url: hostListeningUrl,\n entry: `${hostListeningUrl}/mf-manifest.json`,\n localPath: hostRuntime.localPath,\n port: env === \"development\" ? parsePort(hostListeningUrl) : DEFAULT_HOST_PORT,\n secrets: hostConfig.secrets,\n integrity: hostIsRemote ? hostConfig.integrity : undefined,\n source: hostRuntime.source,\n remoteUrl: hostIsRemote ? hostRuntime.url : undefined,\n },\n ui: {\n name: resolvePluginRuntimeName(uiConfig.name, uiRuntime.localPath, \"ui\"),\n url: uiRuntime.url,\n entry: uiRuntime.url ? `${uiRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: uiRuntime.localPath,\n port: uiRuntime.port,\n ssrUrl: uiIsRemote ? uiConfig.ssr : undefined,\n ssrIntegrity: uiIsRemote ? uiConfig.ssrIntegrity : undefined,\n integrity: uiIsRemote ? uiConfig.integrity : undefined,\n source: uiRuntime.source,\n },\n api: {\n name: resolvedApiName,\n url: apiRuntime.url,\n entry: apiRuntime.url ? `${apiRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: apiRuntime.localPath,\n port: apiRuntime.port,\n source: apiRuntime.source,\n proxy: options?.proxy ?? apiConfig.proxy,\n variables: apiConfig.variables,\n secrets: apiConfig.secrets,\n integrity: apiIsRemote ? apiConfig.integrity : undefined,\n shared: apiConfig.shared,\n },\n auth: (() => {\n if (!authConfig || !authRuntime) return undefined;\n if (!authRuntime.localPath && !authRuntime.url) return undefined;\n return {\n name: resolvePluginRuntimeName(authConfig.name, authRuntime.localPath, \"auth\"),\n extendsRef: authExtendsRef,\n url: authRuntime.url,\n entry: authRuntime.url ? `${authRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: authRuntime.localPath,\n port: authRuntime.port,\n source: authRuntime.source,\n proxy: authConfig.proxy,\n variables: authConfig.variables,\n secrets: authConfig.secrets,\n integrity: authRuntime.source === \"remote\" ? authConfig.integrity : undefined,\n shared: authConfig.shared,\n };\n })(),\n plugins:\n options?.plugins && Object.keys(options.plugins).length > 0 ? options.plugins : undefined,\n };\n}\n\nasync function loadConfigFile(configPath: string, baseDir: string): Promise<BosConfigInput> {\n if (configPath.startsWith(\"bos://\")) {\n return fetchBosConfigFromFastKv<BosConfigInput>(configPath);\n }\n\n const resolvedPath = isAbsolute(configPath) ? configPath : resolve(baseDir, configPath);\n return JSON.parse(readFileSync(resolvedPath, \"utf-8\")) as BosConfigInput;\n}\n\nasync function resolveConfigWithExtends(\n configPath: string,\n baseDir: string,\n visited: Set<string>,\n chain: string[],\n env: BosEnv = \"development\",\n): Promise<BosConfigInput> {\n if (visited.has(configPath)) {\n throw new Error(`Circular extends detected: ${[...visited, configPath].join(\" -> \")}`);\n }\n\n const config = await loadConfigFile(configPath, baseDir);\n chain.push(configPath);\n\n if (!config.extends) {\n return config;\n }\n\n const extendsRef = resolveExtendsRef(config.extends as string | ExtendsConfig, env);\n if (!extendsRef) {\n return config;\n }\n\n const parsedParentRef = parseExtendsTarget(extendsRef);\n\n const nextVisited = new Set(visited);\n nextVisited.add(configPath);\n const parentBaseDir = getConfigBaseDir(parsedParentRef.configPath, baseDir);\n const parent = await resolveConfigWithExtends(\n parsedParentRef.configPath,\n parentBaseDir,\n nextVisited,\n chain,\n env,\n );\n\n return mergeBosConfigWithExtends(parent, config);\n}\n\ntype PluginOverrideValue = PluginEntryValue | null | false;\n\nfunction normalizePluginEntry(raw: PluginOverrideValue): BosPluginRef | null | false {\n if (raw === null || raw === false) return raw;\n if (typeof raw === \"string\") {\n return { extends: raw };\n }\n return raw;\n}\n\nasync function resolveRuntimePlugins(\n plugins: Record<string, PluginOverrideValue>,\n baseDir: string,\n env: BosEnv,\n remotePlugins?: string[],\n): Promise<Record<string, RuntimePluginConfig>> {\n const entries = Object.entries(plugins)\n .map(([pluginId, rawInput]) => ({\n pluginId,\n normalized: normalizePluginEntry(rawInput),\n }))\n .filter(\n (entry): entry is { pluginId: string; normalized: BosPluginRef } =>\n entry.normalized !== null && entry.normalized !== false,\n );\n\n const resolved = await Promise.all(\n entries.map(async ({ pluginId, normalized }) => {\n const resolvedReference = await resolveComposableReference(\n normalized,\n baseDir,\n env,\n `plugins.${pluginId}`,\n );\n\n const forceSource =\n remotePlugins === undefined\n ? undefined\n : remotePlugins.length === 0 || remotePlugins.includes(pluginId)\n ? \"remote\"\n : undefined;\n const pluginRuntime = buildRuntimePluginConfig(pluginId, env, resolvedReference, forceSource);\n\n if (!pluginRuntime.localPath && !pluginRuntime.url) {\n if (forceSource === \"remote\") {\n emitConfigWarning(\n `[Config] Plugin \"${pluginId}\" has no production URL in bos.config.json and cannot be resolved as remote. Add a \"production\" field or remove it from --remote-plugins.`,\n );\n }\n return null;\n }\n\n if (\n pluginRuntime.source === \"remote\" &&\n pluginRuntime.url &&\n !pluginRuntime.localPath &&\n typeof resolvedReference.entry.name !== \"string\"\n ) {\n pluginRuntime.name = await resolveRemotePluginRuntimeName(\n pluginRuntime.url,\n pluginRuntime.name,\n );\n }\n\n return [pluginId, pluginRuntime] as const;\n }),\n );\n\n const out: Record<string, RuntimePluginConfig> = {};\n for (const entry of resolved) {\n if (entry) {\n out[entry[0]] = entry[1];\n }\n }\n\n return out;\n}\n\nasync function resolveRemotePluginRuntimeName(baseUrl: string, fallback: string): Promise<string> {\n const manifest = await fetchJsonOrNull<{\n plugin?: { name?: unknown };\n }>(`${baseUrl.replace(/\\/$/, \"\")}/plugin.manifest.json`, { retries: 0 });\n\n return typeof manifest?.plugin?.name === \"string\" && manifest.plugin.name.length > 0\n ? manifest.plugin.name\n : fallback;\n}\n\nfunction buildRuntimePluginConfig(\n pluginId: string,\n env: BosEnv,\n resolved: ResolvedComposableReference,\n forceSource?: \"local\" | \"remote\",\n): RuntimePluginConfig {\n const source = resolved.entry;\n const development = typeof source.development === \"string\" ? source.development : undefined;\n const production = typeof source.production === \"string\" ? source.production : undefined;\n\n if (production?.startsWith(\"bos://\")) {\n throw new Error(\n `Plugin \"${pluginId}\" has unsupported production target \"${production}\". Use extends: \"bos://account/domain\" for plugin configs or a CDN URL for production.`,\n );\n }\n\n const pluginExtendsRef = source.extends ? resolveExtendsRef(source.extends, env) : undefined;\n\n const runtimeTarget =\n env === \"development\"\n ? resolveDevelopmentTarget(\n development,\n production,\n resolved.providerBaseDir,\n forceSource,\n `plugins.${pluginId}`,\n pluginExtendsRef,\n )\n : resolveRuntimeTarget(production, resolved.providerBaseDir, \"remote\");\n const apiName = resolvePluginRuntimeName(source.name, runtimeTarget.localPath, pluginId);\n\n const uiConfig = resolved.associatedUi;\n const uiDevelopment =\n typeof uiConfig?.development === \"string\" ? uiConfig.development : undefined;\n const uiProduction = typeof uiConfig?.production === \"string\" ? uiConfig.production : undefined;\n const uiRuntime =\n uiConfig && (uiDevelopment || uiProduction)\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n uiDevelopment,\n uiProduction,\n resolved.providerBaseDir,\n forceSource,\n `plugins.${pluginId}.ui`,\n )\n : resolveRuntimeTarget(uiProduction, resolved.providerBaseDir, \"remote\")\n : undefined;\n\n const routes = source.routes;\n\n return {\n name: apiName,\n url: runtimeTarget.url,\n entry: runtimeTarget.url\n ? `${runtimeTarget.url.replace(/\\/$/, \"\")}/mf-manifest.json`\n : \"/mf-manifest.json\",\n source: runtimeTarget.source,\n extendsRef: pluginExtendsRef,\n localPath: runtimeTarget.localPath,\n port: runtimeTarget.port,\n proxy: typeof source.proxy === \"string\" ? source.proxy : undefined,\n variables: normalizeJsonRecord(source.variables),\n secrets: normalizeStringArray(source.secrets),\n shared: source.shared,\n integrity: runtimeTarget.source === \"remote\" ? source.integrity : undefined,\n ui: uiRuntime\n ? {\n name: typeof uiConfig?.name === \"string\" ? uiConfig.name : `${apiName}-ui`,\n url: uiRuntime.url,\n entry: uiRuntime.url\n ? `${uiRuntime.url.replace(/\\/$/, \"\")}/mf-manifest.json`\n : \"/mf-manifest.json\",\n source: uiRuntime.source,\n localPath: uiRuntime.localPath,\n port: uiRuntime.port,\n integrity:\n uiRuntime.source === \"remote\" && typeof uiConfig?.integrity === \"string\"\n ? uiConfig.integrity\n : undefined,\n }\n : undefined,\n routes,\n };\n}\n\nexport function resolvePluginRuntimeName(\n explicitName: string | undefined,\n localPath: string | undefined,\n fallback: string,\n): string {\n if (explicitName) {\n return explicitName;\n }\n\n if (!localPath) {\n return fallback;\n }\n\n try {\n const packageJsonPath = join(localPath, \"package.json\");\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as { name?: unknown };\n if (typeof packageJson.name === \"string\" && packageJson.name.length > 0) {\n return packageJson.name;\n }\n } catch (e) {\n console.warn(`[Config] Could not read package.json at ${localPath}: ${e}`);\n }\n\n return fallback;\n}\n\nfunction normalizeJsonValue(value: unknown): JsonValue | undefined {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value\n .map((item) => normalizeJsonValue(item))\n .filter((item): item is JsonValue => item !== undefined);\n }\n\n if (isPlainObject(value)) {\n const out: JsonObject = {};\n for (const [key, raw] of Object.entries(value)) {\n const normalized = normalizeJsonValue(raw);\n if (normalized !== undefined) {\n out[key] = normalized;\n }\n }\n return out;\n }\n\n return undefined;\n}\n\nfunction normalizeJsonRecord(value: unknown): JsonObject | undefined {\n if (!isPlainObject(value)) return undefined;\n const out: JsonObject = {};\n for (const [key, raw] of Object.entries(value)) {\n const normalized = normalizeJsonValue(raw);\n if (normalized !== undefined) {\n out[key] = normalized;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const out = value.filter((item): item is string => typeof item === \"string\" && item.length > 0);\n return out.length > 0 ? out : undefined;\n}\n\nfunction resolveRuntimeTarget(\n value: string | undefined,\n baseDir: string,\n defaultSource: \"local\" | \"remote\" = \"remote\",\n): RuntimeTarget {\n if (!value) {\n return { source: defaultSource, url: \"\" };\n }\n\n if (value.startsWith(LOCAL_PREFIX)) {\n const localTarget = value?.slice(LOCAL_PREFIX.length).trim();\n if (!localTarget) {\n throw new Error(`Invalid local development target: ${value}`);\n }\n\n const localPath = resolve(baseDir, localTarget);\n if (!existsSync(localPath)) {\n return { source: \"local\", url: \"\" };\n }\n\n return {\n source: \"local\",\n url: \"\",\n localPath,\n };\n }\n\n return {\n source: defaultSource,\n url: value.replace(/\\/$/, \"\"),\n port: parsePort(value),\n };\n}\n\nexport function isLocalDevelopmentTarget(\n value: string | undefined,\n): value is `${typeof LOCAL_PREFIX}${string}` {\n return typeof value === \"string\" && value.startsWith(LOCAL_PREFIX);\n}\n\nexport function resolveLocalDevelopmentPath(\n value: string | undefined,\n baseDir: string,\n): string | null {\n if (!isLocalDevelopmentTarget(value)) {\n return null;\n }\n\n const localTarget = value.slice(LOCAL_PREFIX.length).trim();\n return localTarget ? resolve(baseDir, localTarget) : null;\n}\n\nexport function resolveDevelopmentHostUrl(value: string | undefined): string {\n if (!value || isLocalDevelopmentTarget(value)) {\n return `http://localhost:${DEFAULT_HOST_PORT}`;\n }\n\n return value.replace(/\\/$/, \"\");\n}\n\nexport function getHostDevelopmentPort(value: string | undefined): number {\n return parsePort(resolveDevelopmentHostUrl(value));\n}\n\nexport function parsePort(url: string): number {\n try {\n const parsed = new URL(url);\n return parsed.port ? parseInt(parsed.port, 10) : parsed.protocol === \"https:\" ? 443 : 80;\n } catch {\n return 3000;\n }\n}\n\nexport {\n BOS_CONFIG_ORDER,\n mergeBosConfigWithExtends,\n rebuildOrderedConfig,\n resolveExtendsRef,\n} from \"./merge\";\nexport type { BosConfig, RuntimeConfig } from \"./types\";\nexport { BosConfigSchema } from \"./types\";\n"],"mappings":"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"}
|
package/dist/contract.d.cts
CHANGED
|
@@ -36,8 +36,8 @@ declare const DevOptionsSchema: z.ZodObject<{
|
|
|
36
36
|
}, z.core.$strip>;
|
|
37
37
|
declare const DevResultSchema: z.ZodObject<{
|
|
38
38
|
status: z.ZodEnum<{
|
|
39
|
-
started: "started";
|
|
40
39
|
error: "error";
|
|
40
|
+
started: "started";
|
|
41
41
|
}>;
|
|
42
42
|
description: z.ZodString;
|
|
43
43
|
processes: z.ZodArray<z.ZodString>;
|
|
@@ -377,20 +377,20 @@ declare const KeyPublishResultSchema: z.ZodObject<{
|
|
|
377
377
|
error: z.ZodOptional<z.ZodString>;
|
|
378
378
|
}, z.core.$strip>;
|
|
379
379
|
declare const OverrideSectionSchema: z.ZodEnum<{
|
|
380
|
-
|
|
380
|
+
plugins: "plugins";
|
|
381
381
|
ui: "ui";
|
|
382
|
+
host: "host";
|
|
382
383
|
api: "api";
|
|
383
|
-
plugins: "plugins";
|
|
384
384
|
}>;
|
|
385
385
|
declare const RuntimeOverrideTargetBaseSchema: z.ZodEnum<{
|
|
386
|
+
plugins: "plugins";
|
|
386
387
|
ui: "ui";
|
|
387
388
|
api: "api";
|
|
388
|
-
plugins: "plugins";
|
|
389
389
|
}>;
|
|
390
390
|
declare const RuntimeOverrideTargetSchema: z.ZodUnion<readonly [z.ZodEnum<{
|
|
391
|
+
plugins: "plugins";
|
|
391
392
|
ui: "ui";
|
|
392
393
|
api: "api";
|
|
393
|
-
plugins: "plugins";
|
|
394
394
|
}>, z.ZodString]>;
|
|
395
395
|
declare const InitOptionsSchema: z.ZodObject<{
|
|
396
396
|
extends: z.ZodOptional<z.ZodString>;
|
|
@@ -400,10 +400,10 @@ declare const InitOptionsSchema: z.ZodObject<{
|
|
|
400
400
|
source: z.ZodOptional<z.ZodString>;
|
|
401
401
|
plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
402
402
|
overrides: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
403
|
-
|
|
403
|
+
plugins: "plugins";
|
|
404
404
|
ui: "ui";
|
|
405
|
+
host: "host";
|
|
405
406
|
api: "api";
|
|
406
|
-
plugins: "plugins";
|
|
407
407
|
}>>>;
|
|
408
408
|
noInteractive: z.ZodDefault<z.ZodBoolean>;
|
|
409
409
|
noInstall: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -420,10 +420,10 @@ declare const InitResultSchema: z.ZodObject<{
|
|
|
420
420
|
extends: z.ZodString;
|
|
421
421
|
plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
422
422
|
overrides: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
423
|
-
|
|
423
|
+
plugins: "plugins";
|
|
424
424
|
ui: "ui";
|
|
425
|
+
host: "host";
|
|
425
426
|
api: "api";
|
|
426
|
-
plugins: "plugins";
|
|
427
427
|
}>>>;
|
|
428
428
|
filesCopied: z.ZodNumber;
|
|
429
429
|
timings: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
@@ -511,8 +511,8 @@ declare const StatusResultSchema: z.ZodObject<{
|
|
|
511
511
|
}, z.core.$strip>;
|
|
512
512
|
declare const TypesGenOptionsSchema: z.ZodObject<{
|
|
513
513
|
env: z.ZodOptional<z.ZodEnum<{
|
|
514
|
-
production: "production";
|
|
515
514
|
development: "development";
|
|
515
|
+
production: "production";
|
|
516
516
|
}>>;
|
|
517
517
|
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
518
518
|
}, z.core.$strip>;
|
|
@@ -698,8 +698,8 @@ declare const bosContract: {
|
|
|
698
698
|
interactive: z.ZodOptional<z.ZodBoolean>;
|
|
699
699
|
}, z.core.$strip>, z.ZodObject<{
|
|
700
700
|
status: z.ZodEnum<{
|
|
701
|
-
started: "started";
|
|
702
701
|
error: "error";
|
|
702
|
+
started: "started";
|
|
703
703
|
}>;
|
|
704
704
|
description: z.ZodString;
|
|
705
705
|
processes: z.ZodArray<z.ZodString>;
|
|
@@ -1024,10 +1024,10 @@ declare const bosContract: {
|
|
|
1024
1024
|
source: z.ZodOptional<z.ZodString>;
|
|
1025
1025
|
plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
1026
1026
|
overrides: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
1027
|
-
|
|
1027
|
+
plugins: "plugins";
|
|
1028
1028
|
ui: "ui";
|
|
1029
|
+
host: "host";
|
|
1029
1030
|
api: "api";
|
|
1030
|
-
plugins: "plugins";
|
|
1031
1031
|
}>>>;
|
|
1032
1032
|
noInteractive: z.ZodDefault<z.ZodBoolean>;
|
|
1033
1033
|
noInstall: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -1043,10 +1043,10 @@ declare const bosContract: {
|
|
|
1043
1043
|
extends: z.ZodString;
|
|
1044
1044
|
plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
1045
1045
|
overrides: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
1046
|
-
|
|
1046
|
+
plugins: "plugins";
|
|
1047
1047
|
ui: "ui";
|
|
1048
|
+
host: "host";
|
|
1048
1049
|
api: "api";
|
|
1049
|
-
plugins: "plugins";
|
|
1050
1050
|
}>>>;
|
|
1051
1051
|
filesCopied: z.ZodNumber;
|
|
1052
1052
|
timings: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
@@ -1132,8 +1132,8 @@ declare const bosContract: {
|
|
|
1132
1132
|
}, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
|
|
1133
1133
|
typesGen: _$_orpc_contract0.ContractProcedure<z.ZodObject<{
|
|
1134
1134
|
env: z.ZodOptional<z.ZodEnum<{
|
|
1135
|
-
production: "production";
|
|
1136
1135
|
development: "development";
|
|
1136
|
+
production: "production";
|
|
1137
1137
|
}>>;
|
|
1138
1138
|
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
1139
1139
|
}, z.core.$strip>, z.ZodObject<{
|
package/dist/contract.d.mts
CHANGED
|
@@ -36,8 +36,8 @@ declare const DevOptionsSchema: z.ZodObject<{
|
|
|
36
36
|
}, z.core.$strip>;
|
|
37
37
|
declare const DevResultSchema: z.ZodObject<{
|
|
38
38
|
status: z.ZodEnum<{
|
|
39
|
-
started: "started";
|
|
40
39
|
error: "error";
|
|
40
|
+
started: "started";
|
|
41
41
|
}>;
|
|
42
42
|
description: z.ZodString;
|
|
43
43
|
processes: z.ZodArray<z.ZodString>;
|
|
@@ -377,20 +377,20 @@ declare const KeyPublishResultSchema: z.ZodObject<{
|
|
|
377
377
|
error: z.ZodOptional<z.ZodString>;
|
|
378
378
|
}, z.core.$strip>;
|
|
379
379
|
declare const OverrideSectionSchema: z.ZodEnum<{
|
|
380
|
-
|
|
380
|
+
plugins: "plugins";
|
|
381
381
|
ui: "ui";
|
|
382
|
+
host: "host";
|
|
382
383
|
api: "api";
|
|
383
|
-
plugins: "plugins";
|
|
384
384
|
}>;
|
|
385
385
|
declare const RuntimeOverrideTargetBaseSchema: z.ZodEnum<{
|
|
386
|
+
plugins: "plugins";
|
|
386
387
|
ui: "ui";
|
|
387
388
|
api: "api";
|
|
388
|
-
plugins: "plugins";
|
|
389
389
|
}>;
|
|
390
390
|
declare const RuntimeOverrideTargetSchema: z.ZodUnion<readonly [z.ZodEnum<{
|
|
391
|
+
plugins: "plugins";
|
|
391
392
|
ui: "ui";
|
|
392
393
|
api: "api";
|
|
393
|
-
plugins: "plugins";
|
|
394
394
|
}>, z.ZodString]>;
|
|
395
395
|
declare const InitOptionsSchema: z.ZodObject<{
|
|
396
396
|
extends: z.ZodOptional<z.ZodString>;
|
|
@@ -400,10 +400,10 @@ declare const InitOptionsSchema: z.ZodObject<{
|
|
|
400
400
|
source: z.ZodOptional<z.ZodString>;
|
|
401
401
|
plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
402
402
|
overrides: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
403
|
-
|
|
403
|
+
plugins: "plugins";
|
|
404
404
|
ui: "ui";
|
|
405
|
+
host: "host";
|
|
405
406
|
api: "api";
|
|
406
|
-
plugins: "plugins";
|
|
407
407
|
}>>>;
|
|
408
408
|
noInteractive: z.ZodDefault<z.ZodBoolean>;
|
|
409
409
|
noInstall: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -420,10 +420,10 @@ declare const InitResultSchema: z.ZodObject<{
|
|
|
420
420
|
extends: z.ZodString;
|
|
421
421
|
plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
422
422
|
overrides: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
423
|
-
|
|
423
|
+
plugins: "plugins";
|
|
424
424
|
ui: "ui";
|
|
425
|
+
host: "host";
|
|
425
426
|
api: "api";
|
|
426
|
-
plugins: "plugins";
|
|
427
427
|
}>>>;
|
|
428
428
|
filesCopied: z.ZodNumber;
|
|
429
429
|
timings: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
@@ -511,8 +511,8 @@ declare const StatusResultSchema: z.ZodObject<{
|
|
|
511
511
|
}, z.core.$strip>;
|
|
512
512
|
declare const TypesGenOptionsSchema: z.ZodObject<{
|
|
513
513
|
env: z.ZodOptional<z.ZodEnum<{
|
|
514
|
-
production: "production";
|
|
515
514
|
development: "development";
|
|
515
|
+
production: "production";
|
|
516
516
|
}>>;
|
|
517
517
|
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
518
518
|
}, z.core.$strip>;
|
|
@@ -698,8 +698,8 @@ declare const bosContract: {
|
|
|
698
698
|
interactive: z.ZodOptional<z.ZodBoolean>;
|
|
699
699
|
}, z.core.$strip>, z.ZodObject<{
|
|
700
700
|
status: z.ZodEnum<{
|
|
701
|
-
started: "started";
|
|
702
701
|
error: "error";
|
|
702
|
+
started: "started";
|
|
703
703
|
}>;
|
|
704
704
|
description: z.ZodString;
|
|
705
705
|
processes: z.ZodArray<z.ZodString>;
|
|
@@ -1024,10 +1024,10 @@ declare const bosContract: {
|
|
|
1024
1024
|
source: z.ZodOptional<z.ZodString>;
|
|
1025
1025
|
plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
1026
1026
|
overrides: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
1027
|
-
|
|
1027
|
+
plugins: "plugins";
|
|
1028
1028
|
ui: "ui";
|
|
1029
|
+
host: "host";
|
|
1029
1030
|
api: "api";
|
|
1030
|
-
plugins: "plugins";
|
|
1031
1031
|
}>>>;
|
|
1032
1032
|
noInteractive: z.ZodDefault<z.ZodBoolean>;
|
|
1033
1033
|
noInstall: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -1043,10 +1043,10 @@ declare const bosContract: {
|
|
|
1043
1043
|
extends: z.ZodString;
|
|
1044
1044
|
plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
1045
1045
|
overrides: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
1046
|
-
|
|
1046
|
+
plugins: "plugins";
|
|
1047
1047
|
ui: "ui";
|
|
1048
|
+
host: "host";
|
|
1048
1049
|
api: "api";
|
|
1049
|
-
plugins: "plugins";
|
|
1050
1050
|
}>>>;
|
|
1051
1051
|
filesCopied: z.ZodNumber;
|
|
1052
1052
|
timings: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
@@ -1132,8 +1132,8 @@ declare const bosContract: {
|
|
|
1132
1132
|
}, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
|
|
1133
1133
|
typesGen: _$_orpc_contract0.ContractProcedure<z.ZodObject<{
|
|
1134
1134
|
env: z.ZodOptional<z.ZodEnum<{
|
|
1135
|
-
production: "production";
|
|
1136
1135
|
development: "development";
|
|
1136
|
+
production: "production";
|
|
1137
1137
|
}>>;
|
|
1138
1138
|
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
1139
1139
|
}, z.core.$strip>, z.ZodObject<{
|
package/dist/infra/planner.cjs
CHANGED
|
@@ -211,6 +211,13 @@ function buildServiceDescriptors(runtimeConfig, resolvedPorts) {
|
|
|
211
211
|
port: p.api,
|
|
212
212
|
localPath: pluginCfg.localPath
|
|
213
213
|
});
|
|
214
|
+
if (!pluginIsLocal && pluginCfg.url) descriptors.push({
|
|
215
|
+
key: `plugin:${pluginId}`,
|
|
216
|
+
source: "remote",
|
|
217
|
+
url: pluginCfg.url,
|
|
218
|
+
port: void 0,
|
|
219
|
+
localPath: void 0
|
|
220
|
+
});
|
|
214
221
|
if (pluginIsLocal && p?.ui && pluginCfg.ui?.source === "local") descriptors.push({
|
|
215
222
|
key: `plugin-ui:${pluginId}`,
|
|
216
223
|
source: "local",
|