wexts 4.1.5 ā 4.1.7
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 +49 -49
- package/bin/wexts.cjs +2 -2
- package/dist/chunk-27NEYQD2.mjs +222 -0
- package/dist/chunk-27NEYQD2.mjs.map +1 -0
- package/dist/chunk-2LJVUMXW.js +228 -0
- package/dist/chunk-2LJVUMXW.js.map +1 -0
- package/dist/chunk-5DBFN65W.mjs +183 -0
- package/dist/chunk-5DBFN65W.mjs.map +1 -0
- package/dist/chunk-75HBI2XG.js +504 -0
- package/dist/chunk-75HBI2XG.js.map +1 -0
- package/dist/chunk-AVMQJWYD.js +95 -0
- package/dist/chunk-AVMQJWYD.js.map +1 -0
- package/dist/chunk-C2AG7Q3C.mjs +65 -0
- package/dist/chunk-C2AG7Q3C.mjs.map +1 -0
- package/dist/chunk-DS5KVVWJ.mjs +95 -0
- package/dist/chunk-DS5KVVWJ.mjs.map +1 -0
- package/dist/chunk-FUPLZMSR.mjs +228 -0
- package/dist/chunk-FUPLZMSR.mjs.map +1 -0
- package/dist/chunk-HLT3IHJY.js +183 -0
- package/dist/chunk-HLT3IHJY.js.map +1 -0
- package/dist/chunk-IRRJJ7KL.js +273 -0
- package/dist/chunk-IRRJJ7KL.js.map +1 -0
- package/dist/chunk-L77ANWWT.mjs +22 -0
- package/dist/chunk-L77ANWWT.mjs.map +1 -0
- package/dist/chunk-P3Q4I5FD.js +222 -0
- package/dist/chunk-P3Q4I5FD.js.map +1 -0
- package/dist/chunk-VBIQGUDI.mjs +504 -0
- package/dist/chunk-VBIQGUDI.mjs.map +1 -0
- package/dist/chunk-VJY6PHYF.mjs +273 -0
- package/dist/chunk-VJY6PHYF.mjs.map +1 -0
- package/dist/chunk-WCKSKU3C.js +65 -0
- package/dist/chunk-WCKSKU3C.js.map +1 -0
- package/dist/chunk-XE4OXN2W.js +12 -0
- package/dist/chunk-XE4OXN2W.js.map +1 -0
- package/dist/cli/index.d.mts +23 -0
- package/dist/cli/index.d.ts +23 -0
- package/dist/cli/index.js +634 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +636 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/client/index.d.mts +43 -0
- package/dist/client/index.d.ts +43 -0
- package/dist/client/index.js +187 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.mjs +166 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/codegen/index.d.mts +2 -0
- package/dist/codegen/index.d.ts +2 -0
- package/dist/codegen/index.js +16 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/index.mjs +16 -0
- package/dist/codegen/index.mjs.map +1 -0
- package/dist/decorators-BiQtOHuF.d.ts +60 -0
- package/dist/decorators-vBopODtr.d.mts +60 -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/errors-D545UvXf.d.mts +37 -0
- package/dist/errors-D545UvXf.d.ts +37 -0
- package/dist/index-7RvU-jGE.d.mts +66 -0
- package/dist/index-7RvU-jGE.d.ts +66 -0
- package/dist/index-BsafLP-a.d.mts +70 -0
- package/dist/index-BsafLP-a.d.ts +70 -0
- package/dist/index-CJKs4wtN.d.ts +92 -0
- package/dist/index-CUR6CnLk.d.ts +27 -0
- package/dist/index-h66Vq9dK.d.mts +92 -0
- package/dist/index-tqmYsTUn.d.mts +27 -0
- package/dist/index.d.mts +289 -0
- package/dist/index.d.ts +289 -0
- package/dist/index.js +544 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +544 -0
- package/dist/index.mjs.map +1 -0
- package/dist/nest/index.d.mts +2 -0
- package/dist/nest/index.d.ts +2 -0
- package/dist/nest/index.js +36 -0
- package/dist/nest/index.js.map +1 -0
- package/dist/nest/index.mjs +36 -0
- package/dist/nest/index.mjs.map +1 -0
- package/dist/next/index.d.mts +66 -0
- package/dist/next/index.d.ts +66 -0
- package/dist/next/index.js +282 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/index.mjs +251 -0
- package/dist/next/index.mjs.map +1 -0
- package/dist/rpc/index.d.mts +32 -0
- package/dist/rpc/index.d.ts +32 -0
- package/dist/rpc/index.js +19 -0
- package/dist/rpc/index.js.map +1 -0
- package/dist/rpc/index.mjs +1 -0
- package/dist/rpc/index.mjs.map +1 -0
- package/dist/runtime/index.d.mts +55 -0
- package/dist/runtime/index.d.ts +55 -0
- package/dist/runtime/index.js +15 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/index.mjs +15 -0
- package/dist/runtime/index.mjs.map +1 -0
- package/dist/server/index.d.mts +7 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.js +58 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +58 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/types/index.d.mts +12 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/types-CQ_aexOX.d.mts +32 -0
- package/dist/types-CQ_aexOX.d.ts +32 -0
- package/dist/vercel-builder/index.d.mts +58 -0
- package/dist/vercel-builder/index.d.ts +58 -0
- package/dist/vercel-builder/index.js +330 -0
- package/dist/vercel-builder/index.js.map +1 -0
- package/dist/vercel-builder/index.mjs +330 -0
- package/dist/vercel-builder/index.mjs.map +1 -0
- package/package.json +153 -153
- package/templates/.dockerignore +43 -43
- package/templates/.env.example +17 -17
- package/templates/Dockerfile +60 -60
- package/templates/Procfile +1 -1
- package/templates/README.md +67 -67
- package/templates/api-sdk.ts +115 -115
- package/templates/docker-compose.yml +34 -34
- package/templates/nestjs-api/.env.example +3 -3
- package/templates/nestjs-api/README.md +87 -87
- package/templates/nestjs-api/nest-cli.json +6 -6
- package/templates/nestjs-api/package.json +40 -40
- package/templates/nestjs-api/prisma/migrations/20251123205437_init/migration.sql +24 -24
- package/templates/nestjs-api/prisma/migrations/migration_lock.toml +3 -3
- package/templates/nestjs-api/prisma/schema.prisma +29 -29
- package/templates/nestjs-api/src/app.module.ts +19 -17
- package/templates/nestjs-api/src/auth/auth.controller.ts +27 -27
- package/templates/nestjs-api/src/auth/auth.module.ts +37 -37
- package/templates/nestjs-api/src/auth/auth.service.ts +86 -86
- package/templates/nestjs-api/src/auth/dto/auth.dto.ts +22 -22
- package/templates/nestjs-api/src/auth/guards/jwt-auth.guard.ts +5 -5
- package/templates/nestjs-api/src/auth/strategies/jwt.strategy.ts +27 -27
- package/templates/nestjs-api/src/hello.service.ts +11 -0
- package/templates/nestjs-api/src/main.ts +32 -32
- package/templates/nestjs-api/src/prisma/prisma.module.ts +9 -9
- package/templates/nestjs-api/src/prisma/prisma.service.ts +14 -14
- package/templates/nestjs-api/src/todos/dto/todo.dto.ts +24 -24
- package/templates/nestjs-api/src/todos/todos.controller.ts +39 -39
- package/templates/nestjs-api/src/todos/todos.module.ts +11 -11
- package/templates/nestjs-api/src/todos/todos.service.ts +53 -53
- package/templates/nestjs-api/src/users/users.controller.ts +14 -14
- package/templates/nestjs-api/src/users/users.module.ts +12 -12
- package/templates/nestjs-api/src/users/users.service.ts +19 -19
- package/templates/nestjs-api/tsconfig.json +39 -39
- package/templates/nextjs-web/README.md +76 -76
- package/templates/nextjs-web/app/actions/auth.ts +108 -108
- package/templates/nextjs-web/app/dashboard/error.tsx +39 -39
- package/templates/nextjs-web/app/dashboard/loading.tsx +14 -14
- package/templates/nextjs-web/app/dashboard/page.tsx +5 -5
- package/templates/nextjs-web/app/globals.css +93 -93
- package/templates/nextjs-web/app/layout.tsx +29 -29
- package/templates/nextjs-web/app/login/page.tsx +5 -5
- package/templates/nextjs-web/app/page.tsx +138 -28
- package/templates/nextjs-web/app/register/page.tsx +5 -5
- package/templates/nextjs-web/components/ui/button.tsx +56 -56
- package/templates/nextjs-web/components/ui/card.tsx +79 -79
- package/templates/nextjs-web/components/ui/input.tsx +25 -25
- package/templates/nextjs-web/components/ui/label.tsx +24 -24
- package/templates/nextjs-web/features/auth/LoginForm.tsx +140 -140
- package/templates/nextjs-web/features/auth/RegisterForm.tsx +159 -159
- package/templates/nextjs-web/features/auth/api.ts +35 -35
- package/templates/nextjs-web/features/auth/index.ts +3 -3
- package/templates/nextjs-web/features/dashboard/DashboardView.tsx +204 -204
- package/templates/nextjs-web/features/dashboard/api.ts +9 -9
- package/templates/nextjs-web/features/dashboard/components.tsx +74 -74
- package/templates/nextjs-web/features/dashboard/index.ts +3 -3
- package/templates/nextjs-web/hooks/index.ts +4 -4
- package/templates/nextjs-web/lib/api-client.ts +89 -89
- package/templates/nextjs-web/lib/api.ts +115 -115
- package/templates/nextjs-web/lib/axios-global-config.ts +17 -17
- package/templates/nextjs-web/lib/utils.ts +6 -6
- package/templates/nextjs-web/lib/wexts-client.ts +4 -4
- package/templates/nextjs-web/next-env.d.ts +6 -6
- package/templates/nextjs-web/next.config.ts +20 -20
- package/templates/nextjs-web/package.json +37 -37
- package/templates/nextjs-web/postcss.config.js +6 -6
- package/templates/nextjs-web/tailwind.config.ts +69 -69
- package/templates/nextjs-web/tsconfig.json +41 -41
- package/templates/nixpacks.toml +11 -11
- package/templates/root-package.json +31 -31
- package/templates/server.ts +66 -66
- package/templates/tsconfig.json +30 -30
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
|
+
|
|
3
|
+
var _chunkXE4OXN2Wjs = require('./chunk-XE4OXN2W.js');
|
|
4
|
+
|
|
5
|
+
// src/errors.ts
|
|
6
|
+
var WextsError = class extends Error {
|
|
7
|
+
static {
|
|
8
|
+
_chunkXE4OXN2Wjs.__name.call(void 0, this, "WextsError");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
constructor(options) {
|
|
14
|
+
super(options.message, options.cause === void 0 ? void 0 : {
|
|
15
|
+
cause: options.cause
|
|
16
|
+
});
|
|
17
|
+
this.name = "WextsError";
|
|
18
|
+
this.code = options.code;
|
|
19
|
+
this.suggestedFix = options.suggestedFix;
|
|
20
|
+
this.docsSlug = options.docsSlug;
|
|
21
|
+
}
|
|
22
|
+
get docsUrl() {
|
|
23
|
+
return this.docsSlug ? `https://github.com/ziadmustafa1/wexts/blob/main/docs/${this.docsSlug}.md` : void 0;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var WextsRpcError = class extends WextsError {
|
|
27
|
+
static {
|
|
28
|
+
_chunkXE4OXN2Wjs.__name.call(void 0, this, "WextsRpcError");
|
|
29
|
+
}
|
|
30
|
+
constructor(options) {
|
|
31
|
+
super({
|
|
32
|
+
code: _nullishCoalesce(options.code, () => ( "WEXTS_RPC_ERROR")),
|
|
33
|
+
...options
|
|
34
|
+
});
|
|
35
|
+
this.name = "WextsRpcError";
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var WextsCodegenError = class extends WextsError {
|
|
39
|
+
static {
|
|
40
|
+
_chunkXE4OXN2Wjs.__name.call(void 0, this, "WextsCodegenError");
|
|
41
|
+
}
|
|
42
|
+
constructor(options) {
|
|
43
|
+
super({
|
|
44
|
+
code: _nullishCoalesce(options.code, () => ( "WEXTS_CODEGEN_ERROR")),
|
|
45
|
+
...options
|
|
46
|
+
});
|
|
47
|
+
this.name = "WextsCodegenError";
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var WextsRuntimeError = class extends WextsError {
|
|
51
|
+
static {
|
|
52
|
+
_chunkXE4OXN2Wjs.__name.call(void 0, this, "WextsRuntimeError");
|
|
53
|
+
}
|
|
54
|
+
constructor(options) {
|
|
55
|
+
super({
|
|
56
|
+
code: _nullishCoalesce(options.code, () => ( "WEXTS_RUNTIME_ERROR")),
|
|
57
|
+
...options
|
|
58
|
+
});
|
|
59
|
+
this.name = "WextsRuntimeError";
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var WextsSecurityError = class extends WextsError {
|
|
63
|
+
static {
|
|
64
|
+
_chunkXE4OXN2Wjs.__name.call(void 0, this, "WextsSecurityError");
|
|
65
|
+
}
|
|
66
|
+
constructor(options) {
|
|
67
|
+
super({
|
|
68
|
+
code: _nullishCoalesce(options.code, () => ( "WEXTS_SECURITY_ERROR")),
|
|
69
|
+
...options
|
|
70
|
+
});
|
|
71
|
+
this.name = "WextsSecurityError";
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
function formatWextsError(error) {
|
|
75
|
+
if (!(error instanceof WextsError)) {
|
|
76
|
+
return error instanceof Error ? error.message : String(error);
|
|
77
|
+
}
|
|
78
|
+
const lines = [
|
|
79
|
+
`${error.code}: ${error.message}`
|
|
80
|
+
];
|
|
81
|
+
if (error.suggestedFix) lines.push(`Suggested fix: ${error.suggestedFix}`);
|
|
82
|
+
if (error.docsUrl) lines.push(`Docs: ${error.docsUrl}`);
|
|
83
|
+
return lines.join("\n");
|
|
84
|
+
}
|
|
85
|
+
_chunkXE4OXN2Wjs.__name.call(void 0, formatWextsError, "formatWextsError");
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
exports.WextsError = WextsError; exports.WextsRpcError = WextsRpcError; exports.WextsCodegenError = WextsCodegenError; exports.WextsRuntimeError = WextsRuntimeError; exports.WextsSecurityError = WextsSecurityError; exports.formatWextsError = formatWextsError;
|
|
95
|
+
//# sourceMappingURL=chunk-AVMQJWYD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Volumes/Projects/wexts/packages/dist/chunk-AVMQJWYD.js","../src/errors.ts"],"names":["WextsError","Error","code","suggestedFix","docsSlug","options","message","cause","undefined","name","docsUrl","WextsRpcError","WextsCodegenError","WextsRuntimeError","WextsSecurityError","formatWextsError","error","String","lines"],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACIO,IAAMA,WAAAA,EAAN,MAAA,QAAyBC,MAAAA;ADFhC,ECEA,OAAgCA;ADDhC,IAAI,qCAAM,IAAK,EAAE,YAAY,CAAC;AAC9B,EAAE;AACF,ECAaC;ADCb,ECAaC;ADCb,ECAaC;ADCb,ECCI,WAAA,CAAYC,OAAAA,EAA4B;AACpC,IAAA,KAAA,CAAMA,OAAAA,CAAQC,OAAAA,EAASD,OAAAA,CAAQE,MAAAA,IAAUC,KAAAA,EAAAA,EAAYA,KAAAA,EAAAA,EAAY;ADAzE,MCA2ED,KAAAA,EAAOF,OAAAA,CAAQE;ADC1F,ICDgG,CAAA,CAAA;AACxF,IAAA,IAAA,CAAKE,KAAAA,EAAO,YAAA;AACZ,IAAA,IAAA,CAAKP,KAAAA,EAAOG,OAAAA,CAAQH,IAAAA;AACpB,IAAA,IAAA,CAAKC,aAAAA,EAAeE,OAAAA,CAAQF,YAAAA;AAC5B,IAAA,IAAA,CAAKC,SAAAA,EAAWC,OAAAA,CAAQD,QAAAA;ADEhC,ECDI;ADEJ,ECAI,IAAIM,OAAAA,CAAAA,EAA8B;AAC9B,IAAA,OAAO,IAAA,CAAKN,SAAAA,EAAW,CAAA,qDAAA,EAAwD,IAAA,CAAKA,QAAQ,CAAA,GAAA,EAAA,EAAQI,KAAAA,CAAAA;ADC5G,ECAI;AACJ,CAAA;AAEO,IAAMG,cAAAA,EAAN,MAAA,QAA4BX,WAAAA;ADAnC,EClBA,OAkBmCA;ADCnC,IAAI,qCAAM,IAAK,EAAE,eAAe,CAAC;AACjC,EAAE;AACF,ECFI,WAAA,CAAYK,OAAAA,EAA8D;AACtE,IAAA,KAAA,CAAM;ADGd,MCHgBH,IAAAA,mBAAMG,OAAAA,CAAQH,IAAAA,UAAQ,mBAAA;ADItC,MCJyD,GAAGG;ADK5D,ICLoE,CAAA,CAAA;AAC5D,IAAA,IAAA,CAAKI,KAAAA,EAAO,eAAA;ADMpB,ECLI;AACJ,CAAA;AAEO,IAAMG,kBAAAA,EAAN,MAAA,QAAgCZ,WAAAA;ADKvC,EC9BA,OAyBuCA;ADMvC,IAAI,qCAAM,IAAK,EAAE,mBAAmB,CAAC;AACrC,EAAE;AACF,ECPI,WAAA,CAAYK,OAAAA,EAA8D;AACtE,IAAA,KAAA,CAAM;ADQd,MCRgBH,IAAAA,mBAAMG,OAAAA,CAAQH,IAAAA,UAAQ,uBAAA;ADStC,MCT6D,GAAGG;ADUhE,ICVwE,CAAA,CAAA;AAChE,IAAA,IAAA,CAAKI,KAAAA,EAAO,mBAAA;ADWpB,ECVI;AACJ,CAAA;AAEO,IAAMI,kBAAAA,EAAN,MAAA,QAAgCb,WAAAA;ADUvC,EC1CA,OAgCuCA;ADWvC,IAAI,qCAAM,IAAK,EAAE,mBAAmB,CAAC;AACrC,EAAE;AACF,ECZI,WAAA,CAAYK,OAAAA,EAA8D;AACtE,IAAA,KAAA,CAAM;ADad,MCbgBH,IAAAA,mBAAMG,OAAAA,CAAQH,IAAAA,UAAQ,uBAAA;ADctC,MCd6D,GAAGG;ADehE,ICfwE,CAAA,CAAA;AAChE,IAAA,IAAA,CAAKI,KAAAA,EAAO,mBAAA;ADgBpB,ECfI;AACJ,CAAA;AAEO,IAAMK,mBAAAA,EAAN,MAAA,QAAiCd,WAAAA;ADexC,ECtDA,OAuCwCA;ADgBxC,IAAI,qCAAM,IAAK,EAAE,oBAAoB,CAAC;AACtC,EAAE;AACF,ECjBI,WAAA,CAAYK,OAAAA,EAA8D;AACtE,IAAA,KAAA,CAAM;ADkBd,MClBgBH,IAAAA,mBAAMG,OAAAA,CAAQH,IAAAA,UAAQ,wBAAA;ADmBtC,MCnB8D,GAAGG;ADoBjE,ICpByE,CAAA,CAAA;AACjE,IAAA,IAAA,CAAKI,KAAAA,EAAO,oBAAA;ADqBpB,ECpBI;AACJ,CAAA;AAEO,SAASM,gBAAAA,CAAiBC,KAAAA,EAAc;AAC3C,EAAA,GAAA,CAAI,CAAA,CAAEA,MAAAA,WAAiBhB,UAAAA,CAAAA,EAAa;AAChC,IAAA,OAAOgB,MAAAA,WAAiBf,MAAAA,EAAQe,KAAAA,CAAMV,QAAAA,EAAUW,MAAAA,CAAOD,KAAAA,CAAAA;ADoB/D,ECnBI;AAEA,EAAA,MAAME,MAAAA,EAAQ;ADmBlB,ICnBmB,CAAA,EAAA;ADoBd,EAAA;ACnBD,EAAA;AACA,EAAA;AACA,EAAA;AACJ;AATgBH;AD+BX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Volumes/Projects/wexts/packages/dist/chunk-AVMQJWYD.js","sourcesContent":[null,"export interface WextsErrorOptions {\n code: string;\n message: string;\n cause?: unknown;\n suggestedFix?: string;\n docsSlug?: string;\n}\n\nexport class WextsError extends Error {\n readonly code: string;\n readonly suggestedFix?: string;\n readonly docsSlug?: string;\n\n constructor(options: WextsErrorOptions) {\n super(options.message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = 'WextsError';\n this.code = options.code;\n this.suggestedFix = options.suggestedFix;\n this.docsSlug = options.docsSlug;\n }\n\n get docsUrl(): string | undefined {\n return this.docsSlug ? `https://github.com/ziadmustafa1/wexts/blob/main/docs/${this.docsSlug}.md` : undefined;\n }\n}\n\nexport class WextsRpcError extends WextsError {\n constructor(options: Omit<WextsErrorOptions, 'code'> & { code?: string }) {\n super({ code: options.code ?? 'WEXTS_RPC_ERROR', ...options });\n this.name = 'WextsRpcError';\n }\n}\n\nexport class WextsCodegenError extends WextsError {\n constructor(options: Omit<WextsErrorOptions, 'code'> & { code?: string }) {\n super({ code: options.code ?? 'WEXTS_CODEGEN_ERROR', ...options });\n this.name = 'WextsCodegenError';\n }\n}\n\nexport class WextsRuntimeError extends WextsError {\n constructor(options: Omit<WextsErrorOptions, 'code'> & { code?: string }) {\n super({ code: options.code ?? 'WEXTS_RUNTIME_ERROR', ...options });\n this.name = 'WextsRuntimeError';\n }\n}\n\nexport class WextsSecurityError extends WextsError {\n constructor(options: Omit<WextsErrorOptions, 'code'> & { code?: string }) {\n super({ code: options.code ?? 'WEXTS_SECURITY_ERROR', ...options });\n this.name = 'WextsSecurityError';\n }\n}\n\nexport function formatWextsError(error: unknown): string {\n if (!(error instanceof WextsError)) {\n return error instanceof Error ? error.message : String(error);\n }\n\n const lines = [`${error.code}: ${error.message}`];\n if (error.suggestedFix) lines.push(`Suggested fix: ${error.suggestedFix}`);\n if (error.docsUrl) lines.push(`Docs: ${error.docsUrl}`);\n return lines.join('\\n');\n}\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__name
|
|
3
|
+
} from "./chunk-L77ANWWT.mjs";
|
|
4
|
+
|
|
5
|
+
// src/core/logger.ts
|
|
6
|
+
var LogLevel = /* @__PURE__ */ (function(LogLevel2) {
|
|
7
|
+
LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG";
|
|
8
|
+
LogLevel2[LogLevel2["INFO"] = 1] = "INFO";
|
|
9
|
+
LogLevel2[LogLevel2["WARN"] = 2] = "WARN";
|
|
10
|
+
LogLevel2[LogLevel2["ERROR"] = 3] = "ERROR";
|
|
11
|
+
return LogLevel2;
|
|
12
|
+
})({});
|
|
13
|
+
var Logger = class {
|
|
14
|
+
static {
|
|
15
|
+
__name(this, "Logger");
|
|
16
|
+
}
|
|
17
|
+
level;
|
|
18
|
+
prefix;
|
|
19
|
+
timestamp;
|
|
20
|
+
constructor(options = {}) {
|
|
21
|
+
this.level = options.level ?? 1;
|
|
22
|
+
this.prefix = options.prefix ?? "[Fusion]";
|
|
23
|
+
this.timestamp = options.timestamp ?? true;
|
|
24
|
+
}
|
|
25
|
+
formatMessage(level, ...args) {
|
|
26
|
+
const timestamp = this.timestamp ? `[${(/* @__PURE__ */ new Date()).toISOString()}]` : "";
|
|
27
|
+
return `${timestamp} ${this.prefix} ${level}: ${args.join(" ")}`;
|
|
28
|
+
}
|
|
29
|
+
debug(...args) {
|
|
30
|
+
if (this.level <= 0) {
|
|
31
|
+
console.log(this.formatMessage("DEBUG", ...args));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
info(...args) {
|
|
35
|
+
if (this.level <= 1) {
|
|
36
|
+
console.log(this.formatMessage("INFO", ...args));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
warn(...args) {
|
|
40
|
+
if (this.level <= 2) {
|
|
41
|
+
console.warn(this.formatMessage("WARN", ...args));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
error(...args) {
|
|
45
|
+
if (this.level <= 3) {
|
|
46
|
+
console.error(this.formatMessage("ERROR", ...args));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
success(...args) {
|
|
50
|
+
console.log(this.formatMessage("\u2713", ...args));
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var logger = new Logger();
|
|
54
|
+
function createLogger(options) {
|
|
55
|
+
return new Logger(options);
|
|
56
|
+
}
|
|
57
|
+
__name(createLogger, "createLogger");
|
|
58
|
+
|
|
59
|
+
export {
|
|
60
|
+
LogLevel,
|
|
61
|
+
Logger,
|
|
62
|
+
logger,
|
|
63
|
+
createLogger
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=chunk-C2AG7Q3C.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/logger.ts"],"sourcesContent":["export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport interface LoggerOptions {\n level?: LogLevel;\n prefix?: string;\n timestamp?: boolean;\n}\n\nexport class Logger {\n private level: LogLevel;\n private prefix: string;\n private timestamp: boolean;\n\n constructor(options: LoggerOptions = {}) {\n this.level = options.level ?? LogLevel.INFO;\n this.prefix = options.prefix ?? '[Fusion]';\n this.timestamp = options.timestamp ?? true;\n }\n\n private formatMessage(level: string, ...args: any[]): string {\n const timestamp = this.timestamp ? `[${new Date().toISOString()}]` : '';\n return `${timestamp} ${this.prefix} ${level}: ${args.join(' ')}`;\n }\n\n debug(...args: any[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.log(this.formatMessage('DEBUG', ...args));\n }\n }\n\n info(...args: any[]): void {\n if (this.level <= LogLevel.INFO) {\n console.log(this.formatMessage('INFO', ...args));\n }\n }\n\n warn(...args: any[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(this.formatMessage('WARN', ...args));\n }\n }\n\n error(...args: any[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(this.formatMessage('ERROR', ...args));\n }\n }\n\n success(...args: any[]): void {\n console.log(this.formatMessage('ā', ...args));\n }\n}\n\n// Export singleton instance\nexport const logger = new Logger();\n\n// Export factory\nexport function createLogger(options: LoggerOptions): Logger {\n return new Logger(options);\n}\n"],"mappings":";;;;;AAAO,IAAKA,WAAAA,0BAAAA,WAAAA;;;;;SAAAA;;AAaL,IAAMC,SAAN,MAAMA;EAbb,OAaaA;;;EACDC;EACAC;EACAC;EAER,YAAYC,UAAyB,CAAC,GAAG;AACrC,SAAKH,QAAQG,QAAQH,SAAK;AAC1B,SAAKC,SAASE,QAAQF,UAAU;AAChC,SAAKC,YAAYC,QAAQD,aAAa;EAC1C;EAEQE,cAAcJ,UAAkBK,MAAqB;AACzD,UAAMH,YAAY,KAAKA,YAAY,KAAI,oBAAII,KAAAA,GAAOC,YAAW,CAAA,MAAQ;AACrE,WAAO,GAAGL,SAAAA,IAAa,KAAKD,MAAM,IAAID,KAAAA,KAAUK,KAAKG,KAAK,GAAA,CAAA;EAC9D;EAEAC,SAASJ,MAAmB;AACxB,QAAI,KAAKL,SAAK,GAAoB;AAC9BU,cAAQC,IAAI,KAAKP,cAAc,SAAA,GAAYC,IAAAA,CAAAA;IAC/C;EACJ;EAEAO,QAAQP,MAAmB;AACvB,QAAI,KAAKL,SAAK,GAAmB;AAC7BU,cAAQC,IAAI,KAAKP,cAAc,QAAA,GAAWC,IAAAA,CAAAA;IAC9C;EACJ;EAEAQ,QAAQR,MAAmB;AACvB,QAAI,KAAKL,SAAK,GAAmB;AAC7BU,cAAQG,KAAK,KAAKT,cAAc,QAAA,GAAWC,IAAAA,CAAAA;IAC/C;EACJ;EAEAS,SAAST,MAAmB;AACxB,QAAI,KAAKL,SAAK,GAAoB;AAC9BU,cAAQI,MAAM,KAAKV,cAAc,SAAA,GAAYC,IAAAA,CAAAA;IACjD;EACJ;EAEAU,WAAWV,MAAmB;AAC1BK,YAAQC,IAAI,KAAKP,cAAc,UAAA,GAAQC,IAAAA,CAAAA;EAC3C;AACJ;AAGO,IAAMW,SAAS,IAAIjB,OAAAA;AAGnB,SAASkB,aAAad,SAAsB;AAC/C,SAAO,IAAIJ,OAAOI,OAAAA;AACtB;AAFgBc;","names":["LogLevel","Logger","level","prefix","timestamp","options","formatMessage","args","Date","toISOString","join","debug","console","log","info","warn","error","success","logger","createLogger"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__name
|
|
3
|
+
} from "./chunk-L77ANWWT.mjs";
|
|
4
|
+
|
|
5
|
+
// src/errors.ts
|
|
6
|
+
var WextsError = class extends Error {
|
|
7
|
+
static {
|
|
8
|
+
__name(this, "WextsError");
|
|
9
|
+
}
|
|
10
|
+
code;
|
|
11
|
+
suggestedFix;
|
|
12
|
+
docsSlug;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
super(options.message, options.cause === void 0 ? void 0 : {
|
|
15
|
+
cause: options.cause
|
|
16
|
+
});
|
|
17
|
+
this.name = "WextsError";
|
|
18
|
+
this.code = options.code;
|
|
19
|
+
this.suggestedFix = options.suggestedFix;
|
|
20
|
+
this.docsSlug = options.docsSlug;
|
|
21
|
+
}
|
|
22
|
+
get docsUrl() {
|
|
23
|
+
return this.docsSlug ? `https://github.com/ziadmustafa1/wexts/blob/main/docs/${this.docsSlug}.md` : void 0;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var WextsRpcError = class extends WextsError {
|
|
27
|
+
static {
|
|
28
|
+
__name(this, "WextsRpcError");
|
|
29
|
+
}
|
|
30
|
+
constructor(options) {
|
|
31
|
+
super({
|
|
32
|
+
code: options.code ?? "WEXTS_RPC_ERROR",
|
|
33
|
+
...options
|
|
34
|
+
});
|
|
35
|
+
this.name = "WextsRpcError";
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var WextsCodegenError = class extends WextsError {
|
|
39
|
+
static {
|
|
40
|
+
__name(this, "WextsCodegenError");
|
|
41
|
+
}
|
|
42
|
+
constructor(options) {
|
|
43
|
+
super({
|
|
44
|
+
code: options.code ?? "WEXTS_CODEGEN_ERROR",
|
|
45
|
+
...options
|
|
46
|
+
});
|
|
47
|
+
this.name = "WextsCodegenError";
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var WextsRuntimeError = class extends WextsError {
|
|
51
|
+
static {
|
|
52
|
+
__name(this, "WextsRuntimeError");
|
|
53
|
+
}
|
|
54
|
+
constructor(options) {
|
|
55
|
+
super({
|
|
56
|
+
code: options.code ?? "WEXTS_RUNTIME_ERROR",
|
|
57
|
+
...options
|
|
58
|
+
});
|
|
59
|
+
this.name = "WextsRuntimeError";
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var WextsSecurityError = class extends WextsError {
|
|
63
|
+
static {
|
|
64
|
+
__name(this, "WextsSecurityError");
|
|
65
|
+
}
|
|
66
|
+
constructor(options) {
|
|
67
|
+
super({
|
|
68
|
+
code: options.code ?? "WEXTS_SECURITY_ERROR",
|
|
69
|
+
...options
|
|
70
|
+
});
|
|
71
|
+
this.name = "WextsSecurityError";
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
function formatWextsError(error) {
|
|
75
|
+
if (!(error instanceof WextsError)) {
|
|
76
|
+
return error instanceof Error ? error.message : String(error);
|
|
77
|
+
}
|
|
78
|
+
const lines = [
|
|
79
|
+
`${error.code}: ${error.message}`
|
|
80
|
+
];
|
|
81
|
+
if (error.suggestedFix) lines.push(`Suggested fix: ${error.suggestedFix}`);
|
|
82
|
+
if (error.docsUrl) lines.push(`Docs: ${error.docsUrl}`);
|
|
83
|
+
return lines.join("\n");
|
|
84
|
+
}
|
|
85
|
+
__name(formatWextsError, "formatWextsError");
|
|
86
|
+
|
|
87
|
+
export {
|
|
88
|
+
WextsError,
|
|
89
|
+
WextsRpcError,
|
|
90
|
+
WextsCodegenError,
|
|
91
|
+
WextsRuntimeError,
|
|
92
|
+
WextsSecurityError,
|
|
93
|
+
formatWextsError
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=chunk-DS5KVVWJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts"],"sourcesContent":["export interface WextsErrorOptions {\n code: string;\n message: string;\n cause?: unknown;\n suggestedFix?: string;\n docsSlug?: string;\n}\n\nexport class WextsError extends Error {\n readonly code: string;\n readonly suggestedFix?: string;\n readonly docsSlug?: string;\n\n constructor(options: WextsErrorOptions) {\n super(options.message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = 'WextsError';\n this.code = options.code;\n this.suggestedFix = options.suggestedFix;\n this.docsSlug = options.docsSlug;\n }\n\n get docsUrl(): string | undefined {\n return this.docsSlug ? `https://github.com/ziadmustafa1/wexts/blob/main/docs/${this.docsSlug}.md` : undefined;\n }\n}\n\nexport class WextsRpcError extends WextsError {\n constructor(options: Omit<WextsErrorOptions, 'code'> & { code?: string }) {\n super({ code: options.code ?? 'WEXTS_RPC_ERROR', ...options });\n this.name = 'WextsRpcError';\n }\n}\n\nexport class WextsCodegenError extends WextsError {\n constructor(options: Omit<WextsErrorOptions, 'code'> & { code?: string }) {\n super({ code: options.code ?? 'WEXTS_CODEGEN_ERROR', ...options });\n this.name = 'WextsCodegenError';\n }\n}\n\nexport class WextsRuntimeError extends WextsError {\n constructor(options: Omit<WextsErrorOptions, 'code'> & { code?: string }) {\n super({ code: options.code ?? 'WEXTS_RUNTIME_ERROR', ...options });\n this.name = 'WextsRuntimeError';\n }\n}\n\nexport class WextsSecurityError extends WextsError {\n constructor(options: Omit<WextsErrorOptions, 'code'> & { code?: string }) {\n super({ code: options.code ?? 'WEXTS_SECURITY_ERROR', ...options });\n this.name = 'WextsSecurityError';\n }\n}\n\nexport function formatWextsError(error: unknown): string {\n if (!(error instanceof WextsError)) {\n return error instanceof Error ? error.message : String(error);\n }\n\n const lines = [`${error.code}: ${error.message}`];\n if (error.suggestedFix) lines.push(`Suggested fix: ${error.suggestedFix}`);\n if (error.docsUrl) lines.push(`Docs: ${error.docsUrl}`);\n return lines.join('\\n');\n}\n"],"mappings":";;;;;AAQO,IAAMA,aAAN,cAAyBC,MAAAA;EAAhC,OAAgCA;;;EACnBC;EACAC;EACAC;EAET,YAAYC,SAA4B;AACpC,UAAMA,QAAQC,SAASD,QAAQE,UAAUC,SAAYA,SAAY;MAAED,OAAOF,QAAQE;IAAM,CAAA;AACxF,SAAKE,OAAO;AACZ,SAAKP,OAAOG,QAAQH;AACpB,SAAKC,eAAeE,QAAQF;AAC5B,SAAKC,WAAWC,QAAQD;EAC5B;EAEA,IAAIM,UAA8B;AAC9B,WAAO,KAAKN,WAAW,wDAAwD,KAAKA,QAAQ,QAAQI;EACxG;AACJ;AAEO,IAAMG,gBAAN,cAA4BX,WAAAA;EAlBnC,OAkBmCA;;;EAC/B,YAAYK,SAA8D;AACtE,UAAM;MAAEH,MAAMG,QAAQH,QAAQ;MAAmB,GAAGG;IAAQ,CAAA;AAC5D,SAAKI,OAAO;EAChB;AACJ;AAEO,IAAMG,oBAAN,cAAgCZ,WAAAA;EAzBvC,OAyBuCA;;;EACnC,YAAYK,SAA8D;AACtE,UAAM;MAAEH,MAAMG,QAAQH,QAAQ;MAAuB,GAAGG;IAAQ,CAAA;AAChE,SAAKI,OAAO;EAChB;AACJ;AAEO,IAAMI,oBAAN,cAAgCb,WAAAA;EAhCvC,OAgCuCA;;;EACnC,YAAYK,SAA8D;AACtE,UAAM;MAAEH,MAAMG,QAAQH,QAAQ;MAAuB,GAAGG;IAAQ,CAAA;AAChE,SAAKI,OAAO;EAChB;AACJ;AAEO,IAAMK,qBAAN,cAAiCd,WAAAA;EAvCxC,OAuCwCA;;;EACpC,YAAYK,SAA8D;AACtE,UAAM;MAAEH,MAAMG,QAAQH,QAAQ;MAAwB,GAAGG;IAAQ,CAAA;AACjE,SAAKI,OAAO;EAChB;AACJ;AAEO,SAASM,iBAAiBC,OAAc;AAC3C,MAAI,EAAEA,iBAAiBhB,aAAa;AAChC,WAAOgB,iBAAiBf,QAAQe,MAAMV,UAAUW,OAAOD,KAAAA;EAC3D;AAEA,QAAME,QAAQ;IAAC,GAAGF,MAAMd,IAAI,KAAKc,MAAMV,OAAO;;AAC9C,MAAIU,MAAMb,aAAce,OAAMC,KAAK,kBAAkBH,MAAMb,YAAY,EAAE;AACzE,MAAIa,MAAMN,QAASQ,OAAMC,KAAK,SAASH,MAAMN,OAAO,EAAE;AACtD,SAAOQ,MAAME,KAAK,IAAA;AACtB;AATgBL;","names":["WextsError","Error","code","suggestedFix","docsSlug","options","message","cause","undefined","name","docsUrl","WextsRpcError","WextsCodegenError","WextsRuntimeError","WextsSecurityError","formatWextsError","error","String","lines","push","join"]}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import {
|
|
2
|
+
logger
|
|
3
|
+
} from "./chunk-C2AG7Q3C.mjs";
|
|
4
|
+
import {
|
|
5
|
+
__export,
|
|
6
|
+
__name
|
|
7
|
+
} from "./chunk-L77ANWWT.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
|
+
static {
|
|
22
|
+
__name(this, "ProcessRunner");
|
|
23
|
+
}
|
|
24
|
+
processes = /* @__PURE__ */ new Map();
|
|
25
|
+
colors = {
|
|
26
|
+
cyan: pc.cyan,
|
|
27
|
+
green: pc.green,
|
|
28
|
+
yellow: pc.yellow,
|
|
29
|
+
magenta: pc.magenta,
|
|
30
|
+
blue: pc.blue
|
|
31
|
+
};
|
|
32
|
+
async run(configs) {
|
|
33
|
+
logger.info("\u{1F680} Starting development servers...\n");
|
|
34
|
+
for (const config of configs) {
|
|
35
|
+
this.startProcess(config);
|
|
36
|
+
}
|
|
37
|
+
process.on("SIGINT", () => this.stopAll());
|
|
38
|
+
process.on("SIGTERM", () => this.stopAll());
|
|
39
|
+
}
|
|
40
|
+
startProcess(config) {
|
|
41
|
+
const { name, command, args, cwd, color, env } = config;
|
|
42
|
+
const colorFn = this.colors[color];
|
|
43
|
+
const prefix = colorFn(`[${name}]`);
|
|
44
|
+
logger.info(`${prefix} Starting...`);
|
|
45
|
+
const proc = spawn(command, args, {
|
|
46
|
+
cwd,
|
|
47
|
+
stdio: "pipe",
|
|
48
|
+
shell: true,
|
|
49
|
+
env: {
|
|
50
|
+
...process.env,
|
|
51
|
+
...env
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
this.processes.set(name, proc);
|
|
55
|
+
proc.stdout?.on("data", (data) => {
|
|
56
|
+
const lines = data.toString().split("\n").filter((l) => l.trim());
|
|
57
|
+
lines.forEach((line) => {
|
|
58
|
+
console.log(`${prefix} ${line}`);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
proc.stderr?.on("data", (data) => {
|
|
62
|
+
const lines = data.toString().split("\n").filter((l) => l.trim());
|
|
63
|
+
lines.forEach((line) => {
|
|
64
|
+
console.error(`${prefix} ${pc.red(line)}`);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
proc.on("exit", (code) => {
|
|
68
|
+
if (code !== 0 && code !== null) {
|
|
69
|
+
logger.error(`${prefix} Exited with code ${code}`);
|
|
70
|
+
}
|
|
71
|
+
this.processes.delete(name);
|
|
72
|
+
});
|
|
73
|
+
proc.on("error", (error) => {
|
|
74
|
+
logger.error(`${prefix} Error:`, error.message);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
stopAll() {
|
|
78
|
+
logger.info("\n\u{1F6D1} Stopping all processes...");
|
|
79
|
+
for (const [name, proc] of this.processes.entries()) {
|
|
80
|
+
logger.info(`Stopping ${name}...`);
|
|
81
|
+
proc.kill("SIGTERM");
|
|
82
|
+
}
|
|
83
|
+
setTimeout(() => {
|
|
84
|
+
process.exit(0);
|
|
85
|
+
}, 1e3);
|
|
86
|
+
}
|
|
87
|
+
isRunning(name) {
|
|
88
|
+
return this.processes.has(name);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// src/dev-server/dev-server.ts
|
|
93
|
+
import * as path from "path";
|
|
94
|
+
import * as fs from "fs";
|
|
95
|
+
var FusionDevServer = class {
|
|
96
|
+
static {
|
|
97
|
+
__name(this, "FusionDevServer");
|
|
98
|
+
}
|
|
99
|
+
processRunner;
|
|
100
|
+
constructor() {
|
|
101
|
+
this.processRunner = new ProcessRunner();
|
|
102
|
+
}
|
|
103
|
+
async start(config) {
|
|
104
|
+
const { apiPath, webPath, webPort = 3e3, apiPort = 5050, useProxy = false } = config;
|
|
105
|
+
if (useProxy) {
|
|
106
|
+
throw new Error("The legacy dev proxy is disabled because it conflicts with the Next.js port. Use the production runtime for single-port serving.");
|
|
107
|
+
}
|
|
108
|
+
if (!fs.existsSync(apiPath)) {
|
|
109
|
+
throw new Error(`API path not found: ${apiPath}`);
|
|
110
|
+
}
|
|
111
|
+
if (!fs.existsSync(webPath)) {
|
|
112
|
+
throw new Error(`Web path not found: ${webPath}`);
|
|
113
|
+
}
|
|
114
|
+
const processes = [];
|
|
115
|
+
processes.push({
|
|
116
|
+
name: "API",
|
|
117
|
+
command: "npm",
|
|
118
|
+
args: [
|
|
119
|
+
"run",
|
|
120
|
+
"start:dev"
|
|
121
|
+
],
|
|
122
|
+
cwd: path.resolve(apiPath),
|
|
123
|
+
color: "cyan",
|
|
124
|
+
env: {
|
|
125
|
+
PORT: apiPort.toString()
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
processes.push({
|
|
129
|
+
name: "Web",
|
|
130
|
+
command: "npm",
|
|
131
|
+
args: [
|
|
132
|
+
"run",
|
|
133
|
+
"dev",
|
|
134
|
+
"--",
|
|
135
|
+
"-p",
|
|
136
|
+
webPort.toString()
|
|
137
|
+
],
|
|
138
|
+
cwd: path.resolve(webPath),
|
|
139
|
+
color: "green",
|
|
140
|
+
env: {
|
|
141
|
+
NEXT_PUBLIC_API_URL: `http://localhost:${apiPort}`
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
await this.processRunner.run(processes);
|
|
145
|
+
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");
|
|
146
|
+
logger.info("\u2551 Fusion Development Server Ready \u2551");
|
|
147
|
+
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");
|
|
148
|
+
logger.info(`\u{1F310} Web: http://localhost:${webPort}`);
|
|
149
|
+
logger.info(`\u{1F50C} API: http://localhost:${apiPort}`);
|
|
150
|
+
logger.info("\n");
|
|
151
|
+
}
|
|
152
|
+
stop() {
|
|
153
|
+
this.processRunner.stopAll();
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// src/dev-server/proxy.ts
|
|
158
|
+
import http from "http";
|
|
159
|
+
import httpProxy from "http-proxy";
|
|
160
|
+
import * as pc2 from "picocolors";
|
|
161
|
+
var ProxyServer = class {
|
|
162
|
+
static {
|
|
163
|
+
__name(this, "ProxyServer");
|
|
164
|
+
}
|
|
165
|
+
server = null;
|
|
166
|
+
proxy = null;
|
|
167
|
+
async start(config) {
|
|
168
|
+
const { port, apiTarget, apiPrefix } = config;
|
|
169
|
+
this.proxy = httpProxy.createProxyServer({
|
|
170
|
+
target: apiTarget,
|
|
171
|
+
changeOrigin: true,
|
|
172
|
+
ws: true
|
|
173
|
+
});
|
|
174
|
+
this.proxy.on("error", (err, req, res) => {
|
|
175
|
+
logger.error("Proxy error:", err.message);
|
|
176
|
+
if (res && "headersSent" in res && !res.headersSent) {
|
|
177
|
+
res.writeHead(502, {
|
|
178
|
+
"Content-Type": "text/plain"
|
|
179
|
+
});
|
|
180
|
+
res.end("Bad Gateway - API server unavailable");
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
this.server = http.createServer((req, res) => {
|
|
184
|
+
if (req.url?.startsWith(apiPrefix)) {
|
|
185
|
+
const newUrl = req.url.substring(apiPrefix.length) || "/";
|
|
186
|
+
req.url = newUrl;
|
|
187
|
+
logger.info(pc2.gray(`\u2192 ${req.method} ${apiPrefix}${newUrl}`));
|
|
188
|
+
this.proxy.web(req, res);
|
|
189
|
+
} else {
|
|
190
|
+
res.writeHead(404);
|
|
191
|
+
res.end("Not Found");
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
this.server.on("upgrade", (req, socket, head) => {
|
|
195
|
+
if (req.url?.startsWith(apiPrefix)) {
|
|
196
|
+
const newUrl = req.url.substring(apiPrefix.length) || "/";
|
|
197
|
+
req.url = newUrl;
|
|
198
|
+
this.proxy.ws(req, socket, head);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
return new Promise((resolve2) => {
|
|
202
|
+
this.server.listen(port, () => {
|
|
203
|
+
logger.success(`\u2705 Proxy server running on port ${port}`);
|
|
204
|
+
logger.info(` Forwarding ${pc2.cyan(apiPrefix + "/*")} \u2192 ${pc2.cyan(apiTarget)}
|
|
205
|
+
`);
|
|
206
|
+
resolve2();
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
stop() {
|
|
211
|
+
if (this.server) {
|
|
212
|
+
this.server.close();
|
|
213
|
+
this.server = null;
|
|
214
|
+
}
|
|
215
|
+
if (this.proxy) {
|
|
216
|
+
this.proxy.close();
|
|
217
|
+
this.proxy = null;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
export {
|
|
223
|
+
ProcessRunner,
|
|
224
|
+
FusionDevServer,
|
|
225
|
+
ProxyServer,
|
|
226
|
+
dev_server_exports
|
|
227
|
+
};
|
|
228
|
+
//# sourceMappingURL=chunk-FUPLZMSR.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dev-server/index.ts","../src/dev-server/process-runner.ts","../src/dev-server/dev-server.ts","../src/dev-server/proxy.ts"],"sourcesContent":["export * from './dev-server';\nexport * from './process-runner';\nexport * from './proxy';\n","import { spawn, ChildProcess } from 'child_process';\nimport { logger } from '../core/logger';\nimport * as pc from 'picocolors';\n\nexport interface ProcessConfig {\n name: string;\n command: string;\n args: string[];\n cwd: string;\n color: 'cyan' | 'green' | 'yellow' | 'magenta' | 'blue';\n env?: Record<string, string>;\n}\n\n/**\n * Run multiple processes concurrently with colored output\n */\nexport class ProcessRunner {\n private processes: Map<string, ChildProcess> = new Map();\n private colors = {\n cyan: pc.cyan,\n green: pc.green,\n yellow: pc.yellow,\n magenta: pc.magenta,\n blue: pc.blue,\n };\n\n async run(configs: ProcessConfig[]): Promise<void> {\n logger.info('š Starting development servers...\\n');\n\n for (const config of configs) {\n this.startProcess(config);\n }\n\n // Handle graceful shutdown\n process.on('SIGINT', () => this.stopAll());\n process.on('SIGTERM', () => this.stopAll());\n }\n\n private startProcess(config: ProcessConfig): void {\n const { name, command, args, cwd, color, env } = config;\n\n const colorFn = this.colors[color];\n const prefix = colorFn(`[${name}]`);\n\n logger.info(`${prefix} Starting...`);\n\n const proc = spawn(command, args, {\n cwd,\n stdio: 'pipe',\n shell: true,\n env: { ...process.env, ...env },\n });\n\n this.processes.set(name, proc);\n\n // Handle stdout\n proc.stdout?.on('data', (data) => {\n const lines = data.toString().split('\\n').filter((l: string) => l.trim());\n lines.forEach((line: string) => {\n console.log(`${prefix} ${line}`);\n });\n });\n\n // Handle stderr\n proc.stderr?.on('data', (data) => {\n const lines = data.toString().split('\\n').filter((l: string) => l.trim());\n lines.forEach((line: string) => {\n console.error(`${prefix} ${pc.red(line)}`);\n });\n });\n\n // Handle exit\n proc.on('exit', (code) => {\n if (code !== 0 && code !== null) {\n logger.error(`${prefix} Exited with code ${code}`);\n }\n this.processes.delete(name);\n });\n\n // Handle errors\n proc.on('error', (error) => {\n logger.error(`${prefix} Error:`, error.message);\n });\n }\n\n stopAll(): void {\n logger.info('\\nš Stopping all processes...');\n\n for (const [name, proc] of this.processes.entries()) {\n logger.info(`Stopping ${name}...`);\n proc.kill('SIGTERM');\n }\n\n setTimeout(() => {\n process.exit(0);\n }, 1000);\n }\n\n isRunning(name: string): boolean {\n return this.processes.has(name);\n }\n}\n","import { ProcessRunner, ProcessConfig } from './process-runner';\nimport { logger } from '../core/logger';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nexport interface DevServerConfig {\n apiPath: string;\n webPath: string;\n webPort?: number;\n apiPort?: number;\n useProxy?: boolean;\n}\n\n/**\n * Unified development server for Fusion projects\n */\nexport class FusionDevServer {\n private processRunner: ProcessRunner;\n\n constructor() {\n this.processRunner = new ProcessRunner();\n }\n\n async start(config: DevServerConfig): Promise<void> {\n const {\n apiPath,\n webPath,\n webPort = 3000,\n apiPort = 5050,\n useProxy = false,\n } = config;\n\n if (useProxy) {\n throw new Error('The legacy dev proxy is disabled because it conflicts with the Next.js port. Use the production runtime for single-port serving.');\n }\n\n // Validate paths\n if (!fs.existsSync(apiPath)) {\n throw new Error(`API path not found: ${apiPath}`);\n }\n if (!fs.existsSync(webPath)) {\n throw new Error(`Web path not found: ${webPath}`);\n }\n\n const processes: ProcessConfig[] = [];\n\n // Add API server\n processes.push({\n name: 'API',\n command: 'npm',\n args: ['run', 'start:dev'],\n cwd: path.resolve(apiPath),\n color: 'cyan',\n env: {\n PORT: apiPort.toString(),\n },\n });\n\n // Add Web server\n processes.push({\n name: 'Web',\n command: 'npm',\n args: ['run', 'dev', '--', '-p', webPort.toString()],\n cwd: path.resolve(webPath),\n color: 'green',\n env: {\n NEXT_PUBLIC_API_URL: `http://localhost:${apiPort}`,\n },\n });\n\n // Start processes\n await this.processRunner.run(processes);\n\n // Log info\n logger.info('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');\n logger.info('ā Fusion Development Server Ready ā');\n logger.info('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\\n');\n logger.info(`š Web: http://localhost:${webPort}`);\n logger.info(`š API: http://localhost:${apiPort}`);\n logger.info('\\n');\n }\n\n stop(): void {\n this.processRunner.stopAll();\n }\n}\n","import http from 'http';\nimport httpProxy from 'http-proxy';\nimport { logger } from '../core/logger';\nimport * as pc from 'picocolors';\n\nexport interface ProxyConfig {\n port: number;\n apiTarget: string;\n apiPrefix: string;\n}\n\n/**\n * Proxy server to forward API requests from Next.js to NestJS\n */\nexport class ProxyServer {\n private server: http.Server | null = null;\n private proxy: httpProxy | null = null;\n\n async start(config: ProxyConfig): Promise<void> {\n const { port, apiTarget, apiPrefix } = config;\n\n this.proxy = httpProxy.createProxyServer({\n target: apiTarget,\n changeOrigin: true,\n ws: true, // WebSocket support\n });\n\n // Handle proxy errors\n this.proxy.on('error', (err, req, res) => {\n logger.error('Proxy error:', err.message);\n if (res && 'headersSent' in res && !(res as any).headersSent) {\n (res as http.ServerResponse).writeHead(502, { 'Content-Type': 'text/plain' });\n (res as http.ServerResponse).end('Bad Gateway - API server unavailable');\n }\n });\n\n this.server = http.createServer((req, res) => {\n // Check if request is for API\n if (req.url?.startsWith(apiPrefix)) {\n // Remove prefix before forwarding\n const newUrl = req.url.substring(apiPrefix.length) || '/';\n req.url = newUrl;\n\n logger.info(pc.gray(`ā ${req.method} ${apiPrefix}${newUrl}`));\n this.proxy!.web(req, res);\n } else {\n // Not an API request - should not happen\n res.writeHead(404);\n res.end('Not Found');\n }\n });\n\n // Handle WebSocket upgrade\n this.server.on('upgrade', (req, socket, head) => {\n if (req.url?.startsWith(apiPrefix)) {\n const newUrl = req.url.substring(apiPrefix.length) || '/';\n req.url = newUrl;\n this.proxy!.ws(req, socket, head);\n }\n });\n\n return new Promise((resolve) => {\n this.server!.listen(port, () => {\n logger.success(`ā
Proxy server running on port ${port}`);\n logger.info(` Forwarding ${pc.cyan(apiPrefix + '/*')} ā ${pc.cyan(apiTarget)}\\n`);\n resolve();\n });\n });\n }\n\n stop(): void {\n if (this.server) {\n this.server.close();\n this.server = null;\n }\n if (this.proxy) {\n this.proxy.close();\n this.proxy = null;\n }\n }\n}\n"],"mappings":"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","names":["spawn","pc","ProcessRunner","processes","Map","colors","cyan","green","yellow","magenta","blue","run","configs","logger","info","config","startProcess","process","on","stopAll","name","command","args","cwd","color","env","colorFn","prefix","proc","spawn","stdio","shell","set","stdout","data","lines","toString","split","filter","l","trim","forEach","line","console","log","stderr","error","red","code","delete","message","entries","kill","setTimeout","exit","isRunning","has","path","fs","FusionDevServer","processRunner","ProcessRunner","start","config","apiPath","webPath","webPort","apiPort","useProxy","Error","existsSync","processes","push","name","command","args","cwd","resolve","color","env","PORT","toString","NEXT_PUBLIC_API_URL","run","logger","info","stop","stopAll","http","httpProxy","pc","ProxyServer","server","proxy","start","config","port","apiTarget","apiPrefix","httpProxy","createProxyServer","target","changeOrigin","ws","on","err","req","res","logger","error","message","headersSent","writeHead","end","http","createServer","url","startsWith","newUrl","substring","length","info","gray","method","web","socket","head","Promise","resolve","listen","success","cyan","stop","close"]}
|