phecda-server 3.0.0 → 3.0.2
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/bin/cli.js +12 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +135 -90
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +133 -90
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -3
package/bin/cli.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const fs = require('fs')
|
|
2
|
+
const path = require('path')
|
|
3
|
+
const [module, dir = ''] = process.argv.slice(2)
|
|
4
|
+
|
|
5
|
+
const dirPath = path.resolve(process.cwd(), dir, module)
|
|
6
|
+
fs.mkdirSync(dirPath)
|
|
7
|
+
|
|
8
|
+
fs.writeFileSync(path.resolve(dirPath, `${module}.controller.ts`), `
|
|
9
|
+
export class ${module.slice(0).toUpperCase()}${module.slice(1)}Controller{
|
|
10
|
+
|
|
11
|
+
}
|
|
12
|
+
`)
|
package/dist/index.d.ts
CHANGED
|
@@ -185,6 +185,7 @@ declare function parseMeta(meta: Meta): {
|
|
|
185
185
|
reflect: any[];
|
|
186
186
|
interceptors: string[];
|
|
187
187
|
middlewares: string[];
|
|
188
|
+
handlers: P.Handler[];
|
|
188
189
|
params: {
|
|
189
190
|
type: string;
|
|
190
191
|
key: string;
|
|
@@ -214,6 +215,7 @@ declare function Factory(Modules: (new (...args: any) => any)[]): Promise<{
|
|
|
214
215
|
meta: Meta[];
|
|
215
216
|
output: (p?: string) => void;
|
|
216
217
|
}>;
|
|
218
|
+
declare const constructorMap: Map<any, any>;
|
|
217
219
|
|
|
218
220
|
interface Options {
|
|
219
221
|
route?: string;
|
|
@@ -232,6 +234,7 @@ declare function Route(route: string, type?: string): any;
|
|
|
232
234
|
declare function Get(route: string): any;
|
|
233
235
|
declare function Post(route: string): any;
|
|
234
236
|
declare function Put(route: string): any;
|
|
237
|
+
declare function Patch(route: string): any;
|
|
235
238
|
declare function Delete(route: string): any;
|
|
236
239
|
declare function Controller(route: string): any;
|
|
237
240
|
declare function Guard(...guards: string[]): any;
|
|
@@ -249,4 +252,4 @@ declare function resolveDep(ret: any, key: string): any;
|
|
|
249
252
|
declare const SERIES_SYMBOL = "__symbol_series__";
|
|
250
253
|
declare const MERGE_SYMBOL = "__symbol_req__";
|
|
251
254
|
|
|
252
|
-
export { BadGatewayException, BadRequestException, Base, BaseError, BaseParam, Body, ConflictException, Construct, Context, Controller, Define, Delete, Emitter, Factory, ForbiddenException, FrameworkException, Get, Guard, Header, HttpException, Interceptor, InvalidInputException, MERGE_SYMBOL, MergeType, Meta, Middle, NotFoundException, Options, P, Param, PayloadLargeException, Post, Put, Query, RequestType, Route, SERIES_SYMBOL, ServerContext, ServerCtx, ServerFilter, ServerMergeCtx, ServiceUnavailableException, TimeoutException, UnauthorizedException, UndefinedException, UnsupportedMediaTypeException, ValidateException, addGuard, addInterceptor, addMiddleware, bindApp, defaultPipe, emitter, getInstance, isMerge, parseMeta, resolveDep, useServerFilter, useServerPipe };
|
|
255
|
+
export { BadGatewayException, BadRequestException, Base, BaseError, BaseParam, Body, ConflictException, Construct, Context, Controller, Define, Delete, Emitter, Factory, ForbiddenException, FrameworkException, Get, Guard, Header, HttpException, Interceptor, InvalidInputException, MERGE_SYMBOL, MergeType, Meta, Middle, NotFoundException, Options, P, Param, Patch, PayloadLargeException, Post, Put, Query, RequestType, Route, SERIES_SYMBOL, ServerContext, ServerCtx, ServerFilter, ServerMergeCtx, ServiceUnavailableException, TimeoutException, UnauthorizedException, UndefinedException, UnsupportedMediaTypeException, ValidateException, addGuard, addInterceptor, addMiddleware, bindApp, constructorMap, defaultPipe, emitter, getInstance, isMerge, parseMeta, resolveDep, useServerFilter, useServerPipe };
|
package/dist/index.js
CHANGED
|
@@ -57,6 +57,7 @@ __export(src_exports, {
|
|
|
57
57
|
Middle: () => Middle,
|
|
58
58
|
NotFoundException: () => NotFoundException,
|
|
59
59
|
Param: () => Param,
|
|
60
|
+
Patch: () => Patch,
|
|
60
61
|
PayloadLargeException: () => PayloadLargeException,
|
|
61
62
|
Post: () => Post,
|
|
62
63
|
Put: () => Put,
|
|
@@ -74,6 +75,7 @@ __export(src_exports, {
|
|
|
74
75
|
addInterceptor: () => addInterceptor,
|
|
75
76
|
addMiddleware: () => addMiddleware,
|
|
76
77
|
bindApp: () => bindApp,
|
|
78
|
+
constructorMap: () => constructorMap,
|
|
77
79
|
defaultPipe: () => defaultPipe,
|
|
78
80
|
emitter: () => emitter,
|
|
79
81
|
getInstance: () => getInstance,
|
|
@@ -123,8 +125,13 @@ var defaultPipe = {
|
|
|
123
125
|
async transform(args, reflect) {
|
|
124
126
|
for (const i in args) {
|
|
125
127
|
const { validate, arg } = args[i];
|
|
126
|
-
if (validate === false
|
|
128
|
+
if (validate === false)
|
|
127
129
|
continue;
|
|
130
|
+
if (!reflect[i]) {
|
|
131
|
+
if (validate && arg)
|
|
132
|
+
args[i].arg = validate(arg);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
128
135
|
if ((0, import_phecda_core.isPhecda)(reflect[i])) {
|
|
129
136
|
const ret = await (0, import_phecda_core.plainToClass)(reflect[i], arg, {
|
|
130
137
|
transform: true
|
|
@@ -253,8 +260,12 @@ __name(FrameworkException, "FrameworkException");
|
|
|
253
260
|
|
|
254
261
|
// src/filter.ts
|
|
255
262
|
var serverFilter = /* @__PURE__ */ __name((e) => {
|
|
256
|
-
if (!(e instanceof HttpException))
|
|
263
|
+
if (!(e instanceof HttpException)) {
|
|
264
|
+
console.error(e.stack);
|
|
257
265
|
e = new UndefinedException(e.message || e);
|
|
266
|
+
} else {
|
|
267
|
+
console.error(e.message);
|
|
268
|
+
}
|
|
258
269
|
return e.data;
|
|
259
270
|
}, "serverFilter");
|
|
260
271
|
|
|
@@ -306,7 +317,7 @@ var _Context = class {
|
|
|
306
317
|
for (const interceptor of interceptors) {
|
|
307
318
|
if (this.history.record(interceptor, "interceptor")) {
|
|
308
319
|
if (!(interceptor in _Context.interceptorsRecord))
|
|
309
|
-
throw new FrameworkException(`can't find
|
|
320
|
+
throw new FrameworkException(`can't find interceptor named ${interceptor}`);
|
|
310
321
|
const post = await _Context.interceptorsRecord[interceptor](this.data, isMerge2);
|
|
311
322
|
if (post)
|
|
312
323
|
ret.push(post);
|
|
@@ -342,12 +353,13 @@ function getInstance(tag) {
|
|
|
342
353
|
}
|
|
343
354
|
__name(getInstance, "getInstance");
|
|
344
355
|
function parseMeta(meta) {
|
|
345
|
-
const { data: { params, guards, interceptors, middlewares }, reflect } = meta;
|
|
356
|
+
const { data: { params, guards, interceptors, middlewares }, reflect, handlers } = meta;
|
|
346
357
|
return {
|
|
347
358
|
guards,
|
|
348
359
|
reflect,
|
|
349
360
|
interceptors,
|
|
350
361
|
middlewares,
|
|
362
|
+
handlers,
|
|
351
363
|
params: params.map((param) => {
|
|
352
364
|
const { type, key, validate } = param;
|
|
353
365
|
return {
|
|
@@ -404,9 +416,14 @@ var Base = class {
|
|
|
404
416
|
__name(Base, "Base");
|
|
405
417
|
|
|
406
418
|
// src/utils.ts
|
|
419
|
+
var import_picocolors = __toESM(require("picocolors"));
|
|
407
420
|
var isUndefined = /* @__PURE__ */ __name((obj) => typeof obj === "undefined", "isUndefined");
|
|
408
421
|
var isNil = /* @__PURE__ */ __name((obj) => isUndefined(obj) || obj === null, "isNil");
|
|
409
422
|
var isObject = /* @__PURE__ */ __name((fn) => !isNil(fn) && typeof fn === "object", "isObject");
|
|
423
|
+
function warn(msg) {
|
|
424
|
+
console.warn(`${import_picocolors.default.magenta("[phecda-server]")} ${import_picocolors.default.yellow(msg)}`);
|
|
425
|
+
}
|
|
426
|
+
__name(warn, "warn");
|
|
410
427
|
|
|
411
428
|
// src/helper.ts
|
|
412
429
|
function isMerge(data) {
|
|
@@ -435,13 +452,115 @@ function bindApp(app, { meta, moduleMap }, options = {}) {
|
|
|
435
452
|
};
|
|
436
453
|
const methodMap = {};
|
|
437
454
|
const contextMeta = {};
|
|
455
|
+
app.post(route, (req, _res, next) => {
|
|
456
|
+
req[MERGE_SYMBOL] = true;
|
|
457
|
+
next();
|
|
458
|
+
}, ...ServerContext.useMiddleware(proMiddle), async (req, res) => {
|
|
459
|
+
const { body: { category, data } } = req;
|
|
460
|
+
const contextData = {
|
|
461
|
+
request: req,
|
|
462
|
+
response: res,
|
|
463
|
+
meta: contextMeta,
|
|
464
|
+
isMerge: true
|
|
465
|
+
};
|
|
466
|
+
if (!Array.isArray(data))
|
|
467
|
+
return res.json(await ServerContext.useFilter(new BadRequestException("data format should be an array"), contextData));
|
|
468
|
+
if (category !== "series" && category !== "parallel")
|
|
469
|
+
return res.json(await ServerContext.useFilter(new BadRequestException("category should be 'parallel' or 'series'"), contextData));
|
|
470
|
+
contextData.tags = data.map((item) => item.tag);
|
|
471
|
+
const context = new ServerContext(route, contextData);
|
|
472
|
+
const ret = [];
|
|
473
|
+
try {
|
|
474
|
+
const mergeGuards = /* @__PURE__ */ new Set([
|
|
475
|
+
...globalGuards
|
|
476
|
+
]);
|
|
477
|
+
const mergeInterceptors = /* @__PURE__ */ new Set([
|
|
478
|
+
...globalInterceptors
|
|
479
|
+
]);
|
|
480
|
+
data.forEach(({ tag }) => {
|
|
481
|
+
const { guards, interceptors } = Context.metaDataRecord[tag];
|
|
482
|
+
guards.forEach((guard) => mergeGuards.add(guard));
|
|
483
|
+
interceptors.forEach((intercept) => mergeInterceptors.add(intercept));
|
|
484
|
+
});
|
|
485
|
+
await context.useGuard([
|
|
486
|
+
...mergeGuards
|
|
487
|
+
], true);
|
|
488
|
+
await context.useInterceptor([
|
|
489
|
+
...mergeInterceptors
|
|
490
|
+
], true);
|
|
491
|
+
if (category === "series") {
|
|
492
|
+
for (const item of data) {
|
|
493
|
+
const { tag } = item;
|
|
494
|
+
const [name] = tag.split("-");
|
|
495
|
+
const { reflect, params } = Context.metaDataRecord[tag];
|
|
496
|
+
const instance = moduleMap.get(name);
|
|
497
|
+
try {
|
|
498
|
+
if (!params)
|
|
499
|
+
throw new BadRequestException(`"${tag}" doesn't exist`);
|
|
500
|
+
const args = await context.usePipe(params.map(({ type, key, validate }) => {
|
|
501
|
+
const arg = resolveDep(item[type], key);
|
|
502
|
+
if (typeof arg === "string" && arg.startsWith(SERIES_SYMBOL)) {
|
|
503
|
+
const [, index, argKey] = arg.split("@");
|
|
504
|
+
return {
|
|
505
|
+
arg: resolveDep(ret[Number(index)], argKey || key),
|
|
506
|
+
validate
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
return {
|
|
510
|
+
arg,
|
|
511
|
+
validate
|
|
512
|
+
};
|
|
513
|
+
}), reflect);
|
|
514
|
+
instance.context = contextData;
|
|
515
|
+
ret.push(await methodMap[tag](...args));
|
|
516
|
+
} catch (e) {
|
|
517
|
+
const m = Context.metaRecord[tag];
|
|
518
|
+
m.handlers.forEach((handler) => handler.error?.(e));
|
|
519
|
+
ret.push(await context.useFilter(e));
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return res.json(await context.usePost(ret));
|
|
523
|
+
}
|
|
524
|
+
if (category === "parallel") {
|
|
525
|
+
return Promise.all(data.map((item) => {
|
|
526
|
+
return new Promise(async (resolve) => {
|
|
527
|
+
const { tag } = item;
|
|
528
|
+
const [name] = tag.split("-");
|
|
529
|
+
const { reflect, params, handlers } = Context.metaDataRecord[tag];
|
|
530
|
+
const instance = moduleMap.get(name);
|
|
531
|
+
try {
|
|
532
|
+
if (!params)
|
|
533
|
+
throw new BadRequestException(`"${tag}" doesn't exist`);
|
|
534
|
+
const args = await context.usePipe(params.map(({ type, key, validate }) => {
|
|
535
|
+
const arg = resolveDep(item[type], key);
|
|
536
|
+
return {
|
|
537
|
+
arg,
|
|
538
|
+
validate
|
|
539
|
+
};
|
|
540
|
+
}), reflect);
|
|
541
|
+
instance.context = contextData;
|
|
542
|
+
resolve(await methodMap[tag](...args));
|
|
543
|
+
} catch (e) {
|
|
544
|
+
handlers.forEach((handler) => handler.error?.(e));
|
|
545
|
+
resolve(await context.useFilter(e));
|
|
546
|
+
}
|
|
547
|
+
});
|
|
548
|
+
})).then(async (ret2) => {
|
|
549
|
+
res.json(await context.usePost(ret2));
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
} catch (e) {
|
|
553
|
+
const err = await context.useFilter(e);
|
|
554
|
+
res.status(err.status).json(err);
|
|
555
|
+
}
|
|
556
|
+
});
|
|
438
557
|
for (const i of meta) {
|
|
439
558
|
const { name, method, route: route2, header, tag } = i.data;
|
|
440
559
|
const instance = moduleMap.get(tag);
|
|
441
560
|
const methodTag = `${tag}-${method}`;
|
|
442
561
|
contextMeta[methodTag] = i;
|
|
443
562
|
Context.metaRecord[methodTag] = i;
|
|
444
|
-
let { guards, reflect, interceptors, params, middlewares } = Context.metaDataRecord[methodTag] ? Context.metaDataRecord[methodTag] : Context.metaDataRecord[methodTag] = parseMeta(i);
|
|
563
|
+
let { guards, reflect, interceptors, params, handlers, middlewares } = Context.metaDataRecord[methodTag] ? Context.metaDataRecord[methodTag] : Context.metaDataRecord[methodTag] = parseMeta(i);
|
|
445
564
|
guards = [
|
|
446
565
|
...globalGuards,
|
|
447
566
|
...guards
|
|
@@ -479,97 +598,13 @@ function bindApp(app, { meta, moduleMap }, options = {}) {
|
|
|
479
598
|
else
|
|
480
599
|
res.send(String(ret));
|
|
481
600
|
} catch (e) {
|
|
482
|
-
|
|
601
|
+
handlers.forEach((handler2) => handler2.error?.(e));
|
|
483
602
|
const err = await context.useFilter(e);
|
|
484
603
|
res.status(err.status).json(err);
|
|
485
604
|
}
|
|
486
605
|
});
|
|
487
606
|
}
|
|
488
607
|
}
|
|
489
|
-
app.post(route, (req, _res, next) => {
|
|
490
|
-
req[MERGE_SYMBOL] = true;
|
|
491
|
-
next();
|
|
492
|
-
}, ...ServerContext.useMiddleware(proMiddle), async (req, res) => {
|
|
493
|
-
const { body: { category, data } } = req;
|
|
494
|
-
const contextData = {
|
|
495
|
-
request: req,
|
|
496
|
-
response: res,
|
|
497
|
-
meta: contextMeta,
|
|
498
|
-
isMerge: true
|
|
499
|
-
};
|
|
500
|
-
if (!Array.isArray(data))
|
|
501
|
-
return res.json(await ServerContext.useFilter(new BadRequestException("data format should be an array"), contextData));
|
|
502
|
-
contextData.tags = data.map((item) => item.tag);
|
|
503
|
-
const context = new ServerContext(route, contextData);
|
|
504
|
-
const ret = [];
|
|
505
|
-
if (category === "series") {
|
|
506
|
-
for (const item of data) {
|
|
507
|
-
const { tag } = item;
|
|
508
|
-
const [name] = tag.split("-");
|
|
509
|
-
const { guards, reflect, interceptors, params } = Context.metaDataRecord[tag];
|
|
510
|
-
const instance = moduleMap.get(name);
|
|
511
|
-
try {
|
|
512
|
-
if (!params)
|
|
513
|
-
throw new BadRequestException(`"${tag}" doesn't exist`);
|
|
514
|
-
await context.useGuard(guards, true);
|
|
515
|
-
await context.useInterceptor(interceptors, true);
|
|
516
|
-
const args = await context.usePipe(params.map(({ type, key, validate }) => {
|
|
517
|
-
const arg = resolveDep(item[type], key);
|
|
518
|
-
if (typeof arg === "string" && arg.startsWith(SERIES_SYMBOL)) {
|
|
519
|
-
const [, index, argKey] = arg.split("@");
|
|
520
|
-
return {
|
|
521
|
-
arg: resolveDep(ret[Number(index)], argKey || key),
|
|
522
|
-
validate
|
|
523
|
-
};
|
|
524
|
-
}
|
|
525
|
-
return {
|
|
526
|
-
arg,
|
|
527
|
-
validate
|
|
528
|
-
};
|
|
529
|
-
}), reflect);
|
|
530
|
-
instance.context = contextData;
|
|
531
|
-
ret.push(await context.usePost(await methodMap[tag](...args)));
|
|
532
|
-
} catch (e) {
|
|
533
|
-
const m = Context.metaRecord[tag];
|
|
534
|
-
m.handlers.forEach((handler) => handler.error?.(e));
|
|
535
|
-
ret.push(await context.useFilter(e));
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
return res.json(ret);
|
|
539
|
-
}
|
|
540
|
-
if (category === "parallel") {
|
|
541
|
-
return Promise.all(data.map((item) => {
|
|
542
|
-
return new Promise(async (resolve) => {
|
|
543
|
-
const { tag } = item;
|
|
544
|
-
const [name] = tag.split("-");
|
|
545
|
-
const { guards, reflect, interceptors, params } = Context.metaDataRecord[tag];
|
|
546
|
-
const instance = moduleMap.get(name);
|
|
547
|
-
try {
|
|
548
|
-
if (!params)
|
|
549
|
-
throw new BadRequestException(`"${tag}" doesn't exist`);
|
|
550
|
-
await context.useGuard(guards, true);
|
|
551
|
-
await context.useInterceptor(interceptors, true);
|
|
552
|
-
const args = await context.usePipe(params.map(({ type, key, validate }) => {
|
|
553
|
-
const arg = resolveDep(item[type], key);
|
|
554
|
-
return {
|
|
555
|
-
arg,
|
|
556
|
-
validate
|
|
557
|
-
};
|
|
558
|
-
}), reflect);
|
|
559
|
-
instance.context = contextData;
|
|
560
|
-
resolve(await context.usePost(await methodMap[tag](...args)));
|
|
561
|
-
} catch (e) {
|
|
562
|
-
const m = Context.metaRecord[tag];
|
|
563
|
-
m.handlers.forEach((handler) => handler.error?.(e));
|
|
564
|
-
resolve(await context.useFilter(e));
|
|
565
|
-
}
|
|
566
|
-
});
|
|
567
|
-
})).then((ret2) => {
|
|
568
|
-
res.json(ret2);
|
|
569
|
-
});
|
|
570
|
-
}
|
|
571
|
-
res.json(await context.useFilter(new BadRequestException("category should be 'parallel' or 'series'")));
|
|
572
|
-
});
|
|
573
608
|
}
|
|
574
609
|
__name(bindApp, "bindApp");
|
|
575
610
|
|
|
@@ -613,6 +648,7 @@ async function Factory(Modules) {
|
|
|
613
648
|
};
|
|
614
649
|
}
|
|
615
650
|
__name(Factory, "Factory");
|
|
651
|
+
var constructorMap = /* @__PURE__ */ new Map();
|
|
616
652
|
async function buildNestModule(Module, map, meta) {
|
|
617
653
|
const paramtypes = getParamtypes(Module);
|
|
618
654
|
let instance;
|
|
@@ -621,6 +657,8 @@ async function buildNestModule(Module, map, meta) {
|
|
|
621
657
|
instance = map.get(tag);
|
|
622
658
|
if (!instance)
|
|
623
659
|
throw new Error(`exist Circular-Dependency or Multiple modules with the same name/tag [tag] ${tag}--[module] ${Module}`);
|
|
660
|
+
if (constructorMap.get(tag) !== Module)
|
|
661
|
+
warn(`Synonym module: Module taged "${tag}" has been loaded before, so phecda-server won't load Module "${Module.name}"`);
|
|
624
662
|
return instance;
|
|
625
663
|
}
|
|
626
664
|
map.set(tag, void 0);
|
|
@@ -635,6 +673,7 @@ async function buildNestModule(Module, map, meta) {
|
|
|
635
673
|
meta.push(...getMetaFromInstance(instance, Module.name, tag));
|
|
636
674
|
await (0, import_phecda_core2.registerAsync)(instance);
|
|
637
675
|
map.set(tag, instance);
|
|
676
|
+
constructorMap.set(tag, Module);
|
|
638
677
|
return instance;
|
|
639
678
|
}
|
|
640
679
|
__name(buildNestModule, "buildNestModule");
|
|
@@ -773,6 +812,10 @@ function Put(route) {
|
|
|
773
812
|
return Route(route, "put");
|
|
774
813
|
}
|
|
775
814
|
__name(Put, "Put");
|
|
815
|
+
function Patch(route) {
|
|
816
|
+
return Route(route, "patch");
|
|
817
|
+
}
|
|
818
|
+
__name(Patch, "Patch");
|
|
776
819
|
function Delete(route) {
|
|
777
820
|
return Route(route, "delete");
|
|
778
821
|
}
|
|
@@ -880,6 +923,7 @@ __reExport(src_exports, require("phecda-core"), module.exports);
|
|
|
880
923
|
Middle,
|
|
881
924
|
NotFoundException,
|
|
882
925
|
Param,
|
|
926
|
+
Patch,
|
|
883
927
|
PayloadLargeException,
|
|
884
928
|
Post,
|
|
885
929
|
Put,
|
|
@@ -897,6 +941,7 @@ __reExport(src_exports, require("phecda-core"), module.exports);
|
|
|
897
941
|
addInterceptor,
|
|
898
942
|
addMiddleware,
|
|
899
943
|
bindApp,
|
|
944
|
+
constructorMap,
|
|
900
945
|
defaultPipe,
|
|
901
946
|
emitter,
|
|
902
947
|
getInstance,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/pipe.ts","../src/exception/base.ts","../src/exception/validate.ts","../src/exception/undefine.ts","../src/exception/forbidden.ts","../src/exception/bad-request.ts","../src/exception/not-found.ts","../src/exception/conflict.ts","../src/exception/bad-gateway.ts","../src/exception/invalid-input.ts","../src/exception/media-type.ts","../src/exception/payload-large.ts","../src/exception/timeout.ts","../src/exception/unauthorized.ts","../src/exception/unavailable-service.ts","../src/exception/framework.ts","../src/filter.ts","../src/history.ts","../src/context/base.ts","../src/context/server.ts","../src/types.ts","../src/utils.ts","../src/helper.ts","../src/common.ts","../src/server/express.ts","../src/core.ts","../src/meta.ts","../src/decorators/index.ts","../src/decorators/param.ts","../src/decorators/route.ts"],"sourcesContent":["export * from './context'\nexport * from './types'\nexport * from './server/express'\nexport * from './core'\nexport * from './decorators'\nexport * from './exception'\nexport * from './pipe'\nexport * from './meta'\nexport * from 'phecda-core'\nexport * from './helper'\nexport * from './common'\n","import { isPhecda, plainToClass } from 'phecda-core'\nimport { ValidateException } from './exception/validate'\n\nimport type { P } from './types'\n\nexport const defaultPipe = {\n // todo: add more params\n async transform(args: { arg: any; validate: boolean }[], reflect: any[]) {\n for (const i in args) {\n const { validate, arg } = args[i]\n if (validate === false || !reflect[i]/** work for undefined */)\n continue\n\n if (isPhecda(reflect[i])) {\n const ret = await plainToClass(reflect[i], arg, { transform: true })\n if (ret.err.length > 0)\n throw new ValidateException(ret.err[0])\n args[i].arg = ret.data\n }\n else {\n if ([Number, Boolean].includes(reflect[i])) {\n args[i].arg = reflect[i](arg)\n\n if (reflect[i] === Number && Object.is(args[i].arg, NaN))\n throw new ValidateException(`parameter ${Number(i) + 1} should be a number`)\n }\n }\n }\n return args.map(item => item.arg)\n },\n} as P.Pipe\n","export class HttpException extends Error {\n constructor(public message: string, public status: number, public description = 'Http exception') {\n super(message)\n }\n\n get data() {\n return { message: this.message, description: this.description, status: this.status, error: true }\n }\n}\n","import { HttpException } from './base'\n\nexport class ValidateException extends HttpException {\n constructor(message: string) {\n super(message, 400, 'Validate exception')\n }\n}\n","import { HttpException } from './base'\n\nexport class UndefinedException extends HttpException {\n constructor(message: string) {\n super(message, 500, 'Undefined error')\n }\n}\n","import { HttpException } from './base'\n\nexport class ForbiddenException extends HttpException {\n constructor(message: string) {\n super(message, 403, 'Forbidden resource')\n }\n}\n","import { HttpException } from './base'\n\nexport class BadRequestException extends HttpException {\n constructor(message: string) {\n super(message, 400, 'Bad Request')\n }\n}\n","import { HttpException } from './base'\n\nexport class NotFoundException extends HttpException {\n constructor(message: string) {\n super(message, 404, 'Not Found')\n }\n}\n","import { HttpException } from './base'\n\nexport class ConflictException extends HttpException {\n constructor(message: string) {\n super(message, 409, 'Conflict')\n }\n}\n","import { HttpException } from './base'\n\nexport class BadGatewayException extends HttpException {\n constructor(message: string) {\n super(message, 502, 'Bad Gatrway')\n }\n}\n","import { HttpException } from './base'\n\nexport class InvalidInputException extends HttpException {\n constructor(message: string) {\n super(message, 502, 'Invalid Input')\n }\n}\n","import { HttpException } from './base'\n\nexport class UnsupportedMediaTypeException extends HttpException {\n constructor(message: string) {\n super(message, 415, 'Unsupported Media Type')\n }\n}\n","import { HttpException } from './base'\n\nexport class PayloadLargeException extends HttpException {\n constructor(message: string) {\n super(message, 413, 'Payload Too Large')\n }\n}\n","import { HttpException } from './base'\n\nexport class TimeoutException extends HttpException {\n constructor(message: string) {\n super(message, 408, 'Request Timeout',\n )\n }\n}\n","import { HttpException } from './base'\n\nexport class UnauthorizedException extends HttpException {\n constructor(message: string) {\n super(message, 401, 'Unauthorized')\n }\n}\n","import { HttpException } from './base'\n\nexport class ServiceUnavailableException extends HttpException {\n constructor(message: string) {\n super(message, 503, 'Service Unavailable')\n }\n}\n","import { HttpException } from './base'\n\nexport class FrameworkException extends HttpException {\n constructor(message: string) {\n super(`[phecda-server] ${message}`, 500, 'Framework Error')\n }\n}\n","import { HttpException, UndefinedException } from './exception'\nimport type { ServerFilter } from './types'\n\nexport const serverFilter: ServerFilter = (e: any) => {\n if (!(e instanceof HttpException))\n e = new UndefinedException(e.message || e)\n return e.data\n}\n","export class Phistroy {\n guard: string[] = []\n interceptor: string[] = []\n record(name: string, type: 'guard' | 'interceptor') {\n if (!this[type].includes(name)) {\n this[type].push(name)\n return true\n }\n return false\n }\n}\n","import { ForbiddenException, FrameworkException } from '../exception'\nimport { Phistroy } from '../history'\n\nimport type { Meta } from '../meta'\nimport type { P } from '../types'\n\nexport abstract class Context<Data = any> {\n method: string\n params: string[]\n\n static metaRecord: Record<string, Meta> = {}\n static metaDataRecord: Record<string, ReturnType<typeof parseMeta>> = {}\n static instanceRecord: Record<string, any> = {}\n static guardsRecord: Record<string, any> = {}\n static interceptorsRecord: Record<string, any > = {}\n // static serverRecord: Record<string, Context> = {}\n post: ((...params: any) => any)[]\n history = new Phistroy()\n\n constructor(public key: string, public data: Data) {\n }\n\n static registerGuard(key: string, handler: any) {\n Context.guardsRecord[key] = handler\n }\n\n static registerInterceptor(key: string, handler: any) {\n Context.interceptorsRecord[key] = handler\n }\n\n async useGuard(guards: string[], isMerge = false) {\n for (const guard of guards) {\n if (this.history.record(guard, 'guard')) {\n if (!(guard in Context.guardsRecord))\n throw new FrameworkException(`can't find guard named ${guard}`)\n if (!await Context.guardsRecord[guard](this.data, isMerge))\n throw new ForbiddenException(`Guard exception--${guard}`)\n }\n }\n }\n\n async useInterceptor(interceptors: string[], isMerge = false) {\n const ret = []\n for (const interceptor of interceptors) {\n if (this.history.record(interceptor, 'interceptor')) {\n if (!(interceptor in Context.interceptorsRecord))\n throw new FrameworkException(`can't find guard named ${interceptor}`)\n const post = await Context.interceptorsRecord[interceptor](this.data, isMerge)\n if (post)\n ret.push(post)\n }\n }\n this.post = ret\n }\n\n async usePost(data: any) {\n if (!this.post)\n return data\n for (const cb of this.post)\n data = (await cb(data)) | data\n\n return data\n }\n}\n\nexport function addGuard(key: string, handler: P.Guard) {\n Context.registerGuard(key, handler)\n}\n\nexport function addInterceptor(key: string, handler: P.Interceptor) {\n Context.registerInterceptor(key, handler)\n}\nexport function getInstance(tag: string) {\n return Context.instanceRecord[tag]\n}\n\nexport function parseMeta(meta: Meta) {\n const { data: { params, guards, interceptors, middlewares }, reflect } = meta\n return {\n guards,\n reflect,\n interceptors,\n middlewares,\n params: params.map((param) => {\n const { type, key, validate } = param\n return { type, key, validate }\n }),\n }\n}\n","import type { RequestHandler } from 'express'\nimport { defaultPipe } from '../pipe'\nimport { serverFilter } from '../filter'\nimport { FrameworkException } from '../exception'\nimport type { P, ServerCtx, ServerFilter, ServerMergeCtx } from '../types'\nimport { Context } from './base'\n\nexport class ServerContext extends Context<ServerCtx | ServerMergeCtx > {\n static pipe = defaultPipe\n static filter = serverFilter\n static middlewareRecord: Record<string, (...params: any) => any> = {}\n static useMiddleware(middlewares: string[]) {\n return middlewares.map((m) => {\n if (!(m in ServerContext.middlewareRecord))\n throw new FrameworkException(`can't find middleware named ${m}`)\n return ServerContext.middlewareRecord[m]\n })\n }\n\n async usePipe(args: { arg: any; validate?: boolean }[], reflect: any[]) {\n return ServerContext.pipe.transform?.(args, reflect, this.data)\n }\n\n static useFilter(arg: any, data: ServerCtx | ServerMergeCtx) {\n return ServerContext.filter(arg, data)\n }\n\n useFilter(arg: any) {\n return ServerContext.filter(arg, this.data)\n }\n}\n\nexport function addMiddleware(key: string, handler: RequestHandler) {\n ServerContext.middlewareRecord[key] = handler\n}\n\nexport function useServerPipe(pipe: P.Pipe) {\n ServerContext.pipe = pipe\n}\nexport function useServerFilter(filter: ServerFilter) {\n ServerContext.filter = filter\n}\n","import type { Request, Response } from 'express'\nimport type { Events } from 'phecda-core'\nimport type { Meta } from './meta'\nimport type { HttpException } from './exception'\nexport type Construct<T = any> = new (...args: any[]) => T\n\nexport interface Emitter {\n on<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n once<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n off<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n removeAllListeners<N extends keyof Events>(eventName: N): void\n emit<N extends keyof Events>(eventName: N, param: Events[N]): void\n}\n\nexport type RequestType = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head'\n\nexport type MergeType = <R extends Promise<any>[]> (...args: R) => { [K in keyof R]: Awaited<R[K]> }\n\nexport interface ServerMergeCtx {\n request: Request\n response: Response\n meta: Record<string, Meta>\n isMerge: true\n tags?: string[]\n}\n\nexport interface ServerCtx {\n request: Request\n response: Response\n meta: Meta\n}\nexport interface BaseError {\n error: true\n status: number\n}\nexport type ServerFilter<E extends HttpException = any> = (err: E | Error, ctx: ServerMergeCtx | ServerCtx) => any\n\nexport class Base {\n context: ServerMergeCtx | ServerCtx\n}\n\nexport namespace P{\n export interface Error extends BaseError { message: string; description: string}\n\n export type ResOrErr<R > = { [K in keyof R]: Awaited<R[K]> | Error }\n\n export type Res<T> = T\n export type Guard = ((ctx: ServerCtx, isMerge?: false) => Promise<boolean> | boolean) | ((ctx: ServerMergeCtx, isMerge?: true) => Promise<boolean> | boolean)\n export type Interceptor = ((ctx: ServerCtx, isMerge?: false) => any) | ((ctx: ServerMergeCtx, isMerge?: true) => any)\n export interface Handler {\n error?: (arg: any) => void\n }\n export interface Meta {\n route?: {\n type: RequestType\n route: string\n }\n // mq?: {\n // queue: string\n // routeKey: string\n // options: amqplib.Options.Consume\n\n // }\n define?: any\n header: Record<string, string>\n params: { type: string; index: number; key: string; validate?: boolean }[]\n guards: string[]\n interceptors: string[]\n middlewares: string[]\n method: string\n name: string\n tag: string\n }\n export interface Pipe {\n transform(args: { arg: any; validate?: boolean }[], reflect: any[], ctx: ServerCtx | ServerMergeCtx): Promise<any[]>\n }\n\n}\n","export const isUndefined = (obj: any): obj is undefined =>\n typeof obj === 'undefined'\nexport const isNil = (obj: any): obj is null | undefined =>\n isUndefined(obj) || obj === null\n\nexport const isObject = (fn: any): fn is object =>\n !isNil(fn) && typeof fn === 'object'\n","import type { ServerCtx, ServerMergeCtx } from './types'\n\nexport function isMerge(data: ServerCtx | ServerMergeCtx): data is ServerMergeCtx {\n return !!(data as ServerMergeCtx).isMerge\n}\n\nexport function resolveDep(ret: any, key: string) {\n if (key)\n return ret?.[key]\n return ret\n}\n","export const SERIES_SYMBOL = '__symbol_series__'\nexport const MERGE_SYMBOL = '__symbol_req__'\n","import type { Express, Router } from 'express'\nimport { Context, ServerContext, parseMeta } from '../context'\nimport { isObject } from '../utils'\nimport { resolveDep } from '../helper'\nimport { MERGE_SYMBOL, SERIES_SYMBOL } from '../common'\nimport type { Factory } from '../core'\nimport { BadRequestException } from '../exception'\nimport type { Meta } from '../meta'\nimport type { ServerMergeCtx } from '../types'\n\nexport interface Options {\n/**\n * 专用路由的值,默认为/__PHECDA_SERVER__,处理phecda-client发出的合并请求\n */\n route?: string\n /**\n * 全局守卫\n */\n globalGuards?: string[]\n /**\n * 全局拦截器\n */\n globalInterceptors?: string[]\n /**\n * 专用路由的中间件,全局中间件请在bindApp以外设置\n */\n middlewares?: string[]\n}\n\nexport function bindApp(app: Express | Router, { meta, moduleMap }: Awaited<ReturnType<typeof Factory>>, options: Options = {}) {\n const { globalGuards, globalInterceptors, route, middlewares: proMiddle } = { route: '/__PHECDA_SERVER__', globalGuards: [], globalInterceptors: [], middlewares: [], ...options } as Required<Options>\n const methodMap = {} as Record<string, (...args: any[]) => any>\n const contextMeta = {} as Record<string, Meta>\n for (const i of meta) {\n const { name, method, route, header, tag } = i.data\n const instance = moduleMap.get(tag)!\n const methodTag = `${tag}-${method}`\n contextMeta[methodTag] = i\n Context.metaRecord[methodTag] = i\n let {\n guards,\n reflect,\n interceptors,\n params,\n middlewares,\n } = Context.metaDataRecord[methodTag] ? Context.metaDataRecord[methodTag] : (Context.metaDataRecord[methodTag] = parseMeta(i))\n\n guards = [...globalGuards!, ...guards]\n interceptors = [...globalInterceptors!, ...interceptors]\n\n const handler = instance[method].bind(instance)\n methodMap[methodTag] = handler\n Context.instanceRecord[name] = instance\n if (route) {\n (app as Express)[route.type](route.route, ...ServerContext.useMiddleware(middlewares), async (req, res) => {\n const contextData = {\n request: req,\n meta: i,\n response: res,\n }\n const context = new ServerContext(methodTag, contextData)\n\n try {\n for (const name in header)\n res.set(name, header[name])\n await context.useGuard(guards)\n await context.useInterceptor(interceptors)\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n return { arg: resolveDep((req as any)[type], key), validate }\n }), reflect)\n instance.context = contextData\n\n const ret = await context.usePost(await handler(...args))\n if (isObject(ret))\n res.json(ret)\n else\n res.send(String(ret))\n }\n catch (e: any) {\n i.handlers.forEach(handler => handler.error?.(e))\n const err = await context.useFilter(e)\n res.status(err.status).json(err)\n }\n })\n }\n }\n\n (app as Express).post(route, (req, _res, next) => {\n (req as any)[MERGE_SYMBOL] = true\n next()\n }, ...ServerContext.useMiddleware(proMiddle), async (req, res) => {\n const { body: { category, data } } = req\n\n const contextData = {\n request: req,\n response: res,\n meta: contextMeta,\n isMerge: true,\n } as unknown as ServerMergeCtx\n\n if (!Array.isArray(data))\n return res.json(await ServerContext.useFilter(new BadRequestException('data format should be an array'), contextData))\n\n contextData.tags = data.map((item: any) => item.tag)\n\n const context = new ServerContext(route, contextData)\n const ret = [] as any[]\n\n if (category === 'series') {\n for (const item of data) {\n const { tag } = item\n const [name] = tag.split('-')\n const {\n guards,\n reflect,\n interceptors,\n params,\n } = Context.metaDataRecord[tag]\n const instance = moduleMap.get(name)\n\n try {\n if (!params)\n throw new BadRequestException(`\"${tag}\" doesn't exist`)\n\n await context.useGuard(guards, true)\n await context.useInterceptor(interceptors, true)\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n const arg = resolveDep(item[type], key)\n if (typeof arg === 'string' && arg.startsWith(SERIES_SYMBOL)) {\n const [, index, argKey] = arg.split('@')\n return { arg: resolveDep(ret[Number(index)], argKey || key), validate }\n }\n\n return { arg, validate }\n }), reflect) as any\n instance.context = contextData\n\n ret.push(await context.usePost(await methodMap[tag](...args)))\n }\n catch (e: any) {\n const m = Context.metaRecord[tag]\n m.handlers.forEach(handler => handler.error?.(e))\n ret.push(await context.useFilter(e))\n }\n }\n return res.json(ret)\n }\n if (category === 'parallel') {\n return Promise.all(data.map((item: any) => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n const { tag } = item\n const [name] = tag.split('-')\n const {\n guards,\n reflect,\n interceptors,\n params,\n } = Context.metaDataRecord[tag]\n const instance = moduleMap.get(name)\n\n try {\n if (!params)\n throw new BadRequestException(`\"${tag}\" doesn't exist`)\n\n await context.useGuard(guards, true)\n await context.useInterceptor(interceptors, true)\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n const arg = resolveDep(item[type], key)\n return { arg, validate }\n }), reflect) as any\n instance.context = contextData\n resolve(await context.usePost(await methodMap[tag](...args)))\n }\n catch (e: any) {\n const m = Context.metaRecord[tag]\n m.handlers.forEach(handler => handler.error?.(e))\n resolve(await context.useFilter(e))\n }\n })\n })).then((ret) => {\n res.json(ret)\n })\n }\n\n res.json(await context.useFilter(new BadRequestException('category should be \\'parallel\\' or \\'series\\'')))\n })\n}\n","import 'reflect-metadata'\nimport fs from 'fs'\nimport EventEmitter from 'node:events'\nimport type { Phecda } from 'phecda-core'\nimport { getExposeKey, getHandler, getState, injectProperty, registerAsync } from 'phecda-core'\nimport type { Construct, Emitter, P } from './types'\nimport { Meta } from './meta'\n// TODO: support both emitter types and origin emitter type in future\nexport const emitter: Emitter = new EventEmitter() as any\n\nexport async function Factory(Modules: (new (...args: any) => any)[]) {\n const moduleMap = new Map<string, InstanceType<Construct>>()\n const meta: Meta[] = []\n injectProperty('watcher', ({ eventName, instance, key, options }: { eventName: string; instance: any; key: string; options?: { once: boolean } }) => {\n const fn = typeof instance[key] === 'function' ? instance[key].bind(instance) : (v: any) => instance[key] = v\n\n if (options?.once)\n (emitter as any).once(eventName, fn)\n\n else\n (emitter as any).on(eventName, fn)\n })\n\n for (const Module of Modules)\n await buildNestModule(Module, moduleMap, meta)\n\n return { moduleMap, meta, output: (p = 'pmeta.js') => fs.writeFileSync(p, JSON.stringify(meta.map(item => item.data))) }\n}\n\nasync function buildNestModule(Module: Construct, map: Map<string, InstanceType<Construct>>, meta: Meta[]) {\n const paramtypes = getParamtypes(Module) as Construct[]\n let instance: InstanceType<Construct>\n const tag = Module.prototype?.__TAG__ || Module.name\n\n if (map.has(tag)) {\n instance = map.get(tag)\n if (!instance)\n throw new Error(`exist Circular-Dependency or Multiple modules with the same name/tag [tag] ${tag}--[module] ${Module}`)\n\n return instance\n }\n map.set(tag, undefined)\n if (paramtypes) {\n const paramtypesInstances = [] as any[]\n for (const i in paramtypes)\n paramtypesInstances[i] = await buildNestModule(paramtypes[i], map, meta)\n\n instance = new Module(...paramtypesInstances)\n }\n else {\n instance = new Module()\n }\n meta.push(...getMetaFromInstance(instance, Module.name, tag))\n await registerAsync(instance)\n map.set(tag, instance)\n\n return instance\n}\n\nfunction getMetaFromInstance(instance: Phecda, name: string, tag: string) {\n const vars = getExposeKey(instance).filter(item => item !== '__CLASS')\n const baseState = (getState(instance, '__CLASS') || {}) as P.Meta\n initState(baseState)\n\n return vars.map((i) => {\n const meta = {} as P.Meta\n const state = (getState(instance, i) || {}) as P.Meta\n initState(state)\n if (state.route) {\n meta.route = {\n route: (baseState.route?.route || '') + (state.route.route),\n type: state.route.type,\n }\n }\n\n meta.name = name\n meta.tag = tag\n meta.method = i as string\n const params = [] as any[]\n for (const i of state.params || []) {\n params.unshift(i)\n if (i.index === 0)\n break\n }\n meta.params = params\n meta.define = { ...baseState.define, ...state.define }\n meta.header = { ...baseState.header, ...state.header }\n meta.middlewares = [...new Set([...baseState.middlewares, ...state.middlewares])]\n meta.guards = [...new Set([...baseState.guards, ...state.guards])]\n meta.interceptors = [...new Set([...baseState.interceptors, ...state.interceptors])]\n\n return new Meta(meta as unknown as P.Meta, getHandler(instance, i), getParamtypes(instance, i as string) || [])\n })\n}\n\nfunction getParamtypes(Module: any, key?: string | symbol) {\n return Reflect.getMetadata('design:paramtypes', Module, key!)\n}\n\nfunction initState(state: any) {\n if (!state.define)\n state.define = {}\n if (!state.header)\n state.header = {}\n if (!state.middlewares)\n state.middlewares = []\n if (!state.guards)\n state.guards = []\n if (!state.interceptors)\n state.interceptors = []\n}\n","import type { P } from './types'\n\nexport class Meta {\n constructor(public data: P.Meta, public handlers: P.Handler[], public reflect: any[]) {\n\n }\n}\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function Header(name: string, value: string) {\n return (target: any, k: PropertyKey) => {\n setModelVar(target, k)\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.header)\n state.header = {}\n\n state.header[name] = value\n setState(target, k, state)\n }\n}\n\nexport function Define(key: string, value: any) {\n return (target: any, k?: PropertyKey) => {\n if (!k) {\n k = '__CLASS'\n target = target.prototype\n }\n\n setModelVar(target, k)\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.define)\n state.define = {}\n\n state.define[key] = value\n setState(target, k, state)\n }\n}\n\nexport * from './param'\nexport * from './route'\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function BaseParam(type: string, key: string, validate?: any): any {\n return (target: any, k: PropertyKey, index: number) => {\n setModelVar(target, k)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.params)\n state.params = []\n\n state.params.push({ type, key, index, validate })\n setState(target, k, state)\n }\n}\n\nexport function Body(key = '', pipeOpts?: any) {\n return BaseParam('body', key, pipeOpts)\n}\nexport function Query(key = '', pipeOpts?: any) {\n return BaseParam('query', key, pipeOpts)\n}\nexport function Param(key: string, pipeOpts?: any) {\n return BaseParam('params', key, pipeOpts)\n}\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function Route(route: string, type?: string): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n state.route = {\n route,\n type,\n }\n setState(target, key, state)\n }\n}\n\nexport function Get(route: string) {\n return Route(route, 'get')\n}\n\nexport function Post(route: string) {\n return Route(route, 'post')\n}\nexport function Put(route: string) {\n return Route(route, 'put')\n}\n\nexport function Delete(route: string) {\n return Route(route, 'delete')\n}\n\nexport function Controller(route: string) {\n return Route(route)\n}\n\nexport function Guard(...guards: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.guards)\n state.guards = []\n state.guards.push(...guards)\n setState(target, key, state)\n }\n}\n\nexport function Middle(...middlewares: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.middlewares)\n state.middlewares = []\n state.middlewares.push(...middlewares)\n setState(target, key, state)\n }\n}\n\nexport function Interceptor(...interceptors: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.interceptors)\n state.interceptors = []\n state.interceptors.push(...interceptors)\n setState(target, key, state)\n }\n}\n"],"mappings":"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","names":["HttpException","Error","message","status","description","constructor","data","error","ValidateException","HttpException","constructor","message","defaultPipe","transform","args","reflect","i","validate","arg","isPhecda","ret","plainToClass","err","length","ValidateException","data","Number","Boolean","includes","Object","is","NaN","map","item","UndefinedException","HttpException","constructor","message","ForbiddenException","HttpException","constructor","message","BadRequestException","HttpException","constructor","message","NotFoundException","HttpException","constructor","message","ConflictException","HttpException","constructor","message","BadGatewayException","HttpException","constructor","message","InvalidInputException","HttpException","constructor","message","UnsupportedMediaTypeException","HttpException","constructor","message","PayloadLargeException","HttpException","constructor","message","TimeoutException","HttpException","constructor","message","UnauthorizedException","HttpException","constructor","message","ServiceUnavailableException","HttpException","constructor","message","FrameworkException","HttpException","constructor","message","serverFilter","e","HttpException","UndefinedException","message","data","Phistroy","guard","interceptor","record","name","type","includes","push","Context","key","data","method","params","post","history","constructor","Phistroy","registerGuard","handler","guardsRecord","registerInterceptor","interceptorsRecord","useGuard","guards","isMerge","guard","record","FrameworkException","ForbiddenException","useInterceptor","interceptors","ret","interceptor","push","usePost","cb","metaRecord","metaDataRecord","instanceRecord","addGuard","addInterceptor","getInstance","tag","parseMeta","meta","middlewares","reflect","map","param","type","validate","ServerContext","Context","useMiddleware","middlewares","map","m","middlewareRecord","FrameworkException","usePipe","args","reflect","pipe","transform","data","useFilter","arg","filter","defaultPipe","serverFilter","addMiddleware","key","handler","useServerPipe","useServerFilter","Base","context","isUndefined","obj","isNil","isObject","fn","isMerge","data","resolveDep","ret","key","SERIES_SYMBOL","MERGE_SYMBOL","bindApp","app","meta","moduleMap","options","globalGuards","globalInterceptors","route","middlewares","proMiddle","methodMap","contextMeta","i","name","method","header","tag","data","instance","get","methodTag","Context","metaRecord","guards","reflect","interceptors","params","metaDataRecord","parseMeta","handler","bind","instanceRecord","type","ServerContext","useMiddleware","req","res","contextData","request","response","context","set","useGuard","useInterceptor","args","usePipe","map","key","validate","arg","resolveDep","ret","usePost","isObject","json","send","String","e","handlers","forEach","error","err","useFilter","status","post","_res","next","MERGE_SYMBOL","body","category","isMerge","Array","isArray","BadRequestException","tags","item","split","startsWith","SERIES_SYMBOL","index","argKey","Number","push","m","Promise","all","resolve","then","import_phecda_core","Meta","data","handlers","reflect","constructor","emitter","EventEmitter","Factory","Modules","moduleMap","Map","meta","injectProperty","eventName","instance","key","options","fn","bind","v","once","on","Module","buildNestModule","output","p","fs","writeFileSync","JSON","stringify","map","item","data","paramtypes","getParamtypes","tag","prototype","__TAG__","name","has","get","Error","set","undefined","paramtypesInstances","i","push","getMetaFromInstance","registerAsync","vars","getExposeKey","filter","baseState","getState","initState","state","route","type","method","params","unshift","index","define","header","middlewares","Set","guards","interceptors","Meta","getHandler","Reflect","getMetadata","import_phecda_core","import_phecda_core","BaseParam","type","key","validate","target","k","index","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","params","push","setState","Body","pipeOpts","Query","Param","import_phecda_core","Route","route","type","target","key","prototype","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","setState","Get","Post","Put","Delete","Controller","Guard","guards","push","Middle","middlewares","Interceptor","interceptors","Header","name","value","target","k","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","header","setState","Define","key","prototype","define"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/pipe.ts","../src/exception/base.ts","../src/exception/validate.ts","../src/exception/undefine.ts","../src/exception/forbidden.ts","../src/exception/bad-request.ts","../src/exception/not-found.ts","../src/exception/conflict.ts","../src/exception/bad-gateway.ts","../src/exception/invalid-input.ts","../src/exception/media-type.ts","../src/exception/payload-large.ts","../src/exception/timeout.ts","../src/exception/unauthorized.ts","../src/exception/unavailable-service.ts","../src/exception/framework.ts","../src/filter.ts","../src/history.ts","../src/context/base.ts","../src/context/server.ts","../src/types.ts","../src/utils.ts","../src/helper.ts","../src/common.ts","../src/server/express.ts","../src/core.ts","../src/meta.ts","../src/decorators/index.ts","../src/decorators/param.ts","../src/decorators/route.ts"],"sourcesContent":["export * from './context'\nexport * from './types'\nexport * from './server/express'\nexport * from './core'\nexport * from './decorators'\nexport * from './exception'\nexport * from './pipe'\nexport * from './meta'\nexport * from 'phecda-core'\nexport * from './helper'\nexport * from './common'\n","import { isPhecda, plainToClass } from 'phecda-core'\nimport { ValidateException } from './exception/validate'\n\nimport type { P } from './types'\n\nexport const defaultPipe = {\n // todo: add more params\n async transform(args: { arg: any; validate: any }[], reflect: any[]) {\n for (const i in args) {\n const { validate, arg } = args[i]\n if (validate === false)\n continue\n if (!reflect[i]) {\n if (validate && arg)\n args[i].arg = validate(arg)\n\n continue\n }\n\n if (isPhecda(reflect[i])) {\n const ret = await plainToClass(reflect[i], arg, { transform: true })\n if (ret.err.length > 0)\n throw new ValidateException(ret.err[0])\n args[i].arg = ret.data\n }\n else {\n if ([Number, Boolean].includes(reflect[i])) {\n args[i].arg = reflect[i](arg)\n\n if (reflect[i] === Number && Object.is(args[i].arg, NaN))\n throw new ValidateException(`parameter ${Number(i) + 1} should be a number`)\n }\n }\n }\n return args.map(item => item.arg)\n },\n} as P.Pipe\n","export class HttpException extends Error {\n constructor(public message: string, public status: number, public description = 'Http exception') {\n super(message)\n }\n\n get data() {\n return { message: this.message, description: this.description, status: this.status, error: true }\n }\n}\n","import { HttpException } from './base'\n\nexport class ValidateException extends HttpException {\n constructor(message: string) {\n super(message, 400, 'Validate exception')\n }\n}\n","import { HttpException } from './base'\n\nexport class UndefinedException extends HttpException {\n constructor(message: string) {\n super(message, 500, 'Undefined error')\n }\n}\n","import { HttpException } from './base'\n\nexport class ForbiddenException extends HttpException {\n constructor(message: string) {\n super(message, 403, 'Forbidden resource')\n }\n}\n","import { HttpException } from './base'\n\nexport class BadRequestException extends HttpException {\n constructor(message: string) {\n super(message, 400, 'Bad Request')\n }\n}\n","import { HttpException } from './base'\n\nexport class NotFoundException extends HttpException {\n constructor(message: string) {\n super(message, 404, 'Not Found')\n }\n}\n","import { HttpException } from './base'\n\nexport class ConflictException extends HttpException {\n constructor(message: string) {\n super(message, 409, 'Conflict')\n }\n}\n","import { HttpException } from './base'\n\nexport class BadGatewayException extends HttpException {\n constructor(message: string) {\n super(message, 502, 'Bad Gatrway')\n }\n}\n","import { HttpException } from './base'\n\nexport class InvalidInputException extends HttpException {\n constructor(message: string) {\n super(message, 502, 'Invalid Input')\n }\n}\n","import { HttpException } from './base'\n\nexport class UnsupportedMediaTypeException extends HttpException {\n constructor(message: string) {\n super(message, 415, 'Unsupported Media Type')\n }\n}\n","import { HttpException } from './base'\n\nexport class PayloadLargeException extends HttpException {\n constructor(message: string) {\n super(message, 413, 'Payload Too Large')\n }\n}\n","import { HttpException } from './base'\n\nexport class TimeoutException extends HttpException {\n constructor(message: string) {\n super(message, 408, 'Request Timeout',\n )\n }\n}\n","import { HttpException } from './base'\n\nexport class UnauthorizedException extends HttpException {\n constructor(message: string) {\n super(message, 401, 'Unauthorized')\n }\n}\n","import { HttpException } from './base'\n\nexport class ServiceUnavailableException extends HttpException {\n constructor(message: string) {\n super(message, 503, 'Service Unavailable')\n }\n}\n","import { HttpException } from './base'\n\nexport class FrameworkException extends HttpException {\n constructor(message: string) {\n super(`[phecda-server] ${message}`, 500, 'Framework Error')\n }\n}\n","import { HttpException, UndefinedException } from './exception'\nimport type { ServerFilter } from './types'\n\nexport const serverFilter: ServerFilter = (e: any) => {\n if (!(e instanceof HttpException)) {\n console.error(e.stack)\n e = new UndefinedException(e.message || e)\n }\n else {\n console.error(e.message)\n }\n\n return e.data\n}\n","export class Phistroy {\n guard: string[] = []\n interceptor: string[] = []\n record(name: string, type: 'guard' | 'interceptor') {\n if (!this[type].includes(name)) {\n this[type].push(name)\n return true\n }\n return false\n }\n}\n","import { ForbiddenException, FrameworkException } from '../exception'\nimport { Phistroy } from '../history'\n\nimport type { Meta } from '../meta'\nimport type { P } from '../types'\n\nexport abstract class Context<Data = any> {\n method: string\n params: string[]\n\n static metaRecord: Record<string, Meta> = {}\n static metaDataRecord: Record<string, ReturnType<typeof parseMeta>> = {}\n static instanceRecord: Record<string, any> = {}\n static guardsRecord: Record<string, any> = {}\n static interceptorsRecord: Record<string, any > = {}\n // static serverRecord: Record<string, Context> = {}\n post: ((...params: any) => any)[]\n history = new Phistroy()\n\n constructor(public key: string, public data: Data) {\n }\n\n static registerGuard(key: string, handler: any) {\n Context.guardsRecord[key] = handler\n }\n\n static registerInterceptor(key: string, handler: any) {\n Context.interceptorsRecord[key] = handler\n }\n\n async useGuard(guards: string[], isMerge = false) {\n for (const guard of guards) {\n if (this.history.record(guard, 'guard')) {\n if (!(guard in Context.guardsRecord))\n throw new FrameworkException(`can't find guard named ${guard}`)\n if (!await Context.guardsRecord[guard](this.data, isMerge))\n throw new ForbiddenException(`Guard exception--${guard}`)\n }\n }\n }\n\n async useInterceptor(interceptors: string[], isMerge = false) {\n const ret = []\n for (const interceptor of interceptors) {\n if (this.history.record(interceptor, 'interceptor')) {\n if (!(interceptor in Context.interceptorsRecord))\n throw new FrameworkException(`can't find interceptor named ${interceptor}`)\n const post = await Context.interceptorsRecord[interceptor](this.data, isMerge)\n if (post)\n ret.push(post)\n }\n }\n this.post = ret\n }\n\n async usePost(data: any) {\n if (!this.post)\n return data\n for (const cb of this.post)\n data = (await cb(data)) | data\n\n return data\n }\n}\n\nexport function addGuard(key: string, handler: P.Guard) {\n Context.registerGuard(key, handler)\n}\n\nexport function addInterceptor(key: string, handler: P.Interceptor) {\n Context.registerInterceptor(key, handler)\n}\nexport function getInstance(tag: string) {\n return Context.instanceRecord[tag]\n}\n\nexport function parseMeta(meta: Meta) {\n const { data: { params, guards, interceptors, middlewares }, reflect, handlers } = meta\n return {\n guards,\n reflect,\n interceptors,\n middlewares,\n handlers,\n params: params.map((param) => {\n const { type, key, validate } = param\n return { type, key, validate }\n }),\n }\n}\n","import type { RequestHandler } from 'express'\nimport { defaultPipe } from '../pipe'\nimport { serverFilter } from '../filter'\nimport { FrameworkException } from '../exception'\nimport type { P, ServerCtx, ServerFilter, ServerMergeCtx } from '../types'\nimport { Context } from './base'\n\nexport class ServerContext extends Context<ServerCtx | ServerMergeCtx > {\n static pipe = defaultPipe\n static filter = serverFilter\n static middlewareRecord: Record<string, (...params: any) => any> = {}\n static useMiddleware(middlewares: string[]) {\n return middlewares.map((m) => {\n if (!(m in ServerContext.middlewareRecord))\n throw new FrameworkException(`can't find middleware named ${m}`)\n return ServerContext.middlewareRecord[m]\n })\n }\n\n async usePipe(args: { arg: any; validate?: boolean }[], reflect: any[]) {\n return ServerContext.pipe.transform?.(args, reflect, this.data)\n }\n\n static useFilter(arg: any, data: ServerCtx | ServerMergeCtx) {\n return ServerContext.filter(arg, data)\n }\n\n useFilter(arg: any) {\n return ServerContext.filter(arg, this.data)\n }\n}\n\nexport function addMiddleware(key: string, handler: RequestHandler) {\n ServerContext.middlewareRecord[key] = handler\n}\n\nexport function useServerPipe(pipe: P.Pipe) {\n ServerContext.pipe = pipe\n}\nexport function useServerFilter(filter: ServerFilter) {\n ServerContext.filter = filter\n}\n","import type { Request, Response } from 'express'\nimport type { Events } from 'phecda-core'\nimport type { Meta } from './meta'\nimport type { HttpException } from './exception'\nexport type Construct<T = any> = new (...args: any[]) => T\n\nexport interface Emitter {\n on<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n once<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n off<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n removeAllListeners<N extends keyof Events>(eventName: N): void\n emit<N extends keyof Events>(eventName: N, param: Events[N]): void\n}\n\nexport type RequestType = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head'\n\nexport type MergeType = <R extends Promise<any>[]> (...args: R) => { [K in keyof R]: Awaited<R[K]> }\n\nexport interface ServerMergeCtx {\n request: Request\n response: Response\n meta: Record<string, Meta>\n isMerge: true\n tags?: string[]\n}\n\nexport interface ServerCtx {\n request: Request\n response: Response\n meta: Meta\n}\nexport interface BaseError {\n error: true\n status: number\n}\nexport type ServerFilter<E extends HttpException = any> = (err: E | Error, ctx: ServerMergeCtx | ServerCtx) => any\n\nexport class Base {\n context: ServerMergeCtx | ServerCtx\n}\n\nexport namespace P{\n export interface Error extends BaseError { message: string; description: string}\n\n export type ResOrErr<R > = { [K in keyof R]: Awaited<R[K]> | Error }\n\n export type Res<T> = T\n export type Guard = ((ctx: ServerCtx, isMerge?: false) => Promise<boolean> | boolean) | ((ctx: ServerMergeCtx, isMerge?: true) => Promise<boolean> | boolean)\n export type Interceptor = ((ctx: ServerCtx, isMerge?: false) => any) | ((ctx: ServerMergeCtx, isMerge?: true) => any)\n export interface Handler {\n error?: (arg: any) => void\n }\n export interface Meta {\n route?: {\n type: RequestType\n route: string\n }\n // mq?: {\n // queue: string\n // routeKey: string\n // options: amqplib.Options.Consume\n\n // }\n define?: any\n header: Record<string, string>\n params: { type: string; index: number; key: string; validate?: boolean }[]\n guards: string[]\n interceptors: string[]\n middlewares: string[]\n method: string\n name: string\n tag: string\n }\n export interface Pipe {\n transform(args: { arg: any; validate?: boolean }[], reflect: any[], ctx: ServerCtx | ServerMergeCtx): Promise<any[]>\n }\n\n}\n","import pc from 'picocolors'\nexport const isUndefined = (obj: any): obj is undefined =>\n typeof obj === 'undefined'\nexport const isNil = (obj: any): obj is null | undefined =>\n isUndefined(obj) || obj === null\n\nexport const isObject = (fn: any): fn is object =>\n !isNil(fn) && typeof fn === 'object'\n\nexport function warn(msg: string) {\n console.warn(`${pc.magenta('[phecda-server]')} ${pc.yellow(msg)}`)\n}\n","import type { ServerCtx, ServerMergeCtx } from './types'\n\nexport function isMerge(data: ServerCtx | ServerMergeCtx): data is ServerMergeCtx {\n return !!(data as ServerMergeCtx).isMerge\n}\n\nexport function resolveDep(ret: any, key: string) {\n if (key)\n return ret?.[key]\n return ret\n}\n","export const SERIES_SYMBOL = '__symbol_series__'\nexport const MERGE_SYMBOL = '__symbol_req__'\n","import type { Express, Router } from 'express'\nimport { Context, ServerContext, parseMeta } from '../context'\nimport { isObject } from '../utils'\nimport { resolveDep } from '../helper'\nimport { MERGE_SYMBOL, SERIES_SYMBOL } from '../common'\nimport type { Factory } from '../core'\nimport { BadRequestException } from '../exception'\nimport type { Meta } from '../meta'\nimport type { ServerMergeCtx } from '../types'\n\nexport interface Options {\n/**\n * 专用路由的值,默认为/__PHECDA_SERVER__,处理phecda-client发出的合并请求\n */\n route?: string\n /**\n * 全局守卫\n */\n globalGuards?: string[]\n /**\n * 全局拦截器\n */\n globalInterceptors?: string[]\n /**\n * 专用路由的中间件(work for merge request),全局中间件请在bindApp以外设置\n */\n middlewares?: string[]\n}\n\nexport function bindApp(app: Express | Router, { meta, moduleMap }: Awaited<ReturnType<typeof Factory>>, options: Options = {}) {\n const { globalGuards, globalInterceptors, route, middlewares: proMiddle } = { route: '/__PHECDA_SERVER__', globalGuards: [], globalInterceptors: [], middlewares: [], ...options } as Required<Options>\n const methodMap = {} as Record<string, (...args: any[]) => any>\n const contextMeta = {} as Record<string, Meta>\n (app as Express).post(route, (req, _res, next) => {\n (req as any)[MERGE_SYMBOL] = true\n next()\n }, ...ServerContext.useMiddleware(proMiddle), async (req, res) => {\n const { body: { category, data } } = req\n\n const contextData = {\n request: req,\n response: res,\n meta: contextMeta,\n isMerge: true,\n } as unknown as ServerMergeCtx\n\n if (!Array.isArray(data))\n return res.json(await ServerContext.useFilter(new BadRequestException('data format should be an array'), contextData))\n\n if (category !== 'series' && category !== 'parallel')\n return res.json(await ServerContext.useFilter(new BadRequestException('category should be \\'parallel\\' or \\'series\\''), contextData))\n\n contextData.tags = data.map((item: any) => item.tag)\n\n const context = new ServerContext(route, contextData)\n const ret = [] as any[]\n try {\n const mergeGuards = new Set([...globalGuards])\n const mergeInterceptors = new Set([...globalInterceptors])\n\n data.forEach(({ tag }) => {\n const {\n guards,\n interceptors,\n } = Context.metaDataRecord[tag]\n guards.forEach(guard => mergeGuards.add(guard))\n interceptors.forEach(intercept => mergeInterceptors.add(intercept))\n })\n await context.useGuard([...mergeGuards], true)\n await context.useInterceptor([...mergeInterceptors], true)\n\n if (category === 'series') {\n for (const item of data) {\n const { tag } = item\n const [name] = tag.split('-')\n const {\n reflect,\n params,\n } = Context.metaDataRecord[tag]\n const instance = moduleMap.get(name)\n\n try {\n if (!params)\n throw new BadRequestException(`\"${tag}\" doesn't exist`)\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n const arg = resolveDep(item[type], key)\n if (typeof arg === 'string' && arg.startsWith(SERIES_SYMBOL)) {\n const [, index, argKey] = arg.split('@')\n return { arg: resolveDep(ret[Number(index)], argKey || key), validate }\n }\n\n return { arg, validate }\n }), reflect) as any\n instance.context = contextData\n\n ret.push(await methodMap[tag](...args))\n }\n catch (e: any) {\n const m = Context.metaRecord[tag]\n m.handlers.forEach(handler => handler.error?.(e))\n ret.push(await context.useFilter(e))\n }\n }\n return res.json(await context.usePost(ret))\n }\n if (category === 'parallel') {\n return Promise.all(data.map((item: any) => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n const { tag } = item\n const [name] = tag.split('-')\n const {\n reflect,\n params,\n handlers,\n } = Context.metaDataRecord[tag]\n\n const instance = moduleMap.get(name)\n\n try {\n if (!params)\n throw new BadRequestException(`\"${tag}\" doesn't exist`)\n\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n const arg = resolveDep(item[type], key)\n return { arg, validate }\n }), reflect) as any\n instance.context = contextData\n resolve(await methodMap[tag](...args))\n }\n catch (e: any) {\n handlers.forEach(handler => handler.error?.(e))\n resolve(await context.useFilter(e))\n }\n })\n })).then(async (ret) => {\n res.json(await context.usePost(ret))\n })\n }\n }\n catch (e) {\n const err = await context.useFilter(e)\n res.status(err.status).json(err)\n }\n })\n for (const i of meta) {\n const { name, method, route, header, tag } = i.data\n const instance = moduleMap.get(tag)!\n const methodTag = `${tag}-${method}`\n contextMeta[methodTag] = i\n Context.metaRecord[methodTag] = i\n let {\n guards,\n reflect,\n interceptors,\n params,\n handlers,\n middlewares,\n } = Context.metaDataRecord[methodTag] ? Context.metaDataRecord[methodTag] : (Context.metaDataRecord[methodTag] = parseMeta(i))\n\n guards = [...globalGuards!, ...guards]\n interceptors = [...globalInterceptors!, ...interceptors]\n\n const handler = instance[method].bind(instance)\n methodMap[methodTag] = handler\n Context.instanceRecord[name] = instance\n if (route) {\n (app as Express)[route.type](route.route, ...ServerContext.useMiddleware(middlewares), async (req, res) => {\n const contextData = {\n request: req,\n meta: i,\n response: res,\n }\n const context = new ServerContext(methodTag, contextData)\n\n try {\n for (const name in header)\n res.set(name, header[name])\n await context.useGuard(guards)\n await context.useInterceptor(interceptors)\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n return { arg: resolveDep((req as any)[type], key), validate }\n }), reflect)\n instance.context = contextData\n\n const ret = await context.usePost(await handler(...args))\n if (isObject(ret))\n res.json(ret)\n else\n res.send(String(ret))\n }\n catch (e: any) {\n handlers.forEach(handler => handler.error?.(e))\n const err = await context.useFilter(e)\n res.status(err.status).json(err)\n }\n })\n }\n }\n}\n","import 'reflect-metadata'\nimport fs from 'fs'\nimport EventEmitter from 'node:events'\nimport type { Phecda } from 'phecda-core'\nimport { getExposeKey, getHandler, getState, injectProperty, registerAsync } from 'phecda-core'\nimport type { Construct, Emitter, P } from './types'\nimport { Meta } from './meta'\nimport { warn } from './utils'\n// TODO: support both emitter types and origin emitter type in future\nexport const emitter: Emitter = new EventEmitter() as any\n\nexport async function Factory(Modules: (new (...args: any) => any)[]) {\n const moduleMap = new Map<string, InstanceType<Construct>>()\n const meta: Meta[] = []\n injectProperty('watcher', ({ eventName, instance, key, options }: { eventName: string; instance: any; key: string; options?: { once: boolean } }) => {\n const fn = typeof instance[key] === 'function' ? instance[key].bind(instance) : (v: any) => instance[key] = v\n\n if (options?.once)\n (emitter as any).once(eventName, fn)\n\n else\n (emitter as any).on(eventName, fn)\n })\n\n for (const Module of Modules)\n await buildNestModule(Module, moduleMap, meta)\n\n return { moduleMap, meta, output: (p = 'pmeta.js') => fs.writeFileSync(p, JSON.stringify(meta.map(item => item.data))) }\n}\n\nexport const constructorMap = new Map() // just for warn\n\nasync function buildNestModule(Module: Construct, map: Map<string, InstanceType<Construct>>, meta: Meta[]) {\n const paramtypes = getParamtypes(Module) as Construct[]\n let instance: InstanceType<Construct>\n const tag = Module.prototype?.__TAG__ || Module.name\n\n if (map.has(tag)) {\n instance = map.get(tag)\n if (!instance)\n throw new Error(`exist Circular-Dependency or Multiple modules with the same name/tag [tag] ${tag}--[module] ${Module}`)\n\n if (constructorMap.get(tag) !== Module)\n warn(`Synonym module: Module taged \"${tag}\" has been loaded before, so phecda-server won't load Module \"${Module.name}\"`)\n\n return instance\n }\n map.set(tag, undefined)\n if (paramtypes) {\n const paramtypesInstances = [] as any[]\n for (const i in paramtypes)\n paramtypesInstances[i] = await buildNestModule(paramtypes[i], map, meta)\n\n instance = new Module(...paramtypesInstances)\n }\n else {\n instance = new Module()\n }\n meta.push(...getMetaFromInstance(instance, Module.name, tag))\n await registerAsync(instance)\n map.set(tag, instance)\n constructorMap.set(tag, Module)\n return instance\n}\n\nfunction getMetaFromInstance(instance: Phecda, name: string, tag: string) {\n const vars = getExposeKey(instance).filter(item => item !== '__CLASS')\n const baseState = (getState(instance, '__CLASS') || {}) as P.Meta\n initState(baseState)\n\n return vars.map((i) => {\n const meta = {} as P.Meta\n const state = (getState(instance, i) || {}) as P.Meta\n initState(state)\n if (state.route) {\n meta.route = {\n route: (baseState.route?.route || '') + (state.route.route),\n type: state.route.type,\n }\n }\n\n meta.name = name\n meta.tag = tag\n meta.method = i as string\n const params = [] as any[]\n for (const i of state.params || []) {\n params.unshift(i)\n if (i.index === 0)\n break\n }\n meta.params = params\n meta.define = { ...baseState.define, ...state.define }\n meta.header = { ...baseState.header, ...state.header }\n meta.middlewares = [...new Set([...baseState.middlewares, ...state.middlewares])]\n meta.guards = [...new Set([...baseState.guards, ...state.guards])]\n meta.interceptors = [...new Set([...baseState.interceptors, ...state.interceptors])]\n\n return new Meta(meta as unknown as P.Meta, getHandler(instance, i), getParamtypes(instance, i as string) || [])\n })\n}\n\nfunction getParamtypes(Module: any, key?: string | symbol) {\n return Reflect.getMetadata('design:paramtypes', Module, key!)\n}\n\nfunction initState(state: any) {\n if (!state.define)\n state.define = {}\n if (!state.header)\n state.header = {}\n if (!state.middlewares)\n state.middlewares = []\n if (!state.guards)\n state.guards = []\n if (!state.interceptors)\n state.interceptors = []\n}\n","import type { P } from './types'\n\nexport class Meta {\n constructor(public data: P.Meta, public handlers: P.Handler[], public reflect: any[]) {\n\n }\n}\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function Header(name: string, value: string) {\n return (target: any, k: PropertyKey) => {\n setModelVar(target, k)\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.header)\n state.header = {}\n\n state.header[name] = value\n setState(target, k, state)\n }\n}\n\nexport function Define(key: string, value: any) {\n return (target: any, k?: PropertyKey) => {\n if (!k) {\n k = '__CLASS'\n target = target.prototype\n }\n\n setModelVar(target, k)\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.define)\n state.define = {}\n\n state.define[key] = value\n setState(target, k, state)\n }\n}\n\nexport * from './param'\nexport * from './route'\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function BaseParam(type: string, key: string, validate?: any): any {\n return (target: any, k: PropertyKey, index: number) => {\n setModelVar(target, k)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.params)\n state.params = []\n\n state.params.push({ type, key, index, validate })\n setState(target, k, state)\n }\n}\n\nexport function Body(key = '', pipeOpts?: any) {\n return BaseParam('body', key, pipeOpts)\n}\nexport function Query(key = '', pipeOpts?: any) {\n return BaseParam('query', key, pipeOpts)\n}\nexport function Param(key: string, pipeOpts?: any) {\n return BaseParam('params', key, pipeOpts)\n}\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function Route(route: string, type?: string): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n state.route = {\n route,\n type,\n }\n setState(target, key, state)\n }\n}\n\nexport function Get(route: string) {\n return Route(route, 'get')\n}\n\nexport function Post(route: string) {\n return Route(route, 'post')\n}\nexport function Put(route: string) {\n return Route(route, 'put')\n}\n\nexport function Patch(route: string) {\n return Route(route, 'patch')\n}\nexport function Delete(route: string) {\n return Route(route, 'delete')\n}\n\nexport function Controller(route: string) {\n return Route(route)\n}\n\nexport function Guard(...guards: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.guards)\n state.guards = []\n state.guards.push(...guards)\n setState(target, key, state)\n }\n}\n\nexport function Middle(...middlewares: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.middlewares)\n state.middlewares = []\n state.middlewares.push(...middlewares)\n setState(target, key, state)\n }\n}\n\nexport function Interceptor(...interceptors: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.interceptors)\n state.interceptors = []\n state.interceptors.push(...interceptors)\n setState(target, key, state)\n }\n}\n"],"mappings":"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","names":["HttpException","Error","message","status","description","constructor","data","error","ValidateException","HttpException","constructor","message","defaultPipe","transform","args","reflect","i","validate","arg","isPhecda","ret","plainToClass","err","length","ValidateException","data","Number","Boolean","includes","Object","is","NaN","map","item","UndefinedException","HttpException","constructor","message","ForbiddenException","HttpException","constructor","message","BadRequestException","HttpException","constructor","message","NotFoundException","HttpException","constructor","message","ConflictException","HttpException","constructor","message","BadGatewayException","HttpException","constructor","message","InvalidInputException","HttpException","constructor","message","UnsupportedMediaTypeException","HttpException","constructor","message","PayloadLargeException","HttpException","constructor","message","TimeoutException","HttpException","constructor","message","UnauthorizedException","HttpException","constructor","message","ServiceUnavailableException","HttpException","constructor","message","FrameworkException","HttpException","constructor","message","serverFilter","e","HttpException","console","error","stack","UndefinedException","message","data","Phistroy","guard","interceptor","record","name","type","includes","push","Context","key","data","method","params","post","history","constructor","Phistroy","registerGuard","handler","guardsRecord","registerInterceptor","interceptorsRecord","useGuard","guards","isMerge","guard","record","FrameworkException","ForbiddenException","useInterceptor","interceptors","ret","interceptor","push","usePost","cb","metaRecord","metaDataRecord","instanceRecord","addGuard","addInterceptor","getInstance","tag","parseMeta","meta","middlewares","reflect","handlers","map","param","type","validate","ServerContext","Context","useMiddleware","middlewares","map","m","middlewareRecord","FrameworkException","usePipe","args","reflect","pipe","transform","data","useFilter","arg","filter","defaultPipe","serverFilter","addMiddleware","key","handler","useServerPipe","useServerFilter","Base","context","isUndefined","obj","isNil","isObject","fn","warn","msg","console","pc","magenta","yellow","isMerge","data","resolveDep","ret","key","SERIES_SYMBOL","MERGE_SYMBOL","bindApp","app","meta","moduleMap","options","globalGuards","globalInterceptors","route","middlewares","proMiddle","methodMap","contextMeta","post","req","_res","next","MERGE_SYMBOL","ServerContext","useMiddleware","res","body","category","data","contextData","request","response","isMerge","Array","isArray","json","useFilter","BadRequestException","tags","map","item","tag","context","ret","mergeGuards","Set","mergeInterceptors","forEach","guards","interceptors","Context","metaDataRecord","guard","add","intercept","useGuard","useInterceptor","name","split","reflect","params","instance","get","args","usePipe","type","key","validate","arg","resolveDep","startsWith","SERIES_SYMBOL","index","argKey","Number","push","e","m","metaRecord","handlers","handler","error","usePost","Promise","all","resolve","then","err","status","i","method","header","methodTag","parseMeta","bind","instanceRecord","set","isObject","send","String","import_phecda_core","Meta","data","handlers","reflect","constructor","emitter","EventEmitter","Factory","Modules","moduleMap","Map","meta","injectProperty","eventName","instance","key","options","fn","bind","v","once","on","Module","buildNestModule","output","p","fs","writeFileSync","JSON","stringify","map","item","data","constructorMap","paramtypes","getParamtypes","tag","prototype","__TAG__","name","has","get","Error","warn","set","undefined","paramtypesInstances","i","push","getMetaFromInstance","registerAsync","vars","getExposeKey","filter","baseState","getState","initState","state","route","type","method","params","unshift","index","define","header","middlewares","Set","guards","interceptors","Meta","getHandler","Reflect","getMetadata","import_phecda_core","import_phecda_core","BaseParam","type","key","validate","target","k","index","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","params","push","setState","Body","pipeOpts","Query","Param","import_phecda_core","Route","route","type","target","key","prototype","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","setState","Get","Post","Put","Patch","Delete","Controller","Guard","guards","push","Middle","middlewares","Interceptor","interceptors","Header","name","value","target","k","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","header","setState","Define","key","prototype","define"]}
|
package/dist/index.mjs
CHANGED
|
@@ -44,8 +44,13 @@ var defaultPipe = {
|
|
|
44
44
|
async transform(args, reflect) {
|
|
45
45
|
for (const i in args) {
|
|
46
46
|
const { validate, arg } = args[i];
|
|
47
|
-
if (validate === false
|
|
47
|
+
if (validate === false)
|
|
48
48
|
continue;
|
|
49
|
+
if (!reflect[i]) {
|
|
50
|
+
if (validate && arg)
|
|
51
|
+
args[i].arg = validate(arg);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
49
54
|
if (isPhecda(reflect[i])) {
|
|
50
55
|
const ret = await plainToClass(reflect[i], arg, {
|
|
51
56
|
transform: true
|
|
@@ -174,8 +179,12 @@ __name(FrameworkException, "FrameworkException");
|
|
|
174
179
|
|
|
175
180
|
// src/filter.ts
|
|
176
181
|
var serverFilter = /* @__PURE__ */ __name((e) => {
|
|
177
|
-
if (!(e instanceof HttpException))
|
|
182
|
+
if (!(e instanceof HttpException)) {
|
|
183
|
+
console.error(e.stack);
|
|
178
184
|
e = new UndefinedException(e.message || e);
|
|
185
|
+
} else {
|
|
186
|
+
console.error(e.message);
|
|
187
|
+
}
|
|
179
188
|
return e.data;
|
|
180
189
|
}, "serverFilter");
|
|
181
190
|
|
|
@@ -227,7 +236,7 @@ var _Context = class {
|
|
|
227
236
|
for (const interceptor of interceptors) {
|
|
228
237
|
if (this.history.record(interceptor, "interceptor")) {
|
|
229
238
|
if (!(interceptor in _Context.interceptorsRecord))
|
|
230
|
-
throw new FrameworkException(`can't find
|
|
239
|
+
throw new FrameworkException(`can't find interceptor named ${interceptor}`);
|
|
231
240
|
const post = await _Context.interceptorsRecord[interceptor](this.data, isMerge2);
|
|
232
241
|
if (post)
|
|
233
242
|
ret.push(post);
|
|
@@ -263,12 +272,13 @@ function getInstance(tag) {
|
|
|
263
272
|
}
|
|
264
273
|
__name(getInstance, "getInstance");
|
|
265
274
|
function parseMeta(meta) {
|
|
266
|
-
const { data: { params, guards, interceptors, middlewares }, reflect } = meta;
|
|
275
|
+
const { data: { params, guards, interceptors, middlewares }, reflect, handlers } = meta;
|
|
267
276
|
return {
|
|
268
277
|
guards,
|
|
269
278
|
reflect,
|
|
270
279
|
interceptors,
|
|
271
280
|
middlewares,
|
|
281
|
+
handlers,
|
|
272
282
|
params: params.map((param) => {
|
|
273
283
|
const { type, key, validate } = param;
|
|
274
284
|
return {
|
|
@@ -325,9 +335,14 @@ var Base = class {
|
|
|
325
335
|
__name(Base, "Base");
|
|
326
336
|
|
|
327
337
|
// src/utils.ts
|
|
338
|
+
import pc from "picocolors";
|
|
328
339
|
var isUndefined = /* @__PURE__ */ __name((obj) => typeof obj === "undefined", "isUndefined");
|
|
329
340
|
var isNil = /* @__PURE__ */ __name((obj) => isUndefined(obj) || obj === null, "isNil");
|
|
330
341
|
var isObject = /* @__PURE__ */ __name((fn) => !isNil(fn) && typeof fn === "object", "isObject");
|
|
342
|
+
function warn(msg) {
|
|
343
|
+
console.warn(`${pc.magenta("[phecda-server]")} ${pc.yellow(msg)}`);
|
|
344
|
+
}
|
|
345
|
+
__name(warn, "warn");
|
|
331
346
|
|
|
332
347
|
// src/helper.ts
|
|
333
348
|
function isMerge(data) {
|
|
@@ -356,13 +371,115 @@ function bindApp(app, { meta, moduleMap }, options = {}) {
|
|
|
356
371
|
};
|
|
357
372
|
const methodMap = {};
|
|
358
373
|
const contextMeta = {};
|
|
374
|
+
app.post(route, (req, _res, next) => {
|
|
375
|
+
req[MERGE_SYMBOL] = true;
|
|
376
|
+
next();
|
|
377
|
+
}, ...ServerContext.useMiddleware(proMiddle), async (req, res) => {
|
|
378
|
+
const { body: { category, data } } = req;
|
|
379
|
+
const contextData = {
|
|
380
|
+
request: req,
|
|
381
|
+
response: res,
|
|
382
|
+
meta: contextMeta,
|
|
383
|
+
isMerge: true
|
|
384
|
+
};
|
|
385
|
+
if (!Array.isArray(data))
|
|
386
|
+
return res.json(await ServerContext.useFilter(new BadRequestException("data format should be an array"), contextData));
|
|
387
|
+
if (category !== "series" && category !== "parallel")
|
|
388
|
+
return res.json(await ServerContext.useFilter(new BadRequestException("category should be 'parallel' or 'series'"), contextData));
|
|
389
|
+
contextData.tags = data.map((item) => item.tag);
|
|
390
|
+
const context = new ServerContext(route, contextData);
|
|
391
|
+
const ret = [];
|
|
392
|
+
try {
|
|
393
|
+
const mergeGuards = /* @__PURE__ */ new Set([
|
|
394
|
+
...globalGuards
|
|
395
|
+
]);
|
|
396
|
+
const mergeInterceptors = /* @__PURE__ */ new Set([
|
|
397
|
+
...globalInterceptors
|
|
398
|
+
]);
|
|
399
|
+
data.forEach(({ tag }) => {
|
|
400
|
+
const { guards, interceptors } = Context.metaDataRecord[tag];
|
|
401
|
+
guards.forEach((guard) => mergeGuards.add(guard));
|
|
402
|
+
interceptors.forEach((intercept) => mergeInterceptors.add(intercept));
|
|
403
|
+
});
|
|
404
|
+
await context.useGuard([
|
|
405
|
+
...mergeGuards
|
|
406
|
+
], true);
|
|
407
|
+
await context.useInterceptor([
|
|
408
|
+
...mergeInterceptors
|
|
409
|
+
], true);
|
|
410
|
+
if (category === "series") {
|
|
411
|
+
for (const item of data) {
|
|
412
|
+
const { tag } = item;
|
|
413
|
+
const [name] = tag.split("-");
|
|
414
|
+
const { reflect, params } = Context.metaDataRecord[tag];
|
|
415
|
+
const instance = moduleMap.get(name);
|
|
416
|
+
try {
|
|
417
|
+
if (!params)
|
|
418
|
+
throw new BadRequestException(`"${tag}" doesn't exist`);
|
|
419
|
+
const args = await context.usePipe(params.map(({ type, key, validate }) => {
|
|
420
|
+
const arg = resolveDep(item[type], key);
|
|
421
|
+
if (typeof arg === "string" && arg.startsWith(SERIES_SYMBOL)) {
|
|
422
|
+
const [, index, argKey] = arg.split("@");
|
|
423
|
+
return {
|
|
424
|
+
arg: resolveDep(ret[Number(index)], argKey || key),
|
|
425
|
+
validate
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
return {
|
|
429
|
+
arg,
|
|
430
|
+
validate
|
|
431
|
+
};
|
|
432
|
+
}), reflect);
|
|
433
|
+
instance.context = contextData;
|
|
434
|
+
ret.push(await methodMap[tag](...args));
|
|
435
|
+
} catch (e) {
|
|
436
|
+
const m = Context.metaRecord[tag];
|
|
437
|
+
m.handlers.forEach((handler) => handler.error?.(e));
|
|
438
|
+
ret.push(await context.useFilter(e));
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return res.json(await context.usePost(ret));
|
|
442
|
+
}
|
|
443
|
+
if (category === "parallel") {
|
|
444
|
+
return Promise.all(data.map((item) => {
|
|
445
|
+
return new Promise(async (resolve) => {
|
|
446
|
+
const { tag } = item;
|
|
447
|
+
const [name] = tag.split("-");
|
|
448
|
+
const { reflect, params, handlers } = Context.metaDataRecord[tag];
|
|
449
|
+
const instance = moduleMap.get(name);
|
|
450
|
+
try {
|
|
451
|
+
if (!params)
|
|
452
|
+
throw new BadRequestException(`"${tag}" doesn't exist`);
|
|
453
|
+
const args = await context.usePipe(params.map(({ type, key, validate }) => {
|
|
454
|
+
const arg = resolveDep(item[type], key);
|
|
455
|
+
return {
|
|
456
|
+
arg,
|
|
457
|
+
validate
|
|
458
|
+
};
|
|
459
|
+
}), reflect);
|
|
460
|
+
instance.context = contextData;
|
|
461
|
+
resolve(await methodMap[tag](...args));
|
|
462
|
+
} catch (e) {
|
|
463
|
+
handlers.forEach((handler) => handler.error?.(e));
|
|
464
|
+
resolve(await context.useFilter(e));
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
})).then(async (ret2) => {
|
|
468
|
+
res.json(await context.usePost(ret2));
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
} catch (e) {
|
|
472
|
+
const err = await context.useFilter(e);
|
|
473
|
+
res.status(err.status).json(err);
|
|
474
|
+
}
|
|
475
|
+
});
|
|
359
476
|
for (const i of meta) {
|
|
360
477
|
const { name, method, route: route2, header, tag } = i.data;
|
|
361
478
|
const instance = moduleMap.get(tag);
|
|
362
479
|
const methodTag = `${tag}-${method}`;
|
|
363
480
|
contextMeta[methodTag] = i;
|
|
364
481
|
Context.metaRecord[methodTag] = i;
|
|
365
|
-
let { guards, reflect, interceptors, params, middlewares } = Context.metaDataRecord[methodTag] ? Context.metaDataRecord[methodTag] : Context.metaDataRecord[methodTag] = parseMeta(i);
|
|
482
|
+
let { guards, reflect, interceptors, params, handlers, middlewares } = Context.metaDataRecord[methodTag] ? Context.metaDataRecord[methodTag] : Context.metaDataRecord[methodTag] = parseMeta(i);
|
|
366
483
|
guards = [
|
|
367
484
|
...globalGuards,
|
|
368
485
|
...guards
|
|
@@ -400,97 +517,13 @@ function bindApp(app, { meta, moduleMap }, options = {}) {
|
|
|
400
517
|
else
|
|
401
518
|
res.send(String(ret));
|
|
402
519
|
} catch (e) {
|
|
403
|
-
|
|
520
|
+
handlers.forEach((handler2) => handler2.error?.(e));
|
|
404
521
|
const err = await context.useFilter(e);
|
|
405
522
|
res.status(err.status).json(err);
|
|
406
523
|
}
|
|
407
524
|
});
|
|
408
525
|
}
|
|
409
526
|
}
|
|
410
|
-
app.post(route, (req, _res, next) => {
|
|
411
|
-
req[MERGE_SYMBOL] = true;
|
|
412
|
-
next();
|
|
413
|
-
}, ...ServerContext.useMiddleware(proMiddle), async (req, res) => {
|
|
414
|
-
const { body: { category, data } } = req;
|
|
415
|
-
const contextData = {
|
|
416
|
-
request: req,
|
|
417
|
-
response: res,
|
|
418
|
-
meta: contextMeta,
|
|
419
|
-
isMerge: true
|
|
420
|
-
};
|
|
421
|
-
if (!Array.isArray(data))
|
|
422
|
-
return res.json(await ServerContext.useFilter(new BadRequestException("data format should be an array"), contextData));
|
|
423
|
-
contextData.tags = data.map((item) => item.tag);
|
|
424
|
-
const context = new ServerContext(route, contextData);
|
|
425
|
-
const ret = [];
|
|
426
|
-
if (category === "series") {
|
|
427
|
-
for (const item of data) {
|
|
428
|
-
const { tag } = item;
|
|
429
|
-
const [name] = tag.split("-");
|
|
430
|
-
const { guards, reflect, interceptors, params } = Context.metaDataRecord[tag];
|
|
431
|
-
const instance = moduleMap.get(name);
|
|
432
|
-
try {
|
|
433
|
-
if (!params)
|
|
434
|
-
throw new BadRequestException(`"${tag}" doesn't exist`);
|
|
435
|
-
await context.useGuard(guards, true);
|
|
436
|
-
await context.useInterceptor(interceptors, true);
|
|
437
|
-
const args = await context.usePipe(params.map(({ type, key, validate }) => {
|
|
438
|
-
const arg = resolveDep(item[type], key);
|
|
439
|
-
if (typeof arg === "string" && arg.startsWith(SERIES_SYMBOL)) {
|
|
440
|
-
const [, index, argKey] = arg.split("@");
|
|
441
|
-
return {
|
|
442
|
-
arg: resolveDep(ret[Number(index)], argKey || key),
|
|
443
|
-
validate
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
|
-
return {
|
|
447
|
-
arg,
|
|
448
|
-
validate
|
|
449
|
-
};
|
|
450
|
-
}), reflect);
|
|
451
|
-
instance.context = contextData;
|
|
452
|
-
ret.push(await context.usePost(await methodMap[tag](...args)));
|
|
453
|
-
} catch (e) {
|
|
454
|
-
const m = Context.metaRecord[tag];
|
|
455
|
-
m.handlers.forEach((handler) => handler.error?.(e));
|
|
456
|
-
ret.push(await context.useFilter(e));
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
return res.json(ret);
|
|
460
|
-
}
|
|
461
|
-
if (category === "parallel") {
|
|
462
|
-
return Promise.all(data.map((item) => {
|
|
463
|
-
return new Promise(async (resolve) => {
|
|
464
|
-
const { tag } = item;
|
|
465
|
-
const [name] = tag.split("-");
|
|
466
|
-
const { guards, reflect, interceptors, params } = Context.metaDataRecord[tag];
|
|
467
|
-
const instance = moduleMap.get(name);
|
|
468
|
-
try {
|
|
469
|
-
if (!params)
|
|
470
|
-
throw new BadRequestException(`"${tag}" doesn't exist`);
|
|
471
|
-
await context.useGuard(guards, true);
|
|
472
|
-
await context.useInterceptor(interceptors, true);
|
|
473
|
-
const args = await context.usePipe(params.map(({ type, key, validate }) => {
|
|
474
|
-
const arg = resolveDep(item[type], key);
|
|
475
|
-
return {
|
|
476
|
-
arg,
|
|
477
|
-
validate
|
|
478
|
-
};
|
|
479
|
-
}), reflect);
|
|
480
|
-
instance.context = contextData;
|
|
481
|
-
resolve(await context.usePost(await methodMap[tag](...args)));
|
|
482
|
-
} catch (e) {
|
|
483
|
-
const m = Context.metaRecord[tag];
|
|
484
|
-
m.handlers.forEach((handler) => handler.error?.(e));
|
|
485
|
-
resolve(await context.useFilter(e));
|
|
486
|
-
}
|
|
487
|
-
});
|
|
488
|
-
})).then((ret2) => {
|
|
489
|
-
res.json(ret2);
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
res.json(await context.useFilter(new BadRequestException("category should be 'parallel' or 'series'")));
|
|
493
|
-
});
|
|
494
527
|
}
|
|
495
528
|
__name(bindApp, "bindApp");
|
|
496
529
|
|
|
@@ -534,6 +567,7 @@ async function Factory(Modules) {
|
|
|
534
567
|
};
|
|
535
568
|
}
|
|
536
569
|
__name(Factory, "Factory");
|
|
570
|
+
var constructorMap = /* @__PURE__ */ new Map();
|
|
537
571
|
async function buildNestModule(Module, map, meta) {
|
|
538
572
|
const paramtypes = getParamtypes(Module);
|
|
539
573
|
let instance;
|
|
@@ -542,6 +576,8 @@ async function buildNestModule(Module, map, meta) {
|
|
|
542
576
|
instance = map.get(tag);
|
|
543
577
|
if (!instance)
|
|
544
578
|
throw new Error(`exist Circular-Dependency or Multiple modules with the same name/tag [tag] ${tag}--[module] ${Module}`);
|
|
579
|
+
if (constructorMap.get(tag) !== Module)
|
|
580
|
+
warn(`Synonym module: Module taged "${tag}" has been loaded before, so phecda-server won't load Module "${Module.name}"`);
|
|
545
581
|
return instance;
|
|
546
582
|
}
|
|
547
583
|
map.set(tag, void 0);
|
|
@@ -556,6 +592,7 @@ async function buildNestModule(Module, map, meta) {
|
|
|
556
592
|
meta.push(...getMetaFromInstance(instance, Module.name, tag));
|
|
557
593
|
await registerAsync(instance);
|
|
558
594
|
map.set(tag, instance);
|
|
595
|
+
constructorMap.set(tag, Module);
|
|
559
596
|
return instance;
|
|
560
597
|
}
|
|
561
598
|
__name(buildNestModule, "buildNestModule");
|
|
@@ -694,6 +731,10 @@ function Put(route) {
|
|
|
694
731
|
return Route(route, "put");
|
|
695
732
|
}
|
|
696
733
|
__name(Put, "Put");
|
|
734
|
+
function Patch(route) {
|
|
735
|
+
return Route(route, "patch");
|
|
736
|
+
}
|
|
737
|
+
__name(Patch, "Patch");
|
|
697
738
|
function Delete(route) {
|
|
698
739
|
return Route(route, "delete");
|
|
699
740
|
}
|
|
@@ -800,6 +841,7 @@ export {
|
|
|
800
841
|
Middle,
|
|
801
842
|
NotFoundException,
|
|
802
843
|
Param,
|
|
844
|
+
Patch,
|
|
803
845
|
PayloadLargeException,
|
|
804
846
|
Post,
|
|
805
847
|
Put,
|
|
@@ -817,6 +859,7 @@ export {
|
|
|
817
859
|
addInterceptor,
|
|
818
860
|
addMiddleware,
|
|
819
861
|
bindApp,
|
|
862
|
+
constructorMap,
|
|
820
863
|
defaultPipe,
|
|
821
864
|
emitter,
|
|
822
865
|
getInstance,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pipe.ts","../src/exception/base.ts","../src/exception/validate.ts","../src/exception/undefine.ts","../src/exception/forbidden.ts","../src/exception/bad-request.ts","../src/exception/not-found.ts","../src/exception/conflict.ts","../src/exception/bad-gateway.ts","../src/exception/invalid-input.ts","../src/exception/media-type.ts","../src/exception/payload-large.ts","../src/exception/timeout.ts","../src/exception/unauthorized.ts","../src/exception/unavailable-service.ts","../src/exception/framework.ts","../src/filter.ts","../src/history.ts","../src/context/base.ts","../src/context/server.ts","../src/types.ts","../src/utils.ts","../src/helper.ts","../src/common.ts","../src/server/express.ts","../src/core.ts","../src/meta.ts","../src/decorators/index.ts","../src/decorators/param.ts","../src/decorators/route.ts","../src/index.ts"],"sourcesContent":["import { isPhecda, plainToClass } from 'phecda-core'\nimport { ValidateException } from './exception/validate'\n\nimport type { P } from './types'\n\nexport const defaultPipe = {\n // todo: add more params\n async transform(args: { arg: any; validate: boolean }[], reflect: any[]) {\n for (const i in args) {\n const { validate, arg } = args[i]\n if (validate === false || !reflect[i]/** work for undefined */)\n continue\n\n if (isPhecda(reflect[i])) {\n const ret = await plainToClass(reflect[i], arg, { transform: true })\n if (ret.err.length > 0)\n throw new ValidateException(ret.err[0])\n args[i].arg = ret.data\n }\n else {\n if ([Number, Boolean].includes(reflect[i])) {\n args[i].arg = reflect[i](arg)\n\n if (reflect[i] === Number && Object.is(args[i].arg, NaN))\n throw new ValidateException(`parameter ${Number(i) + 1} should be a number`)\n }\n }\n }\n return args.map(item => item.arg)\n },\n} as P.Pipe\n","export class HttpException extends Error {\n constructor(public message: string, public status: number, public description = 'Http exception') {\n super(message)\n }\n\n get data() {\n return { message: this.message, description: this.description, status: this.status, error: true }\n }\n}\n","import { HttpException } from './base'\n\nexport class ValidateException extends HttpException {\n constructor(message: string) {\n super(message, 400, 'Validate exception')\n }\n}\n","import { HttpException } from './base'\n\nexport class UndefinedException extends HttpException {\n constructor(message: string) {\n super(message, 500, 'Undefined error')\n }\n}\n","import { HttpException } from './base'\n\nexport class ForbiddenException extends HttpException {\n constructor(message: string) {\n super(message, 403, 'Forbidden resource')\n }\n}\n","import { HttpException } from './base'\n\nexport class BadRequestException extends HttpException {\n constructor(message: string) {\n super(message, 400, 'Bad Request')\n }\n}\n","import { HttpException } from './base'\n\nexport class NotFoundException extends HttpException {\n constructor(message: string) {\n super(message, 404, 'Not Found')\n }\n}\n","import { HttpException } from './base'\n\nexport class ConflictException extends HttpException {\n constructor(message: string) {\n super(message, 409, 'Conflict')\n }\n}\n","import { HttpException } from './base'\n\nexport class BadGatewayException extends HttpException {\n constructor(message: string) {\n super(message, 502, 'Bad Gatrway')\n }\n}\n","import { HttpException } from './base'\n\nexport class InvalidInputException extends HttpException {\n constructor(message: string) {\n super(message, 502, 'Invalid Input')\n }\n}\n","import { HttpException } from './base'\n\nexport class UnsupportedMediaTypeException extends HttpException {\n constructor(message: string) {\n super(message, 415, 'Unsupported Media Type')\n }\n}\n","import { HttpException } from './base'\n\nexport class PayloadLargeException extends HttpException {\n constructor(message: string) {\n super(message, 413, 'Payload Too Large')\n }\n}\n","import { HttpException } from './base'\n\nexport class TimeoutException extends HttpException {\n constructor(message: string) {\n super(message, 408, 'Request Timeout',\n )\n }\n}\n","import { HttpException } from './base'\n\nexport class UnauthorizedException extends HttpException {\n constructor(message: string) {\n super(message, 401, 'Unauthorized')\n }\n}\n","import { HttpException } from './base'\n\nexport class ServiceUnavailableException extends HttpException {\n constructor(message: string) {\n super(message, 503, 'Service Unavailable')\n }\n}\n","import { HttpException } from './base'\n\nexport class FrameworkException extends HttpException {\n constructor(message: string) {\n super(`[phecda-server] ${message}`, 500, 'Framework Error')\n }\n}\n","import { HttpException, UndefinedException } from './exception'\nimport type { ServerFilter } from './types'\n\nexport const serverFilter: ServerFilter = (e: any) => {\n if (!(e instanceof HttpException))\n e = new UndefinedException(e.message || e)\n return e.data\n}\n","export class Phistroy {\n guard: string[] = []\n interceptor: string[] = []\n record(name: string, type: 'guard' | 'interceptor') {\n if (!this[type].includes(name)) {\n this[type].push(name)\n return true\n }\n return false\n }\n}\n","import { ForbiddenException, FrameworkException } from '../exception'\nimport { Phistroy } from '../history'\n\nimport type { Meta } from '../meta'\nimport type { P } from '../types'\n\nexport abstract class Context<Data = any> {\n method: string\n params: string[]\n\n static metaRecord: Record<string, Meta> = {}\n static metaDataRecord: Record<string, ReturnType<typeof parseMeta>> = {}\n static instanceRecord: Record<string, any> = {}\n static guardsRecord: Record<string, any> = {}\n static interceptorsRecord: Record<string, any > = {}\n // static serverRecord: Record<string, Context> = {}\n post: ((...params: any) => any)[]\n history = new Phistroy()\n\n constructor(public key: string, public data: Data) {\n }\n\n static registerGuard(key: string, handler: any) {\n Context.guardsRecord[key] = handler\n }\n\n static registerInterceptor(key: string, handler: any) {\n Context.interceptorsRecord[key] = handler\n }\n\n async useGuard(guards: string[], isMerge = false) {\n for (const guard of guards) {\n if (this.history.record(guard, 'guard')) {\n if (!(guard in Context.guardsRecord))\n throw new FrameworkException(`can't find guard named ${guard}`)\n if (!await Context.guardsRecord[guard](this.data, isMerge))\n throw new ForbiddenException(`Guard exception--${guard}`)\n }\n }\n }\n\n async useInterceptor(interceptors: string[], isMerge = false) {\n const ret = []\n for (const interceptor of interceptors) {\n if (this.history.record(interceptor, 'interceptor')) {\n if (!(interceptor in Context.interceptorsRecord))\n throw new FrameworkException(`can't find guard named ${interceptor}`)\n const post = await Context.interceptorsRecord[interceptor](this.data, isMerge)\n if (post)\n ret.push(post)\n }\n }\n this.post = ret\n }\n\n async usePost(data: any) {\n if (!this.post)\n return data\n for (const cb of this.post)\n data = (await cb(data)) | data\n\n return data\n }\n}\n\nexport function addGuard(key: string, handler: P.Guard) {\n Context.registerGuard(key, handler)\n}\n\nexport function addInterceptor(key: string, handler: P.Interceptor) {\n Context.registerInterceptor(key, handler)\n}\nexport function getInstance(tag: string) {\n return Context.instanceRecord[tag]\n}\n\nexport function parseMeta(meta: Meta) {\n const { data: { params, guards, interceptors, middlewares }, reflect } = meta\n return {\n guards,\n reflect,\n interceptors,\n middlewares,\n params: params.map((param) => {\n const { type, key, validate } = param\n return { type, key, validate }\n }),\n }\n}\n","import type { RequestHandler } from 'express'\nimport { defaultPipe } from '../pipe'\nimport { serverFilter } from '../filter'\nimport { FrameworkException } from '../exception'\nimport type { P, ServerCtx, ServerFilter, ServerMergeCtx } from '../types'\nimport { Context } from './base'\n\nexport class ServerContext extends Context<ServerCtx | ServerMergeCtx > {\n static pipe = defaultPipe\n static filter = serverFilter\n static middlewareRecord: Record<string, (...params: any) => any> = {}\n static useMiddleware(middlewares: string[]) {\n return middlewares.map((m) => {\n if (!(m in ServerContext.middlewareRecord))\n throw new FrameworkException(`can't find middleware named ${m}`)\n return ServerContext.middlewareRecord[m]\n })\n }\n\n async usePipe(args: { arg: any; validate?: boolean }[], reflect: any[]) {\n return ServerContext.pipe.transform?.(args, reflect, this.data)\n }\n\n static useFilter(arg: any, data: ServerCtx | ServerMergeCtx) {\n return ServerContext.filter(arg, data)\n }\n\n useFilter(arg: any) {\n return ServerContext.filter(arg, this.data)\n }\n}\n\nexport function addMiddleware(key: string, handler: RequestHandler) {\n ServerContext.middlewareRecord[key] = handler\n}\n\nexport function useServerPipe(pipe: P.Pipe) {\n ServerContext.pipe = pipe\n}\nexport function useServerFilter(filter: ServerFilter) {\n ServerContext.filter = filter\n}\n","import type { Request, Response } from 'express'\nimport type { Events } from 'phecda-core'\nimport type { Meta } from './meta'\nimport type { HttpException } from './exception'\nexport type Construct<T = any> = new (...args: any[]) => T\n\nexport interface Emitter {\n on<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n once<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n off<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n removeAllListeners<N extends keyof Events>(eventName: N): void\n emit<N extends keyof Events>(eventName: N, param: Events[N]): void\n}\n\nexport type RequestType = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head'\n\nexport type MergeType = <R extends Promise<any>[]> (...args: R) => { [K in keyof R]: Awaited<R[K]> }\n\nexport interface ServerMergeCtx {\n request: Request\n response: Response\n meta: Record<string, Meta>\n isMerge: true\n tags?: string[]\n}\n\nexport interface ServerCtx {\n request: Request\n response: Response\n meta: Meta\n}\nexport interface BaseError {\n error: true\n status: number\n}\nexport type ServerFilter<E extends HttpException = any> = (err: E | Error, ctx: ServerMergeCtx | ServerCtx) => any\n\nexport class Base {\n context: ServerMergeCtx | ServerCtx\n}\n\nexport namespace P{\n export interface Error extends BaseError { message: string; description: string}\n\n export type ResOrErr<R > = { [K in keyof R]: Awaited<R[K]> | Error }\n\n export type Res<T> = T\n export type Guard = ((ctx: ServerCtx, isMerge?: false) => Promise<boolean> | boolean) | ((ctx: ServerMergeCtx, isMerge?: true) => Promise<boolean> | boolean)\n export type Interceptor = ((ctx: ServerCtx, isMerge?: false) => any) | ((ctx: ServerMergeCtx, isMerge?: true) => any)\n export interface Handler {\n error?: (arg: any) => void\n }\n export interface Meta {\n route?: {\n type: RequestType\n route: string\n }\n // mq?: {\n // queue: string\n // routeKey: string\n // options: amqplib.Options.Consume\n\n // }\n define?: any\n header: Record<string, string>\n params: { type: string; index: number; key: string; validate?: boolean }[]\n guards: string[]\n interceptors: string[]\n middlewares: string[]\n method: string\n name: string\n tag: string\n }\n export interface Pipe {\n transform(args: { arg: any; validate?: boolean }[], reflect: any[], ctx: ServerCtx | ServerMergeCtx): Promise<any[]>\n }\n\n}\n","export const isUndefined = (obj: any): obj is undefined =>\n typeof obj === 'undefined'\nexport const isNil = (obj: any): obj is null | undefined =>\n isUndefined(obj) || obj === null\n\nexport const isObject = (fn: any): fn is object =>\n !isNil(fn) && typeof fn === 'object'\n","import type { ServerCtx, ServerMergeCtx } from './types'\n\nexport function isMerge(data: ServerCtx | ServerMergeCtx): data is ServerMergeCtx {\n return !!(data as ServerMergeCtx).isMerge\n}\n\nexport function resolveDep(ret: any, key: string) {\n if (key)\n return ret?.[key]\n return ret\n}\n","export const SERIES_SYMBOL = '__symbol_series__'\nexport const MERGE_SYMBOL = '__symbol_req__'\n","import type { Express, Router } from 'express'\nimport { Context, ServerContext, parseMeta } from '../context'\nimport { isObject } from '../utils'\nimport { resolveDep } from '../helper'\nimport { MERGE_SYMBOL, SERIES_SYMBOL } from '../common'\nimport type { Factory } from '../core'\nimport { BadRequestException } from '../exception'\nimport type { Meta } from '../meta'\nimport type { ServerMergeCtx } from '../types'\n\nexport interface Options {\n/**\n * 专用路由的值,默认为/__PHECDA_SERVER__,处理phecda-client发出的合并请求\n */\n route?: string\n /**\n * 全局守卫\n */\n globalGuards?: string[]\n /**\n * 全局拦截器\n */\n globalInterceptors?: string[]\n /**\n * 专用路由的中间件,全局中间件请在bindApp以外设置\n */\n middlewares?: string[]\n}\n\nexport function bindApp(app: Express | Router, { meta, moduleMap }: Awaited<ReturnType<typeof Factory>>, options: Options = {}) {\n const { globalGuards, globalInterceptors, route, middlewares: proMiddle } = { route: '/__PHECDA_SERVER__', globalGuards: [], globalInterceptors: [], middlewares: [], ...options } as Required<Options>\n const methodMap = {} as Record<string, (...args: any[]) => any>\n const contextMeta = {} as Record<string, Meta>\n for (const i of meta) {\n const { name, method, route, header, tag } = i.data\n const instance = moduleMap.get(tag)!\n const methodTag = `${tag}-${method}`\n contextMeta[methodTag] = i\n Context.metaRecord[methodTag] = i\n let {\n guards,\n reflect,\n interceptors,\n params,\n middlewares,\n } = Context.metaDataRecord[methodTag] ? Context.metaDataRecord[methodTag] : (Context.metaDataRecord[methodTag] = parseMeta(i))\n\n guards = [...globalGuards!, ...guards]\n interceptors = [...globalInterceptors!, ...interceptors]\n\n const handler = instance[method].bind(instance)\n methodMap[methodTag] = handler\n Context.instanceRecord[name] = instance\n if (route) {\n (app as Express)[route.type](route.route, ...ServerContext.useMiddleware(middlewares), async (req, res) => {\n const contextData = {\n request: req,\n meta: i,\n response: res,\n }\n const context = new ServerContext(methodTag, contextData)\n\n try {\n for (const name in header)\n res.set(name, header[name])\n await context.useGuard(guards)\n await context.useInterceptor(interceptors)\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n return { arg: resolveDep((req as any)[type], key), validate }\n }), reflect)\n instance.context = contextData\n\n const ret = await context.usePost(await handler(...args))\n if (isObject(ret))\n res.json(ret)\n else\n res.send(String(ret))\n }\n catch (e: any) {\n i.handlers.forEach(handler => handler.error?.(e))\n const err = await context.useFilter(e)\n res.status(err.status).json(err)\n }\n })\n }\n }\n\n (app as Express).post(route, (req, _res, next) => {\n (req as any)[MERGE_SYMBOL] = true\n next()\n }, ...ServerContext.useMiddleware(proMiddle), async (req, res) => {\n const { body: { category, data } } = req\n\n const contextData = {\n request: req,\n response: res,\n meta: contextMeta,\n isMerge: true,\n } as unknown as ServerMergeCtx\n\n if (!Array.isArray(data))\n return res.json(await ServerContext.useFilter(new BadRequestException('data format should be an array'), contextData))\n\n contextData.tags = data.map((item: any) => item.tag)\n\n const context = new ServerContext(route, contextData)\n const ret = [] as any[]\n\n if (category === 'series') {\n for (const item of data) {\n const { tag } = item\n const [name] = tag.split('-')\n const {\n guards,\n reflect,\n interceptors,\n params,\n } = Context.metaDataRecord[tag]\n const instance = moduleMap.get(name)\n\n try {\n if (!params)\n throw new BadRequestException(`\"${tag}\" doesn't exist`)\n\n await context.useGuard(guards, true)\n await context.useInterceptor(interceptors, true)\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n const arg = resolveDep(item[type], key)\n if (typeof arg === 'string' && arg.startsWith(SERIES_SYMBOL)) {\n const [, index, argKey] = arg.split('@')\n return { arg: resolveDep(ret[Number(index)], argKey || key), validate }\n }\n\n return { arg, validate }\n }), reflect) as any\n instance.context = contextData\n\n ret.push(await context.usePost(await methodMap[tag](...args)))\n }\n catch (e: any) {\n const m = Context.metaRecord[tag]\n m.handlers.forEach(handler => handler.error?.(e))\n ret.push(await context.useFilter(e))\n }\n }\n return res.json(ret)\n }\n if (category === 'parallel') {\n return Promise.all(data.map((item: any) => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n const { tag } = item\n const [name] = tag.split('-')\n const {\n guards,\n reflect,\n interceptors,\n params,\n } = Context.metaDataRecord[tag]\n const instance = moduleMap.get(name)\n\n try {\n if (!params)\n throw new BadRequestException(`\"${tag}\" doesn't exist`)\n\n await context.useGuard(guards, true)\n await context.useInterceptor(interceptors, true)\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n const arg = resolveDep(item[type], key)\n return { arg, validate }\n }), reflect) as any\n instance.context = contextData\n resolve(await context.usePost(await methodMap[tag](...args)))\n }\n catch (e: any) {\n const m = Context.metaRecord[tag]\n m.handlers.forEach(handler => handler.error?.(e))\n resolve(await context.useFilter(e))\n }\n })\n })).then((ret) => {\n res.json(ret)\n })\n }\n\n res.json(await context.useFilter(new BadRequestException('category should be \\'parallel\\' or \\'series\\'')))\n })\n}\n","import 'reflect-metadata'\nimport fs from 'fs'\nimport EventEmitter from 'node:events'\nimport type { Phecda } from 'phecda-core'\nimport { getExposeKey, getHandler, getState, injectProperty, registerAsync } from 'phecda-core'\nimport type { Construct, Emitter, P } from './types'\nimport { Meta } from './meta'\n// TODO: support both emitter types and origin emitter type in future\nexport const emitter: Emitter = new EventEmitter() as any\n\nexport async function Factory(Modules: (new (...args: any) => any)[]) {\n const moduleMap = new Map<string, InstanceType<Construct>>()\n const meta: Meta[] = []\n injectProperty('watcher', ({ eventName, instance, key, options }: { eventName: string; instance: any; key: string; options?: { once: boolean } }) => {\n const fn = typeof instance[key] === 'function' ? instance[key].bind(instance) : (v: any) => instance[key] = v\n\n if (options?.once)\n (emitter as any).once(eventName, fn)\n\n else\n (emitter as any).on(eventName, fn)\n })\n\n for (const Module of Modules)\n await buildNestModule(Module, moduleMap, meta)\n\n return { moduleMap, meta, output: (p = 'pmeta.js') => fs.writeFileSync(p, JSON.stringify(meta.map(item => item.data))) }\n}\n\nasync function buildNestModule(Module: Construct, map: Map<string, InstanceType<Construct>>, meta: Meta[]) {\n const paramtypes = getParamtypes(Module) as Construct[]\n let instance: InstanceType<Construct>\n const tag = Module.prototype?.__TAG__ || Module.name\n\n if (map.has(tag)) {\n instance = map.get(tag)\n if (!instance)\n throw new Error(`exist Circular-Dependency or Multiple modules with the same name/tag [tag] ${tag}--[module] ${Module}`)\n\n return instance\n }\n map.set(tag, undefined)\n if (paramtypes) {\n const paramtypesInstances = [] as any[]\n for (const i in paramtypes)\n paramtypesInstances[i] = await buildNestModule(paramtypes[i], map, meta)\n\n instance = new Module(...paramtypesInstances)\n }\n else {\n instance = new Module()\n }\n meta.push(...getMetaFromInstance(instance, Module.name, tag))\n await registerAsync(instance)\n map.set(tag, instance)\n\n return instance\n}\n\nfunction getMetaFromInstance(instance: Phecda, name: string, tag: string) {\n const vars = getExposeKey(instance).filter(item => item !== '__CLASS')\n const baseState = (getState(instance, '__CLASS') || {}) as P.Meta\n initState(baseState)\n\n return vars.map((i) => {\n const meta = {} as P.Meta\n const state = (getState(instance, i) || {}) as P.Meta\n initState(state)\n if (state.route) {\n meta.route = {\n route: (baseState.route?.route || '') + (state.route.route),\n type: state.route.type,\n }\n }\n\n meta.name = name\n meta.tag = tag\n meta.method = i as string\n const params = [] as any[]\n for (const i of state.params || []) {\n params.unshift(i)\n if (i.index === 0)\n break\n }\n meta.params = params\n meta.define = { ...baseState.define, ...state.define }\n meta.header = { ...baseState.header, ...state.header }\n meta.middlewares = [...new Set([...baseState.middlewares, ...state.middlewares])]\n meta.guards = [...new Set([...baseState.guards, ...state.guards])]\n meta.interceptors = [...new Set([...baseState.interceptors, ...state.interceptors])]\n\n return new Meta(meta as unknown as P.Meta, getHandler(instance, i), getParamtypes(instance, i as string) || [])\n })\n}\n\nfunction getParamtypes(Module: any, key?: string | symbol) {\n return Reflect.getMetadata('design:paramtypes', Module, key!)\n}\n\nfunction initState(state: any) {\n if (!state.define)\n state.define = {}\n if (!state.header)\n state.header = {}\n if (!state.middlewares)\n state.middlewares = []\n if (!state.guards)\n state.guards = []\n if (!state.interceptors)\n state.interceptors = []\n}\n","import type { P } from './types'\n\nexport class Meta {\n constructor(public data: P.Meta, public handlers: P.Handler[], public reflect: any[]) {\n\n }\n}\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function Header(name: string, value: string) {\n return (target: any, k: PropertyKey) => {\n setModelVar(target, k)\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.header)\n state.header = {}\n\n state.header[name] = value\n setState(target, k, state)\n }\n}\n\nexport function Define(key: string, value: any) {\n return (target: any, k?: PropertyKey) => {\n if (!k) {\n k = '__CLASS'\n target = target.prototype\n }\n\n setModelVar(target, k)\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.define)\n state.define = {}\n\n state.define[key] = value\n setState(target, k, state)\n }\n}\n\nexport * from './param'\nexport * from './route'\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function BaseParam(type: string, key: string, validate?: any): any {\n return (target: any, k: PropertyKey, index: number) => {\n setModelVar(target, k)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.params)\n state.params = []\n\n state.params.push({ type, key, index, validate })\n setState(target, k, state)\n }\n}\n\nexport function Body(key = '', pipeOpts?: any) {\n return BaseParam('body', key, pipeOpts)\n}\nexport function Query(key = '', pipeOpts?: any) {\n return BaseParam('query', key, pipeOpts)\n}\nexport function Param(key: string, pipeOpts?: any) {\n return BaseParam('params', key, pipeOpts)\n}\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function Route(route: string, type?: string): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n state.route = {\n route,\n type,\n }\n setState(target, key, state)\n }\n}\n\nexport function Get(route: string) {\n return Route(route, 'get')\n}\n\nexport function Post(route: string) {\n return Route(route, 'post')\n}\nexport function Put(route: string) {\n return Route(route, 'put')\n}\n\nexport function Delete(route: string) {\n return Route(route, 'delete')\n}\n\nexport function Controller(route: string) {\n return Route(route)\n}\n\nexport function Guard(...guards: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.guards)\n state.guards = []\n state.guards.push(...guards)\n setState(target, key, state)\n }\n}\n\nexport function Middle(...middlewares: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.middlewares)\n state.middlewares = []\n state.middlewares.push(...middlewares)\n setState(target, key, state)\n }\n}\n\nexport function Interceptor(...interceptors: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.interceptors)\n state.interceptors = []\n state.interceptors.push(...interceptors)\n setState(target, key, state)\n }\n}\n","export * from './context'\nexport * from './types'\nexport * from './server/express'\nexport * from './core'\nexport * from './decorators'\nexport * from './exception'\nexport * from './pipe'\nexport * from './meta'\nexport * from 'phecda-core'\nexport * from './helper'\nexport * from './common'\n"],"mappings":"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","names":["isPhecda","plainToClass","HttpException","Error","message","status","description","constructor","data","error","ValidateException","HttpException","constructor","message","defaultPipe","transform","args","reflect","i","validate","arg","isPhecda","ret","plainToClass","err","length","ValidateException","data","Number","Boolean","includes","Object","is","NaN","map","item","UndefinedException","HttpException","constructor","message","ForbiddenException","HttpException","constructor","message","BadRequestException","HttpException","constructor","message","NotFoundException","HttpException","constructor","message","ConflictException","HttpException","constructor","message","BadGatewayException","HttpException","constructor","message","InvalidInputException","HttpException","constructor","message","UnsupportedMediaTypeException","HttpException","constructor","message","PayloadLargeException","HttpException","constructor","message","TimeoutException","HttpException","constructor","message","UnauthorizedException","HttpException","constructor","message","ServiceUnavailableException","HttpException","constructor","message","FrameworkException","HttpException","constructor","message","serverFilter","e","HttpException","UndefinedException","message","data","Phistroy","guard","interceptor","record","name","type","includes","push","Context","key","data","method","params","post","history","constructor","Phistroy","registerGuard","handler","guardsRecord","registerInterceptor","interceptorsRecord","useGuard","guards","isMerge","guard","record","FrameworkException","ForbiddenException","useInterceptor","interceptors","ret","interceptor","push","usePost","cb","metaRecord","metaDataRecord","instanceRecord","addGuard","addInterceptor","getInstance","tag","parseMeta","meta","middlewares","reflect","map","param","type","validate","ServerContext","Context","useMiddleware","middlewares","map","m","middlewareRecord","FrameworkException","usePipe","args","reflect","pipe","transform","data","useFilter","arg","filter","defaultPipe","serverFilter","addMiddleware","key","handler","useServerPipe","useServerFilter","Base","context","isUndefined","obj","isNil","isObject","fn","isMerge","data","resolveDep","ret","key","SERIES_SYMBOL","MERGE_SYMBOL","bindApp","app","meta","moduleMap","options","globalGuards","globalInterceptors","route","middlewares","proMiddle","methodMap","contextMeta","i","name","method","header","tag","data","instance","get","methodTag","Context","metaRecord","guards","reflect","interceptors","params","metaDataRecord","parseMeta","handler","bind","instanceRecord","type","ServerContext","useMiddleware","req","res","contextData","request","response","context","set","useGuard","useInterceptor","args","usePipe","map","key","validate","arg","resolveDep","ret","usePost","isObject","json","send","String","e","handlers","forEach","error","err","useFilter","status","post","_res","next","MERGE_SYMBOL","body","category","isMerge","Array","isArray","BadRequestException","tags","item","split","startsWith","SERIES_SYMBOL","index","argKey","Number","push","m","Promise","all","resolve","then","fs","EventEmitter","getExposeKey","getHandler","getState","injectProperty","registerAsync","Meta","data","handlers","reflect","constructor","emitter","EventEmitter","Factory","Modules","moduleMap","Map","meta","injectProperty","eventName","instance","key","options","fn","bind","v","once","on","Module","buildNestModule","output","p","fs","writeFileSync","JSON","stringify","map","item","data","paramtypes","getParamtypes","tag","prototype","__TAG__","name","has","get","Error","set","undefined","paramtypesInstances","i","push","getMetaFromInstance","registerAsync","vars","getExposeKey","filter","baseState","getState","initState","state","route","type","method","params","unshift","index","define","header","middlewares","Set","guards","interceptors","Meta","getHandler","Reflect","getMetadata","setModelVar","setState","setModelVar","setState","BaseParam","type","key","validate","target","k","index","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","params","push","setState","Body","pipeOpts","Query","Param","setModelVar","setState","Route","route","type","target","key","prototype","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","setState","Get","Post","Put","Delete","Controller","Guard","guards","push","Middle","middlewares","Interceptor","interceptors","Header","name","value","target","k","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","header","setState","Define","key","prototype","define"]}
|
|
1
|
+
{"version":3,"sources":["../src/pipe.ts","../src/exception/base.ts","../src/exception/validate.ts","../src/exception/undefine.ts","../src/exception/forbidden.ts","../src/exception/bad-request.ts","../src/exception/not-found.ts","../src/exception/conflict.ts","../src/exception/bad-gateway.ts","../src/exception/invalid-input.ts","../src/exception/media-type.ts","../src/exception/payload-large.ts","../src/exception/timeout.ts","../src/exception/unauthorized.ts","../src/exception/unavailable-service.ts","../src/exception/framework.ts","../src/filter.ts","../src/history.ts","../src/context/base.ts","../src/context/server.ts","../src/types.ts","../src/utils.ts","../src/helper.ts","../src/common.ts","../src/server/express.ts","../src/core.ts","../src/meta.ts","../src/decorators/index.ts","../src/decorators/param.ts","../src/decorators/route.ts","../src/index.ts"],"sourcesContent":["import { isPhecda, plainToClass } from 'phecda-core'\nimport { ValidateException } from './exception/validate'\n\nimport type { P } from './types'\n\nexport const defaultPipe = {\n // todo: add more params\n async transform(args: { arg: any; validate: any }[], reflect: any[]) {\n for (const i in args) {\n const { validate, arg } = args[i]\n if (validate === false)\n continue\n if (!reflect[i]) {\n if (validate && arg)\n args[i].arg = validate(arg)\n\n continue\n }\n\n if (isPhecda(reflect[i])) {\n const ret = await plainToClass(reflect[i], arg, { transform: true })\n if (ret.err.length > 0)\n throw new ValidateException(ret.err[0])\n args[i].arg = ret.data\n }\n else {\n if ([Number, Boolean].includes(reflect[i])) {\n args[i].arg = reflect[i](arg)\n\n if (reflect[i] === Number && Object.is(args[i].arg, NaN))\n throw new ValidateException(`parameter ${Number(i) + 1} should be a number`)\n }\n }\n }\n return args.map(item => item.arg)\n },\n} as P.Pipe\n","export class HttpException extends Error {\n constructor(public message: string, public status: number, public description = 'Http exception') {\n super(message)\n }\n\n get data() {\n return { message: this.message, description: this.description, status: this.status, error: true }\n }\n}\n","import { HttpException } from './base'\n\nexport class ValidateException extends HttpException {\n constructor(message: string) {\n super(message, 400, 'Validate exception')\n }\n}\n","import { HttpException } from './base'\n\nexport class UndefinedException extends HttpException {\n constructor(message: string) {\n super(message, 500, 'Undefined error')\n }\n}\n","import { HttpException } from './base'\n\nexport class ForbiddenException extends HttpException {\n constructor(message: string) {\n super(message, 403, 'Forbidden resource')\n }\n}\n","import { HttpException } from './base'\n\nexport class BadRequestException extends HttpException {\n constructor(message: string) {\n super(message, 400, 'Bad Request')\n }\n}\n","import { HttpException } from './base'\n\nexport class NotFoundException extends HttpException {\n constructor(message: string) {\n super(message, 404, 'Not Found')\n }\n}\n","import { HttpException } from './base'\n\nexport class ConflictException extends HttpException {\n constructor(message: string) {\n super(message, 409, 'Conflict')\n }\n}\n","import { HttpException } from './base'\n\nexport class BadGatewayException extends HttpException {\n constructor(message: string) {\n super(message, 502, 'Bad Gatrway')\n }\n}\n","import { HttpException } from './base'\n\nexport class InvalidInputException extends HttpException {\n constructor(message: string) {\n super(message, 502, 'Invalid Input')\n }\n}\n","import { HttpException } from './base'\n\nexport class UnsupportedMediaTypeException extends HttpException {\n constructor(message: string) {\n super(message, 415, 'Unsupported Media Type')\n }\n}\n","import { HttpException } from './base'\n\nexport class PayloadLargeException extends HttpException {\n constructor(message: string) {\n super(message, 413, 'Payload Too Large')\n }\n}\n","import { HttpException } from './base'\n\nexport class TimeoutException extends HttpException {\n constructor(message: string) {\n super(message, 408, 'Request Timeout',\n )\n }\n}\n","import { HttpException } from './base'\n\nexport class UnauthorizedException extends HttpException {\n constructor(message: string) {\n super(message, 401, 'Unauthorized')\n }\n}\n","import { HttpException } from './base'\n\nexport class ServiceUnavailableException extends HttpException {\n constructor(message: string) {\n super(message, 503, 'Service Unavailable')\n }\n}\n","import { HttpException } from './base'\n\nexport class FrameworkException extends HttpException {\n constructor(message: string) {\n super(`[phecda-server] ${message}`, 500, 'Framework Error')\n }\n}\n","import { HttpException, UndefinedException } from './exception'\nimport type { ServerFilter } from './types'\n\nexport const serverFilter: ServerFilter = (e: any) => {\n if (!(e instanceof HttpException)) {\n console.error(e.stack)\n e = new UndefinedException(e.message || e)\n }\n else {\n console.error(e.message)\n }\n\n return e.data\n}\n","export class Phistroy {\n guard: string[] = []\n interceptor: string[] = []\n record(name: string, type: 'guard' | 'interceptor') {\n if (!this[type].includes(name)) {\n this[type].push(name)\n return true\n }\n return false\n }\n}\n","import { ForbiddenException, FrameworkException } from '../exception'\nimport { Phistroy } from '../history'\n\nimport type { Meta } from '../meta'\nimport type { P } from '../types'\n\nexport abstract class Context<Data = any> {\n method: string\n params: string[]\n\n static metaRecord: Record<string, Meta> = {}\n static metaDataRecord: Record<string, ReturnType<typeof parseMeta>> = {}\n static instanceRecord: Record<string, any> = {}\n static guardsRecord: Record<string, any> = {}\n static interceptorsRecord: Record<string, any > = {}\n // static serverRecord: Record<string, Context> = {}\n post: ((...params: any) => any)[]\n history = new Phistroy()\n\n constructor(public key: string, public data: Data) {\n }\n\n static registerGuard(key: string, handler: any) {\n Context.guardsRecord[key] = handler\n }\n\n static registerInterceptor(key: string, handler: any) {\n Context.interceptorsRecord[key] = handler\n }\n\n async useGuard(guards: string[], isMerge = false) {\n for (const guard of guards) {\n if (this.history.record(guard, 'guard')) {\n if (!(guard in Context.guardsRecord))\n throw new FrameworkException(`can't find guard named ${guard}`)\n if (!await Context.guardsRecord[guard](this.data, isMerge))\n throw new ForbiddenException(`Guard exception--${guard}`)\n }\n }\n }\n\n async useInterceptor(interceptors: string[], isMerge = false) {\n const ret = []\n for (const interceptor of interceptors) {\n if (this.history.record(interceptor, 'interceptor')) {\n if (!(interceptor in Context.interceptorsRecord))\n throw new FrameworkException(`can't find interceptor named ${interceptor}`)\n const post = await Context.interceptorsRecord[interceptor](this.data, isMerge)\n if (post)\n ret.push(post)\n }\n }\n this.post = ret\n }\n\n async usePost(data: any) {\n if (!this.post)\n return data\n for (const cb of this.post)\n data = (await cb(data)) | data\n\n return data\n }\n}\n\nexport function addGuard(key: string, handler: P.Guard) {\n Context.registerGuard(key, handler)\n}\n\nexport function addInterceptor(key: string, handler: P.Interceptor) {\n Context.registerInterceptor(key, handler)\n}\nexport function getInstance(tag: string) {\n return Context.instanceRecord[tag]\n}\n\nexport function parseMeta(meta: Meta) {\n const { data: { params, guards, interceptors, middlewares }, reflect, handlers } = meta\n return {\n guards,\n reflect,\n interceptors,\n middlewares,\n handlers,\n params: params.map((param) => {\n const { type, key, validate } = param\n return { type, key, validate }\n }),\n }\n}\n","import type { RequestHandler } from 'express'\nimport { defaultPipe } from '../pipe'\nimport { serverFilter } from '../filter'\nimport { FrameworkException } from '../exception'\nimport type { P, ServerCtx, ServerFilter, ServerMergeCtx } from '../types'\nimport { Context } from './base'\n\nexport class ServerContext extends Context<ServerCtx | ServerMergeCtx > {\n static pipe = defaultPipe\n static filter = serverFilter\n static middlewareRecord: Record<string, (...params: any) => any> = {}\n static useMiddleware(middlewares: string[]) {\n return middlewares.map((m) => {\n if (!(m in ServerContext.middlewareRecord))\n throw new FrameworkException(`can't find middleware named ${m}`)\n return ServerContext.middlewareRecord[m]\n })\n }\n\n async usePipe(args: { arg: any; validate?: boolean }[], reflect: any[]) {\n return ServerContext.pipe.transform?.(args, reflect, this.data)\n }\n\n static useFilter(arg: any, data: ServerCtx | ServerMergeCtx) {\n return ServerContext.filter(arg, data)\n }\n\n useFilter(arg: any) {\n return ServerContext.filter(arg, this.data)\n }\n}\n\nexport function addMiddleware(key: string, handler: RequestHandler) {\n ServerContext.middlewareRecord[key] = handler\n}\n\nexport function useServerPipe(pipe: P.Pipe) {\n ServerContext.pipe = pipe\n}\nexport function useServerFilter(filter: ServerFilter) {\n ServerContext.filter = filter\n}\n","import type { Request, Response } from 'express'\nimport type { Events } from 'phecda-core'\nimport type { Meta } from './meta'\nimport type { HttpException } from './exception'\nexport type Construct<T = any> = new (...args: any[]) => T\n\nexport interface Emitter {\n on<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n once<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n off<N extends keyof Events>(eventName: N, cb: (args: Events[N]) => void): void\n removeAllListeners<N extends keyof Events>(eventName: N): void\n emit<N extends keyof Events>(eventName: N, param: Events[N]): void\n}\n\nexport type RequestType = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head'\n\nexport type MergeType = <R extends Promise<any>[]> (...args: R) => { [K in keyof R]: Awaited<R[K]> }\n\nexport interface ServerMergeCtx {\n request: Request\n response: Response\n meta: Record<string, Meta>\n isMerge: true\n tags?: string[]\n}\n\nexport interface ServerCtx {\n request: Request\n response: Response\n meta: Meta\n}\nexport interface BaseError {\n error: true\n status: number\n}\nexport type ServerFilter<E extends HttpException = any> = (err: E | Error, ctx: ServerMergeCtx | ServerCtx) => any\n\nexport class Base {\n context: ServerMergeCtx | ServerCtx\n}\n\nexport namespace P{\n export interface Error extends BaseError { message: string; description: string}\n\n export type ResOrErr<R > = { [K in keyof R]: Awaited<R[K]> | Error }\n\n export type Res<T> = T\n export type Guard = ((ctx: ServerCtx, isMerge?: false) => Promise<boolean> | boolean) | ((ctx: ServerMergeCtx, isMerge?: true) => Promise<boolean> | boolean)\n export type Interceptor = ((ctx: ServerCtx, isMerge?: false) => any) | ((ctx: ServerMergeCtx, isMerge?: true) => any)\n export interface Handler {\n error?: (arg: any) => void\n }\n export interface Meta {\n route?: {\n type: RequestType\n route: string\n }\n // mq?: {\n // queue: string\n // routeKey: string\n // options: amqplib.Options.Consume\n\n // }\n define?: any\n header: Record<string, string>\n params: { type: string; index: number; key: string; validate?: boolean }[]\n guards: string[]\n interceptors: string[]\n middlewares: string[]\n method: string\n name: string\n tag: string\n }\n export interface Pipe {\n transform(args: { arg: any; validate?: boolean }[], reflect: any[], ctx: ServerCtx | ServerMergeCtx): Promise<any[]>\n }\n\n}\n","import pc from 'picocolors'\nexport const isUndefined = (obj: any): obj is undefined =>\n typeof obj === 'undefined'\nexport const isNil = (obj: any): obj is null | undefined =>\n isUndefined(obj) || obj === null\n\nexport const isObject = (fn: any): fn is object =>\n !isNil(fn) && typeof fn === 'object'\n\nexport function warn(msg: string) {\n console.warn(`${pc.magenta('[phecda-server]')} ${pc.yellow(msg)}`)\n}\n","import type { ServerCtx, ServerMergeCtx } from './types'\n\nexport function isMerge(data: ServerCtx | ServerMergeCtx): data is ServerMergeCtx {\n return !!(data as ServerMergeCtx).isMerge\n}\n\nexport function resolveDep(ret: any, key: string) {\n if (key)\n return ret?.[key]\n return ret\n}\n","export const SERIES_SYMBOL = '__symbol_series__'\nexport const MERGE_SYMBOL = '__symbol_req__'\n","import type { Express, Router } from 'express'\nimport { Context, ServerContext, parseMeta } from '../context'\nimport { isObject } from '../utils'\nimport { resolveDep } from '../helper'\nimport { MERGE_SYMBOL, SERIES_SYMBOL } from '../common'\nimport type { Factory } from '../core'\nimport { BadRequestException } from '../exception'\nimport type { Meta } from '../meta'\nimport type { ServerMergeCtx } from '../types'\n\nexport interface Options {\n/**\n * 专用路由的值,默认为/__PHECDA_SERVER__,处理phecda-client发出的合并请求\n */\n route?: string\n /**\n * 全局守卫\n */\n globalGuards?: string[]\n /**\n * 全局拦截器\n */\n globalInterceptors?: string[]\n /**\n * 专用路由的中间件(work for merge request),全局中间件请在bindApp以外设置\n */\n middlewares?: string[]\n}\n\nexport function bindApp(app: Express | Router, { meta, moduleMap }: Awaited<ReturnType<typeof Factory>>, options: Options = {}) {\n const { globalGuards, globalInterceptors, route, middlewares: proMiddle } = { route: '/__PHECDA_SERVER__', globalGuards: [], globalInterceptors: [], middlewares: [], ...options } as Required<Options>\n const methodMap = {} as Record<string, (...args: any[]) => any>\n const contextMeta = {} as Record<string, Meta>\n (app as Express).post(route, (req, _res, next) => {\n (req as any)[MERGE_SYMBOL] = true\n next()\n }, ...ServerContext.useMiddleware(proMiddle), async (req, res) => {\n const { body: { category, data } } = req\n\n const contextData = {\n request: req,\n response: res,\n meta: contextMeta,\n isMerge: true,\n } as unknown as ServerMergeCtx\n\n if (!Array.isArray(data))\n return res.json(await ServerContext.useFilter(new BadRequestException('data format should be an array'), contextData))\n\n if (category !== 'series' && category !== 'parallel')\n return res.json(await ServerContext.useFilter(new BadRequestException('category should be \\'parallel\\' or \\'series\\''), contextData))\n\n contextData.tags = data.map((item: any) => item.tag)\n\n const context = new ServerContext(route, contextData)\n const ret = [] as any[]\n try {\n const mergeGuards = new Set([...globalGuards])\n const mergeInterceptors = new Set([...globalInterceptors])\n\n data.forEach(({ tag }) => {\n const {\n guards,\n interceptors,\n } = Context.metaDataRecord[tag]\n guards.forEach(guard => mergeGuards.add(guard))\n interceptors.forEach(intercept => mergeInterceptors.add(intercept))\n })\n await context.useGuard([...mergeGuards], true)\n await context.useInterceptor([...mergeInterceptors], true)\n\n if (category === 'series') {\n for (const item of data) {\n const { tag } = item\n const [name] = tag.split('-')\n const {\n reflect,\n params,\n } = Context.metaDataRecord[tag]\n const instance = moduleMap.get(name)\n\n try {\n if (!params)\n throw new BadRequestException(`\"${tag}\" doesn't exist`)\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n const arg = resolveDep(item[type], key)\n if (typeof arg === 'string' && arg.startsWith(SERIES_SYMBOL)) {\n const [, index, argKey] = arg.split('@')\n return { arg: resolveDep(ret[Number(index)], argKey || key), validate }\n }\n\n return { arg, validate }\n }), reflect) as any\n instance.context = contextData\n\n ret.push(await methodMap[tag](...args))\n }\n catch (e: any) {\n const m = Context.metaRecord[tag]\n m.handlers.forEach(handler => handler.error?.(e))\n ret.push(await context.useFilter(e))\n }\n }\n return res.json(await context.usePost(ret))\n }\n if (category === 'parallel') {\n return Promise.all(data.map((item: any) => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n const { tag } = item\n const [name] = tag.split('-')\n const {\n reflect,\n params,\n handlers,\n } = Context.metaDataRecord[tag]\n\n const instance = moduleMap.get(name)\n\n try {\n if (!params)\n throw new BadRequestException(`\"${tag}\" doesn't exist`)\n\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n const arg = resolveDep(item[type], key)\n return { arg, validate }\n }), reflect) as any\n instance.context = contextData\n resolve(await methodMap[tag](...args))\n }\n catch (e: any) {\n handlers.forEach(handler => handler.error?.(e))\n resolve(await context.useFilter(e))\n }\n })\n })).then(async (ret) => {\n res.json(await context.usePost(ret))\n })\n }\n }\n catch (e) {\n const err = await context.useFilter(e)\n res.status(err.status).json(err)\n }\n })\n for (const i of meta) {\n const { name, method, route, header, tag } = i.data\n const instance = moduleMap.get(tag)!\n const methodTag = `${tag}-${method}`\n contextMeta[methodTag] = i\n Context.metaRecord[methodTag] = i\n let {\n guards,\n reflect,\n interceptors,\n params,\n handlers,\n middlewares,\n } = Context.metaDataRecord[methodTag] ? Context.metaDataRecord[methodTag] : (Context.metaDataRecord[methodTag] = parseMeta(i))\n\n guards = [...globalGuards!, ...guards]\n interceptors = [...globalInterceptors!, ...interceptors]\n\n const handler = instance[method].bind(instance)\n methodMap[methodTag] = handler\n Context.instanceRecord[name] = instance\n if (route) {\n (app as Express)[route.type](route.route, ...ServerContext.useMiddleware(middlewares), async (req, res) => {\n const contextData = {\n request: req,\n meta: i,\n response: res,\n }\n const context = new ServerContext(methodTag, contextData)\n\n try {\n for (const name in header)\n res.set(name, header[name])\n await context.useGuard(guards)\n await context.useInterceptor(interceptors)\n const args = await context.usePipe(params.map(({ type, key, validate }) => {\n return { arg: resolveDep((req as any)[type], key), validate }\n }), reflect)\n instance.context = contextData\n\n const ret = await context.usePost(await handler(...args))\n if (isObject(ret))\n res.json(ret)\n else\n res.send(String(ret))\n }\n catch (e: any) {\n handlers.forEach(handler => handler.error?.(e))\n const err = await context.useFilter(e)\n res.status(err.status).json(err)\n }\n })\n }\n }\n}\n","import 'reflect-metadata'\nimport fs from 'fs'\nimport EventEmitter from 'node:events'\nimport type { Phecda } from 'phecda-core'\nimport { getExposeKey, getHandler, getState, injectProperty, registerAsync } from 'phecda-core'\nimport type { Construct, Emitter, P } from './types'\nimport { Meta } from './meta'\nimport { warn } from './utils'\n// TODO: support both emitter types and origin emitter type in future\nexport const emitter: Emitter = new EventEmitter() as any\n\nexport async function Factory(Modules: (new (...args: any) => any)[]) {\n const moduleMap = new Map<string, InstanceType<Construct>>()\n const meta: Meta[] = []\n injectProperty('watcher', ({ eventName, instance, key, options }: { eventName: string; instance: any; key: string; options?: { once: boolean } }) => {\n const fn = typeof instance[key] === 'function' ? instance[key].bind(instance) : (v: any) => instance[key] = v\n\n if (options?.once)\n (emitter as any).once(eventName, fn)\n\n else\n (emitter as any).on(eventName, fn)\n })\n\n for (const Module of Modules)\n await buildNestModule(Module, moduleMap, meta)\n\n return { moduleMap, meta, output: (p = 'pmeta.js') => fs.writeFileSync(p, JSON.stringify(meta.map(item => item.data))) }\n}\n\nexport const constructorMap = new Map() // just for warn\n\nasync function buildNestModule(Module: Construct, map: Map<string, InstanceType<Construct>>, meta: Meta[]) {\n const paramtypes = getParamtypes(Module) as Construct[]\n let instance: InstanceType<Construct>\n const tag = Module.prototype?.__TAG__ || Module.name\n\n if (map.has(tag)) {\n instance = map.get(tag)\n if (!instance)\n throw new Error(`exist Circular-Dependency or Multiple modules with the same name/tag [tag] ${tag}--[module] ${Module}`)\n\n if (constructorMap.get(tag) !== Module)\n warn(`Synonym module: Module taged \"${tag}\" has been loaded before, so phecda-server won't load Module \"${Module.name}\"`)\n\n return instance\n }\n map.set(tag, undefined)\n if (paramtypes) {\n const paramtypesInstances = [] as any[]\n for (const i in paramtypes)\n paramtypesInstances[i] = await buildNestModule(paramtypes[i], map, meta)\n\n instance = new Module(...paramtypesInstances)\n }\n else {\n instance = new Module()\n }\n meta.push(...getMetaFromInstance(instance, Module.name, tag))\n await registerAsync(instance)\n map.set(tag, instance)\n constructorMap.set(tag, Module)\n return instance\n}\n\nfunction getMetaFromInstance(instance: Phecda, name: string, tag: string) {\n const vars = getExposeKey(instance).filter(item => item !== '__CLASS')\n const baseState = (getState(instance, '__CLASS') || {}) as P.Meta\n initState(baseState)\n\n return vars.map((i) => {\n const meta = {} as P.Meta\n const state = (getState(instance, i) || {}) as P.Meta\n initState(state)\n if (state.route) {\n meta.route = {\n route: (baseState.route?.route || '') + (state.route.route),\n type: state.route.type,\n }\n }\n\n meta.name = name\n meta.tag = tag\n meta.method = i as string\n const params = [] as any[]\n for (const i of state.params || []) {\n params.unshift(i)\n if (i.index === 0)\n break\n }\n meta.params = params\n meta.define = { ...baseState.define, ...state.define }\n meta.header = { ...baseState.header, ...state.header }\n meta.middlewares = [...new Set([...baseState.middlewares, ...state.middlewares])]\n meta.guards = [...new Set([...baseState.guards, ...state.guards])]\n meta.interceptors = [...new Set([...baseState.interceptors, ...state.interceptors])]\n\n return new Meta(meta as unknown as P.Meta, getHandler(instance, i), getParamtypes(instance, i as string) || [])\n })\n}\n\nfunction getParamtypes(Module: any, key?: string | symbol) {\n return Reflect.getMetadata('design:paramtypes', Module, key!)\n}\n\nfunction initState(state: any) {\n if (!state.define)\n state.define = {}\n if (!state.header)\n state.header = {}\n if (!state.middlewares)\n state.middlewares = []\n if (!state.guards)\n state.guards = []\n if (!state.interceptors)\n state.interceptors = []\n}\n","import type { P } from './types'\n\nexport class Meta {\n constructor(public data: P.Meta, public handlers: P.Handler[], public reflect: any[]) {\n\n }\n}\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function Header(name: string, value: string) {\n return (target: any, k: PropertyKey) => {\n setModelVar(target, k)\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.header)\n state.header = {}\n\n state.header[name] = value\n setState(target, k, state)\n }\n}\n\nexport function Define(key: string, value: any) {\n return (target: any, k?: PropertyKey) => {\n if (!k) {\n k = '__CLASS'\n target = target.prototype\n }\n\n setModelVar(target, k)\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.define)\n state.define = {}\n\n state.define[key] = value\n setState(target, k, state)\n }\n}\n\nexport * from './param'\nexport * from './route'\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function BaseParam(type: string, key: string, validate?: any): any {\n return (target: any, k: PropertyKey, index: number) => {\n setModelVar(target, k)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(k) || {}\n if (!state.params)\n state.params = []\n\n state.params.push({ type, key, index, validate })\n setState(target, k, state)\n }\n}\n\nexport function Body(key = '', pipeOpts?: any) {\n return BaseParam('body', key, pipeOpts)\n}\nexport function Query(key = '', pipeOpts?: any) {\n return BaseParam('query', key, pipeOpts)\n}\nexport function Param(key: string, pipeOpts?: any) {\n return BaseParam('params', key, pipeOpts)\n}\n","import { setModelVar, setState } from 'phecda-core'\n\nexport function Route(route: string, type?: string): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n state.route = {\n route,\n type,\n }\n setState(target, key, state)\n }\n}\n\nexport function Get(route: string) {\n return Route(route, 'get')\n}\n\nexport function Post(route: string) {\n return Route(route, 'post')\n}\nexport function Put(route: string) {\n return Route(route, 'put')\n}\n\nexport function Patch(route: string) {\n return Route(route, 'patch')\n}\nexport function Delete(route: string) {\n return Route(route, 'delete')\n}\n\nexport function Controller(route: string) {\n return Route(route)\n}\n\nexport function Guard(...guards: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.guards)\n state.guards = []\n state.guards.push(...guards)\n setState(target, key, state)\n }\n}\n\nexport function Middle(...middlewares: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.middlewares)\n state.middlewares = []\n state.middlewares.push(...middlewares)\n setState(target, key, state)\n }\n}\n\nexport function Interceptor(...interceptors: string[]): any {\n return (target: any, key?: PropertyKey) => {\n if (!key)\n key = '__CLASS'\n target = key === '__CLASS' ? target.prototype : target\n\n setModelVar(target, key)\n\n const state = target._namespace.__STATE_NAMESPACE__.get(key) || {}\n if (!state.interceptors)\n state.interceptors = []\n state.interceptors.push(...interceptors)\n setState(target, key, state)\n }\n}\n","export * from './context'\nexport * from './types'\nexport * from './server/express'\nexport * from './core'\nexport * from './decorators'\nexport * from './exception'\nexport * from './pipe'\nexport * from './meta'\nexport * from 'phecda-core'\nexport * from './helper'\nexport * from './common'\n"],"mappings":"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","names":["isPhecda","plainToClass","HttpException","Error","message","status","description","constructor","data","error","ValidateException","HttpException","constructor","message","defaultPipe","transform","args","reflect","i","validate","arg","isPhecda","ret","plainToClass","err","length","ValidateException","data","Number","Boolean","includes","Object","is","NaN","map","item","UndefinedException","HttpException","constructor","message","ForbiddenException","HttpException","constructor","message","BadRequestException","HttpException","constructor","message","NotFoundException","HttpException","constructor","message","ConflictException","HttpException","constructor","message","BadGatewayException","HttpException","constructor","message","InvalidInputException","HttpException","constructor","message","UnsupportedMediaTypeException","HttpException","constructor","message","PayloadLargeException","HttpException","constructor","message","TimeoutException","HttpException","constructor","message","UnauthorizedException","HttpException","constructor","message","ServiceUnavailableException","HttpException","constructor","message","FrameworkException","HttpException","constructor","message","serverFilter","e","HttpException","console","error","stack","UndefinedException","message","data","Phistroy","guard","interceptor","record","name","type","includes","push","Context","key","data","method","params","post","history","constructor","Phistroy","registerGuard","handler","guardsRecord","registerInterceptor","interceptorsRecord","useGuard","guards","isMerge","guard","record","FrameworkException","ForbiddenException","useInterceptor","interceptors","ret","interceptor","push","usePost","cb","metaRecord","metaDataRecord","instanceRecord","addGuard","addInterceptor","getInstance","tag","parseMeta","meta","middlewares","reflect","handlers","map","param","type","validate","ServerContext","Context","useMiddleware","middlewares","map","m","middlewareRecord","FrameworkException","usePipe","args","reflect","pipe","transform","data","useFilter","arg","filter","defaultPipe","serverFilter","addMiddleware","key","handler","useServerPipe","useServerFilter","Base","context","pc","isUndefined","obj","isNil","isObject","fn","warn","msg","console","pc","magenta","yellow","isMerge","data","resolveDep","ret","key","SERIES_SYMBOL","MERGE_SYMBOL","bindApp","app","meta","moduleMap","options","globalGuards","globalInterceptors","route","middlewares","proMiddle","methodMap","contextMeta","post","req","_res","next","MERGE_SYMBOL","ServerContext","useMiddleware","res","body","category","data","contextData","request","response","isMerge","Array","isArray","json","useFilter","BadRequestException","tags","map","item","tag","context","ret","mergeGuards","Set","mergeInterceptors","forEach","guards","interceptors","Context","metaDataRecord","guard","add","intercept","useGuard","useInterceptor","name","split","reflect","params","instance","get","args","usePipe","type","key","validate","arg","resolveDep","startsWith","SERIES_SYMBOL","index","argKey","Number","push","e","m","metaRecord","handlers","handler","error","usePost","Promise","all","resolve","then","err","status","i","method","header","methodTag","parseMeta","bind","instanceRecord","set","isObject","send","String","fs","EventEmitter","getExposeKey","getHandler","getState","injectProperty","registerAsync","Meta","data","handlers","reflect","constructor","emitter","EventEmitter","Factory","Modules","moduleMap","Map","meta","injectProperty","eventName","instance","key","options","fn","bind","v","once","on","Module","buildNestModule","output","p","fs","writeFileSync","JSON","stringify","map","item","data","constructorMap","paramtypes","getParamtypes","tag","prototype","__TAG__","name","has","get","Error","warn","set","undefined","paramtypesInstances","i","push","getMetaFromInstance","registerAsync","vars","getExposeKey","filter","baseState","getState","initState","state","route","type","method","params","unshift","index","define","header","middlewares","Set","guards","interceptors","Meta","getHandler","Reflect","getMetadata","setModelVar","setState","setModelVar","setState","BaseParam","type","key","validate","target","k","index","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","params","push","setState","Body","pipeOpts","Query","Param","setModelVar","setState","Route","route","type","target","key","prototype","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","setState","Get","Post","Put","Patch","Delete","Controller","Guard","guards","push","Middle","middlewares","Interceptor","interceptors","Header","name","value","target","k","setModelVar","state","_namespace","__STATE_NAMESPACE__","get","header","setState","Define","key","prototype","define"]}
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "phecda-server",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.2",
|
|
4
4
|
"description": "provide express middlewares, `nestjs` format",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"ps": "bin/cli.js"
|
|
10
|
+
},
|
|
8
11
|
"keywords": [
|
|
9
12
|
"server",
|
|
10
13
|
"express",
|
|
@@ -13,7 +16,8 @@
|
|
|
13
16
|
],
|
|
14
17
|
"author": "",
|
|
15
18
|
"files": [
|
|
16
|
-
"dist"
|
|
19
|
+
"dist",
|
|
20
|
+
"bin"
|
|
17
21
|
],
|
|
18
22
|
"license": "MIT",
|
|
19
23
|
"devDependencies": {
|
|
@@ -25,7 +29,7 @@
|
|
|
25
29
|
"vite": "^4.0.0"
|
|
26
30
|
},
|
|
27
31
|
"dependencies": {
|
|
28
|
-
"
|
|
32
|
+
"picocolors": "^1.0.0",
|
|
29
33
|
"reflect-metadata": "^0.1.13",
|
|
30
34
|
"phecda-core": "2.0.0"
|
|
31
35
|
},
|