everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
203 lines (201 loc) • 6.95 kB
JavaScript
import { Context, Layer } from "effect";
//#region src/service-descriptor.ts
var ServiceDescriptorMap = class extends Context.Tag("ServiceDescriptorMap")() {};
var DevRuntimeConfig = class extends Context.Tag("DevRuntimeConfig")() {};
const PLUGIN_READY_PATTERNS = [
/ready in/i,
/compiled.*successfully/i,
/listening/i,
/started/i
];
const PLUGIN_ERROR_PATTERNS = [/error/i, /failed/i];
const SERVICE_CONFIGS = {
host: {
command: "bun",
args: ["run", "dev"],
readyPatterns: [/Host (dev|production) server running at/i, /Server running at/i],
errorPatterns: [
/error:/i,
/failed/i,
/exception/i
],
defaultPort: 3e3,
readinessPath: "/health"
},
auth: {
command: "bun",
args: ["run", "dev"],
readyPatterns: PLUGIN_READY_PATTERNS,
errorPatterns: PLUGIN_ERROR_PATTERNS,
defaultPort: 3002,
readinessPath: "/remoteEntry.js"
},
ui: {
command: "bun",
args: ["run", "dev"],
readyPatterns: [
/\bready\s+built in\b/i,
/\bLocal:\b/i,
/\bcompiled\b.*successfully/i
],
errorPatterns: [/error/i, /failed to compile/i],
defaultPort: 3003,
readinessPath: "/remoteEntry.js"
},
"ui-ssr": {
command: "bun",
args: ["run", "dev:ssr"],
readyPatterns: [/\bready\s+built in\b/i, /\bcompiled\b.*successfully/i],
errorPatterns: [/error/i, /failed/i],
defaultPort: 3004,
readinessPath: "/"
},
api: {
command: "bun",
args: ["run", "dev"],
readyPatterns: PLUGIN_READY_PATTERNS,
errorPatterns: PLUGIN_ERROR_PATTERNS,
defaultPort: 3001,
readinessPath: "/remoteEntry.js"
}
};
function buildServiceDescriptorMap(runtimeConfig, options) {
const map = /* @__PURE__ */ new Map();
const ssr = options?.ssr ?? false;
const hostIsRemote = runtimeConfig.host.source === "remote";
const hostProbeUrl = hostIsRemote ? runtimeConfig.host.remoteUrl ?? runtimeConfig.host.url : runtimeConfig.host.url;
map.set("host", {
key: "host",
source: runtimeConfig.host.source,
url: hostProbeUrl,
remoteUrl: runtimeConfig.host.remoteUrl,
entry: hostIsRemote ? hostProbeUrl ? `${hostProbeUrl}/mf-manifest.json` : "/mf-manifest.json" : runtimeConfig.host.entry,
name: runtimeConfig.host.name,
localPath: runtimeConfig.host.localPath,
port: runtimeConfig.host.port,
integrity: runtimeConfig.host.integrity,
secrets: runtimeConfig.host.secrets,
...SERVICE_CONFIGS.host
});
map.set("ui", {
key: "ui",
source: runtimeConfig.ui.source,
url: runtimeConfig.ui.url,
remoteUrl: runtimeConfig.ui.source === "remote" ? runtimeConfig.ui.url : void 0,
entry: runtimeConfig.ui.entry,
name: runtimeConfig.ui.name,
localPath: runtimeConfig.ui.localPath,
port: runtimeConfig.ui.port,
integrity: runtimeConfig.ui.integrity,
ssr,
...SERVICE_CONFIGS.ui
});
if (ssr && runtimeConfig.ui.source === "local") map.set("ui-ssr", {
key: "ui-ssr",
source: runtimeConfig.ui.source,
url: runtimeConfig.ui.ssrUrl ?? "",
entry: "",
name: "ui-ssr",
localPath: runtimeConfig.ui.localPath,
port: runtimeConfig.ui.ssrUrl ? Number.parseInt(new URL(runtimeConfig.ui.ssrUrl).port, 10) : (runtimeConfig.ui.port ?? 3003) + 1,
...SERVICE_CONFIGS["ui-ssr"]
});
map.set("api", {
key: "api",
source: runtimeConfig.api.source,
url: runtimeConfig.api.url,
remoteUrl: runtimeConfig.api.source === "remote" ? runtimeConfig.api.url : void 0,
entry: runtimeConfig.api.entry,
name: runtimeConfig.api.name,
localPath: runtimeConfig.api.localPath,
port: runtimeConfig.api.port,
integrity: runtimeConfig.api.integrity,
proxy: runtimeConfig.api.proxy,
variables: runtimeConfig.api.variables,
secrets: runtimeConfig.api.secrets,
...SERVICE_CONFIGS.api
});
if (runtimeConfig.auth) map.set("auth", {
key: "auth",
source: runtimeConfig.auth.source,
url: runtimeConfig.auth.url,
remoteUrl: runtimeConfig.auth.source === "remote" ? runtimeConfig.auth.url : void 0,
entry: runtimeConfig.auth.entry,
name: runtimeConfig.auth.name,
localPath: runtimeConfig.auth.localPath,
port: runtimeConfig.auth.port,
integrity: runtimeConfig.auth.integrity,
proxy: runtimeConfig.auth.proxy,
variables: runtimeConfig.auth.variables,
secrets: runtimeConfig.auth.secrets,
...SERVICE_CONFIGS.auth
});
if (runtimeConfig.plugins) {
let pluginBasePort = 3010;
for (const [pluginId, pluginConfig] of Object.entries(runtimeConfig.plugins)) {
const pluginKey = `plugin:${pluginId}`;
const resolvedPort = pluginConfig.port ?? pluginBasePort;
pluginBasePort = resolvedPort + 1;
map.set(pluginKey, {
key: pluginKey,
source: pluginConfig.source,
url: pluginConfig.url,
remoteUrl: pluginConfig.source === "remote" ? pluginConfig.url : void 0,
entry: pluginConfig.entry,
name: pluginConfig.name,
localPath: pluginConfig.localPath,
port: resolvedPort,
integrity: pluginConfig.integrity,
proxy: pluginConfig.proxy,
variables: pluginConfig.variables,
secrets: pluginConfig.secrets,
command: "bun",
args: ["run", "dev"],
readyPatterns: PLUGIN_READY_PATTERNS,
errorPatterns: PLUGIN_ERROR_PATTERNS,
defaultPort: resolvedPort,
readinessPath: "/remoteEntry.js"
});
if (pluginConfig.ui?.localPath && pluginConfig.ui.source === "local") {
const uiKey = `plugin-ui:${pluginId}`;
const uiPort = pluginConfig.ui.port ?? pluginBasePort;
pluginBasePort = uiPort + 1;
map.set(uiKey, {
key: uiKey,
source: pluginConfig.ui.source,
url: pluginConfig.ui.url,
entry: pluginConfig.ui.entry,
name: pluginConfig.ui.name,
localPath: pluginConfig.ui.localPath,
port: uiPort,
integrity: pluginConfig.ui.integrity,
command: "bun",
args: ["run", "dev"],
readyPatterns: PLUGIN_READY_PATTERNS,
errorPatterns: PLUGIN_ERROR_PATTERNS,
defaultPort: uiPort,
readinessPath: "/remoteEntry.js"
});
}
}
}
return map;
}
const ServiceDescriptorMapLive = (map) => Layer.succeed(ServiceDescriptorMap, map);
const DevRuntimeConfigLive = (config) => Layer.succeed(DevRuntimeConfig, config);
function buildDescription(map) {
const descriptors = [...map.values()].filter((d) => d.key !== "ui-ssr" && !d.key.startsWith("plugin:"));
const allLocal = descriptors.every((d) => d.source === "local");
const hasProxy = [...map.values()].some((d) => d.proxy && d.source === "local");
if (allLocal && !hasProxy) return "Full Local Development";
const parts = [];
for (const d of descriptors) if (d.source === "remote") {
const label = d.key === "host" ? "Remote Host" : d.key === "ui" ? "Remote UI" : d.key === "api" ? hasProxy ? void 0 : "Remote API" : d.key === "auth" ? "Remote Auth" : void 0;
if (label) parts.push(label);
}
if (hasProxy) parts.push("Proxy API → Production");
return parts.join(" + ") || "Remote Mode";
}
//#endregion
export { DevRuntimeConfig, DevRuntimeConfigLive, ServiceDescriptorMap, ServiceDescriptorMapLive, buildDescription, buildServiceDescriptorMap };
//# sourceMappingURL=service-descriptor.mjs.map