wexts 2.0.7 → 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-63MTCWU2.mjs +361 -0
- package/dist/chunk-63MTCWU2.mjs.map +1 -0
- package/dist/chunk-67IJ6H4J.mjs +44 -0
- package/dist/chunk-67IJ6H4J.mjs.map +1 -0
- package/dist/chunk-7NSRDJ5C.mjs +1 -0
- package/dist/chunk-7NSRDJ5C.mjs.map +1 -0
- package/dist/chunk-ASDXAK6G.js +44 -0
- package/dist/chunk-ASDXAK6G.js.map +1 -0
- package/dist/chunk-CKZ4VSCB.mjs +18 -0
- package/dist/chunk-CKZ4VSCB.mjs.map +1 -0
- package/dist/chunk-DW6GOKMF.js +57 -0
- package/dist/chunk-DW6GOKMF.js.map +1 -0
- package/dist/chunk-GKVPGKAH.js +66 -0
- package/dist/chunk-GKVPGKAH.js.map +1 -0
- package/dist/chunk-HSFLZUJN.mjs +57 -0
- package/dist/chunk-HSFLZUJN.mjs.map +1 -0
- package/dist/chunk-HU63F22V.js +361 -0
- package/dist/chunk-HU63F22V.js.map +1 -0
- package/dist/chunk-JMBD6DOP.js +225 -0
- package/dist/chunk-JMBD6DOP.js.map +1 -0
- package/dist/chunk-K7EIJSYQ.js +1 -0
- package/dist/chunk-K7EIJSYQ.js.map +1 -0
- package/dist/chunk-OTBYRUBE.mjs +225 -0
- package/dist/chunk-OTBYRUBE.mjs.map +1 -0
- package/dist/chunk-WMHVXEYQ.mjs +66 -0
- package/dist/chunk-WMHVXEYQ.mjs.map +1 -0
- package/dist/cli/index.js +146 -25
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +130 -7
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.js +2 -2
- package/dist/client/index.mjs +2 -2
- package/dist/codegen/index.d.mts +1 -0
- package/dist/codegen/index.d.ts +1 -0
- package/dist/codegen/index.js +13 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/index.mjs +13 -0
- package/dist/codegen/index.mjs.map +1 -0
- package/dist/dev-server/index.d.mts +1 -0
- package/dist/dev-server/index.d.ts +1 -0
- package/dist/dev-server/index.js +13 -0
- package/dist/dev-server/index.js.map +1 -0
- package/dist/dev-server/index.mjs +13 -0
- package/dist/dev-server/index.mjs.map +1 -0
- package/dist/index-SjUaHgFr.d.mts +75 -0
- package/dist/index-SjUaHgFr.d.ts +75 -0
- package/dist/index-tFGPFVfQ.d.mts +67 -0
- package/dist/index-tFGPFVfQ.d.ts +67 -0
- package/dist/index.d.mts +83 -164
- package/dist/index.d.ts +83 -164
- package/dist/index.js +89 -22
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +76 -9
- package/dist/index.mjs.map +1 -1
- package/dist/nest/index.js +2 -2
- package/dist/nest/index.mjs +2 -2
- package/dist/next/index.d.mts +61 -3
- package/dist/next/index.d.ts +61 -3
- package/dist/next/index.js +140 -7
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +102 -7
- package/dist/next/index.mjs.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.mjs +2 -1
- package/package.json +1 -1
- package/templates/nestjs-api/package-lock.json +5623 -0
- package/templates/nestjs-api/package.json +21 -19
- package/templates/nestjs-api/prisma/migrations/20251123205437_init/migration.sql +24 -0
- package/templates/nestjs-api/prisma/migrations/migration_lock.toml +3 -0
- package/templates/nestjs-api/src/auth/auth.controller.ts +5 -5
- package/templates/nestjs-api/src/main.ts +1 -1
- package/templates/nestjs-api/src/todos/todos.controller.ts +7 -7
- package/templates/nestjs-api/src/users/users.controller.ts +3 -3
- package/templates/nestjs-api/tsconfig.json +20 -1
- package/templates/nextjs-web/app/actions/auth.ts +79 -0
- package/templates/nextjs-web/app/dashboard/error.tsx +39 -0
- package/templates/nextjs-web/app/dashboard/loading.tsx +14 -0
- package/templates/nextjs-web/app/dashboard/page.tsx +2 -172
- package/templates/nextjs-web/app/globals.css +80 -15
- package/templates/nextjs-web/app/layout.tsx +7 -5
- package/templates/nextjs-web/app/login/page.tsx +2 -104
- package/templates/nextjs-web/app/page.tsx +1 -1
- package/templates/nextjs-web/app/register/page.tsx +2 -127
- package/templates/nextjs-web/components/ui/button.tsx +56 -0
- package/templates/nextjs-web/components/ui/card.tsx +79 -0
- package/templates/nextjs-web/components/ui/input.tsx +25 -0
- package/templates/nextjs-web/components/ui/label.tsx +24 -0
- package/templates/nextjs-web/features/auth/LoginForm.tsx +140 -0
- package/templates/nextjs-web/features/auth/RegisterForm.tsx +159 -0
- package/templates/nextjs-web/features/auth/api.ts +35 -0
- package/templates/nextjs-web/features/auth/index.ts +3 -0
- package/templates/nextjs-web/features/dashboard/DashboardView.tsx +204 -0
- package/templates/nextjs-web/features/dashboard/api.ts +9 -0
- package/templates/nextjs-web/features/dashboard/components.tsx +74 -0
- package/templates/nextjs-web/features/dashboard/index.ts +3 -0
- package/templates/nextjs-web/hooks/index.ts +4 -0
- package/templates/nextjs-web/lib/api-client.ts +89 -0
- package/templates/nextjs-web/lib/axios-global-config.ts +17 -0
- package/templates/nextjs-web/lib/utils.ts +6 -0
- package/templates/nextjs-web/lib/wexts-client.ts +4 -0
- package/templates/nextjs-web/next-env.d.ts +6 -0
- package/templates/nextjs-web/next.config.ts +20 -0
- package/templates/nextjs-web/package-lock.json +3254 -0
- package/templates/nextjs-web/package.json +23 -14
- package/templates/nextjs-web/postcss.config.js +6 -0
- package/templates/nextjs-web/tailwind.config.ts +55 -1
- package/templates/nextjs-web/tsconfig.json +41 -39
- package/templates/nestjs-api/.env.example +0 -4
- package/templates/nextjs-web/next.config.mjs +0 -4
- /package/templates/nextjs-web/{.env.local.example → .env} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\wexts\\packages\\dist\\chunk-GKVPGKAH.js"],"names":[],"mappings":"AAAA;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\\wexts\\packages\\dist\\chunk-GKVPGKAH.js","sourcesContent":[null]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// src/core/logger.ts
|
|
2
|
+
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
3
|
+
LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG";
|
|
4
|
+
LogLevel2[LogLevel2["INFO"] = 1] = "INFO";
|
|
5
|
+
LogLevel2[LogLevel2["WARN"] = 2] = "WARN";
|
|
6
|
+
LogLevel2[LogLevel2["ERROR"] = 3] = "ERROR";
|
|
7
|
+
return LogLevel2;
|
|
8
|
+
})(LogLevel || {});
|
|
9
|
+
var Logger = class {
|
|
10
|
+
level;
|
|
11
|
+
prefix;
|
|
12
|
+
timestamp;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.level = options.level ?? 1 /* INFO */;
|
|
15
|
+
this.prefix = options.prefix ?? "[Fusion]";
|
|
16
|
+
this.timestamp = options.timestamp ?? true;
|
|
17
|
+
}
|
|
18
|
+
formatMessage(level, ...args) {
|
|
19
|
+
const timestamp = this.timestamp ? `[${(/* @__PURE__ */ new Date()).toISOString()}]` : "";
|
|
20
|
+
return `${timestamp} ${this.prefix} ${level}: ${args.join(" ")}`;
|
|
21
|
+
}
|
|
22
|
+
debug(...args) {
|
|
23
|
+
if (this.level <= 0 /* DEBUG */) {
|
|
24
|
+
console.log(this.formatMessage("DEBUG", ...args));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
info(...args) {
|
|
28
|
+
if (this.level <= 1 /* INFO */) {
|
|
29
|
+
console.log(this.formatMessage("INFO", ...args));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
warn(...args) {
|
|
33
|
+
if (this.level <= 2 /* WARN */) {
|
|
34
|
+
console.warn(this.formatMessage("WARN", ...args));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
error(...args) {
|
|
38
|
+
if (this.level <= 3 /* ERROR */) {
|
|
39
|
+
console.error(this.formatMessage("ERROR", ...args));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
success(...args) {
|
|
43
|
+
console.log(this.formatMessage("\u2713", ...args));
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
var logger = new Logger();
|
|
47
|
+
function createLogger(options) {
|
|
48
|
+
return new Logger(options);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export {
|
|
52
|
+
LogLevel,
|
|
53
|
+
Logger,
|
|
54
|
+
logger,
|
|
55
|
+
createLogger
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=chunk-HSFLZUJN.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,EACR;AAAA,EACA;AAAA,EACA;AAAA,EAER,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,361 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;
|
|
2
|
+
|
|
3
|
+
var _chunkDW6GOKMFjs = require('./chunk-DW6GOKMF.js');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkPZ5AY32Cjs = require('./chunk-PZ5AY32C.js');
|
|
7
|
+
|
|
8
|
+
// src/codegen/index.ts
|
|
9
|
+
var codegen_exports = {};
|
|
10
|
+
_chunkPZ5AY32Cjs.__export.call(void 0, codegen_exports, {
|
|
11
|
+
ClientGenerator: () => ClientGenerator,
|
|
12
|
+
CodegenWatcher: () => CodegenWatcher,
|
|
13
|
+
NestJSParser: () => NestJSParser
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
// src/codegen/parser.ts
|
|
17
|
+
var _typescript = require('typescript'); var ts = _interopRequireWildcard(_typescript);
|
|
18
|
+
var _path = require('path'); var path = _interopRequireWildcard(_path); var path2 = _interopRequireWildcard(_path); var path3 = _interopRequireWildcard(_path);
|
|
19
|
+
var NestJSParser = class {
|
|
20
|
+
constructor(projectPath) {
|
|
21
|
+
this.projectPath = projectPath;
|
|
22
|
+
const configPath = ts.findConfigFile(projectPath, ts.sys.fileExists, "tsconfig.json");
|
|
23
|
+
if (!configPath) {
|
|
24
|
+
throw new Error("tsconfig.json not found");
|
|
25
|
+
}
|
|
26
|
+
const config = ts.readConfigFile(configPath, ts.sys.readFile);
|
|
27
|
+
const parsedConfig = ts.parseJsonConfigFileContent(
|
|
28
|
+
config.config,
|
|
29
|
+
ts.sys,
|
|
30
|
+
path.dirname(configPath)
|
|
31
|
+
);
|
|
32
|
+
this.program = ts.createProgram(parsedConfig.fileNames, parsedConfig.options);
|
|
33
|
+
}
|
|
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 = _optionalChain([classNode, 'access', _ => _.name, 'optionalAccess', _2 => _2.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
|
+
var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
|
|
132
|
+
|
|
133
|
+
var _util = require('util');
|
|
134
|
+
var readFile2 = _util.promisify.call(void 0, fs.readFile);
|
|
135
|
+
var writeFile2 = _util.promisify.call(void 0, fs.writeFile);
|
|
136
|
+
var mkdir2 = _util.promisify.call(void 0, fs.mkdir);
|
|
137
|
+
var access2 = _util.promisify.call(void 0, 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 (e) {
|
|
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 _util.promisify.call(void 0, fs.readdir)(dirPath);
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
var filesystem = new FileSystem();
|
|
200
|
+
|
|
201
|
+
// src/codegen/generator.ts
|
|
202
|
+
|
|
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
|
+
var _chokidar = require('chokidar'); var chokidar = _interopRequireWildcard(_chokidar);
|
|
303
|
+
var CodegenWatcher = (_class = class {constructor() { _class.prototype.__init.call(this); }
|
|
304
|
+
__init() {this.watcher = null}
|
|
305
|
+
async watch(options) {
|
|
306
|
+
const { projectPath, outputPath, pattern = "**/*.controller.ts" } = options;
|
|
307
|
+
_chunkDW6GOKMFjs.logger.info("\u{1F440} Watching for controller changes...");
|
|
308
|
+
await this.generateClient(projectPath, outputPath);
|
|
309
|
+
this.watcher = chokidar.watch(pattern, {
|
|
310
|
+
cwd: projectPath,
|
|
311
|
+
ignored: /node_modules/,
|
|
312
|
+
persistent: true
|
|
313
|
+
});
|
|
314
|
+
this.watcher.on("change", async (path4) => {
|
|
315
|
+
_chunkDW6GOKMFjs.logger.info(`\u{1F4DD} Controller changed: ${path4}`);
|
|
316
|
+
await this.generateClient(projectPath, outputPath);
|
|
317
|
+
});
|
|
318
|
+
this.watcher.on("add", async (path4) => {
|
|
319
|
+
_chunkDW6GOKMFjs.logger.info(`\u2795 New controller: ${path4}`);
|
|
320
|
+
await this.generateClient(projectPath, outputPath);
|
|
321
|
+
});
|
|
322
|
+
this.watcher.on("unlink", async (path4) => {
|
|
323
|
+
_chunkDW6GOKMFjs.logger.info(`\u2796 Controller removed: ${path4}`);
|
|
324
|
+
await this.generateClient(projectPath, outputPath);
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
async stop() {
|
|
328
|
+
if (this.watcher) {
|
|
329
|
+
await this.watcher.close();
|
|
330
|
+
this.watcher = null;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async generateClient(projectPath, outputPath) {
|
|
334
|
+
try {
|
|
335
|
+
const parser = new NestJSParser(projectPath);
|
|
336
|
+
const controllers = parser.findFusionControllers();
|
|
337
|
+
if (controllers.length === 0) {
|
|
338
|
+
_chunkDW6GOKMFjs.logger.warn("No Fusion controllers found");
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const generator = new ClientGenerator();
|
|
342
|
+
await generator.generate({
|
|
343
|
+
controllers,
|
|
344
|
+
outputPath
|
|
345
|
+
});
|
|
346
|
+
_chunkDW6GOKMFjs.logger.success(`Generated client for ${controllers.length} controller(s)`);
|
|
347
|
+
} catch (error) {
|
|
348
|
+
_chunkDW6GOKMFjs.logger.error("Failed to generate client:", error.message);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}, _class);
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
exports.FileSystem = FileSystem; exports.filesystem = filesystem; exports.NestJSParser = NestJSParser; exports.ClientGenerator = ClientGenerator; exports.CodegenWatcher = CodegenWatcher; exports.codegen_exports = codegen_exports;
|
|
361
|
+
//# sourceMappingURL=chunk-HU63F22V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\wexts\\packages\\dist\\chunk-HU63F22V.js"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;AACA,IAAI,gBAAgB,EAAE,CAAC,CAAC;AACxB,uCAAQ,eAAgB,EAAE;AAC1B,EAAE,eAAe,EAAE,CAAC,EAAE,GAAG,eAAe;AACxC,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,cAAc;AACtC,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG;AACtB,CAAC,CAAC;AACF;AACA;AACA,uFAAgC;AAChC,+JAA4B;AAC5B,IAAI,aAAa,EAAE,MAAM;AACzB,EAAE,WAAW,CAAC,WAAW,EAAE;AAC3B,IAAI,IAAI,CAAC,YAAY,EAAE,WAAW;AAClC,IAAI,MAAM,WAAW,EAAE,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC;AACzF,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE;AACrB,MAAM,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;AAChD,IAAI;AACJ,IAAI,MAAM,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;AACjE,IAAI,MAAM,aAAa,EAAE,EAAE,CAAC,0BAA0B;AACtD,MAAM,MAAM,CAAC,MAAM;AACnB,MAAM,EAAE,CAAC,GAAG;AACZ,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU;AAC7B,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC;AACjF,EAAE;AACF,EAAE;AACF;AACA;AACA;AACA,EAAE,qBAAqB,CAAC,EAAE;AAC1B,IAAI,MAAM,YAAY,EAAE,CAAC,CAAC;AAC1B,IAAI,MAAM,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AACrD,IAAI,IAAI,CAAC,MAAM,WAAW,GAAG,WAAW,EAAE;AAC1C,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ;AAChE,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ;AACnE,MAAM,MAAM,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;AAC9D,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC;AAC1C,IAAI;AACJ,IAAI,OAAO,WAAW;AACtB,EAAE;AACF,EAAE,eAAe,CAAC,UAAU,EAAE;AAC9B,IAAI,MAAM,YAAY,EAAE,CAAC,CAAC;AAC1B,IAAI,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG;AAC1C,MAAM,GAAG,CAAC,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;AACpD,QAAQ,MAAM,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AACzD,QAAQ,GAAG,CAAC,cAAc,EAAE;AAC5B,UAAU,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC;AAC1C,QAAQ;AACR,MAAM;AACN,IAAI,CAAC,CAAC;AACN,IAAI,OAAO,WAAW;AACtB,EAAE;AACF,EAAE,eAAe,CAAC,SAAS,EAAE;AAC7B,IAAI,MAAM,WAAW,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC;AAClD,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,OAAO,IAAI;AAChC,IAAI,IAAI,iBAAiB,EAAE,EAAE;AAC7B,IAAI,IAAI,mBAAmB,EAAE,KAAK;AAClC,IAAI,IAAI,CAAC,MAAM,UAAU,GAAG,UAAU,EAAE;AACxC,MAAM,MAAM,KAAK,EAAE,SAAS,CAAC,UAAU;AACvC,MAAM,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACzE,QAAQ,MAAM,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;AAClD,QAAQ,GAAG,CAAC,cAAc,IAAI,kBAAkB,EAAE;AAClD,UAAU,mBAAmB,EAAE,IAAI;AACnC,UAAU,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE;AACzC,YAAY,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACzC,YAAY,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;AACzC,cAAc,iBAAiB,EAAE,GAAG,CAAC,IAAI;AACzC,YAAY;AACZ,UAAU;AACV,QAAQ;AACR,MAAM;AACN,IAAI;AACJ,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,OAAO,IAAI;AACxC,IAAI,MAAM,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AAC9C,IAAI,MAAM,UAAU,kBAAE,SAAS,mBAAC,IAAI,6BAAE,OAAK,GAAG,SAAS;AACvD,IAAI,OAAO;AACX,MAAM,IAAI,EAAE,SAAS;AACrB,MAAM,MAAM,EAAE,gBAAgB;AAC9B,MAAM,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;AACrE,IAAI,CAAC;AACL,EAAE;AACF,EAAE,WAAW,CAAC,SAAS,EAAE;AACzB,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;AACrB,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG;AAC1C,MAAM,GAAG,CAAC,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE;AAC1C,QAAQ,MAAM,WAAW,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;AACnD,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,MAAM;AAC/B,QAAQ,IAAI,CAAC,MAAM,UAAU,GAAG,UAAU,EAAE;AAC5C,UAAU,MAAM,KAAK,EAAE,SAAS,CAAC,UAAU;AAC3C,UAAU,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AAC7E,YAAY,MAAM,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;AACtD,YAAY,IAAI,OAAO,EAAE,IAAI;AAC7B,YAAY,IAAI,UAAU,EAAE,EAAE;AAC9B,YAAY,GAAG,CAAC,cAAc,IAAI,WAAW,EAAE,OAAO,EAAE,KAAK;AAC7D,YAAY,KAAK,GAAG,CAAC,cAAc,IAAI,YAAY,EAAE,OAAO,EAAE,MAAM;AACpE,YAAY,KAAK,GAAG,CAAC,cAAc,IAAI,WAAW,EAAE,OAAO,EAAE,KAAK;AAClE,YAAY,KAAK,GAAG,CAAC,cAAc,IAAI,cAAc,EAAE,OAAO,EAAE,QAAQ;AACxE,YAAY,GAAG,CAAC,MAAM,EAAE;AACxB,cAAc,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE;AAC7C,gBAAgB,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AAC7C,gBAAgB,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;AAC7C,kBAAkB,UAAU,EAAE,GAAG,CAAC,IAAI;AACtC,gBAAgB;AAChB,cAAc;AACd,cAAc,MAAM,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;AAClD,cAAc,MAAM,CAAC,IAAI,CAAC;AAC1B,gBAAgB,MAAM;AACtB,gBAAgB,IAAI,EAAE,SAAS;AAC/B,gBAAgB,OAAO,EAAE,WAAW;AACpC,gBAAgB,cAAc,EAAE;AAChC;AACA,cAAc,CAAC,CAAC;AAChB,YAAY;AACZ,UAAU;AACV,QAAQ;AACR,MAAM;AACN,IAAI,CAAC,CAAC;AACN,IAAI,OAAO,MAAM;AACjB,EAAE;AACF,CAAC;AACD;AACA;AACA,+DAAwB;AACxB;AACA,4BAAgC;AAChC,IAAI,UAAU,EAAE,6BAAS,EAAG,CAAC,QAAQ,CAAC;AACtC,IAAI,WAAW,EAAE,6BAAS,EAAG,CAAC,SAAS,CAAC;AACxC,IAAI,OAAO,EAAE,6BAAS,EAAG,CAAC,KAAK,CAAC;AAChC,IAAI,QAAQ,EAAE,6BAAS,EAAG,CAAC,MAAM,CAAC;AAClC,IAAI,WAAW,EAAE,MAAM;AACvB;AACA;AACA;AACA,EAAE,MAAM,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE;AAC/C,IAAI,OAAO,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACxC,EAAE;AACF;AACA;AACA;AACA,EAAE,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE;AACrC,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACjD,IAAI,OAAO,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC;AACjD,EAAE;AACF;AACA;AACA;AACA,EAAE,MAAM,QAAQ,CAAC,QAAQ,EAAE;AAC3B,IAAI,MAAM,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACjD,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAC9B,EAAE;AACF;AACA;AACA;AACA,EAAE,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;AACjD,IAAI,MAAM,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AACjF,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;AAC5C,EAAE;AACF;AACA;AACA;AACA,EAAE,MAAM,MAAM,CAAC,QAAQ,EAAE;AACzB,IAAI,IAAI;AACR,MAAM,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;AAChD,MAAM,OAAO,IAAI;AACjB,IAAI,EAAE,UAAM;AACZ,MAAM,OAAO,KAAK;AAClB,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA,EAAE,MAAM,SAAS,CAAC,OAAO,EAAE;AAC3B,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;AACrC,MAAM,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAChD,IAAI;AACJ,EAAE;AACF;AACA;AACA;AACA,EAAE,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE;AAC5B,IAAI,MAAM,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC5C,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC;AACvC,EAAE;AACF;AACA;AACA;AACA,EAAE,OAAO,CAAC,OAAO,EAAE;AACnB,IAAI,OAAO,6BAAS,EAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;AACzC,EAAE;AACF,CAAC;AACD,IAAI,WAAW,EAAE,IAAI,UAAU,CAAC,CAAC;AACjC;AACA;AACA;AACA,IAAI,gBAAgB,EAAE,MAAM;AAC5B,EAAE,MAAM,QAAQ,CAAC,OAAO,EAAE;AAC1B,IAAI,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,OAAO;AAC/C,IAAI,MAAM,WAAW,EAAE,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC;AAC5E,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC;AAC/E,IAAI,MAAM,UAAU,EAAE,CAAC;AACvB,CAAC;AACD,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC;AAC7E,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,+BAA+B,EAAE,UAAU,CAAC,CAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA;AACA;AACA,IAAA;AACA,IAAA;AACA;AACA;AACA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA;AACA,IAAA;AACA;AACA;AACA,IAAA;AACA;AACA,IAAA;AACA;AACA,IAAA;AACA;AACA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"C:\\Users\\ziad\\Desktop\\wexts\\packages\\dist\\chunk-HU63F22V.js","sourcesContent":[null]}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3;
|
|
2
|
+
|
|
3
|
+
var _chunkDW6GOKMFjs = require('./chunk-DW6GOKMF.js');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkPZ5AY32Cjs = require('./chunk-PZ5AY32C.js');
|
|
7
|
+
|
|
8
|
+
// src/dev-server/index.ts
|
|
9
|
+
var dev_server_exports = {};
|
|
10
|
+
_chunkPZ5AY32Cjs.__export.call(void 0, dev_server_exports, {
|
|
11
|
+
FusionDevServer: () => FusionDevServer,
|
|
12
|
+
ProcessRunner: () => ProcessRunner,
|
|
13
|
+
ProxyServer: () => ProxyServer
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
// src/dev-server/process-runner.ts
|
|
17
|
+
var _child_process = require('child_process');
|
|
18
|
+
var _picocolors = require('picocolors'); var pc = _interopRequireWildcard(_picocolors); var pc2 = _interopRequireWildcard(_picocolors);
|
|
19
|
+
var ProcessRunner = (_class = class {constructor() { _class.prototype.__init.call(this);_class.prototype.__init2.call(this); }
|
|
20
|
+
__init() {this.processes = /* @__PURE__ */ new Map()}
|
|
21
|
+
__init2() {this.colors = {
|
|
22
|
+
cyan: pc.cyan,
|
|
23
|
+
green: pc.green,
|
|
24
|
+
yellow: pc.yellow,
|
|
25
|
+
magenta: pc.magenta,
|
|
26
|
+
blue: pc.blue
|
|
27
|
+
}}
|
|
28
|
+
async run(configs) {
|
|
29
|
+
_chunkDW6GOKMFjs.logger.info("\u{1F680} Starting development servers...\n");
|
|
30
|
+
for (const config of configs) {
|
|
31
|
+
this.startProcess(config);
|
|
32
|
+
}
|
|
33
|
+
process.on("SIGINT", () => this.stopAll());
|
|
34
|
+
process.on("SIGTERM", () => this.stopAll());
|
|
35
|
+
}
|
|
36
|
+
startProcess(config) {
|
|
37
|
+
const { name, command, args, cwd, color, env } = config;
|
|
38
|
+
const colorFn = this.colors[color];
|
|
39
|
+
const prefix = colorFn(`[${name}]`);
|
|
40
|
+
_chunkDW6GOKMFjs.logger.info(`${prefix} Starting...`);
|
|
41
|
+
const proc = _child_process.spawn.call(void 0, command, args, {
|
|
42
|
+
cwd,
|
|
43
|
+
stdio: "pipe",
|
|
44
|
+
shell: true,
|
|
45
|
+
env: { ...process.env, ...env }
|
|
46
|
+
});
|
|
47
|
+
this.processes.set(name, proc);
|
|
48
|
+
_optionalChain([proc, 'access', _ => _.stdout, 'optionalAccess', _2 => _2.on, 'call', _3 => _3("data", (data) => {
|
|
49
|
+
const lines = data.toString().split("\n").filter((l) => l.trim());
|
|
50
|
+
lines.forEach((line) => {
|
|
51
|
+
console.log(`${prefix} ${line}`);
|
|
52
|
+
});
|
|
53
|
+
})]);
|
|
54
|
+
_optionalChain([proc, 'access', _4 => _4.stderr, 'optionalAccess', _5 => _5.on, 'call', _6 => _6("data", (data) => {
|
|
55
|
+
const lines = data.toString().split("\n").filter((l) => l.trim());
|
|
56
|
+
lines.forEach((line) => {
|
|
57
|
+
console.error(`${prefix} ${pc.red(line)}`);
|
|
58
|
+
});
|
|
59
|
+
})]);
|
|
60
|
+
proc.on("exit", (code) => {
|
|
61
|
+
if (code !== 0 && code !== null) {
|
|
62
|
+
_chunkDW6GOKMFjs.logger.error(`${prefix} Exited with code ${code}`);
|
|
63
|
+
}
|
|
64
|
+
this.processes.delete(name);
|
|
65
|
+
});
|
|
66
|
+
proc.on("error", (error) => {
|
|
67
|
+
_chunkDW6GOKMFjs.logger.error(`${prefix} Error:`, error.message);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
stopAll() {
|
|
71
|
+
_chunkDW6GOKMFjs.logger.info("\n\u{1F6D1} Stopping all processes...");
|
|
72
|
+
for (const [name, proc] of this.processes.entries()) {
|
|
73
|
+
_chunkDW6GOKMFjs.logger.info(`Stopping ${name}...`);
|
|
74
|
+
proc.kill("SIGTERM");
|
|
75
|
+
}
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
process.exit(0);
|
|
78
|
+
}, 1e3);
|
|
79
|
+
}
|
|
80
|
+
isRunning(name) {
|
|
81
|
+
return this.processes.has(name);
|
|
82
|
+
}
|
|
83
|
+
}, _class);
|
|
84
|
+
|
|
85
|
+
// src/dev-server/proxy.ts
|
|
86
|
+
var _http = require('http'); var _http2 = _interopRequireDefault(_http);
|
|
87
|
+
var _httpproxy = require('http-proxy'); var _httpproxy2 = _interopRequireDefault(_httpproxy);
|
|
88
|
+
|
|
89
|
+
var ProxyServer = (_class2 = class {constructor() { _class2.prototype.__init3.call(this);_class2.prototype.__init4.call(this); }
|
|
90
|
+
__init3() {this.server = null}
|
|
91
|
+
__init4() {this.proxy = null}
|
|
92
|
+
async start(config) {
|
|
93
|
+
const { port, apiTarget, apiPrefix } = config;
|
|
94
|
+
this.proxy = _httpproxy2.default.createProxyServer({
|
|
95
|
+
target: apiTarget,
|
|
96
|
+
changeOrigin: true,
|
|
97
|
+
ws: true
|
|
98
|
+
// WebSocket support
|
|
99
|
+
});
|
|
100
|
+
this.proxy.on("error", (err, req, res) => {
|
|
101
|
+
_chunkDW6GOKMFjs.logger.error("Proxy error:", err.message);
|
|
102
|
+
if (res && "headersSent" in res && !res.headersSent) {
|
|
103
|
+
res.writeHead(502, { "Content-Type": "text/plain" });
|
|
104
|
+
res.end("Bad Gateway - API server unavailable");
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
this.server = _http2.default.createServer((req, res) => {
|
|
108
|
+
if (_optionalChain([req, 'access', _7 => _7.url, 'optionalAccess', _8 => _8.startsWith, 'call', _9 => _9(apiPrefix)])) {
|
|
109
|
+
const newUrl = req.url.substring(apiPrefix.length) || "/";
|
|
110
|
+
req.url = newUrl;
|
|
111
|
+
_chunkDW6GOKMFjs.logger.info(pc2.gray(`\u2192 ${req.method} ${apiPrefix}${newUrl}`));
|
|
112
|
+
this.proxy.web(req, res);
|
|
113
|
+
} else {
|
|
114
|
+
res.writeHead(404);
|
|
115
|
+
res.end("Not Found");
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
this.server.on("upgrade", (req, socket, head) => {
|
|
119
|
+
if (_optionalChain([req, 'access', _10 => _10.url, 'optionalAccess', _11 => _11.startsWith, 'call', _12 => _12(apiPrefix)])) {
|
|
120
|
+
const newUrl = req.url.substring(apiPrefix.length) || "/";
|
|
121
|
+
req.url = newUrl;
|
|
122
|
+
this.proxy.ws(req, socket, head);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
return new Promise((resolve2) => {
|
|
126
|
+
this.server.listen(port, () => {
|
|
127
|
+
_chunkDW6GOKMFjs.logger.success(`\u2705 Proxy server running on port ${port}`);
|
|
128
|
+
_chunkDW6GOKMFjs.logger.info(` Forwarding ${pc2.cyan(apiPrefix + "/*")} \u2192 ${pc2.cyan(apiTarget)}
|
|
129
|
+
`);
|
|
130
|
+
resolve2();
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
stop() {
|
|
135
|
+
if (this.server) {
|
|
136
|
+
this.server.close();
|
|
137
|
+
this.server = null;
|
|
138
|
+
}
|
|
139
|
+
if (this.proxy) {
|
|
140
|
+
this.proxy.close();
|
|
141
|
+
this.proxy = null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}, _class2);
|
|
145
|
+
|
|
146
|
+
// src/dev-server/dev-server.ts
|
|
147
|
+
var _path = require('path'); var path = _interopRequireWildcard(_path);
|
|
148
|
+
var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
|
|
149
|
+
var FusionDevServer = (_class3 = class {
|
|
150
|
+
|
|
151
|
+
__init5() {this.proxyServer = null}
|
|
152
|
+
constructor() {;_class3.prototype.__init5.call(this);
|
|
153
|
+
this.processRunner = new ProcessRunner();
|
|
154
|
+
}
|
|
155
|
+
async start(config) {
|
|
156
|
+
const {
|
|
157
|
+
apiPath,
|
|
158
|
+
webPath,
|
|
159
|
+
webPort = 3e3,
|
|
160
|
+
apiPort = 5050,
|
|
161
|
+
useProxy = true
|
|
162
|
+
} = config;
|
|
163
|
+
if (!fs.existsSync(apiPath)) {
|
|
164
|
+
throw new Error(`API path not found: ${apiPath}`);
|
|
165
|
+
}
|
|
166
|
+
if (!fs.existsSync(webPath)) {
|
|
167
|
+
throw new Error(`Web path not found: ${webPath}`);
|
|
168
|
+
}
|
|
169
|
+
const processes = [];
|
|
170
|
+
processes.push({
|
|
171
|
+
name: "API",
|
|
172
|
+
command: "npm",
|
|
173
|
+
args: ["run", "start:dev"],
|
|
174
|
+
cwd: path.resolve(apiPath),
|
|
175
|
+
color: "cyan",
|
|
176
|
+
env: {
|
|
177
|
+
PORT: apiPort.toString()
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
processes.push({
|
|
181
|
+
name: "Web",
|
|
182
|
+
command: "npm",
|
|
183
|
+
args: ["run", "dev", "--", "-p", webPort.toString()],
|
|
184
|
+
cwd: path.resolve(webPath),
|
|
185
|
+
color: "green",
|
|
186
|
+
env: {
|
|
187
|
+
NEXT_PUBLIC_API_URL: useProxy ? `http://localhost:${webPort}/api` : `http://localhost:${apiPort}`
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
if (useProxy) {
|
|
191
|
+
this.proxyServer = new ProxyServer();
|
|
192
|
+
setTimeout(async () => {
|
|
193
|
+
await this.proxyServer.start({
|
|
194
|
+
port: webPort,
|
|
195
|
+
apiTarget: `http://localhost:${apiPort}`,
|
|
196
|
+
apiPrefix: "/api"
|
|
197
|
+
});
|
|
198
|
+
}, 3e3);
|
|
199
|
+
}
|
|
200
|
+
await this.processRunner.run(processes);
|
|
201
|
+
_chunkDW6GOKMFjs.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");
|
|
202
|
+
_chunkDW6GOKMFjs.logger.info("\u2551 Fusion Development Server Ready \u2551");
|
|
203
|
+
_chunkDW6GOKMFjs.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");
|
|
204
|
+
_chunkDW6GOKMFjs.logger.info(`\u{1F310} Web: http://localhost:${webPort}`);
|
|
205
|
+
_chunkDW6GOKMFjs.logger.info(`\u{1F50C} API: http://localhost:${apiPort}`);
|
|
206
|
+
if (useProxy) {
|
|
207
|
+
_chunkDW6GOKMFjs.logger.info(`\u{1F504} Proxy: Enabled (${webPort}/api \u2192 ${apiPort})`);
|
|
208
|
+
}
|
|
209
|
+
_chunkDW6GOKMFjs.logger.info("\n");
|
|
210
|
+
}
|
|
211
|
+
stop() {
|
|
212
|
+
this.processRunner.stopAll();
|
|
213
|
+
if (this.proxyServer) {
|
|
214
|
+
this.proxyServer.stop();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}, _class3);
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
exports.ProcessRunner = ProcessRunner; exports.ProxyServer = ProxyServer; exports.FusionDevServer = FusionDevServer; exports.dev_server_exports = dev_server_exports;
|
|
225
|
+
//# sourceMappingURL=chunk-JMBD6DOP.js.map
|