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.
Files changed (99) hide show
  1. package/README.md +443 -0
  2. package/dist/chunk-2H7UOFLK.js +11 -0
  3. package/dist/chunk-2H7UOFLK.js.map +1 -0
  4. package/dist/chunk-2ZKONAXC.js +45 -0
  5. package/dist/chunk-2ZKONAXC.js.map +1 -0
  6. package/dist/chunk-57VDULE3.mjs +83 -0
  7. package/dist/chunk-57VDULE3.mjs.map +1 -0
  8. package/dist/chunk-6K3RXN4Y.mjs +45 -0
  9. package/dist/chunk-6K3RXN4Y.mjs.map +1 -0
  10. package/dist/chunk-6KN6UIHT.js +67 -0
  11. package/dist/chunk-6KN6UIHT.js.map +1 -0
  12. package/dist/chunk-A5OZK2TO.mjs +56 -0
  13. package/dist/chunk-A5OZK2TO.mjs.map +1 -0
  14. package/dist/chunk-ELVFG4US.js +83 -0
  15. package/dist/chunk-ELVFG4US.js.map +1 -0
  16. package/dist/chunk-H6XDQJ3N.mjs +11 -0
  17. package/dist/chunk-H6XDQJ3N.mjs.map +1 -0
  18. package/dist/chunk-HE3JQ62E.js +56 -0
  19. package/dist/chunk-HE3JQ62E.js.map +1 -0
  20. package/dist/chunk-HHXRAV67.mjs +229 -0
  21. package/dist/chunk-HHXRAV67.mjs.map +1 -0
  22. package/dist/chunk-J7J2LRG7.js +229 -0
  23. package/dist/chunk-J7J2LRG7.js.map +1 -0
  24. package/dist/chunk-LWNHEPTL.mjs +2 -0
  25. package/dist/chunk-LWNHEPTL.mjs.map +1 -0
  26. package/dist/chunk-MAVJYD6O.js +2 -0
  27. package/dist/chunk-MAVJYD6O.js.map +1 -0
  28. package/dist/chunk-QUV6QXTP.js +363 -0
  29. package/dist/chunk-QUV6QXTP.js.map +1 -0
  30. package/dist/chunk-WZBBQLFT.mjs +363 -0
  31. package/dist/chunk-WZBBQLFT.mjs.map +1 -0
  32. package/dist/chunk-XMPCR7N3.mjs +67 -0
  33. package/dist/chunk-XMPCR7N3.mjs.map +1 -0
  34. package/dist/cli/index.mjs +69 -0
  35. package/dist/cli/index.mjs.map +1 -0
  36. package/dist/client/index.js +11 -0
  37. package/dist/client/index.js.map +1 -0
  38. package/dist/client/index.mjs +11 -0
  39. package/dist/client/index.mjs.map +1 -0
  40. package/dist/codegen-J3XOZCQZ.js +14 -0
  41. package/dist/codegen-J3XOZCQZ.js.map +1 -0
  42. package/dist/codegen-ZZBQIGUQ.mjs +14 -0
  43. package/dist/codegen-ZZBQIGUQ.mjs.map +1 -0
  44. package/dist/dev-server-K5YZAZY2.mjs +14 -0
  45. package/dist/dev-server-K5YZAZY2.mjs.map +1 -0
  46. package/dist/dev-server-X453DBCE.js +14 -0
  47. package/dist/dev-server-X453DBCE.js.map +1 -0
  48. package/dist/index.js +274 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/index.mjs +274 -0
  51. package/dist/index.mjs.map +1 -0
  52. package/dist/nest/index.js +21 -0
  53. package/dist/nest/index.js.map +1 -0
  54. package/dist/nest/index.mjs +21 -0
  55. package/dist/nest/index.mjs.map +1 -0
  56. package/dist/next/index.js +14 -0
  57. package/dist/next/index.js.map +1 -0
  58. package/dist/next/index.mjs +14 -0
  59. package/dist/next/index.mjs.map +1 -0
  60. package/dist/types/index.js +3 -0
  61. package/dist/types/index.js.map +1 -0
  62. package/dist/types/index.mjs +3 -0
  63. package/dist/types/index.mjs.map +1 -0
  64. package/package.json +104 -0
  65. package/templates/nestjs-api/.env.example +4 -0
  66. package/templates/nestjs-api/README.md +79 -0
  67. package/templates/nestjs-api/nest-cli.json +7 -0
  68. package/templates/nestjs-api/package.json +39 -0
  69. package/templates/nestjs-api/prisma/schema.prisma +29 -0
  70. package/templates/nestjs-api/src/app.module.ts +17 -0
  71. package/templates/nestjs-api/src/auth/auth.controller.ts +30 -0
  72. package/templates/nestjs-api/src/auth/auth.module.ts +26 -0
  73. package/templates/nestjs-api/src/auth/auth.service.ts +91 -0
  74. package/templates/nestjs-api/src/auth/dto/auth.dto.ts +22 -0
  75. package/templates/nestjs-api/src/auth/guards/jwt-auth.guard.ts +5 -0
  76. package/templates/nestjs-api/src/auth/strategies/jwt.strategy.ts +19 -0
  77. package/templates/nestjs-api/src/main.ts +32 -0
  78. package/templates/nestjs-api/src/prisma/prisma.module.ts +9 -0
  79. package/templates/nestjs-api/src/prisma/prisma.service.ts +14 -0
  80. package/templates/nestjs-api/src/todos/dto/todo.dto.ts +24 -0
  81. package/templates/nestjs-api/src/todos/todos.controller.ts +46 -0
  82. package/templates/nestjs-api/src/todos/todos.module.ts +9 -0
  83. package/templates/nestjs-api/src/todos/todos.service.ts +53 -0
  84. package/templates/nestjs-api/src/users/users.controller.ts +17 -0
  85. package/templates/nestjs-api/src/users/users.module.ts +10 -0
  86. package/templates/nestjs-api/src/users/users.service.ts +19 -0
  87. package/templates/nestjs-api/tsconfig.json +21 -0
  88. package/templates/nextjs-web/.env.local.example +1 -0
  89. package/templates/nextjs-web/README.md +68 -0
  90. package/templates/nextjs-web/app/dashboard/page.tsx +175 -0
  91. package/templates/nextjs-web/app/globals.css +28 -0
  92. package/templates/nextjs-web/app/layout.tsx +27 -0
  93. package/templates/nextjs-web/app/login/page.tsx +107 -0
  94. package/templates/nextjs-web/app/page.tsx +28 -0
  95. package/templates/nextjs-web/app/register/page.tsx +130 -0
  96. package/templates/nextjs-web/next.config.mjs +4 -0
  97. package/templates/nextjs-web/package.json +28 -0
  98. package/templates/nextjs-web/tailwind.config.ts +15 -0
  99. 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"]}