wexts 1.0.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/README.md +443 -0
- package/dist/chunk-2H7UOFLK.js +11 -0
- package/dist/chunk-2H7UOFLK.js.map +1 -0
- package/dist/chunk-2ZKONAXC.js +45 -0
- package/dist/chunk-2ZKONAXC.js.map +1 -0
- package/dist/chunk-57VDULE3.mjs +83 -0
- package/dist/chunk-57VDULE3.mjs.map +1 -0
- package/dist/chunk-6K3RXN4Y.mjs +45 -0
- package/dist/chunk-6K3RXN4Y.mjs.map +1 -0
- package/dist/chunk-6KN6UIHT.js +67 -0
- package/dist/chunk-6KN6UIHT.js.map +1 -0
- package/dist/chunk-A5OZK2TO.mjs +56 -0
- package/dist/chunk-A5OZK2TO.mjs.map +1 -0
- package/dist/chunk-ELVFG4US.js +83 -0
- package/dist/chunk-ELVFG4US.js.map +1 -0
- package/dist/chunk-H6XDQJ3N.mjs +11 -0
- package/dist/chunk-H6XDQJ3N.mjs.map +1 -0
- package/dist/chunk-HE3JQ62E.js +56 -0
- package/dist/chunk-HE3JQ62E.js.map +1 -0
- package/dist/chunk-HHXRAV67.mjs +229 -0
- package/dist/chunk-HHXRAV67.mjs.map +1 -0
- package/dist/chunk-J7J2LRG7.js +229 -0
- package/dist/chunk-J7J2LRG7.js.map +1 -0
- package/dist/chunk-LWNHEPTL.mjs +2 -0
- package/dist/chunk-LWNHEPTL.mjs.map +1 -0
- package/dist/chunk-MAVJYD6O.js +2 -0
- package/dist/chunk-MAVJYD6O.js.map +1 -0
- package/dist/chunk-QUV6QXTP.js +363 -0
- package/dist/chunk-QUV6QXTP.js.map +1 -0
- package/dist/chunk-WZBBQLFT.mjs +363 -0
- package/dist/chunk-WZBBQLFT.mjs.map +1 -0
- package/dist/chunk-XMPCR7N3.mjs +67 -0
- package/dist/chunk-XMPCR7N3.mjs.map +1 -0
- package/dist/cli/index.mjs +69 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/client/index.js +11 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.mjs +11 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/codegen-J3XOZCQZ.js +14 -0
- package/dist/codegen-J3XOZCQZ.js.map +1 -0
- package/dist/codegen-ZZBQIGUQ.mjs +14 -0
- package/dist/codegen-ZZBQIGUQ.mjs.map +1 -0
- package/dist/dev-server-K5YZAZY2.mjs +14 -0
- package/dist/dev-server-K5YZAZY2.mjs.map +1 -0
- package/dist/dev-server-X453DBCE.js +14 -0
- package/dist/dev-server-X453DBCE.js.map +1 -0
- package/dist/index.js +274 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +274 -0
- package/dist/index.mjs.map +1 -0
- package/dist/nest/index.js +21 -0
- package/dist/nest/index.js.map +1 -0
- package/dist/nest/index.mjs +21 -0
- package/dist/nest/index.mjs.map +1 -0
- package/dist/next/index.js +14 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/index.mjs +14 -0
- package/dist/next/index.mjs.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +3 -0
- package/dist/types/index.mjs.map +1 -0
- package/package.json +104 -0
- package/templates/nestjs-api/.env.example +4 -0
- package/templates/nestjs-api/README.md +79 -0
- package/templates/nestjs-api/nest-cli.json +7 -0
- package/templates/nestjs-api/package.json +39 -0
- package/templates/nestjs-api/prisma/schema.prisma +29 -0
- package/templates/nestjs-api/src/app.module.ts +17 -0
- package/templates/nestjs-api/src/auth/auth.controller.ts +30 -0
- package/templates/nestjs-api/src/auth/auth.module.ts +26 -0
- package/templates/nestjs-api/src/auth/auth.service.ts +91 -0
- package/templates/nestjs-api/src/auth/dto/auth.dto.ts +22 -0
- package/templates/nestjs-api/src/auth/guards/jwt-auth.guard.ts +5 -0
- package/templates/nestjs-api/src/auth/strategies/jwt.strategy.ts +19 -0
- package/templates/nestjs-api/src/main.ts +32 -0
- package/templates/nestjs-api/src/prisma/prisma.module.ts +9 -0
- package/templates/nestjs-api/src/prisma/prisma.service.ts +14 -0
- package/templates/nestjs-api/src/todos/dto/todo.dto.ts +24 -0
- package/templates/nestjs-api/src/todos/todos.controller.ts +46 -0
- package/templates/nestjs-api/src/todos/todos.module.ts +9 -0
- package/templates/nestjs-api/src/todos/todos.service.ts +53 -0
- package/templates/nestjs-api/src/users/users.controller.ts +17 -0
- package/templates/nestjs-api/src/users/users.module.ts +10 -0
- package/templates/nestjs-api/src/users/users.service.ts +19 -0
- package/templates/nestjs-api/tsconfig.json +21 -0
- package/templates/nextjs-web/.env.local.example +1 -0
- package/templates/nextjs-web/README.md +68 -0
- package/templates/nextjs-web/app/dashboard/page.tsx +175 -0
- package/templates/nextjs-web/app/globals.css +28 -0
- package/templates/nextjs-web/app/layout.tsx +27 -0
- package/templates/nextjs-web/app/login/page.tsx +107 -0
- package/templates/nextjs-web/app/page.tsx +28 -0
- package/templates/nextjs-web/app/register/page.tsx +130 -0
- package/templates/nextjs-web/next.config.mjs +4 -0
- package/templates/nextjs-web/package.json +28 -0
- package/templates/nextjs-web/tailwind.config.ts +15 -0
- package/templates/nextjs-web/tsconfig.json +39 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
logger
|
|
4
|
+
} from "./chunk-A5OZK2TO.mjs";
|
|
5
|
+
import {
|
|
6
|
+
__export
|
|
7
|
+
} from "./chunk-H6XDQJ3N.mjs";
|
|
8
|
+
|
|
9
|
+
// src/codegen/index.ts
|
|
10
|
+
var codegen_exports = {};
|
|
11
|
+
__export(codegen_exports, {
|
|
12
|
+
ClientGenerator: () => ClientGenerator,
|
|
13
|
+
CodegenWatcher: () => CodegenWatcher,
|
|
14
|
+
NestJSParser: () => NestJSParser
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// src/codegen/parser.ts
|
|
18
|
+
import * as ts from "typescript";
|
|
19
|
+
import * as path from "path";
|
|
20
|
+
var NestJSParser = class {
|
|
21
|
+
constructor(projectPath) {
|
|
22
|
+
this.projectPath = projectPath;
|
|
23
|
+
const configPath = ts.findConfigFile(projectPath, ts.sys.fileExists, "tsconfig.json");
|
|
24
|
+
if (!configPath) {
|
|
25
|
+
throw new Error("tsconfig.json not found");
|
|
26
|
+
}
|
|
27
|
+
const config = ts.readConfigFile(configPath, ts.sys.readFile);
|
|
28
|
+
const parsedConfig = ts.parseJsonConfigFileContent(
|
|
29
|
+
config.config,
|
|
30
|
+
ts.sys,
|
|
31
|
+
path.dirname(configPath)
|
|
32
|
+
);
|
|
33
|
+
this.program = ts.createProgram(parsedConfig.fileNames, parsedConfig.options);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Find all controllers with @FusionController decorator
|
|
37
|
+
*/
|
|
38
|
+
findFusionControllers() {
|
|
39
|
+
const controllers = [];
|
|
40
|
+
const sourceFiles = this.program.getSourceFiles();
|
|
41
|
+
for (const sourceFile of sourceFiles) {
|
|
42
|
+
if (sourceFile.fileName.includes("node_modules")) continue;
|
|
43
|
+
if (!sourceFile.fileName.includes(".controller.ts")) continue;
|
|
44
|
+
const fileControllers = this.parseSourceFile(sourceFile);
|
|
45
|
+
controllers.push(...fileControllers);
|
|
46
|
+
}
|
|
47
|
+
return controllers;
|
|
48
|
+
}
|
|
49
|
+
parseSourceFile(sourceFile) {
|
|
50
|
+
const controllers = [];
|
|
51
|
+
ts.forEachChild(sourceFile, (node) => {
|
|
52
|
+
if (ts.isClassDeclaration(node) && node.name) {
|
|
53
|
+
const controllerInfo = this.parseController(node);
|
|
54
|
+
if (controllerInfo) {
|
|
55
|
+
controllers.push(controllerInfo);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return controllers;
|
|
60
|
+
}
|
|
61
|
+
parseController(classNode) {
|
|
62
|
+
const decorators = ts.getDecorators(classNode);
|
|
63
|
+
if (!decorators) return null;
|
|
64
|
+
let controllerPrefix = "";
|
|
65
|
+
let isFusionController = false;
|
|
66
|
+
for (const decorator of decorators) {
|
|
67
|
+
const expr = decorator.expression;
|
|
68
|
+
if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {
|
|
69
|
+
const decoratorName = expr.expression.text;
|
|
70
|
+
if (decoratorName === "FusionController") {
|
|
71
|
+
isFusionController = true;
|
|
72
|
+
if (expr.arguments.length > 0) {
|
|
73
|
+
const arg = expr.arguments[0];
|
|
74
|
+
if (ts.isStringLiteral(arg)) {
|
|
75
|
+
controllerPrefix = arg.text;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (!isFusionController) return null;
|
|
82
|
+
const routes = this.parseRoutes(classNode);
|
|
83
|
+
const className = classNode.name?.text || "Unknown";
|
|
84
|
+
return {
|
|
85
|
+
name: className,
|
|
86
|
+
prefix: controllerPrefix,
|
|
87
|
+
routes: routes.map((r) => ({ ...r, controllerName: className }))
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
parseRoutes(classNode) {
|
|
91
|
+
const routes = [];
|
|
92
|
+
classNode.members.forEach((member) => {
|
|
93
|
+
if (ts.isMethodDeclaration(member)) {
|
|
94
|
+
const decorators = ts.getDecorators(member);
|
|
95
|
+
if (!decorators) return;
|
|
96
|
+
for (const decorator of decorators) {
|
|
97
|
+
const expr = decorator.expression;
|
|
98
|
+
if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {
|
|
99
|
+
const decoratorName = expr.expression.text;
|
|
100
|
+
let method = null;
|
|
101
|
+
let routePath = "";
|
|
102
|
+
if (decoratorName === "FusionGet") method = "GET";
|
|
103
|
+
else if (decoratorName === "FusionPost") method = "POST";
|
|
104
|
+
else if (decoratorName === "FusionPut") method = "PUT";
|
|
105
|
+
else if (decoratorName === "FusionDelete") method = "DELETE";
|
|
106
|
+
if (method) {
|
|
107
|
+
if (expr.arguments.length > 0) {
|
|
108
|
+
const arg = expr.arguments[0];
|
|
109
|
+
if (ts.isStringLiteral(arg)) {
|
|
110
|
+
routePath = arg.text;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const handlerName = member.name.text;
|
|
114
|
+
routes.push({
|
|
115
|
+
method,
|
|
116
|
+
path: routePath,
|
|
117
|
+
handler: handlerName,
|
|
118
|
+
controllerName: ""
|
|
119
|
+
// Will be set by caller
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
return routes;
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// src/core/filesystem.ts
|
|
131
|
+
import * as fs from "fs";
|
|
132
|
+
import * as path2 from "path";
|
|
133
|
+
import { promisify } from "util";
|
|
134
|
+
var readFile2 = promisify(fs.readFile);
|
|
135
|
+
var writeFile2 = promisify(fs.writeFile);
|
|
136
|
+
var mkdir2 = promisify(fs.mkdir);
|
|
137
|
+
var access2 = promisify(fs.access);
|
|
138
|
+
var FileSystem = class {
|
|
139
|
+
/**
|
|
140
|
+
* Read file as string
|
|
141
|
+
*/
|
|
142
|
+
async readFile(filePath, encoding = "utf-8") {
|
|
143
|
+
return readFile2(filePath, encoding);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Write file
|
|
147
|
+
*/
|
|
148
|
+
async writeFile(filePath, content) {
|
|
149
|
+
await this.ensureDir(path2.dirname(filePath));
|
|
150
|
+
return writeFile2(filePath, content, "utf-8");
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Read JSON file
|
|
154
|
+
*/
|
|
155
|
+
async readJSON(filePath) {
|
|
156
|
+
const content = await this.readFile(filePath);
|
|
157
|
+
return JSON.parse(content);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Write JSON file
|
|
161
|
+
*/
|
|
162
|
+
async writeJSON(filePath, data, pretty = true) {
|
|
163
|
+
const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
|
|
164
|
+
return this.writeFile(filePath, content);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Check if file/directory exists
|
|
168
|
+
*/
|
|
169
|
+
async exists(filePath) {
|
|
170
|
+
try {
|
|
171
|
+
await access2(filePath, fs.constants.F_OK);
|
|
172
|
+
return true;
|
|
173
|
+
} catch {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Ensure directory exists (create if not)
|
|
179
|
+
*/
|
|
180
|
+
async ensureDir(dirPath) {
|
|
181
|
+
if (!await this.exists(dirPath)) {
|
|
182
|
+
await mkdir2(dirPath, { recursive: true });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Copy file
|
|
187
|
+
*/
|
|
188
|
+
async copyFile(src, dest) {
|
|
189
|
+
const content = await this.readFile(src);
|
|
190
|
+
await this.writeFile(dest, content);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Read directory
|
|
194
|
+
*/
|
|
195
|
+
readDir(dirPath) {
|
|
196
|
+
return promisify(fs.readdir)(dirPath);
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
var filesystem = new FileSystem();
|
|
200
|
+
|
|
201
|
+
// src/codegen/generator.ts
|
|
202
|
+
import * as path3 from "path";
|
|
203
|
+
var ClientGenerator = class {
|
|
204
|
+
async generate(options) {
|
|
205
|
+
const { controllers, outputPath } = options;
|
|
206
|
+
const clientCode = this.generateClientCode(controllers, options.baseUrl);
|
|
207
|
+
await filesystem.writeFile(path3.join(outputPath, "client.ts"), clientCode);
|
|
208
|
+
const indexCode = `export * from './client';
|
|
209
|
+
`;
|
|
210
|
+
await filesystem.writeFile(path3.join(outputPath, "index.ts"), indexCode);
|
|
211
|
+
console.log(`\u2705 Generated API client at ${outputPath}`);
|
|
212
|
+
}
|
|
213
|
+
generateClientCode(controllers, baseUrl = "/api") {
|
|
214
|
+
const imports = `import { FusionFetcher } from 'wexts/client';
|
|
215
|
+
|
|
216
|
+
`;
|
|
217
|
+
const clientClass = this.generateClientClass(controllers, baseUrl);
|
|
218
|
+
const exports = `
|
|
219
|
+
// Export singleton instance
|
|
220
|
+
export const apiClient = new ApiClient();
|
|
221
|
+
`;
|
|
222
|
+
return imports + clientClass + exports;
|
|
223
|
+
}
|
|
224
|
+
generateClientClass(controllers, baseUrl) {
|
|
225
|
+
let code = `export class ApiClient {
|
|
226
|
+
`;
|
|
227
|
+
code += ` private client: FusionFetcher;
|
|
228
|
+
|
|
229
|
+
`;
|
|
230
|
+
code += ` constructor(baseUrl: string = '${baseUrl}') {
|
|
231
|
+
`;
|
|
232
|
+
code += ` this.client = new FusionFetcher(baseUrl);
|
|
233
|
+
`;
|
|
234
|
+
code += ` }
|
|
235
|
+
|
|
236
|
+
`;
|
|
237
|
+
for (const controller of controllers) {
|
|
238
|
+
const methods = this.generateControllerMethods(controller);
|
|
239
|
+
code += methods;
|
|
240
|
+
}
|
|
241
|
+
code += `}
|
|
242
|
+
`;
|
|
243
|
+
return code;
|
|
244
|
+
}
|
|
245
|
+
generateControllerMethods(controller) {
|
|
246
|
+
let code = ` // ${controller.name} endpoints
|
|
247
|
+
`;
|
|
248
|
+
for (const route of controller.routes) {
|
|
249
|
+
const methodName = this.generateMethodName(controller, route);
|
|
250
|
+
const methodCode = this.generateMethod(controller, route, methodName);
|
|
251
|
+
code += methodCode + "\n";
|
|
252
|
+
}
|
|
253
|
+
return code;
|
|
254
|
+
}
|
|
255
|
+
generateMethodName(controller, route) {
|
|
256
|
+
const controllerBase = controller.name.replace("Controller", "").toLowerCase();
|
|
257
|
+
if (route.handler === "findAll") {
|
|
258
|
+
return `get${this.capitalize(controllerBase)}`;
|
|
259
|
+
} else if (route.handler === "findOne") {
|
|
260
|
+
return `get${this.capitalize(controllerBase)}ById`;
|
|
261
|
+
} else if (route.handler === "create") {
|
|
262
|
+
return `create${this.capitalize(controllerBase.replace(/s$/, ""))}`;
|
|
263
|
+
} else if (route.handler === "update") {
|
|
264
|
+
return `update${this.capitalize(controllerBase.replace(/s$/, ""))}`;
|
|
265
|
+
} else if (route.handler === "remove" || route.handler === "delete") {
|
|
266
|
+
return `delete${this.capitalize(controllerBase.replace(/s$/, ""))}`;
|
|
267
|
+
}
|
|
268
|
+
return route.handler;
|
|
269
|
+
}
|
|
270
|
+
generateMethod(controller, route, methodName) {
|
|
271
|
+
const fullPath = `/${controller.prefix}${route.path}`;
|
|
272
|
+
const hasPathParam = fullPath.includes(":");
|
|
273
|
+
let params = "";
|
|
274
|
+
let pathExpr = `'${fullPath}'`;
|
|
275
|
+
if (hasPathParam) {
|
|
276
|
+
const paramMatch = fullPath.match(/:(\w+)/);
|
|
277
|
+
const paramName = paramMatch ? paramMatch[1] : "id";
|
|
278
|
+
params = `${paramName}: string`;
|
|
279
|
+
pathExpr = `'${fullPath.replace(`:${paramName}`, "${" + paramName + "}")}'`;
|
|
280
|
+
}
|
|
281
|
+
if (route.method === "POST" || route.method === "PUT") {
|
|
282
|
+
if (params) params += ", ";
|
|
283
|
+
params += "data: any";
|
|
284
|
+
}
|
|
285
|
+
let methodBody = "";
|
|
286
|
+
if (route.method === "GET" || route.method === "DELETE") {
|
|
287
|
+
methodBody = ` return this.client.${route.method.toLowerCase()}<any>(${pathExpr});`;
|
|
288
|
+
} else {
|
|
289
|
+
methodBody = ` return this.client.${route.method.toLowerCase()}<any>(${pathExpr}, data);`;
|
|
290
|
+
}
|
|
291
|
+
return ` async ${methodName}(${params}): Promise<any> {
|
|
292
|
+
${methodBody}
|
|
293
|
+
}
|
|
294
|
+
`;
|
|
295
|
+
}
|
|
296
|
+
capitalize(str) {
|
|
297
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
// src/codegen/watcher.ts
|
|
302
|
+
import * as chokidar from "chokidar";
|
|
303
|
+
var CodegenWatcher = class {
|
|
304
|
+
constructor() {
|
|
305
|
+
this.watcher = null;
|
|
306
|
+
}
|
|
307
|
+
async watch(options) {
|
|
308
|
+
const { projectPath, outputPath, pattern = "**/*.controller.ts" } = options;
|
|
309
|
+
logger.info("\u{1F440} Watching for controller changes...");
|
|
310
|
+
await this.generateClient(projectPath, outputPath);
|
|
311
|
+
this.watcher = chokidar.watch(pattern, {
|
|
312
|
+
cwd: projectPath,
|
|
313
|
+
ignored: /node_modules/,
|
|
314
|
+
persistent: true
|
|
315
|
+
});
|
|
316
|
+
this.watcher.on("change", async (path4) => {
|
|
317
|
+
logger.info(`\u{1F4DD} Controller changed: ${path4}`);
|
|
318
|
+
await this.generateClient(projectPath, outputPath);
|
|
319
|
+
});
|
|
320
|
+
this.watcher.on("add", async (path4) => {
|
|
321
|
+
logger.info(`\u2795 New controller: ${path4}`);
|
|
322
|
+
await this.generateClient(projectPath, outputPath);
|
|
323
|
+
});
|
|
324
|
+
this.watcher.on("unlink", async (path4) => {
|
|
325
|
+
logger.info(`\u2796 Controller removed: ${path4}`);
|
|
326
|
+
await this.generateClient(projectPath, outputPath);
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
async stop() {
|
|
330
|
+
if (this.watcher) {
|
|
331
|
+
await this.watcher.close();
|
|
332
|
+
this.watcher = null;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
async generateClient(projectPath, outputPath) {
|
|
336
|
+
try {
|
|
337
|
+
const parser = new NestJSParser(projectPath);
|
|
338
|
+
const controllers = parser.findFusionControllers();
|
|
339
|
+
if (controllers.length === 0) {
|
|
340
|
+
logger.warn("No Fusion controllers found");
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
const generator = new ClientGenerator();
|
|
344
|
+
await generator.generate({
|
|
345
|
+
controllers,
|
|
346
|
+
outputPath
|
|
347
|
+
});
|
|
348
|
+
logger.success(`Generated client for ${controllers.length} controller(s)`);
|
|
349
|
+
} catch (error) {
|
|
350
|
+
logger.error("Failed to generate client:", error.message);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
export {
|
|
356
|
+
FileSystem,
|
|
357
|
+
filesystem,
|
|
358
|
+
NestJSParser,
|
|
359
|
+
ClientGenerator,
|
|
360
|
+
CodegenWatcher,
|
|
361
|
+
codegen_exports
|
|
362
|
+
};
|
|
363
|
+
//# sourceMappingURL=chunk-WZBBQLFT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/codegen/index.ts","../src/codegen/parser.ts","../src/core/filesystem.ts","../src/codegen/generator.ts","../src/codegen/watcher.ts"],"sourcesContent":["export * from './parser';\r\nexport * from './generator';\r\nexport * from './watcher';\r\n","import * as ts from 'typescript';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\nimport { getFusionMetadata } from '../nest/decorators';\r\n\r\nexport interface RouteInfo {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n path: string;\r\n handler: string;\r\n controllerName: string;\r\n}\r\n\r\nexport interface ControllerInfo {\r\n name: string;\r\n prefix: string;\r\n routes: RouteInfo[];\r\n}\r\n\r\n/**\r\n * Parse NestJS controllers to extract Fusion metadata\r\n */\r\nexport class NestJSParser {\r\n private program: ts.Program;\r\n\r\n constructor(private projectPath: string) {\r\n const configPath = ts.findConfigFile(projectPath, ts.sys.fileExists, 'tsconfig.json');\r\n if (!configPath) {\r\n throw new Error('tsconfig.json not found');\r\n }\r\n\r\n const config = ts.readConfigFile(configPath, ts.sys.readFile);\r\n const parsedConfig = ts.parseJsonConfigFileContent(\r\n config.config,\r\n ts.sys,\r\n path.dirname(configPath)\r\n );\r\n\r\n this.program = ts.createProgram(parsedConfig.fileNames, parsedConfig.options);\r\n }\r\n\r\n /**\r\n * Find all controllers with @FusionController decorator\r\n */\r\n findFusionControllers(): ControllerInfo[] {\r\n const controllers: ControllerInfo[] = [];\r\n const sourceFiles = this.program.getSourceFiles();\r\n\r\n for (const sourceFile of sourceFiles) {\r\n if (sourceFile.fileName.includes('node_modules')) continue;\r\n if (!sourceFile.fileName.includes('.controller.ts')) continue;\r\n\r\n const fileControllers = this.parseSourceFile(sourceFile);\r\n controllers.push(...fileControllers);\r\n }\r\n\r\n return controllers;\r\n }\r\n\r\n private parseSourceFile(sourceFile: ts.SourceFile): ControllerInfo[] {\r\n const controllers: ControllerInfo[] = [];\r\n\r\n ts.forEachChild(sourceFile, (node) => {\r\n if (ts.isClassDeclaration(node) && node.name) {\r\n const controllerInfo = this.parseController(node);\r\n if (controllerInfo) {\r\n controllers.push(controllerInfo);\r\n }\r\n }\r\n });\r\n\r\n return controllers;\r\n }\r\n\r\n private parseController(classNode: ts.ClassDeclaration): ControllerInfo | null {\r\n const decorators = ts.getDecorators(classNode);\r\n if (!decorators) return null;\r\n\r\n let controllerPrefix = '';\r\n let isFusionController = false;\r\n\r\n // Check for @FusionController decorator\r\n for (const decorator of decorators) {\r\n const expr = decorator.expression;\r\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\r\n const decoratorName = expr.expression.text;\r\n\r\n if (decoratorName === 'FusionController') {\r\n isFusionController = true;\r\n if (expr.arguments.length > 0) {\r\n const arg = expr.arguments[0];\r\n if (ts.isStringLiteral(arg)) {\r\n controllerPrefix = arg.text;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!isFusionController) return null;\r\n\r\n const routes = this.parseRoutes(classNode);\r\n const className = classNode.name?.text || 'Unknown';\r\n\r\n return {\r\n name: className,\r\n prefix: controllerPrefix,\r\n routes: routes.map(r => ({ ...r, controllerName: className })),\r\n };\r\n }\r\n\r\n private parseRoutes(classNode: ts.ClassDeclaration): RouteInfo[] {\r\n const routes: RouteInfo[] = [];\r\n\r\n classNode.members.forEach((member) => {\r\n if (ts.isMethodDeclaration(member)) {\r\n const decorators = ts.getDecorators(member);\r\n if (!decorators) return;\r\n\r\n for (const decorator of decorators) {\r\n const expr = decorator.expression;\r\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\r\n const decoratorName = expr.expression.text;\r\n\r\n let method: RouteInfo['method'] | null = null;\r\n let routePath = '';\r\n\r\n // Map decorator to HTTP method\r\n if (decoratorName === 'FusionGet') method = 'GET';\r\n else if (decoratorName === 'FusionPost') method = 'POST';\r\n else if (decoratorName === 'FusionPut') method = 'PUT';\r\n else if (decoratorName === 'FusionDelete') method = 'DELETE';\r\n\r\n if (method) {\r\n // Get route path from decorator argument\r\n if (expr.arguments.length > 0) {\r\n const arg = expr.arguments[0];\r\n if (ts.isStringLiteral(arg)) {\r\n routePath = arg.text;\r\n }\r\n }\r\n\r\n const handlerName = (member.name as ts.Identifier).text;\r\n\r\n routes.push({\r\n method,\r\n path: routePath,\r\n handler: handlerName,\r\n controllerName: '', // Will be set by caller\r\n });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n return routes;\r\n }\r\n}\r\n","import * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { promisify } from 'util';\r\n\r\nconst readFile = promisify(fs.readFile);\r\nconst writeFile = promisify(fs.writeFile);\r\nconst mkdir = promisify(fs.mkdir);\r\nconst access = promisify(fs.access);\r\n\r\nexport class FileSystem {\r\n /**\r\n * Read file as string\r\n */\r\n async readFile(filePath: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\r\n return readFile(filePath, encoding);\r\n }\r\n\r\n /**\r\n * Write file\r\n */\r\n async writeFile(filePath: string, content: string): Promise<void> {\r\n // Ensure directory exists\r\n await this.ensureDir(path.dirname(filePath));\r\n return writeFile(filePath, content, 'utf-8');\r\n }\r\n\r\n /**\r\n * Read JSON file\r\n */\r\n async readJSON<T = any>(filePath: string): Promise<T> {\r\n const content = await this.readFile(filePath);\r\n return JSON.parse(content);\r\n }\r\n\r\n /**\r\n * Write JSON file\r\n */\r\n async writeJSON(filePath: string, data: any, pretty: boolean = true): Promise<void> {\r\n const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\r\n return this.writeFile(filePath, content);\r\n }\r\n\r\n /**\r\n * Check if file/directory exists\r\n */\r\n async exists(filePath: string): Promise<boolean> {\r\n try {\r\n await access(filePath, fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Ensure directory exists (create if not)\r\n */\r\n async ensureDir(dirPath: string): Promise<void> {\r\n if (!(await this.exists(dirPath))) {\r\n await mkdir(dirPath, { recursive: true });\r\n }\r\n }\r\n\r\n /**\r\n * Copy file\r\n */\r\n async copyFile(src: string, dest: string): Promise<void> {\r\n const content = await this.readFile(src);\r\n await this.writeFile(dest, content);\r\n }\r\n\r\n /**\r\n * Read directory\r\n */\r\n readDir(dirPath: string): Promise<string[]> {\r\n return promisify(fs.readdir)(dirPath);\r\n }\r\n}\r\n\r\n// Export singleton\r\nexport const filesystem = new FileSystem();\r\n","import { ControllerInfo, RouteInfo } from './parser';\r\nimport { filesystem } from '../core/filesystem';\r\nimport * as path from 'path';\r\n\r\nexport interface GenerateOptions {\r\n controllers: ControllerInfo[];\r\n outputPath: string;\r\n baseUrl?: string;\r\n}\r\n\r\n/**\r\n * Generate TypeScript API client from controller metadata\r\n */\r\nexport class ClientGenerator {\r\n async generate(options: GenerateOptions): Promise<void> {\r\n const { controllers, outputPath } = options;\r\n\r\n // Generate client file\r\n const clientCode = this.generateClientCode(controllers, options.baseUrl);\r\n await filesystem.writeFile(path.join(outputPath, 'client.ts'), clientCode);\r\n\r\n // Generate barrel export\r\n const indexCode = `export * from './client';\\n`;\r\n await filesystem.writeFile(path.join(outputPath, 'index.ts'), indexCode);\r\n\r\n console.log(`✅ Generated API client at ${outputPath}`);\r\n }\r\n\r\n private generateClientCode(controllers: ControllerInfo[], baseUrl = '/api'): string {\r\n const imports = `import { FusionFetcher } from 'wexts/client';\\n\\n`;\r\n\r\n const clientClass = this.generateClientClass(controllers, baseUrl);\r\n\r\n const exports = `\\n// Export singleton instance\\nexport const apiClient = new ApiClient();\\n`;\r\n\r\n return imports + clientClass + exports;\r\n }\r\n\r\n private generateClientClass(controllers: ControllerInfo[], baseUrl: string): string {\r\n let code = `export class ApiClient {\\n`;\r\n code += ` private client: FusionFetcher;\\n\\n`;\r\n code += ` constructor(baseUrl: string = '${baseUrl}') {\\n`;\r\n code += ` this.client = new FusionFetcher(baseUrl);\\n`;\r\n code += ` }\\n\\n`;\r\n\r\n // Generate methods for each controller\r\n for (const controller of controllers) {\r\n const methods = this.generateControllerMethods(controller);\r\n code += methods;\r\n }\r\n\r\n code += `}\\n`;\r\n return code;\r\n }\r\n\r\n private generateControllerMethods(controller: ControllerInfo): string {\r\n let code = ` // ${controller.name} endpoints\\n`;\r\n\r\n for (const route of controller.routes) {\r\n const methodName = this.generateMethodName(controller, route);\r\n const methodCode = this.generateMethod(controller, route, methodName);\r\n code += methodCode + '\\n';\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private generateMethodName(controller: ControllerInfo, route: RouteInfo): string {\r\n // Convert handler name to camelCase\r\n // e.g., \"findAll\" -> \"getTodos\" (if controller is TodosController)\r\n const controllerBase = controller.name.replace('Controller', '').toLowerCase();\r\n\r\n if (route.handler === 'findAll') {\r\n return `get${this.capitalize(controllerBase)}`;\r\n } else if (route.handler === 'findOne') {\r\n return `get${this.capitalize(controllerBase)}ById`;\r\n } else if (route.handler === 'create') {\r\n return `create${this.capitalize(controllerBase.replace(/s$/, ''))}`;\r\n } else if (route.handler === 'update') {\r\n return `update${this.capitalize(controllerBase.replace(/s$/, ''))}`;\r\n } else if (route.handler === 'remove' || route.handler === 'delete') {\r\n return `delete${this.capitalize(controllerBase.replace(/s$/, ''))}`;\r\n }\r\n\r\n // Default: use handler name as-is\r\n return route.handler;\r\n }\r\n\r\n private generateMethod(controller: ControllerInfo, route: RouteInfo, methodName: string): string {\r\n const fullPath = `/${controller.prefix}${route.path}`;\r\n const hasPathParam = fullPath.includes(':');\r\n\r\n let params = '';\r\n let pathExpr = `'${fullPath}'`;\r\n\r\n if (hasPathParam) {\r\n // Extract path param name\r\n const paramMatch = fullPath.match(/:(\\w+)/);\r\n const paramName = paramMatch ? paramMatch[1] : 'id';\r\n params = `${paramName}: string`;\r\n pathExpr = `'${fullPath.replace(`:${paramName}`, '${' + paramName + '}')}'`;\r\n }\r\n\r\n // Add data param for POST/PUT\r\n if (route.method === 'POST' || route.method === 'PUT') {\r\n if (params) params += ', ';\r\n params += 'data: any';\r\n }\r\n\r\n let methodBody = '';\r\n\r\n if (route.method === 'GET' || route.method === 'DELETE') {\r\n methodBody = ` return this.client.${route.method.toLowerCase()}<any>(${pathExpr});`;\r\n } else {\r\n methodBody = ` return this.client.${route.method.toLowerCase()}<any>(${pathExpr}, data);`;\r\n }\r\n\r\n return ` async ${methodName}(${params}): Promise<any> {\\n${methodBody}\\n }\\n`;\r\n }\r\n\r\n private capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n }\r\n}\r\n","import * as chokidar from 'chokidar';\r\nimport { logger } from '../core/logger';\r\nimport { NestJSParser } from './parser';\r\nimport { ClientGenerator } from './generator';\r\n\r\nexport interface WatchOptions {\r\n projectPath: string;\r\n outputPath: string;\r\n pattern?: string;\r\n}\r\n\r\n/**\r\n * Watch NestJS controllers and regenerate client on changes\r\n */\r\nexport class CodegenWatcher {\r\n private watcher: chokidar.FSWatcher | null = null;\r\n\r\n async watch(options: WatchOptions): Promise<void> {\r\n const { projectPath, outputPath, pattern = '**/*.controller.ts' } = options;\r\n\r\n logger.info('👀 Watching for controller changes...');\r\n\r\n // Initial generation\r\n await this.generateClient(projectPath, outputPath);\r\n\r\n // Watch for changes\r\n this.watcher = chokidar.watch(pattern, {\r\n cwd: projectPath,\r\n ignored: /node_modules/,\r\n persistent: true,\r\n });\r\n\r\n this.watcher.on('change', async (path) => {\r\n logger.info(`📝 Controller changed: ${path}`);\r\n await this.generateClient(projectPath, outputPath);\r\n });\r\n\r\n this.watcher.on('add', async (path) => {\r\n logger.info(`➕ New controller: ${path}`);\r\n await this.generateClient(projectPath, outputPath);\r\n });\r\n\r\n this.watcher.on('unlink', async (path) => {\r\n logger.info(`➖ Controller removed: ${path}`);\r\n await this.generateClient(projectPath, outputPath);\r\n });\r\n }\r\n\r\n async stop(): Promise<void> {\r\n if (this.watcher) {\r\n await this.watcher.close();\r\n this.watcher = null;\r\n }\r\n }\r\n\r\n private async generateClient(projectPath: string, outputPath: string): Promise<void> {\r\n try {\r\n const parser = new NestJSParser(projectPath);\r\n const controllers = parser.findFusionControllers();\r\n\r\n if (controllers.length === 0) {\r\n logger.warn('No Fusion controllers found');\r\n return;\r\n }\r\n\r\n const generator = new ClientGenerator();\r\n await generator.generate({\r\n controllers,\r\n outputPath,\r\n });\r\n\r\n logger.success(`Generated client for ${controllers.length} controller(s)`);\r\n } catch (error: any) {\r\n logger.error('Failed to generate client:', error.message);\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["path","readFile","writeFile","mkdir","access","path","path"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
__export
|
|
4
|
+
} from "./chunk-H6XDQJ3N.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
|
+
getFusionMetadata: () => getFusionMetadata
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
// src/nest/decorators.ts
|
|
19
|
+
import "reflect-metadata";
|
|
20
|
+
var FUSION_METADATA_KEY = "fusion:routes";
|
|
21
|
+
function FusionController(prefix = "") {
|
|
22
|
+
return function(target) {
|
|
23
|
+
Reflect.defineMetadata("fusion:controller", { prefix }, target);
|
|
24
|
+
return target;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function FusionRoute(metadata) {
|
|
28
|
+
return function(target, propertyKey, descriptor) {
|
|
29
|
+
const routes = Reflect.getMetadata(FUSION_METADATA_KEY, target.constructor) || [];
|
|
30
|
+
routes.push({
|
|
31
|
+
...metadata,
|
|
32
|
+
handler: propertyKey
|
|
33
|
+
});
|
|
34
|
+
Reflect.defineMetadata(FUSION_METADATA_KEY, routes, target.constructor);
|
|
35
|
+
return descriptor;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function FusionGet(path = "") {
|
|
39
|
+
return FusionRoute({ method: "GET", path });
|
|
40
|
+
}
|
|
41
|
+
function FusionPost(path = "") {
|
|
42
|
+
return FusionRoute({ method: "POST", path });
|
|
43
|
+
}
|
|
44
|
+
function FusionPut(path = "") {
|
|
45
|
+
return FusionRoute({ method: "PUT", path });
|
|
46
|
+
}
|
|
47
|
+
function FusionDelete(path = "") {
|
|
48
|
+
return FusionRoute({ method: "DELETE", path });
|
|
49
|
+
}
|
|
50
|
+
function getFusionMetadata(controller) {
|
|
51
|
+
return {
|
|
52
|
+
controller: Reflect.getMetadata("fusion:controller", controller),
|
|
53
|
+
routes: Reflect.getMetadata(FUSION_METADATA_KEY, controller) || []
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export {
|
|
58
|
+
FusionController,
|
|
59
|
+
FusionRoute,
|
|
60
|
+
FusionGet,
|
|
61
|
+
FusionPost,
|
|
62
|
+
FusionPut,
|
|
63
|
+
FusionDelete,
|
|
64
|
+
getFusionMetadata,
|
|
65
|
+
nest_exports
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=chunk-XMPCR7N3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nest/index.ts","../src/nest/decorators.ts"],"sourcesContent":["export * from './decorators';\r\n","// NestJS Integration - Decorators for wexts\r\n// These decorators add metadata for auto API client generation\r\n\r\nimport 'reflect-metadata';\r\n\r\nexport interface FusionRouteMetadata {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n path: string;\r\n responseType?: string;\r\n requestType?: string;\r\n}\r\n\r\nconst FUSION_METADATA_KEY = 'fusion:routes';\r\n\r\n/**\r\n * Mark a NestJS controller for Fusion codegen\r\n * Usage: @FusionController('users')\r\n */\r\nexport function FusionController(prefix: string = ''): ClassDecorator {\r\n return function (target: any) {\r\n Reflect.defineMetadata('fusion:controller', { prefix }, target);\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Mark a route for API client generation\r\n * Usage: @FusionRoute({ method: 'GET', path: '/:id' })\r\n */\r\nexport function FusionRoute(metadata: FusionRouteMetadata): MethodDecorator {\r\n return function (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\r\n const routes = Reflect.getMetadata(FUSION_METADATA_KEY, target.constructor) || [];\r\n routes.push({\r\n ...metadata,\r\n handler: propertyKey,\r\n });\r\n Reflect.defineMetadata(FUSION_METADATA_KEY, routes, target.constructor);\r\n return descriptor;\r\n };\r\n}\r\n\r\n/**\r\n * Helper decorators for common HTTP methods\r\n */\r\nexport function FusionGet(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'GET', path });\r\n}\r\n\r\nexport function FusionPost(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'POST', path });\r\n}\r\n\r\nexport function FusionPut(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'PUT', path });\r\n}\r\n\r\nexport function FusionDelete(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'DELETE', path });\r\n}\r\n\r\n/**\r\n * Get Fusion metadata from a controller\r\n */\r\nexport function getFusionMetadata(controller: any): {\r\n controller: any;\r\n routes: any[];\r\n} {\r\n return {\r\n controller: Reflect.getMetadata('fusion:controller', controller),\r\n routes: Reflect.getMetadata(FUSION_METADATA_KEY, controller) || [],\r\n };\r\n}\r\n"],"mappings":";;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,OAAO;AASP,IAAM,sBAAsB;AAMrB,SAAS,iBAAiB,SAAiB,IAAoB;AAClE,SAAO,SAAU,QAAa;AAC1B,YAAQ,eAAe,qBAAqB,EAAE,OAAO,GAAG,MAAM;AAC9D,WAAO;AAAA,EACX;AACJ;AAMO,SAAS,YAAY,UAAgD;AACxE,SAAO,SAAU,QAAa,aAA8B,YAAgC;AACxF,UAAM,SAAS,QAAQ,YAAY,qBAAqB,OAAO,WAAW,KAAK,CAAC;AAChF,WAAO,KAAK;AAAA,MACR,GAAG;AAAA,MACH,SAAS;AAAA,IACb,CAAC;AACD,YAAQ,eAAe,qBAAqB,QAAQ,OAAO,WAAW;AACtE,WAAO;AAAA,EACX;AACJ;AAKO,SAAS,UAAU,OAAe,IAAqB;AAC1D,SAAO,YAAY,EAAE,QAAQ,OAAO,KAAK,CAAC;AAC9C;AAEO,SAAS,WAAW,OAAe,IAAqB;AAC3D,SAAO,YAAY,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAC/C;AAEO,SAAS,UAAU,OAAe,IAAqB;AAC1D,SAAO,YAAY,EAAE,QAAQ,OAAO,KAAK,CAAC;AAC9C;AAEO,SAAS,aAAa,OAAe,IAAqB;AAC7D,SAAO,YAAY,EAAE,QAAQ,UAAU,KAAK,CAAC;AACjD;AAKO,SAAS,kBAAkB,YAGhC;AACE,SAAO;AAAA,IACH,YAAY,QAAQ,YAAY,qBAAqB,UAAU;AAAA,IAC/D,QAAQ,QAAQ,YAAY,qBAAqB,UAAU,KAAK,CAAC;AAAA,EACrE;AACJ;","names":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
#!/usr/bin/env node
|
|
3
|
+
import {
|
|
4
|
+
logger
|
|
5
|
+
} from "../chunk-A5OZK2TO.mjs";
|
|
6
|
+
import "../chunk-H6XDQJ3N.mjs";
|
|
7
|
+
|
|
8
|
+
// src/cli/index.ts
|
|
9
|
+
import { Command } from "commander";
|
|
10
|
+
import * as pc from "picocolors";
|
|
11
|
+
var program = new Command();
|
|
12
|
+
program.name("fusion").description("wexts - Full-stack framework CLI").version("1.0.0");
|
|
13
|
+
program.command("create <project-name>").description("Create a new wexts project").option("-t, --template <template>", "Template to use (monorepo|api|web)", "monorepo").action(async (projectName, options) => {
|
|
14
|
+
logger.info(pc.cyan(`Creating wexts project: ${pc.bold(projectName)}`));
|
|
15
|
+
logger.info(`Template: ${options.template}`);
|
|
16
|
+
logger.warn("Project scaffolding not yet implemented");
|
|
17
|
+
logger.info("Will create:");
|
|
18
|
+
logger.info(" \u2022 apps/api/ (NestJS 10)");
|
|
19
|
+
logger.info(" \u2022 apps/web/ (Next.js 16)");
|
|
20
|
+
logger.info(" \u2022 packages/types/");
|
|
21
|
+
logger.info(" \u2022 packages/api-client/");
|
|
22
|
+
});
|
|
23
|
+
program.command("dev").description("Start development servers").option("-a, --api <path>", "Path to API project", "./apps/api").option("-w, --web <path>", "Path to Web project", "./apps/web").option("-p, --port <port>", "Port for web server", "3000").option("--api-port <port>", "Port for API server", "5050").option("--no-proxy", "Disable proxy server").action(async (options) => {
|
|
24
|
+
logger.info(pc.green("\u{1F680} Starting Fusion development servers...\n"));
|
|
25
|
+
const { DevServer } = await import("../dev-server-K5YZAZY2.mjs");
|
|
26
|
+
const server = new DevServer.FusionDevServer();
|
|
27
|
+
try {
|
|
28
|
+
await server.start({
|
|
29
|
+
apiPath: options.api,
|
|
30
|
+
webPath: options.web,
|
|
31
|
+
webPort: parseInt(options.port),
|
|
32
|
+
apiPort: parseInt(options.apiPort),
|
|
33
|
+
useProxy: options.proxy
|
|
34
|
+
});
|
|
35
|
+
} catch (error) {
|
|
36
|
+
logger.error("Failed to start dev server:", error.message);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
program.command("build").description("Build for production").action(async () => {
|
|
41
|
+
logger.info(pc.blue("Building Fusion project..."));
|
|
42
|
+
logger.warn("Build not yet implemented");
|
|
43
|
+
});
|
|
44
|
+
program.command("generate <type> <name>").alias("g").description("Generate code (controller|module|page)").action(async (type, name) => {
|
|
45
|
+
logger.info(pc.magenta(`Generating ${type}: ${name}`));
|
|
46
|
+
logger.warn("Code generation not yet implemented");
|
|
47
|
+
});
|
|
48
|
+
program.command("codegen").description("Generate API client from NestJS controllers").option("-w, --watch", "Watch mode - regenerate on changes").option("-p, --project <path>", "Path to NestJS project", "./apps/api").option("-o, --output <path>", "Output path for generated client", "./packages/api-client/src").action(async (options) => {
|
|
49
|
+
const { Codegen } = await import("../codegen-ZZBQIGUQ.mjs");
|
|
50
|
+
if (options.watch) {
|
|
51
|
+
logger.info(pc.cyan("Starting codegen in watch mode..."));
|
|
52
|
+
const watcher = new Codegen.CodegenWatcher();
|
|
53
|
+
await watcher.watch({
|
|
54
|
+
projectPath: options.project,
|
|
55
|
+
outputPath: options.output
|
|
56
|
+
});
|
|
57
|
+
} else {
|
|
58
|
+
logger.info(pc.cyan("Generating API client..."));
|
|
59
|
+
const parser = new Codegen.NestJSParser(options.project);
|
|
60
|
+
const controllers = parser.findFusionControllers();
|
|
61
|
+
const generator = new Codegen.ClientGenerator();
|
|
62
|
+
await generator.generate({
|
|
63
|
+
controllers,
|
|
64
|
+
outputPath: options.output
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
program.parse();
|
|
69
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Command } from 'commander';\r\nimport { logger } from '../core/logger';\r\nimport * as pc from 'picocolors';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('fusion')\r\n .description('wexts - Full-stack framework CLI')\r\n .version('1.0.0');\r\n\r\n// Create Command\r\nprogram\r\n .command('create <project-name>')\r\n .description('Create a new wexts project')\r\n .option('-t, --template <template>', 'Template to use (monorepo|api|web)', 'monorepo')\r\n .action(async (projectName: string, options: any) => {\r\n logger.info(pc.cyan(`Creating wexts project: ${pc.bold(projectName)}`));\r\n logger.info(`Template: ${options.template}`);\r\n\r\n // TODO: Implement project scaffolding\r\n logger.warn('Project scaffolding not yet implemented');\r\n logger.info('Will create:');\r\n logger.info(' • apps/api/ (NestJS 10)');\r\n logger.info(' • apps/web/ (Next.js 16)');\r\n logger.info(' • packages/types/');\r\n logger.info(' • packages/api-client/');\r\n });\r\n\r\n// Dev Command\r\nprogram\r\n .command('dev')\r\n .description('Start development servers')\r\n .option('-a, --api <path>', 'Path to API project', './apps/api')\r\n .option('-w, --web <path>', 'Path to Web project', './apps/web')\r\n .option('-p, --port <port>', 'Port for web server', '3000')\r\n .option('--api-port <port>', 'Port for API server', '5050')\r\n .option('--no-proxy', 'Disable proxy server')\r\n .action(async (options: any) => {\r\n logger.info(pc.green('🚀 Starting Fusion development servers...\\n'));\r\n\r\n const { DevServer } = await import('../dev-server/index.js');\r\n const server = new DevServer.FusionDevServer();\r\n\r\n try {\r\n await server.start({\r\n apiPath: options.api,\r\n webPath: options.web,\r\n webPort: parseInt(options.port),\r\n apiPort: parseInt(options.apiPort),\r\n useProxy: options.proxy,\r\n });\r\n } catch (error: any) {\r\n logger.error('Failed to start dev server:', error.message);\r\n process.exit(1);\r\n }\r\n });\r\n\r\n// Build Command\r\nprogram\r\n .command('build')\r\n .description('Build for production')\r\n .action(async () => {\r\n logger.info(pc.blue('Building Fusion project...'));\r\n\r\n // TODO: Build logic\r\n logger.warn('Build not yet implemented');\r\n });\r\n\r\n// Generate Command\r\nprogram\r\n .command('generate <type> <name>')\r\n .alias('g')\r\n .description('Generate code (controller|module|page)')\r\n .action(async (type: string, name: string) => {\r\n logger.info(pc.magenta(`Generating ${type}: ${name}`));\r\n\r\n // TODO: Code generation\r\n logger.warn('Code generation not yet implemented');\r\n });\r\n\r\n// Codegen Command\r\nprogram\r\n .command('codegen')\r\n .description('Generate API client from NestJS controllers')\r\n .option('-w, --watch', 'Watch mode - regenerate on changes')\r\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\r\n .option('-o, --output <path>', 'Output path for generated client', './packages/api-client/src')\r\n .action(async (options: any) => {\r\n const { Codegen } = await import('../codegen/index.js');\r\n\r\n if (options.watch) {\r\n logger.info(pc.cyan('Starting codegen in watch mode...'));\r\n const watcher = new Codegen.CodegenWatcher();\r\n await watcher.watch({\r\n projectPath: options.project,\r\n outputPath: options.output,\r\n });\r\n } else {\r\n logger.info(pc.cyan('Generating API client...'));\r\n const parser = new Codegen.NestJSParser(options.project);\r\n const controllers = parser.findFusionControllers();\r\n\r\n const generator = new Codegen.ClientGenerator();\r\n await generator.generate({\r\n controllers,\r\n outputPath: options.output,\r\n });\r\n }\r\n });\r\n\r\nprogram.parse();\r\n"],"mappings":";;;;;;;;AAEA,SAAS,eAAe;AAExB,YAAY,QAAQ;AAEpB,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACK,KAAK,QAAQ,EACb,YAAY,kCAAkC,EAC9C,QAAQ,OAAO;AAGpB,QACK,QAAQ,uBAAuB,EAC/B,YAAY,4BAA4B,EACxC,OAAO,6BAA6B,sCAAsC,UAAU,EACpF,OAAO,OAAO,aAAqB,YAAiB;AACjD,SAAO,KAAQ,QAAK,2BAA8B,QAAK,WAAW,CAAC,EAAE,CAAC;AACtE,SAAO,KAAK,aAAa,QAAQ,QAAQ,EAAE;AAG3C,SAAO,KAAK,yCAAyC;AACrD,SAAO,KAAK,cAAc;AAC1B,SAAO,KAAK,gCAA2B;AACvC,SAAO,KAAK,iCAA4B;AACxC,SAAO,KAAK,0BAAqB;AACjC,SAAO,KAAK,+BAA0B;AAC1C,CAAC;AAGL,QACK,QAAQ,KAAK,EACb,YAAY,2BAA2B,EACvC,OAAO,oBAAoB,uBAAuB,YAAY,EAC9D,OAAO,oBAAoB,uBAAuB,YAAY,EAC9D,OAAO,qBAAqB,uBAAuB,MAAM,EACzD,OAAO,qBAAqB,uBAAuB,MAAM,EACzD,OAAO,cAAc,sBAAsB,EAC3C,OAAO,OAAO,YAAiB;AAC5B,SAAO,KAAQ,SAAM,oDAA6C,CAAC;AAEnE,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,4BAAwB;AAC3D,QAAM,SAAS,IAAI,UAAU,gBAAgB;AAE7C,MAAI;AACA,UAAM,OAAO,MAAM;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,SAAS,QAAQ;AAAA,MACjB,SAAS,SAAS,QAAQ,IAAI;AAAA,MAC9B,SAAS,SAAS,QAAQ,OAAO;AAAA,MACjC,UAAU,QAAQ;AAAA,IACtB,CAAC;AAAA,EACL,SAAS,OAAY;AACjB,WAAO,MAAM,+BAA+B,MAAM,OAAO;AACzD,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAGL,QACK,QAAQ,OAAO,EACf,YAAY,sBAAsB,EAClC,OAAO,YAAY;AAChB,SAAO,KAAQ,QAAK,4BAA4B,CAAC;AAGjD,SAAO,KAAK,2BAA2B;AAC3C,CAAC;AAGL,QACK,QAAQ,wBAAwB,EAChC,MAAM,GAAG,EACT,YAAY,wCAAwC,EACpD,OAAO,OAAO,MAAc,SAAiB;AAC1C,SAAO,KAAQ,WAAQ,cAAc,IAAI,KAAK,IAAI,EAAE,CAAC;AAGrD,SAAO,KAAK,qCAAqC;AACrD,CAAC;AAGL,QACK,QAAQ,SAAS,EACjB,YAAY,6CAA6C,EACzD,OAAO,eAAe,oCAAoC,EAC1D,OAAO,wBAAwB,0BAA0B,YAAY,EACrE,OAAO,uBAAuB,oCAAoC,2BAA2B,EAC7F,OAAO,OAAO,YAAiB;AAC5B,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,yBAAqB;AAEtD,MAAI,QAAQ,OAAO;AACf,WAAO,KAAQ,QAAK,mCAAmC,CAAC;AACxD,UAAM,UAAU,IAAI,QAAQ,eAAe;AAC3C,UAAM,QAAQ,MAAM;AAAA,MAChB,aAAa,QAAQ;AAAA,MACrB,YAAY,QAAQ;AAAA,IACxB,CAAC;AAAA,EACL,OAAO;AACH,WAAO,KAAQ,QAAK,0BAA0B,CAAC;AAC/C,UAAM,SAAS,IAAI,QAAQ,aAAa,QAAQ,OAAO;AACvD,UAAM,cAAc,OAAO,sBAAsB;AAEjD,UAAM,YAAY,IAAI,QAAQ,gBAAgB;AAC9C,UAAM,UAAU,SAAS;AAAA,MACrB;AAAA,MACA,YAAY,QAAQ;AAAA,IACxB,CAAC;AAAA,EACL;AACJ,CAAC;AAEL,QAAQ,MAAM;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunk2ZKONAXCjs = require('../chunk-2ZKONAXC.js');
|
|
6
|
+
require('../chunk-2H7UOFLK.js');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
exports.FusionFetcher = _chunk2ZKONAXCjs.FusionFetcher; exports.apiFetcher = _chunk2ZKONAXCjs.apiFetcher;
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\FusionJS\\packages\\fusionjs\\dist\\client\\index.js"],"names":[],"mappings":"AAAA;AACA;AACE;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,yGAAC","file":"C:\\Users\\ziad\\Desktop\\FusionJS\\packages\\fusionjs\\dist\\client\\index.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkQUV6QXTPjs = require('./chunk-QUV6QXTP.js');
|
|
7
|
+
require('./chunk-HE3JQ62E.js');
|
|
8
|
+
require('./chunk-2H7UOFLK.js');
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
exports.ClientGenerator = _chunkQUV6QXTPjs.ClientGenerator; exports.CodegenWatcher = _chunkQUV6QXTPjs.CodegenWatcher; exports.NestJSParser = _chunkQUV6QXTPjs.NestJSParser;
|
|
14
|
+
//# sourceMappingURL=codegen-J3XOZCQZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\FusionJS\\packages\\fusionjs\\dist\\codegen-J3XOZCQZ.js"],"names":[],"mappings":"AAAA;AACA;AACE;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACF,2KAAC","file":"C:\\Users\\ziad\\Desktop\\FusionJS\\packages\\fusionjs\\dist\\codegen-J3XOZCQZ.js"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ClientGenerator,
|
|
4
|
+
CodegenWatcher,
|
|
5
|
+
NestJSParser
|
|
6
|
+
} from "./chunk-WZBBQLFT.mjs";
|
|
7
|
+
import "./chunk-A5OZK2TO.mjs";
|
|
8
|
+
import "./chunk-H6XDQJ3N.mjs";
|
|
9
|
+
export {
|
|
10
|
+
ClientGenerator,
|
|
11
|
+
CodegenWatcher,
|
|
12
|
+
NestJSParser
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=codegen-ZZBQIGUQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
FusionDevServer,
|
|
4
|
+
ProcessRunner,
|
|
5
|
+
ProxyServer
|
|
6
|
+
} from "./chunk-HHXRAV67.mjs";
|
|
7
|
+
import "./chunk-A5OZK2TO.mjs";
|
|
8
|
+
import "./chunk-H6XDQJ3N.mjs";
|
|
9
|
+
export {
|
|
10
|
+
FusionDevServer,
|
|
11
|
+
ProcessRunner,
|
|
12
|
+
ProxyServer
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=dev-server-K5YZAZY2.mjs.map
|