wexts 4.1.0 → 4.1.6
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-27NEYQD2.mjs +222 -0
- package/dist/chunk-27NEYQD2.mjs.map +1 -0
- package/dist/{chunk-YBM3IJEA.mjs → chunk-5DBFN65W.mjs} +92 -3
- package/dist/chunk-5DBFN65W.mjs.map +1 -0
- package/dist/{chunk-7HNQWJWV.js → chunk-75HBI2XG.js} +3 -3
- package/dist/{chunk-7HNQWJWV.js.map → chunk-75HBI2XG.js.map} +1 -1
- package/dist/{chunk-JHOVXH3X.mjs → chunk-C2AG7Q3C.mjs} +2 -2
- package/dist/{chunk-7TLSPR65.mjs → chunk-DS5KVVWJ.mjs} +2 -2
- package/dist/{chunk-YN6WIWNQ.mjs → chunk-FUPLZMSR.mjs} +3 -3
- package/dist/{chunk-7QKLIVRF.js → chunk-HLT3IHJY.js} +92 -3
- package/dist/chunk-HLT3IHJY.js.map +1 -0
- package/dist/{chunk-7WULUGLH.mjs → chunk-L77ANWWT.mjs} +2 -2
- package/dist/{chunk-7WULUGLH.mjs.map → chunk-L77ANWWT.mjs.map} +1 -1
- package/dist/chunk-P3Q4I5FD.js +222 -0
- package/dist/chunk-P3Q4I5FD.js.map +1 -0
- package/dist/{chunk-342VRT25.mjs → chunk-VBIQGUDI.mjs} +6 -6
- package/dist/cli/index.js +32 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +35 -6
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.d.mts +23 -1
- package/dist/client/index.d.ts +23 -1
- package/dist/client/index.js +183 -9
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +160 -7
- package/dist/client/index.mjs.map +1 -1
- package/dist/codegen/index.d.mts +2 -2
- package/dist/codegen/index.d.ts +2 -2
- package/dist/codegen/index.js +3 -3
- package/dist/codegen/index.mjs +4 -4
- package/dist/decorators-BiQtOHuF.d.ts +60 -0
- package/dist/decorators-vBopODtr.d.mts +60 -0
- package/dist/dev-server/index.mjs +3 -3
- package/dist/errors-D545UvXf.d.mts +37 -0
- package/dist/errors-D545UvXf.d.ts +37 -0
- package/dist/{index-7QeQEf37.d.ts → index-CJKs4wtN.d.ts} +1 -1
- package/dist/index-CUR6CnLk.d.ts +27 -0
- package/dist/{index-8nzxy0NN.d.mts → index-h66Vq9dK.d.mts} +1 -1
- package/dist/index-tqmYsTUn.d.mts +27 -0
- package/dist/index.d.mts +82 -87
- package/dist/index.d.ts +82 -87
- package/dist/index.js +140 -20
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +142 -22
- package/dist/index.mjs.map +1 -1
- package/dist/nest/index.d.mts +2 -3
- package/dist/nest/index.d.ts +2 -3
- package/dist/nest/index.js +2 -4
- package/dist/nest/index.js.map +1 -1
- package/dist/nest/index.mjs +3 -5
- package/dist/next/index.js +0 -7
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs.map +1 -1
- package/dist/rpc/index.d.mts +32 -2
- package/dist/rpc/index.d.ts +32 -2
- package/dist/rpc/index.js +18 -22
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/index.mjs +0 -22
- package/dist/runtime/index.d.mts +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.js +5 -211
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/index.mjs +7 -213
- package/dist/runtime/index.mjs.map +1 -1
- package/dist/server/index.d.mts +7 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.js +58 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +58 -0
- package/dist/types/index.js +18 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/index.mjs +0 -2
- package/dist/{types-7d_fC-C3.d.ts → types-CQ_aexOX.d.mts} +1 -1
- package/dist/{types-7d_fC-C3.d.mts → types-CQ_aexOX.d.ts} +1 -1
- package/dist/vercel-builder/index.mjs +1 -1
- package/package.json +6 -1
- package/templates/nestjs-api/README.md +1 -1
- package/dist/chunk-2KAQYLVN.js +0 -1
- package/dist/chunk-2KAQYLVN.js.map +0 -1
- package/dist/chunk-7QKLIVRF.js.map +0 -1
- package/dist/chunk-7SSCNCTW.mjs +0 -137
- package/dist/chunk-7SSCNCTW.mjs.map +0 -1
- package/dist/chunk-BG56B4DE.js +0 -106
- package/dist/chunk-BG56B4DE.js.map +0 -1
- package/dist/chunk-CLM5PNSG.mjs +0 -496
- package/dist/chunk-CLM5PNSG.mjs.map +0 -1
- package/dist/chunk-DNLGCKTT.js +0 -31
- package/dist/chunk-DNLGCKTT.js.map +0 -1
- package/dist/chunk-MXINIFPC.js +0 -105
- package/dist/chunk-MXINIFPC.js.map +0 -1
- package/dist/chunk-O4II6N34.js +0 -137
- package/dist/chunk-O4II6N34.js.map +0 -1
- package/dist/chunk-SE32ZPOZ.js +0 -496
- package/dist/chunk-SE32ZPOZ.js.map +0 -1
- package/dist/chunk-UAL54DVV.mjs +0 -106
- package/dist/chunk-UAL54DVV.mjs.map +0 -1
- package/dist/chunk-WU6FW77M.mjs +0 -105
- package/dist/chunk-WU6FW77M.mjs.map +0 -1
- package/dist/chunk-YBM3IJEA.mjs.map +0 -1
- package/dist/chunk-YSLEF5C5.mjs +0 -1
- package/dist/chunk-ZX7QIN24.mjs +0 -31
- package/dist/chunk-ZX7QIN24.mjs.map +0 -1
- package/dist/decorators-BT1FFqN0.d.mts +0 -29
- package/dist/decorators-DvS58PqC.d.ts +0 -29
- package/dist/index-Co5ZsLqq.d.ts +0 -58
- package/dist/index-D94W1__r.d.mts +0 -58
- package/dist/index-DQmyVp6F.d.mts +0 -27
- package/dist/index-KL_1BrQb.d.ts +0 -27
- /package/dist/{chunk-JHOVXH3X.mjs.map → chunk-C2AG7Q3C.mjs.map} +0 -0
- /package/dist/{chunk-7TLSPR65.mjs.map → chunk-DS5KVVWJ.mjs.map} +0 -0
- /package/dist/{chunk-YN6WIWNQ.mjs.map → chunk-FUPLZMSR.mjs.map} +0 -0
- /package/dist/{chunk-342VRT25.mjs.map → chunk-VBIQGUDI.mjs.map} +0 -0
- /package/dist/{chunk-YSLEF5C5.mjs.map → server/index.mjs.map} +0 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WextsRuntimeError
|
|
3
|
+
} from "./chunk-DS5KVVWJ.mjs";
|
|
4
|
+
import {
|
|
5
|
+
__name
|
|
6
|
+
} from "./chunk-L77ANWWT.mjs";
|
|
7
|
+
|
|
8
|
+
// src/runtime/rpc-router.ts
|
|
9
|
+
async function registerRpcRoutes(fastify, options) {
|
|
10
|
+
const serviceMap = new Map(options.manifest.services.map((service) => [
|
|
11
|
+
service.name,
|
|
12
|
+
service
|
|
13
|
+
]));
|
|
14
|
+
fastify.post("/rpc/:service/:method", async (request, reply) => {
|
|
15
|
+
const service = serviceMap.get(request.params.service);
|
|
16
|
+
if (!service) {
|
|
17
|
+
reply.status(404);
|
|
18
|
+
return {
|
|
19
|
+
error: "WEXTS_RPC_SERVICE_NOT_FOUND"
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const method = service.methods.find((candidate) => candidate.name === request.params.method);
|
|
23
|
+
if (!method) {
|
|
24
|
+
reply.status(404);
|
|
25
|
+
return {
|
|
26
|
+
error: "WEXTS_RPC_METHOD_NOT_FOUND"
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (method.requireAuth || service.requireAuth) {
|
|
30
|
+
const authorized = await options.authorize?.(request, service, method.name);
|
|
31
|
+
if (!authorized) {
|
|
32
|
+
reply.status(401);
|
|
33
|
+
return {
|
|
34
|
+
error: "WEXTS_RPC_AUTH_REQUIRED"
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const instance = options.services[service.name];
|
|
39
|
+
const handler = instance?.[method.handlerName];
|
|
40
|
+
if (!handler) {
|
|
41
|
+
reply.status(500);
|
|
42
|
+
return {
|
|
43
|
+
error: "WEXTS_RPC_HANDLER_NOT_BOUND"
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const args = Array.isArray(request.body?.args) ? request.body.args : [];
|
|
47
|
+
const data = await handler.apply(instance, args);
|
|
48
|
+
return {
|
|
49
|
+
data
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
__name(registerRpcRoutes, "registerRpcRoutes");
|
|
54
|
+
|
|
55
|
+
// src/runtime/server.ts
|
|
56
|
+
import * as fs from "fs";
|
|
57
|
+
import * as path from "path";
|
|
58
|
+
import Fastify from "fastify";
|
|
59
|
+
import { registerWextsShield } from "@wexts/security";
|
|
60
|
+
async function createWextsRuntimeServer(config = {}) {
|
|
61
|
+
const rootDir = path.resolve(config.rootDir ?? process.cwd());
|
|
62
|
+
const fastify = Fastify({
|
|
63
|
+
logger: config.logger ?? true,
|
|
64
|
+
bodyLimit: config.security?.bodyLimitBytes ?? 1048576,
|
|
65
|
+
requestTimeout: config.security?.requestTimeoutMs ?? 3e4
|
|
66
|
+
});
|
|
67
|
+
const manifest = config.rpcManifest ?? loadJson(rootDir, config.rpcManifestPath);
|
|
68
|
+
const routePolicies = [
|
|
69
|
+
...config.security?.routePolicies ?? [],
|
|
70
|
+
...rpcPoliciesFromManifest(manifest)
|
|
71
|
+
];
|
|
72
|
+
await registerWextsShield(fastify, {
|
|
73
|
+
...config.security,
|
|
74
|
+
routePolicies
|
|
75
|
+
});
|
|
76
|
+
fastify.get("/health", async () => ({
|
|
77
|
+
ok: true,
|
|
78
|
+
runtime: "wexts"
|
|
79
|
+
}));
|
|
80
|
+
fastify.get("/api/health", async () => ({
|
|
81
|
+
ok: true,
|
|
82
|
+
runtime: "wexts",
|
|
83
|
+
scope: "api"
|
|
84
|
+
}));
|
|
85
|
+
if (manifest && config.rpcServices) {
|
|
86
|
+
await registerRpcRoutes(fastify, {
|
|
87
|
+
manifest,
|
|
88
|
+
services: config.rpcServices,
|
|
89
|
+
authorize: /* @__PURE__ */ __name((request) => Boolean(request.headers.authorization || request.headers.cookie), "authorize")
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (config.nestAppModule || config.nestAppModulePath) {
|
|
93
|
+
await mountNest(fastify, rootDir, config);
|
|
94
|
+
}
|
|
95
|
+
if (config.nextDir) {
|
|
96
|
+
await mountNext(fastify, rootDir, config);
|
|
97
|
+
}
|
|
98
|
+
const start = /* @__PURE__ */ __name(async () => {
|
|
99
|
+
await fastify.listen({
|
|
100
|
+
port: config.port ?? Number(process.env.PORT ?? 3e3),
|
|
101
|
+
host: config.host ?? "0.0.0.0"
|
|
102
|
+
});
|
|
103
|
+
}, "start");
|
|
104
|
+
const close = /* @__PURE__ */ __name(async () => {
|
|
105
|
+
await fastify.close();
|
|
106
|
+
}, "close");
|
|
107
|
+
registerShutdown(close);
|
|
108
|
+
return {
|
|
109
|
+
fastify,
|
|
110
|
+
start,
|
|
111
|
+
close
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
__name(createWextsRuntimeServer, "createWextsRuntimeServer");
|
|
115
|
+
async function startWextsRuntime(config = {}) {
|
|
116
|
+
const server = await createWextsRuntimeServer(config);
|
|
117
|
+
await server.start();
|
|
118
|
+
return server;
|
|
119
|
+
}
|
|
120
|
+
__name(startWextsRuntime, "startWextsRuntime");
|
|
121
|
+
function rpcPoliciesFromManifest(manifest) {
|
|
122
|
+
if (!manifest) return [];
|
|
123
|
+
return manifest.services.flatMap((service) => service.methods.map((method) => ({
|
|
124
|
+
path: `/rpc/${service.name}/${method.name}`,
|
|
125
|
+
methods: [
|
|
126
|
+
"POST"
|
|
127
|
+
],
|
|
128
|
+
mode: service.requireAuth || method.requireAuth ? "requireAuth" : "public"
|
|
129
|
+
})));
|
|
130
|
+
}
|
|
131
|
+
__name(rpcPoliciesFromManifest, "rpcPoliciesFromManifest");
|
|
132
|
+
function loadJson(rootDir, filePath) {
|
|
133
|
+
if (!filePath) return void 0;
|
|
134
|
+
const absolutePath = path.isAbsolute(filePath) ? filePath : path.join(rootDir, filePath);
|
|
135
|
+
if (!fs.existsSync(absolutePath)) return void 0;
|
|
136
|
+
return JSON.parse(fs.readFileSync(absolutePath, "utf8"));
|
|
137
|
+
}
|
|
138
|
+
__name(loadJson, "loadJson");
|
|
139
|
+
async function mountNest(fastify, rootDir, config) {
|
|
140
|
+
const [{ NestFactory }, { FastifyAdapter }] = await Promise.all([
|
|
141
|
+
import("@nestjs/core"),
|
|
142
|
+
import("@nestjs/platform-fastify")
|
|
143
|
+
]);
|
|
144
|
+
const AppModule = config.nestAppModule ?? await importModule(rootDir, config.nestAppModulePath);
|
|
145
|
+
const moduleValue = AppModule.AppModule ?? AppModule;
|
|
146
|
+
const nestApp = await NestFactory.create(moduleValue, new FastifyAdapter(fastify), {
|
|
147
|
+
logger: config.dev ? [
|
|
148
|
+
"log",
|
|
149
|
+
"error",
|
|
150
|
+
"warn"
|
|
151
|
+
] : [
|
|
152
|
+
"error",
|
|
153
|
+
"warn"
|
|
154
|
+
]
|
|
155
|
+
});
|
|
156
|
+
nestApp.setGlobalPrefix("api");
|
|
157
|
+
await nestApp.init();
|
|
158
|
+
}
|
|
159
|
+
__name(mountNest, "mountNest");
|
|
160
|
+
async function mountNext(fastify, rootDir, config) {
|
|
161
|
+
const nextModule = await import("next");
|
|
162
|
+
const next = nextModule.default;
|
|
163
|
+
if (!next) {
|
|
164
|
+
throw new WextsRuntimeError({
|
|
165
|
+
code: "WEXTS_RUNTIME_NEXT_MISSING",
|
|
166
|
+
message: "Next.js could not be loaded. Install next or omit nextDir.",
|
|
167
|
+
suggestedFix: "Install `next` in the application or remove `nextDir` from wexts.runtime.js.",
|
|
168
|
+
docsSlug: "runtime"
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
const nextApp = next({
|
|
172
|
+
dev: config.dev ?? process.env.NODE_ENV !== "production",
|
|
173
|
+
dir: path.isAbsolute(config.nextDir) ? config.nextDir : path.join(rootDir, config.nextDir)
|
|
174
|
+
});
|
|
175
|
+
await nextApp.prepare();
|
|
176
|
+
const handler = nextApp.getRequestHandler();
|
|
177
|
+
fastify.all("/*", async (request, reply) => {
|
|
178
|
+
await handler(request.raw, reply.raw);
|
|
179
|
+
reply.hijack();
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
__name(mountNext, "mountNext");
|
|
183
|
+
async function importModule(rootDir, modulePath) {
|
|
184
|
+
const absolutePath = path.isAbsolute(modulePath) ? modulePath : path.join(rootDir, modulePath);
|
|
185
|
+
return import(pathToFileUrl(absolutePath));
|
|
186
|
+
}
|
|
187
|
+
__name(importModule, "importModule");
|
|
188
|
+
function pathToFileUrl(filePath) {
|
|
189
|
+
return `file://${filePath}`;
|
|
190
|
+
}
|
|
191
|
+
__name(pathToFileUrl, "pathToFileUrl");
|
|
192
|
+
function registerShutdown(close) {
|
|
193
|
+
const handler = /* @__PURE__ */ __name(async () => {
|
|
194
|
+
await close();
|
|
195
|
+
process.exit(0);
|
|
196
|
+
}, "handler");
|
|
197
|
+
process.once("SIGINT", handler);
|
|
198
|
+
process.once("SIGTERM", handler);
|
|
199
|
+
}
|
|
200
|
+
__name(registerShutdown, "registerShutdown");
|
|
201
|
+
|
|
202
|
+
// src/runtime/vercel-handler.ts
|
|
203
|
+
async function createWextsHandler(config = {}) {
|
|
204
|
+
const server = await createWextsRuntimeServer({
|
|
205
|
+
...config,
|
|
206
|
+
// Serverless does not use long-lived logging
|
|
207
|
+
logger: config.logger ?? false
|
|
208
|
+
});
|
|
209
|
+
await server.fastify.ready();
|
|
210
|
+
return (req, res) => {
|
|
211
|
+
server.fastify.server.emit("request", req, res);
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
__name(createWextsHandler, "createWextsHandler");
|
|
215
|
+
|
|
216
|
+
export {
|
|
217
|
+
registerRpcRoutes,
|
|
218
|
+
createWextsRuntimeServer,
|
|
219
|
+
startWextsRuntime,
|
|
220
|
+
createWextsHandler
|
|
221
|
+
};
|
|
222
|
+
//# sourceMappingURL=chunk-27NEYQD2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/rpc-router.ts","../src/runtime/server.ts","../src/runtime/vercel-handler.ts"],"sourcesContent":["import type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';\nimport type { RpcManifest, RpcServiceManifest } from '../rpc/types';\n\nexport type RpcServiceInstances = Record<string, Record<string, (...args: unknown[]) => unknown | Promise<unknown>>>;\n\nexport interface RegisterRpcRoutesOptions {\n manifest: RpcManifest;\n services: RpcServiceInstances;\n authorize?: (request: FastifyRequest, service: RpcServiceManifest, methodName: string) => boolean | Promise<boolean>;\n}\n\nexport async function registerRpcRoutes(fastify: FastifyInstance, options: RegisterRpcRoutesOptions): Promise<void> {\n const serviceMap = new Map(options.manifest.services.map((service) => [service.name, service]));\n\n fastify.post('/rpc/:service/:method', async (request: FastifyRequest<{\n Params: { service: string; method: string };\n Body: { args?: unknown[] };\n }>, reply: FastifyReply) => {\n const service = serviceMap.get(request.params.service);\n if (!service) {\n reply.status(404);\n return { error: 'WEXTS_RPC_SERVICE_NOT_FOUND' };\n }\n\n const method = service.methods.find((candidate) => candidate.name === request.params.method);\n if (!method) {\n reply.status(404);\n return { error: 'WEXTS_RPC_METHOD_NOT_FOUND' };\n }\n\n if (method.requireAuth || service.requireAuth) {\n const authorized = await options.authorize?.(request, service, method.name);\n if (!authorized) {\n reply.status(401);\n return { error: 'WEXTS_RPC_AUTH_REQUIRED' };\n }\n }\n\n const instance = options.services[service.name];\n const handler = instance?.[method.handlerName];\n if (!handler) {\n reply.status(500);\n return { error: 'WEXTS_RPC_HANDLER_NOT_BOUND' };\n }\n\n const args = Array.isArray(request.body?.args) ? request.body.args : [];\n const data = await handler.apply(instance, args);\n return { data };\n });\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport Fastify, { FastifyInstance, FastifyServerOptions } from 'fastify';\nimport { registerWextsShield, type WextsShieldConfig, type WextsShieldRoutePolicy } from '@wexts/security';\nimport type { RpcManifest } from '../rpc/types';\nimport { registerRpcRoutes, type RpcServiceInstances } from './rpc-router';\nimport { WextsRuntimeError } from '../errors';\n\nexport interface WextsRuntimeConfig {\n rootDir?: string;\n port?: number;\n host?: string;\n dev?: boolean;\n nextDir?: string;\n nestAppModule?: unknown;\n nestAppModulePath?: string;\n rpcManifest?: RpcManifest;\n rpcManifestPath?: string;\n rpcServices?: RpcServiceInstances;\n security?: WextsShieldConfig;\n logger?: FastifyServerOptions['logger'];\n}\n\nexport interface WextsRuntimeServer {\n fastify: FastifyInstance;\n start: () => Promise<void>;\n close: () => Promise<void>;\n}\n\nexport async function createWextsRuntimeServer(config: WextsRuntimeConfig = {}): Promise<WextsRuntimeServer> {\n const rootDir = path.resolve(config.rootDir ?? process.cwd());\n const fastify = Fastify({\n logger: config.logger ?? true,\n bodyLimit: config.security?.bodyLimitBytes ?? 1_048_576,\n requestTimeout: config.security?.requestTimeoutMs ?? 30_000,\n });\n\n const manifest = config.rpcManifest ?? loadJson<RpcManifest>(rootDir, config.rpcManifestPath);\n const routePolicies = [\n ...(config.security?.routePolicies ?? []),\n ...rpcPoliciesFromManifest(manifest),\n ];\n\n await registerWextsShield(fastify, {\n ...config.security,\n routePolicies,\n });\n\n fastify.get('/health', async () => ({\n ok: true,\n runtime: 'wexts',\n }));\n\n fastify.get('/api/health', async () => ({\n ok: true,\n runtime: 'wexts',\n scope: 'api',\n }));\n\n if (manifest && config.rpcServices) {\n await registerRpcRoutes(fastify, {\n manifest,\n services: config.rpcServices,\n authorize: (request) => Boolean(request.headers.authorization || request.headers.cookie),\n });\n }\n\n if (config.nestAppModule || config.nestAppModulePath) {\n await mountNest(fastify, rootDir, config);\n }\n\n if (config.nextDir) {\n await mountNext(fastify, rootDir, config);\n }\n\n const start = async () => {\n await fastify.listen({\n port: config.port ?? Number(process.env.PORT ?? 3000),\n host: config.host ?? '0.0.0.0',\n });\n };\n\n const close = async () => {\n await fastify.close();\n };\n\n registerShutdown(close);\n\n return {\n fastify,\n start,\n close,\n };\n}\n\nexport async function startWextsRuntime(config: WextsRuntimeConfig = {}): Promise<WextsRuntimeServer> {\n const server = await createWextsRuntimeServer(config);\n await server.start();\n return server;\n}\n\nfunction rpcPoliciesFromManifest(manifest?: RpcManifest): WextsShieldRoutePolicy[] {\n if (!manifest) return [];\n\n return manifest.services.flatMap((service) => service.methods.map((method) => ({\n path: `/rpc/${service.name}/${method.name}`,\n methods: ['POST'],\n mode: service.requireAuth || method.requireAuth ? 'requireAuth' : 'public',\n })));\n}\n\nfunction loadJson<T>(rootDir: string, filePath?: string): T | undefined {\n if (!filePath) return undefined;\n\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.join(rootDir, filePath);\n if (!fs.existsSync(absolutePath)) return undefined;\n return JSON.parse(fs.readFileSync(absolutePath, 'utf8')) as T;\n}\n\nasync function mountNest(fastify: FastifyInstance, rootDir: string, config: WextsRuntimeConfig): Promise<void> {\n const [{ NestFactory }, { FastifyAdapter }] = await Promise.all([\n import('@nestjs/core'),\n import('@nestjs/platform-fastify'),\n ]);\n const AppModule = config.nestAppModule ?? await importModule(rootDir, config.nestAppModulePath!);\n const moduleValue = (AppModule as { AppModule?: unknown }).AppModule ?? AppModule;\n const nestApp = await NestFactory.create(moduleValue as never, new FastifyAdapter(fastify as never), {\n logger: config.dev ? ['log', 'error', 'warn'] : ['error', 'warn'],\n });\n nestApp.setGlobalPrefix('api');\n await nestApp.init();\n}\n\nasync function mountNext(fastify: FastifyInstance, rootDir: string, config: WextsRuntimeConfig): Promise<void> {\n const nextModule = await import('next') as unknown as { default?: (options: unknown) => { prepare: () => Promise<void>; getRequestHandler: () => (req: unknown, res: unknown) => Promise<void> } };\n const next = nextModule.default;\n if (!next) {\n throw new WextsRuntimeError({\n code: 'WEXTS_RUNTIME_NEXT_MISSING',\n message: 'Next.js could not be loaded. Install next or omit nextDir.',\n suggestedFix: 'Install `next` in the application or remove `nextDir` from wexts.runtime.js.',\n docsSlug: 'runtime',\n });\n }\n const nextApp = next({\n dev: config.dev ?? process.env.NODE_ENV !== 'production',\n dir: path.isAbsolute(config.nextDir!) ? config.nextDir : path.join(rootDir, config.nextDir!),\n });\n await nextApp.prepare();\n const handler = nextApp.getRequestHandler();\n\n fastify.all('/*', async (request, reply) => {\n await handler(request.raw, reply.raw);\n reply.hijack();\n });\n}\n\nasync function importModule(rootDir: string, modulePath: string): Promise<unknown> {\n const absolutePath = path.isAbsolute(modulePath) ? modulePath : path.join(rootDir, modulePath);\n return import(pathToFileUrl(absolutePath));\n}\n\nfunction pathToFileUrl(filePath: string): string {\n return `file://${filePath}`;\n}\n\nfunction registerShutdown(close: () => Promise<void>): void {\n const handler = async () => {\n await close();\n process.exit(0);\n };\n\n process.once('SIGINT', handler);\n process.once('SIGTERM', handler);\n}\n","/**\n * Vercel / serverless handler adapter for the Wexts runtime.\n *\n * Creates a standard Node.js (req, res) handler that delegates to the\n * Fastify-backed Wexts runtime **without** calling fastify.listen().\n *\n * Usage:\n * const handler = await createWextsHandler({ ... });\n * export default handler; // Vercel function entry\n */\n\nimport type { IncomingMessage, ServerResponse } from 'http';\nimport type { WextsRuntimeConfig } from './server';\nimport { createWextsRuntimeServer } from './server';\n\nexport type WextsHandler = (req: IncomingMessage, res: ServerResponse) => void;\n\n/**\n * Build a serverless-compatible handler from the Wexts runtime.\n * The returned function accepts Node http (req, res) and passes them\n * into the Fastify instance without ever calling listen().\n */\nexport async function createWextsHandler(\n config: WextsRuntimeConfig = {},\n): Promise<WextsHandler> {\n const server = await createWextsRuntimeServer({\n ...config,\n // Serverless does not use long-lived logging\n logger: config.logger ?? false,\n });\n\n // Fastify exposes a raw Node handler via server.server (the http.Server)\n // But we need to call .ready() first so all plugins are loaded.\n await server.fastify.ready();\n\n return (req: IncomingMessage, res: ServerResponse) => {\n server.fastify.server.emit('request', req, res);\n };\n}\n"],"mappings":"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","names":["registerRpcRoutes","fastify","options","serviceMap","Map","manifest","services","map","service","name","post","request","reply","get","params","status","error","method","methods","find","candidate","requireAuth","authorized","authorize","instance","handler","handlerName","args","Array","isArray","body","data","apply","fs","path","Fastify","registerWextsShield","createWextsRuntimeServer","config","rootDir","resolve","process","cwd","fastify","Fastify","logger","bodyLimit","security","bodyLimitBytes","requestTimeout","requestTimeoutMs","manifest","rpcManifest","loadJson","rpcManifestPath","routePolicies","rpcPoliciesFromManifest","registerWextsShield","get","ok","runtime","scope","rpcServices","registerRpcRoutes","services","authorize","request","Boolean","headers","authorization","cookie","nestAppModule","nestAppModulePath","mountNest","nextDir","mountNext","start","listen","port","Number","env","PORT","host","close","registerShutdown","startWextsRuntime","server","flatMap","service","methods","map","method","path","name","mode","requireAuth","filePath","undefined","absolutePath","isAbsolute","join","existsSync","JSON","parse","readFileSync","NestFactory","FastifyAdapter","Promise","all","AppModule","importModule","moduleValue","nestApp","create","dev","setGlobalPrefix","init","nextModule","next","default","WextsRuntimeError","code","message","suggestedFix","docsSlug","nextApp","NODE_ENV","dir","prepare","handler","getRequestHandler","reply","raw","hijack","modulePath","pathToFileUrl","exit","once","createWextsHandler","config","server","createWextsRuntimeServer","logger","fastify","ready","req","res","emit"]}
|
|
@@ -1,6 +1,87 @@
|
|
|
1
1
|
import {
|
|
2
|
+
__export,
|
|
2
3
|
__name
|
|
3
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-L77ANWWT.mjs";
|
|
5
|
+
|
|
6
|
+
// src/nest/index.ts
|
|
7
|
+
var nest_exports = {};
|
|
8
|
+
__export(nest_exports, {
|
|
9
|
+
FusionController: () => FusionController,
|
|
10
|
+
FusionDelete: () => FusionDelete,
|
|
11
|
+
FusionGet: () => FusionGet,
|
|
12
|
+
FusionPost: () => FusionPost,
|
|
13
|
+
FusionPut: () => FusionPut,
|
|
14
|
+
FusionRoute: () => FusionRoute,
|
|
15
|
+
RequireAuth: () => RequireAuth,
|
|
16
|
+
RpcMethod: () => RpcMethod,
|
|
17
|
+
RpcService: () => RpcService,
|
|
18
|
+
WextsRpc: () => WextsRpc,
|
|
19
|
+
WextsRpcService: () => WextsRpcService,
|
|
20
|
+
getFusionMetadata: () => getFusionMetadata,
|
|
21
|
+
getRpcAuthPolicy: () => getRpcAuthPolicy,
|
|
22
|
+
getRuntimeRpcMethodsMetadata: () => getRuntimeRpcMethodsMetadata,
|
|
23
|
+
getRuntimeRpcServiceMetadata: () => getRuntimeRpcServiceMetadata
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// src/nest/decorators.ts
|
|
27
|
+
import "reflect-metadata";
|
|
28
|
+
var FUSION_METADATA_KEY = "fusion:routes";
|
|
29
|
+
function FusionController(prefix = "") {
|
|
30
|
+
return function(target) {
|
|
31
|
+
Reflect.defineMetadata("fusion:controller", {
|
|
32
|
+
prefix
|
|
33
|
+
}, target);
|
|
34
|
+
return target;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
__name(FusionController, "FusionController");
|
|
38
|
+
function FusionRoute(metadata) {
|
|
39
|
+
return function(target, propertyKey, descriptor) {
|
|
40
|
+
const routes = Reflect.getMetadata(FUSION_METADATA_KEY, target.constructor) || [];
|
|
41
|
+
routes.push({
|
|
42
|
+
...metadata,
|
|
43
|
+
handler: propertyKey
|
|
44
|
+
});
|
|
45
|
+
Reflect.defineMetadata(FUSION_METADATA_KEY, routes, target.constructor);
|
|
46
|
+
return descriptor;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
__name(FusionRoute, "FusionRoute");
|
|
50
|
+
function FusionGet(path = "") {
|
|
51
|
+
return FusionRoute({
|
|
52
|
+
method: "GET",
|
|
53
|
+
path
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
__name(FusionGet, "FusionGet");
|
|
57
|
+
function FusionPost(path = "") {
|
|
58
|
+
return FusionRoute({
|
|
59
|
+
method: "POST",
|
|
60
|
+
path
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
__name(FusionPost, "FusionPost");
|
|
64
|
+
function FusionPut(path = "") {
|
|
65
|
+
return FusionRoute({
|
|
66
|
+
method: "PUT",
|
|
67
|
+
path
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
__name(FusionPut, "FusionPut");
|
|
71
|
+
function FusionDelete(path = "") {
|
|
72
|
+
return FusionRoute({
|
|
73
|
+
method: "DELETE",
|
|
74
|
+
path
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
__name(FusionDelete, "FusionDelete");
|
|
78
|
+
function getFusionMetadata(controller) {
|
|
79
|
+
return {
|
|
80
|
+
controller: Reflect.getMetadata("fusion:controller", controller),
|
|
81
|
+
routes: Reflect.getMetadata(FUSION_METADATA_KEY, controller) || []
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
__name(getFusionMetadata, "getFusionMetadata");
|
|
4
85
|
|
|
5
86
|
// src/rpc/decorators.ts
|
|
6
87
|
import "reflect-metadata";
|
|
@@ -82,6 +163,13 @@ function normalizeMethodOptions(input) {
|
|
|
82
163
|
__name(normalizeMethodOptions, "normalizeMethodOptions");
|
|
83
164
|
|
|
84
165
|
export {
|
|
166
|
+
FusionController,
|
|
167
|
+
FusionRoute,
|
|
168
|
+
FusionGet,
|
|
169
|
+
FusionPost,
|
|
170
|
+
FusionPut,
|
|
171
|
+
FusionDelete,
|
|
172
|
+
getFusionMetadata,
|
|
85
173
|
RpcService,
|
|
86
174
|
RpcMethod,
|
|
87
175
|
RequireAuth,
|
|
@@ -89,6 +177,7 @@ export {
|
|
|
89
177
|
getRuntimeRpcMethodsMetadata,
|
|
90
178
|
getRpcAuthPolicy,
|
|
91
179
|
WextsRpcService,
|
|
92
|
-
WextsRpc
|
|
180
|
+
WextsRpc,
|
|
181
|
+
nest_exports
|
|
93
182
|
};
|
|
94
|
-
//# sourceMappingURL=chunk-
|
|
183
|
+
//# sourceMappingURL=chunk-5DBFN65W.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nest/index.ts","../src/nest/decorators.ts","../src/rpc/decorators.ts"],"sourcesContent":["export * from './decorators';\nexport * from '../rpc/decorators';\n","// NestJS Integration - Decorators for wexts\n// These decorators add metadata for auto API client generation\n\nimport 'reflect-metadata';\n\nexport interface FusionRouteMetadata {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n responseType?: string;\n requestType?: string;\n}\n\nconst FUSION_METADATA_KEY = 'fusion:routes';\n\n/**\n * Mark a NestJS controller for Fusion codegen\n * Usage: @FusionController('users')\n */\nexport function FusionController(prefix: string = ''): ClassDecorator {\n return function (target: any) {\n Reflect.defineMetadata('fusion:controller', { prefix }, target);\n return target;\n };\n}\n\n/**\n * Mark a route for API client generation\n * Usage: @FusionRoute({ method: 'GET', path: '/:id' })\n */\nexport function FusionRoute(metadata: FusionRouteMetadata): MethodDecorator {\n return function (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\n const routes = Reflect.getMetadata(FUSION_METADATA_KEY, target.constructor) || [];\n routes.push({\n ...metadata,\n handler: propertyKey,\n });\n Reflect.defineMetadata(FUSION_METADATA_KEY, routes, target.constructor);\n return descriptor;\n };\n}\n\n/**\n * Helper decorators for common HTTP methods\n */\nexport function FusionGet(path: string = ''): MethodDecorator {\n return FusionRoute({ method: 'GET', path });\n}\n\nexport function FusionPost(path: string = ''): MethodDecorator {\n return FusionRoute({ method: 'POST', path });\n}\n\nexport function FusionPut(path: string = ''): MethodDecorator {\n return FusionRoute({ method: 'PUT', path });\n}\n\nexport function FusionDelete(path: string = ''): MethodDecorator {\n return FusionRoute({ method: 'DELETE', path });\n}\n\n/**\n * Get Fusion metadata from a controller\n */\nexport function getFusionMetadata(controller: any): {\n controller: any;\n routes: any[];\n} {\n return {\n controller: Reflect.getMetadata('fusion:controller', controller),\n routes: Reflect.getMetadata(FUSION_METADATA_KEY, controller) || [],\n };\n}\n","import 'reflect-metadata';\nimport type { RpcAuthPolicy } from './types';\n\nconst RPC_SERVICE_KEY = 'wexts:rpc:service';\nconst RPC_METHODS_KEY = 'wexts:rpc:methods';\n\nexport interface RpcServiceOptions {\n name?: string;\n requireAuth?: boolean;\n}\n\nexport interface RpcMethodOptions {\n name?: string;\n requireAuth?: boolean;\n}\n\nexport interface RuntimeRpcServiceMetadata {\n name?: string;\n requireAuth: boolean;\n}\n\nexport interface RuntimeRpcMethodMetadata {\n propertyKey: string | symbol;\n name?: string;\n requireAuth?: boolean;\n}\n\nexport function RpcService(nameOrOptions?: string | RpcServiceOptions): ClassDecorator {\n const options = normalizeServiceOptions(nameOrOptions);\n\n return (target) => {\n Reflect.defineMetadata(RPC_SERVICE_KEY, options, target);\n return target;\n };\n}\n\nexport function RpcMethod(nameOrOptions?: string | RpcMethodOptions): MethodDecorator {\n const options = normalizeMethodOptions(nameOrOptions);\n\n return (target, propertyKey) => {\n const constructor = target.constructor;\n const methods: RuntimeRpcMethodMetadata[] = Reflect.getMetadata(RPC_METHODS_KEY, constructor) || [];\n const nextMethods = methods.filter((method) => method.propertyKey !== propertyKey);\n nextMethods.push({ propertyKey, ...options });\n Reflect.defineMetadata(RPC_METHODS_KEY, nextMethods, constructor);\n };\n}\n\nexport function RequireAuth(): MethodDecorator & ClassDecorator {\n return (target: object, propertyKey?: string | symbol) => {\n if (propertyKey) {\n RpcMethod({ requireAuth: true })(target, propertyKey, Object.getOwnPropertyDescriptor(target, propertyKey)!);\n return;\n }\n\n const existing = getRuntimeRpcServiceMetadata(target as Function);\n Reflect.defineMetadata(RPC_SERVICE_KEY, { ...existing, requireAuth: true }, target);\n };\n}\n\nexport function getRuntimeRpcServiceMetadata(target: Function): RuntimeRpcServiceMetadata | undefined {\n return Reflect.getMetadata(RPC_SERVICE_KEY, target);\n}\n\nexport function getRuntimeRpcMethodsMetadata(target: Function): RuntimeRpcMethodMetadata[] {\n return Reflect.getMetadata(RPC_METHODS_KEY, target) || [];\n}\n\nexport function getRpcAuthPolicy(requireAuth?: boolean): RpcAuthPolicy {\n return requireAuth ? 'required' : 'public';\n}\n\nexport const WextsRpcService = RpcService;\nexport const WextsRpc = RpcMethod;\n\nfunction normalizeServiceOptions(input?: string | RpcServiceOptions): RuntimeRpcServiceMetadata {\n if (typeof input === 'string') {\n return { name: input, requireAuth: false };\n }\n\n return {\n name: input?.name,\n requireAuth: input?.requireAuth ?? true,\n };\n}\n\nfunction normalizeMethodOptions(input?: string | RpcMethodOptions): RpcMethodOptions {\n if (typeof input === 'string') {\n return { name: input };\n }\n\n return input ?? {};\n}\n"],"mappings":"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","names":["FUSION_METADATA_KEY","FusionController","prefix","target","Reflect","defineMetadata","FusionRoute","metadata","propertyKey","descriptor","routes","getMetadata","push","handler","FusionGet","path","method","FusionPost","FusionPut","FusionDelete","getFusionMetadata","controller","RPC_SERVICE_KEY","RPC_METHODS_KEY","RpcService","nameOrOptions","options","normalizeServiceOptions","target","Reflect","defineMetadata","RpcMethod","normalizeMethodOptions","propertyKey","constructor","methods","getMetadata","nextMethods","filter","method","push","RequireAuth","requireAuth","Object","getOwnPropertyDescriptor","existing","getRuntimeRpcServiceMetadata","getRuntimeRpcMethodsMetadata","getRpcAuthPolicy","WextsRpcService","WextsRpc","input","name"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkAVMQJWYDjs = require('./chunk-AVMQJWYD.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkWCKSKU3Cjs = require('./chunk-WCKSKU3C.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
@@ -501,4 +501,4 @@ var CodegenWatcher = (_class = class {constructor() { _class.prototype.__init.ca
|
|
|
501
501
|
|
|
502
502
|
|
|
503
503
|
exports.FileSystem = FileSystem; exports.filesystem = filesystem; exports.NestJSParser = NestJSParser; exports.ClientGenerator = ClientGenerator; exports.generateRpcClient = generateRpcClient; exports.CodegenWatcher = CodegenWatcher; exports.codegen_exports = codegen_exports;
|
|
504
|
-
//# sourceMappingURL=chunk-
|
|
504
|
+
//# sourceMappingURL=chunk-75HBI2XG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Volumes/Projects/wexts/packages/dist/chunk-7HNQWJWV.js","../src/codegen/index.ts","../src/codegen/parser.ts","../src/core/filesystem.ts","../src/codegen/generator.ts","../src/codegen/watcher.ts"],"names":["RPC_SERVICE_DECORATORS","Set","RPC_METHOD_DECORATORS","REQUIRE_AUTH_DECORATORS","NestJSParser","program","projectPath","configPath","findConfigFile","sys","fileExists","Error","config","readConfigFile","readFile","parsedConfig","parseJsonConfigFileContent","dirname","createProgram","fileNames","options","findFusionControllers","controllers","sourceFiles","getSourceFiles","sourceFile","fileName","includes","fileControllers","parseSourceFile","push","findRpcManifest","services","endsWith","parseRpcServices","sort","a","b","name","localeCompare","service","methods","length","schemaVersion","ts","forEachChild","node","isClassDeclaration","controllerInfo","parseController","classNode","decorators","getDecorators","controllerPrefix","isFusionController","decorator","expr","expression","isCallExpression","isIdentifier","decoratorName","text","arguments","arg","isStringLiteral","routes","parseRoutes","className","prefix","map","r","controllerName","members","forEach","member","isMethodDeclaration","method","routePath","handlerName","path","handler","rootDir","resolve","serviceDecorator","findDecorator","serviceOptions","readDecoratorOptions","classRequiresAuth","requireAuth","hasDecorator","serviceName","toStableServiceName","parseRpcMethods","importPath","toPosixPath","relative","replace","methodDecorator","methodOptions","parameters","parameter","parseParameter","returnType","type","getNodeText","getText","optional","Boolean","questionToken","initializer","names","undefined","find","getDecoratorName","has","firstArg","isObjectLiteralExpression","result","property","properties","isPropertyAssignment","kind","SyntaxKind","TrueKeyword","FalseKeyword","withoutSuffix","charAt","toLowerCase","slice","filePath","split","sep","join","posix","getStart","getEnd","promisify","writeFile","mkdir","access","FileSystem","encoding","content","ensureDir","readJSON","JSON","parse","writeJSON","data","pretty","stringify","exists","constants","F_OK","dirPath","recursive","copyFile","src","dest","readDir","readdir","filesystem","ClientGenerator","generate","manifest","outputPath","manifestFileName","clientFileName","WextsCodegenError","code","message","suggestedFix","docsSlug","sortedManifest","sortManifest","clientCode","generateRpcClientCode","indexCode","manifestJson","generateClientInterface","generateServiceInterface","parametersToSignature","normalizeReturnType","generateRpcClient","CodegenWatcher","error"],"mappings":"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","file":"/Volumes/Projects/wexts/packages/dist/chunk-7HNQWJWV.js","sourcesContent":[null,"export * from './parser';\nexport * from './generator';\nexport * from './watcher';\n","import * as path from 'path';\nimport * as ts from 'typescript';\nimport type {\n RpcManifest,\n RpcMethodManifest,\n RpcParameterManifest,\n RpcServiceManifest,\n} from '../rpc/types';\n\nexport interface RouteInfo {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n handler: string;\n controllerName: string;\n}\n\nexport interface ControllerInfo {\n name: string;\n prefix: string;\n routes: RouteInfo[];\n}\n\nconst RPC_SERVICE_DECORATORS = new Set(['RpcService', 'WextsRpcService']);\nconst RPC_METHOD_DECORATORS = new Set(['RpcMethod', 'WextsRpc']);\nconst REQUIRE_AUTH_DECORATORS = new Set(['RequireAuth']);\n\n/**\n * Parse NestJS controllers to extract Fusion metadata\n */\nexport class NestJSParser {\n private program: ts.Program;\n\n constructor(private projectPath: string) {\n const configPath = ts.findConfigFile(projectPath, ts.sys.fileExists, 'tsconfig.json');\n if (!configPath) {\n throw new Error('tsconfig.json not found');\n }\n\n const config = ts.readConfigFile(configPath, ts.sys.readFile);\n const parsedConfig = ts.parseJsonConfigFileContent(\n config.config,\n ts.sys,\n path.dirname(configPath)\n );\n\n this.program = ts.createProgram(parsedConfig.fileNames, parsedConfig.options);\n }\n\n /**\n * Find all controllers with @FusionController decorator\n */\n findFusionControllers(): ControllerInfo[] {\n const controllers: ControllerInfo[] = [];\n const sourceFiles = this.program.getSourceFiles();\n\n for (const sourceFile of sourceFiles) {\n if (sourceFile.fileName.includes('node_modules')) continue;\n if (!sourceFile.fileName.includes('.controller.ts')) continue;\n\n const fileControllers = this.parseSourceFile(sourceFile);\n controllers.push(...fileControllers);\n }\n\n return controllers;\n }\n\n findRpcManifest(): RpcManifest {\n const services: RpcServiceManifest[] = [];\n\n for (const sourceFile of this.program.getSourceFiles()) {\n if (sourceFile.fileName.includes('node_modules')) continue;\n if (!sourceFile.fileName.endsWith('.ts')) continue;\n if (sourceFile.fileName.endsWith('.d.ts')) continue;\n\n services.push(...this.parseRpcServices(sourceFile));\n }\n\n services.sort((a, b) => a.name.localeCompare(b.name));\n for (const service of services) {\n service.methods.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n if (services.length === 0) {\n return {\n schemaVersion: 1,\n services,\n };\n }\n\n return {\n schemaVersion: 1,\n services,\n };\n }\n\n private parseSourceFile(sourceFile: ts.SourceFile): ControllerInfo[] {\n const controllers: ControllerInfo[] = [];\n\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isClassDeclaration(node) && node.name) {\n const controllerInfo = this.parseController(node);\n if (controllerInfo) {\n controllers.push(controllerInfo);\n }\n }\n });\n\n return controllers;\n }\n\n private parseController(classNode: ts.ClassDeclaration): ControllerInfo | null {\n const decorators = ts.getDecorators(classNode);\n if (!decorators) return null;\n\n let controllerPrefix = '';\n let isFusionController = false;\n\n // Check for @FusionController decorator\n for (const decorator of decorators) {\n const expr = decorator.expression;\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\n const decoratorName = expr.expression.text;\n\n if (decoratorName === 'FusionController') {\n isFusionController = true;\n if (expr.arguments.length > 0) {\n const arg = expr.arguments[0];\n if (ts.isStringLiteral(arg)) {\n controllerPrefix = arg.text;\n }\n }\n }\n }\n }\n\n if (!isFusionController) return null;\n\n const routes = this.parseRoutes(classNode);\n const className = classNode.name?.text || 'Unknown';\n\n return {\n name: className,\n prefix: controllerPrefix,\n routes: routes.map(r => ({ ...r, controllerName: className })),\n };\n }\n\n private parseRoutes(classNode: ts.ClassDeclaration): RouteInfo[] {\n const routes: RouteInfo[] = [];\n\n classNode.members.forEach((member) => {\n if (ts.isMethodDeclaration(member)) {\n const decorators = ts.getDecorators(member);\n if (!decorators) return;\n\n for (const decorator of decorators) {\n const expr = decorator.expression;\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\n const decoratorName = expr.expression.text;\n\n let method: RouteInfo['method'] | null = null;\n let routePath = '';\n\n // Map decorator to HTTP method\n if (decoratorName === 'FusionGet') method = 'GET';\n else if (decoratorName === 'FusionPost') method = 'POST';\n else if (decoratorName === 'FusionPut') method = 'PUT';\n else if (decoratorName === 'FusionDelete') method = 'DELETE';\n\n if (method) {\n // Get route path from decorator argument\n if (expr.arguments.length > 0) {\n const arg = expr.arguments[0];\n if (ts.isStringLiteral(arg)) {\n routePath = arg.text;\n }\n }\n\n const handlerName = (member.name as ts.Identifier).text;\n\n routes.push({\n method,\n path: routePath,\n handler: handlerName,\n controllerName: '', // Will be set by caller\n });\n }\n }\n }\n }\n });\n\n return routes;\n }\n\n private parseRpcServices(sourceFile: ts.SourceFile): RpcServiceManifest[] {\n const services: RpcServiceManifest[] = [];\n const rootDir = path.resolve(this.projectPath);\n\n ts.forEachChild(sourceFile, (node) => {\n if (!ts.isClassDeclaration(node) || !node.name) return;\n\n const serviceDecorator = this.findDecorator(node, RPC_SERVICE_DECORATORS);\n if (!serviceDecorator) return;\n\n const className = node.name.text;\n const serviceOptions = this.readDecoratorOptions(serviceDecorator);\n const classRequiresAuth = serviceOptions.requireAuth || this.hasDecorator(node, REQUIRE_AUTH_DECORATORS);\n const serviceName = serviceOptions.name || toStableServiceName(className);\n const methods = this.parseRpcMethods(node, classRequiresAuth, sourceFile);\n\n if (methods.length === 0) return;\n\n services.push({\n name: serviceName,\n className,\n importPath: toPosixPath(path.relative(rootDir, sourceFile.fileName).replace(/\\.ts$/, '')),\n requireAuth: classRequiresAuth,\n methods,\n });\n });\n\n return services;\n }\n\n private parseRpcMethods(classNode: ts.ClassDeclaration, classRequiresAuth: boolean, sourceFile: ts.SourceFile): RpcMethodManifest[] {\n const methods: RpcMethodManifest[] = [];\n\n for (const member of classNode.members) {\n if (!ts.isMethodDeclaration(member)) continue;\n if (!ts.isIdentifier(member.name)) continue;\n\n const methodDecorator = this.findDecorator(member, RPC_METHOD_DECORATORS);\n if (!methodDecorator) continue;\n\n const handlerName = member.name.text;\n const methodOptions = this.readDecoratorOptions(methodDecorator);\n const requireAuth = classRequiresAuth || methodOptions.requireAuth || this.hasDecorator(member, REQUIRE_AUTH_DECORATORS);\n\n methods.push({\n name: methodOptions.name || handlerName,\n handlerName,\n requireAuth,\n parameters: member.parameters.map((parameter) => this.parseParameter(parameter, sourceFile)),\n returnType: member.type ? getNodeText(member.type, sourceFile) : 'unknown',\n });\n }\n\n return methods;\n }\n\n private parseParameter(parameter: ts.ParameterDeclaration, sourceFile: ts.SourceFile): RpcParameterManifest {\n return {\n name: ts.isIdentifier(parameter.name) ? parameter.name.text : parameter.name.getText(),\n type: parameter.type ? getNodeText(parameter.type, sourceFile) : 'unknown',\n optional: Boolean(parameter.questionToken || parameter.initializer),\n };\n }\n\n private findDecorator(\n node: ts.ClassDeclaration | ts.MethodDeclaration,\n names: Set<string>\n ): ts.Decorator | undefined {\n const decorators = ts.getDecorators(node);\n if (!decorators) return undefined;\n\n return decorators.find((decorator) => {\n const name = getDecoratorName(decorator);\n return Boolean(name && names.has(name));\n });\n }\n\n private hasDecorator(\n node: ts.ClassDeclaration | ts.MethodDeclaration,\n names: Set<string>\n ): boolean {\n return Boolean(this.findDecorator(node, names));\n }\n\n private readDecoratorOptions(decorator: ts.Decorator): { name?: string; requireAuth?: boolean } {\n const expression = decorator.expression;\n if (!ts.isCallExpression(expression)) return {};\n\n const firstArg = expression.arguments[0];\n if (!firstArg) return {};\n\n if (ts.isStringLiteral(firstArg)) {\n return { name: firstArg.text };\n }\n\n if (!ts.isObjectLiteralExpression(firstArg)) return {};\n\n const result: { name?: string; requireAuth?: boolean } = {};\n\n for (const property of firstArg.properties) {\n if (!ts.isPropertyAssignment(property) || !ts.isIdentifier(property.name)) continue;\n\n if (property.name.text === 'name' && ts.isStringLiteral(property.initializer)) {\n result.name = property.initializer.text;\n }\n\n if (property.name.text === 'requireAuth') {\n if (property.initializer.kind === ts.SyntaxKind.TrueKeyword) {\n result.requireAuth = true;\n } else if (property.initializer.kind === ts.SyntaxKind.FalseKeyword) {\n result.requireAuth = false;\n }\n }\n }\n\n return result;\n }\n}\n\nfunction getDecoratorName(decorator: ts.Decorator): string | undefined {\n const expression = decorator.expression;\n if (ts.isIdentifier(expression)) return expression.text;\n if (ts.isCallExpression(expression) && ts.isIdentifier(expression.expression)) {\n return expression.expression.text;\n }\n\n return undefined;\n}\n\nfunction toStableServiceName(className: string): string {\n const withoutSuffix = className.replace(/(Service|Controller)$/, '');\n return withoutSuffix.charAt(0).toLowerCase() + withoutSuffix.slice(1);\n}\n\nfunction toPosixPath(filePath: string): string {\n return filePath.split(path.sep).join(path.posix.sep);\n}\n\nfunction getNodeText(node: ts.Node, sourceFile: ts.SourceFile): string {\n return sourceFile.text.slice(node.getStart(sourceFile), node.getEnd());\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { promisify } from 'util';\n\nconst readFile = promisify(fs.readFile);\nconst writeFile = promisify(fs.writeFile);\nconst mkdir = promisify(fs.mkdir);\nconst access = promisify(fs.access);\n\nexport class FileSystem {\n /**\n * Read file as string\n */\n async readFile(filePath: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n return readFile(filePath, encoding);\n }\n\n /**\n * Write file\n */\n async writeFile(filePath: string, content: string): Promise<void> {\n // Ensure directory exists\n await this.ensureDir(path.dirname(filePath));\n return writeFile(filePath, content, 'utf-8');\n }\n\n /**\n * Read JSON file\n */\n async readJSON<T = any>(filePath: string): Promise<T> {\n const content = await this.readFile(filePath);\n return JSON.parse(content);\n }\n\n /**\n * Write JSON file\n */\n async writeJSON(filePath: string, data: any, pretty: boolean = true): Promise<void> {\n const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n return this.writeFile(filePath, content);\n }\n\n /**\n * Check if file/directory exists\n */\n async exists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, fs.constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Ensure directory exists (create if not)\n */\n async ensureDir(dirPath: string): Promise<void> {\n if (!(await this.exists(dirPath))) {\n await mkdir(dirPath, { recursive: true });\n }\n }\n\n /**\n * Copy file\n */\n async copyFile(src: string, dest: string): Promise<void> {\n const content = await this.readFile(src);\n await this.writeFile(dest, content);\n }\n\n /**\n * Read directory\n */\n readDir(dirPath: string): Promise<string[]> {\n return promisify(fs.readdir)(dirPath);\n }\n}\n\n// Export singleton\nexport const filesystem = new FileSystem();\n","import { filesystem } from '../core/filesystem';\nimport * as path from 'path';\nimport type { RpcManifest, RpcMethodManifest, RpcServiceManifest } from '../rpc/types';\nimport { NestJSParser } from './parser';\nimport { WextsCodegenError } from '../errors';\n\nexport interface GenerateOptions {\n outputPath: string;\n manifest: RpcManifest;\n manifestFileName?: string;\n clientFileName?: string;\n}\n\nexport interface GenerateRpcOptions {\n projectPath: string;\n outputPath: string;\n manifestFileName?: string;\n clientFileName?: string;\n}\n\n/**\n * Generate TypeScript API client from controller metadata\n */\nexport class ClientGenerator {\n async generate(options: GenerateOptions): Promise<void> {\n const {\n manifest,\n outputPath,\n manifestFileName = 'wexts.rpc.manifest.json',\n clientFileName = 'client.ts',\n } = options;\n\n if (manifest.services.length === 0) {\n throw new WextsCodegenError({\n code: 'WEXTS_CODEGEN_NO_SERVICES',\n message: 'No Wexts RPC services found. Add @RpcService() to a Nest provider and @RpcMethod() to at least one method.',\n suggestedFix: 'Add a decorated RPC service, then run `wexts generate -p apps/api -o apps/web/lib/wexts`.',\n docsSlug: 'codegen',\n });\n }\n\n const sortedManifest = sortManifest(manifest);\n const clientCode = this.generateRpcClientCode(sortedManifest);\n await filesystem.writeJSON(path.join(outputPath, manifestFileName), sortedManifest, true);\n await filesystem.writeFile(path.join(outputPath, clientFileName), clientCode);\n\n const indexCode = `export * from './client';\\n`;\n await filesystem.writeFile(path.join(outputPath, 'index.ts'), indexCode);\n }\n\n private generateRpcClientCode(manifest: RpcManifest): string {\n const manifestJson = JSON.stringify(manifest, null, 2);\n\n return `import { createWextsRpcClient, type WextsRpcClientOptions } from 'wexts/client';\nimport type { RpcManifest } from 'wexts/rpc';\n\nconst manifest = ${manifestJson} satisfies RpcManifest;\n\n${this.generateClientInterface(manifest)}\n\nexport function createWextsClient(options?: WextsRpcClientOptions): WextsClient {\n return createWextsRpcClient(manifest, options) as unknown as WextsClient;\n}\n\nexport const wexts = createWextsClient();\n`;\n }\n\n private generateClientInterface(manifest: RpcManifest): string {\n const services = manifest.services.map((service) => this.generateServiceInterface(service)).join('\\n');\n return `export interface WextsClient {\\n${services}}\\n`;\n }\n\n private generateServiceInterface(service: RpcServiceManifest): string {\n const methods = service.methods.map((method) => ` ${method.name}: (${this.parametersToSignature(method)}) => Promise<${normalizeReturnType(method.returnType)}>;`).join('\\n');\n return ` ${service.name}: {\\n${methods}\\n };\\n`;\n }\n\n private parametersToSignature(method: RpcMethodManifest): string {\n return method.parameters\n .map((parameter) => `${parameter.name}${parameter.optional ? '?' : ''}: ${parameter.type}`)\n .join(', ');\n }\n}\n\nexport async function generateRpcClient(options: GenerateRpcOptions): Promise<RpcManifest> {\n const parser = new NestJSParser(options.projectPath);\n const manifest = parser.findRpcManifest();\n const generator = new ClientGenerator();\n await generator.generate({\n manifest,\n outputPath: options.outputPath,\n manifestFileName: options.manifestFileName,\n clientFileName: options.clientFileName,\n });\n\n return sortManifest(manifest);\n}\n\nfunction sortManifest(manifest: RpcManifest): RpcManifest {\n return {\n schemaVersion: 1,\n services: [...manifest.services]\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((service) => ({\n ...service,\n methods: [...service.methods].sort((a, b) => a.name.localeCompare(b.name)),\n })),\n };\n}\n\nfunction normalizeReturnType(returnType: string): string {\n const match = returnType.match(/^Promise<(.+)>$/);\n return match?.[1] ?? returnType;\n}\n","import * as chokidar from 'chokidar';\nimport { logger } from '../core/logger';\nimport { generateRpcClient } from './generator';\n\nexport interface WatchOptions {\n projectPath: string;\n outputPath: string;\n pattern?: string;\n}\n\n/**\n * Watch NestJS controllers and regenerate client on changes\n */\nexport class CodegenWatcher {\n private watcher: chokidar.FSWatcher | null = null;\n\n async watch(options: WatchOptions): Promise<void> {\n const { projectPath, outputPath, pattern = '**/*.controller.ts' } = options;\n\n logger.info('👀 Watching for controller changes...');\n\n // Initial generation\n await this.generateClient(projectPath, outputPath);\n\n // Watch for changes\n this.watcher = chokidar.watch(pattern, {\n cwd: projectPath,\n ignored: /node_modules/,\n persistent: true,\n });\n\n this.watcher.on('change', async (path) => {\n logger.info(`📝 Controller changed: ${path}`);\n await this.generateClient(projectPath, outputPath);\n });\n\n this.watcher.on('add', async (path) => {\n logger.info(`➕ New controller: ${path}`);\n await this.generateClient(projectPath, outputPath);\n });\n\n this.watcher.on('unlink', async (path) => {\n logger.info(`➖ Controller removed: ${path}`);\n await this.generateClient(projectPath, outputPath);\n });\n }\n\n async stop(): Promise<void> {\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = null;\n }\n }\n\n private async generateClient(projectPath: string, outputPath: string): Promise<void> {\n try {\n const manifest = await generateRpcClient({ projectPath, outputPath });\n logger.success(`Generated client for ${manifest.services.length} RPC service(s)`);\n } catch (error: any) {\n logger.error('Failed to generate client:', error.message);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Volumes/Projects/wexts/packages/dist/chunk-75HBI2XG.js","../src/codegen/index.ts","../src/codegen/parser.ts","../src/core/filesystem.ts","../src/codegen/generator.ts","../src/codegen/watcher.ts"],"names":["RPC_SERVICE_DECORATORS","Set","RPC_METHOD_DECORATORS","REQUIRE_AUTH_DECORATORS","NestJSParser","program","projectPath","configPath","findConfigFile","sys","fileExists","Error","config","readConfigFile","readFile","parsedConfig","parseJsonConfigFileContent","dirname","createProgram","fileNames","options","findFusionControllers","controllers","sourceFiles","getSourceFiles","sourceFile","fileName","includes","fileControllers","parseSourceFile","push","findRpcManifest","services","endsWith","parseRpcServices","sort","a","b","name","localeCompare","service","methods","length","schemaVersion","ts","forEachChild","node","isClassDeclaration","controllerInfo","parseController","classNode","decorators","getDecorators","controllerPrefix","isFusionController","decorator","expr","expression","isCallExpression","isIdentifier","decoratorName","text","arguments","arg","isStringLiteral","routes","parseRoutes","className","prefix","map","r","controllerName","members","forEach","member","isMethodDeclaration","method","routePath","handlerName","path","handler","rootDir","resolve","serviceDecorator","findDecorator","serviceOptions","readDecoratorOptions","classRequiresAuth","requireAuth","hasDecorator","serviceName","toStableServiceName","parseRpcMethods","importPath","toPosixPath","relative","replace","methodDecorator","methodOptions","parameters","parameter","parseParameter","returnType","type","getNodeText","getText","optional","Boolean","questionToken","initializer","names","undefined","find","getDecoratorName","has","firstArg","isObjectLiteralExpression","result","property","properties","isPropertyAssignment","kind","SyntaxKind","TrueKeyword","FalseKeyword","withoutSuffix","charAt","toLowerCase","slice","filePath","split","sep","join","posix","getStart","getEnd","promisify","writeFile","mkdir","access","FileSystem","encoding","content","ensureDir","readJSON","JSON","parse","writeJSON","data","pretty","stringify","exists","constants","F_OK","dirPath","recursive","copyFile","src","dest","readDir","readdir","filesystem","ClientGenerator","generate","manifest","outputPath","manifestFileName","clientFileName","WextsCodegenError","code","message","suggestedFix","docsSlug","sortedManifest","sortManifest","clientCode","generateRpcClientCode","indexCode","manifestJson","generateClientInterface","generateServiceInterface","parametersToSignature","normalizeReturnType","generateRpcClient","CodegenWatcher","error"],"mappings":"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","file":"/Volumes/Projects/wexts/packages/dist/chunk-75HBI2XG.js","sourcesContent":[null,"export * from './parser';\nexport * from './generator';\nexport * from './watcher';\n","import * as path from 'path';\nimport * as ts from 'typescript';\nimport type {\n RpcManifest,\n RpcMethodManifest,\n RpcParameterManifest,\n RpcServiceManifest,\n} from '../rpc/types';\n\nexport interface RouteInfo {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n handler: string;\n controllerName: string;\n}\n\nexport interface ControllerInfo {\n name: string;\n prefix: string;\n routes: RouteInfo[];\n}\n\nconst RPC_SERVICE_DECORATORS = new Set(['RpcService', 'WextsRpcService']);\nconst RPC_METHOD_DECORATORS = new Set(['RpcMethod', 'WextsRpc']);\nconst REQUIRE_AUTH_DECORATORS = new Set(['RequireAuth']);\n\n/**\n * Parse NestJS controllers to extract Fusion metadata\n */\nexport class NestJSParser {\n private program: ts.Program;\n\n constructor(private projectPath: string) {\n const configPath = ts.findConfigFile(projectPath, ts.sys.fileExists, 'tsconfig.json');\n if (!configPath) {\n throw new Error('tsconfig.json not found');\n }\n\n const config = ts.readConfigFile(configPath, ts.sys.readFile);\n const parsedConfig = ts.parseJsonConfigFileContent(\n config.config,\n ts.sys,\n path.dirname(configPath)\n );\n\n this.program = ts.createProgram(parsedConfig.fileNames, parsedConfig.options);\n }\n\n /**\n * Find all controllers with @FusionController decorator\n */\n findFusionControllers(): ControllerInfo[] {\n const controllers: ControllerInfo[] = [];\n const sourceFiles = this.program.getSourceFiles();\n\n for (const sourceFile of sourceFiles) {\n if (sourceFile.fileName.includes('node_modules')) continue;\n if (!sourceFile.fileName.includes('.controller.ts')) continue;\n\n const fileControllers = this.parseSourceFile(sourceFile);\n controllers.push(...fileControllers);\n }\n\n return controllers;\n }\n\n findRpcManifest(): RpcManifest {\n const services: RpcServiceManifest[] = [];\n\n for (const sourceFile of this.program.getSourceFiles()) {\n if (sourceFile.fileName.includes('node_modules')) continue;\n if (!sourceFile.fileName.endsWith('.ts')) continue;\n if (sourceFile.fileName.endsWith('.d.ts')) continue;\n\n services.push(...this.parseRpcServices(sourceFile));\n }\n\n services.sort((a, b) => a.name.localeCompare(b.name));\n for (const service of services) {\n service.methods.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n if (services.length === 0) {\n return {\n schemaVersion: 1,\n services,\n };\n }\n\n return {\n schemaVersion: 1,\n services,\n };\n }\n\n private parseSourceFile(sourceFile: ts.SourceFile): ControllerInfo[] {\n const controllers: ControllerInfo[] = [];\n\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isClassDeclaration(node) && node.name) {\n const controllerInfo = this.parseController(node);\n if (controllerInfo) {\n controllers.push(controllerInfo);\n }\n }\n });\n\n return controllers;\n }\n\n private parseController(classNode: ts.ClassDeclaration): ControllerInfo | null {\n const decorators = ts.getDecorators(classNode);\n if (!decorators) return null;\n\n let controllerPrefix = '';\n let isFusionController = false;\n\n // Check for @FusionController decorator\n for (const decorator of decorators) {\n const expr = decorator.expression;\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\n const decoratorName = expr.expression.text;\n\n if (decoratorName === 'FusionController') {\n isFusionController = true;\n if (expr.arguments.length > 0) {\n const arg = expr.arguments[0];\n if (ts.isStringLiteral(arg)) {\n controllerPrefix = arg.text;\n }\n }\n }\n }\n }\n\n if (!isFusionController) return null;\n\n const routes = this.parseRoutes(classNode);\n const className = classNode.name?.text || 'Unknown';\n\n return {\n name: className,\n prefix: controllerPrefix,\n routes: routes.map(r => ({ ...r, controllerName: className })),\n };\n }\n\n private parseRoutes(classNode: ts.ClassDeclaration): RouteInfo[] {\n const routes: RouteInfo[] = [];\n\n classNode.members.forEach((member) => {\n if (ts.isMethodDeclaration(member)) {\n const decorators = ts.getDecorators(member);\n if (!decorators) return;\n\n for (const decorator of decorators) {\n const expr = decorator.expression;\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\n const decoratorName = expr.expression.text;\n\n let method: RouteInfo['method'] | null = null;\n let routePath = '';\n\n // Map decorator to HTTP method\n if (decoratorName === 'FusionGet') method = 'GET';\n else if (decoratorName === 'FusionPost') method = 'POST';\n else if (decoratorName === 'FusionPut') method = 'PUT';\n else if (decoratorName === 'FusionDelete') method = 'DELETE';\n\n if (method) {\n // Get route path from decorator argument\n if (expr.arguments.length > 0) {\n const arg = expr.arguments[0];\n if (ts.isStringLiteral(arg)) {\n routePath = arg.text;\n }\n }\n\n const handlerName = (member.name as ts.Identifier).text;\n\n routes.push({\n method,\n path: routePath,\n handler: handlerName,\n controllerName: '', // Will be set by caller\n });\n }\n }\n }\n }\n });\n\n return routes;\n }\n\n private parseRpcServices(sourceFile: ts.SourceFile): RpcServiceManifest[] {\n const services: RpcServiceManifest[] = [];\n const rootDir = path.resolve(this.projectPath);\n\n ts.forEachChild(sourceFile, (node) => {\n if (!ts.isClassDeclaration(node) || !node.name) return;\n\n const serviceDecorator = this.findDecorator(node, RPC_SERVICE_DECORATORS);\n if (!serviceDecorator) return;\n\n const className = node.name.text;\n const serviceOptions = this.readDecoratorOptions(serviceDecorator);\n const classRequiresAuth = serviceOptions.requireAuth || this.hasDecorator(node, REQUIRE_AUTH_DECORATORS);\n const serviceName = serviceOptions.name || toStableServiceName(className);\n const methods = this.parseRpcMethods(node, classRequiresAuth, sourceFile);\n\n if (methods.length === 0) return;\n\n services.push({\n name: serviceName,\n className,\n importPath: toPosixPath(path.relative(rootDir, sourceFile.fileName).replace(/\\.ts$/, '')),\n requireAuth: classRequiresAuth,\n methods,\n });\n });\n\n return services;\n }\n\n private parseRpcMethods(classNode: ts.ClassDeclaration, classRequiresAuth: boolean, sourceFile: ts.SourceFile): RpcMethodManifest[] {\n const methods: RpcMethodManifest[] = [];\n\n for (const member of classNode.members) {\n if (!ts.isMethodDeclaration(member)) continue;\n if (!ts.isIdentifier(member.name)) continue;\n\n const methodDecorator = this.findDecorator(member, RPC_METHOD_DECORATORS);\n if (!methodDecorator) continue;\n\n const handlerName = member.name.text;\n const methodOptions = this.readDecoratorOptions(methodDecorator);\n const requireAuth = classRequiresAuth || methodOptions.requireAuth || this.hasDecorator(member, REQUIRE_AUTH_DECORATORS);\n\n methods.push({\n name: methodOptions.name || handlerName,\n handlerName,\n requireAuth,\n parameters: member.parameters.map((parameter) => this.parseParameter(parameter, sourceFile)),\n returnType: member.type ? getNodeText(member.type, sourceFile) : 'unknown',\n });\n }\n\n return methods;\n }\n\n private parseParameter(parameter: ts.ParameterDeclaration, sourceFile: ts.SourceFile): RpcParameterManifest {\n return {\n name: ts.isIdentifier(parameter.name) ? parameter.name.text : parameter.name.getText(),\n type: parameter.type ? getNodeText(parameter.type, sourceFile) : 'unknown',\n optional: Boolean(parameter.questionToken || parameter.initializer),\n };\n }\n\n private findDecorator(\n node: ts.ClassDeclaration | ts.MethodDeclaration,\n names: Set<string>\n ): ts.Decorator | undefined {\n const decorators = ts.getDecorators(node);\n if (!decorators) return undefined;\n\n return decorators.find((decorator) => {\n const name = getDecoratorName(decorator);\n return Boolean(name && names.has(name));\n });\n }\n\n private hasDecorator(\n node: ts.ClassDeclaration | ts.MethodDeclaration,\n names: Set<string>\n ): boolean {\n return Boolean(this.findDecorator(node, names));\n }\n\n private readDecoratorOptions(decorator: ts.Decorator): { name?: string; requireAuth?: boolean } {\n const expression = decorator.expression;\n if (!ts.isCallExpression(expression)) return {};\n\n const firstArg = expression.arguments[0];\n if (!firstArg) return {};\n\n if (ts.isStringLiteral(firstArg)) {\n return { name: firstArg.text };\n }\n\n if (!ts.isObjectLiteralExpression(firstArg)) return {};\n\n const result: { name?: string; requireAuth?: boolean } = {};\n\n for (const property of firstArg.properties) {\n if (!ts.isPropertyAssignment(property) || !ts.isIdentifier(property.name)) continue;\n\n if (property.name.text === 'name' && ts.isStringLiteral(property.initializer)) {\n result.name = property.initializer.text;\n }\n\n if (property.name.text === 'requireAuth') {\n if (property.initializer.kind === ts.SyntaxKind.TrueKeyword) {\n result.requireAuth = true;\n } else if (property.initializer.kind === ts.SyntaxKind.FalseKeyword) {\n result.requireAuth = false;\n }\n }\n }\n\n return result;\n }\n}\n\nfunction getDecoratorName(decorator: ts.Decorator): string | undefined {\n const expression = decorator.expression;\n if (ts.isIdentifier(expression)) return expression.text;\n if (ts.isCallExpression(expression) && ts.isIdentifier(expression.expression)) {\n return expression.expression.text;\n }\n\n return undefined;\n}\n\nfunction toStableServiceName(className: string): string {\n const withoutSuffix = className.replace(/(Service|Controller)$/, '');\n return withoutSuffix.charAt(0).toLowerCase() + withoutSuffix.slice(1);\n}\n\nfunction toPosixPath(filePath: string): string {\n return filePath.split(path.sep).join(path.posix.sep);\n}\n\nfunction getNodeText(node: ts.Node, sourceFile: ts.SourceFile): string {\n return sourceFile.text.slice(node.getStart(sourceFile), node.getEnd());\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { promisify } from 'util';\n\nconst readFile = promisify(fs.readFile);\nconst writeFile = promisify(fs.writeFile);\nconst mkdir = promisify(fs.mkdir);\nconst access = promisify(fs.access);\n\nexport class FileSystem {\n /**\n * Read file as string\n */\n async readFile(filePath: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n return readFile(filePath, encoding);\n }\n\n /**\n * Write file\n */\n async writeFile(filePath: string, content: string): Promise<void> {\n // Ensure directory exists\n await this.ensureDir(path.dirname(filePath));\n return writeFile(filePath, content, 'utf-8');\n }\n\n /**\n * Read JSON file\n */\n async readJSON<T = any>(filePath: string): Promise<T> {\n const content = await this.readFile(filePath);\n return JSON.parse(content);\n }\n\n /**\n * Write JSON file\n */\n async writeJSON(filePath: string, data: any, pretty: boolean = true): Promise<void> {\n const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n return this.writeFile(filePath, content);\n }\n\n /**\n * Check if file/directory exists\n */\n async exists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, fs.constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Ensure directory exists (create if not)\n */\n async ensureDir(dirPath: string): Promise<void> {\n if (!(await this.exists(dirPath))) {\n await mkdir(dirPath, { recursive: true });\n }\n }\n\n /**\n * Copy file\n */\n async copyFile(src: string, dest: string): Promise<void> {\n const content = await this.readFile(src);\n await this.writeFile(dest, content);\n }\n\n /**\n * Read directory\n */\n readDir(dirPath: string): Promise<string[]> {\n return promisify(fs.readdir)(dirPath);\n }\n}\n\n// Export singleton\nexport const filesystem = new FileSystem();\n","import { filesystem } from '../core/filesystem';\nimport * as path from 'path';\nimport type { RpcManifest, RpcMethodManifest, RpcServiceManifest } from '../rpc/types';\nimport { NestJSParser } from './parser';\nimport { WextsCodegenError } from '../errors';\n\nexport interface GenerateOptions {\n outputPath: string;\n manifest: RpcManifest;\n manifestFileName?: string;\n clientFileName?: string;\n}\n\nexport interface GenerateRpcOptions {\n projectPath: string;\n outputPath: string;\n manifestFileName?: string;\n clientFileName?: string;\n}\n\n/**\n * Generate TypeScript API client from controller metadata\n */\nexport class ClientGenerator {\n async generate(options: GenerateOptions): Promise<void> {\n const {\n manifest,\n outputPath,\n manifestFileName = 'wexts.rpc.manifest.json',\n clientFileName = 'client.ts',\n } = options;\n\n if (manifest.services.length === 0) {\n throw new WextsCodegenError({\n code: 'WEXTS_CODEGEN_NO_SERVICES',\n message: 'No Wexts RPC services found. Add @RpcService() to a Nest provider and @RpcMethod() to at least one method.',\n suggestedFix: 'Add a decorated RPC service, then run `wexts generate -p apps/api -o apps/web/lib/wexts`.',\n docsSlug: 'codegen',\n });\n }\n\n const sortedManifest = sortManifest(manifest);\n const clientCode = this.generateRpcClientCode(sortedManifest);\n await filesystem.writeJSON(path.join(outputPath, manifestFileName), sortedManifest, true);\n await filesystem.writeFile(path.join(outputPath, clientFileName), clientCode);\n\n const indexCode = `export * from './client';\\n`;\n await filesystem.writeFile(path.join(outputPath, 'index.ts'), indexCode);\n }\n\n private generateRpcClientCode(manifest: RpcManifest): string {\n const manifestJson = JSON.stringify(manifest, null, 2);\n\n return `import { createWextsRpcClient, type WextsRpcClientOptions } from 'wexts/client';\nimport type { RpcManifest } from 'wexts/rpc';\n\nconst manifest = ${manifestJson} satisfies RpcManifest;\n\n${this.generateClientInterface(manifest)}\n\nexport function createWextsClient(options?: WextsRpcClientOptions): WextsClient {\n return createWextsRpcClient(manifest, options) as unknown as WextsClient;\n}\n\nexport const wexts = createWextsClient();\n`;\n }\n\n private generateClientInterface(manifest: RpcManifest): string {\n const services = manifest.services.map((service) => this.generateServiceInterface(service)).join('\\n');\n return `export interface WextsClient {\\n${services}}\\n`;\n }\n\n private generateServiceInterface(service: RpcServiceManifest): string {\n const methods = service.methods.map((method) => ` ${method.name}: (${this.parametersToSignature(method)}) => Promise<${normalizeReturnType(method.returnType)}>;`).join('\\n');\n return ` ${service.name}: {\\n${methods}\\n };\\n`;\n }\n\n private parametersToSignature(method: RpcMethodManifest): string {\n return method.parameters\n .map((parameter) => `${parameter.name}${parameter.optional ? '?' : ''}: ${parameter.type}`)\n .join(', ');\n }\n}\n\nexport async function generateRpcClient(options: GenerateRpcOptions): Promise<RpcManifest> {\n const parser = new NestJSParser(options.projectPath);\n const manifest = parser.findRpcManifest();\n const generator = new ClientGenerator();\n await generator.generate({\n manifest,\n outputPath: options.outputPath,\n manifestFileName: options.manifestFileName,\n clientFileName: options.clientFileName,\n });\n\n return sortManifest(manifest);\n}\n\nfunction sortManifest(manifest: RpcManifest): RpcManifest {\n return {\n schemaVersion: 1,\n services: [...manifest.services]\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((service) => ({\n ...service,\n methods: [...service.methods].sort((a, b) => a.name.localeCompare(b.name)),\n })),\n };\n}\n\nfunction normalizeReturnType(returnType: string): string {\n const match = returnType.match(/^Promise<(.+)>$/);\n return match?.[1] ?? returnType;\n}\n","import * as chokidar from 'chokidar';\nimport { logger } from '../core/logger';\nimport { generateRpcClient } from './generator';\n\nexport interface WatchOptions {\n projectPath: string;\n outputPath: string;\n pattern?: string;\n}\n\n/**\n * Watch NestJS controllers and regenerate client on changes\n */\nexport class CodegenWatcher {\n private watcher: chokidar.FSWatcher | null = null;\n\n async watch(options: WatchOptions): Promise<void> {\n const { projectPath, outputPath, pattern = '**/*.controller.ts' } = options;\n\n logger.info('👀 Watching for controller changes...');\n\n // Initial generation\n await this.generateClient(projectPath, outputPath);\n\n // Watch for changes\n this.watcher = chokidar.watch(pattern, {\n cwd: projectPath,\n ignored: /node_modules/,\n persistent: true,\n });\n\n this.watcher.on('change', async (path) => {\n logger.info(`📝 Controller changed: ${path}`);\n await this.generateClient(projectPath, outputPath);\n });\n\n this.watcher.on('add', async (path) => {\n logger.info(`➕ New controller: ${path}`);\n await this.generateClient(projectPath, outputPath);\n });\n\n this.watcher.on('unlink', async (path) => {\n logger.info(`➖ Controller removed: ${path}`);\n await this.generateClient(projectPath, outputPath);\n });\n }\n\n async stop(): Promise<void> {\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = null;\n }\n }\n\n private async generateClient(projectPath: string, outputPath: string): Promise<void> {\n try {\n const manifest = await generateRpcClient({ projectPath, outputPath });\n logger.success(`Generated client for ${manifest.services.length} RPC service(s)`);\n } catch (error: any) {\n logger.error('Failed to generate client:', error.message);\n }\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
__name
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-L77ANWWT.mjs";
|
|
4
4
|
|
|
5
5
|
// src/core/logger.ts
|
|
6
6
|
var LogLevel = /* @__PURE__ */ (function(LogLevel2) {
|
|
@@ -62,4 +62,4 @@ export {
|
|
|
62
62
|
logger,
|
|
63
63
|
createLogger
|
|
64
64
|
};
|
|
65
|
-
//# sourceMappingURL=chunk-
|
|
65
|
+
//# sourceMappingURL=chunk-C2AG7Q3C.mjs.map
|