@lsby/net-core 0.13.4 → 0.13.6

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.
@@ -120,7 +120,8 @@ type JSON\u63A5\u53E3\u8BA1\u7B97\u7ED3\u679C = \u662F\u5426\u4E3A\u6B63\u5219 e
120
120
  json: 'json' extends keyof jsonInput ? jsonInput['json'] : never
121
121
  query: 'query' extends keyof getInput ? getInput['query'] : never
122
122
  urlencoded: 'urlencoded' extends keyof urlEncodedInput ? urlEncodedInput['urlencoded'] : never
123
- form: 'form' extends keyof formDataInput ? formDataInput['form'] : never
123
+ // form: 'form' extends keyof formDataInput ? formDataInput['form'] : never
124
+ form: FormData
124
125
  }
125
126
  errorOutput: jsonErrorOutput
126
127
  successOutput: jsonSuccessOutput
@@ -125,7 +125,8 @@ type JSON\u63A5\u53E3\u8BA1\u7B97\u7ED3\u679C = \u662F\u5426\u4E3A\u6B63\u5219 e
125
125
  json: 'json' extends keyof jsonInput ? jsonInput['json'] : never
126
126
  query: 'query' extends keyof getInput ? getInput['query'] : never
127
127
  urlencoded: 'urlencoded' extends keyof urlEncodedInput ? urlEncodedInput['urlencoded'] : never
128
- form: 'form' extends keyof formDataInput ? formDataInput['form'] : never
128
+ // form: 'form' extends keyof formDataInput ? formDataInput['form'] : never
129
+ form: FormData
129
130
  }
130
131
  errorOutput: jsonErrorOutput
131
132
  successOutput: jsonSuccessOutput
@@ -120,7 +120,8 @@ type JSON\u63A5\u53E3\u8BA1\u7B97\u7ED3\u679C = \u662F\u5426\u4E3A\u6B63\u5219 e
120
120
  json: 'json' extends keyof jsonInput ? jsonInput['json'] : never
121
121
  query: 'query' extends keyof getInput ? getInput['query'] : never
122
122
  urlencoded: 'urlencoded' extends keyof urlEncodedInput ? urlEncodedInput['urlencoded'] : never
123
- form: 'form' extends keyof formDataInput ? formDataInput['form'] : never
123
+ // form: 'form' extends keyof formDataInput ? formDataInput['form'] : never
124
+ form: FormData
124
125
  }
125
126
  errorOutput: jsonErrorOutput
126
127
  successOutput: jsonSuccessOutput
@@ -125,7 +125,8 @@ type JSON\u63A5\u53E3\u8BA1\u7B97\u7ED3\u679C = \u662F\u5426\u4E3A\u6B63\u5219 e
125
125
  json: 'json' extends keyof jsonInput ? jsonInput['json'] : never
126
126
  query: 'query' extends keyof getInput ? getInput['query'] : never
127
127
  urlencoded: 'urlencoded' extends keyof urlEncodedInput ? urlEncodedInput['urlencoded'] : never
128
- form: 'form' extends keyof formDataInput ? formDataInput['form'] : never
128
+ // form: 'form' extends keyof formDataInput ? formDataInput['form'] : never
129
+ form: FormData
129
130
  }
130
131
  errorOutput: jsonErrorOutput
131
132
  successOutput: jsonSuccessOutput
@@ -475,30 +475,43 @@ function \u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(\u6570\u636E) {
475
475
 
476
476
  // src/plugin/form.ts
477
477
  var \u9519\u8BEF\u7C7B\u578B\u63CF\u8FF02 = import_zod2.z.object({ code: import_zod2.z.literal(400), data: import_zod2.z.string() });
478
+ var \u6587\u4EF6Schema = import_zod2.z.object({
479
+ fieldname: import_zod2.z.string(),
480
+ originalname: import_zod2.z.string(),
481
+ encoding: import_zod2.z.string(),
482
+ mimetype: import_zod2.z.string(),
483
+ size: import_zod2.z.number(),
484
+ buffer: import_zod2.z.instanceof(Buffer)
485
+ });
478
486
  var Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6 = class _Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6 extends \u63D2\u4EF6 {
479
487
  constructor(t, opt) {
480
- super(\u9519\u8BEF\u7C7B\u578B\u63CF\u8FF02, import_zod2.z.object({ form: t }), async (req, res, \u9644\u52A0\u53C2\u6570) => {
481
- let log = \u9644\u52A0\u53C2\u6570.log.extend(_Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6.name);
482
- let upload = (0, import_multer.default)(opt);
483
- let multerMiddleware = upload.any();
484
- await new Promise(
485
- (pRes, rej) => multerMiddleware(req, res, (err) => {
486
- if (err !== null) {
487
- rej(err);
488
- } else {
489
- pRes(null);
490
- }
491
- })
492
- );
493
- await log.debug("\u51C6\u5907\u89E3\u6790 Form \u53C2\u6570\uFF1A%o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(req.body)));
494
- let parseResult = t.safeParse(req.body);
495
- if (parseResult.success === false) {
496
- await log.error("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25\uFF1A%o", JSON.stringify(parseResult.error));
497
- return new import_ts_fp_data3.Left({ code: 400, data: (0, import_node_util.format)("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25: %o", JSON.stringify(parseResult.error)) });
488
+ super(
489
+ \u9519\u8BEF\u7C7B\u578B\u63CF\u8FF02,
490
+ import_zod2.z.object({ form: import_zod2.z.object({ data: t, files: import_zod2.z.array(\u6587\u4EF6Schema) }) }),
491
+ async (req, res, \u9644\u52A0\u53C2\u6570) => {
492
+ let log = \u9644\u52A0\u53C2\u6570.log.extend(_Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6.name);
493
+ let upload = (0, import_multer.default)(opt);
494
+ let multerMiddleware = upload.any();
495
+ await new Promise(
496
+ (pRes, rej) => multerMiddleware(req, res, (err) => {
497
+ if (err === null || typeof err === "undefined") {
498
+ pRes(null);
499
+ } else {
500
+ rej(err);
501
+ }
502
+ })
503
+ );
504
+ await log.debug("\u51C6\u5907\u89E3\u6790 Form \u53C2\u6570\uFF1A%o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(req.body)));
505
+ let parseResult = t.safeParse(req.body);
506
+ if (parseResult.success === false) {
507
+ await log.error("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25\uFF1A%o", JSON.stringify(parseResult.error));
508
+ return new import_ts_fp_data3.Left({ code: 400, data: (0, import_node_util.format)("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25: %o", JSON.stringify(parseResult.error)) });
509
+ }
510
+ let files = req.files ?? [];
511
+ await log.debug("\u6210\u529F\u89E3\u6790 Form \u53C2\u6570\u548C\u6587\u4EF6");
512
+ return new import_ts_fp_data3.Right({ form: { data: parseResult.data, files } });
498
513
  }
499
- await log.debug("\u6210\u529F\u89E3\u6790 Form \u53C2\u6570");
500
- return new import_ts_fp_data3.Right({ form: parseResult.data });
501
- });
514
+ );
502
515
  }
503
516
  };
504
517
 
@@ -729,7 +742,7 @@ var \u5E38\u7528\u63A5\u53E3\u8FD4\u56DE\u5668 = class _\u5E38\u7528\u63A5\u53E3
729
742
  void log.error("\u9519\u8BEF: %o", JSON.stringify(\u6821\u9A8C\u7ED3\u679C.error));
730
743
  throw new Error(`\u7ED3\u679C\u65E0\u6CD5\u901A\u8FC7\u6821\u9A8C`);
731
744
  }
732
- let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u5B9E\u9645\u6570\u636E };
745
+ let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u6821\u9A8C\u7ED3\u679C.data };
733
746
  void log.debug("\u6700\u7EC8\u7ED3\u679C: %o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(\u8FD4\u56DE\u6570\u636E)));
734
747
  res.send(\u8FD4\u56DE\u6570\u636E);
735
748
  break;
@@ -743,7 +756,7 @@ var \u5E38\u7528\u63A5\u53E3\u8FD4\u56DE\u5668 = class _\u5E38\u7528\u63A5\u53E3
743
756
  void log.error("\u9519\u8BEF: %o", JSON.stringify(\u6821\u9A8C\u7ED3\u679C.error));
744
757
  throw new Error(`\u7ED3\u679C\u65E0\u6CD5\u901A\u8FC7\u6821\u9A8C`);
745
758
  }
746
- let \u8FD4\u56DE\u6570\u636E = { status: "success", data: \u5B9E\u9645\u6570\u636E };
759
+ let \u8FD4\u56DE\u6570\u636E = { status: "success", data: \u6821\u9A8C\u7ED3\u679C.data };
747
760
  void log.debug("\u6700\u7EC8\u7ED3\u679C: %o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(\u8FD4\u56DE\u6570\u636E)));
748
761
  res.send(\u8FD4\u56DE\u6570\u636E);
749
762
  break;
@@ -800,7 +813,7 @@ var \u6587\u4EF6\u6D41\u5F0F\u4E0B\u8F7D\u8FD4\u56DE\u5668 = class _\u6587\u4EF6
800
813
  void log.error("\u9519\u8BEF: %o", JSON.stringify(\u6821\u9A8C\u7ED3\u679C.error));
801
814
  throw new Error(`\u7ED3\u679C\u65E0\u6CD5\u901A\u8FC7\u6821\u9A8C`);
802
815
  }
803
- let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u5B9E\u9645\u6570\u636E };
816
+ let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u6821\u9A8C\u7ED3\u679C.data };
804
817
  void log.debug("\u6700\u7EC8\u7ED3\u679C: %o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(\u8FD4\u56DE\u6570\u636E)));
805
818
  res.send(\u8FD4\u56DE\u6570\u636E);
806
819
  break;
@@ -18,7 +18,7 @@ type 接口方法类型 = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head' |
18
18
  *
19
19
  * 一个HTTP接口, 它由以下部分组成:
20
20
  * - 请求路径: 例如 /api/xxx 或正则表达式 /^\/api\/.+/
21
- * - 请求方法: get post
21
+ * - 请求方法: 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head' | 'options'
22
22
  * - 接口逻辑: 接口的实际逻辑行为, 见 {@link 接口逻辑}
23
23
  * - 接口返回器: 决定如何将接口逻辑的返回值返回给客户端的逻辑, 见 {@link 接口返回器}
24
24
  *
@@ -23,7 +23,7 @@ type 接口逻辑附加参数类型 = Record<string, any>;
23
23
  * - 参数: 当前接口逻辑的插件提供的数据
24
24
  * - 逻辑附加参数: 上游接口逻辑提供的数据和能力
25
25
  * - 请求附加参数: 框架提供的信息, 例如请求id
26
- * - 业务逻辑应当返回 Either 值, 表示执行成功还是失败
26
+ * - 业务逻辑应当返回Either值, 表示执行成功还是失败
27
27
  * - 业务逻辑应当尽可能是纯的, 便于单独测试和调用
28
28
  *
29
29
  * #### 两用性
@@ -31,7 +31,7 @@ type 接口逻辑附加参数类型 = Record<string, any>;
31
31
  * 接口逻辑可以被两种不同的方法使用:
32
32
  * - 组成接口: 将其作为 {@link 接口} 的一部分.
33
33
  * 此时, 插件会被执行, 插件将从HTTP上下文中获得信息, 提供给业务逻辑.
34
- * - 内部调用: 使用 .实现 方法, 在其他代码中调用接口逻辑.
34
+ * - 内部调用: 使用`.调用`方法, 在其他代码中调用接口逻辑.
35
35
  * 此时, 插件会被跳过, 不会从HTTP上下文中获取任何信息(因为根本就不存在HTTP上下文).
36
36
  * 而本来由插件提供的信息将改为需要通过调用参数提供(是类型安全的).
37
37
  * 这意味着大部分接口逻辑的实现是纯的, 并且可以独立被调用, 非常容易被测试
@@ -77,30 +77,43 @@ var \u63D2\u4EF6 = class {
77
77
 
78
78
  // src/plugin/form.ts
79
79
  var \u9519\u8BEF\u7C7B\u578B\u63CF\u8FF0 = import_zod.z.object({ code: import_zod.z.literal(400), data: import_zod.z.string() });
80
+ var \u6587\u4EF6Schema = import_zod.z.object({
81
+ fieldname: import_zod.z.string(),
82
+ originalname: import_zod.z.string(),
83
+ encoding: import_zod.z.string(),
84
+ mimetype: import_zod.z.string(),
85
+ size: import_zod.z.number(),
86
+ buffer: import_zod.z.instanceof(Buffer)
87
+ });
80
88
  var Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6 = class _Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6 extends \u63D2\u4EF6 {
81
89
  constructor(t, opt) {
82
- super(\u9519\u8BEF\u7C7B\u578B\u63CF\u8FF0, import_zod.z.object({ form: t }), async (req, res, \u9644\u52A0\u53C2\u6570) => {
83
- let log = \u9644\u52A0\u53C2\u6570.log.extend(_Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6.name);
84
- let upload = (0, import_multer.default)(opt);
85
- let multerMiddleware = upload.any();
86
- await new Promise(
87
- (pRes, rej) => multerMiddleware(req, res, (err) => {
88
- if (err !== null) {
89
- rej(err);
90
- } else {
91
- pRes(null);
92
- }
93
- })
94
- );
95
- await log.debug("\u51C6\u5907\u89E3\u6790 Form \u53C2\u6570\uFF1A%o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(req.body)));
96
- let parseResult = t.safeParse(req.body);
97
- if (parseResult.success === false) {
98
- await log.error("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25\uFF1A%o", JSON.stringify(parseResult.error));
99
- return new import_ts_fp_data.Left({ code: 400, data: (0, import_node_util.format)("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25: %o", JSON.stringify(parseResult.error)) });
90
+ super(
91
+ \u9519\u8BEF\u7C7B\u578B\u63CF\u8FF0,
92
+ import_zod.z.object({ form: import_zod.z.object({ data: t, files: import_zod.z.array(\u6587\u4EF6Schema) }) }),
93
+ async (req, res, \u9644\u52A0\u53C2\u6570) => {
94
+ let log = \u9644\u52A0\u53C2\u6570.log.extend(_Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6.name);
95
+ let upload = (0, import_multer.default)(opt);
96
+ let multerMiddleware = upload.any();
97
+ await new Promise(
98
+ (pRes, rej) => multerMiddleware(req, res, (err) => {
99
+ if (err === null || typeof err === "undefined") {
100
+ pRes(null);
101
+ } else {
102
+ rej(err);
103
+ }
104
+ })
105
+ );
106
+ await log.debug("\u51C6\u5907\u89E3\u6790 Form \u53C2\u6570\uFF1A%o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(req.body)));
107
+ let parseResult = t.safeParse(req.body);
108
+ if (parseResult.success === false) {
109
+ await log.error("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25\uFF1A%o", JSON.stringify(parseResult.error));
110
+ return new import_ts_fp_data.Left({ code: 400, data: (0, import_node_util.format)("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25: %o", JSON.stringify(parseResult.error)) });
111
+ }
112
+ let files = req.files ?? [];
113
+ await log.debug("\u6210\u529F\u89E3\u6790 Form \u53C2\u6570\u548C\u6587\u4EF6");
114
+ return new import_ts_fp_data.Right({ form: { data: parseResult.data, files } });
100
115
  }
101
- await log.debug("\u6210\u529F\u89E3\u6790 Form \u53C2\u6570");
102
- return new import_ts_fp_data.Right({ form: parseResult.data });
103
- });
116
+ );
104
117
  }
105
118
  };
106
119
  // Annotate the CommonJS export names for ESM import in node:
@@ -22,15 +22,43 @@ declare let 错误类型描述: z.ZodObject<{
22
22
  code: 400;
23
23
  data: string;
24
24
  }>;
25
+ declare let 文件Schema: z.ZodObject<{
26
+ fieldname: z.ZodString;
27
+ originalname: z.ZodString;
28
+ encoding: z.ZodString;
29
+ mimetype: z.ZodString;
30
+ size: z.ZodNumber;
31
+ buffer: z.ZodType<Buffer<ArrayBufferLike>, z.ZodTypeDef, Buffer<ArrayBufferLike>>;
32
+ }, "strip", z.ZodTypeAny, {
33
+ fieldname: string;
34
+ originalname: string;
35
+ encoding: string;
36
+ mimetype: string;
37
+ size: number;
38
+ buffer: Buffer<ArrayBufferLike>;
39
+ }, {
40
+ fieldname: string;
41
+ originalname: string;
42
+ encoding: string;
43
+ mimetype: string;
44
+ size: number;
45
+ buffer: Buffer<ArrayBufferLike>;
46
+ }>;
25
47
  declare class Form参数解析插件<Result extends z.AnyZodObject> extends __<typeof 错误类型描述, z.ZodObject<{
26
- form: Result;
48
+ form: z.ZodObject<{
49
+ data: Result;
50
+ files: z.ZodArray<typeof 文件Schema>;
51
+ }>;
27
52
  }>> {
28
53
  constructor(t: Result, opt: multer.Options);
29
54
  }
30
55
  type 任意Form参数解析插件 = Form参数解析插件<any>;
31
56
  type 任意Form参数解析插件项 = 任意Form参数解析插件;
32
57
  type 合并Form插件结果<Arr extends Array<____>> = Arr extends [] ? {} : Arr extends [infer x, ...infer xs] ? x extends infer 插件项 ? xs extends Array<____> ? 插件项 extends 任意Form参数解析插件项 ? ________<{
33
- form: _____ts__<插件项>['form'];
58
+ form: {
59
+ data: _____ts__<插件项>['form']['data'];
60
+ files: _____ts__<插件项>['form']['files'];
61
+ };
34
62
  }, 合并Form插件结果<xs>> : 合并Form插件结果<xs> : {} : {} : {};
35
63
  type 计算接口逻辑Form参数<接口逻辑> = 合并Form插件结果<__________<接口逻辑>>;
36
64
 
@@ -79,7 +79,7 @@ var \u5E38\u7528\u63A5\u53E3\u8FD4\u56DE\u5668 = class _\u5E38\u7528\u63A5\u53E3
79
79
  void log.error("\u9519\u8BEF: %o", JSON.stringify(\u6821\u9A8C\u7ED3\u679C.error));
80
80
  throw new Error(`\u7ED3\u679C\u65E0\u6CD5\u901A\u8FC7\u6821\u9A8C`);
81
81
  }
82
- let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u5B9E\u9645\u6570\u636E };
82
+ let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u6821\u9A8C\u7ED3\u679C.data };
83
83
  void log.debug("\u6700\u7EC8\u7ED3\u679C: %o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(\u8FD4\u56DE\u6570\u636E)));
84
84
  res.send(\u8FD4\u56DE\u6570\u636E);
85
85
  break;
@@ -93,7 +93,7 @@ var \u5E38\u7528\u63A5\u53E3\u8FD4\u56DE\u5668 = class _\u5E38\u7528\u63A5\u53E3
93
93
  void log.error("\u9519\u8BEF: %o", JSON.stringify(\u6821\u9A8C\u7ED3\u679C.error));
94
94
  throw new Error(`\u7ED3\u679C\u65E0\u6CD5\u901A\u8FC7\u6821\u9A8C`);
95
95
  }
96
- let \u8FD4\u56DE\u6570\u636E = { status: "success", data: \u5B9E\u9645\u6570\u636E };
96
+ let \u8FD4\u56DE\u6570\u636E = { status: "success", data: \u6821\u9A8C\u7ED3\u679C.data };
97
97
  void log.debug("\u6700\u7EC8\u7ED3\u679C: %o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(\u8FD4\u56DE\u6570\u636E)));
98
98
  res.send(\u8FD4\u56DE\u6570\u636E);
99
99
  break;
@@ -73,7 +73,7 @@ var \u6587\u4EF6\u6D41\u5F0F\u4E0B\u8F7D\u8FD4\u56DE\u5668 = class _\u6587\u4EF6
73
73
  void log.error("\u9519\u8BEF: %o", JSON.stringify(\u6821\u9A8C\u7ED3\u679C.error));
74
74
  throw new Error(`\u7ED3\u679C\u65E0\u6CD5\u901A\u8FC7\u6821\u9A8C`);
75
75
  }
76
- let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u5B9E\u9645\u6570\u636E };
76
+ let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u6821\u9A8C\u7ED3\u679C.data };
77
77
  void log.debug("\u6700\u7EC8\u7ED3\u679C: %o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(\u8FD4\u56DE\u6570\u636E)));
78
78
  res.send(\u8FD4\u56DE\u6570\u636E);
79
79
  break;
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  main
4
- } from "../../chunk-J3N2TUYJ.js";
4
+ } from "../../chunk-EZSZ4U6O.js";
5
5
 
6
6
  // src/bin/gen-api-type/bin.ts
7
7
  import { Command } from "commander";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  main
3
- } from "../../chunk-J3N2TUYJ.js";
3
+ } from "../../chunk-EZSZ4U6O.js";
4
4
  export {
5
5
  main
6
6
  };
@@ -0,0 +1,56 @@
1
+ import {
2
+ 递归截断字符串
3
+ } from "./chunk-2CGBESLT.js";
4
+ import {
5
+ 插件
6
+ } from "./chunk-EGIJQJFI.js";
7
+
8
+ // src/plugin/form.ts
9
+ import { Left, Right } from "@lsby/ts-fp-data";
10
+ import multer from "multer";
11
+ import { format } from "util";
12
+ import { z } from "zod";
13
+ var \u9519\u8BEF\u7C7B\u578B\u63CF\u8FF0 = z.object({ code: z.literal(400), data: z.string() });
14
+ var \u6587\u4EF6Schema = z.object({
15
+ fieldname: z.string(),
16
+ originalname: z.string(),
17
+ encoding: z.string(),
18
+ mimetype: z.string(),
19
+ size: z.number(),
20
+ buffer: z.instanceof(Buffer)
21
+ });
22
+ var Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6 = class _Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6 extends \u63D2\u4EF6 {
23
+ constructor(t, opt) {
24
+ super(
25
+ \u9519\u8BEF\u7C7B\u578B\u63CF\u8FF0,
26
+ z.object({ form: z.object({ data: t, files: z.array(\u6587\u4EF6Schema) }) }),
27
+ async (req, res, \u9644\u52A0\u53C2\u6570) => {
28
+ let log = \u9644\u52A0\u53C2\u6570.log.extend(_Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6.name);
29
+ let upload = multer(opt);
30
+ let multerMiddleware = upload.any();
31
+ await new Promise(
32
+ (pRes, rej) => multerMiddleware(req, res, (err) => {
33
+ if (err === null || typeof err === "undefined") {
34
+ pRes(null);
35
+ } else {
36
+ rej(err);
37
+ }
38
+ })
39
+ );
40
+ await log.debug("\u51C6\u5907\u89E3\u6790 Form \u53C2\u6570\uFF1A%o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(req.body)));
41
+ let parseResult = t.safeParse(req.body);
42
+ if (parseResult.success === false) {
43
+ await log.error("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25\uFF1A%o", JSON.stringify(parseResult.error));
44
+ return new Left({ code: 400, data: format("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25: %o", JSON.stringify(parseResult.error)) });
45
+ }
46
+ let files = req.files ?? [];
47
+ await log.debug("\u6210\u529F\u89E3\u6790 Form \u53C2\u6570\u548C\u6587\u4EF6");
48
+ return new Right({ form: { data: parseResult.data, files } });
49
+ }
50
+ );
51
+ }
52
+ };
53
+
54
+ export {
55
+ Form参数解析插件
56
+ };
@@ -37,7 +37,7 @@ var \u5E38\u7528\u63A5\u53E3\u8FD4\u56DE\u5668 = class _\u5E38\u7528\u63A5\u53E3
37
37
  void log.error("\u9519\u8BEF: %o", JSON.stringify(\u6821\u9A8C\u7ED3\u679C.error));
38
38
  throw new Error(`\u7ED3\u679C\u65E0\u6CD5\u901A\u8FC7\u6821\u9A8C`);
39
39
  }
40
- let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u5B9E\u9645\u6570\u636E };
40
+ let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u6821\u9A8C\u7ED3\u679C.data };
41
41
  void log.debug("\u6700\u7EC8\u7ED3\u679C: %o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(\u8FD4\u56DE\u6570\u636E)));
42
42
  res.send(\u8FD4\u56DE\u6570\u636E);
43
43
  break;
@@ -51,7 +51,7 @@ var \u5E38\u7528\u63A5\u53E3\u8FD4\u56DE\u5668 = class _\u5E38\u7528\u63A5\u53E3
51
51
  void log.error("\u9519\u8BEF: %o", JSON.stringify(\u6821\u9A8C\u7ED3\u679C.error));
52
52
  throw new Error(`\u7ED3\u679C\u65E0\u6CD5\u901A\u8FC7\u6821\u9A8C`);
53
53
  }
54
- let \u8FD4\u56DE\u6570\u636E = { status: "success", data: \u5B9E\u9645\u6570\u636E };
54
+ let \u8FD4\u56DE\u6570\u636E = { status: "success", data: \u6821\u9A8C\u7ED3\u679C.data };
55
55
  void log.debug("\u6700\u7EC8\u7ED3\u679C: %o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(\u8FD4\u56DE\u6570\u636E)));
56
56
  res.send(\u8FD4\u56DE\u6570\u636E);
57
57
  break;
@@ -91,7 +91,8 @@ type JSON\u63A5\u53E3\u8BA1\u7B97\u7ED3\u679C = \u662F\u5426\u4E3A\u6B63\u5219 e
91
91
  json: 'json' extends keyof jsonInput ? jsonInput['json'] : never
92
92
  query: 'query' extends keyof getInput ? getInput['query'] : never
93
93
  urlencoded: 'urlencoded' extends keyof urlEncodedInput ? urlEncodedInput['urlencoded'] : never
94
- form: 'form' extends keyof formDataInput ? formDataInput['form'] : never
94
+ // form: 'form' extends keyof formDataInput ? formDataInput['form'] : never
95
+ form: FormData
95
96
  }
96
97
  errorOutput: jsonErrorOutput
97
98
  successOutput: jsonSuccessOutput
@@ -31,7 +31,7 @@ var \u6587\u4EF6\u6D41\u5F0F\u4E0B\u8F7D\u8FD4\u56DE\u5668 = class _\u6587\u4EF6
31
31
  void log.error("\u9519\u8BEF: %o", JSON.stringify(\u6821\u9A8C\u7ED3\u679C.error));
32
32
  throw new Error(`\u7ED3\u679C\u65E0\u6CD5\u901A\u8FC7\u6821\u9A8C`);
33
33
  }
34
- let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u5B9E\u9645\u6570\u636E };
34
+ let \u8FD4\u56DE\u6570\u636E = { status: "fail", data: \u6821\u9A8C\u7ED3\u679C.data };
35
35
  void log.debug("\u6700\u7EC8\u7ED3\u679C: %o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(\u8FD4\u56DE\u6570\u636E)));
36
36
  res.send(\u8FD4\u56DE\u6570\u636E);
37
37
  break;
package/dist/esm/index.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-7OU27OBO.js";
12
12
  import {
13
13
  Form参数解析插件
14
- } from "./chunk-GAL77HPJ.js";
14
+ } from "./chunk-54VXL6NH.js";
15
15
  import {
16
16
  JSON参数解析插件
17
17
  } from "./chunk-PAP3X3RJ.js";
@@ -36,13 +36,13 @@ import {
36
36
  } from "./chunk-GGNRLQAM.js";
37
37
  import {
38
38
  常用接口返回器
39
- } from "./chunk-AG36MLAF.js";
39
+ } from "./chunk-AOZ3QFOM.js";
40
40
  import {
41
41
  自定义接口返回器
42
42
  } from "./chunk-OEABQXPT.js";
43
43
  import {
44
44
  文件流式下载返回器
45
- } from "./chunk-JSMTJQ3K.js";
45
+ } from "./chunk-QRJ6A4DG.js";
46
46
  import {
47
47
  静态文件返回器
48
48
  } from "./chunk-J5BX4WJJ.js";
@@ -18,7 +18,7 @@ type 接口方法类型 = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head' |
18
18
  *
19
19
  * 一个HTTP接口, 它由以下部分组成:
20
20
  * - 请求路径: 例如 /api/xxx 或正则表达式 /^\/api\/.+/
21
- * - 请求方法: get post
21
+ * - 请求方法: 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head' | 'options'
22
22
  * - 接口逻辑: 接口的实际逻辑行为, 见 {@link 接口逻辑}
23
23
  * - 接口返回器: 决定如何将接口逻辑的返回值返回给客户端的逻辑, 见 {@link 接口返回器}
24
24
  *
@@ -23,7 +23,7 @@ type 接口逻辑附加参数类型 = Record<string, any>;
23
23
  * - 参数: 当前接口逻辑的插件提供的数据
24
24
  * - 逻辑附加参数: 上游接口逻辑提供的数据和能力
25
25
  * - 请求附加参数: 框架提供的信息, 例如请求id
26
- * - 业务逻辑应当返回 Either 值, 表示执行成功还是失败
26
+ * - 业务逻辑应当返回Either值, 表示执行成功还是失败
27
27
  * - 业务逻辑应当尽可能是纯的, 便于单独测试和调用
28
28
  *
29
29
  * #### 两用性
@@ -31,7 +31,7 @@ type 接口逻辑附加参数类型 = Record<string, any>;
31
31
  * 接口逻辑可以被两种不同的方法使用:
32
32
  * - 组成接口: 将其作为 {@link 接口} 的一部分.
33
33
  * 此时, 插件会被执行, 插件将从HTTP上下文中获得信息, 提供给业务逻辑.
34
- * - 内部调用: 使用 .实现 方法, 在其他代码中调用接口逻辑.
34
+ * - 内部调用: 使用`.调用`方法, 在其他代码中调用接口逻辑.
35
35
  * 此时, 插件会被跳过, 不会从HTTP上下文中获取任何信息(因为根本就不存在HTTP上下文).
36
36
  * 而本来由插件提供的信息将改为需要通过调用参数提供(是类型安全的).
37
37
  * 这意味着大部分接口逻辑的实现是纯的, 并且可以独立被调用, 非常容易被测试
@@ -22,15 +22,43 @@ declare let 错误类型描述: z.ZodObject<{
22
22
  code: 400;
23
23
  data: string;
24
24
  }>;
25
+ declare let 文件Schema: z.ZodObject<{
26
+ fieldname: z.ZodString;
27
+ originalname: z.ZodString;
28
+ encoding: z.ZodString;
29
+ mimetype: z.ZodString;
30
+ size: z.ZodNumber;
31
+ buffer: z.ZodType<Buffer<ArrayBufferLike>, z.ZodTypeDef, Buffer<ArrayBufferLike>>;
32
+ }, "strip", z.ZodTypeAny, {
33
+ fieldname: string;
34
+ originalname: string;
35
+ encoding: string;
36
+ mimetype: string;
37
+ size: number;
38
+ buffer: Buffer<ArrayBufferLike>;
39
+ }, {
40
+ fieldname: string;
41
+ originalname: string;
42
+ encoding: string;
43
+ mimetype: string;
44
+ size: number;
45
+ buffer: Buffer<ArrayBufferLike>;
46
+ }>;
25
47
  declare class Form参数解析插件<Result extends z.AnyZodObject> extends __<typeof 错误类型描述, z.ZodObject<{
26
- form: Result;
48
+ form: z.ZodObject<{
49
+ data: Result;
50
+ files: z.ZodArray<typeof 文件Schema>;
51
+ }>;
27
52
  }>> {
28
53
  constructor(t: Result, opt: multer.Options);
29
54
  }
30
55
  type 任意Form参数解析插件 = Form参数解析插件<any>;
31
56
  type 任意Form参数解析插件项 = 任意Form参数解析插件;
32
57
  type 合并Form插件结果<Arr extends Array<____>> = Arr extends [] ? {} : Arr extends [infer x, ...infer xs] ? x extends infer 插件项 ? xs extends Array<____> ? 插件项 extends 任意Form参数解析插件项 ? ________<{
33
- form: _____ts__<插件项>['form'];
58
+ form: {
59
+ data: _____ts__<插件项>['form']['data'];
60
+ files: _____ts__<插件项>['form']['files'];
61
+ };
34
62
  }, 合并Form插件结果<xs>> : 合并Form插件结果<xs> : {} : {} : {};
35
63
  type 计算接口逻辑Form参数<接口逻辑> = 合并Form插件结果<__________<接口逻辑>>;
36
64
 
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Form参数解析插件
3
- } from "../chunk-GAL77HPJ.js";
3
+ } from "../chunk-54VXL6NH.js";
4
4
  import "../chunk-2CGBESLT.js";
5
5
  import "../chunk-EGIJQJFI.js";
6
6
  export {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  常用接口返回器
3
- } from "../chunk-AG36MLAF.js";
3
+ } from "../chunk-AOZ3QFOM.js";
4
4
  import "../chunk-FP6Q65NN.js";
5
5
  import "../chunk-2CGBESLT.js";
6
6
  export {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  文件流式下载返回器
3
- } from "../chunk-JSMTJQ3K.js";
3
+ } from "../chunk-QRJ6A4DG.js";
4
4
  import "../chunk-FP6Q65NN.js";
5
5
  import "../chunk-2CGBESLT.js";
6
6
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lsby/net-core",
3
- "version": "0.13.4",
3
+ "version": "0.13.6",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/lsby/net-core.git"
@@ -1,43 +0,0 @@
1
- import {
2
- 递归截断字符串
3
- } from "./chunk-2CGBESLT.js";
4
- import {
5
- 插件
6
- } from "./chunk-EGIJQJFI.js";
7
-
8
- // src/plugin/form.ts
9
- import { Left, Right } from "@lsby/ts-fp-data";
10
- import multer from "multer";
11
- import { format } from "util";
12
- import { z } from "zod";
13
- var \u9519\u8BEF\u7C7B\u578B\u63CF\u8FF0 = z.object({ code: z.literal(400), data: z.string() });
14
- var Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6 = class _Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6 extends \u63D2\u4EF6 {
15
- constructor(t, opt) {
16
- super(\u9519\u8BEF\u7C7B\u578B\u63CF\u8FF0, z.object({ form: t }), async (req, res, \u9644\u52A0\u53C2\u6570) => {
17
- let log = \u9644\u52A0\u53C2\u6570.log.extend(_Form\u53C2\u6570\u89E3\u6790\u63D2\u4EF6.name);
18
- let upload = multer(opt);
19
- let multerMiddleware = upload.any();
20
- await new Promise(
21
- (pRes, rej) => multerMiddleware(req, res, (err) => {
22
- if (err !== null) {
23
- rej(err);
24
- } else {
25
- pRes(null);
26
- }
27
- })
28
- );
29
- await log.debug("\u51C6\u5907\u89E3\u6790 Form \u53C2\u6570\uFF1A%o", JSON.stringify(\u9012\u5F52\u622A\u65AD\u5B57\u7B26\u4E32(req.body)));
30
- let parseResult = t.safeParse(req.body);
31
- if (parseResult.success === false) {
32
- await log.error("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25\uFF1A%o", JSON.stringify(parseResult.error));
33
- return new Left({ code: 400, data: format("\u89E3\u6790 Form \u53C2\u6570\u5931\u8D25: %o", JSON.stringify(parseResult.error)) });
34
- }
35
- await log.debug("\u6210\u529F\u89E3\u6790 Form \u53C2\u6570");
36
- return new Right({ form: parseResult.data });
37
- });
38
- }
39
- };
40
-
41
- export {
42
- Form参数解析插件
43
- };