everything-dev 1.14.4 → 1.16.0

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.
Files changed (54) hide show
  1. package/dist/cli/init.cjs +6 -18
  2. package/dist/cli/init.cjs.map +1 -1
  3. package/dist/cli/init.d.cts.map +1 -1
  4. package/dist/cli/init.d.mts.map +1 -1
  5. package/dist/cli/init.mjs +6 -18
  6. package/dist/cli/init.mjs.map +1 -1
  7. package/dist/cli/prompts.cjs +8 -8
  8. package/dist/cli/prompts.cjs.map +1 -1
  9. package/dist/cli/prompts.mjs +8 -8
  10. package/dist/cli/prompts.mjs.map +1 -1
  11. package/dist/config.cjs +2 -0
  12. package/dist/config.cjs.map +1 -1
  13. package/dist/config.d.cts.map +1 -1
  14. package/dist/config.d.mts.map +1 -1
  15. package/dist/config.mjs +2 -0
  16. package/dist/config.mjs.map +1 -1
  17. package/dist/contract.d.cts +4 -0
  18. package/dist/contract.d.cts.map +1 -1
  19. package/dist/contract.d.mts +4 -0
  20. package/dist/contract.d.mts.map +1 -1
  21. package/dist/merge.cjs +2 -0
  22. package/dist/merge.cjs.map +1 -1
  23. package/dist/merge.d.cts +1 -1
  24. package/dist/merge.d.cts.map +1 -1
  25. package/dist/merge.d.mts +1 -1
  26. package/dist/merge.d.mts.map +1 -1
  27. package/dist/merge.mjs +2 -0
  28. package/dist/merge.mjs.map +1 -1
  29. package/dist/near-cli.cjs +29 -52
  30. package/dist/near-cli.cjs.map +1 -1
  31. package/dist/near-cli.mjs +29 -52
  32. package/dist/near-cli.mjs.map +1 -1
  33. package/dist/plugin.cjs +15 -7
  34. package/dist/plugin.cjs.map +1 -1
  35. package/dist/plugin.d.cts +5 -0
  36. package/dist/plugin.d.mts +5 -0
  37. package/dist/plugin.mjs +15 -7
  38. package/dist/plugin.mjs.map +1 -1
  39. package/dist/types.cjs +4 -0
  40. package/dist/types.cjs.map +1 -1
  41. package/dist/types.d.cts +7 -0
  42. package/dist/types.d.cts.map +1 -1
  43. package/dist/types.d.mts +7 -0
  44. package/dist/types.d.mts.map +1 -1
  45. package/dist/types.mjs +4 -0
  46. package/dist/types.mjs.map +1 -1
  47. package/package.json +2 -1
  48. package/src/cli/init.ts +4 -24
  49. package/src/cli/prompts.ts +12 -8
  50. package/src/config.ts +2 -0
  51. package/src/merge.ts +2 -0
  52. package/src/near-cli.ts +42 -69
  53. package/src/plugin.ts +38 -19
  54. package/src/types.ts +6 -0
@@ -15,10 +15,6 @@ function deriveAccountFromDomain(domain, extendsAccount) {
15
15
  if (!firstSegment) return "";
16
16
  return `${firstSegment}.${extendsAccount.includes(".") ? extendsAccount.substring(extendsAccount.indexOf(".") + 1) : extendsAccount}`;
17
17
  }
18
- const AVAILABLE_PLUGINS = [{
19
- value: "settings",
20
- label: "settings"
21
- }];
22
18
  async function promptInitOptions(input) {
23
19
  p.intro("Let's build an app...");
24
20
  const domain = input.domain ?? await p.text({
@@ -50,12 +46,16 @@ async function promptInitOptions(input) {
50
46
  });
51
47
  if (p.isCancel(account)) process.exit(0);
52
48
  const directory = input.directory || domain || extendsGateway;
53
- const plugins = input.plugins ?? await p.multiselect({
49
+ const parentPlugins = input.parentPluginKeys ?? [];
50
+ const pluginOptions = parentPlugins.length > 0 ? parentPlugins.map((key) => ({
51
+ value: key,
52
+ label: key
53
+ })) : [];
54
+ const plugins = input.plugins ?? (pluginOptions.length > 0 ? await p.multiselect({
54
55
  message: "Select plugins:",
55
- options: AVAILABLE_PLUGINS,
56
- initialValues: ["settings"],
56
+ options: pluginOptions,
57
57
  required: false
58
- });
58
+ }) : []);
59
59
  if (p.isCancel(plugins)) process.exit(0);
60
60
  const go = input.withHost !== void 0 ? true : await p.confirm({
61
61
  message: "GO!",
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.mjs","names":[],"sources":["../../src/cli/prompts.ts"],"sourcesContent":["import process from \"node:process\";\nimport * as p from \"@clack/prompts\";\n\nfunction parseExtendsRef(ref: string): { account: string; gateway: string } | null {\n const match = ref.match(/^(?:bos:\\/\\/)?([^/]+)\\/(.+)$/);\n if (!match) return null;\n return { account: match[1], gateway: match[2] };\n}\n\nfunction deriveAccountFromDomain(domain: string, extendsAccount: string): string {\n const firstSegment = domain.split(\".\")[0];\n if (!firstSegment) return \"\";\n const suffix = extendsAccount.includes(\".\")\n ? extendsAccount.substring(extendsAccount.indexOf(\".\") + 1)\n : extendsAccount;\n return `${firstSegment}.${suffix}`;\n}\n\nconst AVAILABLE_PLUGINS = [{ value: \"settings\", label: \"settings\" }];\n\nexport async function promptInitOptions(input: {\n extendsAccount?: string;\n extendsGateway?: string;\n extends?: string;\n directory?: string;\n account?: string;\n domain?: string;\n plugins?: string[];\n withHost?: boolean;\n}): Promise<{\n extendsAccount: string;\n extendsGateway: string;\n directory: string;\n account?: string;\n domain?: string;\n plugins: string[];\n withHost: boolean;\n}> {\n p.intro(\"Let's build an app...\");\n\n const domain =\n input.domain ??\n ((await p.text({\n message: \"Starting with a domain?\",\n placeholder: \"no\",\n })) as string);\n\n if (p.isCancel(domain)) process.exit(0);\n\n const extendsPlaceholder = \"bos://dev.everything.near/everything.dev\";\n const extendsInput =\n input.extends ??\n ((await p.text({\n message: \"Extending an existing app?\",\n placeholder: extendsPlaceholder,\n })) as string);\n\n if (p.isCancel(extendsInput)) process.exit(0);\n\n let extendsAccount = input.extendsAccount || \"\";\n let extendsGateway = input.extendsGateway || \"\";\n\n if (extendsInput) {\n const parsed = parseExtendsRef(extendsInput);\n if (parsed) {\n extendsAccount = extendsAccount || parsed.account;\n extendsGateway = extendsGateway || parsed.gateway;\n }\n }\n\n extendsAccount = extendsAccount || \"dev.everything.near\";\n extendsGateway = extendsGateway || \"everything.dev\";\n\n const accountDefault = domain ? deriveAccountFromDomain(domain, extendsAccount) : \"\";\n const account =\n input.account ??\n ((await p.text({\n message: \"What NEAR account will you publish from?\",\n placeholder: accountDefault || \"skip\",\n defaultValue: accountDefault,\n })) as string);\n\n if (p.isCancel(account)) process.exit(0);\n\n const directory = input.directory || domain || extendsGateway;\n\n const plugins =\n input.plugins ??\n ((await p.multiselect({\n message: \"Select plugins:\",\n options: AVAILABLE_PLUGINS,\n initialValues: [\"settings\"],\n required: false,\n })) as string[]);\n\n if (p.isCancel(plugins)) process.exit(0);\n\n const go =\n input.withHost !== undefined\n ? true\n : await p.confirm({\n message: \"GO!\",\n initialValue: true,\n });\n\n if (p.isCancel(go) || !go) process.exit(0);\n\n const withHost = input.withHost ?? false;\n\n return {\n extendsAccount,\n extendsGateway,\n directory,\n account: account || undefined,\n domain: domain || undefined,\n plugins,\n withHost,\n };\n}\n"],"mappings":";;;;AAGA,SAAS,gBAAgB,KAA0D;CACjF,MAAM,QAAQ,IAAI,MAAM,+BAA+B;AACvD,KAAI,CAAC,MAAO,QAAO;AACnB,QAAO;EAAE,SAAS,MAAM;EAAI,SAAS,MAAM;EAAI;;AAGjD,SAAS,wBAAwB,QAAgB,gBAAgC;CAC/E,MAAM,eAAe,OAAO,MAAM,IAAI,CAAC;AACvC,KAAI,CAAC,aAAc,QAAO;AAI1B,QAAO,GAAG,aAAa,GAHR,eAAe,SAAS,IAAI,GACvC,eAAe,UAAU,eAAe,QAAQ,IAAI,GAAG,EAAE,GACzD;;AAIN,MAAM,oBAAoB,CAAC;CAAE,OAAO;CAAY,OAAO;CAAY,CAAC;AAEpE,eAAsB,kBAAkB,OAiBrC;AACD,GAAE,MAAM,wBAAwB;CAEhC,MAAM,SACJ,MAAM,UACJ,MAAM,EAAE,KAAK;EACb,SAAS;EACT,aAAa;EACd,CAAC;AAEJ,KAAI,EAAE,SAAS,OAAO,CAAE,SAAQ,KAAK,EAAE;CAGvC,MAAM,eACJ,MAAM,WACJ,MAAM,EAAE,KAAK;EACb,SAAS;EACT,aALuB;EAMxB,CAAC;AAEJ,KAAI,EAAE,SAAS,aAAa,CAAE,SAAQ,KAAK,EAAE;CAE7C,IAAI,iBAAiB,MAAM,kBAAkB;CAC7C,IAAI,iBAAiB,MAAM,kBAAkB;AAE7C,KAAI,cAAc;EAChB,MAAM,SAAS,gBAAgB,aAAa;AAC5C,MAAI,QAAQ;AACV,oBAAiB,kBAAkB,OAAO;AAC1C,oBAAiB,kBAAkB,OAAO;;;AAI9C,kBAAiB,kBAAkB;AACnC,kBAAiB,kBAAkB;CAEnC,MAAM,iBAAiB,SAAS,wBAAwB,QAAQ,eAAe,GAAG;CAClF,MAAM,UACJ,MAAM,WACJ,MAAM,EAAE,KAAK;EACb,SAAS;EACT,aAAa,kBAAkB;EAC/B,cAAc;EACf,CAAC;AAEJ,KAAI,EAAE,SAAS,QAAQ,CAAE,SAAQ,KAAK,EAAE;CAExC,MAAM,YAAY,MAAM,aAAa,UAAU;CAE/C,MAAM,UACJ,MAAM,WACJ,MAAM,EAAE,YAAY;EACpB,SAAS;EACT,SAAS;EACT,eAAe,CAAC,WAAW;EAC3B,UAAU;EACX,CAAC;AAEJ,KAAI,EAAE,SAAS,QAAQ,CAAE,SAAQ,KAAK,EAAE;CAExC,MAAM,KACJ,MAAM,aAAa,SACf,OACA,MAAM,EAAE,QAAQ;EACd,SAAS;EACT,cAAc;EACf,CAAC;AAER,KAAI,EAAE,SAAS,GAAG,IAAI,CAAC,GAAI,SAAQ,KAAK,EAAE;CAE1C,MAAM,WAAW,MAAM,YAAY;AAEnC,QAAO;EACL;EACA;EACA;EACA,SAAS,WAAW;EACpB,QAAQ,UAAU;EAClB;EACA;EACD"}
1
+ {"version":3,"file":"prompts.mjs","names":[],"sources":["../../src/cli/prompts.ts"],"sourcesContent":["import process from \"node:process\";\nimport * as p from \"@clack/prompts\";\n\nfunction parseExtendsRef(ref: string): { account: string; gateway: string } | null {\n const match = ref.match(/^(?:bos:\\/\\/)?([^/]+)\\/(.+)$/);\n if (!match) return null;\n return { account: match[1], gateway: match[2] };\n}\n\nfunction deriveAccountFromDomain(domain: string, extendsAccount: string): string {\n const firstSegment = domain.split(\".\")[0];\n if (!firstSegment) return \"\";\n const suffix = extendsAccount.includes(\".\")\n ? extendsAccount.substring(extendsAccount.indexOf(\".\") + 1)\n : extendsAccount;\n return `${firstSegment}.${suffix}`;\n}\n\nexport async function promptInitOptions(input: {\n extendsAccount?: string;\n extendsGateway?: string;\n extends?: string;\n directory?: string;\n account?: string;\n domain?: string;\n plugins?: string[];\n withHost?: boolean;\n parentPluginKeys?: string[];\n}): Promise<{\n extendsAccount: string;\n extendsGateway: string;\n directory: string;\n account?: string;\n domain?: string;\n plugins: string[];\n withHost: boolean;\n}> {\n p.intro(\"Let's build an app...\");\n\n const domain =\n input.domain ??\n ((await p.text({\n message: \"Starting with a domain?\",\n placeholder: \"no\",\n })) as string);\n\n if (p.isCancel(domain)) process.exit(0);\n\n const extendsPlaceholder = \"bos://dev.everything.near/everything.dev\";\n const extendsInput =\n input.extends ??\n ((await p.text({\n message: \"Extending an existing app?\",\n placeholder: extendsPlaceholder,\n })) as string);\n\n if (p.isCancel(extendsInput)) process.exit(0);\n\n let extendsAccount = input.extendsAccount || \"\";\n let extendsGateway = input.extendsGateway || \"\";\n\n if (extendsInput) {\n const parsed = parseExtendsRef(extendsInput);\n if (parsed) {\n extendsAccount = extendsAccount || parsed.account;\n extendsGateway = extendsGateway || parsed.gateway;\n }\n }\n\n extendsAccount = extendsAccount || \"dev.everything.near\";\n extendsGateway = extendsGateway || \"everything.dev\";\n\n const accountDefault = domain ? deriveAccountFromDomain(domain, extendsAccount) : \"\";\n const account =\n input.account ??\n ((await p.text({\n message: \"What NEAR account will you publish from?\",\n placeholder: accountDefault || \"skip\",\n defaultValue: accountDefault,\n })) as string);\n\n if (p.isCancel(account)) process.exit(0);\n\n const directory = input.directory || domain || extendsGateway;\n\n const parentPlugins = input.parentPluginKeys ?? [];\n const pluginOptions =\n parentPlugins.length > 0 ? parentPlugins.map((key) => ({ value: key, label: key })) : [];\n\n const plugins =\n input.plugins ??\n (pluginOptions.length > 0\n ? ((await p.multiselect({\n message: \"Select plugins:\",\n options: pluginOptions,\n required: false,\n })) as string[])\n : []);\n\n if (p.isCancel(plugins)) process.exit(0);\n\n const go =\n input.withHost !== undefined\n ? true\n : await p.confirm({\n message: \"GO!\",\n initialValue: true,\n });\n\n if (p.isCancel(go) || !go) process.exit(0);\n\n const withHost = input.withHost ?? false;\n\n return {\n extendsAccount,\n extendsGateway,\n directory,\n account: account || undefined,\n domain: domain || undefined,\n plugins,\n withHost,\n };\n}\n"],"mappings":";;;;AAGA,SAAS,gBAAgB,KAA0D;CACjF,MAAM,QAAQ,IAAI,MAAM,+BAA+B;AACvD,KAAI,CAAC,MAAO,QAAO;AACnB,QAAO;EAAE,SAAS,MAAM;EAAI,SAAS,MAAM;EAAI;;AAGjD,SAAS,wBAAwB,QAAgB,gBAAgC;CAC/E,MAAM,eAAe,OAAO,MAAM,IAAI,CAAC;AACvC,KAAI,CAAC,aAAc,QAAO;AAI1B,QAAO,GAAG,aAAa,GAHR,eAAe,SAAS,IAAI,GACvC,eAAe,UAAU,eAAe,QAAQ,IAAI,GAAG,EAAE,GACzD;;AAIN,eAAsB,kBAAkB,OAkBrC;AACD,GAAE,MAAM,wBAAwB;CAEhC,MAAM,SACJ,MAAM,UACJ,MAAM,EAAE,KAAK;EACb,SAAS;EACT,aAAa;EACd,CAAC;AAEJ,KAAI,EAAE,SAAS,OAAO,CAAE,SAAQ,KAAK,EAAE;CAGvC,MAAM,eACJ,MAAM,WACJ,MAAM,EAAE,KAAK;EACb,SAAS;EACT,aALuB;EAMxB,CAAC;AAEJ,KAAI,EAAE,SAAS,aAAa,CAAE,SAAQ,KAAK,EAAE;CAE7C,IAAI,iBAAiB,MAAM,kBAAkB;CAC7C,IAAI,iBAAiB,MAAM,kBAAkB;AAE7C,KAAI,cAAc;EAChB,MAAM,SAAS,gBAAgB,aAAa;AAC5C,MAAI,QAAQ;AACV,oBAAiB,kBAAkB,OAAO;AAC1C,oBAAiB,kBAAkB,OAAO;;;AAI9C,kBAAiB,kBAAkB;AACnC,kBAAiB,kBAAkB;CAEnC,MAAM,iBAAiB,SAAS,wBAAwB,QAAQ,eAAe,GAAG;CAClF,MAAM,UACJ,MAAM,WACJ,MAAM,EAAE,KAAK;EACb,SAAS;EACT,aAAa,kBAAkB;EAC/B,cAAc;EACf,CAAC;AAEJ,KAAI,EAAE,SAAS,QAAQ,CAAE,SAAQ,KAAK,EAAE;CAExC,MAAM,YAAY,MAAM,aAAa,UAAU;CAE/C,MAAM,gBAAgB,MAAM,oBAAoB,EAAE;CAClD,MAAM,gBACJ,cAAc,SAAS,IAAI,cAAc,KAAK,SAAS;EAAE,OAAO;EAAK,OAAO;EAAK,EAAE,GAAG,EAAE;CAE1F,MAAM,UACJ,MAAM,YACL,cAAc,SAAS,IAClB,MAAM,EAAE,YAAY;EACpB,SAAS;EACT,SAAS;EACT,UAAU;EACX,CAAC,GACF,EAAE;AAER,KAAI,EAAE,SAAS,QAAQ,CAAE,SAAQ,KAAK,EAAE;CAExC,MAAM,KACJ,MAAM,aAAa,SACf,OACA,MAAM,EAAE,QAAQ;EACd,SAAS;EACT,cAAc;EACf,CAAC;AAER,KAAI,EAAE,SAAS,GAAG,IAAI,CAAC,GAAI,SAAQ,KAAK,EAAE;CAE1C,MAAM,WAAW,MAAM,YAAY;AAEnC,QAAO;EACL;EACA;EACA;EACA,SAAS,WAAW;EACpB,QAAQ,UAAU;EAClB;EACA;EACD"}
package/dist/config.cjs CHANGED
@@ -145,6 +145,8 @@ function buildRuntimeConfig(config, baseDir, env, options) {
145
145
  env,
146
146
  account: config.account,
147
147
  domain: config.domain,
148
+ title: config.title,
149
+ description: config.description,
148
150
  networkId: require_network.getNetworkIdForAccount(config.account),
149
151
  repository: config.repository,
150
152
  host: {
@@ -1 +1 @@
1
- {"version":3,"file":"config.cjs","names":["BosConfigSchema","isPlainObject","rebuildOrderedConfig","getNetworkIdForAccount","fetchBosConfigFromFastKv","resolveExtendsRef","mergeBosConfigWithExtends","parsePluginBosUrl","fetchPluginFromRegistry"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fetchBosConfigFromFastKv, fetchPluginFromRegistry, parsePluginBosUrl } from \"./fastkv\";\nimport {\n type BosEnv,\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 PluginEntryValue,\n RuntimeConfig,\n RuntimePluginConfig,\n SharedDepConfig,\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\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?: BosEnv;\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 const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n configPath,\n baseDir,\n new Set(),\n extendedChain,\n env,\n );\n const config = BosConfigSchema.parse(parsed);\n\n cachedConfig = config;\n projectRoot = baseDir;\n\n const pluginRuntime = await resolveRuntimePlugins(config.plugins ?? {}, baseDir, runtimeEnv);\n const runtime = buildRuntimeConfig(config, baseDir, runtimeEnv, {\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?: BosEnv;\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: 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\nexport function getResolvedConfigPath(configDir: string): string {\n return join(configDir, \".bos\", RESOLVED_CONFIG_FILENAME);\n}\n\nexport function loadResolvedConfig(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 {}\n }\n const bosConfigPath = join(configDir, \"bos.config.json\");\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<string, unknown>;\n}\n\nfunction resolveDevelopmentTarget(\n development: string | undefined,\n production: string | undefined,\n baseDir: string,\n forceSource?: \"local\" | \"remote\",\n): RuntimeTarget {\n if (forceSource === \"remote\") {\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n const devTarget = resolveRuntimeTarget(development, baseDir);\n if (devTarget.source === \"local\" && (!devTarget.localPath || !existsSync(devTarget.localPath))) {\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 )\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 )\n : resolveRuntimeTarget(apiConfig.production, baseDir, \"remote\");\n const authRuntime = authConfig\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n authConfig.development,\n authConfig.production,\n baseDir,\n options?.authSource,\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 )\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\n return {\n env,\n account: config.account,\n domain: config.domain,\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: 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 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: 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: 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: options?.proxy ?? apiConfig.proxy,\n variables: apiConfig.variables,\n secrets: apiConfig.secrets,\n integrity: apiIsRemote ? apiConfig.integrity : undefined,\n },\n auth: (() => {\n if (!authConfig || !authRuntime) return undefined;\n return {\n name: resolvePluginRuntimeName(undefined, authRuntime.localPath, authConfig.name),\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 sidebar: authConfig.sidebar?.map((item) => ({\n ...item,\n to: item.to ?? \"/auth\",\n roleRequired: item.roleRequired ?? (\"member\" as const),\n })),\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 nextVisited = new Set(visited);\n nextVisited.add(configPath);\n const parentBaseDir = extendsRef.startsWith(\"bos://\")\n ? baseDir\n : isAbsolute(extendsRef)\n ? dirname(extendsRef)\n : baseDir;\n const parent = await resolveConfigWithExtends(extendsRef, parentBaseDir, nextVisited, chain, env);\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): Promise<Record<string, RuntimePluginConfig>> {\n const out: Record<string, RuntimePluginConfig> = {};\n\n for (const [pluginId, rawInput] of Object.entries(plugins)) {\n const normalized = normalizePluginEntry(rawInput);\n if (normalized === null || normalized === false) continue;\n\n let resolvedConfig: BosConfigInput = {};\n let pluginBaseDir = baseDir;\n\n if (normalized.extends) {\n try {\n const extendsUrl = resolveExtendsRef(normalized.extends, env);\n if (extendsUrl) {\n const remoteConfig = await fetchBosConfigFromFastKv<BosConfigInput>(extendsUrl);\n resolvedConfig = remoteConfig;\n }\n } catch {\n resolvedConfig = {};\n }\n }\n\n if (normalized.development?.startsWith(LOCAL_PREFIX)) {\n const localPath = resolve(baseDir, normalized.development.slice(LOCAL_PREFIX.length).trim());\n if (existsSync(localPath)) {\n const localConfigPath = join(localPath, \"bos.config.json\");\n if (existsSync(localConfigPath)) {\n try {\n const localRaw = JSON.parse(readFileSync(localConfigPath, \"utf-8\")) as BosConfigInput;\n resolvedConfig = mergeBosConfigWithExtends(resolvedConfig, localRaw);\n pluginBaseDir = localPath;\n } catch {}\n }\n }\n }\n\n if (normalized.app && isPlainObject(normalized.app)) {\n const mergedApp: Record<string, unknown> = {\n ...((resolvedConfig.app as Record<string, unknown>) ?? {}),\n ...(normalized.app as Record<string, unknown>),\n };\n resolvedConfig = { ...resolvedConfig, app: mergedApp as BosConfigInput[\"app\"] };\n }\n if (normalized.shared && isPlainObject(normalized.shared)) {\n const mergedShared: Record<string, Record<string, SharedDepConfig>> = {\n ...(resolvedConfig.shared ?? {}),\n ...(normalized.shared as Record<string, Record<string, SharedDepConfig>>),\n };\n resolvedConfig = { ...resolvedConfig, shared: mergedShared };\n }\n if (normalized.sidebar) {\n resolvedConfig = { ...resolvedConfig, sidebar: normalized.sidebar };\n }\n if (normalized.routes) {\n resolvedConfig = { ...resolvedConfig, routes: normalized.routes };\n }\n\n const pluginRuntime = await buildRuntimePluginConfig(\n pluginId,\n resolvedConfig,\n pluginBaseDir,\n env,\n normalized,\n );\n if (\n normalized.name &&\n typeof normalized.name === \"string\" &&\n !pluginRuntime.name.includes(\"/\")\n ) {\n pluginRuntime.name = normalized.name;\n }\n\n const integrity = normalized.integrity;\n if (env === \"production\" && integrity) {\n pluginRuntime.integrity = integrity;\n }\n\n if (\n pluginRuntime.source === \"remote\" &&\n pluginRuntime.url &&\n !pluginRuntime.localPath &&\n typeof resolvedConfig.app?.api?.name !== \"string\" &&\n !normalized.name\n ) {\n pluginRuntime.name = await resolveRemotePluginRuntimeName(\n pluginRuntime.url,\n pluginRuntime.name,\n );\n }\n\n out[pluginId] = pluginRuntime;\n }\n\n return out;\n}\n\nasync function resolveRemotePluginRuntimeName(baseUrl: string, fallback: string): Promise<string> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n const response = await fetch(`${baseUrl.replace(/\\/$/, \"\")}/plugin.manifest.json`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\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\ninterface ResolvedBosPlugin {\n url: string;\n integrity?: string;\n}\n\nasync function resolveBosPluginUrl(bosUrl: string): Promise<ResolvedBosPlugin | null> {\n const parsed = parsePluginBosUrl(bosUrl);\n if (!parsed) return null;\n\n try {\n const entry = await fetchPluginFromRegistry(parsed.accountId, parsed.pluginName);\n if (!entry) return null;\n\n const cdnUrl = entry.metadata.cdnUrl;\n if (!cdnUrl) return null;\n\n return {\n url: cdnUrl,\n integrity: entry.metadata.integrity ?? undefined,\n };\n } catch {\n return null;\n }\n}\n\nasync function buildRuntimePluginConfig(\n pluginId: string,\n config: BosConfigInput,\n baseDir: string,\n env: BosEnv,\n source: BosPluginRef,\n): Promise<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 development = apiDevelopment ?? sourceDevelopment;\n let production = apiProduction ?? sourceProduction;\n\n if (production?.startsWith(\"bos://\")) {\n const resolved = await resolveBosPluginUrl(production);\n if (resolved) {\n production = resolved.url;\n if (resolved.integrity && env === \"production\") {\n source.integrity = resolved.integrity;\n }\n }\n }\n\n const runtimeTarget =\n env === \"development\"\n ? resolveDevelopmentTarget(development, production, baseDir)\n : resolveRuntimeTarget(production, baseDir, \"remote\");\n const apiName = resolvePluginRuntimeName(\n typeof apiConfig.name === \"string\" ? apiConfig.name : undefined,\n runtimeTarget.localPath,\n pluginId,\n );\n\n const uiConfig = config.app?.ui;\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(uiDevelopment, uiProduction, baseDir)\n : resolveRuntimeTarget(uiProduction, baseDir, \"remote\")\n : undefined;\n\n const sidebar = (config.sidebar ?? source.sidebar)?.map((item) => ({\n ...item,\n to: item.to ?? `/${pluginId}`,\n roleRequired: item.roleRequired ?? (\"member\" as const),\n }));\n\n const routes = config.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 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 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 sidebar,\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 {}\n\n return fallback;\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 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 { BOS_CONFIG_ORDER, rebuildOrderedConfig } from \"./merge\";\nexport type { BosConfig, RuntimeConfig } from \"./types\";\nexport { BosConfigSchema } from \"./types\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"config.cjs","names":["BosConfigSchema","isPlainObject","rebuildOrderedConfig","getNetworkIdForAccount","fetchBosConfigFromFastKv","resolveExtendsRef","mergeBosConfigWithExtends","parsePluginBosUrl","fetchPluginFromRegistry"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fetchBosConfigFromFastKv, fetchPluginFromRegistry, parsePluginBosUrl } from \"./fastkv\";\nimport {\n type BosEnv,\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 PluginEntryValue,\n RuntimeConfig,\n RuntimePluginConfig,\n SharedDepConfig,\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\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?: BosEnv;\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 const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n configPath,\n baseDir,\n new Set(),\n extendedChain,\n env,\n );\n const config = BosConfigSchema.parse(parsed);\n\n cachedConfig = config;\n projectRoot = baseDir;\n\n const pluginRuntime = await resolveRuntimePlugins(config.plugins ?? {}, baseDir, runtimeEnv);\n const runtime = buildRuntimeConfig(config, baseDir, runtimeEnv, {\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?: BosEnv;\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: 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\nexport function getResolvedConfigPath(configDir: string): string {\n return join(configDir, \".bos\", RESOLVED_CONFIG_FILENAME);\n}\n\nexport function loadResolvedConfig(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 {}\n }\n const bosConfigPath = join(configDir, \"bos.config.json\");\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<string, unknown>;\n}\n\nfunction resolveDevelopmentTarget(\n development: string | undefined,\n production: string | undefined,\n baseDir: string,\n forceSource?: \"local\" | \"remote\",\n): RuntimeTarget {\n if (forceSource === \"remote\") {\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n const devTarget = resolveRuntimeTarget(development, baseDir);\n if (devTarget.source === \"local\" && (!devTarget.localPath || !existsSync(devTarget.localPath))) {\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 )\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 )\n : resolveRuntimeTarget(apiConfig.production, baseDir, \"remote\");\n const authRuntime = authConfig\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n authConfig.development,\n authConfig.production,\n baseDir,\n options?.authSource,\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 )\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\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: 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 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: 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: 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: options?.proxy ?? apiConfig.proxy,\n variables: apiConfig.variables,\n secrets: apiConfig.secrets,\n integrity: apiIsRemote ? apiConfig.integrity : undefined,\n },\n auth: (() => {\n if (!authConfig || !authRuntime) return undefined;\n return {\n name: resolvePluginRuntimeName(undefined, authRuntime.localPath, authConfig.name),\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 sidebar: authConfig.sidebar?.map((item) => ({\n ...item,\n to: item.to ?? \"/auth\",\n roleRequired: item.roleRequired ?? (\"member\" as const),\n })),\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 nextVisited = new Set(visited);\n nextVisited.add(configPath);\n const parentBaseDir = extendsRef.startsWith(\"bos://\")\n ? baseDir\n : isAbsolute(extendsRef)\n ? dirname(extendsRef)\n : baseDir;\n const parent = await resolveConfigWithExtends(extendsRef, parentBaseDir, nextVisited, chain, env);\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): Promise<Record<string, RuntimePluginConfig>> {\n const out: Record<string, RuntimePluginConfig> = {};\n\n for (const [pluginId, rawInput] of Object.entries(plugins)) {\n const normalized = normalizePluginEntry(rawInput);\n if (normalized === null || normalized === false) continue;\n\n let resolvedConfig: BosConfigInput = {};\n let pluginBaseDir = baseDir;\n\n if (normalized.extends) {\n try {\n const extendsUrl = resolveExtendsRef(normalized.extends, env);\n if (extendsUrl) {\n const remoteConfig = await fetchBosConfigFromFastKv<BosConfigInput>(extendsUrl);\n resolvedConfig = remoteConfig;\n }\n } catch {\n resolvedConfig = {};\n }\n }\n\n if (normalized.development?.startsWith(LOCAL_PREFIX)) {\n const localPath = resolve(baseDir, normalized.development.slice(LOCAL_PREFIX.length).trim());\n if (existsSync(localPath)) {\n const localConfigPath = join(localPath, \"bos.config.json\");\n if (existsSync(localConfigPath)) {\n try {\n const localRaw = JSON.parse(readFileSync(localConfigPath, \"utf-8\")) as BosConfigInput;\n resolvedConfig = mergeBosConfigWithExtends(resolvedConfig, localRaw);\n pluginBaseDir = localPath;\n } catch {}\n }\n }\n }\n\n if (normalized.app && isPlainObject(normalized.app)) {\n const mergedApp: Record<string, unknown> = {\n ...((resolvedConfig.app as Record<string, unknown>) ?? {}),\n ...(normalized.app as Record<string, unknown>),\n };\n resolvedConfig = { ...resolvedConfig, app: mergedApp as BosConfigInput[\"app\"] };\n }\n if (normalized.shared && isPlainObject(normalized.shared)) {\n const mergedShared: Record<string, Record<string, SharedDepConfig>> = {\n ...(resolvedConfig.shared ?? {}),\n ...(normalized.shared as Record<string, Record<string, SharedDepConfig>>),\n };\n resolvedConfig = { ...resolvedConfig, shared: mergedShared };\n }\n if (normalized.sidebar) {\n resolvedConfig = { ...resolvedConfig, sidebar: normalized.sidebar };\n }\n if (normalized.routes) {\n resolvedConfig = { ...resolvedConfig, routes: normalized.routes };\n }\n\n const pluginRuntime = await buildRuntimePluginConfig(\n pluginId,\n resolvedConfig,\n pluginBaseDir,\n env,\n normalized,\n );\n if (\n normalized.name &&\n typeof normalized.name === \"string\" &&\n !pluginRuntime.name.includes(\"/\")\n ) {\n pluginRuntime.name = normalized.name;\n }\n\n const integrity = normalized.integrity;\n if (env === \"production\" && integrity) {\n pluginRuntime.integrity = integrity;\n }\n\n if (\n pluginRuntime.source === \"remote\" &&\n pluginRuntime.url &&\n !pluginRuntime.localPath &&\n typeof resolvedConfig.app?.api?.name !== \"string\" &&\n !normalized.name\n ) {\n pluginRuntime.name = await resolveRemotePluginRuntimeName(\n pluginRuntime.url,\n pluginRuntime.name,\n );\n }\n\n out[pluginId] = pluginRuntime;\n }\n\n return out;\n}\n\nasync function resolveRemotePluginRuntimeName(baseUrl: string, fallback: string): Promise<string> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n const response = await fetch(`${baseUrl.replace(/\\/$/, \"\")}/plugin.manifest.json`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\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\ninterface ResolvedBosPlugin {\n url: string;\n integrity?: string;\n}\n\nasync function resolveBosPluginUrl(bosUrl: string): Promise<ResolvedBosPlugin | null> {\n const parsed = parsePluginBosUrl(bosUrl);\n if (!parsed) return null;\n\n try {\n const entry = await fetchPluginFromRegistry(parsed.accountId, parsed.pluginName);\n if (!entry) return null;\n\n const cdnUrl = entry.metadata.cdnUrl;\n if (!cdnUrl) return null;\n\n return {\n url: cdnUrl,\n integrity: entry.metadata.integrity ?? undefined,\n };\n } catch {\n return null;\n }\n}\n\nasync function buildRuntimePluginConfig(\n pluginId: string,\n config: BosConfigInput,\n baseDir: string,\n env: BosEnv,\n source: BosPluginRef,\n): Promise<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 development = apiDevelopment ?? sourceDevelopment;\n let production = apiProduction ?? sourceProduction;\n\n if (production?.startsWith(\"bos://\")) {\n const resolved = await resolveBosPluginUrl(production);\n if (resolved) {\n production = resolved.url;\n if (resolved.integrity && env === \"production\") {\n source.integrity = resolved.integrity;\n }\n }\n }\n\n const runtimeTarget =\n env === \"development\"\n ? resolveDevelopmentTarget(development, production, baseDir)\n : resolveRuntimeTarget(production, baseDir, \"remote\");\n const apiName = resolvePluginRuntimeName(\n typeof apiConfig.name === \"string\" ? apiConfig.name : undefined,\n runtimeTarget.localPath,\n pluginId,\n );\n\n const uiConfig = config.app?.ui;\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(uiDevelopment, uiProduction, baseDir)\n : resolveRuntimeTarget(uiProduction, baseDir, \"remote\")\n : undefined;\n\n const sidebar = (config.sidebar ?? source.sidebar)?.map((item) => ({\n ...item,\n to: item.to ?? `/${pluginId}`,\n roleRequired: item.roleRequired ?? (\"member\" as const),\n }));\n\n const routes = config.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 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 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 sidebar,\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 {}\n\n return fallback;\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 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 { BOS_CONFIG_ORDER, rebuildOrderedConfig } from \"./merge\";\nexport type { BosConfig, RuntimeConfig } from \"./types\";\nexport { BosConfigSchema } from \"./types\";\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.cts","names":[],"sources":["../src/config.ts"],"mappings":";;;;cAwBM,YAAA;AAAA,iBAcU,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,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,YAAA;AAAA,iBA4CU,aAAA,CAAc,OAAA;EAClC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,aAAA;AAAA,iBASU,4BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,MAAA,SAAe,mBAAA;AAAA,iBAKV,qBAAA,CAAsB,SAAA;AAAA,iBAItB,kBAAA,CAAmB,SAAA,WAAoB,SAAA;AAAA,iBAavC,mBAAA,CACd,SAAA,UACA,MAAA,EAAQ,SAAA,EACR,GAAA,EAAK,MAAA,EACL,YAAA,aACA,MAAA;AAAA,iBA6Bc,oBAAA,CAAqB,SAAA;AAAA,iBAMrB,qBAAA,CAAsB,SAAA,WAAoB,MAAA;AAAA,UA+BzC,yBAAA;EACf,OAAA,GAAU,MAAA,SAAe,mBAAA;EACzB,UAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,OAAA,GAAU,yBAAA,GACT,aAAA;AAAA,iBA4Za,wBAAA,CACd,YAAA,sBACA,SAAA,sBACA,QAAA;AAAA,iBAwEc,wBAAA,CACd,KAAA,uBACC,KAAA,cAAmB,YAAA;AAAA,iBAIN,2BAAA,CACd,KAAA,sBACA,OAAA;AAAA,iBAUc,yBAAA,CAA0B,KAAA;AAAA,iBAQ1B,sBAAA,CAAuB,KAAA;AAAA,iBAIvB,SAAA,CAAU,GAAA"}
1
+ {"version":3,"file":"config.d.cts","names":[],"sources":["../src/config.ts"],"mappings":";;;;cAwBM,YAAA;AAAA,iBAcU,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,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,YAAA;AAAA,iBA4CU,aAAA,CAAc,OAAA;EAClC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,aAAA;AAAA,iBASU,4BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,MAAA,SAAe,mBAAA;AAAA,iBAKV,qBAAA,CAAsB,SAAA;AAAA,iBAItB,kBAAA,CAAmB,SAAA,WAAoB,SAAA;AAAA,iBAavC,mBAAA,CACd,SAAA,UACA,MAAA,EAAQ,SAAA,EACR,GAAA,EAAK,MAAA,EACL,YAAA,aACA,MAAA;AAAA,iBA6Bc,oBAAA,CAAqB,SAAA;AAAA,iBAMrB,qBAAA,CAAsB,SAAA,WAAoB,MAAA;AAAA,UA+BzC,yBAAA;EACf,OAAA,GAAU,MAAA,SAAe,mBAAA;EACzB,UAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,OAAA,GAAU,yBAAA,GACT,aAAA;AAAA,iBA8Za,wBAAA,CACd,YAAA,sBACA,SAAA,sBACA,QAAA;AAAA,iBAwEc,wBAAA,CACd,KAAA,uBACC,KAAA,cAAmB,YAAA;AAAA,iBAIN,2BAAA,CACd,KAAA,sBACA,OAAA;AAAA,iBAUc,yBAAA,CAA0B,KAAA;AAAA,iBAQ1B,sBAAA,CAAuB,KAAA;AAAA,iBAIvB,SAAA,CAAU,GAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.mts","names":[],"sources":["../src/config.ts"],"mappings":";;;;cAwBM,YAAA;AAAA,iBAcU,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,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,YAAA;AAAA,iBA4CU,aAAA,CAAc,OAAA;EAClC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,aAAA;AAAA,iBASU,4BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,MAAA,SAAe,mBAAA;AAAA,iBAKV,qBAAA,CAAsB,SAAA;AAAA,iBAItB,kBAAA,CAAmB,SAAA,WAAoB,SAAA;AAAA,iBAavC,mBAAA,CACd,SAAA,UACA,MAAA,EAAQ,SAAA,EACR,GAAA,EAAK,MAAA,EACL,YAAA,aACA,MAAA;AAAA,iBA6Bc,oBAAA,CAAqB,SAAA;AAAA,iBAMrB,qBAAA,CAAsB,SAAA,WAAoB,MAAA;AAAA,UA+BzC,yBAAA;EACf,OAAA,GAAU,MAAA,SAAe,mBAAA;EACzB,UAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,OAAA,GAAU,yBAAA,GACT,aAAA;AAAA,iBA4Za,wBAAA,CACd,YAAA,sBACA,SAAA,sBACA,QAAA;AAAA,iBAwEc,wBAAA,CACd,KAAA,uBACC,KAAA,cAAmB,YAAA;AAAA,iBAIN,2BAAA,CACd,KAAA,sBACA,OAAA;AAAA,iBAUc,yBAAA,CAA0B,KAAA;AAAA,iBAQ1B,sBAAA,CAAuB,KAAA;AAAA,iBAIvB,SAAA,CAAU,GAAA"}
1
+ {"version":3,"file":"config.d.mts","names":[],"sources":["../src/config.ts"],"mappings":";;;;cAwBM,YAAA;AAAA,iBAcU,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,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,YAAA;AAAA,iBA4CU,aAAA,CAAc,OAAA;EAClC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,aAAA;AAAA,iBASU,4BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,MAAA,SAAe,mBAAA;AAAA,iBAKV,qBAAA,CAAsB,SAAA;AAAA,iBAItB,kBAAA,CAAmB,SAAA,WAAoB,SAAA;AAAA,iBAavC,mBAAA,CACd,SAAA,UACA,MAAA,EAAQ,SAAA,EACR,GAAA,EAAK,MAAA,EACL,YAAA,aACA,MAAA;AAAA,iBA6Bc,oBAAA,CAAqB,SAAA;AAAA,iBAMrB,qBAAA,CAAsB,SAAA,WAAoB,MAAA;AAAA,UA+BzC,yBAAA;EACf,OAAA,GAAU,MAAA,SAAe,mBAAA;EACzB,UAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,OAAA,GAAU,yBAAA,GACT,aAAA;AAAA,iBA8Za,wBAAA,CACd,YAAA,sBACA,SAAA,sBACA,QAAA;AAAA,iBAwEc,wBAAA,CACd,KAAA,uBACC,KAAA,cAAmB,YAAA;AAAA,iBAIN,2BAAA,CACd,KAAA,sBACA,OAAA;AAAA,iBAUc,yBAAA,CAA0B,KAAA;AAAA,iBAQ1B,sBAAA,CAAuB,KAAA;AAAA,iBAIvB,SAAA,CAAU,GAAA"}
package/dist/config.mjs CHANGED
@@ -143,6 +143,8 @@ function buildRuntimeConfig(config, baseDir, env, options) {
143
143
  env,
144
144
  account: config.account,
145
145
  domain: config.domain,
146
+ title: config.title,
147
+ description: config.description,
146
148
  networkId: getNetworkIdForAccount(config.account),
147
149
  repository: config.repository,
148
150
  host: {
@@ -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, fetchPluginFromRegistry, parsePluginBosUrl } from \"./fastkv\";\nimport {\n type BosEnv,\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 PluginEntryValue,\n RuntimeConfig,\n RuntimePluginConfig,\n SharedDepConfig,\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\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?: BosEnv;\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 const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n configPath,\n baseDir,\n new Set(),\n extendedChain,\n env,\n );\n const config = BosConfigSchema.parse(parsed);\n\n cachedConfig = config;\n projectRoot = baseDir;\n\n const pluginRuntime = await resolveRuntimePlugins(config.plugins ?? {}, baseDir, runtimeEnv);\n const runtime = buildRuntimeConfig(config, baseDir, runtimeEnv, {\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?: BosEnv;\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: 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\nexport function getResolvedConfigPath(configDir: string): string {\n return join(configDir, \".bos\", RESOLVED_CONFIG_FILENAME);\n}\n\nexport function loadResolvedConfig(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 {}\n }\n const bosConfigPath = join(configDir, \"bos.config.json\");\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<string, unknown>;\n}\n\nfunction resolveDevelopmentTarget(\n development: string | undefined,\n production: string | undefined,\n baseDir: string,\n forceSource?: \"local\" | \"remote\",\n): RuntimeTarget {\n if (forceSource === \"remote\") {\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n const devTarget = resolveRuntimeTarget(development, baseDir);\n if (devTarget.source === \"local\" && (!devTarget.localPath || !existsSync(devTarget.localPath))) {\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 )\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 )\n : resolveRuntimeTarget(apiConfig.production, baseDir, \"remote\");\n const authRuntime = authConfig\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n authConfig.development,\n authConfig.production,\n baseDir,\n options?.authSource,\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 )\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\n return {\n env,\n account: config.account,\n domain: config.domain,\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: 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 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: 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: 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: options?.proxy ?? apiConfig.proxy,\n variables: apiConfig.variables,\n secrets: apiConfig.secrets,\n integrity: apiIsRemote ? apiConfig.integrity : undefined,\n },\n auth: (() => {\n if (!authConfig || !authRuntime) return undefined;\n return {\n name: resolvePluginRuntimeName(undefined, authRuntime.localPath, authConfig.name),\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 sidebar: authConfig.sidebar?.map((item) => ({\n ...item,\n to: item.to ?? \"/auth\",\n roleRequired: item.roleRequired ?? (\"member\" as const),\n })),\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 nextVisited = new Set(visited);\n nextVisited.add(configPath);\n const parentBaseDir = extendsRef.startsWith(\"bos://\")\n ? baseDir\n : isAbsolute(extendsRef)\n ? dirname(extendsRef)\n : baseDir;\n const parent = await resolveConfigWithExtends(extendsRef, parentBaseDir, nextVisited, chain, env);\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): Promise<Record<string, RuntimePluginConfig>> {\n const out: Record<string, RuntimePluginConfig> = {};\n\n for (const [pluginId, rawInput] of Object.entries(plugins)) {\n const normalized = normalizePluginEntry(rawInput);\n if (normalized === null || normalized === false) continue;\n\n let resolvedConfig: BosConfigInput = {};\n let pluginBaseDir = baseDir;\n\n if (normalized.extends) {\n try {\n const extendsUrl = resolveExtendsRef(normalized.extends, env);\n if (extendsUrl) {\n const remoteConfig = await fetchBosConfigFromFastKv<BosConfigInput>(extendsUrl);\n resolvedConfig = remoteConfig;\n }\n } catch {\n resolvedConfig = {};\n }\n }\n\n if (normalized.development?.startsWith(LOCAL_PREFIX)) {\n const localPath = resolve(baseDir, normalized.development.slice(LOCAL_PREFIX.length).trim());\n if (existsSync(localPath)) {\n const localConfigPath = join(localPath, \"bos.config.json\");\n if (existsSync(localConfigPath)) {\n try {\n const localRaw = JSON.parse(readFileSync(localConfigPath, \"utf-8\")) as BosConfigInput;\n resolvedConfig = mergeBosConfigWithExtends(resolvedConfig, localRaw);\n pluginBaseDir = localPath;\n } catch {}\n }\n }\n }\n\n if (normalized.app && isPlainObject(normalized.app)) {\n const mergedApp: Record<string, unknown> = {\n ...((resolvedConfig.app as Record<string, unknown>) ?? {}),\n ...(normalized.app as Record<string, unknown>),\n };\n resolvedConfig = { ...resolvedConfig, app: mergedApp as BosConfigInput[\"app\"] };\n }\n if (normalized.shared && isPlainObject(normalized.shared)) {\n const mergedShared: Record<string, Record<string, SharedDepConfig>> = {\n ...(resolvedConfig.shared ?? {}),\n ...(normalized.shared as Record<string, Record<string, SharedDepConfig>>),\n };\n resolvedConfig = { ...resolvedConfig, shared: mergedShared };\n }\n if (normalized.sidebar) {\n resolvedConfig = { ...resolvedConfig, sidebar: normalized.sidebar };\n }\n if (normalized.routes) {\n resolvedConfig = { ...resolvedConfig, routes: normalized.routes };\n }\n\n const pluginRuntime = await buildRuntimePluginConfig(\n pluginId,\n resolvedConfig,\n pluginBaseDir,\n env,\n normalized,\n );\n if (\n normalized.name &&\n typeof normalized.name === \"string\" &&\n !pluginRuntime.name.includes(\"/\")\n ) {\n pluginRuntime.name = normalized.name;\n }\n\n const integrity = normalized.integrity;\n if (env === \"production\" && integrity) {\n pluginRuntime.integrity = integrity;\n }\n\n if (\n pluginRuntime.source === \"remote\" &&\n pluginRuntime.url &&\n !pluginRuntime.localPath &&\n typeof resolvedConfig.app?.api?.name !== \"string\" &&\n !normalized.name\n ) {\n pluginRuntime.name = await resolveRemotePluginRuntimeName(\n pluginRuntime.url,\n pluginRuntime.name,\n );\n }\n\n out[pluginId] = pluginRuntime;\n }\n\n return out;\n}\n\nasync function resolveRemotePluginRuntimeName(baseUrl: string, fallback: string): Promise<string> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n const response = await fetch(`${baseUrl.replace(/\\/$/, \"\")}/plugin.manifest.json`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\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\ninterface ResolvedBosPlugin {\n url: string;\n integrity?: string;\n}\n\nasync function resolveBosPluginUrl(bosUrl: string): Promise<ResolvedBosPlugin | null> {\n const parsed = parsePluginBosUrl(bosUrl);\n if (!parsed) return null;\n\n try {\n const entry = await fetchPluginFromRegistry(parsed.accountId, parsed.pluginName);\n if (!entry) return null;\n\n const cdnUrl = entry.metadata.cdnUrl;\n if (!cdnUrl) return null;\n\n return {\n url: cdnUrl,\n integrity: entry.metadata.integrity ?? undefined,\n };\n } catch {\n return null;\n }\n}\n\nasync function buildRuntimePluginConfig(\n pluginId: string,\n config: BosConfigInput,\n baseDir: string,\n env: BosEnv,\n source: BosPluginRef,\n): Promise<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 development = apiDevelopment ?? sourceDevelopment;\n let production = apiProduction ?? sourceProduction;\n\n if (production?.startsWith(\"bos://\")) {\n const resolved = await resolveBosPluginUrl(production);\n if (resolved) {\n production = resolved.url;\n if (resolved.integrity && env === \"production\") {\n source.integrity = resolved.integrity;\n }\n }\n }\n\n const runtimeTarget =\n env === \"development\"\n ? resolveDevelopmentTarget(development, production, baseDir)\n : resolveRuntimeTarget(production, baseDir, \"remote\");\n const apiName = resolvePluginRuntimeName(\n typeof apiConfig.name === \"string\" ? apiConfig.name : undefined,\n runtimeTarget.localPath,\n pluginId,\n );\n\n const uiConfig = config.app?.ui;\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(uiDevelopment, uiProduction, baseDir)\n : resolveRuntimeTarget(uiProduction, baseDir, \"remote\")\n : undefined;\n\n const sidebar = (config.sidebar ?? source.sidebar)?.map((item) => ({\n ...item,\n to: item.to ?? `/${pluginId}`,\n roleRequired: item.roleRequired ?? (\"member\" as const),\n }));\n\n const routes = config.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 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 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 sidebar,\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 {}\n\n return fallback;\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 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 { BOS_CONFIG_ORDER, rebuildOrderedConfig } 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, fetchPluginFromRegistry, parsePluginBosUrl } from \"./fastkv\";\nimport {\n type BosEnv,\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 PluginEntryValue,\n RuntimeConfig,\n RuntimePluginConfig,\n SharedDepConfig,\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\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?: BosEnv;\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 const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n configPath,\n baseDir,\n new Set(),\n extendedChain,\n env,\n );\n const config = BosConfigSchema.parse(parsed);\n\n cachedConfig = config;\n projectRoot = baseDir;\n\n const pluginRuntime = await resolveRuntimePlugins(config.plugins ?? {}, baseDir, runtimeEnv);\n const runtime = buildRuntimeConfig(config, baseDir, runtimeEnv, {\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?: BosEnv;\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: 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\nexport function getResolvedConfigPath(configDir: string): string {\n return join(configDir, \".bos\", RESOLVED_CONFIG_FILENAME);\n}\n\nexport function loadResolvedConfig(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 {}\n }\n const bosConfigPath = join(configDir, \"bos.config.json\");\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<string, unknown>;\n}\n\nfunction resolveDevelopmentTarget(\n development: string | undefined,\n production: string | undefined,\n baseDir: string,\n forceSource?: \"local\" | \"remote\",\n): RuntimeTarget {\n if (forceSource === \"remote\") {\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n const devTarget = resolveRuntimeTarget(development, baseDir);\n if (devTarget.source === \"local\" && (!devTarget.localPath || !existsSync(devTarget.localPath))) {\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 )\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 )\n : resolveRuntimeTarget(apiConfig.production, baseDir, \"remote\");\n const authRuntime = authConfig\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n authConfig.development,\n authConfig.production,\n baseDir,\n options?.authSource,\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 )\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\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: 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 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: 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: 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: options?.proxy ?? apiConfig.proxy,\n variables: apiConfig.variables,\n secrets: apiConfig.secrets,\n integrity: apiIsRemote ? apiConfig.integrity : undefined,\n },\n auth: (() => {\n if (!authConfig || !authRuntime) return undefined;\n return {\n name: resolvePluginRuntimeName(undefined, authRuntime.localPath, authConfig.name),\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 sidebar: authConfig.sidebar?.map((item) => ({\n ...item,\n to: item.to ?? \"/auth\",\n roleRequired: item.roleRequired ?? (\"member\" as const),\n })),\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 nextVisited = new Set(visited);\n nextVisited.add(configPath);\n const parentBaseDir = extendsRef.startsWith(\"bos://\")\n ? baseDir\n : isAbsolute(extendsRef)\n ? dirname(extendsRef)\n : baseDir;\n const parent = await resolveConfigWithExtends(extendsRef, parentBaseDir, nextVisited, chain, env);\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): Promise<Record<string, RuntimePluginConfig>> {\n const out: Record<string, RuntimePluginConfig> = {};\n\n for (const [pluginId, rawInput] of Object.entries(plugins)) {\n const normalized = normalizePluginEntry(rawInput);\n if (normalized === null || normalized === false) continue;\n\n let resolvedConfig: BosConfigInput = {};\n let pluginBaseDir = baseDir;\n\n if (normalized.extends) {\n try {\n const extendsUrl = resolveExtendsRef(normalized.extends, env);\n if (extendsUrl) {\n const remoteConfig = await fetchBosConfigFromFastKv<BosConfigInput>(extendsUrl);\n resolvedConfig = remoteConfig;\n }\n } catch {\n resolvedConfig = {};\n }\n }\n\n if (normalized.development?.startsWith(LOCAL_PREFIX)) {\n const localPath = resolve(baseDir, normalized.development.slice(LOCAL_PREFIX.length).trim());\n if (existsSync(localPath)) {\n const localConfigPath = join(localPath, \"bos.config.json\");\n if (existsSync(localConfigPath)) {\n try {\n const localRaw = JSON.parse(readFileSync(localConfigPath, \"utf-8\")) as BosConfigInput;\n resolvedConfig = mergeBosConfigWithExtends(resolvedConfig, localRaw);\n pluginBaseDir = localPath;\n } catch {}\n }\n }\n }\n\n if (normalized.app && isPlainObject(normalized.app)) {\n const mergedApp: Record<string, unknown> = {\n ...((resolvedConfig.app as Record<string, unknown>) ?? {}),\n ...(normalized.app as Record<string, unknown>),\n };\n resolvedConfig = { ...resolvedConfig, app: mergedApp as BosConfigInput[\"app\"] };\n }\n if (normalized.shared && isPlainObject(normalized.shared)) {\n const mergedShared: Record<string, Record<string, SharedDepConfig>> = {\n ...(resolvedConfig.shared ?? {}),\n ...(normalized.shared as Record<string, Record<string, SharedDepConfig>>),\n };\n resolvedConfig = { ...resolvedConfig, shared: mergedShared };\n }\n if (normalized.sidebar) {\n resolvedConfig = { ...resolvedConfig, sidebar: normalized.sidebar };\n }\n if (normalized.routes) {\n resolvedConfig = { ...resolvedConfig, routes: normalized.routes };\n }\n\n const pluginRuntime = await buildRuntimePluginConfig(\n pluginId,\n resolvedConfig,\n pluginBaseDir,\n env,\n normalized,\n );\n if (\n normalized.name &&\n typeof normalized.name === \"string\" &&\n !pluginRuntime.name.includes(\"/\")\n ) {\n pluginRuntime.name = normalized.name;\n }\n\n const integrity = normalized.integrity;\n if (env === \"production\" && integrity) {\n pluginRuntime.integrity = integrity;\n }\n\n if (\n pluginRuntime.source === \"remote\" &&\n pluginRuntime.url &&\n !pluginRuntime.localPath &&\n typeof resolvedConfig.app?.api?.name !== \"string\" &&\n !normalized.name\n ) {\n pluginRuntime.name = await resolveRemotePluginRuntimeName(\n pluginRuntime.url,\n pluginRuntime.name,\n );\n }\n\n out[pluginId] = pluginRuntime;\n }\n\n return out;\n}\n\nasync function resolveRemotePluginRuntimeName(baseUrl: string, fallback: string): Promise<string> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n const response = await fetch(`${baseUrl.replace(/\\/$/, \"\")}/plugin.manifest.json`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\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\ninterface ResolvedBosPlugin {\n url: string;\n integrity?: string;\n}\n\nasync function resolveBosPluginUrl(bosUrl: string): Promise<ResolvedBosPlugin | null> {\n const parsed = parsePluginBosUrl(bosUrl);\n if (!parsed) return null;\n\n try {\n const entry = await fetchPluginFromRegistry(parsed.accountId, parsed.pluginName);\n if (!entry) return null;\n\n const cdnUrl = entry.metadata.cdnUrl;\n if (!cdnUrl) return null;\n\n return {\n url: cdnUrl,\n integrity: entry.metadata.integrity ?? undefined,\n };\n } catch {\n return null;\n }\n}\n\nasync function buildRuntimePluginConfig(\n pluginId: string,\n config: BosConfigInput,\n baseDir: string,\n env: BosEnv,\n source: BosPluginRef,\n): Promise<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 development = apiDevelopment ?? sourceDevelopment;\n let production = apiProduction ?? sourceProduction;\n\n if (production?.startsWith(\"bos://\")) {\n const resolved = await resolveBosPluginUrl(production);\n if (resolved) {\n production = resolved.url;\n if (resolved.integrity && env === \"production\") {\n source.integrity = resolved.integrity;\n }\n }\n }\n\n const runtimeTarget =\n env === \"development\"\n ? resolveDevelopmentTarget(development, production, baseDir)\n : resolveRuntimeTarget(production, baseDir, \"remote\");\n const apiName = resolvePluginRuntimeName(\n typeof apiConfig.name === \"string\" ? apiConfig.name : undefined,\n runtimeTarget.localPath,\n pluginId,\n );\n\n const uiConfig = config.app?.ui;\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(uiDevelopment, uiProduction, baseDir)\n : resolveRuntimeTarget(uiProduction, baseDir, \"remote\")\n : undefined;\n\n const sidebar = (config.sidebar ?? source.sidebar)?.map((item) => ({\n ...item,\n to: item.to ?? `/${pluginId}`,\n roleRequired: item.roleRequired ?? (\"member\" as const),\n }));\n\n const routes = config.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 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 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 sidebar,\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 {}\n\n return fallback;\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 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 { BOS_CONFIG_ORDER, rebuildOrderedConfig } from \"./merge\";\nexport type { BosConfig, RuntimeConfig } from \"./types\";\nexport { BosConfigSchema } from \"./types\";\n"],"mappings":"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"}
@@ -73,6 +73,8 @@ declare const ConfigResultSchema: z.ZodObject<{
73
73
  staging: z.ZodOptional<z.ZodString>;
74
74
  }, z.core.$strip>]>>;
75
75
  domain: z.ZodOptional<z.ZodString>;
76
+ title: z.ZodOptional<z.ZodString>;
77
+ description: z.ZodOptional<z.ZodString>;
76
78
  testnet: z.ZodOptional<z.ZodString>;
77
79
  staging: z.ZodOptional<z.ZodObject<{
78
80
  domain: z.ZodString;
@@ -475,6 +477,8 @@ declare const bosContract: {
475
477
  staging: z.ZodOptional<z.ZodString>;
476
478
  }, z.core.$strip>]>>;
477
479
  domain: z.ZodOptional<z.ZodString>;
480
+ title: z.ZodOptional<z.ZodString>;
481
+ description: z.ZodOptional<z.ZodString>;
478
482
  testnet: z.ZodOptional<z.ZodString>;
479
483
  staging: z.ZodOptional<z.ZodObject<{
480
484
  domain: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.cts","names":[],"sources":["../src/contract.ts"],"mappings":"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"}
1
+ {"version":3,"file":"contract.d.cts","names":[],"sources":["../src/contract.ts"],"mappings":"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"}
@@ -73,6 +73,8 @@ declare const ConfigResultSchema: z.ZodObject<{
73
73
  staging: z.ZodOptional<z.ZodString>;
74
74
  }, z.core.$strip>]>>;
75
75
  domain: z.ZodOptional<z.ZodString>;
76
+ title: z.ZodOptional<z.ZodString>;
77
+ description: z.ZodOptional<z.ZodString>;
76
78
  testnet: z.ZodOptional<z.ZodString>;
77
79
  staging: z.ZodOptional<z.ZodObject<{
78
80
  domain: z.ZodString;
@@ -475,6 +477,8 @@ declare const bosContract: {
475
477
  staging: z.ZodOptional<z.ZodString>;
476
478
  }, z.core.$strip>]>>;
477
479
  domain: z.ZodOptional<z.ZodString>;
480
+ title: z.ZodOptional<z.ZodString>;
481
+ description: z.ZodOptional<z.ZodString>;
478
482
  testnet: z.ZodOptional<z.ZodString>;
479
483
  staging: z.ZodOptional<z.ZodObject<{
480
484
  domain: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.mts","names":[],"sources":["../src/contract.ts"],"mappings":"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"}
1
+ {"version":3,"file":"contract.d.mts","names":[],"sources":["../src/contract.ts"],"mappings":"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"}
package/dist/merge.cjs CHANGED
@@ -6,6 +6,8 @@ const BOS_CONFIG_ORDER = [
6
6
  "extends",
7
7
  "account",
8
8
  "domain",
9
+ "title",
10
+ "description",
9
11
  "testnet",
10
12
  "staging",
11
13
  "repository",
@@ -1 +1 @@
1
- {"version":3,"file":"merge.cjs","names":[],"sources":["../src/merge.ts"],"sourcesContent":["import { createDefu } from \"defu\";\nimport type { BosConfigInput, ExtendsConfig } from \"./types\";\n\nexport const BOS_CONFIG_ORDER = [\n \"extends\",\n \"account\",\n \"domain\",\n \"testnet\",\n \"staging\",\n \"repository\",\n \"app\",\n \"plugins\",\n \"shared\",\n] as const;\n\nexport type BosConfigFieldName = (typeof BOS_CONFIG_ORDER)[number];\n\nexport type BosEnv = \"development\" | \"production\" | \"staging\";\n\nexport interface ResolvedConfigMeta {\n env: BosEnv;\n resolvedAt: string;\n extendsChain: string[];\n source?: string;\n}\n\nconst ARRAY_UNION_KEYS = new Set([\"secrets\"]);\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction unionArrays(a: unknown, b: unknown): unknown[] | undefined {\n const aArr = Array.isArray(a) ? a : [];\n const bArr = Array.isArray(b) ? b : [];\n if (aArr.length === 0 && bArr.length === 0) return undefined;\n const seen = new Set<string>();\n const result: unknown[] = [];\n for (const item of [...aArr, ...bArr]) {\n if (typeof item === \"string\") {\n if (seen.has(item)) continue;\n seen.add(item);\n }\n result.push(item);\n }\n return result;\n}\n\nfunction cleanNullSentinels(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined) continue;\n if (isPlainObject(value)) {\n const cleaned = cleanNullSentinels(value);\n if (Object.keys(cleaned).length > 0) {\n out[key] = cleaned;\n }\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst bosConfigMerger = createDefu((obj: any, key: any, value: any): boolean | undefined => {\n if (obj[key] === null) return true;\n if (value === null) {\n obj[key] = null;\n return true;\n }\n if (Array.isArray(obj[key]) && Array.isArray(value)) {\n if (ARRAY_UNION_KEYS.has(key)) {\n obj[key] = unionArrays(obj[key], value);\n } else {\n obj[key] = value;\n }\n return true;\n }\n return false;\n});\n\nexport function resolveExtendsRef(\n extendsField: string | ExtendsConfig | undefined,\n env: BosEnv,\n): string | undefined {\n if (!extendsField) return undefined;\n if (typeof extendsField === \"string\") return extendsField;\n return extendsField[env] ?? extendsField.production ?? Object.values(extendsField).find(Boolean);\n}\n\nexport function mergeBosConfigWithExtends(\n parent: BosConfigInput,\n child: BosConfigInput,\n): BosConfigInput {\n const merged = bosConfigMerger(child, parent) as BosConfigInput;\n\n if (isPlainObject(parent.plugins) && isPlainObject(child.plugins)) {\n const plugins: Record<string, unknown> = { ...parent.plugins };\n for (const [key, rawValue] of Object.entries(child.plugins)) {\n const value = rawValue as unknown;\n if (value === null || value === false) {\n delete plugins[key];\n } else if (isPlainObject(plugins[key]) && isPlainObject(value)) {\n plugins[key] = bosConfigMerger(\n value as Record<string, unknown>,\n plugins[key] as Record<string, unknown>,\n );\n } else {\n plugins[key] = value;\n }\n }\n (merged as Record<string, unknown>).plugins = plugins;\n } else if (child.plugins !== undefined) {\n (merged as Record<string, unknown>).plugins = cleanNullSentinels(\n child.plugins as Record<string, unknown>,\n );\n }\n\n const mergedRecord = merged as Record<string, unknown>;\n\n if (isPlainObject(mergedRecord.app)) {\n for (const entryVal of Object.values(mergedRecord.app as Record<string, unknown>)) {\n if (!isPlainObject(entryVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(entryVal[secretKey])) {\n entryVal[secretKey] =\n (unionArrays(entryVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? entryVal[secretKey];\n }\n }\n }\n }\n\n if (isPlainObject(mergedRecord.plugins)) {\n for (const pluginVal of Object.values(mergedRecord.plugins as Record<string, unknown>)) {\n if (!isPlainObject(pluginVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(pluginVal[secretKey])) {\n pluginVal[secretKey] =\n (unionArrays(pluginVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? pluginVal[secretKey];\n }\n }\n }\n }\n\n return rebuildOrderedConfig(mergedRecord) as BosConfigInput;\n}\n\nexport function mergeBosConfigWithTemplate(\n local: BosConfigInput,\n template: BosConfigInput,\n): BosConfigInput {\n const merged = mergeJsonValuesPreservingLocalOrder(local, template) as BosConfigInput;\n return rebuildOrderedConfig(merged as Record<string, unknown>) as BosConfigInput;\n}\n\nfunction mergeJsonValuesPreservingLocalOrder(local: unknown, template: unknown): unknown {\n if (isPlainObject(local) && isPlainObject(template)) {\n const merged: Record<string, unknown> = {};\n for (const key of Object.keys(local)) {\n merged[key] = mergeJsonValuesPreservingLocalOrder(\n local[key],\n (template as Record<string, unknown>)[key],\n );\n }\n for (const key of Object.keys(template as Record<string, unknown>)) {\n if (!(key in merged)) {\n merged[key] = (template as Record<string, unknown>)[key];\n }\n }\n return merged;\n }\n return local ?? template;\n}\n\nexport function rebuildOrderedConfig<T extends Record<string, unknown>>(config: T): T {\n const ordered: Record<string, unknown> = {};\n\n for (const key of BOS_CONFIG_ORDER) {\n if (key in config) {\n ordered[key] = config[key];\n }\n }\n\n for (const key of Object.keys(config)) {\n if (!BOS_CONFIG_ORDER.includes(key as BosConfigFieldName)) {\n ordered[key] = config[key];\n }\n }\n\n return ordered as T;\n}\n\nexport { bosConfigMerger };\n"],"mappings":"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"}
1
+ {"version":3,"file":"merge.cjs","names":[],"sources":["../src/merge.ts"],"sourcesContent":["import { createDefu } from \"defu\";\nimport type { BosConfigInput, ExtendsConfig } from \"./types\";\n\nexport const BOS_CONFIG_ORDER = [\n \"extends\",\n \"account\",\n \"domain\",\n \"title\",\n \"description\",\n \"testnet\",\n \"staging\",\n \"repository\",\n \"app\",\n \"plugins\",\n \"shared\",\n] as const;\n\nexport type BosConfigFieldName = (typeof BOS_CONFIG_ORDER)[number];\n\nexport type BosEnv = \"development\" | \"production\" | \"staging\";\n\nexport interface ResolvedConfigMeta {\n env: BosEnv;\n resolvedAt: string;\n extendsChain: string[];\n source?: string;\n}\n\nconst ARRAY_UNION_KEYS = new Set([\"secrets\"]);\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction unionArrays(a: unknown, b: unknown): unknown[] | undefined {\n const aArr = Array.isArray(a) ? a : [];\n const bArr = Array.isArray(b) ? b : [];\n if (aArr.length === 0 && bArr.length === 0) return undefined;\n const seen = new Set<string>();\n const result: unknown[] = [];\n for (const item of [...aArr, ...bArr]) {\n if (typeof item === \"string\") {\n if (seen.has(item)) continue;\n seen.add(item);\n }\n result.push(item);\n }\n return result;\n}\n\nfunction cleanNullSentinels(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined) continue;\n if (isPlainObject(value)) {\n const cleaned = cleanNullSentinels(value);\n if (Object.keys(cleaned).length > 0) {\n out[key] = cleaned;\n }\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst bosConfigMerger = createDefu((obj: any, key: any, value: any): boolean | undefined => {\n if (obj[key] === null) return true;\n if (value === null) {\n obj[key] = null;\n return true;\n }\n if (Array.isArray(obj[key]) && Array.isArray(value)) {\n if (ARRAY_UNION_KEYS.has(key)) {\n obj[key] = unionArrays(obj[key], value);\n } else {\n obj[key] = value;\n }\n return true;\n }\n return false;\n});\n\nexport function resolveExtendsRef(\n extendsField: string | ExtendsConfig | undefined,\n env: BosEnv,\n): string | undefined {\n if (!extendsField) return undefined;\n if (typeof extendsField === \"string\") return extendsField;\n return extendsField[env] ?? extendsField.production ?? Object.values(extendsField).find(Boolean);\n}\n\nexport function mergeBosConfigWithExtends(\n parent: BosConfigInput,\n child: BosConfigInput,\n): BosConfigInput {\n const merged = bosConfigMerger(child, parent) as BosConfigInput;\n\n if (isPlainObject(parent.plugins) && isPlainObject(child.plugins)) {\n const plugins: Record<string, unknown> = { ...parent.plugins };\n for (const [key, rawValue] of Object.entries(child.plugins)) {\n const value = rawValue as unknown;\n if (value === null || value === false) {\n delete plugins[key];\n } else if (isPlainObject(plugins[key]) && isPlainObject(value)) {\n plugins[key] = bosConfigMerger(\n value as Record<string, unknown>,\n plugins[key] as Record<string, unknown>,\n );\n } else {\n plugins[key] = value;\n }\n }\n (merged as Record<string, unknown>).plugins = plugins;\n } else if (child.plugins !== undefined) {\n (merged as Record<string, unknown>).plugins = cleanNullSentinels(\n child.plugins as Record<string, unknown>,\n );\n }\n\n const mergedRecord = merged as Record<string, unknown>;\n\n if (isPlainObject(mergedRecord.app)) {\n for (const entryVal of Object.values(mergedRecord.app as Record<string, unknown>)) {\n if (!isPlainObject(entryVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(entryVal[secretKey])) {\n entryVal[secretKey] =\n (unionArrays(entryVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? entryVal[secretKey];\n }\n }\n }\n }\n\n if (isPlainObject(mergedRecord.plugins)) {\n for (const pluginVal of Object.values(mergedRecord.plugins as Record<string, unknown>)) {\n if (!isPlainObject(pluginVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(pluginVal[secretKey])) {\n pluginVal[secretKey] =\n (unionArrays(pluginVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? pluginVal[secretKey];\n }\n }\n }\n }\n\n return rebuildOrderedConfig(mergedRecord) as BosConfigInput;\n}\n\nexport function mergeBosConfigWithTemplate(\n local: BosConfigInput,\n template: BosConfigInput,\n): BosConfigInput {\n const merged = mergeJsonValuesPreservingLocalOrder(local, template) as BosConfigInput;\n return rebuildOrderedConfig(merged as Record<string, unknown>) as BosConfigInput;\n}\n\nfunction mergeJsonValuesPreservingLocalOrder(local: unknown, template: unknown): unknown {\n if (isPlainObject(local) && isPlainObject(template)) {\n const merged: Record<string, unknown> = {};\n for (const key of Object.keys(local)) {\n merged[key] = mergeJsonValuesPreservingLocalOrder(\n local[key],\n (template as Record<string, unknown>)[key],\n );\n }\n for (const key of Object.keys(template as Record<string, unknown>)) {\n if (!(key in merged)) {\n merged[key] = (template as Record<string, unknown>)[key];\n }\n }\n return merged;\n }\n return local ?? template;\n}\n\nexport function rebuildOrderedConfig<T extends Record<string, unknown>>(config: T): T {\n const ordered: Record<string, unknown> = {};\n\n for (const key of BOS_CONFIG_ORDER) {\n if (key in config) {\n ordered[key] = config[key];\n }\n }\n\n for (const key of Object.keys(config)) {\n if (!BOS_CONFIG_ORDER.includes(key as BosConfigFieldName)) {\n ordered[key] = config[key];\n }\n }\n\n return ordered as T;\n}\n\nexport { bosConfigMerger };\n"],"mappings":"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"}
package/dist/merge.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region src/merge.d.ts
2
- declare const BOS_CONFIG_ORDER: readonly ["extends", "account", "domain", "testnet", "staging", "repository", "app", "plugins", "shared"];
2
+ declare const BOS_CONFIG_ORDER: readonly ["extends", "account", "domain", "title", "description", "testnet", "staging", "repository", "app", "plugins", "shared"];
3
3
  type BosEnv = "development" | "production" | "staging";
4
4
  declare function rebuildOrderedConfig<T extends Record<string, unknown>>(config: T): T;
5
5
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.cts","names":[],"sources":["../src/merge.ts"],"mappings":";cAGa,gBAAA;AAAA,KAcD,MAAA;AAAA,iBAkKI,oBAAA,WAA+B,MAAA,kBAAA,CAAyB,MAAA,EAAQ,CAAA,GAAI,CAAA"}
1
+ {"version":3,"file":"merge.d.cts","names":[],"sources":["../src/merge.ts"],"mappings":";cAGa,gBAAA;AAAA,KAgBD,MAAA;AAAA,iBAkKI,oBAAA,WAA+B,MAAA,kBAAA,CAAyB,MAAA,EAAQ,CAAA,GAAI,CAAA"}
package/dist/merge.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region src/merge.d.ts
2
- declare const BOS_CONFIG_ORDER: readonly ["extends", "account", "domain", "testnet", "staging", "repository", "app", "plugins", "shared"];
2
+ declare const BOS_CONFIG_ORDER: readonly ["extends", "account", "domain", "title", "description", "testnet", "staging", "repository", "app", "plugins", "shared"];
3
3
  type BosEnv = "development" | "production" | "staging";
4
4
  declare function rebuildOrderedConfig<T extends Record<string, unknown>>(config: T): T;
5
5
  //#endregion