everything-dev 1.14.1 → 1.14.4

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 (53) hide show
  1. package/dist/cli/upgrade.cjs +7 -4
  2. package/dist/cli/upgrade.cjs.map +1 -1
  3. package/dist/cli/upgrade.mjs +7 -4
  4. package/dist/cli/upgrade.mjs.map +1 -1
  5. package/dist/contract.d.cts +33 -33
  6. package/dist/contract.d.mts +33 -33
  7. package/dist/orchestrator.cjs +0 -1
  8. package/dist/orchestrator.cjs.map +1 -1
  9. package/dist/plugin.d.cts +33 -33
  10. package/dist/plugin.d.mts +33 -33
  11. package/dist/shared.cjs +0 -10
  12. package/dist/shared.cjs.map +1 -1
  13. package/dist/shared.mjs +1 -9
  14. package/dist/shared.mjs.map +1 -1
  15. package/dist/types.d.cts +2 -2
  16. package/dist/types.d.mts +2 -2
  17. package/package.json +4 -30
  18. package/src/cli/upgrade.ts +8 -5
  19. package/dist/api.cjs +0 -124
  20. package/dist/api.cjs.map +0 -1
  21. package/dist/api.d.cts +0 -36
  22. package/dist/api.d.cts.map +0 -1
  23. package/dist/api.d.mts +0 -36
  24. package/dist/api.d.mts.map +0 -1
  25. package/dist/api.mjs +0 -119
  26. package/dist/api.mjs.map +0 -1
  27. package/dist/federation.server.cjs +0 -27
  28. package/dist/federation.server.cjs.map +0 -1
  29. package/dist/federation.server.mjs +0 -27
  30. package/dist/federation.server.mjs.map +0 -1
  31. package/dist/host.cjs +0 -402
  32. package/dist/host.cjs.map +0 -1
  33. package/dist/host.d.cts +0 -22
  34. package/dist/host.d.cts.map +0 -1
  35. package/dist/host.d.mts +0 -22
  36. package/dist/host.d.mts.map +0 -1
  37. package/dist/host.mjs +0 -399
  38. package/dist/host.mjs.map +0 -1
  39. package/dist/orchestrator.d.cts +0 -44
  40. package/dist/orchestrator.d.cts.map +0 -1
  41. package/dist/orchestrator.d.mts +0 -44
  42. package/dist/orchestrator.d.mts.map +0 -1
  43. package/dist/service-descriptor.d.cts +0 -137
  44. package/dist/service-descriptor.d.cts.map +0 -1
  45. package/dist/service-descriptor.d.mts +0 -137
  46. package/dist/service-descriptor.d.mts.map +0 -1
  47. package/dist/shared.d.cts +0 -36
  48. package/dist/shared.d.cts.map +0 -1
  49. package/dist/shared.d.mts +0 -36
  50. package/dist/shared.d.mts.map +0 -1
  51. package/src/api.ts +0 -181
  52. package/src/federation.server.ts +0 -43
  53. package/src/host.ts +0 -573
@@ -1 +1 @@
1
- {"version":3,"file":"shared.mjs","names":[],"sources":["../src/shared.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { type BosEnv, type ResolvedConfigMeta, rebuildOrderedConfig } from \"./merge\";\nimport type { BosConfig, SharedDepConfig } from \"./types\";\nimport { BosConfigSchema } from \"./types\";\n\ninterface PackageJson {\n name?: string;\n private?: boolean;\n version?: string;\n workspaces?: {\n packages?: string[];\n catalog?: Record<string, string>;\n };\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n}\n\nexport interface SharedUiResolvedDep {\n name: string;\n version: string;\n requiredVersion: string;\n shareScope: string;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n}\n\nexport interface SharedUiResolved {\n deps: Record<string, SharedUiResolvedDep>;\n fingerprintSha256: string;\n}\n\nexport interface SharedSyncResult {\n mode: \"catalog->bos\" | \"bos->catalog\";\n hostMode: \"local\" | \"remote\";\n bosConfigChanged: boolean;\n catalogChanged: boolean;\n generatedChanged: boolean;\n resolved: SharedUiResolved;\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction extractSemverExact(input: unknown): string | null {\n if (typeof input !== \"string\") return null;\n const match = input.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match ? match[0] : null;\n}\n\nfunction caretRange(version: string): string {\n return `^${version}`;\n}\n\nfunction stableDepsObject(\n deps: Record<string, SharedUiResolvedDep>,\n): Record<string, SharedUiResolvedDep> {\n const keys = Object.keys(deps).sort((a, b) => a.localeCompare(b));\n const out: Record<string, SharedUiResolvedDep> = {};\n for (const k of keys) out[k] = deps[k]!;\n return out;\n}\n\nfunction writeFileIfChanged(filePath: string, nextContent: string): boolean {\n try {\n const current = readFileSync(filePath, \"utf-8\");\n if (current === nextContent) return false;\n } catch {\n // ignore\n }\n\n writeFileSync(filePath, nextContent);\n return true;\n}\n\nfunction fingerprintResolved(deps: Record<string, SharedUiResolvedDep>): string {\n const stable = stableDepsObject(deps);\n return sha256(JSON.stringify(stable));\n}\n\nfunction getSharedUiDeps(bosConfig: BosConfig): Record<string, SharedDepConfig> {\n const shared = bosConfig.shared ?? {};\n const ui = shared.ui ?? {};\n return ui;\n}\n\nexport async function syncAndGenerateSharedUi(opts: {\n configDir: string;\n hostMode: \"local\" | \"remote\";\n bosConfig?: BosConfig;\n env?: BosEnv;\n extendsChain?: string[];\n}): Promise<SharedSyncResult> {\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n const resolvedConfigPath = join(opts.configDir, \".bos\", \"bos.resolved-config.json\");\n const packageJsonPath = join(opts.configDir, \"package.json\");\n const generatedPath = join(opts.configDir, \".bos\", \"generated\", \"shared-ui.json\");\n\n let bosConfig: BosConfig;\n if (opts.bosConfig) {\n bosConfig = opts.bosConfig;\n } else {\n const raw = JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<string, unknown>;\n bosConfig = BosConfigSchema.parse(raw);\n }\n let pkgJson: PackageJson = {};\n try {\n pkgJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as PackageJson;\n } catch {\n // package.json might not exist\n }\n\n const originalBos = JSON.stringify(bosConfig);\n const originalPkg = JSON.stringify(pkgJson);\n\n const catalog = pkgJson?.workspaces?.catalog ?? {};\n const sharedUi = getSharedUiDeps(bosConfig);\n\n const mode = opts.hostMode === \"local\" ? \"catalog->bos\" : \"bos->catalog\";\n\n if (mode === \"catalog->bos\") {\n for (const [name, cfg] of Object.entries(sharedUi)) {\n const dep = cfg as SharedDepConfig;\n const version =\n catalog[name] ?? extractSemverExact(dep.version) ?? extractSemverExact(dep.requiredVersion);\n if (!version) continue;\n dep.version = version;\n dep.requiredVersion = caretRange(version);\n dep.shareScope = dep.shareScope ?? \"default\";\n }\n } else {\n for (const [name, cfg] of Object.entries(sharedUi)) {\n const dep = cfg as SharedDepConfig;\n const version = extractSemverExact(dep.version) ?? extractSemverExact(dep.requiredVersion);\n if (!version) continue;\n dep.version = version;\n dep.requiredVersion = caretRange(version);\n dep.shareScope = dep.shareScope ?? \"default\";\n if (catalog[name] !== version) {\n catalog[name] = version;\n }\n }\n if (!pkgJson.workspaces) pkgJson.workspaces = { packages: [], catalog: {} };\n pkgJson.workspaces.catalog = catalog;\n }\n\n const nextBos = JSON.stringify(bosConfig);\n const nextPkg = JSON.stringify(pkgJson);\n const bosConfigChanged = nextBos !== originalBos;\n const catalogChanged = nextPkg !== originalPkg;\n\n if (bosConfigChanged) {\n if (mode === \"catalog->bos\") {\n const resolvedDir = dirname(resolvedConfigPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n const ordered = rebuildOrderedConfig(bosConfig);\n const meta: ResolvedConfigMeta = {\n env: opts.env ?? \"development\",\n resolvedAt: new Date().toISOString(),\n extendsChain: opts.extendsChain ?? [],\n source: \"shared-sync\",\n };\n const resolvedOutput = {\n _resolved: meta,\n ...ordered,\n };\n writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\\n`);\n } else {\n writeFileIfChanged(bosConfigPath, `${JSON.stringify(bosConfig, null, 2)}\\n`);\n }\n }\n if (catalogChanged) {\n writeFileIfChanged(packageJsonPath, `${JSON.stringify(pkgJson, null, 2)}\\n`);\n }\n\n const resolvedDeps: Record<string, SharedUiResolvedDep> = {};\n for (const [name, cfg] of Object.entries(getSharedUiDeps(bosConfig))) {\n const version =\n catalog[name] ?? extractSemverExact(cfg.version) ?? extractSemverExact(cfg.requiredVersion);\n if (!version) continue;\n resolvedDeps[name] = {\n name,\n version,\n requiredVersion: caretRange(version),\n shareScope: cfg.shareScope ?? \"default\",\n singleton: cfg.singleton ?? false,\n eager: cfg.eager ?? false,\n strictVersion: cfg.strictVersion ?? false,\n };\n }\n\n const stableResolvedDeps = stableDepsObject(resolvedDeps);\n const resolved: SharedUiResolved = {\n deps: stableResolvedDeps,\n fingerprintSha256: fingerprintResolved(stableResolvedDeps),\n };\n\n const nextGenerated = {\n schemaVersion: 1,\n kind: \"everything-dev/shared-ui\",\n generatedAt: new Date().toISOString(),\n ui: {\n deps: stableResolvedDeps,\n fingerprintSha256: resolved.fingerprintSha256,\n },\n inputs: {\n mode,\n hostMode: opts.hostMode,\n },\n };\n\n let prevFingerprint: string | null = null;\n try {\n const prev = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n prevFingerprint = prev?.ui?.fingerprintSha256 ?? null;\n } catch {\n // ignore\n }\n\n mkdirSync(dirname(generatedPath), { recursive: true });\n writeFileIfChanged(generatedPath, `${JSON.stringify(nextGenerated, null, 2)}\\n`);\n\n const generatedChanged = prevFingerprint !== nextGenerated.ui.fingerprintSha256;\n\n return {\n mode,\n hostMode: opts.hostMode,\n bosConfigChanged,\n catalogChanged,\n generatedChanged,\n resolved,\n };\n}\n\nexport function loadGeneratedSharedUi(configDir: string): SharedUiResolved | null {\n const generatedPath = join(configDir, \".bos\", \"generated\", \"shared-ui.json\");\n try {\n const content = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n return content?.ui ?? null;\n } catch {\n return null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shared.mjs","names":[],"sources":["../src/shared.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { type BosEnv, type ResolvedConfigMeta, rebuildOrderedConfig } from \"./merge\";\nimport type { BosConfig, SharedDepConfig } from \"./types\";\nimport { BosConfigSchema } from \"./types\";\n\ninterface PackageJson {\n name?: string;\n private?: boolean;\n version?: string;\n workspaces?: {\n packages?: string[];\n catalog?: Record<string, string>;\n };\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n}\n\nexport interface SharedUiResolvedDep {\n name: string;\n version: string;\n requiredVersion: string;\n shareScope: string;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n}\n\nexport interface SharedUiResolved {\n deps: Record<string, SharedUiResolvedDep>;\n fingerprintSha256: string;\n}\n\nexport interface SharedSyncResult {\n mode: \"catalog->bos\" | \"bos->catalog\";\n hostMode: \"local\" | \"remote\";\n bosConfigChanged: boolean;\n catalogChanged: boolean;\n generatedChanged: boolean;\n resolved: SharedUiResolved;\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction extractSemverExact(input: unknown): string | null {\n if (typeof input !== \"string\") return null;\n const match = input.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match ? match[0] : null;\n}\n\nfunction caretRange(version: string): string {\n return `^${version}`;\n}\n\nfunction stableDepsObject(\n deps: Record<string, SharedUiResolvedDep>,\n): Record<string, SharedUiResolvedDep> {\n const keys = Object.keys(deps).sort((a, b) => a.localeCompare(b));\n const out: Record<string, SharedUiResolvedDep> = {};\n for (const k of keys) out[k] = deps[k]!;\n return out;\n}\n\nfunction writeFileIfChanged(filePath: string, nextContent: string): boolean {\n try {\n const current = readFileSync(filePath, \"utf-8\");\n if (current === nextContent) return false;\n } catch {\n // ignore\n }\n\n writeFileSync(filePath, nextContent);\n return true;\n}\n\nfunction fingerprintResolved(deps: Record<string, SharedUiResolvedDep>): string {\n const stable = stableDepsObject(deps);\n return sha256(JSON.stringify(stable));\n}\n\nfunction getSharedUiDeps(bosConfig: BosConfig): Record<string, SharedDepConfig> {\n const shared = bosConfig.shared ?? {};\n const ui = shared.ui ?? {};\n return ui;\n}\n\nexport async function syncAndGenerateSharedUi(opts: {\n configDir: string;\n hostMode: \"local\" | \"remote\";\n bosConfig?: BosConfig;\n env?: BosEnv;\n extendsChain?: string[];\n}): Promise<SharedSyncResult> {\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n const resolvedConfigPath = join(opts.configDir, \".bos\", \"bos.resolved-config.json\");\n const packageJsonPath = join(opts.configDir, \"package.json\");\n const generatedPath = join(opts.configDir, \".bos\", \"generated\", \"shared-ui.json\");\n\n let bosConfig: BosConfig;\n if (opts.bosConfig) {\n bosConfig = opts.bosConfig;\n } else {\n const raw = JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<string, unknown>;\n bosConfig = BosConfigSchema.parse(raw);\n }\n let pkgJson: PackageJson = {};\n try {\n pkgJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as PackageJson;\n } catch {\n // package.json might not exist\n }\n\n const originalBos = JSON.stringify(bosConfig);\n const originalPkg = JSON.stringify(pkgJson);\n\n const catalog = pkgJson?.workspaces?.catalog ?? {};\n const sharedUi = getSharedUiDeps(bosConfig);\n\n const mode = opts.hostMode === \"local\" ? \"catalog->bos\" : \"bos->catalog\";\n\n if (mode === \"catalog->bos\") {\n for (const [name, cfg] of Object.entries(sharedUi)) {\n const dep = cfg as SharedDepConfig;\n const version =\n catalog[name] ?? extractSemverExact(dep.version) ?? extractSemverExact(dep.requiredVersion);\n if (!version) continue;\n dep.version = version;\n dep.requiredVersion = caretRange(version);\n dep.shareScope = dep.shareScope ?? \"default\";\n }\n } else {\n for (const [name, cfg] of Object.entries(sharedUi)) {\n const dep = cfg as SharedDepConfig;\n const version = extractSemverExact(dep.version) ?? extractSemverExact(dep.requiredVersion);\n if (!version) continue;\n dep.version = version;\n dep.requiredVersion = caretRange(version);\n dep.shareScope = dep.shareScope ?? \"default\";\n if (catalog[name] !== version) {\n catalog[name] = version;\n }\n }\n if (!pkgJson.workspaces) pkgJson.workspaces = { packages: [], catalog: {} };\n pkgJson.workspaces.catalog = catalog;\n }\n\n const nextBos = JSON.stringify(bosConfig);\n const nextPkg = JSON.stringify(pkgJson);\n const bosConfigChanged = nextBos !== originalBos;\n const catalogChanged = nextPkg !== originalPkg;\n\n if (bosConfigChanged) {\n if (mode === \"catalog->bos\") {\n const resolvedDir = dirname(resolvedConfigPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n const ordered = rebuildOrderedConfig(bosConfig);\n const meta: ResolvedConfigMeta = {\n env: opts.env ?? \"development\",\n resolvedAt: new Date().toISOString(),\n extendsChain: opts.extendsChain ?? [],\n source: \"shared-sync\",\n };\n const resolvedOutput = {\n _resolved: meta,\n ...ordered,\n };\n writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\\n`);\n } else {\n writeFileIfChanged(bosConfigPath, `${JSON.stringify(bosConfig, null, 2)}\\n`);\n }\n }\n if (catalogChanged) {\n writeFileIfChanged(packageJsonPath, `${JSON.stringify(pkgJson, null, 2)}\\n`);\n }\n\n const resolvedDeps: Record<string, SharedUiResolvedDep> = {};\n for (const [name, cfg] of Object.entries(getSharedUiDeps(bosConfig))) {\n const version =\n catalog[name] ?? extractSemverExact(cfg.version) ?? extractSemverExact(cfg.requiredVersion);\n if (!version) continue;\n resolvedDeps[name] = {\n name,\n version,\n requiredVersion: caretRange(version),\n shareScope: cfg.shareScope ?? \"default\",\n singleton: cfg.singleton ?? false,\n eager: cfg.eager ?? false,\n strictVersion: cfg.strictVersion ?? false,\n };\n }\n\n const stableResolvedDeps = stableDepsObject(resolvedDeps);\n const resolved: SharedUiResolved = {\n deps: stableResolvedDeps,\n fingerprintSha256: fingerprintResolved(stableResolvedDeps),\n };\n\n const nextGenerated = {\n schemaVersion: 1,\n kind: \"everything-dev/shared-ui\",\n generatedAt: new Date().toISOString(),\n ui: {\n deps: stableResolvedDeps,\n fingerprintSha256: resolved.fingerprintSha256,\n },\n inputs: {\n mode,\n hostMode: opts.hostMode,\n },\n };\n\n let prevFingerprint: string | null = null;\n try {\n const prev = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n prevFingerprint = prev?.ui?.fingerprintSha256 ?? null;\n } catch {\n // ignore\n }\n\n mkdirSync(dirname(generatedPath), { recursive: true });\n writeFileIfChanged(generatedPath, `${JSON.stringify(nextGenerated, null, 2)}\\n`);\n\n const generatedChanged = prevFingerprint !== nextGenerated.ui.fingerprintSha256;\n\n return {\n mode,\n hostMode: opts.hostMode,\n bosConfigChanged,\n catalogChanged,\n generatedChanged,\n resolved,\n };\n}\n\nexport function loadGeneratedSharedUi(configDir: string): SharedUiResolved | null {\n const generatedPath = join(configDir, \".bos\", \"generated\", \"shared-ui.json\");\n try {\n const content = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n return content?.ui ?? null;\n } catch {\n return null;\n }\n}\n"],"mappings":"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"}
package/dist/types.d.cts CHANGED
@@ -348,8 +348,8 @@ declare const BosConfigSchema: z.ZodObject<{
348
348
  type BosConfig = z.infer<typeof BosConfigSchema>;
349
349
  declare const RuntimeConfigSchema: z.ZodObject<{
350
350
  env: z.ZodEnum<{
351
- production: "production";
352
351
  development: "development";
352
+ production: "production";
353
353
  staging: "staging";
354
354
  }>;
355
355
  account: z.ZodString;
@@ -489,8 +489,8 @@ type RuntimeConfig = z.infer<typeof RuntimeConfigSchema>;
489
489
  declare const ClientRuntimeConfigSchema: z.ZodObject<{
490
490
  cspNonce: z.ZodOptional<z.ZodString>;
491
491
  env: z.ZodEnum<{
492
- production: "production";
493
492
  development: "development";
493
+ production: "production";
494
494
  staging: "staging";
495
495
  }>;
496
496
  account: z.ZodString;
package/dist/types.d.mts CHANGED
@@ -348,8 +348,8 @@ declare const BosConfigSchema: z.ZodObject<{
348
348
  type BosConfig = z.infer<typeof BosConfigSchema>;
349
349
  declare const RuntimeConfigSchema: z.ZodObject<{
350
350
  env: z.ZodEnum<{
351
- production: "production";
352
351
  development: "development";
352
+ production: "production";
353
353
  staging: "staging";
354
354
  }>;
355
355
  account: z.ZodString;
@@ -489,8 +489,8 @@ type RuntimeConfig = z.infer<typeof RuntimeConfigSchema>;
489
489
  declare const ClientRuntimeConfigSchema: z.ZodObject<{
490
490
  cspNonce: z.ZodOptional<z.ZodString>;
491
491
  env: z.ZodEnum<{
492
- production: "production";
493
492
  development: "development";
493
+ production: "production";
494
494
  staging: "staging";
495
495
  }>;
496
496
  account: z.ZodString;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "everything-dev",
3
- "version": "1.14.1",
3
+ "version": "1.14.4",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -31,11 +31,6 @@
31
31
  "import": "./dist/contract.meta.mjs",
32
32
  "require": "./dist/contract.meta.cjs"
33
33
  },
34
- "./shared": {
35
- "types": "./dist/shared.d.mts",
36
- "import": "./dist/shared.mjs",
37
- "require": "./dist/shared.cjs"
38
- },
39
34
  "./mf": {
40
35
  "types": "./dist/mf.d.mts",
41
36
  "import": "./dist/mf.mjs",
@@ -56,21 +51,6 @@
56
51
  "import": "./dist/sdk.mjs",
57
52
  "require": "./dist/sdk.cjs"
58
53
  },
59
- "./api": {
60
- "types": "./dist/api.d.mts",
61
- "import": "./dist/api.mjs",
62
- "require": "./dist/api.cjs"
63
- },
64
- "./host": {
65
- "types": "./dist/host.d.mts",
66
- "import": "./dist/host.mjs",
67
- "require": "./dist/host.cjs"
68
- },
69
- "./orchestrator": {
70
- "types": "./dist/orchestrator.d.mts",
71
- "import": "./dist/orchestrator.mjs",
72
- "require": "./dist/orchestrator.cjs"
73
- },
74
54
  "./cli": {
75
55
  "types": "./dist/cli.d.mts",
76
56
  "import": "./dist/cli.mjs",
@@ -144,21 +124,15 @@
144
124
  "@clack/prompts": "^0.10.1",
145
125
  "@effect/platform": "^0.96.1",
146
126
  "@effect/platform-node": "^0.106.0",
147
- "@hono/node-server": "^2.0.1",
148
- "@module-federation/enhanced": "^2.3.2",
149
- "@module-federation/node": "^2.7.40",
150
- "@module-federation/runtime-core": "^2.3.2",
151
- "@orpc/contract": "^1.13.4",
152
- "@orpc/openapi": "^1.13.4",
153
- "@orpc/server": "^1.13.4",
154
- "@orpc/zod": "^1.13.4",
127
+ "@module-federation/enhanced": "^2.4.0",
128
+ "@module-federation/node": "^2.7.42",
129
+ "@module-federation/runtime-core": "^2.4.0",
155
130
  "chalk": "^5.6.2",
156
131
  "defu": "^6.1.7",
157
132
  "effect": "^3.21.0",
158
133
  "every-plugin": "^2.5.9",
159
134
  "glob": "^13.0.6",
160
135
  "gradient-string": "^3.0.0",
161
- "hono": "^4.12.18",
162
136
  "ink": "^6.8.0",
163
137
  "tar": "^7.4.3"
164
138
  },
@@ -40,6 +40,7 @@ const OBSOLETE_FILES = [
40
40
  "ui/scripts/generate-metadata.ts",
41
41
  ".github/dependabot.yml",
42
42
  ".github/templates/dependabot.yml",
43
+ "packages/everything-dev/cli.js",
43
44
  ];
44
45
 
45
46
  interface NpmPackageInfo {
@@ -136,11 +137,13 @@ function updateRootCatalogVersion(
136
137
  const pkgPath = join(projectDir, "package.json");
137
138
  const pkg = JSON.parse(readFileSync(pkgPath, "utf-8")) as Record<string, unknown>;
138
139
 
139
- if (!pkg.workspaces || typeof pkg.workspaces !== "object") return false;
140
- const workspaces = pkg.workspaces as { catalog?: Record<string, string> };
141
- if (!workspaces.catalog || typeof workspaces.catalog !== "object") return false;
142
-
143
- if (!(packageName in workspaces.catalog)) return false;
140
+ if (!pkg.workspaces || typeof pkg.workspaces !== "object") {
141
+ pkg.workspaces = { packages: [], catalog: {} };
142
+ }
143
+ const workspaces = pkg.workspaces as { packages?: string[]; catalog?: Record<string, string> };
144
+ if (!workspaces.catalog || typeof workspaces.catalog !== "object") {
145
+ workspaces.catalog = {};
146
+ }
144
147
 
145
148
  const nextVersion = `^${newVersion}`;
146
149
  if (workspaces.catalog[packageName] === nextVersion) return false;
package/dist/api.cjs DELETED
@@ -1,124 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
3
- require('./sdk.cjs');
4
- const require_integrity = require('./integrity.cjs');
5
- const require_mf = require('./mf.cjs');
6
- let every_plugin = require("every-plugin");
7
-
8
- //#region src/api.ts
9
- async function loadApiPlugin(opts) {
10
- const remoteEntryUrl = (() => {
11
- if (opts.entry.endsWith("/remoteEntry.js")) return opts.entry;
12
- if (opts.entry.endsWith("/mf-manifest.json")) return `${opts.entry.replace(/\/mf-manifest\.json$/, "")}/remoteEntry.js`;
13
- if (opts.entry.endsWith(".js")) return opts.entry;
14
- return `${opts.entry.replace(/\/$/, "")}/remoteEntry.js`;
15
- })();
16
- if (opts.integrity) await require_integrity.verifySriForUrl(remoteEntryUrl, opts.integrity);
17
- await require_mf.ensureNodeRuntimePlugin();
18
- await require_mf.registerRemote({
19
- name: opts.runtimeId,
20
- entry: remoteEntryUrl
21
- });
22
- const plugin = await (0, every_plugin.createPluginRuntime)({
23
- registry: { [opts.runtimeId]: { remote: remoteEntryUrl } },
24
- secrets: opts.secrets ?? {}
25
- }).usePlugin(opts.runtimeId, {
26
- variables: opts.variables ?? {},
27
- secrets: opts.secrets ?? {}
28
- }, opts.plugins);
29
- return {
30
- key: opts.key,
31
- name: opts.name,
32
- router: plugin.router,
33
- createClient: plugin.createClient,
34
- metadata: {
35
- remoteUrl: remoteEntryUrl,
36
- version: plugin.metadata.version
37
- }
38
- };
39
- }
40
- function collectSecrets(config, envSecrets) {
41
- const secrets = {};
42
- for (const key of config.secrets ?? []) {
43
- const value = envSecrets?.[key] ?? process.env[key];
44
- if (value) secrets[key] = value;
45
- }
46
- return secrets;
47
- }
48
- async function loadApiPluginsFromRuntimeConfig(runtimeConfig, envSecrets) {
49
- const entries = [];
50
- if (runtimeConfig.api?.url) entries.push(["api", runtimeConfig.api]);
51
- for (const [key, plugin] of Object.entries(runtimeConfig.plugins ?? {})) if (plugin.url) entries.push([key, plugin]);
52
- if (entries.length === 0) {
53
- console.log("[API] No plugins configured");
54
- return {
55
- base: null,
56
- plugins: [],
57
- errors: []
58
- };
59
- }
60
- const pluginEntries = entries.filter(([key]) => key !== "api");
61
- const apiEntry = entries.find(([key]) => key === "api");
62
- const pluginResults = await Promise.allSettled(pluginEntries.map(async ([key, pluginConfig]) => {
63
- console.log(`[API] Loading plugin: ${pluginConfig.name} from ${pluginConfig.entry}`);
64
- return loadApiPlugin({
65
- key,
66
- runtimeId: pluginConfig.name,
67
- name: pluginConfig.name,
68
- entry: pluginConfig.entry,
69
- variables: pluginConfig.variables,
70
- secrets: collectSecrets(pluginConfig, envSecrets),
71
- integrity: pluginConfig.integrity
72
- });
73
- }));
74
- const plugins = [];
75
- const errors = [];
76
- const pluginsClient = {};
77
- pluginResults.forEach((result, index) => {
78
- const [key] = pluginEntries[index] ?? ["unknown"];
79
- if (result.status === "fulfilled") {
80
- plugins.push(result.value);
81
- pluginsClient[key] = result.value.createClient;
82
- } else errors.push({
83
- key,
84
- error: result.reason instanceof Error ? result.reason.message : String(result.reason)
85
- });
86
- });
87
- let base = null;
88
- if (apiEntry) {
89
- const [key, apiConfig] = apiEntry;
90
- try {
91
- console.log(`[API] Loading API plugin: ${apiConfig.name} from ${apiConfig.entry}`);
92
- base = await loadApiPlugin({
93
- key,
94
- runtimeId: apiConfig.name,
95
- name: apiConfig.name,
96
- entry: apiConfig.entry,
97
- variables: apiConfig.variables,
98
- secrets: collectSecrets(apiConfig, envSecrets),
99
- integrity: apiConfig.integrity,
100
- plugins: pluginsClient
101
- });
102
- } catch (error) {
103
- errors.push({
104
- key,
105
- error: error instanceof Error ? error.message : String(error)
106
- });
107
- }
108
- }
109
- return {
110
- base,
111
- plugins,
112
- errors
113
- };
114
- }
115
- function createStitchedRouter(baseRouter, plugins) {
116
- if (!plugins || plugins.length === 0) return baseRouter;
117
- return plugins.reduce((router, plugin) => Object.assign(router, plugin.router), baseRouter);
118
- }
119
-
120
- //#endregion
121
- exports.createStitchedRouter = createStitchedRouter;
122
- exports.loadApiPlugin = loadApiPlugin;
123
- exports.loadApiPluginsFromRuntimeConfig = loadApiPluginsFromRuntimeConfig;
124
- //# sourceMappingURL=api.cjs.map
package/dist/api.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.cjs","names":["verifySriForUrl","ensureNodeRuntimePlugin","registerRemote"],"sources":["../src/api.ts"],"sourcesContent":["import { verifySriForUrl } from \"./integrity\";\nimport { ensureNodeRuntimePlugin, registerRemote } from \"./mf\";\nimport { createPluginRuntime } from \"./sdk\";\nimport type { RuntimeConfig, RuntimePluginConfig } from \"./types\";\n\nexport interface LoadedPluginResult {\n key: string;\n name: string;\n router: any;\n createClient: (context?: unknown) => any;\n metadata: {\n remoteUrl: string;\n version?: string;\n };\n}\n\nexport interface LoadedPluginsResult {\n base: LoadedPluginResult | null;\n plugins: LoadedPluginResult[];\n errors: Array<{ key: string; error: string }>;\n}\n\nexport async function loadApiPlugin(opts: {\n key: string;\n runtimeId: string;\n name: string;\n entry: string;\n variables?: Record<string, string>;\n secrets?: Record<string, string>;\n integrity?: string;\n plugins?: Record<string, unknown>;\n}): Promise<LoadedPluginResult> {\n const remoteEntryUrl = (() => {\n if (opts.entry.endsWith(\"/remoteEntry.js\")) return opts.entry;\n if (opts.entry.endsWith(\"/mf-manifest.json\")) {\n return `${opts.entry.replace(/\\/mf-manifest\\.json$/, \"\")}/remoteEntry.js`;\n }\n if (opts.entry.endsWith(\".js\")) return opts.entry;\n return `${opts.entry.replace(/\\/$/, \"\")}/remoteEntry.js`;\n })();\n\n if (opts.integrity) {\n await verifySriForUrl(remoteEntryUrl, opts.integrity);\n }\n\n await ensureNodeRuntimePlugin();\n await registerRemote({ name: opts.runtimeId, entry: remoteEntryUrl });\n\n const runtime: any = createPluginRuntime({\n registry: {\n [opts.runtimeId]: { remote: remoteEntryUrl },\n },\n secrets: opts.secrets ?? {},\n });\n\n // biome-ignore lint/correctness/useHookAtTopLevel: usePlugin is not a React hook\n const plugin = await runtime.usePlugin(\n opts.runtimeId,\n {\n variables: opts.variables ?? {},\n secrets: opts.secrets ?? {},\n },\n opts.plugins,\n );\n\n return {\n key: opts.key,\n name: opts.name,\n router: plugin.router,\n createClient: plugin.createClient as (context?: unknown) => any,\n metadata: {\n remoteUrl: remoteEntryUrl,\n version: plugin.metadata.version,\n },\n };\n}\n\nfunction collectSecrets(config: RuntimePluginConfig, envSecrets?: Record<string, string>) {\n const secrets: Record<string, string> = {};\n for (const key of config.secrets ?? []) {\n const value = envSecrets?.[key] ?? process.env[key];\n if (value) {\n secrets[key] = value;\n }\n }\n return secrets;\n}\n\nexport async function loadApiPluginsFromRuntimeConfig(\n runtimeConfig: RuntimeConfig,\n envSecrets?: Record<string, string>,\n): Promise<LoadedPluginsResult> {\n const entries: Array<[string, RuntimePluginConfig]> = [];\n\n if (runtimeConfig.api?.url) {\n entries.push([\"api\", runtimeConfig.api]);\n }\n\n for (const [key, plugin] of Object.entries(runtimeConfig.plugins ?? {})) {\n if (plugin.url) {\n entries.push([key, plugin]);\n }\n }\n\n if (entries.length === 0) {\n console.log(\"[API] No plugins configured\");\n return { base: null, plugins: [], errors: [] };\n }\n\n // Phase 1: Load non-API plugins first\n const pluginEntries = entries.filter(([key]) => key !== \"api\");\n const apiEntry = entries.find(([key]) => key === \"api\");\n\n const pluginResults = await Promise.allSettled(\n pluginEntries.map(async ([key, pluginConfig]) => {\n console.log(`[API] Loading plugin: ${pluginConfig.name} from ${pluginConfig.entry}`);\n return loadApiPlugin({\n key,\n runtimeId: pluginConfig.name,\n name: pluginConfig.name,\n entry: pluginConfig.entry,\n variables: pluginConfig.variables,\n secrets: collectSecrets(pluginConfig, envSecrets),\n integrity: pluginConfig.integrity,\n });\n }),\n );\n\n const plugins: LoadedPluginResult[] = [];\n const errors: Array<{ key: string; error: string }> = [];\n\n const pluginsClient: Record<string, unknown> = {};\n\n pluginResults.forEach((result, index) => {\n const [key] = pluginEntries[index] ?? [\"unknown\"];\n if (result.status === \"fulfilled\") {\n plugins.push(result.value);\n pluginsClient[key] = result.value.createClient;\n } else {\n errors.push({\n key,\n error: result.reason instanceof Error ? result.reason.message : String(result.reason),\n });\n }\n });\n\n // Phase 2: Load API plugin with injected plugins client\n let base: LoadedPluginResult | null = null;\n\n if (apiEntry) {\n const [key, apiConfig] = apiEntry;\n try {\n console.log(`[API] Loading API plugin: ${apiConfig.name} from ${apiConfig.entry}`);\n base = await loadApiPlugin({\n key,\n runtimeId: apiConfig.name,\n name: apiConfig.name,\n entry: apiConfig.entry,\n variables: apiConfig.variables,\n secrets: collectSecrets(apiConfig, envSecrets),\n integrity: apiConfig.integrity,\n plugins: pluginsClient,\n });\n } catch (error) {\n errors.push({\n key,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return { base, plugins, errors };\n}\n\nexport function createStitchedRouter(baseRouter: any, plugins: LoadedPluginResult[] | null): any {\n if (!plugins || plugins.length === 0) {\n return baseRouter;\n }\n\n return plugins.reduce((router, plugin) => Object.assign(router, plugin.router), baseRouter);\n}\n"],"mappings":";;;;;;;;AAsBA,eAAsB,cAAc,MASJ;CAC9B,MAAM,wBAAwB;AAC5B,MAAI,KAAK,MAAM,SAAS,kBAAkB,CAAE,QAAO,KAAK;AACxD,MAAI,KAAK,MAAM,SAAS,oBAAoB,CAC1C,QAAO,GAAG,KAAK,MAAM,QAAQ,wBAAwB,GAAG,CAAC;AAE3D,MAAI,KAAK,MAAM,SAAS,MAAM,CAAE,QAAO,KAAK;AAC5C,SAAO,GAAG,KAAK,MAAM,QAAQ,OAAO,GAAG,CAAC;KACtC;AAEJ,KAAI,KAAK,UACP,OAAMA,kCAAgB,gBAAgB,KAAK,UAAU;AAGvD,OAAMC,oCAAyB;AAC/B,OAAMC,0BAAe;EAAE,MAAM,KAAK;EAAW,OAAO;EAAgB,CAAC;CAUrE,MAAM,SAAS,4CAR0B;EACvC,UAAU,GACP,KAAK,YAAY,EAAE,QAAQ,gBAAgB,EAC7C;EACD,SAAS,KAAK,WAAW,EAAE;EAC5B,CAAC,CAG2B,UAC3B,KAAK,WACL;EACE,WAAW,KAAK,aAAa,EAAE;EAC/B,SAAS,KAAK,WAAW,EAAE;EAC5B,EACD,KAAK,QACN;AAED,QAAO;EACL,KAAK,KAAK;EACV,MAAM,KAAK;EACX,QAAQ,OAAO;EACf,cAAc,OAAO;EACrB,UAAU;GACR,WAAW;GACX,SAAS,OAAO,SAAS;GAC1B;EACF;;AAGH,SAAS,eAAe,QAA6B,YAAqC;CACxF,MAAM,UAAkC,EAAE;AAC1C,MAAK,MAAM,OAAO,OAAO,WAAW,EAAE,EAAE;EACtC,MAAM,QAAQ,aAAa,QAAQ,QAAQ,IAAI;AAC/C,MAAI,MACF,SAAQ,OAAO;;AAGnB,QAAO;;AAGT,eAAsB,gCACpB,eACA,YAC8B;CAC9B,MAAM,UAAgD,EAAE;AAExD,KAAI,cAAc,KAAK,IACrB,SAAQ,KAAK,CAAC,OAAO,cAAc,IAAI,CAAC;AAG1C,MAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,cAAc,WAAW,EAAE,CAAC,CACrE,KAAI,OAAO,IACT,SAAQ,KAAK,CAAC,KAAK,OAAO,CAAC;AAI/B,KAAI,QAAQ,WAAW,GAAG;AACxB,UAAQ,IAAI,8BAA8B;AAC1C,SAAO;GAAE,MAAM;GAAM,SAAS,EAAE;GAAE,QAAQ,EAAE;GAAE;;CAIhD,MAAM,gBAAgB,QAAQ,QAAQ,CAAC,SAAS,QAAQ,MAAM;CAC9D,MAAM,WAAW,QAAQ,MAAM,CAAC,SAAS,QAAQ,MAAM;CAEvD,MAAM,gBAAgB,MAAM,QAAQ,WAClC,cAAc,IAAI,OAAO,CAAC,KAAK,kBAAkB;AAC/C,UAAQ,IAAI,yBAAyB,aAAa,KAAK,QAAQ,aAAa,QAAQ;AACpF,SAAO,cAAc;GACnB;GACA,WAAW,aAAa;GACxB,MAAM,aAAa;GACnB,OAAO,aAAa;GACpB,WAAW,aAAa;GACxB,SAAS,eAAe,cAAc,WAAW;GACjD,WAAW,aAAa;GACzB,CAAC;GACF,CACH;CAED,MAAM,UAAgC,EAAE;CACxC,MAAM,SAAgD,EAAE;CAExD,MAAM,gBAAyC,EAAE;AAEjD,eAAc,SAAS,QAAQ,UAAU;EACvC,MAAM,CAAC,OAAO,cAAc,UAAU,CAAC,UAAU;AACjD,MAAI,OAAO,WAAW,aAAa;AACjC,WAAQ,KAAK,OAAO,MAAM;AAC1B,iBAAc,OAAO,OAAO,MAAM;QAElC,QAAO,KAAK;GACV;GACA,OAAO,OAAO,kBAAkB,QAAQ,OAAO,OAAO,UAAU,OAAO,OAAO,OAAO;GACtF,CAAC;GAEJ;CAGF,IAAI,OAAkC;AAEtC,KAAI,UAAU;EACZ,MAAM,CAAC,KAAK,aAAa;AACzB,MAAI;AACF,WAAQ,IAAI,6BAA6B,UAAU,KAAK,QAAQ,UAAU,QAAQ;AAClF,UAAO,MAAM,cAAc;IACzB;IACA,WAAW,UAAU;IACrB,MAAM,UAAU;IAChB,OAAO,UAAU;IACjB,WAAW,UAAU;IACrB,SAAS,eAAe,WAAW,WAAW;IAC9C,WAAW,UAAU;IACrB,SAAS;IACV,CAAC;WACK,OAAO;AACd,UAAO,KAAK;IACV;IACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAC9D,CAAC;;;AAIN,QAAO;EAAE;EAAM;EAAS;EAAQ;;AAGlC,SAAgB,qBAAqB,YAAiB,SAA2C;AAC/F,KAAI,CAAC,WAAW,QAAQ,WAAW,EACjC,QAAO;AAGT,QAAO,QAAQ,QAAQ,QAAQ,WAAW,OAAO,OAAO,QAAQ,OAAO,OAAO,EAAE,WAAW"}
package/dist/api.d.cts DELETED
@@ -1,36 +0,0 @@
1
- import { RuntimeConfig } from "./types.cjs";
2
-
3
- //#region src/api.d.ts
4
- interface LoadedPluginResult {
5
- key: string;
6
- name: string;
7
- router: any;
8
- createClient: (context?: unknown) => any;
9
- metadata: {
10
- remoteUrl: string;
11
- version?: string;
12
- };
13
- }
14
- interface LoadedPluginsResult {
15
- base: LoadedPluginResult | null;
16
- plugins: LoadedPluginResult[];
17
- errors: Array<{
18
- key: string;
19
- error: string;
20
- }>;
21
- }
22
- declare function loadApiPlugin(opts: {
23
- key: string;
24
- runtimeId: string;
25
- name: string;
26
- entry: string;
27
- variables?: Record<string, string>;
28
- secrets?: Record<string, string>;
29
- integrity?: string;
30
- plugins?: Record<string, unknown>;
31
- }): Promise<LoadedPluginResult>;
32
- declare function loadApiPluginsFromRuntimeConfig(runtimeConfig: RuntimeConfig, envSecrets?: Record<string, string>): Promise<LoadedPluginsResult>;
33
- declare function createStitchedRouter(baseRouter: any, plugins: LoadedPluginResult[] | null): any;
34
- //#endregion
35
- export { LoadedPluginResult, LoadedPluginsResult, createStitchedRouter, loadApiPlugin, loadApiPluginsFromRuntimeConfig };
36
- //# sourceMappingURL=api.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.d.cts","names":[],"sources":["../src/api.ts"],"mappings":";;;UAKiB,kBAAA;EACf,GAAA;EACA,IAAA;EACA,MAAA;EACA,YAAA,GAAe,OAAA;EACf,QAAA;IACE,SAAA;IACA,OAAA;EAAA;AAAA;AAAA,UAIa,mBAAA;EACf,IAAA,EAAM,kBAAA;EACN,OAAA,EAAS,kBAAA;EACT,MAAA,EAAQ,KAAA;IAAQ,GAAA;IAAa,KAAA;EAAA;AAAA;AAAA,iBAGT,aAAA,CAAc,IAAA;EAClC,GAAA;EACA,SAAA;EACA,IAAA;EACA,KAAA;EACA,SAAA,GAAY,MAAA;EACZ,OAAA,GAAU,MAAA;EACV,SAAA;EACA,OAAA,GAAU,MAAA;AAAA,IACR,OAAA,CAAQ,kBAAA;AAAA,iBAyDU,+BAAA,CACpB,aAAA,EAAe,aAAA,EACf,UAAA,GAAa,MAAA,mBACZ,OAAA,CAAQ,mBAAA;AAAA,iBAmFK,oBAAA,CAAqB,UAAA,OAAiB,OAAA,EAAS,kBAAA"}
package/dist/api.d.mts DELETED
@@ -1,36 +0,0 @@
1
- import { RuntimeConfig } from "./types.mjs";
2
-
3
- //#region src/api.d.ts
4
- interface LoadedPluginResult {
5
- key: string;
6
- name: string;
7
- router: any;
8
- createClient: (context?: unknown) => any;
9
- metadata: {
10
- remoteUrl: string;
11
- version?: string;
12
- };
13
- }
14
- interface LoadedPluginsResult {
15
- base: LoadedPluginResult | null;
16
- plugins: LoadedPluginResult[];
17
- errors: Array<{
18
- key: string;
19
- error: string;
20
- }>;
21
- }
22
- declare function loadApiPlugin(opts: {
23
- key: string;
24
- runtimeId: string;
25
- name: string;
26
- entry: string;
27
- variables?: Record<string, string>;
28
- secrets?: Record<string, string>;
29
- integrity?: string;
30
- plugins?: Record<string, unknown>;
31
- }): Promise<LoadedPluginResult>;
32
- declare function loadApiPluginsFromRuntimeConfig(runtimeConfig: RuntimeConfig, envSecrets?: Record<string, string>): Promise<LoadedPluginsResult>;
33
- declare function createStitchedRouter(baseRouter: any, plugins: LoadedPluginResult[] | null): any;
34
- //#endregion
35
- export { LoadedPluginResult, LoadedPluginsResult, createStitchedRouter, loadApiPlugin, loadApiPluginsFromRuntimeConfig };
36
- //# sourceMappingURL=api.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.d.mts","names":[],"sources":["../src/api.ts"],"mappings":";;;UAKiB,kBAAA;EACf,GAAA;EACA,IAAA;EACA,MAAA;EACA,YAAA,GAAe,OAAA;EACf,QAAA;IACE,SAAA;IACA,OAAA;EAAA;AAAA;AAAA,UAIa,mBAAA;EACf,IAAA,EAAM,kBAAA;EACN,OAAA,EAAS,kBAAA;EACT,MAAA,EAAQ,KAAA;IAAQ,GAAA;IAAa,KAAA;EAAA;AAAA;AAAA,iBAGT,aAAA,CAAc,IAAA;EAClC,GAAA;EACA,SAAA;EACA,IAAA;EACA,KAAA;EACA,SAAA,GAAY,MAAA;EACZ,OAAA,GAAU,MAAA;EACV,SAAA;EACA,OAAA,GAAU,MAAA;AAAA,IACR,OAAA,CAAQ,kBAAA;AAAA,iBAyDU,+BAAA,CACpB,aAAA,EAAe,aAAA,EACf,UAAA,GAAa,MAAA,mBACZ,OAAA,CAAQ,mBAAA;AAAA,iBAmFK,oBAAA,CAAqB,UAAA,OAAiB,OAAA,EAAS,kBAAA"}
package/dist/api.mjs DELETED
@@ -1,119 +0,0 @@
1
- import { createPluginRuntime } from "./sdk.mjs";
2
- import { verifySriForUrl } from "./integrity.mjs";
3
- import { ensureNodeRuntimePlugin, registerRemote } from "./mf.mjs";
4
-
5
- //#region src/api.ts
6
- async function loadApiPlugin(opts) {
7
- const remoteEntryUrl = (() => {
8
- if (opts.entry.endsWith("/remoteEntry.js")) return opts.entry;
9
- if (opts.entry.endsWith("/mf-manifest.json")) return `${opts.entry.replace(/\/mf-manifest\.json$/, "")}/remoteEntry.js`;
10
- if (opts.entry.endsWith(".js")) return opts.entry;
11
- return `${opts.entry.replace(/\/$/, "")}/remoteEntry.js`;
12
- })();
13
- if (opts.integrity) await verifySriForUrl(remoteEntryUrl, opts.integrity);
14
- await ensureNodeRuntimePlugin();
15
- await registerRemote({
16
- name: opts.runtimeId,
17
- entry: remoteEntryUrl
18
- });
19
- const plugin = await createPluginRuntime({
20
- registry: { [opts.runtimeId]: { remote: remoteEntryUrl } },
21
- secrets: opts.secrets ?? {}
22
- }).usePlugin(opts.runtimeId, {
23
- variables: opts.variables ?? {},
24
- secrets: opts.secrets ?? {}
25
- }, opts.plugins);
26
- return {
27
- key: opts.key,
28
- name: opts.name,
29
- router: plugin.router,
30
- createClient: plugin.createClient,
31
- metadata: {
32
- remoteUrl: remoteEntryUrl,
33
- version: plugin.metadata.version
34
- }
35
- };
36
- }
37
- function collectSecrets(config, envSecrets) {
38
- const secrets = {};
39
- for (const key of config.secrets ?? []) {
40
- const value = envSecrets?.[key] ?? process.env[key];
41
- if (value) secrets[key] = value;
42
- }
43
- return secrets;
44
- }
45
- async function loadApiPluginsFromRuntimeConfig(runtimeConfig, envSecrets) {
46
- const entries = [];
47
- if (runtimeConfig.api?.url) entries.push(["api", runtimeConfig.api]);
48
- for (const [key, plugin] of Object.entries(runtimeConfig.plugins ?? {})) if (plugin.url) entries.push([key, plugin]);
49
- if (entries.length === 0) {
50
- console.log("[API] No plugins configured");
51
- return {
52
- base: null,
53
- plugins: [],
54
- errors: []
55
- };
56
- }
57
- const pluginEntries = entries.filter(([key]) => key !== "api");
58
- const apiEntry = entries.find(([key]) => key === "api");
59
- const pluginResults = await Promise.allSettled(pluginEntries.map(async ([key, pluginConfig]) => {
60
- console.log(`[API] Loading plugin: ${pluginConfig.name} from ${pluginConfig.entry}`);
61
- return loadApiPlugin({
62
- key,
63
- runtimeId: pluginConfig.name,
64
- name: pluginConfig.name,
65
- entry: pluginConfig.entry,
66
- variables: pluginConfig.variables,
67
- secrets: collectSecrets(pluginConfig, envSecrets),
68
- integrity: pluginConfig.integrity
69
- });
70
- }));
71
- const plugins = [];
72
- const errors = [];
73
- const pluginsClient = {};
74
- pluginResults.forEach((result, index) => {
75
- const [key] = pluginEntries[index] ?? ["unknown"];
76
- if (result.status === "fulfilled") {
77
- plugins.push(result.value);
78
- pluginsClient[key] = result.value.createClient;
79
- } else errors.push({
80
- key,
81
- error: result.reason instanceof Error ? result.reason.message : String(result.reason)
82
- });
83
- });
84
- let base = null;
85
- if (apiEntry) {
86
- const [key, apiConfig] = apiEntry;
87
- try {
88
- console.log(`[API] Loading API plugin: ${apiConfig.name} from ${apiConfig.entry}`);
89
- base = await loadApiPlugin({
90
- key,
91
- runtimeId: apiConfig.name,
92
- name: apiConfig.name,
93
- entry: apiConfig.entry,
94
- variables: apiConfig.variables,
95
- secrets: collectSecrets(apiConfig, envSecrets),
96
- integrity: apiConfig.integrity,
97
- plugins: pluginsClient
98
- });
99
- } catch (error) {
100
- errors.push({
101
- key,
102
- error: error instanceof Error ? error.message : String(error)
103
- });
104
- }
105
- }
106
- return {
107
- base,
108
- plugins,
109
- errors
110
- };
111
- }
112
- function createStitchedRouter(baseRouter, plugins) {
113
- if (!plugins || plugins.length === 0) return baseRouter;
114
- return plugins.reduce((router, plugin) => Object.assign(router, plugin.router), baseRouter);
115
- }
116
-
117
- //#endregion
118
- export { createStitchedRouter, loadApiPlugin, loadApiPluginsFromRuntimeConfig };
119
- //# sourceMappingURL=api.mjs.map
package/dist/api.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.mjs","names":[],"sources":["../src/api.ts"],"sourcesContent":["import { verifySriForUrl } from \"./integrity\";\nimport { ensureNodeRuntimePlugin, registerRemote } from \"./mf\";\nimport { createPluginRuntime } from \"./sdk\";\nimport type { RuntimeConfig, RuntimePluginConfig } from \"./types\";\n\nexport interface LoadedPluginResult {\n key: string;\n name: string;\n router: any;\n createClient: (context?: unknown) => any;\n metadata: {\n remoteUrl: string;\n version?: string;\n };\n}\n\nexport interface LoadedPluginsResult {\n base: LoadedPluginResult | null;\n plugins: LoadedPluginResult[];\n errors: Array<{ key: string; error: string }>;\n}\n\nexport async function loadApiPlugin(opts: {\n key: string;\n runtimeId: string;\n name: string;\n entry: string;\n variables?: Record<string, string>;\n secrets?: Record<string, string>;\n integrity?: string;\n plugins?: Record<string, unknown>;\n}): Promise<LoadedPluginResult> {\n const remoteEntryUrl = (() => {\n if (opts.entry.endsWith(\"/remoteEntry.js\")) return opts.entry;\n if (opts.entry.endsWith(\"/mf-manifest.json\")) {\n return `${opts.entry.replace(/\\/mf-manifest\\.json$/, \"\")}/remoteEntry.js`;\n }\n if (opts.entry.endsWith(\".js\")) return opts.entry;\n return `${opts.entry.replace(/\\/$/, \"\")}/remoteEntry.js`;\n })();\n\n if (opts.integrity) {\n await verifySriForUrl(remoteEntryUrl, opts.integrity);\n }\n\n await ensureNodeRuntimePlugin();\n await registerRemote({ name: opts.runtimeId, entry: remoteEntryUrl });\n\n const runtime: any = createPluginRuntime({\n registry: {\n [opts.runtimeId]: { remote: remoteEntryUrl },\n },\n secrets: opts.secrets ?? {},\n });\n\n // biome-ignore lint/correctness/useHookAtTopLevel: usePlugin is not a React hook\n const plugin = await runtime.usePlugin(\n opts.runtimeId,\n {\n variables: opts.variables ?? {},\n secrets: opts.secrets ?? {},\n },\n opts.plugins,\n );\n\n return {\n key: opts.key,\n name: opts.name,\n router: plugin.router,\n createClient: plugin.createClient as (context?: unknown) => any,\n metadata: {\n remoteUrl: remoteEntryUrl,\n version: plugin.metadata.version,\n },\n };\n}\n\nfunction collectSecrets(config: RuntimePluginConfig, envSecrets?: Record<string, string>) {\n const secrets: Record<string, string> = {};\n for (const key of config.secrets ?? []) {\n const value = envSecrets?.[key] ?? process.env[key];\n if (value) {\n secrets[key] = value;\n }\n }\n return secrets;\n}\n\nexport async function loadApiPluginsFromRuntimeConfig(\n runtimeConfig: RuntimeConfig,\n envSecrets?: Record<string, string>,\n): Promise<LoadedPluginsResult> {\n const entries: Array<[string, RuntimePluginConfig]> = [];\n\n if (runtimeConfig.api?.url) {\n entries.push([\"api\", runtimeConfig.api]);\n }\n\n for (const [key, plugin] of Object.entries(runtimeConfig.plugins ?? {})) {\n if (plugin.url) {\n entries.push([key, plugin]);\n }\n }\n\n if (entries.length === 0) {\n console.log(\"[API] No plugins configured\");\n return { base: null, plugins: [], errors: [] };\n }\n\n // Phase 1: Load non-API plugins first\n const pluginEntries = entries.filter(([key]) => key !== \"api\");\n const apiEntry = entries.find(([key]) => key === \"api\");\n\n const pluginResults = await Promise.allSettled(\n pluginEntries.map(async ([key, pluginConfig]) => {\n console.log(`[API] Loading plugin: ${pluginConfig.name} from ${pluginConfig.entry}`);\n return loadApiPlugin({\n key,\n runtimeId: pluginConfig.name,\n name: pluginConfig.name,\n entry: pluginConfig.entry,\n variables: pluginConfig.variables,\n secrets: collectSecrets(pluginConfig, envSecrets),\n integrity: pluginConfig.integrity,\n });\n }),\n );\n\n const plugins: LoadedPluginResult[] = [];\n const errors: Array<{ key: string; error: string }> = [];\n\n const pluginsClient: Record<string, unknown> = {};\n\n pluginResults.forEach((result, index) => {\n const [key] = pluginEntries[index] ?? [\"unknown\"];\n if (result.status === \"fulfilled\") {\n plugins.push(result.value);\n pluginsClient[key] = result.value.createClient;\n } else {\n errors.push({\n key,\n error: result.reason instanceof Error ? result.reason.message : String(result.reason),\n });\n }\n });\n\n // Phase 2: Load API plugin with injected plugins client\n let base: LoadedPluginResult | null = null;\n\n if (apiEntry) {\n const [key, apiConfig] = apiEntry;\n try {\n console.log(`[API] Loading API plugin: ${apiConfig.name} from ${apiConfig.entry}`);\n base = await loadApiPlugin({\n key,\n runtimeId: apiConfig.name,\n name: apiConfig.name,\n entry: apiConfig.entry,\n variables: apiConfig.variables,\n secrets: collectSecrets(apiConfig, envSecrets),\n integrity: apiConfig.integrity,\n plugins: pluginsClient,\n });\n } catch (error) {\n errors.push({\n key,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return { base, plugins, errors };\n}\n\nexport function createStitchedRouter(baseRouter: any, plugins: LoadedPluginResult[] | null): any {\n if (!plugins || plugins.length === 0) {\n return baseRouter;\n }\n\n return plugins.reduce((router, plugin) => Object.assign(router, plugin.router), baseRouter);\n}\n"],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- const require_integrity = require('./integrity.cjs');
2
- const require_mf = require('./mf.cjs');
3
-
4
- //#region src/federation.server.ts
5
- async function loadRouterModule(config) {
6
- const isLocalDev = config.ui.source === "local";
7
- const ssrUrl = config.ui.ssrUrl ?? (isLocalDev ? config.ui.url : void 0);
8
- if (!ssrUrl) {
9
- if (!isLocalDev) throw new Error("SSR URL not configured in production. Set app.ui.ssr in bos.config.json to enable SSR.");
10
- throw new Error("SSR URL not configured. In local dev, set app.ui.ssr or use a UI package with SSR support.");
11
- }
12
- const ssrEntryUrl = `${ssrUrl.replace(/\/$/, "")}/remoteEntry.server.js`;
13
- if (config.ui.ssrIntegrity) await require_integrity.verifySriForUrl(ssrEntryUrl, config.ui.ssrIntegrity);
14
- await require_mf.ensureNodeRuntimePlugin();
15
- await require_mf.registerRemote({
16
- name: config.ui.name,
17
- entry: ssrEntryUrl,
18
- type: "script"
19
- });
20
- const loadedModule = await require_mf.loadRemoteModule(`${config.ui.name}/Router`, { from: "build" });
21
- if (!loadedModule) throw new Error(`Module not found: ${config.ui.name}/Router`);
22
- return loadedModule.default;
23
- }
24
-
25
- //#endregion
26
- exports.loadRouterModule = loadRouterModule;
27
- //# sourceMappingURL=federation.server.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"federation.server.cjs","names":["verifySriForUrl","ensureNodeRuntimePlugin","registerRemote","loadRemoteModule"],"sources":["../src/federation.server.ts"],"sourcesContent":["import { verifySriForUrl } from \"./integrity\";\nimport { ensureNodeRuntimePlugin, loadRemoteModule, registerRemote } from \"./mf\";\nimport type { RuntimeConfig } from \"./types\";\nimport type { RouterModule } from \"./ui/types\";\n\nexport type { RouterModule };\n\nexport async function loadRouterModule(config: RuntimeConfig): Promise<RouterModule> {\n const isLocalDev = config.ui.source === \"local\";\n const ssrUrl = config.ui.ssrUrl ?? (isLocalDev ? config.ui.url : undefined);\n\n if (!ssrUrl) {\n if (!isLocalDev) {\n throw new Error(\n \"SSR URL not configured in production. Set app.ui.ssr in bos.config.json to enable SSR.\",\n );\n }\n\n throw new Error(\n \"SSR URL not configured. In local dev, set app.ui.ssr or use a UI package with SSR support.\",\n );\n }\n\n const ssrEntryUrl = `${ssrUrl.replace(/\\/$/, \"\")}/remoteEntry.server.js`;\n\n if (config.ui.ssrIntegrity) {\n await verifySriForUrl(ssrEntryUrl, config.ui.ssrIntegrity);\n }\n\n await ensureNodeRuntimePlugin();\n await registerRemote({\n name: config.ui.name,\n entry: ssrEntryUrl,\n type: \"script\",\n });\n\n const loadedModule = await loadRemoteModule<any>(`${config.ui.name}/Router`, { from: \"build\" });\n if (!loadedModule) {\n throw new Error(`Module not found: ${config.ui.name}/Router`);\n }\n\n return loadedModule.default as RouterModule;\n}\n"],"mappings":";;;;AAOA,eAAsB,iBAAiB,QAA8C;CACnF,MAAM,aAAa,OAAO,GAAG,WAAW;CACxC,MAAM,SAAS,OAAO,GAAG,WAAW,aAAa,OAAO,GAAG,MAAM;AAEjE,KAAI,CAAC,QAAQ;AACX,MAAI,CAAC,WACH,OAAM,IAAI,MACR,yFACD;AAGH,QAAM,IAAI,MACR,6FACD;;CAGH,MAAM,cAAc,GAAG,OAAO,QAAQ,OAAO,GAAG,CAAC;AAEjD,KAAI,OAAO,GAAG,aACZ,OAAMA,kCAAgB,aAAa,OAAO,GAAG,aAAa;AAG5D,OAAMC,oCAAyB;AAC/B,OAAMC,0BAAe;EACnB,MAAM,OAAO,GAAG;EAChB,OAAO;EACP,MAAM;EACP,CAAC;CAEF,MAAM,eAAe,MAAMC,4BAAsB,GAAG,OAAO,GAAG,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/F,KAAI,CAAC,aACH,OAAM,IAAI,MAAM,qBAAqB,OAAO,GAAG,KAAK,SAAS;AAG/D,QAAO,aAAa"}
@@ -1,27 +0,0 @@
1
- import { verifySriForUrl } from "./integrity.mjs";
2
- import { ensureNodeRuntimePlugin, loadRemoteModule, registerRemote } from "./mf.mjs";
3
-
4
- //#region src/federation.server.ts
5
- async function loadRouterModule(config) {
6
- const isLocalDev = config.ui.source === "local";
7
- const ssrUrl = config.ui.ssrUrl ?? (isLocalDev ? config.ui.url : void 0);
8
- if (!ssrUrl) {
9
- if (!isLocalDev) throw new Error("SSR URL not configured in production. Set app.ui.ssr in bos.config.json to enable SSR.");
10
- throw new Error("SSR URL not configured. In local dev, set app.ui.ssr or use a UI package with SSR support.");
11
- }
12
- const ssrEntryUrl = `${ssrUrl.replace(/\/$/, "")}/remoteEntry.server.js`;
13
- if (config.ui.ssrIntegrity) await verifySriForUrl(ssrEntryUrl, config.ui.ssrIntegrity);
14
- await ensureNodeRuntimePlugin();
15
- await registerRemote({
16
- name: config.ui.name,
17
- entry: ssrEntryUrl,
18
- type: "script"
19
- });
20
- const loadedModule = await loadRemoteModule(`${config.ui.name}/Router`, { from: "build" });
21
- if (!loadedModule) throw new Error(`Module not found: ${config.ui.name}/Router`);
22
- return loadedModule.default;
23
- }
24
-
25
- //#endregion
26
- export { loadRouterModule };
27
- //# sourceMappingURL=federation.server.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"federation.server.mjs","names":[],"sources":["../src/federation.server.ts"],"sourcesContent":["import { verifySriForUrl } from \"./integrity\";\nimport { ensureNodeRuntimePlugin, loadRemoteModule, registerRemote } from \"./mf\";\nimport type { RuntimeConfig } from \"./types\";\nimport type { RouterModule } from \"./ui/types\";\n\nexport type { RouterModule };\n\nexport async function loadRouterModule(config: RuntimeConfig): Promise<RouterModule> {\n const isLocalDev = config.ui.source === \"local\";\n const ssrUrl = config.ui.ssrUrl ?? (isLocalDev ? config.ui.url : undefined);\n\n if (!ssrUrl) {\n if (!isLocalDev) {\n throw new Error(\n \"SSR URL not configured in production. Set app.ui.ssr in bos.config.json to enable SSR.\",\n );\n }\n\n throw new Error(\n \"SSR URL not configured. In local dev, set app.ui.ssr or use a UI package with SSR support.\",\n );\n }\n\n const ssrEntryUrl = `${ssrUrl.replace(/\\/$/, \"\")}/remoteEntry.server.js`;\n\n if (config.ui.ssrIntegrity) {\n await verifySriForUrl(ssrEntryUrl, config.ui.ssrIntegrity);\n }\n\n await ensureNodeRuntimePlugin();\n await registerRemote({\n name: config.ui.name,\n entry: ssrEntryUrl,\n type: \"script\",\n });\n\n const loadedModule = await loadRemoteModule<any>(`${config.ui.name}/Router`, { from: \"build\" });\n if (!loadedModule) {\n throw new Error(`Module not found: ${config.ui.name}/Router`);\n }\n\n return loadedModule.default as RouterModule;\n}\n"],"mappings":";;;;AAOA,eAAsB,iBAAiB,QAA8C;CACnF,MAAM,aAAa,OAAO,GAAG,WAAW;CACxC,MAAM,SAAS,OAAO,GAAG,WAAW,aAAa,OAAO,GAAG,MAAM;AAEjE,KAAI,CAAC,QAAQ;AACX,MAAI,CAAC,WACH,OAAM,IAAI,MACR,yFACD;AAGH,QAAM,IAAI,MACR,6FACD;;CAGH,MAAM,cAAc,GAAG,OAAO,QAAQ,OAAO,GAAG,CAAC;AAEjD,KAAI,OAAO,GAAG,aACZ,OAAM,gBAAgB,aAAa,OAAO,GAAG,aAAa;AAG5D,OAAM,yBAAyB;AAC/B,OAAM,eAAe;EACnB,MAAM,OAAO,GAAG;EAChB,OAAO;EACP,MAAM;EACP,CAAC;CAEF,MAAM,eAAe,MAAM,iBAAsB,GAAG,OAAO,GAAG,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/F,KAAI,CAAC,aACH,OAAM,IAAI,MAAM,qBAAqB,OAAO,GAAG,KAAK,SAAS;AAG/D,QAAO,aAAa"}