everything-dev 0.3.3 → 1.3.3
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/README.md +64 -0
- package/cli.js +10 -0
- package/dist/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/api-contract.cjs +172 -0
- package/dist/api-contract.cjs.map +1 -0
- package/dist/api-contract.mjs +171 -0
- package/dist/api-contract.mjs.map +1 -0
- package/dist/api.cjs +124 -0
- package/dist/api.cjs.map +1 -0
- package/dist/api.d.cts +36 -0
- package/dist/api.d.cts.map +1 -0
- package/dist/api.d.mts +36 -0
- package/dist/api.d.mts.map +1 -0
- package/dist/api.mjs +119 -0
- package/dist/api.mjs.map +1 -0
- package/dist/app.cjs +156 -0
- package/dist/app.cjs.map +1 -0
- package/dist/app.mjs +153 -0
- package/dist/app.mjs.map +1 -0
- package/dist/cli/catalog.cjs +30 -0
- package/dist/cli/catalog.cjs.map +1 -0
- package/dist/cli/catalog.mjs +29 -0
- package/dist/cli/catalog.mjs.map +1 -0
- package/dist/cli/help.cjs +16 -0
- package/dist/cli/help.cjs.map +1 -0
- package/dist/cli/help.mjs +16 -0
- package/dist/cli/help.mjs.map +1 -0
- package/dist/cli/init.cjs +287 -0
- package/dist/cli/init.cjs.map +1 -0
- package/dist/cli/init.d.cts +36 -0
- package/dist/cli/init.d.cts.map +1 -0
- package/dist/cli/init.d.mts +36 -0
- package/dist/cli/init.d.mts.map +1 -0
- package/dist/cli/init.mjs +279 -0
- package/dist/cli/init.mjs.map +1 -0
- package/dist/cli/parse.cjs +96 -0
- package/dist/cli/parse.cjs.map +1 -0
- package/dist/cli/parse.mjs +95 -0
- package/dist/cli/parse.mjs.map +1 -0
- package/dist/cli/prompts.cjs +42 -0
- package/dist/cli/prompts.cjs.map +1 -0
- package/dist/cli/prompts.mjs +41 -0
- package/dist/cli/prompts.mjs.map +1 -0
- package/dist/cli.cjs +167 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +166 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/components/dev-view.cjs +307 -0
- package/dist/components/dev-view.cjs.map +1 -0
- package/dist/components/dev-view.mjs +306 -0
- package/dist/components/dev-view.mjs.map +1 -0
- package/dist/components/streaming-view.cjs +146 -0
- package/dist/components/streaming-view.cjs.map +1 -0
- package/dist/components/streaming-view.mjs +144 -0
- package/dist/components/streaming-view.mjs.map +1 -0
- package/dist/config.cjs +280 -0
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.cts +35 -0
- package/dist/config.d.cts.map +1 -0
- package/dist/config.d.mts +35 -0
- package/dist/config.d.mts.map +1 -0
- package/dist/config.mjs +266 -0
- package/dist/config.mjs.map +1 -0
- package/dist/contract.cjs +209 -0
- package/dist/contract.cjs.map +1 -0
- package/dist/contract.d.cts +490 -0
- package/dist/contract.d.cts.map +1 -0
- package/dist/contract.d.mts +490 -0
- package/dist/contract.d.mts.map +1 -0
- package/dist/contract.meta.cjs +104 -0
- package/dist/contract.meta.cjs.map +1 -0
- package/dist/contract.meta.d.cts +141 -0
- package/dist/contract.meta.d.cts.map +1 -0
- package/dist/contract.meta.d.mts +141 -0
- package/dist/contract.meta.d.mts.map +1 -0
- package/dist/contract.meta.mjs +102 -0
- package/dist/contract.meta.mjs.map +1 -0
- package/dist/contract.mjs +186 -0
- package/dist/contract.mjs.map +1 -0
- package/dist/dev-logs.cjs +53 -0
- package/dist/dev-logs.cjs.map +1 -0
- package/dist/dev-logs.mjs +51 -0
- package/dist/dev-logs.mjs.map +1 -0
- package/dist/dev-session.cjs +195 -0
- package/dist/dev-session.cjs.map +1 -0
- package/dist/dev-session.mjs +194 -0
- package/dist/dev-session.mjs.map +1 -0
- package/dist/fastkv.cjs +89 -0
- package/dist/fastkv.cjs.map +1 -0
- package/dist/fastkv.d.cts +11 -0
- package/dist/fastkv.d.cts.map +1 -0
- package/dist/fastkv.d.mts +11 -0
- package/dist/fastkv.d.mts.map +1 -0
- package/dist/fastkv.mjs +82 -0
- package/dist/fastkv.mjs.map +1 -0
- package/dist/federation.server.cjs +27 -0
- package/dist/federation.server.cjs.map +1 -0
- package/dist/federation.server.mjs +27 -0
- package/dist/federation.server.mjs.map +1 -0
- package/dist/host.cjs +367 -0
- package/dist/host.cjs.map +1 -0
- package/dist/host.d.cts +22 -0
- package/dist/host.d.cts.map +1 -0
- package/dist/host.d.mts +22 -0
- package/dist/host.d.mts.map +1 -0
- package/dist/host.mjs +364 -0
- package/dist/host.mjs.map +1 -0
- package/dist/index.cjs +122 -0
- package/dist/index.d.cts +7 -0
- package/dist/index.d.mts +7 -0
- package/dist/index.mjs +9 -0
- package/dist/integrity.cjs +39 -0
- package/dist/integrity.cjs.map +1 -0
- package/dist/integrity.d.cts +7 -0
- package/dist/integrity.d.cts.map +1 -0
- package/dist/integrity.d.mts +7 -0
- package/dist/integrity.d.mts.map +1 -0
- package/dist/integrity.mjs +35 -0
- package/dist/integrity.mjs.map +1 -0
- package/dist/internal/manifest-normalizer.cjs +140 -0
- package/dist/internal/manifest-normalizer.cjs.map +1 -0
- package/dist/internal/manifest-normalizer.mjs +138 -0
- package/dist/internal/manifest-normalizer.mjs.map +1 -0
- package/dist/mf.cjs +77 -0
- package/dist/mf.cjs.map +1 -0
- package/dist/mf.d.cts +19 -0
- package/dist/mf.d.cts.map +1 -0
- package/dist/mf.d.mts +19 -0
- package/dist/mf.d.mts.map +1 -0
- package/dist/mf.mjs +71 -0
- package/dist/mf.mjs.map +1 -0
- package/dist/near-cli.cjs +196 -0
- package/dist/near-cli.cjs.map +1 -0
- package/dist/near-cli.mjs +193 -0
- package/dist/near-cli.mjs.map +1 -0
- package/dist/network.cjs +9 -0
- package/dist/network.cjs.map +1 -0
- package/dist/network.mjs +8 -0
- package/dist/network.mjs.map +1 -0
- package/dist/orchestrator.cjs +441 -0
- package/dist/orchestrator.cjs.map +1 -0
- package/dist/orchestrator.d.cts +40 -0
- package/dist/orchestrator.d.cts.map +1 -0
- package/dist/orchestrator.d.mts +40 -0
- package/dist/orchestrator.d.mts.map +1 -0
- package/dist/orchestrator.mjs +436 -0
- package/dist/orchestrator.mjs.map +1 -0
- package/dist/plugin.cjs +830 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +347 -0
- package/dist/plugin.d.cts.map +1 -0
- package/dist/plugin.d.mts +348 -0
- package/dist/plugin.d.mts.map +1 -0
- package/dist/plugin.mjs +827 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/process-registry.cjs +120 -0
- package/dist/process-registry.cjs.map +1 -0
- package/dist/process-registry.d.cts +25 -0
- package/dist/process-registry.d.cts.map +1 -0
- package/dist/process-registry.d.mts +25 -0
- package/dist/process-registry.d.mts.map +1 -0
- package/dist/process-registry.mjs +119 -0
- package/dist/process-registry.mjs.map +1 -0
- package/dist/sdk.cjs +61 -0
- package/dist/sdk.d.cts +5 -0
- package/dist/sdk.d.mts +5 -0
- package/dist/sdk.mjs +6 -0
- package/dist/shared.cjs +143 -0
- package/dist/shared.cjs.map +1 -0
- package/dist/shared.d.cts +33 -0
- package/dist/shared.d.cts.map +1 -0
- package/dist/shared.d.mts +33 -0
- package/dist/shared.d.mts.map +1 -0
- package/dist/shared.mjs +140 -0
- package/dist/shared.mjs.map +1 -0
- package/dist/types.cjs +160 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +269 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +269 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +144 -0
- package/dist/types.mjs.map +1 -0
- package/dist/ui/head.cjs +67 -0
- package/dist/ui/head.cjs.map +1 -0
- package/dist/ui/head.d.cts +19 -0
- package/dist/ui/head.d.cts.map +1 -0
- package/dist/ui/head.d.mts +19 -0
- package/dist/ui/head.d.mts.map +1 -0
- package/dist/ui/head.mjs +61 -0
- package/dist/ui/head.mjs.map +1 -0
- package/dist/ui/index.cjs +32 -0
- package/dist/ui/index.d.cts +7 -0
- package/dist/ui/index.d.mts +7 -0
- package/dist/ui/index.mjs +6 -0
- package/dist/ui/metadata.cjs +106 -0
- package/dist/ui/metadata.cjs.map +1 -0
- package/dist/ui/metadata.d.cts +35 -0
- package/dist/ui/metadata.d.cts.map +1 -0
- package/dist/ui/metadata.d.mts +35 -0
- package/dist/ui/metadata.d.mts.map +1 -0
- package/dist/ui/metadata.mjs +100 -0
- package/dist/ui/metadata.mjs.map +1 -0
- package/dist/ui/router.cjs +56 -0
- package/dist/ui/router.cjs.map +1 -0
- package/dist/ui/router.d.cts +11 -0
- package/dist/ui/router.d.cts.map +1 -0
- package/dist/ui/router.d.mts +11 -0
- package/dist/ui/router.d.mts.map +1 -0
- package/dist/ui/router.mjs +51 -0
- package/dist/ui/router.mjs.map +1 -0
- package/dist/ui/runtime.cjs +65 -0
- package/dist/ui/runtime.cjs.map +1 -0
- package/dist/ui/runtime.d.cts +29 -0
- package/dist/ui/runtime.d.cts.map +1 -0
- package/dist/ui/runtime.d.mts +29 -0
- package/dist/ui/runtime.d.mts.map +1 -0
- package/dist/ui/runtime.mjs +53 -0
- package/dist/ui/runtime.mjs.map +1 -0
- package/dist/ui/types.cjs +0 -0
- package/dist/ui/types.d.cts +52 -0
- package/dist/ui/types.d.cts.map +1 -0
- package/dist/ui/types.d.mts +52 -0
- package/dist/ui/types.d.mts.map +1 -0
- package/dist/ui/types.mjs +1 -0
- package/dist/utils/banner.cjs +24 -0
- package/dist/utils/banner.cjs.map +1 -0
- package/dist/utils/banner.mjs +23 -0
- package/dist/utils/banner.mjs.map +1 -0
- package/dist/utils/linkify.cjs +15 -0
- package/dist/utils/linkify.cjs.map +1 -0
- package/dist/utils/linkify.mjs +14 -0
- package/dist/utils/linkify.mjs.map +1 -0
- package/dist/utils/run.cjs +40 -0
- package/dist/utils/run.cjs.map +1 -0
- package/dist/utils/run.mjs +39 -0
- package/dist/utils/run.mjs.map +1 -0
- package/dist/utils/theme.cjs +44 -0
- package/dist/utils/theme.cjs.map +1 -0
- package/dist/utils/theme.mjs +37 -0
- package/dist/utils/theme.mjs.map +1 -0
- package/package.json +269 -80
- package/src/api-contract.ts +309 -0
- package/src/api.ts +181 -0
- package/src/app.ts +346 -0
- package/src/cli/catalog.ts +49 -0
- package/src/cli/help.ts +13 -0
- package/src/cli/init.ts +386 -0
- package/src/cli/parse.ts +130 -0
- package/src/cli/prompts.ts +64 -0
- package/src/cli.ts +203 -1507
- package/src/components/dev-view.tsx +307 -255
- package/src/components/streaming-view.ts +164 -128
- package/src/config.ts +462 -532
- package/src/contract.meta.ts +96 -0
- package/src/contract.ts +164 -561
- package/src/dev-logs.ts +85 -0
- package/src/dev-session.ts +318 -0
- package/src/fastkv.ts +153 -0
- package/src/federation.server.ts +43 -0
- package/src/host.ts +526 -0
- package/src/index.ts +6 -3
- package/src/integrity.ts +54 -0
- package/src/internal/manifest-normalizer.ts +251 -0
- package/src/mf.ts +105 -0
- package/src/near-cli.ts +284 -0
- package/src/network.ts +3 -0
- package/src/orchestrator.ts +648 -0
- package/src/plugin.ts +1130 -2311
- package/src/process-registry.ts +154 -0
- package/src/scripts/sync-api-contract.ts +24 -0
- package/src/sdk.ts +14 -0
- package/src/shared.ts +206 -0
- package/src/types.ts +152 -206
- package/src/ui/head.ts +34 -27
- package/src/ui/index.ts +3 -3
- package/src/ui/metadata.ts +95 -0
- package/src/ui/router.ts +22 -6
- package/src/ui/runtime.ts +55 -6
- package/src/ui/types.ts +24 -11
- package/src/utils/banner.ts +10 -6
- package/src/utils/run.ts +26 -27
- package/src/utils/theme.ts +3 -66
- package/src/components/monitor-view.tsx +0 -475
- package/src/components/status-view.tsx +0 -173
- package/src/lib/env.ts +0 -109
- package/src/lib/near-cli.ts +0 -289
- package/src/lib/nova.ts +0 -266
- package/src/lib/orchestrator.ts +0 -276
- package/src/lib/process-registry.ts +0 -166
- package/src/lib/process.ts +0 -550
- package/src/lib/resource-monitor/assertions.ts +0 -234
- package/src/lib/resource-monitor/command.ts +0 -283
- package/src/lib/resource-monitor/diff.ts +0 -157
- package/src/lib/resource-monitor/errors.ts +0 -127
- package/src/lib/resource-monitor/index.ts +0 -305
- package/src/lib/resource-monitor/platform/darwin.ts +0 -306
- package/src/lib/resource-monitor/platform/index.ts +0 -35
- package/src/lib/resource-monitor/platform/linux.ts +0 -332
- package/src/lib/resource-monitor/platform/windows.ts +0 -298
- package/src/lib/resource-monitor/snapshot.ts +0 -217
- package/src/lib/resource-monitor/types.ts +0 -74
- package/src/lib/session-recorder/errors.ts +0 -102
- package/src/lib/session-recorder/flows/login.ts +0 -210
- package/src/lib/session-recorder/index.ts +0 -361
- package/src/lib/session-recorder/playwright.ts +0 -257
- package/src/lib/session-recorder/report.ts +0 -353
- package/src/lib/session-recorder/server.ts +0 -268
- package/src/lib/session-recorder/types.ts +0 -115
- package/src/lib/sync.ts +0 -1
- package/src/ui/files.ts +0 -134
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.cjs","names":["BosConfigSchema","getNetworkIdForAccount","fetchBosConfigFromFastKv"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fetchBosConfigFromFastKv } from \"./fastkv\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport type { BosConfig, RuntimeConfig, RuntimePluginConfig } from \"./types\";\nimport { BosConfigSchema } from \"./types\";\n\ninterface BosConfigInput extends Record<string, unknown> {\n extends?: string;\n development?: string;\n production?: string;\n productionIntegrity?: string;\n proxy?: string;\n variables?: Record<string, string>;\n secrets?: string[];\n app?: Record<string, Record<string, unknown>>;\n shared?: Record<string, Record<string, Record<string, unknown>>>;\n plugins?: Record<string, BosConfigInput>;\n}\n\nconst LOCAL_PREFIX = \"local:\";\nconst DEFAULT_HOST_PORT = 3000;\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;\n\nexport function clearConfigCache(): void {\n cachedConfig = null;\n projectRoot = null;\n}\n\nexport function findConfigPath(cwd?: string): string | null {\n let dir = cwd ?? process.cwd();\n while (dir !== \"/\") {\n const configPath = join(dir, \"bos.config.json\");\n if (existsSync(configPath)) {\n return configPath;\n }\n dir = dirname(dir);\n }\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 loadConfig() 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}\n\nexport async function loadConfig(options?: {\n cwd?: string;\n path?: string;\n env?: \"development\" | \"production\";\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\n try {\n const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(configPath, baseDir, new Set(), extendedChain);\n const config = BosConfigSchema.parse(parsed);\n\n cachedConfig = config;\n projectRoot = baseDir;\n\n const pluginRuntime = await resolveRuntimePlugins(\n config.plugins ?? {},\n baseDir,\n options?.env ?? \"development\",\n );\n const runtime = buildRuntimeConfig(config, baseDir, options?.env ?? \"development\", {\n plugins: pluginRuntime,\n });\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 };\n } catch (error) {\n throw new Error(`Failed to load config from ${configPath}: ${error}`);\n }\n}\n\nexport async function loadBosConfig(options?: {\n cwd?: string;\n path?: string;\n env?: \"development\" | \"production\";\n}): Promise<RuntimeConfig> {\n const result = await loadConfig(options);\n if (!result) {\n throw new Error(\"No bos.config.json found\");\n }\n\n return result.runtime;\n}\n\nexport async function buildRuntimePluginsForConfig(\n config: BosConfig,\n baseDir: string,\n env: \"development\" | \"production\",\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 buildRuntimeConfig(\n config: BosConfig,\n baseDir: string,\n env: \"development\" | \"production\",\n options?: { plugins?: Record<string, RuntimePluginConfig> },\n): RuntimeConfig {\n const uiConfig = config.app.ui;\n const apiConfig = config.app.api;\n const uiRuntime =\n env === \"development\"\n ? resolveRuntimeTarget(uiConfig.development, baseDir)\n : resolveRuntimeTarget(uiConfig.production, baseDir, \"remote\");\n const apiRuntime =\n env === \"development\"\n ? resolveRuntimeTarget(apiConfig.development, baseDir)\n : resolveRuntimeTarget(apiConfig.production, baseDir, \"remote\");\n\n return {\n env,\n account: config.account,\n domain: config.domain,\n networkId: getNetworkIdForAccount(config.account),\n repository: config.repository,\n hostUrl:\n env === \"development\"\n ? resolveDevelopmentHostUrl(config.app.host.development)\n : config.app.host.production,\n shared: config.shared,\n ui: {\n name: uiConfig.name,\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: uiConfig.ssr,\n ssrIntegrity: env === \"production\" ? uiConfig.ssrIntegrity : undefined,\n integrity: env === \"production\" ? uiConfig.productionIntegrity : undefined,\n source: uiRuntime.source,\n },\n api: {\n name: apiConfig.name,\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: apiConfig.proxy,\n variables: apiConfig.variables,\n secrets: apiConfig.secrets,\n integrity: env === \"production\" ? apiConfig.productionIntegrity : undefined,\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): 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 if (configPath.startsWith(\"bos://\")) {\n chain.push(configPath);\n }\n\n if (!config.extends) {\n return config;\n }\n\n const nextVisited = new Set(visited);\n nextVisited.add(configPath);\n const parentPath = config.extends;\n const parentBaseDir = parentPath.startsWith(\"bos://\")\n ? baseDir\n : isAbsolute(parentPath)\n ? dirname(parentPath)\n : baseDir;\n const parent = await resolveConfigWithExtends(parentPath, parentBaseDir, nextVisited, chain);\n\n return mergeConfigs(parent, config);\n}\n\nfunction mergeConfigs(parent: BosConfigInput, child: BosConfigInput): BosConfigInput {\n const result = mergeValues(parent, child) as BosConfigInput;\n if (child.plugins !== undefined) {\n result.plugins = child.plugins;\n }\n return result;\n}\n\nasync function resolveRuntimePlugins(\n plugins: Record<string, BosConfigInput>,\n baseDir: string,\n env: \"development\" | \"production\",\n prefix: string[] = [],\n): Promise<Record<string, RuntimePluginConfig>> {\n const out: Record<string, RuntimePluginConfig> = {};\n\n for (const [pluginId, pluginInput] of Object.entries(plugins)) {\n const runtimeKey = [...prefix, pluginId].join(\"/\");\n const { config: resolvedConfig, baseDir: pluginBaseDir } = await resolveBosConfigInput(\n pluginInput,\n baseDir,\n new Set(),\n [],\n );\n\n const pluginRuntime = buildRuntimePluginConfig(\n runtimeKey,\n resolvedConfig,\n pluginBaseDir,\n env,\n pluginInput,\n );\n if (\n pluginRuntime.source === \"remote\" &&\n pluginRuntime.url &&\n !pluginRuntime.localPath &&\n typeof resolvedConfig.app?.api?.name !== \"string\"\n ) {\n pluginRuntime.name = await resolveRemotePluginRuntimeName(\n pluginRuntime.url,\n pluginRuntime.name,\n );\n }\n\n const productionIntegrity = pluginInput.productionIntegrity;\n if (env === \"production\" && productionIntegrity) {\n pluginRuntime.integrity = productionIntegrity;\n }\n\n out[runtimeKey] = pluginRuntime;\n\n if (resolvedConfig.plugins && Object.keys(resolvedConfig.plugins).length > 0) {\n const nested = await resolveRuntimePlugins(resolvedConfig.plugins, pluginBaseDir, env, [\n ...prefix,\n pluginId,\n ]);\n Object.assign(out, nested);\n }\n }\n\n return out;\n}\n\nasync function resolveRemotePluginRuntimeName(baseUrl: string, fallback: string): Promise<string> {\n try {\n const response = await fetch(`${baseUrl.replace(/\\/$/, \"\")}/plugin.manifest.json`);\n if (!response.ok) {\n return fallback;\n }\n\n const manifest = (await response.json()) as {\n plugin?: { name?: unknown };\n };\n\n return typeof manifest.plugin?.name === \"string\" && manifest.plugin.name.length > 0\n ? manifest.plugin.name\n : fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction buildRuntimePluginConfig(\n pluginId: string,\n config: BosConfigInput,\n baseDir: string,\n env: \"development\" | \"production\",\n source: BosConfigInput,\n): RuntimePluginConfig {\n const apiConfig = config.app?.api ?? {};\n const apiDevelopment =\n typeof apiConfig.development === \"string\" ? apiConfig.development : undefined;\n const apiProduction = typeof apiConfig.production === \"string\" ? apiConfig.production : undefined;\n const sourceDevelopment = typeof source.development === \"string\" ? source.development : undefined;\n const sourceProduction = typeof source.production === \"string\" ? source.production : undefined;\n const proxy = typeof apiConfig.proxy === \"string\" ? apiConfig.proxy : undefined;\n const runtimeTarget =\n env === \"development\"\n ? resolveRuntimeTarget(apiDevelopment ?? sourceDevelopment, baseDir)\n : resolveRuntimeTarget(apiProduction ?? sourceProduction, baseDir, \"remote\");\n const apiName = resolvePluginRuntimeName(\n typeof apiConfig.name === \"string\" ? apiConfig.name : undefined,\n runtimeTarget.localPath,\n pluginId,\n );\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 localPath: runtimeTarget.localPath,\n port: runtimeTarget.port,\n proxy: proxy ?? (typeof source.proxy === \"string\" ? source.proxy : undefined),\n variables: normalizeStringRecord(apiConfig.variables ?? source.variables),\n secrets: normalizeStringArray(apiConfig.secrets ?? source.secrets),\n };\n}\n\nfunction 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 {}\n\n return fallback;\n}\n\nasync function resolveBosConfigInput(\n input: BosConfigInput,\n baseDir: string,\n visited: Set<string>,\n chain: string[],\n): Promise<{ config: BosConfigInput; baseDir: string }> {\n if (input.extends) {\n const parentBaseDir = input.extends.startsWith(\"bos://\")\n ? baseDir\n : isAbsolute(input.extends)\n ? dirname(input.extends)\n : baseDir;\n const config = await resolveConfigWithExtends(input.extends, parentBaseDir, visited, chain);\n return { config: mergeConfigs(config, input), baseDir: parentBaseDir };\n }\n\n return { config: input, baseDir };\n}\n\nfunction mergeValues(parent: unknown, child: unknown): unknown {\n if (Array.isArray(parent) && Array.isArray(child)) {\n return child;\n }\n\n if (isPlainObject(parent) && isPlainObject(child)) {\n const merged: Record<string, unknown> = { ...parent };\n for (const [key, value] of Object.entries(child)) {\n merged[key] = key in merged ? mergeValues(merged[key], value) : value;\n }\n return merged;\n }\n\n return child ?? parent;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction normalizeStringRecord(value: unknown): Record<string, string> | undefined {\n if (!isPlainObject(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === \"string\") {\n out[key] = raw;\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 return {\n source: \"local\",\n url: \"\",\n localPath: resolve(baseDir, localTarget),\n };\n }\n\n return {\n source: defaultSource,\n url: value.replace(/\\/$/, \"\"),\n port: parsePort(value),\n };\n}\n\nexport function isLocalDevelopmentTarget(value: string | undefined): boolean {\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 type { BosConfig, RuntimeConfig } from \"./types\";\nexport { BosConfigSchema } from \"./types\";\n"],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { BosConfig, BosConfigSchema, RuntimeConfig, RuntimePluginConfig } from "./types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/config.d.ts
|
|
4
|
+
declare function clearConfigCache(): void;
|
|
5
|
+
declare function findConfigPath(cwd?: string): string | null;
|
|
6
|
+
declare function getConfig(): BosConfig | null;
|
|
7
|
+
declare function getProjectRoot(): string;
|
|
8
|
+
interface ConfigResult {
|
|
9
|
+
config: BosConfig;
|
|
10
|
+
runtime: RuntimeConfig;
|
|
11
|
+
source: {
|
|
12
|
+
path: string;
|
|
13
|
+
extended?: string[];
|
|
14
|
+
remote?: boolean;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
declare function loadConfig(options?: {
|
|
18
|
+
cwd?: string;
|
|
19
|
+
path?: string;
|
|
20
|
+
env?: "development" | "production";
|
|
21
|
+
}): Promise<ConfigResult | null>;
|
|
22
|
+
declare function loadBosConfig(options?: {
|
|
23
|
+
cwd?: string;
|
|
24
|
+
path?: string;
|
|
25
|
+
env?: "development" | "production";
|
|
26
|
+
}): Promise<RuntimeConfig>;
|
|
27
|
+
declare function buildRuntimePluginsForConfig(config: BosConfig, baseDir: string, env: "development" | "production"): Promise<Record<string, RuntimePluginConfig> | undefined>;
|
|
28
|
+
declare function isLocalDevelopmentTarget(value: string | undefined): boolean;
|
|
29
|
+
declare function resolveLocalDevelopmentPath(value: string | undefined, baseDir: string): string | null;
|
|
30
|
+
declare function resolveDevelopmentHostUrl(value: string | undefined): string;
|
|
31
|
+
declare function getHostDevelopmentPort(value: string | undefined): number;
|
|
32
|
+
declare function parsePort(url: string): number;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { type BosConfig, BosConfigSchema, ConfigResult, type RuntimeConfig, buildRuntimePluginsForConfig, clearConfigCache, findConfigPath, getConfig, getHostDevelopmentPort, getProjectRoot, isLocalDevelopmentTarget, loadBosConfig, loadConfig, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath };
|
|
35
|
+
//# sourceMappingURL=config.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.cts","names":[],"sources":["../src/config.ts"],"mappings":";;;iBAiCgB,gBAAA,CAAA;AAAA,iBAKA,cAAA,CAAe,GAAA;AAAA,iBAYf,SAAA,CAAA,GAAa,SAAA;AAAA,iBAIb,cAAA,CAAA;AAAA,UAOC,YAAA;EACf,MAAA,EAAQ,SAAA;EACR,OAAA,EAAS,aAAA;EACT,MAAA;IACE,IAAA;IACA,QAAA;IACA,MAAA;EAAA;AAAA;AAAA,iBAIkB,UAAA,CAAW,OAAA;EAC/B,GAAA;EACA,IAAA;EACA,GAAA;AAAA,IACE,OAAA,CAAQ,YAAA;AAAA,iBAwCU,aAAA,CAAc,OAAA;EAClC,GAAA;EACA,IAAA;EACA,GAAA;AAAA,IACE,OAAA,CAAQ,aAAA;AAAA,iBASU,4BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,iCACC,OAAA,CAAQ,MAAA,SAAe,mBAAA;AAAA,iBA4UV,wBAAA,CAAyB,KAAA;AAAA,iBAIzB,2BAAA,CACd,KAAA,sBACA,OAAA;AAAA,iBAUc,yBAAA,CAA0B,KAAA;AAAA,iBAQ1B,sBAAA,CAAuB,KAAA;AAAA,iBAIvB,SAAA,CAAU,GAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { BosConfig, BosConfigSchema, RuntimeConfig, RuntimePluginConfig } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/config.d.ts
|
|
4
|
+
declare function clearConfigCache(): void;
|
|
5
|
+
declare function findConfigPath(cwd?: string): string | null;
|
|
6
|
+
declare function getConfig(): BosConfig | null;
|
|
7
|
+
declare function getProjectRoot(): string;
|
|
8
|
+
interface ConfigResult {
|
|
9
|
+
config: BosConfig;
|
|
10
|
+
runtime: RuntimeConfig;
|
|
11
|
+
source: {
|
|
12
|
+
path: string;
|
|
13
|
+
extended?: string[];
|
|
14
|
+
remote?: boolean;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
declare function loadConfig(options?: {
|
|
18
|
+
cwd?: string;
|
|
19
|
+
path?: string;
|
|
20
|
+
env?: "development" | "production";
|
|
21
|
+
}): Promise<ConfigResult | null>;
|
|
22
|
+
declare function loadBosConfig(options?: {
|
|
23
|
+
cwd?: string;
|
|
24
|
+
path?: string;
|
|
25
|
+
env?: "development" | "production";
|
|
26
|
+
}): Promise<RuntimeConfig>;
|
|
27
|
+
declare function buildRuntimePluginsForConfig(config: BosConfig, baseDir: string, env: "development" | "production"): Promise<Record<string, RuntimePluginConfig> | undefined>;
|
|
28
|
+
declare function isLocalDevelopmentTarget(value: string | undefined): boolean;
|
|
29
|
+
declare function resolveLocalDevelopmentPath(value: string | undefined, baseDir: string): string | null;
|
|
30
|
+
declare function resolveDevelopmentHostUrl(value: string | undefined): string;
|
|
31
|
+
declare function getHostDevelopmentPort(value: string | undefined): number;
|
|
32
|
+
declare function parsePort(url: string): number;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { type BosConfig, BosConfigSchema, ConfigResult, type RuntimeConfig, buildRuntimePluginsForConfig, clearConfigCache, findConfigPath, getConfig, getHostDevelopmentPort, getProjectRoot, isLocalDevelopmentTarget, loadBosConfig, loadConfig, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath };
|
|
35
|
+
//# sourceMappingURL=config.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.mts","names":[],"sources":["../src/config.ts"],"mappings":";;;iBAiCgB,gBAAA,CAAA;AAAA,iBAKA,cAAA,CAAe,GAAA;AAAA,iBAYf,SAAA,CAAA,GAAa,SAAA;AAAA,iBAIb,cAAA,CAAA;AAAA,UAOC,YAAA;EACf,MAAA,EAAQ,SAAA;EACR,OAAA,EAAS,aAAA;EACT,MAAA;IACE,IAAA;IACA,QAAA;IACA,MAAA;EAAA;AAAA;AAAA,iBAIkB,UAAA,CAAW,OAAA;EAC/B,GAAA;EACA,IAAA;EACA,GAAA;AAAA,IACE,OAAA,CAAQ,YAAA;AAAA,iBAwCU,aAAA,CAAc,OAAA;EAClC,GAAA;EACA,IAAA;EACA,GAAA;AAAA,IACE,OAAA,CAAQ,aAAA;AAAA,iBASU,4BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,iCACC,OAAA,CAAQ,MAAA,SAAe,mBAAA;AAAA,iBA4UV,wBAAA,CAAyB,KAAA;AAAA,iBAIzB,2BAAA,CACd,KAAA,sBACA,OAAA;AAAA,iBAUc,yBAAA,CAA0B,KAAA;AAAA,iBAQ1B,sBAAA,CAAuB,KAAA;AAAA,iBAIvB,SAAA,CAAU,GAAA"}
|
package/dist/config.mjs
ADDED
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { fetchBosConfigFromFastKv } from "./fastkv.mjs";
|
|
2
|
+
import { getNetworkIdForAccount } from "./network.mjs";
|
|
3
|
+
import { BosConfigSchema } from "./types.mjs";
|
|
4
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
5
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
6
|
+
|
|
7
|
+
//#region src/config.ts
|
|
8
|
+
const LOCAL_PREFIX = "local:";
|
|
9
|
+
const DEFAULT_HOST_PORT = 3e3;
|
|
10
|
+
let cachedConfig = null;
|
|
11
|
+
let projectRoot = null;
|
|
12
|
+
function clearConfigCache() {
|
|
13
|
+
cachedConfig = null;
|
|
14
|
+
projectRoot = null;
|
|
15
|
+
}
|
|
16
|
+
function findConfigPath(cwd) {
|
|
17
|
+
let dir = cwd ?? process.cwd();
|
|
18
|
+
while (dir !== "/") {
|
|
19
|
+
const configPath = join(dir, "bos.config.json");
|
|
20
|
+
if (existsSync(configPath)) return configPath;
|
|
21
|
+
dir = dirname(dir);
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
function getConfig() {
|
|
26
|
+
return cachedConfig;
|
|
27
|
+
}
|
|
28
|
+
function getProjectRoot() {
|
|
29
|
+
if (!projectRoot) throw new Error("Config not loaded. Call loadConfig() first.");
|
|
30
|
+
return projectRoot;
|
|
31
|
+
}
|
|
32
|
+
async function loadConfig(options) {
|
|
33
|
+
const configPath = options?.path ?? findConfigPath(options?.cwd);
|
|
34
|
+
if (!configPath) {
|
|
35
|
+
projectRoot = options?.cwd ?? process.cwd();
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const baseDir = dirname(configPath);
|
|
39
|
+
try {
|
|
40
|
+
const extendedChain = [];
|
|
41
|
+
const parsed = await resolveConfigWithExtends(configPath, baseDir, /* @__PURE__ */ new Set(), extendedChain);
|
|
42
|
+
const config = BosConfigSchema.parse(parsed);
|
|
43
|
+
cachedConfig = config;
|
|
44
|
+
projectRoot = baseDir;
|
|
45
|
+
const pluginRuntime = await resolveRuntimePlugins(config.plugins ?? {}, baseDir, options?.env ?? "development");
|
|
46
|
+
return {
|
|
47
|
+
config,
|
|
48
|
+
runtime: buildRuntimeConfig(config, baseDir, options?.env ?? "development", { plugins: pluginRuntime }),
|
|
49
|
+
source: {
|
|
50
|
+
path: configPath,
|
|
51
|
+
extended: extendedChain.length > 0 ? extendedChain : void 0,
|
|
52
|
+
remote: extendedChain.some((entry) => entry.startsWith("bos://"))
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
} catch (error) {
|
|
56
|
+
throw new Error(`Failed to load config from ${configPath}: ${error}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function loadBosConfig(options) {
|
|
60
|
+
const result = await loadConfig(options);
|
|
61
|
+
if (!result) throw new Error("No bos.config.json found");
|
|
62
|
+
return result.runtime;
|
|
63
|
+
}
|
|
64
|
+
async function buildRuntimePluginsForConfig(config, baseDir, env) {
|
|
65
|
+
const plugins = await resolveRuntimePlugins(config.plugins ?? {}, baseDir, env);
|
|
66
|
+
return Object.keys(plugins).length > 0 ? plugins : void 0;
|
|
67
|
+
}
|
|
68
|
+
function buildRuntimeConfig(config, baseDir, env, options) {
|
|
69
|
+
const uiConfig = config.app.ui;
|
|
70
|
+
const apiConfig = config.app.api;
|
|
71
|
+
const uiRuntime = env === "development" ? resolveRuntimeTarget(uiConfig.development, baseDir) : resolveRuntimeTarget(uiConfig.production, baseDir, "remote");
|
|
72
|
+
const apiRuntime = env === "development" ? resolveRuntimeTarget(apiConfig.development, baseDir) : resolveRuntimeTarget(apiConfig.production, baseDir, "remote");
|
|
73
|
+
return {
|
|
74
|
+
env,
|
|
75
|
+
account: config.account,
|
|
76
|
+
domain: config.domain,
|
|
77
|
+
networkId: getNetworkIdForAccount(config.account),
|
|
78
|
+
repository: config.repository,
|
|
79
|
+
hostUrl: env === "development" ? resolveDevelopmentHostUrl(config.app.host.development) : config.app.host.production,
|
|
80
|
+
shared: config.shared,
|
|
81
|
+
ui: {
|
|
82
|
+
name: uiConfig.name,
|
|
83
|
+
url: uiRuntime.url,
|
|
84
|
+
entry: uiRuntime.url ? `${uiRuntime.url}/mf-manifest.json` : "/mf-manifest.json",
|
|
85
|
+
localPath: uiRuntime.localPath,
|
|
86
|
+
port: uiRuntime.port,
|
|
87
|
+
ssrUrl: uiConfig.ssr,
|
|
88
|
+
ssrIntegrity: env === "production" ? uiConfig.ssrIntegrity : void 0,
|
|
89
|
+
integrity: env === "production" ? uiConfig.productionIntegrity : void 0,
|
|
90
|
+
source: uiRuntime.source
|
|
91
|
+
},
|
|
92
|
+
api: {
|
|
93
|
+
name: apiConfig.name,
|
|
94
|
+
url: apiRuntime.url,
|
|
95
|
+
entry: apiRuntime.url ? `${apiRuntime.url}/mf-manifest.json` : "/mf-manifest.json",
|
|
96
|
+
localPath: apiRuntime.localPath,
|
|
97
|
+
port: apiRuntime.port,
|
|
98
|
+
source: apiRuntime.source,
|
|
99
|
+
proxy: apiConfig.proxy,
|
|
100
|
+
variables: apiConfig.variables,
|
|
101
|
+
secrets: apiConfig.secrets,
|
|
102
|
+
integrity: env === "production" ? apiConfig.productionIntegrity : void 0
|
|
103
|
+
},
|
|
104
|
+
plugins: options?.plugins && Object.keys(options.plugins).length > 0 ? options.plugins : void 0
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
async function loadConfigFile(configPath, baseDir) {
|
|
108
|
+
if (configPath.startsWith("bos://")) return fetchBosConfigFromFastKv(configPath);
|
|
109
|
+
const resolvedPath = isAbsolute(configPath) ? configPath : resolve(baseDir, configPath);
|
|
110
|
+
return JSON.parse(readFileSync(resolvedPath, "utf-8"));
|
|
111
|
+
}
|
|
112
|
+
async function resolveConfigWithExtends(configPath, baseDir, visited, chain) {
|
|
113
|
+
if (visited.has(configPath)) throw new Error(`Circular extends detected: ${[...visited, configPath].join(" -> ")}`);
|
|
114
|
+
const config = await loadConfigFile(configPath, baseDir);
|
|
115
|
+
if (configPath.startsWith("bos://")) chain.push(configPath);
|
|
116
|
+
if (!config.extends) return config;
|
|
117
|
+
const nextVisited = new Set(visited);
|
|
118
|
+
nextVisited.add(configPath);
|
|
119
|
+
const parentPath = config.extends;
|
|
120
|
+
return mergeConfigs(await resolveConfigWithExtends(parentPath, parentPath.startsWith("bos://") ? baseDir : isAbsolute(parentPath) ? dirname(parentPath) : baseDir, nextVisited, chain), config);
|
|
121
|
+
}
|
|
122
|
+
function mergeConfigs(parent, child) {
|
|
123
|
+
const result = mergeValues(parent, child);
|
|
124
|
+
if (child.plugins !== void 0) result.plugins = child.plugins;
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
async function resolveRuntimePlugins(plugins, baseDir, env, prefix = []) {
|
|
128
|
+
const out = {};
|
|
129
|
+
for (const [pluginId, pluginInput] of Object.entries(plugins)) {
|
|
130
|
+
const runtimeKey = [...prefix, pluginId].join("/");
|
|
131
|
+
const { config: resolvedConfig, baseDir: pluginBaseDir } = await resolveBosConfigInput(pluginInput, baseDir, /* @__PURE__ */ new Set(), []);
|
|
132
|
+
const pluginRuntime = buildRuntimePluginConfig(runtimeKey, resolvedConfig, pluginBaseDir, env, pluginInput);
|
|
133
|
+
if (pluginRuntime.source === "remote" && pluginRuntime.url && !pluginRuntime.localPath && typeof resolvedConfig.app?.api?.name !== "string") pluginRuntime.name = await resolveRemotePluginRuntimeName(pluginRuntime.url, pluginRuntime.name);
|
|
134
|
+
const productionIntegrity = pluginInput.productionIntegrity;
|
|
135
|
+
if (env === "production" && productionIntegrity) pluginRuntime.integrity = productionIntegrity;
|
|
136
|
+
out[runtimeKey] = pluginRuntime;
|
|
137
|
+
if (resolvedConfig.plugins && Object.keys(resolvedConfig.plugins).length > 0) {
|
|
138
|
+
const nested = await resolveRuntimePlugins(resolvedConfig.plugins, pluginBaseDir, env, [...prefix, pluginId]);
|
|
139
|
+
Object.assign(out, nested);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
async function resolveRemotePluginRuntimeName(baseUrl, fallback) {
|
|
145
|
+
try {
|
|
146
|
+
const response = await fetch(`${baseUrl.replace(/\/$/, "")}/plugin.manifest.json`);
|
|
147
|
+
if (!response.ok) return fallback;
|
|
148
|
+
const manifest = await response.json();
|
|
149
|
+
return typeof manifest.plugin?.name === "string" && manifest.plugin.name.length > 0 ? manifest.plugin.name : fallback;
|
|
150
|
+
} catch {
|
|
151
|
+
return fallback;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function buildRuntimePluginConfig(pluginId, config, baseDir, env, source) {
|
|
155
|
+
const apiConfig = config.app?.api ?? {};
|
|
156
|
+
const apiDevelopment = typeof apiConfig.development === "string" ? apiConfig.development : void 0;
|
|
157
|
+
const apiProduction = typeof apiConfig.production === "string" ? apiConfig.production : void 0;
|
|
158
|
+
const sourceDevelopment = typeof source.development === "string" ? source.development : void 0;
|
|
159
|
+
const sourceProduction = typeof source.production === "string" ? source.production : void 0;
|
|
160
|
+
const proxy = typeof apiConfig.proxy === "string" ? apiConfig.proxy : void 0;
|
|
161
|
+
const runtimeTarget = env === "development" ? resolveRuntimeTarget(apiDevelopment ?? sourceDevelopment, baseDir) : resolveRuntimeTarget(apiProduction ?? sourceProduction, baseDir, "remote");
|
|
162
|
+
return {
|
|
163
|
+
name: resolvePluginRuntimeName(typeof apiConfig.name === "string" ? apiConfig.name : void 0, runtimeTarget.localPath, pluginId),
|
|
164
|
+
url: runtimeTarget.url,
|
|
165
|
+
entry: runtimeTarget.url ? `${runtimeTarget.url.replace(/\/$/, "")}/mf-manifest.json` : "/mf-manifest.json",
|
|
166
|
+
source: runtimeTarget.source,
|
|
167
|
+
localPath: runtimeTarget.localPath,
|
|
168
|
+
port: runtimeTarget.port,
|
|
169
|
+
proxy: proxy ?? (typeof source.proxy === "string" ? source.proxy : void 0),
|
|
170
|
+
variables: normalizeStringRecord(apiConfig.variables ?? source.variables),
|
|
171
|
+
secrets: normalizeStringArray(apiConfig.secrets ?? source.secrets)
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function resolvePluginRuntimeName(explicitName, localPath, fallback) {
|
|
175
|
+
if (explicitName) return explicitName;
|
|
176
|
+
if (!localPath) return fallback;
|
|
177
|
+
try {
|
|
178
|
+
const packageJsonPath = join(localPath, "package.json");
|
|
179
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
180
|
+
if (typeof packageJson.name === "string" && packageJson.name.length > 0) return packageJson.name;
|
|
181
|
+
} catch {}
|
|
182
|
+
return fallback;
|
|
183
|
+
}
|
|
184
|
+
async function resolveBosConfigInput(input, baseDir, visited, chain) {
|
|
185
|
+
if (input.extends) {
|
|
186
|
+
const parentBaseDir = input.extends.startsWith("bos://") ? baseDir : isAbsolute(input.extends) ? dirname(input.extends) : baseDir;
|
|
187
|
+
return {
|
|
188
|
+
config: mergeConfigs(await resolveConfigWithExtends(input.extends, parentBaseDir, visited, chain), input),
|
|
189
|
+
baseDir: parentBaseDir
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
config: input,
|
|
194
|
+
baseDir
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function mergeValues(parent, child) {
|
|
198
|
+
if (Array.isArray(parent) && Array.isArray(child)) return child;
|
|
199
|
+
if (isPlainObject(parent) && isPlainObject(child)) {
|
|
200
|
+
const merged = { ...parent };
|
|
201
|
+
for (const [key, value] of Object.entries(child)) merged[key] = key in merged ? mergeValues(merged[key], value) : value;
|
|
202
|
+
return merged;
|
|
203
|
+
}
|
|
204
|
+
return child ?? parent;
|
|
205
|
+
}
|
|
206
|
+
function isPlainObject(value) {
|
|
207
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
208
|
+
}
|
|
209
|
+
function normalizeStringRecord(value) {
|
|
210
|
+
if (!isPlainObject(value)) return void 0;
|
|
211
|
+
const out = {};
|
|
212
|
+
for (const [key, raw] of Object.entries(value)) if (typeof raw === "string") out[key] = raw;
|
|
213
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
214
|
+
}
|
|
215
|
+
function normalizeStringArray(value) {
|
|
216
|
+
if (!Array.isArray(value)) return void 0;
|
|
217
|
+
const out = value.filter((item) => typeof item === "string" && item.length > 0);
|
|
218
|
+
return out.length > 0 ? out : void 0;
|
|
219
|
+
}
|
|
220
|
+
function resolveRuntimeTarget(value, baseDir, defaultSource = "remote") {
|
|
221
|
+
if (!value) return {
|
|
222
|
+
source: defaultSource,
|
|
223
|
+
url: ""
|
|
224
|
+
};
|
|
225
|
+
if (value.startsWith(LOCAL_PREFIX)) {
|
|
226
|
+
const localTarget = value.slice(6).trim();
|
|
227
|
+
if (!localTarget) throw new Error(`Invalid local development target: ${value}`);
|
|
228
|
+
return {
|
|
229
|
+
source: "local",
|
|
230
|
+
url: "",
|
|
231
|
+
localPath: resolve(baseDir, localTarget)
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
source: defaultSource,
|
|
236
|
+
url: value.replace(/\/$/, ""),
|
|
237
|
+
port: parsePort(value)
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
function isLocalDevelopmentTarget(value) {
|
|
241
|
+
return typeof value === "string" && value.startsWith(LOCAL_PREFIX);
|
|
242
|
+
}
|
|
243
|
+
function resolveLocalDevelopmentPath(value, baseDir) {
|
|
244
|
+
if (!isLocalDevelopmentTarget(value)) return null;
|
|
245
|
+
const localTarget = value.slice(6).trim();
|
|
246
|
+
return localTarget ? resolve(baseDir, localTarget) : null;
|
|
247
|
+
}
|
|
248
|
+
function resolveDevelopmentHostUrl(value) {
|
|
249
|
+
if (!value || isLocalDevelopmentTarget(value)) return `http://localhost:${DEFAULT_HOST_PORT}`;
|
|
250
|
+
return value.replace(/\/$/, "");
|
|
251
|
+
}
|
|
252
|
+
function getHostDevelopmentPort(value) {
|
|
253
|
+
return parsePort(resolveDevelopmentHostUrl(value));
|
|
254
|
+
}
|
|
255
|
+
function parsePort(url) {
|
|
256
|
+
try {
|
|
257
|
+
const parsed = new URL(url);
|
|
258
|
+
return parsed.port ? parseInt(parsed.port, 10) : parsed.protocol === "https:" ? 443 : 80;
|
|
259
|
+
} catch {
|
|
260
|
+
return 3e3;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
//#endregion
|
|
265
|
+
export { BosConfigSchema, buildRuntimePluginsForConfig, clearConfigCache, findConfigPath, getConfig, getHostDevelopmentPort, getProjectRoot, isLocalDevelopmentTarget, loadBosConfig, loadConfig, parsePort, resolveDevelopmentHostUrl, resolveLocalDevelopmentPath };
|
|
266
|
+
//# sourceMappingURL=config.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fetchBosConfigFromFastKv } from \"./fastkv\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport type { BosConfig, RuntimeConfig, RuntimePluginConfig } from \"./types\";\nimport { BosConfigSchema } from \"./types\";\n\ninterface BosConfigInput extends Record<string, unknown> {\n extends?: string;\n development?: string;\n production?: string;\n productionIntegrity?: string;\n proxy?: string;\n variables?: Record<string, string>;\n secrets?: string[];\n app?: Record<string, Record<string, unknown>>;\n shared?: Record<string, Record<string, Record<string, unknown>>>;\n plugins?: Record<string, BosConfigInput>;\n}\n\nconst LOCAL_PREFIX = \"local:\";\nconst DEFAULT_HOST_PORT = 3000;\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;\n\nexport function clearConfigCache(): void {\n cachedConfig = null;\n projectRoot = null;\n}\n\nexport function findConfigPath(cwd?: string): string | null {\n let dir = cwd ?? process.cwd();\n while (dir !== \"/\") {\n const configPath = join(dir, \"bos.config.json\");\n if (existsSync(configPath)) {\n return configPath;\n }\n dir = dirname(dir);\n }\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 loadConfig() 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}\n\nexport async function loadConfig(options?: {\n cwd?: string;\n path?: string;\n env?: \"development\" | \"production\";\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\n try {\n const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(configPath, baseDir, new Set(), extendedChain);\n const config = BosConfigSchema.parse(parsed);\n\n cachedConfig = config;\n projectRoot = baseDir;\n\n const pluginRuntime = await resolveRuntimePlugins(\n config.plugins ?? {},\n baseDir,\n options?.env ?? \"development\",\n );\n const runtime = buildRuntimeConfig(config, baseDir, options?.env ?? \"development\", {\n plugins: pluginRuntime,\n });\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 };\n } catch (error) {\n throw new Error(`Failed to load config from ${configPath}: ${error}`);\n }\n}\n\nexport async function loadBosConfig(options?: {\n cwd?: string;\n path?: string;\n env?: \"development\" | \"production\";\n}): Promise<RuntimeConfig> {\n const result = await loadConfig(options);\n if (!result) {\n throw new Error(\"No bos.config.json found\");\n }\n\n return result.runtime;\n}\n\nexport async function buildRuntimePluginsForConfig(\n config: BosConfig,\n baseDir: string,\n env: \"development\" | \"production\",\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 buildRuntimeConfig(\n config: BosConfig,\n baseDir: string,\n env: \"development\" | \"production\",\n options?: { plugins?: Record<string, RuntimePluginConfig> },\n): RuntimeConfig {\n const uiConfig = config.app.ui;\n const apiConfig = config.app.api;\n const uiRuntime =\n env === \"development\"\n ? resolveRuntimeTarget(uiConfig.development, baseDir)\n : resolveRuntimeTarget(uiConfig.production, baseDir, \"remote\");\n const apiRuntime =\n env === \"development\"\n ? resolveRuntimeTarget(apiConfig.development, baseDir)\n : resolveRuntimeTarget(apiConfig.production, baseDir, \"remote\");\n\n return {\n env,\n account: config.account,\n domain: config.domain,\n networkId: getNetworkIdForAccount(config.account),\n repository: config.repository,\n hostUrl:\n env === \"development\"\n ? resolveDevelopmentHostUrl(config.app.host.development)\n : config.app.host.production,\n shared: config.shared,\n ui: {\n name: uiConfig.name,\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: uiConfig.ssr,\n ssrIntegrity: env === \"production\" ? uiConfig.ssrIntegrity : undefined,\n integrity: env === \"production\" ? uiConfig.productionIntegrity : undefined,\n source: uiRuntime.source,\n },\n api: {\n name: apiConfig.name,\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: apiConfig.proxy,\n variables: apiConfig.variables,\n secrets: apiConfig.secrets,\n integrity: env === \"production\" ? apiConfig.productionIntegrity : undefined,\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): 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 if (configPath.startsWith(\"bos://\")) {\n chain.push(configPath);\n }\n\n if (!config.extends) {\n return config;\n }\n\n const nextVisited = new Set(visited);\n nextVisited.add(configPath);\n const parentPath = config.extends;\n const parentBaseDir = parentPath.startsWith(\"bos://\")\n ? baseDir\n : isAbsolute(parentPath)\n ? dirname(parentPath)\n : baseDir;\n const parent = await resolveConfigWithExtends(parentPath, parentBaseDir, nextVisited, chain);\n\n return mergeConfigs(parent, config);\n}\n\nfunction mergeConfigs(parent: BosConfigInput, child: BosConfigInput): BosConfigInput {\n const result = mergeValues(parent, child) as BosConfigInput;\n if (child.plugins !== undefined) {\n result.plugins = child.plugins;\n }\n return result;\n}\n\nasync function resolveRuntimePlugins(\n plugins: Record<string, BosConfigInput>,\n baseDir: string,\n env: \"development\" | \"production\",\n prefix: string[] = [],\n): Promise<Record<string, RuntimePluginConfig>> {\n const out: Record<string, RuntimePluginConfig> = {};\n\n for (const [pluginId, pluginInput] of Object.entries(plugins)) {\n const runtimeKey = [...prefix, pluginId].join(\"/\");\n const { config: resolvedConfig, baseDir: pluginBaseDir } = await resolveBosConfigInput(\n pluginInput,\n baseDir,\n new Set(),\n [],\n );\n\n const pluginRuntime = buildRuntimePluginConfig(\n runtimeKey,\n resolvedConfig,\n pluginBaseDir,\n env,\n pluginInput,\n );\n if (\n pluginRuntime.source === \"remote\" &&\n pluginRuntime.url &&\n !pluginRuntime.localPath &&\n typeof resolvedConfig.app?.api?.name !== \"string\"\n ) {\n pluginRuntime.name = await resolveRemotePluginRuntimeName(\n pluginRuntime.url,\n pluginRuntime.name,\n );\n }\n\n const productionIntegrity = pluginInput.productionIntegrity;\n if (env === \"production\" && productionIntegrity) {\n pluginRuntime.integrity = productionIntegrity;\n }\n\n out[runtimeKey] = pluginRuntime;\n\n if (resolvedConfig.plugins && Object.keys(resolvedConfig.plugins).length > 0) {\n const nested = await resolveRuntimePlugins(resolvedConfig.plugins, pluginBaseDir, env, [\n ...prefix,\n pluginId,\n ]);\n Object.assign(out, nested);\n }\n }\n\n return out;\n}\n\nasync function resolveRemotePluginRuntimeName(baseUrl: string, fallback: string): Promise<string> {\n try {\n const response = await fetch(`${baseUrl.replace(/\\/$/, \"\")}/plugin.manifest.json`);\n if (!response.ok) {\n return fallback;\n }\n\n const manifest = (await response.json()) as {\n plugin?: { name?: unknown };\n };\n\n return typeof manifest.plugin?.name === \"string\" && manifest.plugin.name.length > 0\n ? manifest.plugin.name\n : fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction buildRuntimePluginConfig(\n pluginId: string,\n config: BosConfigInput,\n baseDir: string,\n env: \"development\" | \"production\",\n source: BosConfigInput,\n): RuntimePluginConfig {\n const apiConfig = config.app?.api ?? {};\n const apiDevelopment =\n typeof apiConfig.development === \"string\" ? apiConfig.development : undefined;\n const apiProduction = typeof apiConfig.production === \"string\" ? apiConfig.production : undefined;\n const sourceDevelopment = typeof source.development === \"string\" ? source.development : undefined;\n const sourceProduction = typeof source.production === \"string\" ? source.production : undefined;\n const proxy = typeof apiConfig.proxy === \"string\" ? apiConfig.proxy : undefined;\n const runtimeTarget =\n env === \"development\"\n ? resolveRuntimeTarget(apiDevelopment ?? sourceDevelopment, baseDir)\n : resolveRuntimeTarget(apiProduction ?? sourceProduction, baseDir, \"remote\");\n const apiName = resolvePluginRuntimeName(\n typeof apiConfig.name === \"string\" ? apiConfig.name : undefined,\n runtimeTarget.localPath,\n pluginId,\n );\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 localPath: runtimeTarget.localPath,\n port: runtimeTarget.port,\n proxy: proxy ?? (typeof source.proxy === \"string\" ? source.proxy : undefined),\n variables: normalizeStringRecord(apiConfig.variables ?? source.variables),\n secrets: normalizeStringArray(apiConfig.secrets ?? source.secrets),\n };\n}\n\nfunction 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 {}\n\n return fallback;\n}\n\nasync function resolveBosConfigInput(\n input: BosConfigInput,\n baseDir: string,\n visited: Set<string>,\n chain: string[],\n): Promise<{ config: BosConfigInput; baseDir: string }> {\n if (input.extends) {\n const parentBaseDir = input.extends.startsWith(\"bos://\")\n ? baseDir\n : isAbsolute(input.extends)\n ? dirname(input.extends)\n : baseDir;\n const config = await resolveConfigWithExtends(input.extends, parentBaseDir, visited, chain);\n return { config: mergeConfigs(config, input), baseDir: parentBaseDir };\n }\n\n return { config: input, baseDir };\n}\n\nfunction mergeValues(parent: unknown, child: unknown): unknown {\n if (Array.isArray(parent) && Array.isArray(child)) {\n return child;\n }\n\n if (isPlainObject(parent) && isPlainObject(child)) {\n const merged: Record<string, unknown> = { ...parent };\n for (const [key, value] of Object.entries(child)) {\n merged[key] = key in merged ? mergeValues(merged[key], value) : value;\n }\n return merged;\n }\n\n return child ?? parent;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction normalizeStringRecord(value: unknown): Record<string, string> | undefined {\n if (!isPlainObject(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === \"string\") {\n out[key] = raw;\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 return {\n source: \"local\",\n url: \"\",\n localPath: resolve(baseDir, localTarget),\n };\n }\n\n return {\n source: defaultSource,\n url: value.replace(/\\/$/, \"\"),\n port: parsePort(value),\n };\n}\n\nexport function isLocalDevelopmentTarget(value: string | undefined): boolean {\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 type { BosConfig, RuntimeConfig } from \"./types\";\nexport { BosConfigSchema } from \"./types\";\n"],"mappings":"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"}
|