@lsby/net-core 0.10.0 → 0.10.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/dist/bin/gen-api-type/bin.cjs +1 -1
- package/dist/bin/gen-api-type/index.cjs +1 -1
- package/dist/cjs/bin/gen-api-type/bin.cjs +1 -1
- package/dist/cjs/bin/gen-api-type/index.cjs +1 -1
- package/dist/cjs/help/help.cjs +21 -0
- package/dist/cjs/help/help.d.cts +10 -1
- package/dist/cjs/index.cjs +25 -4
- package/dist/cjs/index.d.cts +1 -1
- package/dist/cjs/interface/interface-logic.cjs +27 -4
- package/dist/cjs/plugin/extend/json.d.cts +3 -2
- package/dist/cjs/plugin/extend/query.d.cts +3 -2
- package/dist/cjs/wrapper/express-compatible-wrapper.cjs +228 -0
- package/dist/cjs/wrapper/express-compatible-wrapper.d.cts +55 -0
- package/dist/cjs/wrapper/file-download-wrapper.cjs +134 -0
- package/dist/cjs/wrapper/file-download-wrapper.d.cts +80 -0
- package/dist/esm/bin/gen-api-type/bin.js +1 -1
- package/dist/esm/bin/gen-api-type/index.js +1 -1
- package/dist/esm/chunk-7LQRWJ3X.js +32 -0
- package/dist/esm/{chunk-REQ5ZXOQ.js → chunk-B5DKJ5AV.js} +1 -1
- package/dist/esm/{chunk-ITCALAYE.js → chunk-E23EZWBE.js} +8 -4
- package/dist/esm/help/help.d.ts +10 -1
- package/dist/esm/help/help.js +3 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +13 -11
- package/dist/esm/interface/interface-logic.js +2 -1
- package/dist/esm/plugin/extend/json.d.ts +3 -2
- package/dist/esm/plugin/extend/query.d.ts +3 -2
- package/dist/esm/wrapper/express-compatible-wrapper.d.ts +55 -0
- package/dist/esm/wrapper/express-compatible-wrapper.js +54 -0
- package/dist/esm/wrapper/file-download-wrapper.d.ts +80 -0
- package/dist/esm/wrapper/file-download-wrapper.js +60 -0
- package/package.json +1 -1
- package/dist/esm/chunk-YMH6HJJF.js +0 -12
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/wrapper/file-download-wrapper.ts
|
|
21
|
+
var file_download_wrapper_exports = {};
|
|
22
|
+
__export(file_download_wrapper_exports, {
|
|
23
|
+
\u6587\u4EF6\u4E0B\u8F7D\u63A5\u53E3\u5C01\u88C5: () => \u6587\u4EF6\u4E0B\u8F7D\u63A5\u53E3\u5C01\u88C5
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(file_download_wrapper_exports);
|
|
26
|
+
var import_node_fs = require("fs");
|
|
27
|
+
var import_zod = require("zod");
|
|
28
|
+
|
|
29
|
+
// src/interface/interface-base.ts
|
|
30
|
+
var \u63A5\u53E3 = class {
|
|
31
|
+
constructor(\u8BF7\u6C42\u8DEF\u5F84, \u8BF7\u6C42\u65B9\u6CD5, \u63A5\u53E3\u903B\u8F91, \u63A5\u53E3\u9519\u8BEF\u5F62\u5F0FZod, \u63A5\u53E3\u6B63\u786E\u5F62\u5F0FZod, \u7ED3\u679C\u8F6C\u6362\u5668, \u7ED3\u679C\u8FD4\u56DE\u5668) {
|
|
32
|
+
this.\u8BF7\u6C42\u8DEF\u5F84 = \u8BF7\u6C42\u8DEF\u5F84;
|
|
33
|
+
this.\u8BF7\u6C42\u65B9\u6CD5 = \u8BF7\u6C42\u65B9\u6CD5;
|
|
34
|
+
this.\u63A5\u53E3\u903B\u8F91 = \u63A5\u53E3\u903B\u8F91;
|
|
35
|
+
this.\u63A5\u53E3\u9519\u8BEF\u5F62\u5F0FZod = \u63A5\u53E3\u9519\u8BEF\u5F62\u5F0FZod;
|
|
36
|
+
this.\u63A5\u53E3\u6B63\u786E\u5F62\u5F0FZod = \u63A5\u53E3\u6B63\u786E\u5F62\u5F0FZod;
|
|
37
|
+
this.\u7ED3\u679C\u8F6C\u6362\u5668 = \u7ED3\u679C\u8F6C\u6362\u5668;
|
|
38
|
+
this.\u7ED3\u679C\u8FD4\u56DE\u5668 = \u7ED3\u679C\u8FD4\u56DE\u5668;
|
|
39
|
+
}
|
|
40
|
+
\u83B7\u5F97\u8DEF\u5F84() {
|
|
41
|
+
return this.\u8BF7\u6C42\u8DEF\u5F84;
|
|
42
|
+
}
|
|
43
|
+
\u83B7\u5F97\u65B9\u6CD5() {
|
|
44
|
+
return this.\u8BF7\u6C42\u65B9\u6CD5;
|
|
45
|
+
}
|
|
46
|
+
\u83B7\u5F97\u903B\u8F91() {
|
|
47
|
+
return this.\u63A5\u53E3\u903B\u8F91;
|
|
48
|
+
}
|
|
49
|
+
\u83B7\u5F97\u63A5\u53E3\u9519\u8BEF\u5F62\u5F0FZod() {
|
|
50
|
+
return this.\u63A5\u53E3\u9519\u8BEF\u5F62\u5F0FZod;
|
|
51
|
+
}
|
|
52
|
+
\u83B7\u5F97\u63A5\u53E3\u6B63\u786E\u5F62\u5F0FZod() {
|
|
53
|
+
return this.\u63A5\u53E3\u6B63\u786E\u5F62\u5F0FZod;
|
|
54
|
+
}
|
|
55
|
+
\u83B7\u5F97\u7ED3\u679C\u8F6C\u6362\u5668() {
|
|
56
|
+
return this.\u7ED3\u679C\u8F6C\u6362\u5668;
|
|
57
|
+
}
|
|
58
|
+
\u83B7\u5F97\u7ED3\u679C\u8FD4\u56DE\u5668() {
|
|
59
|
+
return this.\u7ED3\u679C\u8FD4\u56DE\u5668;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// src/interface/interface-result.ts
|
|
64
|
+
var \u63A5\u53E3\u7ED3\u679C\u8F6C\u6362\u5668 = class {
|
|
65
|
+
};
|
|
66
|
+
var \u76F4\u63A5\u5F62\u5F0F\u8F6C\u6362\u5668 = class extends \u63A5\u53E3\u7ED3\u679C\u8F6C\u6362\u5668 {
|
|
67
|
+
\u5B9E\u73B0(\u6570\u636E) {
|
|
68
|
+
switch (\u6570\u636E.getTag()) {
|
|
69
|
+
case "Left": {
|
|
70
|
+
return { status: "fail", data: \u6570\u636E.assertLeft().getLeft() };
|
|
71
|
+
}
|
|
72
|
+
case "Right": {
|
|
73
|
+
return \u6570\u636E.assertRight().getRight().data;
|
|
74
|
+
}
|
|
75
|
+
default: {
|
|
76
|
+
throw new Error("\u610F\u5916\u7684\u6570\u636E\u6807\u8BB0");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// src/interface/interface-retuen.ts
|
|
83
|
+
var \u63A5\u53E3\u7ED3\u679C\u8FD4\u56DE\u5668 = class {
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// src/wrapper/file-download-wrapper.ts
|
|
87
|
+
var \u6587\u4EF6\u4E0B\u8F7D\u63A5\u53E3\u5C01\u88C5 = class extends \u63A5\u53E3 {
|
|
88
|
+
constructor(\u8BF7\u6C42\u8DEF\u5F84, \u8BF7\u6C42\u65B9\u6CD5, \u63A5\u53E3\u903B\u8F91, \u903B\u8F91\u9519\u8BEF\u7C7B\u578BZod, \u6587\u4EF6\u540D, MIME\u7C7B\u578B) {
|
|
89
|
+
let \u63A5\u53E3\u9519\u8BEF\u8F93\u51FA\u5F62\u5F0F = import_zod.z.object({ status: import_zod.z.literal("fail"), data: \u903B\u8F91\u9519\u8BEF\u7C7B\u578BZod });
|
|
90
|
+
let \u63A5\u53E3\u8F6C\u6362\u5668 = new \u76F4\u63A5\u5F62\u5F0F\u8F6C\u6362\u5668();
|
|
91
|
+
let \u8FD4\u56DE\u5668 = new \u6587\u4EF6\u4E0B\u8F7D\u8FD4\u56DE\u5668(\u6587\u4EF6\u540D, MIME\u7C7B\u578B);
|
|
92
|
+
super(
|
|
93
|
+
\u8BF7\u6C42\u8DEF\u5F84,
|
|
94
|
+
\u8BF7\u6C42\u65B9\u6CD5,
|
|
95
|
+
\u63A5\u53E3\u903B\u8F91,
|
|
96
|
+
\u63A5\u53E3\u9519\u8BEF\u8F93\u51FA\u5F62\u5F0F,
|
|
97
|
+
import_zod.z.any(),
|
|
98
|
+
// 正确形式任意
|
|
99
|
+
\u63A5\u53E3\u8F6C\u6362\u5668,
|
|
100
|
+
\u8FD4\u56DE\u5668
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
var \u6587\u4EF6\u4E0B\u8F7D\u8FD4\u56DE\u5668 = class extends \u63A5\u53E3\u7ED3\u679C\u8FD4\u56DE\u5668 {
|
|
105
|
+
constructor(\u6587\u4EF6\u540D, MIME\u7C7B\u578B) {
|
|
106
|
+
super();
|
|
107
|
+
this.\u6587\u4EF6\u540D = \u6587\u4EF6\u540D;
|
|
108
|
+
this.MIME\u7C7B\u578B = MIME\u7C7B\u578B;
|
|
109
|
+
}
|
|
110
|
+
async \u8FD4\u56DE(req, res, \u7ED3\u679C) {
|
|
111
|
+
if (this.MIME\u7C7B\u578B !== void 0) {
|
|
112
|
+
res.setHeader("Content-Type", this.MIME\u7C7B\u578B);
|
|
113
|
+
}
|
|
114
|
+
if (this.\u6587\u4EF6\u540D !== void 0) {
|
|
115
|
+
let encodedFilename = encodeURIComponent(this.\u6587\u4EF6\u540D);
|
|
116
|
+
res.setHeader("Content-Disposition", `attachment; filename*=UTF-8''${encodedFilename}`);
|
|
117
|
+
}
|
|
118
|
+
if (Buffer.isBuffer(\u7ED3\u679C)) {
|
|
119
|
+
res.setHeader("Content-Length", \u7ED3\u679C.length);
|
|
120
|
+
res.send(\u7ED3\u679C);
|
|
121
|
+
} else if (typeof \u7ED3\u679C === "string") {
|
|
122
|
+
let \u6D41 = (0, import_node_fs.createReadStream)(\u7ED3\u679C);
|
|
123
|
+
\u6D41.pipe(res);
|
|
124
|
+
} else if (typeof \u7ED3\u679C.pipe === "function") {
|
|
125
|
+
\u7ED3\u679C.pipe(res);
|
|
126
|
+
} else {
|
|
127
|
+
res.status(400).send("Invalid file data");
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
132
|
+
0 && (module.exports = {
|
|
133
|
+
\u6587\u4EF6\u4E0B\u8F7D\u63A5\u53E3\u5C01\u88C5
|
|
134
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { ReadStream } from 'node:fs';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { 接 as ______, a as ______$1, l as ____Base, 空 as ___, b as __, 直 as _______, q as __________, r as __________$1 } from '../interface-base-CyfrfgWu.cjs';
|
|
5
|
+
import { 接口结果返回器 as _______$1 } from '../interface/interface-retuen.cjs';
|
|
6
|
+
import '@lsby/ts-fp-data';
|
|
7
|
+
import '../help/interior.cjs';
|
|
8
|
+
import '@lsby/ts-log';
|
|
9
|
+
import 'node:http';
|
|
10
|
+
|
|
11
|
+
type 文件数据类型 = {
|
|
12
|
+
data: Buffer | ReadStream | string;
|
|
13
|
+
filename?: string;
|
|
14
|
+
mimeType?: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* 文件下载接口封装
|
|
18
|
+
*
|
|
19
|
+
* 用于提供文件下载能力,支持:
|
|
20
|
+
* - Buffer 直接发送
|
|
21
|
+
* - 文件路径(自动创建流)
|
|
22
|
+
* - 流对象直接传送
|
|
23
|
+
*
|
|
24
|
+
* 使用方式:
|
|
25
|
+
* - 接口逻辑返回 Either<错误, { data: 文件数据 }>
|
|
26
|
+
* - 文件数据可以是 Buffer、文件路径字符串、或 ReadStream
|
|
27
|
+
* - 错误返回标准错误格式
|
|
28
|
+
*
|
|
29
|
+
* 示例:
|
|
30
|
+
* ```ts
|
|
31
|
+
* const 逻辑 = 接口逻辑Base.构造(
|
|
32
|
+
* [GET参数解析插件],
|
|
33
|
+
* async ({ query }) => {
|
|
34
|
+
* const buffer = await fs.readFile(query.filepath)
|
|
35
|
+
* return new Right({
|
|
36
|
+
* data: buffer,
|
|
37
|
+
* filename: 'export.xlsx',
|
|
38
|
+
* mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
39
|
+
* })
|
|
40
|
+
* }
|
|
41
|
+
* )
|
|
42
|
+
*
|
|
43
|
+
* const api = new 文件下载接口封装(
|
|
44
|
+
* '/api/download',
|
|
45
|
+
* 'get',
|
|
46
|
+
* 逻辑,
|
|
47
|
+
* z.object({ filepath: z.string() }), // 错误类型
|
|
48
|
+
* z.object({ data: z.any() }) // 正确类型必须包含 data 字段
|
|
49
|
+
* )
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
declare class 文件下载接口封装<路径类型 extends ______, 方法类型 extends ______$1, 逻辑类型 extends ____Base<any, ___, z.infer<接口错误形式Zod>, {
|
|
53
|
+
data: 任意文件数据;
|
|
54
|
+
}, any, any>, 接口错误形式Zod extends z.ZodTypeAny, 任意文件数据 = Buffer | ReadStream | string> extends __<路径类型, 方法类型, 逻辑类型, z.ZodObject<{
|
|
55
|
+
status: z.ZodLiteral<'fail'>;
|
|
56
|
+
data: 接口错误形式Zod;
|
|
57
|
+
}>, z.ZodType<any>, _______<任意文件数据, __________<逻辑类型>, __________$1<逻辑类型>>, 文件下载返回器> {
|
|
58
|
+
constructor(请求路径: 路径类型, 请求方法: 方法类型, 接口逻辑: 逻辑类型, 逻辑错误类型Zod: 接口错误形式Zod, 文件名?: string, MIME类型?: string);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 文件下载返回器
|
|
62
|
+
*
|
|
63
|
+
* 处理文件的发送,支持:
|
|
64
|
+
* 1. Buffer - 直接设置 Content-Length 后发送
|
|
65
|
+
* 2. ReadStream - 自动 pipe 到响应
|
|
66
|
+
* 3. 文件路径字符串 - 创建读流后发送
|
|
67
|
+
*
|
|
68
|
+
* 自动设置的响应头:
|
|
69
|
+
* - Content-Disposition: 用于设置下载文件名
|
|
70
|
+
* - Content-Type: 根据 MIME 类型设置
|
|
71
|
+
* - Content-Length: 对于 Buffer 自动计算
|
|
72
|
+
*/
|
|
73
|
+
declare class 文件下载返回器 extends _______$1<Buffer | ReadStream | string> {
|
|
74
|
+
private 文件名?;
|
|
75
|
+
private MIME类型?;
|
|
76
|
+
constructor(文件名?: string | undefined, MIME类型?: string | undefined);
|
|
77
|
+
返回(req: Request, res: Response, 结果: Buffer | ReadStream | string): Promise<void>;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { 文件下载接口封装, type 文件数据类型 };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// src/help/help.ts
|
|
2
|
+
function \u6784\u9020\u5143\u7EC4(args) {
|
|
3
|
+
return args;
|
|
4
|
+
}
|
|
5
|
+
function \u6784\u9020\u5BF9\u8C61(key, value) {
|
|
6
|
+
return { [key]: value };
|
|
7
|
+
}
|
|
8
|
+
function \u666E\u901A\u5BF9\u8C61\u6DF1\u5408\u5E76(target, source) {
|
|
9
|
+
if (typeof source !== "object" || source === null || Object.getPrototypeOf(source) !== Object.prototype) {
|
|
10
|
+
return source;
|
|
11
|
+
}
|
|
12
|
+
if (typeof target !== "object" || target === null || Object.getPrototypeOf(target) !== Object.prototype) {
|
|
13
|
+
return source;
|
|
14
|
+
}
|
|
15
|
+
let result = { ...target };
|
|
16
|
+
for (let key in source) {
|
|
17
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
18
|
+
if (typeof source[key] === "object" && source[key] !== null && Object.getPrototypeOf(source[key]) === Object.prototype && typeof target[key] === "object" && target[key] !== null && Object.getPrototypeOf(target[key]) === Object.prototype) {
|
|
19
|
+
result[key] = \u666E\u901A\u5BF9\u8C61\u6DF1\u5408\u5E76(target[key], source[key]);
|
|
20
|
+
} else {
|
|
21
|
+
result[key] = source[key];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export {
|
|
29
|
+
构造元组,
|
|
30
|
+
构造对象,
|
|
31
|
+
普通对象深合并
|
|
32
|
+
};
|
|
@@ -74,7 +74,7 @@ async function main(tsconfig\u8DEF\u5F84, \u76EE\u6807\u8DEF\u5F84, \u8F93\u51FA
|
|
|
74
74
|
? {
|
|
75
75
|
path: jsonPath
|
|
76
76
|
method: jsonMethod
|
|
77
|
-
input: jsonMethod extends 'post' ? jsonInput : jsonMethod extends 'get' ? getInput : {}
|
|
77
|
+
input: jsonMethod extends 'post' ? jsonInput['body'] : jsonMethod extends 'get' ? getInput['query'] : {}
|
|
78
78
|
errorOutput: jsonErrorOutput
|
|
79
79
|
successOutput: jsonSuccessOutput
|
|
80
80
|
webSocketData: wsData
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import {
|
|
2
|
+
普通对象深合并
|
|
3
|
+
} from "./chunk-7LQRWJ3X.js";
|
|
4
|
+
|
|
1
5
|
// src/interface/interface-logic.ts
|
|
2
6
|
import { Right } from "@lsby/ts-fp-data";
|
|
3
7
|
var \u63A5\u53E3\u903B\u8F91Base = class _\u63A5\u53E3\u903B\u8F91Base {
|
|
@@ -32,7 +36,7 @@ var \u63A5\u53E3\u903B\u8F91Base = class _\u63A5\u53E3\u903B\u8F91Base {
|
|
|
32
36
|
let \u63D2\u4EF6\u8FD4\u56DE = await \u63D2\u4EF6.\u8FD0\u884C(req, res, \u8BF7\u6C42\u9644\u52A0\u53C2\u6570);
|
|
33
37
|
\u6240\u6709\u63D2\u4EF6\u7ED3\u679C.push(\u63D2\u4EF6\u8FD4\u56DE);
|
|
34
38
|
}
|
|
35
|
-
let \u5408\u5E76\u7ED3\u679C = \u6240\u6709\u63D2\u4EF6\u7ED3\u679C.reduce((s, a) => (
|
|
39
|
+
let \u5408\u5E76\u7ED3\u679C = \u6240\u6709\u63D2\u4EF6\u7ED3\u679C.reduce((s, a) => \u666E\u901A\u5BF9\u8C61\u6DF1\u5408\u5E76(s, a), {});
|
|
36
40
|
return \u5408\u5E76\u7ED3\u679C;
|
|
37
41
|
}
|
|
38
42
|
async \u901A\u8FC7\u63D2\u4EF6\u7ED3\u679C\u8FD0\u884C(\u5408\u5E76\u63D2\u4EF6\u7ED3\u679C, \u4F20\u5165\u7684\u903B\u8F91\u9644\u52A0\u53C2\u6570, \u4F20\u5165\u7684\u8BF7\u6C42\u9644\u52A0\u53C2\u6570) {
|
|
@@ -40,7 +44,7 @@ var \u63A5\u53E3\u903B\u8F91Base = class _\u63A5\u53E3\u903B\u8F91Base {
|
|
|
40
44
|
let \u6700\u7EC8\u7ED3\u679C = void 0;
|
|
41
45
|
try {
|
|
42
46
|
let \u5B9E\u73B0\u7ED3\u679C = await this.\u5B9E\u73B0(\u5408\u5E76\u63D2\u4EF6\u7ED3\u679C, \u4F20\u5165\u7684\u903B\u8F91\u9644\u52A0\u53C2\u6570, \u4F20\u5165\u7684\u8BF7\u6C42\u9644\u52A0\u53C2\u6570);
|
|
43
|
-
\u6700\u7EC8\u7ED3\u679C = \u5B9E\u73B0\u7ED3\u679C.map((a) => (
|
|
47
|
+
\u6700\u7EC8\u7ED3\u679C = \u5B9E\u73B0\u7ED3\u679C.map((a) => \u666E\u901A\u5BF9\u8C61\u6DF1\u5408\u5E76(\u4F20\u5165\u7684\u903B\u8F91\u9644\u52A0\u53C2\u6570, a));
|
|
44
48
|
return \u6700\u7EC8\u7ED3\u679C;
|
|
45
49
|
} finally {
|
|
46
50
|
if (\u6E05\u7406\u51FD\u6570 !== void 0) {
|
|
@@ -76,9 +80,9 @@ var \u63A5\u53E3\u903B\u8F91Base = class _\u63A5\u53E3\u903B\u8F91Base {
|
|
|
76
80
|
async (\u53C2\u6570, \u903B\u8F91\u9644\u52A0\u53C2\u6570, \u8BF7\u6C42\u9644\u52A0\u53C2\u6570) => {
|
|
77
81
|
let \u4E0A\u5C42\u8C03\u7528\u7ED3\u679C = await this.\u5B9E\u73B0(\u53C2\u6570, \u903B\u8F91\u9644\u52A0\u53C2\u6570, \u8BF7\u6C42\u9644\u52A0\u53C2\u6570);
|
|
78
82
|
if (\u4E0A\u5C42\u8C03\u7528\u7ED3\u679C.isLeft()) return \u4E0A\u5C42\u8C03\u7528\u7ED3\u679C;
|
|
79
|
-
let \u4F20\u7ED9\u4E0B\u4E00\u5C42\u7684 =
|
|
83
|
+
let \u4F20\u7ED9\u4E0B\u4E00\u5C42\u7684 = \u666E\u901A\u5BF9\u8C61\u6DF1\u5408\u5E76(\u903B\u8F91\u9644\u52A0\u53C2\u6570, \u4E0A\u5C42\u8C03\u7528\u7ED3\u679C.assertRight().getRight());
|
|
80
84
|
let \u4E0B\u5C42\u8C03\u7528\u7ED3\u679C = await \u8F93\u5165.\u5B9E\u73B0(\u53C2\u6570, \u4F20\u7ED9\u4E0B\u4E00\u5C42\u7684, \u8BF7\u6C42\u9644\u52A0\u53C2\u6570);
|
|
81
|
-
let \u6700\u7EC8\u8FD4\u56DE\u7ED3\u679C = \u4E0B\u5C42\u8C03\u7528\u7ED3\u679C.map((a) => (
|
|
85
|
+
let \u6700\u7EC8\u8FD4\u56DE\u7ED3\u679C = \u4E0B\u5C42\u8C03\u7528\u7ED3\u679C.map((a) => \u666E\u901A\u5BF9\u8C61\u6DF1\u5408\u5E76(\u4F20\u7ED9\u4E0B\u4E00\u5C42\u7684, a));
|
|
82
86
|
return \u6700\u7EC8\u8FD4\u56DE\u7ED3\u679C;
|
|
83
87
|
},
|
|
84
88
|
\u5408\u5E76\u6E05\u7406,
|
package/dist/esm/help/help.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
declare function 构造元组<T extends any[]>(args: [...T]): T;
|
|
2
2
|
declare function 构造对象<K extends string, V>(key: K, value: V): Record<K, V>;
|
|
3
|
+
type 普通对象 = Record<any, any>;
|
|
4
|
+
type 严格递归合并对象<A, B> = A extends 普通对象 ? B extends 普通对象 ? {
|
|
5
|
+
[K in keyof A | keyof B]: K extends keyof A ? K extends keyof B ? A[K] extends 普通对象 ? B[K] extends 普通对象 ? 严格递归合并对象<A[K], B[K]> : never : never : A[K] : K extends keyof B ? B[K] : never;
|
|
6
|
+
} : never : never;
|
|
7
|
+
/**
|
|
8
|
+
* 深合并两个对象,如果两个值都是普通对象,则递归合并,否则用后者覆盖
|
|
9
|
+
* 只有直接上游是对象原型的对象才算是普通对象
|
|
10
|
+
*/
|
|
11
|
+
declare function 普通对象深合并(target: Record<any, any>, source: Record<any, any>): Record<string, any>;
|
|
3
12
|
|
|
4
|
-
export { 构造元组, 构造对象 };
|
|
13
|
+
export { type 严格递归合并对象, 普通对象深合并, 构造元组, 构造对象 };
|
package/dist/esm/help/help.js
CHANGED
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { 构造元组, 构造对象 } from './help/help.js';
|
|
1
|
+
export { 严格递归合并对象, 普通对象深合并, 构造元组, 构造对象 } from './help/help.js';
|
|
2
2
|
export { 任 as 任意接口, x as 任意接口结果转换器, n as 任意接口逻辑, y as 任意插件, 兼 as 兼容空对象, A as 取插件内部ts类型, 取 as 取插件内部类型, 可 as 可调用接口逻辑, 合 as 合并插件结果, 常 as 常用形式转换器, b as 接口, a as 接口方法类型, w as 接口结果转换器, 接 as 接口路径类型, m as 接口逻辑, l as 接口逻辑Base, j as 接口逻辑正确类型, i as 接口逻辑错误类型, k as 接口逻辑附加参数类型, 插 as 插件, z as 插件项类型, 服 as 服务器, 清 as 清理函数类型, 直 as 直接形式转换器, 空 as 空对象, c as 获得接口方法类型, f as 获得接口正确形式, g as 获得接口结果转换器类型, h as 获得接口结果返回器类型, 获 as 获得接口路径类型, s as 获得接口逻辑上游接口类型, o as 获得接口逻辑插件类型, t as 获得接口逻辑最后接口类型, r as 获得接口逻辑正确类型, d as 获得接口逻辑类型, q as 获得接口逻辑错误类型, p as 获得接口逻辑附加参数类型, e as 获得接口错误形式, 计 as 计算接口逻辑参数, v as 计算接口逻辑正确结果, u as 计算接口逻辑错误结果, 请 as 请求附加参数类型 } from './interface-base-C1ZNSMJz.js';
|
|
3
3
|
export { 任意接口结果返回器, 常用返回器, 接口结果返回器, 自定义返回器 } from './interface/interface-retuen.js';
|
|
4
4
|
export { 接口测试 } from './interface/interface-test.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WebSocket插件
|
|
3
|
+
} from "./chunk-C5FED6EO.js";
|
|
1
4
|
import {
|
|
2
5
|
自定义数据插件
|
|
3
6
|
} from "./chunk-VMCAX3QH.js";
|
|
@@ -13,21 +16,18 @@ import {
|
|
|
13
16
|
import {
|
|
14
17
|
表单解析插件
|
|
15
18
|
} from "./chunk-3XRAG6DM.js";
|
|
16
|
-
import {
|
|
17
|
-
WebSocket插件
|
|
18
|
-
} from "./chunk-C5FED6EO.js";
|
|
19
19
|
import {
|
|
20
20
|
常用直接形式接口封装
|
|
21
21
|
} from "./chunk-NB2QNDI2.js";
|
|
22
22
|
import {
|
|
23
23
|
接口测试
|
|
24
24
|
} from "./chunk-N7TPWCQ5.js";
|
|
25
|
-
import {
|
|
26
|
-
服务器
|
|
27
|
-
} from "./chunk-3ZQFVYIR.js";
|
|
28
25
|
import {
|
|
29
26
|
插件
|
|
30
27
|
} from "./chunk-43GZE5YL.js";
|
|
28
|
+
import {
|
|
29
|
+
服务器
|
|
30
|
+
} from "./chunk-3ZQFVYIR.js";
|
|
31
31
|
import {
|
|
32
32
|
EXPORT_TYPE
|
|
33
33
|
} from "./chunk-ZF7EC2OM.js";
|
|
@@ -44,10 +44,6 @@ import {
|
|
|
44
44
|
自定义返回器
|
|
45
45
|
} from "./chunk-XBAKTT6S.js";
|
|
46
46
|
import "./chunk-NJKBRPN7.js";
|
|
47
|
-
import {
|
|
48
|
-
构造元组,
|
|
49
|
-
构造对象
|
|
50
|
-
} from "./chunk-YMH6HJJF.js";
|
|
51
47
|
import "./chunk-ZIVQ3WZA.js";
|
|
52
48
|
import {
|
|
53
49
|
接口
|
|
@@ -55,7 +51,12 @@ import {
|
|
|
55
51
|
import {
|
|
56
52
|
接口逻辑,
|
|
57
53
|
接口逻辑Base
|
|
58
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-E23EZWBE.js";
|
|
55
|
+
import {
|
|
56
|
+
普通对象深合并,
|
|
57
|
+
构造元组,
|
|
58
|
+
构造对象
|
|
59
|
+
} from "./chunk-7LQRWJ3X.js";
|
|
59
60
|
import {
|
|
60
61
|
常用形式转换器,
|
|
61
62
|
接口结果转换器,
|
|
@@ -78,6 +79,7 @@ export {
|
|
|
78
79
|
\u63A5\u53E3\u903B\u8F91,
|
|
79
80
|
\u63A5\u53E3\u903B\u8F91Base,
|
|
80
81
|
\u63D2\u4EF6,
|
|
82
|
+
\u666E\u901A\u5BF9\u8C61\u6DF1\u5408\u5E76,
|
|
81
83
|
\u670D\u52A1\u5668,
|
|
82
84
|
\u6784\u9020\u5143\u7EC4,
|
|
83
85
|
\u6784\u9020\u5BF9\u8C61,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import { AnyZodObject, z } from 'zod';
|
|
3
|
+
import { 严格递归合并对象 as ________ } from '../../help/help.js';
|
|
3
4
|
import { 插 as __, z as _____, 取 as _______, o as __________ } from '../../interface-base-C1ZNSMJz.js';
|
|
4
5
|
import '@lsby/ts-fp-data';
|
|
5
6
|
import '../../help/interior.js';
|
|
@@ -16,9 +17,9 @@ declare class JSON解析插件<Result extends AnyZodObject> extends __<z.ZodObje
|
|
|
16
17
|
}
|
|
17
18
|
type 任意JSON解析插件 = JSON解析插件<any>;
|
|
18
19
|
type 任意JSON解析插件项 = 任意JSON解析插件;
|
|
19
|
-
type 合并JSON插件结果<Arr extends Array<_____>> = Arr extends [] ? {} : Arr extends [infer x, ...infer xs] ? x extends infer 插件项 ? xs extends Array<_____> ? 插件项 extends 任意JSON解析插件项 ? {
|
|
20
|
+
type 合并JSON插件结果<Arr extends Array<_____>> = Arr extends [] ? {} : Arr extends [infer x, ...infer xs] ? x extends infer 插件项 ? xs extends Array<_____> ? 插件项 extends 任意JSON解析插件项 ? ________<{
|
|
20
21
|
body: z.infer<_______<插件项>>['body'];
|
|
21
|
-
}
|
|
22
|
+
}, 合并JSON插件结果<xs>> : 合并JSON插件结果<xs> : {} : {} : {};
|
|
22
23
|
type 计算接口逻辑JSON参数<接口逻辑> = 合并JSON插件结果<__________<接口逻辑>>;
|
|
23
24
|
|
|
24
25
|
export { JSON解析插件, type 任意JSON解析插件, type 任意JSON解析插件项, type 合并JSON插件结果, type 计算接口逻辑JSON参数 };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AnyZodObject, z } from 'zod';
|
|
2
|
+
import { 严格递归合并对象 as ________ } from '../../help/help.js';
|
|
2
3
|
import { 插 as __, z as _____, 取 as _______, o as __________ } from '../../interface-base-C1ZNSMJz.js';
|
|
3
4
|
import '@lsby/ts-fp-data';
|
|
4
5
|
import 'express';
|
|
@@ -16,9 +17,9 @@ declare class GET参数解析插件<Result extends AnyZodObject> extends __<z.Zo
|
|
|
16
17
|
}
|
|
17
18
|
type 任意GET参数解析插件 = GET参数解析插件<any>;
|
|
18
19
|
type 任意GET参数解析插件项 = 任意GET参数解析插件;
|
|
19
|
-
type 合并GET插件结果<Arr extends Array<_____>> = Arr extends [] ? {} : Arr extends [infer x, ...infer xs] ? x extends infer 插件项 ? xs extends Array<_____> ? 插件项 extends 任意GET参数解析插件项 ? {
|
|
20
|
+
type 合并GET插件结果<Arr extends Array<_____>> = Arr extends [] ? {} : Arr extends [infer x, ...infer xs] ? x extends infer 插件项 ? xs extends Array<_____> ? 插件项 extends 任意GET参数解析插件项 ? ________<{
|
|
20
21
|
query: z.infer<_______<插件项>>['query'];
|
|
21
|
-
}
|
|
22
|
+
}, 合并GET插件结果<xs>> : 合并GET插件结果<xs> : {} : {} : {};
|
|
22
23
|
type 计算接口逻辑GET参数<接口逻辑> = 合并GET插件结果<__________<接口逻辑>>;
|
|
23
24
|
|
|
24
25
|
export { GET参数解析插件, type 任意GET参数解析插件, type 任意GET参数解析插件项, type 合并GET插件结果, type 计算接口逻辑GET参数 };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { b as __, 接 as ______, a as ______$1, l as ____Base, 空 as ___, w as _______ } from '../interface-base-C1ZNSMJz.js';
|
|
4
|
+
import { 接口结果返回器 as _______$1 } from '../interface/interface-retuen.js';
|
|
5
|
+
import '@lsby/ts-fp-data';
|
|
6
|
+
import '../help/interior.js';
|
|
7
|
+
import '@lsby/ts-log';
|
|
8
|
+
import 'node:http';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Express 兼容接口封装
|
|
12
|
+
*
|
|
13
|
+
* 为熟悉 Express 的用户提供快速迁移方案
|
|
14
|
+
*
|
|
15
|
+
* 特点:
|
|
16
|
+
* - 接收 Express 风格的处理函数 (req, res) => Promise<void>
|
|
17
|
+
* - 输入输出类型均为 any,不支持类型推断
|
|
18
|
+
* - 不支持插件系统和复用
|
|
19
|
+
* - 最大化简化,最小化学习曲线
|
|
20
|
+
*
|
|
21
|
+
* 示例:
|
|
22
|
+
* ```ts
|
|
23
|
+
* const api = new Express兼容接口封装(
|
|
24
|
+
* '/api/user',
|
|
25
|
+
* 'post',
|
|
26
|
+
* async (req, res) => {
|
|
27
|
+
* const data = req.body
|
|
28
|
+
* res.send({ success: true, data })
|
|
29
|
+
* }
|
|
30
|
+
* )
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
declare class Express兼容接口封装 extends __<______, ______$1, ____Base<[], ___, string, {}, null, null>, z.ZodType<any>, z.ZodType<any>, Express兼容结果转换器, Express兼容返回器> {
|
|
34
|
+
constructor(请求路径: ______, 请求方法: ______$1, 处理函数: (req: Request, res: Response) => Promise<void>);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Express 兼容结果转换器
|
|
38
|
+
*
|
|
39
|
+
* 直接通过,不做任何转换
|
|
40
|
+
*/
|
|
41
|
+
declare class Express兼容结果转换器 extends _______<string, {}, any, any> {
|
|
42
|
+
实现(数据: any): any;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Express 兼容返回器
|
|
46
|
+
*
|
|
47
|
+
* 直接执行用户提供的处理函数
|
|
48
|
+
*/
|
|
49
|
+
declare class Express兼容返回器 extends _______$1<any> {
|
|
50
|
+
private 处理函数;
|
|
51
|
+
constructor(处理函数: (req: Request, res: Response) => Promise<void>);
|
|
52
|
+
返回(req: Request, res: Response, _结果: any): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { Express兼容接口封装 };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import {
|
|
2
|
+
接口结果返回器
|
|
3
|
+
} from "../chunk-XBAKTT6S.js";
|
|
4
|
+
import {
|
|
5
|
+
接口
|
|
6
|
+
} from "../chunk-MDUWXEQ7.js";
|
|
7
|
+
import {
|
|
8
|
+
接口逻辑Base
|
|
9
|
+
} from "../chunk-E23EZWBE.js";
|
|
10
|
+
import "../chunk-7LQRWJ3X.js";
|
|
11
|
+
import {
|
|
12
|
+
接口结果转换器
|
|
13
|
+
} from "../chunk-DNJQGD5M.js";
|
|
14
|
+
|
|
15
|
+
// src/wrapper/express-compatible-wrapper.ts
|
|
16
|
+
import { Right } from "@lsby/ts-fp-data";
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
var Express\u517C\u5BB9\u63A5\u53E3\u5C01\u88C5 = class extends \u63A5\u53E3 {
|
|
19
|
+
constructor(\u8BF7\u6C42\u8DEF\u5F84, \u8BF7\u6C42\u65B9\u6CD5, \u5904\u7406\u51FD\u6570) {
|
|
20
|
+
let \u903B\u8F91 = \u63A5\u53E3\u903B\u8F91Base.\u6784\u9020([], async () => {
|
|
21
|
+
return new Right({});
|
|
22
|
+
});
|
|
23
|
+
let \u8F6C\u6362\u5668 = new Express\u517C\u5BB9\u7ED3\u679C\u8F6C\u6362\u5668();
|
|
24
|
+
let \u8FD4\u56DE\u5668 = new Express\u517C\u5BB9\u8FD4\u56DE\u5668(\u5904\u7406\u51FD\u6570);
|
|
25
|
+
super(
|
|
26
|
+
\u8BF7\u6C42\u8DEF\u5F84,
|
|
27
|
+
\u8BF7\u6C42\u65B9\u6CD5,
|
|
28
|
+
\u903B\u8F91,
|
|
29
|
+
z.any(),
|
|
30
|
+
// 错误形式不做限制
|
|
31
|
+
z.any(),
|
|
32
|
+
// 正确形式不做限制
|
|
33
|
+
\u8F6C\u6362\u5668,
|
|
34
|
+
\u8FD4\u56DE\u5668
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var Express\u517C\u5BB9\u7ED3\u679C\u8F6C\u6362\u5668 = class extends \u63A5\u53E3\u7ED3\u679C\u8F6C\u6362\u5668 {
|
|
39
|
+
\u5B9E\u73B0(\u6570\u636E) {
|
|
40
|
+
return \u6570\u636E;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
var Express\u517C\u5BB9\u8FD4\u56DE\u5668 = class extends \u63A5\u53E3\u7ED3\u679C\u8FD4\u56DE\u5668 {
|
|
44
|
+
constructor(\u5904\u7406\u51FD\u6570) {
|
|
45
|
+
super();
|
|
46
|
+
this.\u5904\u7406\u51FD\u6570 = \u5904\u7406\u51FD\u6570;
|
|
47
|
+
}
|
|
48
|
+
\u8FD4\u56DE(req, res, _\u7ED3\u679C) {
|
|
49
|
+
return this.\u5904\u7406\u51FD\u6570(req, res);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
export {
|
|
53
|
+
Express\u517C\u5BB9\u63A5\u53E3\u5C01\u88C5
|
|
54
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { ReadStream } from 'node:fs';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { 接 as ______, a as ______$1, l as ____Base, 空 as ___, b as __, 直 as _______, q as __________, r as __________$1 } from '../interface-base-C1ZNSMJz.js';
|
|
5
|
+
import { 接口结果返回器 as _______$1 } from '../interface/interface-retuen.js';
|
|
6
|
+
import '@lsby/ts-fp-data';
|
|
7
|
+
import '../help/interior.js';
|
|
8
|
+
import '@lsby/ts-log';
|
|
9
|
+
import 'node:http';
|
|
10
|
+
|
|
11
|
+
type 文件数据类型 = {
|
|
12
|
+
data: Buffer | ReadStream | string;
|
|
13
|
+
filename?: string;
|
|
14
|
+
mimeType?: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* 文件下载接口封装
|
|
18
|
+
*
|
|
19
|
+
* 用于提供文件下载能力,支持:
|
|
20
|
+
* - Buffer 直接发送
|
|
21
|
+
* - 文件路径(自动创建流)
|
|
22
|
+
* - 流对象直接传送
|
|
23
|
+
*
|
|
24
|
+
* 使用方式:
|
|
25
|
+
* - 接口逻辑返回 Either<错误, { data: 文件数据 }>
|
|
26
|
+
* - 文件数据可以是 Buffer、文件路径字符串、或 ReadStream
|
|
27
|
+
* - 错误返回标准错误格式
|
|
28
|
+
*
|
|
29
|
+
* 示例:
|
|
30
|
+
* ```ts
|
|
31
|
+
* const 逻辑 = 接口逻辑Base.构造(
|
|
32
|
+
* [GET参数解析插件],
|
|
33
|
+
* async ({ query }) => {
|
|
34
|
+
* const buffer = await fs.readFile(query.filepath)
|
|
35
|
+
* return new Right({
|
|
36
|
+
* data: buffer,
|
|
37
|
+
* filename: 'export.xlsx',
|
|
38
|
+
* mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
39
|
+
* })
|
|
40
|
+
* }
|
|
41
|
+
* )
|
|
42
|
+
*
|
|
43
|
+
* const api = new 文件下载接口封装(
|
|
44
|
+
* '/api/download',
|
|
45
|
+
* 'get',
|
|
46
|
+
* 逻辑,
|
|
47
|
+
* z.object({ filepath: z.string() }), // 错误类型
|
|
48
|
+
* z.object({ data: z.any() }) // 正确类型必须包含 data 字段
|
|
49
|
+
* )
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
declare class 文件下载接口封装<路径类型 extends ______, 方法类型 extends ______$1, 逻辑类型 extends ____Base<any, ___, z.infer<接口错误形式Zod>, {
|
|
53
|
+
data: 任意文件数据;
|
|
54
|
+
}, any, any>, 接口错误形式Zod extends z.ZodTypeAny, 任意文件数据 = Buffer | ReadStream | string> extends __<路径类型, 方法类型, 逻辑类型, z.ZodObject<{
|
|
55
|
+
status: z.ZodLiteral<'fail'>;
|
|
56
|
+
data: 接口错误形式Zod;
|
|
57
|
+
}>, z.ZodType<any>, _______<任意文件数据, __________<逻辑类型>, __________$1<逻辑类型>>, 文件下载返回器> {
|
|
58
|
+
constructor(请求路径: 路径类型, 请求方法: 方法类型, 接口逻辑: 逻辑类型, 逻辑错误类型Zod: 接口错误形式Zod, 文件名?: string, MIME类型?: string);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 文件下载返回器
|
|
62
|
+
*
|
|
63
|
+
* 处理文件的发送,支持:
|
|
64
|
+
* 1. Buffer - 直接设置 Content-Length 后发送
|
|
65
|
+
* 2. ReadStream - 自动 pipe 到响应
|
|
66
|
+
* 3. 文件路径字符串 - 创建读流后发送
|
|
67
|
+
*
|
|
68
|
+
* 自动设置的响应头:
|
|
69
|
+
* - Content-Disposition: 用于设置下载文件名
|
|
70
|
+
* - Content-Type: 根据 MIME 类型设置
|
|
71
|
+
* - Content-Length: 对于 Buffer 自动计算
|
|
72
|
+
*/
|
|
73
|
+
declare class 文件下载返回器 extends _______$1<Buffer | ReadStream | string> {
|
|
74
|
+
private 文件名?;
|
|
75
|
+
private MIME类型?;
|
|
76
|
+
constructor(文件名?: string | undefined, MIME类型?: string | undefined);
|
|
77
|
+
返回(req: Request, res: Response, 结果: Buffer | ReadStream | string): Promise<void>;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { 文件下载接口封装, type 文件数据类型 };
|