every-plugin 0.5.0 → 0.5.1
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/{chunk-zltIcp7o.cjs → _virtual/rolldown_runtime.cjs} +3 -18
- package/dist/{chunk-QQAxy9l9.mjs → _virtual/rolldown_runtime.mjs} +1 -1
- package/dist/build/rspack/dev-server-middleware.cjs +201 -0
- package/dist/build/rspack/dev-server-middleware.cjs.map +1 -0
- package/dist/build/rspack/dev-server-middleware.mjs +200 -0
- package/dist/build/rspack/dev-server-middleware.mjs.map +1 -0
- package/dist/build/rspack/index.cjs +2 -362
- package/dist/build/rspack/index.d.cts +2 -20
- package/dist/build/rspack/index.d.mts +2 -20
- package/dist/build/rspack/index.mjs +2 -360
- package/dist/build/rspack/module-federation.cjs +47 -0
- package/dist/build/rspack/module-federation.cjs.map +1 -0
- package/dist/build/rspack/module-federation.mjs +47 -0
- package/dist/build/rspack/module-federation.mjs.map +1 -0
- package/dist/build/rspack/plugin.cjs +90 -0
- package/dist/build/rspack/plugin.cjs.map +1 -0
- package/dist/build/rspack/plugin.d.cts +20 -0
- package/dist/build/rspack/plugin.d.cts.map +1 -0
- package/dist/build/rspack/plugin.d.mts +20 -0
- package/dist/build/rspack/plugin.d.mts.map +1 -0
- package/dist/build/rspack/plugin.mjs +89 -0
- package/dist/build/rspack/plugin.mjs.map +1 -0
- package/dist/build/rspack/utils.cjs +41 -0
- package/dist/build/rspack/utils.cjs.map +1 -0
- package/dist/build/rspack/utils.mjs +38 -0
- package/dist/build/rspack/utils.mjs.map +1 -0
- package/dist/errors.cjs +62 -3
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +75 -3
- package/dist/errors.d.cts.map +1 -0
- package/dist/errors.d.mts +75 -3
- package/dist/errors.d.mts.map +1 -0
- package/dist/errors.mjs +62 -3
- package/dist/errors.mjs.map +1 -0
- package/dist/index.cjs +8 -55
- package/dist/index.d.cts +6 -5
- package/dist/index.d.mts +6 -5
- package/dist/index.mjs +5 -51
- package/dist/orpc.cjs +1 -1
- package/dist/{package-DyTuSutr.cjs → package.cjs} +22 -7
- package/dist/package.cjs.map +1 -0
- package/dist/{package-CaRYwbRi.mjs → package.mjs} +22 -5
- package/dist/package.mjs.map +1 -0
- package/dist/plugin.cjs +48 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +62 -0
- package/dist/plugin.d.cts.map +1 -0
- package/dist/plugin.d.mts +62 -0
- package/dist/plugin.d.mts.map +1 -0
- package/dist/plugin.mjs +47 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/runtime/errors.cjs +45 -0
- package/dist/runtime/errors.cjs.map +1 -0
- package/dist/runtime/errors.d.cts +27 -0
- package/dist/runtime/errors.d.cts.map +1 -0
- package/dist/runtime/errors.d.mts +27 -0
- package/dist/runtime/errors.d.mts.map +1 -0
- package/dist/runtime/errors.mjs +41 -0
- package/dist/runtime/errors.mjs.map +1 -0
- package/dist/runtime/index.cjs +157 -5
- package/dist/runtime/index.cjs.map +1 -0
- package/dist/runtime/index.d.cts +43 -5
- package/dist/runtime/index.d.cts.map +1 -0
- package/dist/runtime/index.d.mts +43 -5
- package/dist/runtime/index.d.mts.map +1 -0
- package/dist/runtime/index.mjs +155 -4
- package/dist/runtime/index.mjs.map +1 -0
- package/dist/runtime/services/module-federation.service.cjs +143 -0
- package/dist/runtime/services/module-federation.service.cjs.map +1 -0
- package/dist/runtime/services/module-federation.service.d.cts +15 -0
- package/dist/runtime/services/module-federation.service.d.cts.map +1 -0
- package/dist/runtime/services/module-federation.service.d.mts +15 -0
- package/dist/runtime/services/module-federation.service.d.mts.map +1 -0
- package/dist/runtime/services/module-federation.service.mjs +143 -0
- package/dist/runtime/services/module-federation.service.mjs.map +1 -0
- package/dist/runtime/services/normalize.cjs +22 -2
- package/dist/runtime/services/normalize.cjs.map +1 -0
- package/dist/runtime/services/normalize.d.cts +21 -2
- package/dist/runtime/services/normalize.d.cts.map +1 -0
- package/dist/runtime/services/normalize.d.mts +21 -2
- package/dist/runtime/services/normalize.d.mts.map +1 -0
- package/dist/runtime/services/normalize.mjs +21 -2
- package/dist/runtime/services/normalize.mjs.map +1 -0
- package/dist/runtime/services/plugin-lifecycle.service.cjs +33 -0
- package/dist/runtime/services/plugin-lifecycle.service.cjs.map +1 -0
- package/dist/runtime/services/plugin-lifecycle.service.d.cts +17 -0
- package/dist/runtime/services/plugin-lifecycle.service.d.cts.map +1 -0
- package/dist/runtime/services/plugin-lifecycle.service.d.mts +17 -0
- package/dist/runtime/services/plugin-lifecycle.service.d.mts.map +1 -0
- package/dist/runtime/services/plugin-lifecycle.service.mjs +32 -0
- package/dist/runtime/services/plugin-lifecycle.service.mjs.map +1 -0
- package/dist/runtime/services/plugin-loader.service.cjs +125 -0
- package/dist/runtime/services/plugin-loader.service.cjs.map +1 -0
- package/dist/runtime/services/plugin-loader.service.d.cts +54 -0
- package/dist/runtime/services/plugin-loader.service.d.cts.map +1 -0
- package/dist/runtime/services/plugin-loader.service.d.mts +54 -0
- package/dist/runtime/services/plugin-loader.service.d.mts.map +1 -0
- package/dist/runtime/services/plugin-loader.service.mjs +121 -0
- package/dist/runtime/services/plugin-loader.service.mjs.map +1 -0
- package/dist/runtime/services/plugin.service.cjs +33 -0
- package/dist/runtime/services/plugin.service.cjs.map +1 -0
- package/dist/runtime/services/plugin.service.d.cts +42 -0
- package/dist/runtime/services/plugin.service.d.cts.map +1 -0
- package/dist/runtime/services/plugin.service.d.mts +42 -0
- package/dist/runtime/services/plugin.service.d.mts.map +1 -0
- package/dist/runtime/services/plugin.service.mjs +32 -0
- package/dist/runtime/services/plugin.service.mjs.map +1 -0
- package/dist/runtime/services/secrets.service.cjs +50 -0
- package/dist/runtime/services/secrets.service.cjs.map +1 -0
- package/dist/runtime/services/secrets.service.d.cts +16 -0
- package/dist/runtime/services/secrets.service.d.cts.map +1 -0
- package/dist/runtime/services/secrets.service.d.mts +16 -0
- package/dist/runtime/services/secrets.service.d.mts.map +1 -0
- package/dist/runtime/services/secrets.service.mjs +48 -0
- package/dist/runtime/services/secrets.service.mjs.map +1 -0
- package/dist/runtime/validation.cjs +18 -0
- package/dist/runtime/validation.cjs.map +1 -0
- package/dist/runtime/validation.mjs +17 -0
- package/dist/runtime/validation.mjs.map +1 -0
- package/dist/testing/index.cjs +2 -4
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +4 -4
- package/dist/testing/index.d.mts +4 -4
- package/dist/testing/index.mjs +1 -3
- package/dist/testing/index.mjs.map +1 -1
- package/dist/types.cjs +0 -0
- package/dist/types.d.cts +261 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +261 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +1 -0
- package/dist/zod-core.cjs +9 -0
- package/dist/zod-core.d.cts +1 -0
- package/dist/zod-core.d.mts +1 -0
- package/dist/zod-core.mjs +3 -0
- package/dist/zod.cjs +13 -1
- package/dist/zod.cjs.map +1 -0
- package/dist/zod.d.cts +8 -2
- package/dist/zod.d.cts.map +1 -0
- package/dist/zod.d.mts +8 -2
- package/dist/zod.d.mts.map +1 -0
- package/dist/zod.mjs +9 -2
- package/dist/zod.mjs.map +1 -0
- package/package.json +17 -2
- package/dist/build/rspack/index.cjs.map +0 -1
- package/dist/build/rspack/index.d.cts.map +0 -1
- package/dist/build/rspack/index.d.mts.map +0 -1
- package/dist/build/rspack/index.mjs.map +0 -1
- package/dist/errors-9sNpYLv5.d.mts +0 -75
- package/dist/errors-9sNpYLv5.d.mts.map +0 -1
- package/dist/errors-CVnoPl9v.cjs +0 -68
- package/dist/errors-CVnoPl9v.cjs.map +0 -1
- package/dist/errors-D7keKf7a.mjs +0 -63
- package/dist/errors-D7keKf7a.mjs.map +0 -1
- package/dist/errors-DKPPPYYT.d.cts +0 -75
- package/dist/errors-DKPPPYYT.d.cts.map +0 -1
- package/dist/fetch-8DauUFDh.mjs +0 -335
- package/dist/fetch-8DauUFDh.mjs.map +0 -1
- package/dist/fetch-CrBvwsZ4.cjs +0 -336
- package/dist/fetch-CrBvwsZ4.cjs.map +0 -1
- package/dist/index-Bu2wtZrA.d.mts +0 -463
- package/dist/index-Bu2wtZrA.d.mts.map +0 -1
- package/dist/index-DtTqwV4f.d.cts +0 -462
- package/dist/index-DtTqwV4f.d.cts.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/normalize-BW7kk8Lk.d.cts +0 -21
- package/dist/normalize-BW7kk8Lk.d.cts.map +0 -1
- package/dist/normalize-D4Qh0wVk.cjs +0 -28
- package/dist/normalize-D4Qh0wVk.cjs.map +0 -1
- package/dist/normalize-D7nae0Hn.mjs +0 -22
- package/dist/normalize-D7nae0Hn.mjs.map +0 -1
- package/dist/normalize-eB_j86fm.d.mts +0 -21
- package/dist/normalize-eB_j86fm.d.mts.map +0 -1
- package/dist/package-CaRYwbRi.mjs.map +0 -1
- package/dist/package-DyTuSutr.cjs.map +0 -1
- package/dist/plugins-C6MGKdD-.mjs +0 -790
- package/dist/plugins-C6MGKdD-.mjs.map +0 -1
- package/dist/plugins-DNaNtkG7.cjs +0 -791
- package/dist/plugins-DNaNtkG7.cjs.map +0 -1
- package/dist/runtime-BNcFgWDG.cjs +0 -558
- package/dist/runtime-BNcFgWDG.cjs.map +0 -1
- package/dist/runtime-CAWcnrAk.mjs +0 -547
- package/dist/runtime-CAWcnrAk.mjs.map +0 -1
- package/dist/standard-CkH8zNkx.mjs +0 -584
- package/dist/standard-CkH8zNkx.mjs.map +0 -1
- package/dist/standard-v75BC6Z5.cjs +0 -685
- package/dist/standard-v75BC6Z5.cjs.map +0 -1
- package/dist/zod-A7Pti5IV.d.cts +0 -4
- package/dist/zod-A7Pti5IV.d.cts.map +0 -1
- package/dist/zod-BVo51kgJ.mjs +0 -10
- package/dist/zod-BVo51kgJ.mjs.map +0 -1
- package/dist/zod-DYghWCz1.cjs +0 -14
- package/dist/zod-DYghWCz1.cjs.map +0 -1
- package/dist/zod-Zw8dlP3j.d.mts +0 -4
- package/dist/zod-Zw8dlP3j.d.mts.map +0 -1
|
@@ -26,21 +26,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
|
|
27
27
|
//#endregion
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return __commonJS;
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
Object.defineProperty(exports, '__reExport', {
|
|
36
|
-
enumerable: true,
|
|
37
|
-
get: function () {
|
|
38
|
-
return __reExport;
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
Object.defineProperty(exports, '__toESM', {
|
|
42
|
-
enumerable: true,
|
|
43
|
-
get: function () {
|
|
44
|
-
return __toESM;
|
|
45
|
-
}
|
|
46
|
-
});
|
|
29
|
+
exports.__commonJS = __commonJS;
|
|
30
|
+
exports.__reExport = __reExport;
|
|
31
|
+
exports.__toESM = __toESM;
|
|
@@ -28,4 +28,4 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
29
29
|
|
|
30
30
|
//#endregion
|
|
31
|
-
export {
|
|
31
|
+
export { __commonJS, __reExport, __require, __toESM };
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/build/rspack/dev-server-middleware.ts
|
|
3
|
+
const corsHeaders = {
|
|
4
|
+
"Access-Control-Allow-Origin": "*",
|
|
5
|
+
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
|
|
6
|
+
"Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
|
|
7
|
+
};
|
|
8
|
+
const applyCorsHeaders = (res) => {
|
|
9
|
+
Object.entries(corsHeaders).forEach(([key, value]) => {
|
|
10
|
+
res.setHeader(key, value);
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
const normalizePrefix = (prefix) => {
|
|
14
|
+
if (!prefix) return "";
|
|
15
|
+
const cleaned = prefix.replace(/^\/+|\/+$/g, "");
|
|
16
|
+
return cleaned ? `/${cleaned}` : "";
|
|
17
|
+
};
|
|
18
|
+
function setupPluginMiddleware(devServer, pluginInfo, devConfig, port) {
|
|
19
|
+
const rpcPrefix = normalizePrefix(devConfig?.prefix);
|
|
20
|
+
let handlers = {
|
|
21
|
+
rpc: null,
|
|
22
|
+
api: null
|
|
23
|
+
};
|
|
24
|
+
let cleanup = null;
|
|
25
|
+
const performCleanup = async () => {
|
|
26
|
+
if (cleanup) {
|
|
27
|
+
await cleanup();
|
|
28
|
+
cleanup = null;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
(async () => {
|
|
32
|
+
await performCleanup();
|
|
33
|
+
try {
|
|
34
|
+
const { createPluginRuntime } = await Promise.resolve().then(() => require("../../index.cjs"));
|
|
35
|
+
const { RPCHandler } = await import("@orpc/server/fetch");
|
|
36
|
+
const { onError } = await import("@orpc/server");
|
|
37
|
+
const { OpenAPIHandler } = await import("@orpc/openapi/fetch");
|
|
38
|
+
const { OpenAPIReferencePlugin } = await import("@orpc/openapi/plugins");
|
|
39
|
+
const { ZodToJsonSchemaConverter } = await import("@orpc/zod/zod4");
|
|
40
|
+
const pluginId = devConfig?.pluginId || pluginInfo.normalizedName;
|
|
41
|
+
const runtime = createPluginRuntime({ registry: { [pluginId]: { remoteUrl: `http://localhost:${port}/remoteEntry.js` } } });
|
|
42
|
+
const loaded = await runtime.usePlugin(pluginId, devConfig?.config);
|
|
43
|
+
cleanup = async () => {
|
|
44
|
+
if (loaded && typeof loaded.dispose === "function") await loaded.dispose();
|
|
45
|
+
if (runtime && typeof runtime.cleanup === "function") await runtime.cleanup();
|
|
46
|
+
handlers.rpc = null;
|
|
47
|
+
handlers.api = null;
|
|
48
|
+
if (devServer.app.locals.handlers) devServer.app.locals.handlers = null;
|
|
49
|
+
};
|
|
50
|
+
const formatError = (error, context) => {
|
|
51
|
+
const lines = [`\n🔴 ${context} Error: ${error.message || "Unknown error"}`];
|
|
52
|
+
if (error.cause?.issues && Array.isArray(error.cause.issues)) {
|
|
53
|
+
lines.push("\n📋 Validation Issues:");
|
|
54
|
+
error.cause.issues.forEach((issue, index) => {
|
|
55
|
+
lines.push(` ${index + 1}. ${issue.path?.join(".") || "root"}`);
|
|
56
|
+
lines.push(` ├─ Code: ${issue.code || "unknown"}`);
|
|
57
|
+
lines.push(` ├─ Message: ${issue.message || "No message"}`);
|
|
58
|
+
if (issue.expected !== void 0) lines.push(` ├─ Expected: ${JSON.stringify(issue.expected)}`);
|
|
59
|
+
if (issue.received !== void 0) lines.push(` └─ Received: ${JSON.stringify(issue.received)}`);
|
|
60
|
+
else lines.push(` └─ (end)`);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (error.data && typeof error.data === "object" && Object.keys(error.data).length > 0) {
|
|
64
|
+
lines.push("\n📊 Error Data:");
|
|
65
|
+
try {
|
|
66
|
+
JSON.stringify(error.data, null, 2).split("\n").forEach((line) => {
|
|
67
|
+
lines.push(` ${line}`);
|
|
68
|
+
});
|
|
69
|
+
} catch {
|
|
70
|
+
lines.push(` ${String(error.data)}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (error.cause?.data) {
|
|
74
|
+
lines.push("\n📦 Request Data:");
|
|
75
|
+
try {
|
|
76
|
+
JSON.stringify(error.cause.data, null, 2).split("\n").forEach((line) => {
|
|
77
|
+
lines.push(` ${line}`);
|
|
78
|
+
});
|
|
79
|
+
} catch {
|
|
80
|
+
lines.push(` ${String(error.cause.data)}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (error.code) lines.push(`\n⚠️ Error Code: ${error.code}`);
|
|
84
|
+
if (error.status) lines.push(`📍 Status: ${error.status}`);
|
|
85
|
+
lines.push("");
|
|
86
|
+
console.error(lines.join("\n"));
|
|
87
|
+
};
|
|
88
|
+
handlers.rpc = new RPCHandler(loaded.router, { interceptors: [onError((error) => {
|
|
89
|
+
formatError(error, "RPC");
|
|
90
|
+
})] });
|
|
91
|
+
handlers.api = new OpenAPIHandler(loaded.router, {
|
|
92
|
+
plugins: [new OpenAPIReferencePlugin({ schemaConverters: [new ZodToJsonSchemaConverter()] })],
|
|
93
|
+
interceptors: [onError((error) => {
|
|
94
|
+
formatError(error, "OpenAPI");
|
|
95
|
+
})]
|
|
96
|
+
});
|
|
97
|
+
console.log(`╭─────────────────────────────────────────────`);
|
|
98
|
+
console.log(`│ ✅ Plugin dev server ready: `);
|
|
99
|
+
console.log(`├─────────────────────────────────────────────`);
|
|
100
|
+
console.log(`│ 📡 RPC: http://localhost:${port}/api/rpc${rpcPrefix}`);
|
|
101
|
+
console.log(`│ 📖 Docs: http://localhost:${port}/api`);
|
|
102
|
+
console.log(`│ 💚 Health: http://localhost:${port}/`);
|
|
103
|
+
console.log(`╰─────────────────────────────────────────────`);
|
|
104
|
+
devServer.app.locals.handlers = handlers;
|
|
105
|
+
if (devServer.server) devServer.server.once("close", async () => {
|
|
106
|
+
await performCleanup();
|
|
107
|
+
});
|
|
108
|
+
} catch (error) {
|
|
109
|
+
console.error("❌ Failed to load plugin:", error);
|
|
110
|
+
await performCleanup();
|
|
111
|
+
}
|
|
112
|
+
})();
|
|
113
|
+
process.once("SIGINT", async () => {
|
|
114
|
+
await performCleanup();
|
|
115
|
+
});
|
|
116
|
+
process.once("SIGTERM", async () => {
|
|
117
|
+
await performCleanup();
|
|
118
|
+
});
|
|
119
|
+
devServer.app.options("*", (req, res) => {
|
|
120
|
+
applyCorsHeaders(res);
|
|
121
|
+
res.status(200).end();
|
|
122
|
+
});
|
|
123
|
+
devServer.app.get("/", (req, res) => {
|
|
124
|
+
applyCorsHeaders(res);
|
|
125
|
+
res.json({
|
|
126
|
+
ok: true,
|
|
127
|
+
plugin: pluginInfo.normalizedName,
|
|
128
|
+
version: pluginInfo.version,
|
|
129
|
+
status: devServer.app.locals.handlers?.rpc ? "ready" : "loading",
|
|
130
|
+
endpoints: {
|
|
131
|
+
health: "/",
|
|
132
|
+
docs: "/api",
|
|
133
|
+
rpc: `/api/rpc${rpcPrefix}`
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
const handleApiRequest = async (req, res) => {
|
|
138
|
+
applyCorsHeaders(res);
|
|
139
|
+
const apiHandler = devServer.app.locals.handlers?.api;
|
|
140
|
+
if (!apiHandler) return res.status(503).json({ error: "Plugin still loading..." });
|
|
141
|
+
try {
|
|
142
|
+
const url = `http://${req.headers.host}${req.url}`;
|
|
143
|
+
const webRequest = new Request(url, {
|
|
144
|
+
method: req.method,
|
|
145
|
+
headers: req.headers,
|
|
146
|
+
body: req.method !== "GET" && req.method !== "HEAD" ? req : void 0,
|
|
147
|
+
duplex: req.method !== "GET" && req.method !== "HEAD" ? "half" : void 0
|
|
148
|
+
});
|
|
149
|
+
const result = await apiHandler.handle(webRequest, {
|
|
150
|
+
prefix: "/api",
|
|
151
|
+
context: {}
|
|
152
|
+
});
|
|
153
|
+
if (result.response) {
|
|
154
|
+
res.status(result.response.status);
|
|
155
|
+
result.response.headers.forEach((value, key) => {
|
|
156
|
+
res.setHeader(key, value);
|
|
157
|
+
});
|
|
158
|
+
const text = await result.response.text();
|
|
159
|
+
res.send(text);
|
|
160
|
+
} else res.status(404).send("Not Found");
|
|
161
|
+
} catch (error) {
|
|
162
|
+
console.error("OpenAPI error:", error);
|
|
163
|
+
res.status(500).json({ error: error.message });
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
devServer.app.all("/api", handleApiRequest);
|
|
167
|
+
devServer.app.all("/api/*", handleApiRequest);
|
|
168
|
+
devServer.app.all(`/api/rpc${rpcPrefix}/*`, async (req, res) => {
|
|
169
|
+
applyCorsHeaders(res);
|
|
170
|
+
const rpcHandler = devServer.app.locals.handlers?.rpc;
|
|
171
|
+
if (!rpcHandler) return res.status(503).json({ error: "Plugin still loading..." });
|
|
172
|
+
try {
|
|
173
|
+
const url = `http://${req.headers.host}${req.url}`;
|
|
174
|
+
const webRequest = new Request(url, {
|
|
175
|
+
method: req.method,
|
|
176
|
+
headers: req.headers,
|
|
177
|
+
body: req.method !== "GET" && req.method !== "HEAD" ? req : void 0,
|
|
178
|
+
duplex: req.method !== "GET" && req.method !== "HEAD" ? "half" : void 0
|
|
179
|
+
});
|
|
180
|
+
const result = await rpcHandler.handle(webRequest, {
|
|
181
|
+
prefix: `/api/rpc${rpcPrefix}`,
|
|
182
|
+
context: {}
|
|
183
|
+
});
|
|
184
|
+
if (result.response) {
|
|
185
|
+
res.status(result.response.status);
|
|
186
|
+
result.response.headers.forEach((value, key) => {
|
|
187
|
+
res.setHeader(key, value);
|
|
188
|
+
});
|
|
189
|
+
const text = await result.response.text();
|
|
190
|
+
res.send(text);
|
|
191
|
+
} else res.status(404).send("Not Found");
|
|
192
|
+
} catch (error) {
|
|
193
|
+
console.error("RPC error:", error);
|
|
194
|
+
res.status(500).json({ error: error.message });
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
//#endregion
|
|
200
|
+
exports.setupPluginMiddleware = setupPluginMiddleware;
|
|
201
|
+
//# sourceMappingURL=dev-server-middleware.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-server-middleware.cjs","names":["handlers: { rpc: any, api: any }","cleanup: (() => Promise<void>) | null","lines: string[]"],"sources":["../../../src/build/rspack/dev-server-middleware.ts"],"sourcesContent":["import type { PluginInfo } from './utils';\n\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',\n 'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization'\n};\n\nconst applyCorsHeaders = (res: any) => {\n Object.entries(corsHeaders).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n};\n\nconst normalizePrefix = (prefix?: string): string => {\n if (!prefix) return '';\n const cleaned = prefix.replace(/^\\/+|\\/+$/g, '');\n return cleaned ? `/${cleaned}` : '';\n};\n\nexport function setupPluginMiddleware(devServer: any, pluginInfo: PluginInfo, devConfig: any, port: number) {\n const rpcPrefix = normalizePrefix(devConfig?.prefix);\n let handlers: { rpc: any, api: any } = { rpc: null, api: null };\n let cleanup: (() => Promise<void>) | null = null;\n\n const performCleanup = async () => {\n if (cleanup) {\n await cleanup();\n cleanup = null;\n }\n };\n\n (async () => {\n await performCleanup();\n\n try {\n const { createPluginRuntime } = await import('every-plugin');\n const { RPCHandler } = await import('@orpc/server/fetch');\n const { onError } = await import('@orpc/server');\n const { OpenAPIHandler } = await import('@orpc/openapi/fetch');\n const { OpenAPIReferencePlugin } = await import('@orpc/openapi/plugins');\n const { ZodToJsonSchemaConverter } = await import('@orpc/zod/zod4');\n\n const pluginId = devConfig?.pluginId || pluginInfo.normalizedName;\n\n const runtime = createPluginRuntime({\n registry: {\n [pluginId]: {\n remoteUrl: `http://localhost:${port}/remoteEntry.js`\n }\n }\n });\n\n const loaded = await runtime.usePlugin(pluginId, devConfig?.config);\n\n cleanup = async () => {\n if (loaded && typeof (loaded as any).dispose === 'function') {\n await (loaded as any).dispose();\n }\n if (runtime && typeof (runtime as any).cleanup === 'function') {\n await (runtime as any).cleanup();\n }\n handlers.rpc = null;\n handlers.api = null;\n if (devServer.app.locals.handlers) {\n devServer.app.locals.handlers = null;\n }\n };\n\n const formatError = (error: any, context: string) => {\n const lines: string[] = [`\\n🔴 ${context} Error: ${error.message || 'Unknown error'}`];\n \n if (error.cause?.issues && Array.isArray(error.cause.issues)) {\n lines.push('\\n📋 Validation Issues:');\n error.cause.issues.forEach((issue: any, index: number) => {\n lines.push(` ${index + 1}. ${issue.path?.join('.') || 'root'}`);\n lines.push(` ├─ Code: ${issue.code || 'unknown'}`);\n lines.push(` ├─ Message: ${issue.message || 'No message'}`);\n if (issue.expected !== undefined) {\n lines.push(` ├─ Expected: ${JSON.stringify(issue.expected)}`);\n }\n if (issue.received !== undefined) {\n lines.push(` └─ Received: ${JSON.stringify(issue.received)}`);\n } else {\n lines.push(` └─ (end)`);\n }\n });\n }\n \n if (error.data && typeof error.data === 'object' && Object.keys(error.data).length > 0) {\n lines.push('\\n📊 Error Data:');\n try {\n const dataStr = JSON.stringify(error.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.data)}`);\n }\n }\n \n if (error.cause?.data) {\n lines.push('\\n📦 Request Data:');\n try {\n const dataStr = JSON.stringify(error.cause.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.cause.data)}`);\n }\n }\n \n if (error.code) {\n lines.push(`\\n⚠️ Error Code: ${error.code}`);\n }\n \n if (error.status) {\n lines.push(`📍 Status: ${error.status}`);\n }\n \n lines.push('');\n console.error(lines.join('\\n'));\n };\n\n // @ts-expect-error no type\n handlers.rpc = new RPCHandler(loaded.router, {\n interceptors: [\n onError((error: any) => {\n formatError(error, 'RPC');\n }),\n ]\n });\n\n // @ts-expect-error no type\n handlers.api = new OpenAPIHandler(loaded.router, {\n plugins: [\n new OpenAPIReferencePlugin({\n schemaConverters: [new ZodToJsonSchemaConverter()],\n }),\n ],\n interceptors: [\n onError((error: any) => {\n formatError(error, 'OpenAPI');\n }),\n ]\n });\n\n console.log(`╭─────────────────────────────────────────────`);\n console.log(`│ ✅ Plugin dev server ready: `);\n console.log(`├─────────────────────────────────────────────`);\n console.log(`│ 📡 RPC: http://localhost:${port}/api/rpc${rpcPrefix}`);\n console.log(`│ 📖 Docs: http://localhost:${port}/api`);\n console.log(`│ 💚 Health: http://localhost:${port}/`);\n console.log(`╰─────────────────────────────────────────────`);\n\n devServer.app.locals.handlers = handlers;\n\n if (devServer.server) {\n devServer.server.once('close', async () => {\n await performCleanup();\n });\n }\n } catch (error) {\n console.error('❌ Failed to load plugin:', error);\n await performCleanup();\n }\n })();\n\n process.once('SIGINT', async () => {\n await performCleanup();\n });\n process.once('SIGTERM', async () => {\n await performCleanup();\n });\n\n devServer.app.options('*', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.status(200).end();\n });\n\n devServer.app.get('/', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.json({\n ok: true,\n plugin: pluginInfo.normalizedName,\n version: pluginInfo.version,\n status: devServer.app.locals.handlers?.rpc ? 'ready' : 'loading',\n endpoints: {\n health: '/',\n docs: '/api',\n rpc: `/api/rpc${rpcPrefix}`\n }\n });\n });\n\n // OpenAPI documentation and REST endpoints at /api and /api/*\n const handleApiRequest = async (req: any, res: any) => {\n applyCorsHeaders(res);\n const apiHandler = devServer.app.locals.handlers?.api;\n if (!apiHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await apiHandler.handle(webRequest, {\n prefix: '/api',\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('OpenAPI error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n };\n\n devServer.app.all('/api', handleApiRequest);\n devServer.app.all('/api/*', handleApiRequest);\n\n devServer.app.all(`/api/rpc${rpcPrefix}/*`, async (req: any, res: any) => {\n applyCorsHeaders(res);\n const rpcHandler = devServer.app.locals.handlers?.rpc;\n if (!rpcHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await rpcHandler.handle(webRequest, {\n prefix: `/api/rpc${rpcPrefix}`,\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('RPC error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
//#region src/build/rspack/dev-server-middleware.ts
|
|
2
|
+
const corsHeaders = {
|
|
3
|
+
"Access-Control-Allow-Origin": "*",
|
|
4
|
+
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
|
|
5
|
+
"Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
|
|
6
|
+
};
|
|
7
|
+
const applyCorsHeaders = (res) => {
|
|
8
|
+
Object.entries(corsHeaders).forEach(([key, value]) => {
|
|
9
|
+
res.setHeader(key, value);
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
const normalizePrefix = (prefix) => {
|
|
13
|
+
if (!prefix) return "";
|
|
14
|
+
const cleaned = prefix.replace(/^\/+|\/+$/g, "");
|
|
15
|
+
return cleaned ? `/${cleaned}` : "";
|
|
16
|
+
};
|
|
17
|
+
function setupPluginMiddleware(devServer, pluginInfo, devConfig, port) {
|
|
18
|
+
const rpcPrefix = normalizePrefix(devConfig?.prefix);
|
|
19
|
+
let handlers = {
|
|
20
|
+
rpc: null,
|
|
21
|
+
api: null
|
|
22
|
+
};
|
|
23
|
+
let cleanup = null;
|
|
24
|
+
const performCleanup = async () => {
|
|
25
|
+
if (cleanup) {
|
|
26
|
+
await cleanup();
|
|
27
|
+
cleanup = null;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
(async () => {
|
|
31
|
+
await performCleanup();
|
|
32
|
+
try {
|
|
33
|
+
const { createPluginRuntime } = await import("../../index.mjs");
|
|
34
|
+
const { RPCHandler } = await import("@orpc/server/fetch");
|
|
35
|
+
const { onError } = await import("@orpc/server");
|
|
36
|
+
const { OpenAPIHandler } = await import("@orpc/openapi/fetch");
|
|
37
|
+
const { OpenAPIReferencePlugin } = await import("@orpc/openapi/plugins");
|
|
38
|
+
const { ZodToJsonSchemaConverter } = await import("@orpc/zod/zod4");
|
|
39
|
+
const pluginId = devConfig?.pluginId || pluginInfo.normalizedName;
|
|
40
|
+
const runtime = createPluginRuntime({ registry: { [pluginId]: { remoteUrl: `http://localhost:${port}/remoteEntry.js` } } });
|
|
41
|
+
const loaded = await runtime.usePlugin(pluginId, devConfig?.config);
|
|
42
|
+
cleanup = async () => {
|
|
43
|
+
if (loaded && typeof loaded.dispose === "function") await loaded.dispose();
|
|
44
|
+
if (runtime && typeof runtime.cleanup === "function") await runtime.cleanup();
|
|
45
|
+
handlers.rpc = null;
|
|
46
|
+
handlers.api = null;
|
|
47
|
+
if (devServer.app.locals.handlers) devServer.app.locals.handlers = null;
|
|
48
|
+
};
|
|
49
|
+
const formatError = (error, context) => {
|
|
50
|
+
const lines = [`\n🔴 ${context} Error: ${error.message || "Unknown error"}`];
|
|
51
|
+
if (error.cause?.issues && Array.isArray(error.cause.issues)) {
|
|
52
|
+
lines.push("\n📋 Validation Issues:");
|
|
53
|
+
error.cause.issues.forEach((issue, index) => {
|
|
54
|
+
lines.push(` ${index + 1}. ${issue.path?.join(".") || "root"}`);
|
|
55
|
+
lines.push(` ├─ Code: ${issue.code || "unknown"}`);
|
|
56
|
+
lines.push(` ├─ Message: ${issue.message || "No message"}`);
|
|
57
|
+
if (issue.expected !== void 0) lines.push(` ├─ Expected: ${JSON.stringify(issue.expected)}`);
|
|
58
|
+
if (issue.received !== void 0) lines.push(` └─ Received: ${JSON.stringify(issue.received)}`);
|
|
59
|
+
else lines.push(` └─ (end)`);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (error.data && typeof error.data === "object" && Object.keys(error.data).length > 0) {
|
|
63
|
+
lines.push("\n📊 Error Data:");
|
|
64
|
+
try {
|
|
65
|
+
JSON.stringify(error.data, null, 2).split("\n").forEach((line) => {
|
|
66
|
+
lines.push(` ${line}`);
|
|
67
|
+
});
|
|
68
|
+
} catch {
|
|
69
|
+
lines.push(` ${String(error.data)}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (error.cause?.data) {
|
|
73
|
+
lines.push("\n📦 Request Data:");
|
|
74
|
+
try {
|
|
75
|
+
JSON.stringify(error.cause.data, null, 2).split("\n").forEach((line) => {
|
|
76
|
+
lines.push(` ${line}`);
|
|
77
|
+
});
|
|
78
|
+
} catch {
|
|
79
|
+
lines.push(` ${String(error.cause.data)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (error.code) lines.push(`\n⚠️ Error Code: ${error.code}`);
|
|
83
|
+
if (error.status) lines.push(`📍 Status: ${error.status}`);
|
|
84
|
+
lines.push("");
|
|
85
|
+
console.error(lines.join("\n"));
|
|
86
|
+
};
|
|
87
|
+
handlers.rpc = new RPCHandler(loaded.router, { interceptors: [onError((error) => {
|
|
88
|
+
formatError(error, "RPC");
|
|
89
|
+
})] });
|
|
90
|
+
handlers.api = new OpenAPIHandler(loaded.router, {
|
|
91
|
+
plugins: [new OpenAPIReferencePlugin({ schemaConverters: [new ZodToJsonSchemaConverter()] })],
|
|
92
|
+
interceptors: [onError((error) => {
|
|
93
|
+
formatError(error, "OpenAPI");
|
|
94
|
+
})]
|
|
95
|
+
});
|
|
96
|
+
console.log(`╭─────────────────────────────────────────────`);
|
|
97
|
+
console.log(`│ ✅ Plugin dev server ready: `);
|
|
98
|
+
console.log(`├─────────────────────────────────────────────`);
|
|
99
|
+
console.log(`│ 📡 RPC: http://localhost:${port}/api/rpc${rpcPrefix}`);
|
|
100
|
+
console.log(`│ 📖 Docs: http://localhost:${port}/api`);
|
|
101
|
+
console.log(`│ 💚 Health: http://localhost:${port}/`);
|
|
102
|
+
console.log(`╰─────────────────────────────────────────────`);
|
|
103
|
+
devServer.app.locals.handlers = handlers;
|
|
104
|
+
if (devServer.server) devServer.server.once("close", async () => {
|
|
105
|
+
await performCleanup();
|
|
106
|
+
});
|
|
107
|
+
} catch (error) {
|
|
108
|
+
console.error("❌ Failed to load plugin:", error);
|
|
109
|
+
await performCleanup();
|
|
110
|
+
}
|
|
111
|
+
})();
|
|
112
|
+
process.once("SIGINT", async () => {
|
|
113
|
+
await performCleanup();
|
|
114
|
+
});
|
|
115
|
+
process.once("SIGTERM", async () => {
|
|
116
|
+
await performCleanup();
|
|
117
|
+
});
|
|
118
|
+
devServer.app.options("*", (req, res) => {
|
|
119
|
+
applyCorsHeaders(res);
|
|
120
|
+
res.status(200).end();
|
|
121
|
+
});
|
|
122
|
+
devServer.app.get("/", (req, res) => {
|
|
123
|
+
applyCorsHeaders(res);
|
|
124
|
+
res.json({
|
|
125
|
+
ok: true,
|
|
126
|
+
plugin: pluginInfo.normalizedName,
|
|
127
|
+
version: pluginInfo.version,
|
|
128
|
+
status: devServer.app.locals.handlers?.rpc ? "ready" : "loading",
|
|
129
|
+
endpoints: {
|
|
130
|
+
health: "/",
|
|
131
|
+
docs: "/api",
|
|
132
|
+
rpc: `/api/rpc${rpcPrefix}`
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
const handleApiRequest = async (req, res) => {
|
|
137
|
+
applyCorsHeaders(res);
|
|
138
|
+
const apiHandler = devServer.app.locals.handlers?.api;
|
|
139
|
+
if (!apiHandler) return res.status(503).json({ error: "Plugin still loading..." });
|
|
140
|
+
try {
|
|
141
|
+
const url = `http://${req.headers.host}${req.url}`;
|
|
142
|
+
const webRequest = new Request(url, {
|
|
143
|
+
method: req.method,
|
|
144
|
+
headers: req.headers,
|
|
145
|
+
body: req.method !== "GET" && req.method !== "HEAD" ? req : void 0,
|
|
146
|
+
duplex: req.method !== "GET" && req.method !== "HEAD" ? "half" : void 0
|
|
147
|
+
});
|
|
148
|
+
const result = await apiHandler.handle(webRequest, {
|
|
149
|
+
prefix: "/api",
|
|
150
|
+
context: {}
|
|
151
|
+
});
|
|
152
|
+
if (result.response) {
|
|
153
|
+
res.status(result.response.status);
|
|
154
|
+
result.response.headers.forEach((value, key) => {
|
|
155
|
+
res.setHeader(key, value);
|
|
156
|
+
});
|
|
157
|
+
const text = await result.response.text();
|
|
158
|
+
res.send(text);
|
|
159
|
+
} else res.status(404).send("Not Found");
|
|
160
|
+
} catch (error) {
|
|
161
|
+
console.error("OpenAPI error:", error);
|
|
162
|
+
res.status(500).json({ error: error.message });
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
devServer.app.all("/api", handleApiRequest);
|
|
166
|
+
devServer.app.all("/api/*", handleApiRequest);
|
|
167
|
+
devServer.app.all(`/api/rpc${rpcPrefix}/*`, async (req, res) => {
|
|
168
|
+
applyCorsHeaders(res);
|
|
169
|
+
const rpcHandler = devServer.app.locals.handlers?.rpc;
|
|
170
|
+
if (!rpcHandler) return res.status(503).json({ error: "Plugin still loading..." });
|
|
171
|
+
try {
|
|
172
|
+
const url = `http://${req.headers.host}${req.url}`;
|
|
173
|
+
const webRequest = new Request(url, {
|
|
174
|
+
method: req.method,
|
|
175
|
+
headers: req.headers,
|
|
176
|
+
body: req.method !== "GET" && req.method !== "HEAD" ? req : void 0,
|
|
177
|
+
duplex: req.method !== "GET" && req.method !== "HEAD" ? "half" : void 0
|
|
178
|
+
});
|
|
179
|
+
const result = await rpcHandler.handle(webRequest, {
|
|
180
|
+
prefix: `/api/rpc${rpcPrefix}`,
|
|
181
|
+
context: {}
|
|
182
|
+
});
|
|
183
|
+
if (result.response) {
|
|
184
|
+
res.status(result.response.status);
|
|
185
|
+
result.response.headers.forEach((value, key) => {
|
|
186
|
+
res.setHeader(key, value);
|
|
187
|
+
});
|
|
188
|
+
const text = await result.response.text();
|
|
189
|
+
res.send(text);
|
|
190
|
+
} else res.status(404).send("Not Found");
|
|
191
|
+
} catch (error) {
|
|
192
|
+
console.error("RPC error:", error);
|
|
193
|
+
res.status(500).json({ error: error.message });
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
//#endregion
|
|
199
|
+
export { setupPluginMiddleware };
|
|
200
|
+
//# sourceMappingURL=dev-server-middleware.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-server-middleware.mjs","names":["handlers: { rpc: any, api: any }","cleanup: (() => Promise<void>) | null","lines: string[]"],"sources":["../../../src/build/rspack/dev-server-middleware.ts"],"sourcesContent":["import type { PluginInfo } from './utils';\n\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',\n 'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization'\n};\n\nconst applyCorsHeaders = (res: any) => {\n Object.entries(corsHeaders).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n};\n\nconst normalizePrefix = (prefix?: string): string => {\n if (!prefix) return '';\n const cleaned = prefix.replace(/^\\/+|\\/+$/g, '');\n return cleaned ? `/${cleaned}` : '';\n};\n\nexport function setupPluginMiddleware(devServer: any, pluginInfo: PluginInfo, devConfig: any, port: number) {\n const rpcPrefix = normalizePrefix(devConfig?.prefix);\n let handlers: { rpc: any, api: any } = { rpc: null, api: null };\n let cleanup: (() => Promise<void>) | null = null;\n\n const performCleanup = async () => {\n if (cleanup) {\n await cleanup();\n cleanup = null;\n }\n };\n\n (async () => {\n await performCleanup();\n\n try {\n const { createPluginRuntime } = await import('every-plugin');\n const { RPCHandler } = await import('@orpc/server/fetch');\n const { onError } = await import('@orpc/server');\n const { OpenAPIHandler } = await import('@orpc/openapi/fetch');\n const { OpenAPIReferencePlugin } = await import('@orpc/openapi/plugins');\n const { ZodToJsonSchemaConverter } = await import('@orpc/zod/zod4');\n\n const pluginId = devConfig?.pluginId || pluginInfo.normalizedName;\n\n const runtime = createPluginRuntime({\n registry: {\n [pluginId]: {\n remoteUrl: `http://localhost:${port}/remoteEntry.js`\n }\n }\n });\n\n const loaded = await runtime.usePlugin(pluginId, devConfig?.config);\n\n cleanup = async () => {\n if (loaded && typeof (loaded as any).dispose === 'function') {\n await (loaded as any).dispose();\n }\n if (runtime && typeof (runtime as any).cleanup === 'function') {\n await (runtime as any).cleanup();\n }\n handlers.rpc = null;\n handlers.api = null;\n if (devServer.app.locals.handlers) {\n devServer.app.locals.handlers = null;\n }\n };\n\n const formatError = (error: any, context: string) => {\n const lines: string[] = [`\\n🔴 ${context} Error: ${error.message || 'Unknown error'}`];\n \n if (error.cause?.issues && Array.isArray(error.cause.issues)) {\n lines.push('\\n📋 Validation Issues:');\n error.cause.issues.forEach((issue: any, index: number) => {\n lines.push(` ${index + 1}. ${issue.path?.join('.') || 'root'}`);\n lines.push(` ├─ Code: ${issue.code || 'unknown'}`);\n lines.push(` ├─ Message: ${issue.message || 'No message'}`);\n if (issue.expected !== undefined) {\n lines.push(` ├─ Expected: ${JSON.stringify(issue.expected)}`);\n }\n if (issue.received !== undefined) {\n lines.push(` └─ Received: ${JSON.stringify(issue.received)}`);\n } else {\n lines.push(` └─ (end)`);\n }\n });\n }\n \n if (error.data && typeof error.data === 'object' && Object.keys(error.data).length > 0) {\n lines.push('\\n📊 Error Data:');\n try {\n const dataStr = JSON.stringify(error.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.data)}`);\n }\n }\n \n if (error.cause?.data) {\n lines.push('\\n📦 Request Data:');\n try {\n const dataStr = JSON.stringify(error.cause.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.cause.data)}`);\n }\n }\n \n if (error.code) {\n lines.push(`\\n⚠️ Error Code: ${error.code}`);\n }\n \n if (error.status) {\n lines.push(`📍 Status: ${error.status}`);\n }\n \n lines.push('');\n console.error(lines.join('\\n'));\n };\n\n // @ts-expect-error no type\n handlers.rpc = new RPCHandler(loaded.router, {\n interceptors: [\n onError((error: any) => {\n formatError(error, 'RPC');\n }),\n ]\n });\n\n // @ts-expect-error no type\n handlers.api = new OpenAPIHandler(loaded.router, {\n plugins: [\n new OpenAPIReferencePlugin({\n schemaConverters: [new ZodToJsonSchemaConverter()],\n }),\n ],\n interceptors: [\n onError((error: any) => {\n formatError(error, 'OpenAPI');\n }),\n ]\n });\n\n console.log(`╭─────────────────────────────────────────────`);\n console.log(`│ ✅ Plugin dev server ready: `);\n console.log(`├─────────────────────────────────────────────`);\n console.log(`│ 📡 RPC: http://localhost:${port}/api/rpc${rpcPrefix}`);\n console.log(`│ 📖 Docs: http://localhost:${port}/api`);\n console.log(`│ 💚 Health: http://localhost:${port}/`);\n console.log(`╰─────────────────────────────────────────────`);\n\n devServer.app.locals.handlers = handlers;\n\n if (devServer.server) {\n devServer.server.once('close', async () => {\n await performCleanup();\n });\n }\n } catch (error) {\n console.error('❌ Failed to load plugin:', error);\n await performCleanup();\n }\n })();\n\n process.once('SIGINT', async () => {\n await performCleanup();\n });\n process.once('SIGTERM', async () => {\n await performCleanup();\n });\n\n devServer.app.options('*', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.status(200).end();\n });\n\n devServer.app.get('/', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.json({\n ok: true,\n plugin: pluginInfo.normalizedName,\n version: pluginInfo.version,\n status: devServer.app.locals.handlers?.rpc ? 'ready' : 'loading',\n endpoints: {\n health: '/',\n docs: '/api',\n rpc: `/api/rpc${rpcPrefix}`\n }\n });\n });\n\n // OpenAPI documentation and REST endpoints at /api and /api/*\n const handleApiRequest = async (req: any, res: any) => {\n applyCorsHeaders(res);\n const apiHandler = devServer.app.locals.handlers?.api;\n if (!apiHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await apiHandler.handle(webRequest, {\n prefix: '/api',\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('OpenAPI error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n };\n\n devServer.app.all('/api', handleApiRequest);\n devServer.app.all('/api/*', handleApiRequest);\n\n devServer.app.all(`/api/rpc${rpcPrefix}/*`, async (req: any, res: any) => {\n applyCorsHeaders(res);\n const rpcHandler = devServer.app.locals.handlers?.rpc;\n if (!rpcHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await rpcHandler.handle(webRequest, {\n prefix: `/api/rpc${rpcPrefix}`,\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('RPC error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n });\n}\n"],"mappings":"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"}
|