@lsby/net-core 0.13.5 → 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
 
@@ -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
 
@@ -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
+ };
@@ -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
package/dist/esm/index.js CHANGED
@@ -1,11 +1,26 @@
1
- import {
2
- 服务器
3
- } from "./chunk-AB35ZHL3.js";
4
1
  import {
5
2
  EXPORT_TYPE
6
3
  } from "./chunk-HT7VG4BT.js";
4
+ import {
5
+ 服务器
6
+ } from "./chunk-AB35ZHL3.js";
7
7
  import "./chunk-XPFEAXE4.js";
8
8
  import "./chunk-BWFSM5FK.js";
9
+ import {
10
+ 自定义插件
11
+ } from "./chunk-7OU27OBO.js";
12
+ import {
13
+ Form参数解析插件
14
+ } from "./chunk-54VXL6NH.js";
15
+ import {
16
+ JSON参数解析插件
17
+ } from "./chunk-PAP3X3RJ.js";
18
+ import {
19
+ 调试请求头插件
20
+ } from "./chunk-RWSXMQQI.js";
21
+ import {
22
+ 路径解析插件
23
+ } from "./chunk-JLNRCPJD.js";
9
24
  import {
10
25
  Query参数解析插件
11
26
  } from "./chunk-RVEKW2PT.js";
@@ -15,6 +30,10 @@ import {
15
30
  import {
16
31
  WebSocket插件
17
32
  } from "./chunk-7GT72IUT.js";
33
+ import {
34
+ 接口测试,
35
+ 接口逻辑测试
36
+ } from "./chunk-GGNRLQAM.js";
18
37
  import {
19
38
  常用接口返回器
20
39
  } from "./chunk-AOZ3QFOM.js";
@@ -33,28 +52,9 @@ import {
33
52
  import {
34
53
  接口返回器
35
54
  } from "./chunk-FP6Q65NN.js";
36
- import {
37
- 接口测试,
38
- 接口逻辑测试
39
- } from "./chunk-GGNRLQAM.js";
40
55
  import {
41
56
  自定义数据插件
42
57
  } from "./chunk-HINGVOU6.js";
43
- import {
44
- 自定义插件
45
- } from "./chunk-7OU27OBO.js";
46
- import {
47
- Form参数解析插件
48
- } from "./chunk-GAL77HPJ.js";
49
- import {
50
- JSON参数解析插件
51
- } from "./chunk-PAP3X3RJ.js";
52
- import {
53
- 调试请求头插件
54
- } from "./chunk-RWSXMQQI.js";
55
- import {
56
- 路径解析插件
57
- } from "./chunk-JLNRCPJD.js";
58
58
  import "./chunk-2CGBESLT.js";
59
59
  import {
60
60
  接口
@@ -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 {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lsby/net-core",
3
- "version": "0.13.5",
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
- };