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,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
3
|
+
|
|
4
|
+
var _chunk2H7UOFLKjs = require('./chunk-2H7UOFLK.js');
|
|
5
|
+
|
|
6
|
+
// src/nest/index.ts
|
|
7
|
+
var nest_exports = {};
|
|
8
|
+
_chunk2H7UOFLKjs.__export.call(void 0, 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
|
+
require('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
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
exports.FusionController = FusionController; exports.FusionRoute = FusionRoute; exports.FusionGet = FusionGet; exports.FusionPost = FusionPost; exports.FusionPut = FusionPut; exports.FusionDelete = FusionDelete; exports.getFusionMetadata = getFusionMetadata; exports.nest_exports = nest_exports;
|
|
67
|
+
//# sourceMappingURL=chunk-6KN6UIHT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\FusionJS\\packages\\fusionjs\\dist\\chunk-6KN6UIHT.js"],"names":[],"mappings":"AAAA;AACA;AACE;AACF,sDAA4B;AAC5B;AACA;AACA,IAAI,aAAa,EAAE,CAAC,CAAC;AACrB,uCAAQ,YAAa,EAAE;AACvB,EAAE,gBAAgB,EAAE,CAAC,EAAE,GAAG,gBAAgB;AAC1C,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,YAAY;AAClC,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,SAAS;AAC5B,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,UAAU;AAC9B,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,SAAS;AAC5B,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,WAAW;AAChC,EAAE,iBAAiB,EAAE,CAAC,EAAE,GAAG;AAC3B,CAAC,CAAC;AACF;AACA;AACA,4BAAyB;AACzB,IAAI,oBAAoB,EAAE,eAAe;AACzC,SAAS,gBAAgB,CAAC,OAAO,EAAE,EAAE,EAAE;AACvC,EAAE,OAAO,QAAQ,CAAC,MAAM,EAAE;AAC1B,IAAI,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC;AACnE,IAAI,OAAO,MAAM;AACjB,EAAE,CAAC;AACH;AACA,SAAS,WAAW,CAAC,QAAQ,EAAE;AAC/B,EAAE,OAAO,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE;AACnD,IAAI,MAAM,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACrF,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,MAAM,GAAG,QAAQ;AACjB,MAAM,OAAO,EAAE;AACf,IAAI,CAAC,CAAC;AACN,IAAI,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;AAC3E,IAAI,OAAO,UAAU;AACrB,EAAE,CAAC;AACH;AACA,SAAS,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE;AAC9B,EAAE,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC7C;AACA,SAAS,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE;AAC/B,EAAE,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAC9C;AACA,SAAS,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE;AAC9B,EAAE,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC7C;AACA,SAAS,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE;AACjC,EAAE,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAChD;AACA,SAAS,iBAAiB,CAAC,UAAU,EAAE;AACvC,EAAE,OAAO;AACT,IAAI,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,UAAU,CAAC;AACpE,IAAI,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,UAAU,EAAE,GAAG,CAAC;AACrE,EAAE,CAAC;AACH;AACA;AACA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,uSAAC","file":"C:\\Users\\ziad\\Desktop\\FusionJS\\packages\\fusionjs\\dist\\chunk-6KN6UIHT.js","sourcesContent":[null]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/core/logger.ts
|
|
4
|
+
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
5
|
+
LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG";
|
|
6
|
+
LogLevel2[LogLevel2["INFO"] = 1] = "INFO";
|
|
7
|
+
LogLevel2[LogLevel2["WARN"] = 2] = "WARN";
|
|
8
|
+
LogLevel2[LogLevel2["ERROR"] = 3] = "ERROR";
|
|
9
|
+
return LogLevel2;
|
|
10
|
+
})(LogLevel || {});
|
|
11
|
+
var Logger = class {
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
this.level = options.level ?? 1 /* INFO */;
|
|
14
|
+
this.prefix = options.prefix ?? "[Fusion]";
|
|
15
|
+
this.timestamp = options.timestamp ?? true;
|
|
16
|
+
}
|
|
17
|
+
formatMessage(level, ...args) {
|
|
18
|
+
const timestamp = this.timestamp ? `[${(/* @__PURE__ */ new Date()).toISOString()}]` : "";
|
|
19
|
+
return `${timestamp} ${this.prefix} ${level}: ${args.join(" ")}`;
|
|
20
|
+
}
|
|
21
|
+
debug(...args) {
|
|
22
|
+
if (this.level <= 0 /* DEBUG */) {
|
|
23
|
+
console.log(this.formatMessage("DEBUG", ...args));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
info(...args) {
|
|
27
|
+
if (this.level <= 1 /* INFO */) {
|
|
28
|
+
console.log(this.formatMessage("INFO", ...args));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
warn(...args) {
|
|
32
|
+
if (this.level <= 2 /* WARN */) {
|
|
33
|
+
console.warn(this.formatMessage("WARN", ...args));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
error(...args) {
|
|
37
|
+
if (this.level <= 3 /* ERROR */) {
|
|
38
|
+
console.error(this.formatMessage("ERROR", ...args));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
success(...args) {
|
|
42
|
+
console.log(this.formatMessage("\u2713", ...args));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
var logger = new Logger();
|
|
46
|
+
function createLogger(options) {
|
|
47
|
+
return new Logger(options);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export {
|
|
51
|
+
LogLevel,
|
|
52
|
+
Logger,
|
|
53
|
+
logger,
|
|
54
|
+
createLogger
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=chunk-A5OZK2TO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/logger.ts"],"sourcesContent":["export enum LogLevel {\r\n DEBUG = 0,\r\n INFO = 1,\r\n WARN = 2,\r\n ERROR = 3,\r\n}\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n prefix?: string;\r\n timestamp?: boolean;\r\n}\r\n\r\nexport class Logger {\r\n private level: LogLevel;\r\n private prefix: string;\r\n private timestamp: boolean;\r\n\r\n constructor(options: LoggerOptions = {}) {\r\n this.level = options.level ?? LogLevel.INFO;\r\n this.prefix = options.prefix ?? '[Fusion]';\r\n this.timestamp = options.timestamp ?? true;\r\n }\r\n\r\n private formatMessage(level: string, ...args: any[]): string {\r\n const timestamp = this.timestamp ? `[${new Date().toISOString()}]` : '';\r\n return `${timestamp} ${this.prefix} ${level}: ${args.join(' ')}`;\r\n }\r\n\r\n debug(...args: any[]): void {\r\n if (this.level <= LogLevel.DEBUG) {\r\n console.log(this.formatMessage('DEBUG', ...args));\r\n }\r\n }\r\n\r\n info(...args: any[]): void {\r\n if (this.level <= LogLevel.INFO) {\r\n console.log(this.formatMessage('INFO', ...args));\r\n }\r\n }\r\n\r\n warn(...args: any[]): void {\r\n if (this.level <= LogLevel.WARN) {\r\n console.warn(this.formatMessage('WARN', ...args));\r\n }\r\n }\r\n\r\n error(...args: any[]): void {\r\n if (this.level <= LogLevel.ERROR) {\r\n console.error(this.formatMessage('ERROR', ...args));\r\n }\r\n }\r\n\r\n success(...args: any[]): void {\r\n console.log(this.formatMessage('ā', ...args));\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const logger = new Logger();\r\n\r\n// Export factory\r\nexport function createLogger(options: LoggerOptions): Logger {\r\n return new Logger(options);\r\n}\r\n"],"mappings":";;;AAAO,IAAK,WAAL,kBAAKA,cAAL;AACH,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,WAAQ,KAAR;AAJQ,SAAAA;AAAA,GAAA;AAaL,IAAM,SAAN,MAAa;AAAA,EAKhB,YAAY,UAAyB,CAAC,GAAG;AACrC,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,YAAY,QAAQ,aAAa;AAAA,EAC1C;AAAA,EAEQ,cAAc,UAAkB,MAAqB;AACzD,UAAM,YAAY,KAAK,YAAY,KAAI,oBAAI,KAAK,GAAE,YAAY,CAAC,MAAM;AACrE,WAAO,GAAG,SAAS,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAAA,EAClE;AAAA,EAEA,SAAS,MAAmB;AACxB,QAAI,KAAK,SAAS,eAAgB;AAC9B,cAAQ,IAAI,KAAK,cAAc,SAAS,GAAG,IAAI,CAAC;AAAA,IACpD;AAAA,EACJ;AAAA,EAEA,QAAQ,MAAmB;AACvB,QAAI,KAAK,SAAS,cAAe;AAC7B,cAAQ,IAAI,KAAK,cAAc,QAAQ,GAAG,IAAI,CAAC;AAAA,IACnD;AAAA,EACJ;AAAA,EAEA,QAAQ,MAAmB;AACvB,QAAI,KAAK,SAAS,cAAe;AAC7B,cAAQ,KAAK,KAAK,cAAc,QAAQ,GAAG,IAAI,CAAC;AAAA,IACpD;AAAA,EACJ;AAAA,EAEA,SAAS,MAAmB;AACxB,QAAI,KAAK,SAAS,eAAgB;AAC9B,cAAQ,MAAM,KAAK,cAAc,SAAS,GAAG,IAAI,CAAC;AAAA,IACtD;AAAA,EACJ;AAAA,EAEA,WAAW,MAAmB;AAC1B,YAAQ,IAAI,KAAK,cAAc,UAAK,GAAG,IAAI,CAAC;AAAA,EAChD;AACJ;AAGO,IAAM,SAAS,IAAI,OAAO;AAG1B,SAAS,aAAa,SAAgC;AACzD,SAAO,IAAI,OAAO,OAAO;AAC7B;","names":["LogLevel"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
3
|
+
|
|
4
|
+
var _chunk2ZKONAXCjs = require('./chunk-2ZKONAXC.js');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunk2H7UOFLKjs = require('./chunk-2H7UOFLK.js');
|
|
8
|
+
|
|
9
|
+
// src/next/index.ts
|
|
10
|
+
var next_exports = {};
|
|
11
|
+
_chunk2H7UOFLKjs.__export.call(void 0, next_exports, {
|
|
12
|
+
FusionProvider: () => FusionProvider,
|
|
13
|
+
useAuth: () => useAuth,
|
|
14
|
+
useFusion: () => useFusion
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// src/next/provider.tsx
|
|
18
|
+
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
19
|
+
var FusionContext = _react.createContext.call(void 0, null);
|
|
20
|
+
function FusionProvider({ children, baseUrl = "/api" }) {
|
|
21
|
+
const client = _react2.default.useMemo(() => new (0, _chunk2ZKONAXCjs.FusionFetcher)(baseUrl), [baseUrl]);
|
|
22
|
+
return /* @__PURE__ */ _react2.default.createElement(FusionContext.Provider, { value: { client } }, children);
|
|
23
|
+
}
|
|
24
|
+
function useFusion() {
|
|
25
|
+
const context = _react.useContext.call(void 0, FusionContext);
|
|
26
|
+
if (!context) {
|
|
27
|
+
throw new Error("useFusion must be used within FusionProvider");
|
|
28
|
+
}
|
|
29
|
+
return context;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// src/next/useAuth.ts
|
|
33
|
+
|
|
34
|
+
function useAuth() {
|
|
35
|
+
const { client } = useFusion();
|
|
36
|
+
const [user, setUser] = _react.useState.call(void 0, null);
|
|
37
|
+
const [loading, setLoading] = _react.useState.call(void 0, true);
|
|
38
|
+
_react.useEffect.call(void 0, () => {
|
|
39
|
+
const token = localStorage.getItem("fusion_token");
|
|
40
|
+
if (token) {
|
|
41
|
+
loadUser();
|
|
42
|
+
} else {
|
|
43
|
+
setLoading(false);
|
|
44
|
+
}
|
|
45
|
+
}, []);
|
|
46
|
+
const loadUser = async () => {
|
|
47
|
+
try {
|
|
48
|
+
const userData = await client.get("/auth/me");
|
|
49
|
+
setUser(userData);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
localStorage.removeItem("fusion_token");
|
|
52
|
+
} finally {
|
|
53
|
+
setLoading(false);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const login = async (email, password) => {
|
|
57
|
+
const response = await client.post("/auth/login", {
|
|
58
|
+
email,
|
|
59
|
+
password
|
|
60
|
+
});
|
|
61
|
+
localStorage.setItem("fusion_token", response.token);
|
|
62
|
+
setUser(response.user);
|
|
63
|
+
};
|
|
64
|
+
const logout = async () => {
|
|
65
|
+
localStorage.removeItem("fusion_token");
|
|
66
|
+
setUser(null);
|
|
67
|
+
};
|
|
68
|
+
return {
|
|
69
|
+
user,
|
|
70
|
+
loading,
|
|
71
|
+
login,
|
|
72
|
+
logout,
|
|
73
|
+
isAuthenticated: !!user
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
exports.FusionProvider = FusionProvider; exports.useFusion = useFusion; exports.useAuth = useAuth; exports.next_exports = next_exports;
|
|
83
|
+
//# sourceMappingURL=chunk-ELVFG4US.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\FusionJS\\packages\\fusionjs\\dist\\chunk-ELVFG4US.js"],"names":[],"mappings":"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","file":"C:\\Users\\ziad\\Desktop\\FusionJS\\packages\\fusionjs\\dist\\chunk-ELVFG4US.js","sourcesContent":[null]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __export = (target, all) => {
|
|
4
|
+
for (var name in all)
|
|
5
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
__export
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=chunk-H6XDQJ3N.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
3
|
+
// src/core/logger.ts
|
|
4
|
+
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
5
|
+
LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG";
|
|
6
|
+
LogLevel2[LogLevel2["INFO"] = 1] = "INFO";
|
|
7
|
+
LogLevel2[LogLevel2["WARN"] = 2] = "WARN";
|
|
8
|
+
LogLevel2[LogLevel2["ERROR"] = 3] = "ERROR";
|
|
9
|
+
return LogLevel2;
|
|
10
|
+
})(LogLevel || {});
|
|
11
|
+
var Logger = class {
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
this.level = _nullishCoalesce(options.level, () => ( 1)) /* INFO */;
|
|
14
|
+
this.prefix = _nullishCoalesce(options.prefix, () => ( "[Fusion]"));
|
|
15
|
+
this.timestamp = _nullishCoalesce(options.timestamp, () => ( true));
|
|
16
|
+
}
|
|
17
|
+
formatMessage(level, ...args) {
|
|
18
|
+
const timestamp = this.timestamp ? `[${(/* @__PURE__ */ new Date()).toISOString()}]` : "";
|
|
19
|
+
return `${timestamp} ${this.prefix} ${level}: ${args.join(" ")}`;
|
|
20
|
+
}
|
|
21
|
+
debug(...args) {
|
|
22
|
+
if (this.level <= 0 /* DEBUG */) {
|
|
23
|
+
console.log(this.formatMessage("DEBUG", ...args));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
info(...args) {
|
|
27
|
+
if (this.level <= 1 /* INFO */) {
|
|
28
|
+
console.log(this.formatMessage("INFO", ...args));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
warn(...args) {
|
|
32
|
+
if (this.level <= 2 /* WARN */) {
|
|
33
|
+
console.warn(this.formatMessage("WARN", ...args));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
error(...args) {
|
|
37
|
+
if (this.level <= 3 /* ERROR */) {
|
|
38
|
+
console.error(this.formatMessage("ERROR", ...args));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
success(...args) {
|
|
42
|
+
console.log(this.formatMessage("\u2713", ...args));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
var logger = new Logger();
|
|
46
|
+
function createLogger(options) {
|
|
47
|
+
return new Logger(options);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
exports.LogLevel = LogLevel; exports.Logger = Logger; exports.logger = logger; exports.createLogger = createLogger;
|
|
56
|
+
//# sourceMappingURL=chunk-HE3JQ62E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\FusionJS\\packages\\fusionjs\\dist\\chunk-HE3JQ62E.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,IAAI,SAAS,kBAAkB,CAAC,CAAC,SAAS,EAAE,GAAG;AAC/C,EAAE,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO;AAC7C,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM;AAC3C,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM;AAC3C,EAAE,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO;AAC7C,EAAE,OAAO,SAAS;AAClB,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;AAClB,IAAI,OAAO,EAAE,MAAM;AACnB,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;AAC5B,IAAI,IAAI,CAAC,MAAM,mBAAE,OAAO,CAAC,KAAM,UAAG,cAAY;AAC9C,IAAI,IAAI,CAAC,OAAO,mBAAE,OAAO,CAAC,MAAO,UAAG,YAAU;AAC9C,IAAI,IAAI,CAAC,UAAU,mBAAE,OAAO,CAAC,SAAU,UAAG,MAAI;AAC9C,EAAE;AACF,EAAE,aAAa,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE;AAChC,IAAI,MAAM,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE;AAC7F,IAAI,OAAO,CAAC,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"C:\\Users\\ziad\\Desktop\\FusionJS\\packages\\fusionjs\\dist\\chunk-HE3JQ62E.js","sourcesContent":[null]}
|
|
@@ -0,0 +1,229 @@
|
|
|
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/dev-server/index.ts
|
|
10
|
+
var dev_server_exports = {};
|
|
11
|
+
__export(dev_server_exports, {
|
|
12
|
+
FusionDevServer: () => FusionDevServer,
|
|
13
|
+
ProcessRunner: () => ProcessRunner,
|
|
14
|
+
ProxyServer: () => ProxyServer
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// src/dev-server/process-runner.ts
|
|
18
|
+
import { spawn } from "child_process";
|
|
19
|
+
import * as pc from "picocolors";
|
|
20
|
+
var ProcessRunner = class {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.processes = /* @__PURE__ */ new Map();
|
|
23
|
+
this.colors = {
|
|
24
|
+
cyan: pc.cyan,
|
|
25
|
+
green: pc.green,
|
|
26
|
+
yellow: pc.yellow,
|
|
27
|
+
magenta: pc.magenta,
|
|
28
|
+
blue: pc.blue
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async run(configs) {
|
|
32
|
+
logger.info("\u{1F680} Starting development servers...\n");
|
|
33
|
+
for (const config of configs) {
|
|
34
|
+
this.startProcess(config);
|
|
35
|
+
}
|
|
36
|
+
process.on("SIGINT", () => this.stopAll());
|
|
37
|
+
process.on("SIGTERM", () => this.stopAll());
|
|
38
|
+
}
|
|
39
|
+
startProcess(config) {
|
|
40
|
+
const { name, command, args, cwd, color, env } = config;
|
|
41
|
+
const colorFn = this.colors[color];
|
|
42
|
+
const prefix = colorFn(`[${name}]`);
|
|
43
|
+
logger.info(`${prefix} Starting...`);
|
|
44
|
+
const proc = spawn(command, args, {
|
|
45
|
+
cwd,
|
|
46
|
+
stdio: "pipe",
|
|
47
|
+
shell: true,
|
|
48
|
+
env: { ...process.env, ...env }
|
|
49
|
+
});
|
|
50
|
+
this.processes.set(name, proc);
|
|
51
|
+
proc.stdout?.on("data", (data) => {
|
|
52
|
+
const lines = data.toString().split("\n").filter((l) => l.trim());
|
|
53
|
+
lines.forEach((line) => {
|
|
54
|
+
console.log(`${prefix} ${line}`);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
proc.stderr?.on("data", (data) => {
|
|
58
|
+
const lines = data.toString().split("\n").filter((l) => l.trim());
|
|
59
|
+
lines.forEach((line) => {
|
|
60
|
+
console.error(`${prefix} ${pc.red(line)}`);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
proc.on("exit", (code) => {
|
|
64
|
+
if (code !== 0 && code !== null) {
|
|
65
|
+
logger.error(`${prefix} Exited with code ${code}`);
|
|
66
|
+
}
|
|
67
|
+
this.processes.delete(name);
|
|
68
|
+
});
|
|
69
|
+
proc.on("error", (error) => {
|
|
70
|
+
logger.error(`${prefix} Error:`, error.message);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
stopAll() {
|
|
74
|
+
logger.info("\n\u{1F6D1} Stopping all processes...");
|
|
75
|
+
for (const [name, proc] of this.processes.entries()) {
|
|
76
|
+
logger.info(`Stopping ${name}...`);
|
|
77
|
+
proc.kill("SIGTERM");
|
|
78
|
+
}
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
process.exit(0);
|
|
81
|
+
}, 1e3);
|
|
82
|
+
}
|
|
83
|
+
isRunning(name) {
|
|
84
|
+
return this.processes.has(name);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// src/dev-server/proxy.ts
|
|
89
|
+
import * as http from "http";
|
|
90
|
+
import * as httpProxy from "http-proxy";
|
|
91
|
+
import * as pc2 from "picocolors";
|
|
92
|
+
var ProxyServer = class {
|
|
93
|
+
constructor() {
|
|
94
|
+
this.server = null;
|
|
95
|
+
this.proxy = null;
|
|
96
|
+
}
|
|
97
|
+
async start(config) {
|
|
98
|
+
const { port, apiTarget, apiPrefix } = config;
|
|
99
|
+
this.proxy = httpProxy.createProxyServer({
|
|
100
|
+
target: apiTarget,
|
|
101
|
+
changeOrigin: true,
|
|
102
|
+
ws: true
|
|
103
|
+
// WebSocket support
|
|
104
|
+
});
|
|
105
|
+
this.proxy.on("error", (err, req, res) => {
|
|
106
|
+
logger.error("Proxy error:", err.message);
|
|
107
|
+
if (res && !res.headersSent) {
|
|
108
|
+
res.writeHead(502, { "Content-Type": "text/plain" });
|
|
109
|
+
res.end("Bad Gateway - API server unavailable");
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
this.server = http.createServer((req, res) => {
|
|
113
|
+
if (req.url?.startsWith(apiPrefix)) {
|
|
114
|
+
const newUrl = req.url.substring(apiPrefix.length) || "/";
|
|
115
|
+
req.url = newUrl;
|
|
116
|
+
logger.info(pc2.gray(`\u2192 ${req.method} ${apiPrefix}${newUrl}`));
|
|
117
|
+
this.proxy.web(req, res);
|
|
118
|
+
} else {
|
|
119
|
+
res.writeHead(404);
|
|
120
|
+
res.end("Not Found");
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
this.server.on("upgrade", (req, socket, head) => {
|
|
124
|
+
if (req.url?.startsWith(apiPrefix)) {
|
|
125
|
+
const newUrl = req.url.substring(apiPrefix.length) || "/";
|
|
126
|
+
req.url = newUrl;
|
|
127
|
+
this.proxy.ws(req, socket, head);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
return new Promise((resolve2) => {
|
|
131
|
+
this.server.listen(port, () => {
|
|
132
|
+
logger.success(`\u2705 Proxy server running on port ${port}`);
|
|
133
|
+
logger.info(` Forwarding ${pc2.cyan(apiPrefix + "/*")} \u2192 ${pc2.cyan(apiTarget)}
|
|
134
|
+
`);
|
|
135
|
+
resolve2();
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
stop() {
|
|
140
|
+
if (this.server) {
|
|
141
|
+
this.server.close();
|
|
142
|
+
this.server = null;
|
|
143
|
+
}
|
|
144
|
+
if (this.proxy) {
|
|
145
|
+
this.proxy.close();
|
|
146
|
+
this.proxy = null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// src/dev-server/dev-server.ts
|
|
152
|
+
import * as path from "path";
|
|
153
|
+
import * as fs from "fs";
|
|
154
|
+
var FusionDevServer = class {
|
|
155
|
+
constructor() {
|
|
156
|
+
this.proxyServer = null;
|
|
157
|
+
this.processRunner = new ProcessRunner();
|
|
158
|
+
}
|
|
159
|
+
async start(config) {
|
|
160
|
+
const {
|
|
161
|
+
apiPath,
|
|
162
|
+
webPath,
|
|
163
|
+
webPort = 3e3,
|
|
164
|
+
apiPort = 5050,
|
|
165
|
+
useProxy = true
|
|
166
|
+
} = config;
|
|
167
|
+
if (!fs.existsSync(apiPath)) {
|
|
168
|
+
throw new Error(`API path not found: ${apiPath}`);
|
|
169
|
+
}
|
|
170
|
+
if (!fs.existsSync(webPath)) {
|
|
171
|
+
throw new Error(`Web path not found: ${webPath}`);
|
|
172
|
+
}
|
|
173
|
+
const processes = [];
|
|
174
|
+
processes.push({
|
|
175
|
+
name: "API",
|
|
176
|
+
command: "npm",
|
|
177
|
+
args: ["run", "start:dev"],
|
|
178
|
+
cwd: path.resolve(apiPath),
|
|
179
|
+
color: "cyan",
|
|
180
|
+
env: {
|
|
181
|
+
PORT: apiPort.toString()
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
processes.push({
|
|
185
|
+
name: "Web",
|
|
186
|
+
command: "npm",
|
|
187
|
+
args: ["run", "dev", "--", "-p", webPort.toString()],
|
|
188
|
+
cwd: path.resolve(webPath),
|
|
189
|
+
color: "green",
|
|
190
|
+
env: {
|
|
191
|
+
NEXT_PUBLIC_API_URL: useProxy ? `http://localhost:${webPort}/api` : `http://localhost:${apiPort}`
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
if (useProxy) {
|
|
195
|
+
this.proxyServer = new ProxyServer();
|
|
196
|
+
setTimeout(async () => {
|
|
197
|
+
await this.proxyServer.start({
|
|
198
|
+
port: webPort,
|
|
199
|
+
apiTarget: `http://localhost:${apiPort}`,
|
|
200
|
+
apiPrefix: "/api"
|
|
201
|
+
});
|
|
202
|
+
}, 3e3);
|
|
203
|
+
}
|
|
204
|
+
await this.processRunner.run(processes);
|
|
205
|
+
logger.info("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557");
|
|
206
|
+
logger.info("\u2551 Fusion Development Server Ready \u2551");
|
|
207
|
+
logger.info("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n");
|
|
208
|
+
logger.info(`\u{1F310} Web: http://localhost:${webPort}`);
|
|
209
|
+
logger.info(`\u{1F50C} API: http://localhost:${apiPort}`);
|
|
210
|
+
if (useProxy) {
|
|
211
|
+
logger.info(`\u{1F504} Proxy: Enabled (${webPort}/api \u2192 ${apiPort})`);
|
|
212
|
+
}
|
|
213
|
+
logger.info("\n");
|
|
214
|
+
}
|
|
215
|
+
stop() {
|
|
216
|
+
this.processRunner.stopAll();
|
|
217
|
+
if (this.proxyServer) {
|
|
218
|
+
this.proxyServer.stop();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
export {
|
|
224
|
+
ProcessRunner,
|
|
225
|
+
ProxyServer,
|
|
226
|
+
FusionDevServer,
|
|
227
|
+
dev_server_exports
|
|
228
|
+
};
|
|
229
|
+
//# sourceMappingURL=chunk-HHXRAV67.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dev-server/index.ts","../src/dev-server/process-runner.ts","../src/dev-server/proxy.ts","../src/dev-server/dev-server.ts"],"sourcesContent":["export * from './dev-server';\r\nexport * from './process-runner';\r\nexport * from './proxy';\r\n","import { spawn, ChildProcess } from 'child_process';\r\nimport { logger } from '../core/logger';\r\nimport * as pc from 'picocolors';\r\n\r\nexport interface ProcessConfig {\r\n name: string;\r\n command: string;\r\n args: string[];\r\n cwd: string;\r\n color: 'cyan' | 'green' | 'yellow' | 'magenta' | 'blue';\r\n env?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Run multiple processes concurrently with colored output\r\n */\r\nexport class ProcessRunner {\r\n private processes: Map<string, ChildProcess> = new Map();\r\n private colors = {\r\n cyan: pc.cyan,\r\n green: pc.green,\r\n yellow: pc.yellow,\r\n magenta: pc.magenta,\r\n blue: pc.blue,\r\n };\r\n\r\n async run(configs: ProcessConfig[]): Promise<void> {\r\n logger.info('š Starting development servers...\\n');\r\n\r\n for (const config of configs) {\r\n this.startProcess(config);\r\n }\r\n\r\n // Handle graceful shutdown\r\n process.on('SIGINT', () => this.stopAll());\r\n process.on('SIGTERM', () => this.stopAll());\r\n }\r\n\r\n private startProcess(config: ProcessConfig): void {\r\n const { name, command, args, cwd, color, env } = config;\r\n\r\n const colorFn = this.colors[color];\r\n const prefix = colorFn(`[${name}]`);\r\n\r\n logger.info(`${prefix} Starting...`);\r\n\r\n const proc = spawn(command, args, {\r\n cwd,\r\n stdio: 'pipe',\r\n shell: true,\r\n env: { ...process.env, ...env },\r\n });\r\n\r\n this.processes.set(name, proc);\r\n\r\n // Handle stdout\r\n proc.stdout?.on('data', (data) => {\r\n const lines = data.toString().split('\\n').filter((l: string) => l.trim());\r\n lines.forEach((line: string) => {\r\n console.log(`${prefix} ${line}`);\r\n });\r\n });\r\n\r\n // Handle stderr\r\n proc.stderr?.on('data', (data) => {\r\n const lines = data.toString().split('\\n').filter((l: string) => l.trim());\r\n lines.forEach((line: string) => {\r\n console.error(`${prefix} ${pc.red(line)}`);\r\n });\r\n });\r\n\r\n // Handle exit\r\n proc.on('exit', (code) => {\r\n if (code !== 0 && code !== null) {\r\n logger.error(`${prefix} Exited with code ${code}`);\r\n }\r\n this.processes.delete(name);\r\n });\r\n\r\n // Handle errors\r\n proc.on('error', (error) => {\r\n logger.error(`${prefix} Error:`, error.message);\r\n });\r\n }\r\n\r\n stopAll(): void {\r\n logger.info('\\nš Stopping all processes...');\r\n\r\n for (const [name, proc] of this.processes.entries()) {\r\n logger.info(`Stopping ${name}...`);\r\n proc.kill('SIGTERM');\r\n }\r\n\r\n setTimeout(() => {\r\n process.exit(0);\r\n }, 1000);\r\n }\r\n\r\n isRunning(name: string): boolean {\r\n return this.processes.has(name);\r\n }\r\n}\r\n","import * as http from 'http';\r\nimport * as httpProxy from 'http-proxy';\r\nimport { logger } from '../core/logger';\r\nimport * as pc from 'picocolors';\r\n\r\nexport interface ProxyConfig {\r\n port: number;\r\n apiTarget: string;\r\n apiPrefix: string;\r\n}\r\n\r\n/**\r\n * Proxy server to forward API requests from Next.js to NestJS\r\n */\r\nexport class ProxyServer {\r\n private server: http.Server | null = null;\r\n private proxy: httpProxy | null = null;\r\n\r\n async start(config: ProxyConfig): Promise<void> {\r\n const { port, apiTarget, apiPrefix } = config;\r\n\r\n this.proxy = httpProxy.createProxyServer({\r\n target: apiTarget,\r\n changeOrigin: true,\r\n ws: true, // WebSocket support\r\n });\r\n\r\n // Handle proxy errors\r\n this.proxy.on('error', (err, req, res) => {\r\n logger.error('Proxy error:', err.message);\r\n if (res && !res.headersSent) {\r\n (res as http.ServerResponse).writeHead(502, { 'Content-Type': 'text/plain' });\r\n (res as http.ServerResponse).end('Bad Gateway - API server unavailable');\r\n }\r\n });\r\n\r\n this.server = http.createServer((req, res) => {\r\n // Check if request is for API\r\n if (req.url?.startsWith(apiPrefix)) {\r\n // Remove prefix before forwarding\r\n const newUrl = req.url.substring(apiPrefix.length) || '/';\r\n req.url = newUrl;\r\n\r\n logger.info(pc.gray(`ā ${req.method} ${apiPrefix}${newUrl}`));\r\n this.proxy!.web(req, res);\r\n } else {\r\n // Not an API request - should not happen\r\n res.writeHead(404);\r\n res.end('Not Found');\r\n }\r\n });\r\n\r\n // Handle WebSocket upgrade\r\n this.server.on('upgrade', (req, socket, head) => {\r\n if (req.url?.startsWith(apiPrefix)) {\r\n const newUrl = req.url.substring(apiPrefix.length) || '/';\r\n req.url = newUrl;\r\n this.proxy!.ws(req, socket, head);\r\n }\r\n });\r\n\r\n return new Promise((resolve) => {\r\n this.server!.listen(port, () => {\r\n logger.success(`ā
Proxy server running on port ${port}`);\r\n logger.info(` Forwarding ${pc.cyan(apiPrefix + '/*')} ā ${pc.cyan(apiTarget)}\\n`);\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n stop(): void {\r\n if (this.server) {\r\n this.server.close();\r\n this.server = null;\r\n }\r\n if (this.proxy) {\r\n this.proxy.close();\r\n this.proxy = null;\r\n }\r\n }\r\n}\r\n","import { ProcessRunner, ProcessConfig } from './process-runner';\r\nimport { ProxyServer } from './proxy';\r\nimport { logger } from '../core/logger';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\nexport interface DevServerConfig {\r\n apiPath: string;\r\n webPath: string;\r\n webPort?: number;\r\n apiPort?: number;\r\n useProxy?: boolean;\r\n}\r\n\r\n/**\r\n * Unified development server for Fusion projects\r\n */\r\nexport class FusionDevServer {\r\n private processRunner: ProcessRunner;\r\n private proxyServer: ProxyServer | null = null;\r\n\r\n constructor() {\r\n this.processRunner = new ProcessRunner();\r\n }\r\n\r\n async start(config: DevServerConfig): Promise<void> {\r\n const {\r\n apiPath,\r\n webPath,\r\n webPort = 3000,\r\n apiPort = 5050,\r\n useProxy = true,\r\n } = config;\r\n\r\n // Validate paths\r\n if (!fs.existsSync(apiPath)) {\r\n throw new Error(`API path not found: ${apiPath}`);\r\n }\r\n if (!fs.existsSync(webPath)) {\r\n throw new Error(`Web path not found: ${webPath}`);\r\n }\r\n\r\n const processes: ProcessConfig[] = [];\r\n\r\n // Add API server\r\n processes.push({\r\n name: 'API',\r\n command: 'npm',\r\n args: ['run', 'start:dev'],\r\n cwd: path.resolve(apiPath),\r\n color: 'cyan',\r\n env: {\r\n PORT: apiPort.toString(),\r\n },\r\n });\r\n\r\n // Add Web server\r\n processes.push({\r\n name: 'Web',\r\n command: 'npm',\r\n args: ['run', 'dev', '--', '-p', webPort.toString()],\r\n cwd: path.resolve(webPath),\r\n color: 'green',\r\n env: {\r\n NEXT_PUBLIC_API_URL: useProxy\r\n ? `http://localhost:${webPort}/api`\r\n : `http://localhost:${apiPort}`,\r\n },\r\n });\r\n\r\n // Start proxy if enabled\r\n if (useProxy) {\r\n this.proxyServer = new ProxyServer();\r\n\r\n // Wait a bit for API to be ready\r\n setTimeout(async () => {\r\n await this.proxyServer!.start({\r\n port: webPort,\r\n apiTarget: `http://localhost:${apiPort}`,\r\n apiPrefix: '/api',\r\n });\r\n }, 3000);\r\n }\r\n\r\n // Start processes\r\n await this.processRunner.run(processes);\r\n\r\n // Log info\r\n logger.info('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');\r\n logger.info('ā Fusion Development Server Ready ā');\r\n logger.info('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\\n');\r\n logger.info(`š Web: http://localhost:${webPort}`);\r\n logger.info(`š API: http://localhost:${apiPort}`);\r\n if (useProxy) {\r\n logger.info(`š Proxy: Enabled (${webPort}/api ā ${apiPort})`);\r\n }\r\n logger.info('\\n');\r\n }\r\n\r\n stop(): void {\r\n this.processRunner.stopAll();\r\n if (this.proxyServer) {\r\n this.proxyServer.stop();\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["pc","resolve"]}
|