everything-dev 1.14.0 → 1.14.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/upgrade.cjs +2 -1
- package/dist/cli/upgrade.cjs.map +1 -1
- package/dist/cli/upgrade.mjs +2 -1
- package/dist/cli/upgrade.mjs.map +1 -1
- package/dist/contract.d.cts +31 -31
- package/dist/contract.d.mts +31 -31
- package/dist/orchestrator.cjs +0 -1
- package/dist/orchestrator.cjs.map +1 -1
- package/dist/plugin.cjs +39 -44
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +31 -31
- package/dist/plugin.d.mts +31 -31
- package/dist/plugin.mjs +39 -44
- package/dist/plugin.mjs.map +1 -1
- package/dist/shared.cjs +0 -10
- package/dist/shared.cjs.map +1 -1
- package/dist/shared.mjs +1 -9
- package/dist/shared.mjs.map +1 -1
- package/package.json +4 -30
- package/src/cli/upgrade.ts +1 -0
- package/src/plugin.ts +57 -49
- package/dist/api.cjs +0 -124
- package/dist/api.cjs.map +0 -1
- package/dist/api.d.cts +0 -36
- package/dist/api.d.cts.map +0 -1
- package/dist/api.d.mts +0 -36
- package/dist/api.d.mts.map +0 -1
- package/dist/api.mjs +0 -119
- package/dist/api.mjs.map +0 -1
- package/dist/federation.server.cjs +0 -27
- package/dist/federation.server.cjs.map +0 -1
- package/dist/federation.server.mjs +0 -27
- package/dist/federation.server.mjs.map +0 -1
- package/dist/host.cjs +0 -402
- package/dist/host.cjs.map +0 -1
- package/dist/host.d.cts +0 -22
- package/dist/host.d.cts.map +0 -1
- package/dist/host.d.mts +0 -22
- package/dist/host.d.mts.map +0 -1
- package/dist/host.mjs +0 -399
- package/dist/host.mjs.map +0 -1
- package/dist/orchestrator.d.cts +0 -44
- package/dist/orchestrator.d.cts.map +0 -1
- package/dist/orchestrator.d.mts +0 -44
- package/dist/orchestrator.d.mts.map +0 -1
- package/dist/service-descriptor.d.cts +0 -137
- package/dist/service-descriptor.d.cts.map +0 -1
- package/dist/service-descriptor.d.mts +0 -137
- package/dist/service-descriptor.d.mts.map +0 -1
- package/dist/shared.d.cts +0 -36
- package/dist/shared.d.cts.map +0 -1
- package/dist/shared.d.mts +0 -36
- package/dist/shared.d.mts.map +0 -1
- package/src/api.ts +0 -181
- package/src/federation.server.ts +0 -43
- package/src/host.ts +0 -573
package/src/cli/upgrade.ts
CHANGED
package/src/plugin.ts
CHANGED
|
@@ -243,20 +243,41 @@ function listPluginAttachments(config: BosConfig | null) {
|
|
|
243
243
|
.sort((a, b) => a.key.localeCompare(b.key));
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
-
|
|
246
|
+
interface GeneratedArtifacts {
|
|
247
|
+
sidebarPath: string;
|
|
248
|
+
resolvedConfigPath?: string;
|
|
249
|
+
contractBridgePath: string;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
async function generateCodeArtifacts(
|
|
247
253
|
configDir: string,
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
254
|
+
config: BosConfig,
|
|
255
|
+
opts?: {
|
|
256
|
+
env?: BosEnv;
|
|
257
|
+
extendsChain?: string[];
|
|
258
|
+
runtimeConfig?: RuntimeConfig;
|
|
259
|
+
},
|
|
260
|
+
): Promise<GeneratedArtifacts | null> {
|
|
261
|
+
writePluginSidebarGen(configDir, config);
|
|
262
|
+
|
|
263
|
+
if (opts?.env) {
|
|
264
|
+
writeResolvedConfig(configDir, config, opts.env, opts.extendsChain);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const runtimeConfig = opts?.runtimeConfig ?? (await loadConfig({ cwd: configDir }))?.runtime;
|
|
268
|
+
if (!runtimeConfig) return null;
|
|
252
269
|
|
|
253
|
-
await syncApiContractBridge({
|
|
270
|
+
const bridge = await syncApiContractBridge({
|
|
254
271
|
configDir,
|
|
255
|
-
runtimeConfig
|
|
256
|
-
apiBaseUrl:
|
|
272
|
+
runtimeConfig,
|
|
273
|
+
apiBaseUrl: runtimeConfig.api.url,
|
|
257
274
|
});
|
|
258
275
|
|
|
259
|
-
|
|
276
|
+
return {
|
|
277
|
+
sidebarPath: join(configDir, "ui/src/lib/plugin-sidebar.gen.ts"),
|
|
278
|
+
resolvedConfigPath: opts?.env ? join(configDir, ".bos/bos.resolved-config.json") : undefined,
|
|
279
|
+
contractBridgePath: bridge.bridgePath,
|
|
280
|
+
};
|
|
260
281
|
}
|
|
261
282
|
|
|
262
283
|
function extractPublishedUrl(output: string): string | null {
|
|
@@ -512,7 +533,7 @@ export default createPlugin({
|
|
|
512
533
|
};
|
|
513
534
|
|
|
514
535
|
await saveBosConfig(deps.configDir, deps.bosConfig);
|
|
515
|
-
await
|
|
536
|
+
await generateCodeArtifacts(deps.configDir, deps.bosConfig);
|
|
516
537
|
|
|
517
538
|
const stored = deps.bosConfig.plugins?.[key];
|
|
518
539
|
const storedObj = stored && typeof stored === "object" ? stored : {};
|
|
@@ -552,7 +573,7 @@ export default createPlugin({
|
|
|
552
573
|
};
|
|
553
574
|
|
|
554
575
|
await saveBosConfig(deps.configDir, deps.bosConfig);
|
|
555
|
-
await
|
|
576
|
+
await generateCodeArtifacts(deps.configDir, deps.bosConfig);
|
|
556
577
|
|
|
557
578
|
return {
|
|
558
579
|
status: "removed" as const,
|
|
@@ -749,7 +770,7 @@ export default createPlugin({
|
|
|
749
770
|
}
|
|
750
771
|
}
|
|
751
772
|
|
|
752
|
-
await
|
|
773
|
+
await generateCodeArtifacts(deps.configDir, deps.bosConfig);
|
|
753
774
|
}
|
|
754
775
|
|
|
755
776
|
return {
|
|
@@ -808,16 +829,6 @@ export default createPlugin({
|
|
|
808
829
|
deps.bosConfig = refreshed?.config ?? deps.bosConfig;
|
|
809
830
|
deps.runtimeConfig = refreshed?.runtime ?? deps.runtimeConfig;
|
|
810
831
|
|
|
811
|
-
if (deps.bosConfig) {
|
|
812
|
-
writeResolvedConfig(
|
|
813
|
-
deps.configDir,
|
|
814
|
-
deps.bosConfig,
|
|
815
|
-
"development",
|
|
816
|
-
refreshed?.source.extended,
|
|
817
|
-
);
|
|
818
|
-
writePluginSidebarGen(deps.configDir, deps.bosConfig);
|
|
819
|
-
}
|
|
820
|
-
|
|
821
832
|
if (!deps.bosConfig) {
|
|
822
833
|
return {
|
|
823
834
|
status: "error" as const,
|
|
@@ -848,6 +859,12 @@ export default createPlugin({
|
|
|
848
859
|
ssr,
|
|
849
860
|
});
|
|
850
861
|
|
|
862
|
+
await generateCodeArtifacts(deps.configDir, deps.bosConfig, {
|
|
863
|
+
env: "development",
|
|
864
|
+
extendsChain: refreshed?.source.extended,
|
|
865
|
+
runtimeConfig,
|
|
866
|
+
});
|
|
867
|
+
|
|
851
868
|
const services = buildServiceDescriptorMap(runtimeConfig, { ssr, proxy });
|
|
852
869
|
const packages = [...services.keys()];
|
|
853
870
|
const displayEnv: Record<string, string> = {};
|
|
@@ -857,12 +874,6 @@ export default createPlugin({
|
|
|
857
874
|
if (proxyUrl) displayEnv.API_PROXY = proxyUrl;
|
|
858
875
|
}
|
|
859
876
|
|
|
860
|
-
await syncApiContractBridge({
|
|
861
|
-
configDir: deps.configDir,
|
|
862
|
-
runtimeConfig: runtimeConfig,
|
|
863
|
-
apiBaseUrl: runtimeConfig.api.url,
|
|
864
|
-
});
|
|
865
|
-
|
|
866
877
|
const orchestrator: AppOrchestrator = {
|
|
867
878
|
packages,
|
|
868
879
|
env: displayEnv,
|
|
@@ -937,7 +948,10 @@ export default createPlugin({
|
|
|
937
948
|
plugins: runtimePlugins,
|
|
938
949
|
});
|
|
939
950
|
|
|
940
|
-
|
|
951
|
+
await generateCodeArtifacts(deps.configDir, config, {
|
|
952
|
+
env: "production",
|
|
953
|
+
runtimeConfig,
|
|
954
|
+
});
|
|
941
955
|
|
|
942
956
|
// ── Production Readiness Validation ──
|
|
943
957
|
const productionEnv: Record<string, string> = {};
|
|
@@ -979,12 +993,6 @@ export default createPlugin({
|
|
|
979
993
|
|
|
980
994
|
const services = buildServiceDescriptorMap(runtimeConfig);
|
|
981
995
|
|
|
982
|
-
await syncApiContractBridge({
|
|
983
|
-
configDir: deps.configDir,
|
|
984
|
-
runtimeConfig: runtimeConfig,
|
|
985
|
-
apiBaseUrl: runtimeConfig.api.url,
|
|
986
|
-
});
|
|
987
|
-
|
|
988
996
|
const stagingEnvVars: Record<string, string> = isStaging
|
|
989
997
|
? { BOS_GATEWAY: config.staging?.domain ?? config.domain ?? "" }
|
|
990
998
|
: {};
|
|
@@ -1052,9 +1060,6 @@ export default createPlugin({
|
|
|
1052
1060
|
|
|
1053
1061
|
const buildEnv: BosEnv = input.deploy ? "production" : "development";
|
|
1054
1062
|
|
|
1055
|
-
writeResolvedConfig(deps.configDir, deps.bosConfig, buildEnv);
|
|
1056
|
-
writePluginSidebarGen(deps.configDir, deps.bosConfig);
|
|
1057
|
-
|
|
1058
1063
|
const targets = selectWorkspaceTargets(input.packages, deps.bosConfig);
|
|
1059
1064
|
if (targets.length === 0) {
|
|
1060
1065
|
return {
|
|
@@ -1073,10 +1078,9 @@ export default createPlugin({
|
|
|
1073
1078
|
plugins: deps.runtimeConfig?.plugins,
|
|
1074
1079
|
});
|
|
1075
1080
|
|
|
1076
|
-
await
|
|
1077
|
-
|
|
1081
|
+
await generateCodeArtifacts(deps.configDir, deps.bosConfig, {
|
|
1082
|
+
env: buildEnv,
|
|
1078
1083
|
runtimeConfig,
|
|
1079
|
-
apiBaseUrl: runtimeConfig.api.url,
|
|
1080
1084
|
});
|
|
1081
1085
|
|
|
1082
1086
|
const { built, skipped } = await buildWorkspaceTargets({
|
|
@@ -1141,6 +1145,11 @@ export default createPlugin({
|
|
|
1141
1145
|
}
|
|
1142
1146
|
|
|
1143
1147
|
if (input.deploy) {
|
|
1148
|
+
await generateCodeArtifacts(deps.configDir, deps.bosConfig, {
|
|
1149
|
+
env: "production",
|
|
1150
|
+
runtimeConfig: deps.runtimeConfig ?? undefined,
|
|
1151
|
+
});
|
|
1152
|
+
|
|
1144
1153
|
const result = await buildWorkspaceTargets({
|
|
1145
1154
|
configDir: deps.configDir,
|
|
1146
1155
|
bosConfig: deps.bosConfig,
|
|
@@ -1423,7 +1432,7 @@ export default createPlugin({
|
|
|
1423
1432
|
|
|
1424
1433
|
const initConfig = await loadConfig({ cwd: directory });
|
|
1425
1434
|
if (initConfig?.config) {
|
|
1426
|
-
|
|
1435
|
+
await generateCodeArtifacts(directory, initConfig.config);
|
|
1427
1436
|
}
|
|
1428
1437
|
|
|
1429
1438
|
s.stop("Project initialized");
|
|
@@ -1480,7 +1489,7 @@ export default createPlugin({
|
|
|
1480
1489
|
if (result.status === "synced" || result.status === "dry-run") {
|
|
1481
1490
|
const syncedConfig = await loadConfig({ cwd: projectDir });
|
|
1482
1491
|
if (syncedConfig?.config) {
|
|
1483
|
-
|
|
1492
|
+
await generateCodeArtifacts(projectDir, syncedConfig.config);
|
|
1484
1493
|
}
|
|
1485
1494
|
}
|
|
1486
1495
|
|
|
@@ -1595,13 +1604,12 @@ export default createPlugin({
|
|
|
1595
1604
|
};
|
|
1596
1605
|
}
|
|
1597
1606
|
|
|
1598
|
-
|
|
1599
|
-
configDir: projectDir,
|
|
1607
|
+
await generateCodeArtifacts(projectDir, refreshed.config, {
|
|
1600
1608
|
runtimeConfig: refreshed.runtime,
|
|
1601
|
-
apiBaseUrl: refreshed.runtime.api.url,
|
|
1602
1609
|
});
|
|
1603
1610
|
|
|
1604
1611
|
const generated = [
|
|
1612
|
+
"ui/src/lib/plugin-sidebar.gen.ts",
|
|
1605
1613
|
"ui/src/lib/api-types.gen.ts",
|
|
1606
1614
|
"api/src/lib/plugins-types.gen.ts",
|
|
1607
1615
|
"api/src/lib/auth-types.gen.ts",
|
|
@@ -1619,10 +1627,10 @@ export default createPlugin({
|
|
|
1619
1627
|
return {
|
|
1620
1628
|
status: "success" as const,
|
|
1621
1629
|
generated,
|
|
1622
|
-
fetched:
|
|
1623
|
-
skipped:
|
|
1630
|
+
fetched: refreshed.runtime.api.source === "remote" ? [refreshed.runtime.api.url] : [],
|
|
1631
|
+
skipped: refreshed.runtime.api.source === "local" ? ["api (local)"] : [],
|
|
1624
1632
|
failed: [],
|
|
1625
|
-
source:
|
|
1633
|
+
source: refreshed.runtime.api.source,
|
|
1626
1634
|
};
|
|
1627
1635
|
} catch (error) {
|
|
1628
1636
|
return {
|
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":"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"}
|
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
|
package/dist/api.d.cts.map
DELETED
|
@@ -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
|
package/dist/api.d.mts.map
DELETED
|
@@ -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"}
|