@lsby/net-core 0.3.12 → 0.3.13
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-list/bin.cjs +1 -2
- package/dist/bin/gen-list/index.cjs +1 -2
- package/dist/bin/gen-test/bin.cjs +1 -2
- package/dist/bin/gen-test/index.cjs +1 -2
- package/dist/bin/gen-type/bin.cjs +1 -2
- package/dist/bin/gen-type/index.cjs +1 -2
- package/dist/cjs/bin/gen-list/bin.cjs +1 -2
- package/dist/cjs/bin/gen-list/index.cjs +1 -2
- package/dist/cjs/bin/gen-test/bin.cjs +1 -2
- package/dist/cjs/bin/gen-test/index.cjs +1 -2
- package/dist/cjs/bin/gen-type/bin.cjs +1 -2
- package/dist/cjs/bin/gen-type/index.cjs +1 -2
- package/dist/cjs/extend/api-json-base.cjs +206 -0
- package/dist/cjs/extend/api-json-base.d.cts +15 -0
- package/dist/cjs/extend/api-json-wrap.cjs +257 -0
- package/dist/cjs/extend/{wrap-json.d.cts → api-json-wrap.d.cts} +14 -15
- package/dist/cjs/index.cjs +170 -37
- package/dist/cjs/index.d.cts +6 -4
- package/dist/cjs/interface/action/action.cjs +142 -0
- package/dist/cjs/interface/action/action.d.cts +90 -0
- package/dist/cjs/interface/inst/interface-abstract.cjs +123 -1
- package/dist/cjs/interface/inst/interface-abstract.d.cts +12 -11
- package/dist/cjs/interface/inst/interface.cjs +133 -5
- package/dist/cjs/interface/inst/interface.d.cts +9 -5
- package/dist/cjs/interface/type/interface-type-abstract.d.cts +6 -1
- package/dist/cjs/plugin/urlencoded.cjs +1 -2
- package/dist/cjs/server/server.cjs +1 -2
- package/dist/cjs/server/server.d.cts +2 -1
- package/dist/esm/bin/gen-list/bin.js +1 -1
- package/dist/esm/bin/gen-list/index.js +1 -1
- package/dist/esm/bin/gen-test/bin.js +1 -1
- package/dist/esm/bin/gen-test/index.js +1 -1
- package/dist/esm/bin/gen-type/bin.js +1 -1
- package/dist/esm/bin/gen-type/index.js +1 -1
- package/dist/esm/{chunk-N7VWAPFU.js → chunk-6NX5P6CE.js} +1 -2
- package/dist/esm/{chunk-YYOST4AX.js → chunk-FLDJE3PK.js} +1 -2
- package/dist/esm/{chunk-DQX4L6GK.js → chunk-GAVKGLRL.js} +1 -2
- package/dist/esm/chunk-HOO4TK2L.js +118 -0
- package/dist/esm/chunk-I5QXSZQU.js +21 -0
- package/dist/esm/chunk-ILSTOG4G.js +30 -0
- package/dist/esm/{chunk-X3JVDZYX.js → chunk-JIW3U7SL.js} +14 -19
- package/dist/esm/{chunk-CSZNLNB5.js → chunk-NCSYD5GL.js} +1 -2
- package/dist/esm/chunk-PA2HBZKY.js +16 -0
- package/dist/esm/{chunk-5UUMGDDD.js → chunk-TMFRIHV5.js} +1 -2
- package/dist/esm/extend/api-json-base.d.ts +15 -0
- package/dist/esm/extend/api-json-base.js +10 -0
- package/dist/esm/extend/{wrap-json.d.ts → api-json-wrap.d.ts} +14 -15
- package/dist/esm/extend/api-json-wrap.js +16 -0
- package/dist/esm/index.d.ts +6 -4
- package/dist/esm/index.js +19 -16
- package/dist/esm/interface/action/action.d.ts +90 -0
- package/dist/esm/interface/action/action.js +6 -0
- package/dist/esm/interface/inst/interface-abstract.d.ts +12 -11
- package/dist/esm/interface/inst/interface-abstract.js +2 -1
- package/dist/esm/interface/inst/interface.d.ts +9 -5
- package/dist/esm/interface/inst/interface.js +3 -2
- package/dist/esm/interface/type/interface-type-abstract.d.ts +6 -1
- package/dist/esm/plugin/urlencoded.js +1 -1
- package/dist/esm/server/server.d.ts +2 -1
- package/dist/esm/server/server.js +1 -1
- package/package.json +55 -55
- package/dist/cjs/extend/wrap-json.cjs +0 -128
- package/dist/esm/chunk-N2AO545F.js +0 -7
- package/dist/esm/chunk-TFOAFRUL.js +0 -22
- package/dist/esm/extend/wrap-json.js +0 -15
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { Either } from '@lsby/ts-fp-data';
|
|
2
3
|
import { 插件项类型 as _____ } from '../interface/plug.cjs';
|
|
3
|
-
import { 接口类型抽象类 as _______ } from '../interface/type/interface-type-abstract.cjs';
|
|
4
|
-
import {
|
|
4
|
+
import { 接口类型抽象类 as _______, 接口类型错误结果 as ________, 接口类型正确结果 as ________$1 } from '../interface/type/interface-type-abstract.cjs';
|
|
5
|
+
import { JSON接口基类 as JSON____ } from './api-json-base.cjs';
|
|
5
6
|
import 'express';
|
|
6
|
-
import '
|
|
7
|
+
import '../interface/inst/interface-abstract.cjs';
|
|
8
|
+
import '../result/result.cjs';
|
|
9
|
+
import '../interface/action/action.cjs';
|
|
7
10
|
|
|
8
11
|
declare abstract class 包装的接口类型抽象类<路径 extends string, 方法 extends 'get' | 'post', 插件们 extends Array<_____>, 正确返回类型 extends z.ZodTypeAny, 错误返回类型 extends z.ZodTypeAny> extends _______<路径, 方法, 插件们, z.ZodObject<{
|
|
9
12
|
status: z.ZodLiteral<'success'>;
|
|
@@ -24,6 +27,9 @@ declare abstract class 包装的接口类型抽象类<路径 extends string, 方
|
|
|
24
27
|
data: 错误返回类型;
|
|
25
28
|
}>;
|
|
26
29
|
}
|
|
30
|
+
type 任意的包装的接口类型 = 包装的接口类型抽象类<any, any, any, any, any>;
|
|
31
|
+
type 取返回类型<A> = A extends 包装的接口类型抽象类<any, any, any, infer X, any> ? X : never;
|
|
32
|
+
type 取错误类型<A> = A extends 包装的接口类型抽象类<any, any, any, any, infer X> ? X : never;
|
|
27
33
|
declare class 包装的接口类型<路径 extends string, 方法 extends 'get' | 'post', 插件们 extends Array<_____>, 正确返回类型 extends z.ZodTypeAny, 错误返回类型 extends z.ZodTypeAny> extends 包装的接口类型抽象类<路径, 方法, 插件们, 正确返回类型, 错误返回类型> {
|
|
28
34
|
private path;
|
|
29
35
|
private method;
|
|
@@ -43,17 +49,10 @@ declare class 包装的接口类型<路径 extends string, 方法 extends 'get'
|
|
|
43
49
|
data: 错误返回类型;
|
|
44
50
|
}>;
|
|
45
51
|
}
|
|
46
|
-
declare class
|
|
47
|
-
|
|
48
|
-
data:
|
|
49
|
-
|
|
50
|
-
constructor(data: Data);
|
|
51
|
-
}
|
|
52
|
-
declare class 包装的错误JSON结果<Data> extends __JSON__$1<{
|
|
53
|
-
status: 'fail';
|
|
54
|
-
data: Data;
|
|
55
|
-
}> {
|
|
56
|
-
constructor(data: Data);
|
|
52
|
+
declare abstract class JSON接口包装基类<接口类型描述 extends 任意的包装的接口类型> extends JSON____<接口类型描述> {
|
|
53
|
+
protected 构造正确返回(data: z.infer<取返回类型<接口类型描述>>): Either<z.infer<________<接口类型描述>>, z.infer<________$1<接口类型描述>>>;
|
|
54
|
+
protected 构造错误返回(data: z.infer<取错误类型<接口类型描述>>): Either<z.infer<________<接口类型描述>>, z.infer<________$1<接口类型描述>>>;
|
|
55
|
+
protected 构造包装返回(data: Either<z.infer<取错误类型<接口类型描述>>, z.infer<取返回类型<接口类型描述>>>): Either<z.infer<________<接口类型描述>>, z.infer<________$1<接口类型描述>>>;
|
|
57
56
|
}
|
|
58
57
|
|
|
59
|
-
export { 包装的接口类型,
|
|
58
|
+
export { JSON接口包装基类, 包装的接口类型, 包装的接口类型抽象类 };
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -31,12 +31,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var src_exports = {};
|
|
32
32
|
__export(src_exports, {
|
|
33
33
|
API\u63A5\u53E3\u57FA\u7C7B: () => API\u63A5\u53E3\u57FA\u7C7B,
|
|
34
|
+
JSON\u63A5\u53E3\u5305\u88C5\u57FA\u7C7B: () => JSON\u63A5\u53E3\u5305\u88C5\u57FA\u7C7B,
|
|
35
|
+
JSON\u63A5\u53E3\u57FA\u7C7B: () => JSON\u63A5\u53E3\u57FA\u7C7B,
|
|
34
36
|
JSON\u89E3\u6790\u63D2\u4EF6: () => JSON\u89E3\u6790\u63D2\u4EF6,
|
|
35
37
|
\u4E2D\u6587\u8DEF\u5F84\u652F\u6301\u63D2\u4EF6: () => \u4E2D\u6587\u8DEF\u5F84\u652F\u6301\u63D2\u4EF6,
|
|
36
38
|
\u5305\u88C5\u7684\u63A5\u53E3\u7C7B\u578B: () => \u5305\u88C5\u7684\u63A5\u53E3\u7C7B\u578B,
|
|
37
39
|
\u5305\u88C5\u7684\u63A5\u53E3\u7C7B\u578B\u62BD\u8C61\u7C7B: () => \u5305\u88C5\u7684\u63A5\u53E3\u7C7B\u578B\u62BD\u8C61\u7C7B,
|
|
38
|
-
\u5305\u88C5\u7684\u6B63\u786EJSON\u7ED3\u679C: () => \u5305\u88C5\u7684\u6B63\u786EJSON\u7ED3\u679C,
|
|
39
|
-
\u5305\u88C5\u7684\u9519\u8BEFJSON\u7ED3\u679C: () => \u5305\u88C5\u7684\u9519\u8BEFJSON\u7ED3\u679C,
|
|
40
40
|
\u63A5\u53E3: () => \u63A5\u53E3,
|
|
41
41
|
\u63A5\u53E3\u7C7B\u578B: () => \u63A5\u53E3\u7C7B\u578B,
|
|
42
42
|
\u63A5\u53E3\u7C7B\u578B\u62BD\u8C61\u7C7B: () => \u63A5\u53E3\u7C7B\u578B\u62BD\u8C61\u7C7B,
|
|
@@ -55,11 +55,128 @@ __export(src_exports, {
|
|
|
55
55
|
});
|
|
56
56
|
module.exports = __toCommonJS(src_exports);
|
|
57
57
|
|
|
58
|
-
// src/
|
|
59
|
-
var
|
|
58
|
+
// src/interface/action/action.ts
|
|
59
|
+
var import_ts_fp_data = require("@lsby/ts-fp-data");
|
|
60
|
+
var \u4E1A\u52A1\u884C\u4E3A = class _\u4E1A\u52A1\u884C\u4E3A {
|
|
61
|
+
// ================================= 静态 =================================
|
|
62
|
+
static \u901A\u8FC7\u5B9E\u73B0\u6784\u9020(\u5B9E\u73B0, \u4E1A\u52A1\u884C\u4E3A\u540D\u79F0) {
|
|
63
|
+
return new class extends _\u4E1A\u52A1\u884C\u4E3A {
|
|
64
|
+
async \u4E1A\u52A1\u884C\u4E3A\u5B9E\u73B0(\u53C2\u6570) {
|
|
65
|
+
return \u5B9E\u73B0(\u53C2\u6570);
|
|
66
|
+
}
|
|
67
|
+
}(\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0);
|
|
68
|
+
}
|
|
69
|
+
static \u6D41\u5F0F\u7EC4\u5408(a, b) {
|
|
70
|
+
return a.\u6D41\u5F0F\u7EC4\u5408(b);
|
|
71
|
+
}
|
|
72
|
+
static \u6DF7\u5408\u7EC4\u5408(a, b) {
|
|
73
|
+
return a.\u6DF7\u5408\u7EC4\u5408(b);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 对多个项混合组合
|
|
77
|
+
*/
|
|
78
|
+
static \u6DF7\u5408\u7EC4\u5408\u591A\u9879(arr) {
|
|
79
|
+
return arr.reduce((s, a) => s.\u6DF7\u5408\u7EC4\u5408(a));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 同时运行多个模型, 并提供一个函数处理它们的结果
|
|
83
|
+
* 如果其中任何一个模型发生错误, 则最终模型输出第一个错误
|
|
84
|
+
* 处理函数的类型是: 所有模型的结果合并 => 泛型A
|
|
85
|
+
* 新模型的类型是:
|
|
86
|
+
* - 参数: 所有模型的参数合并
|
|
87
|
+
* - 错误: 所有模型的错误合并
|
|
88
|
+
* - 返回值: 泛型A
|
|
89
|
+
*/
|
|
90
|
+
static \u5E76\u884C\u7EC4\u5408(arr, f) {
|
|
91
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(
|
|
92
|
+
async (\u53C2\u6570) => {
|
|
93
|
+
var \u6240\u6709\u7ED3\u679C = await Promise.all(arr.map((a) => a.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570)));
|
|
94
|
+
var \u9519\u8BEF = \u6240\u6709\u7ED3\u679C.filter((a) => a.isLeft())[0];
|
|
95
|
+
if (\u9519\u8BEF) return \u9519\u8BEF;
|
|
96
|
+
var \u6B63\u786E\u7ED3\u679C\u5408\u5E76 = \u6240\u6709\u7ED3\u679C.map((a) => a.assertRight().getRight()).reduce((s, a) => Object.assign(s, a), {});
|
|
97
|
+
return new import_ts_fp_data.Right(await f(\u6B63\u786E\u7ED3\u679C\u5408\u5E76));
|
|
98
|
+
},
|
|
99
|
+
`\u5E76\u884C\u7EC4\u5408(${arr.map((a) => a.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0).join(", ")})`
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
// ================================= 私有 =================================
|
|
103
|
+
\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0;
|
|
104
|
+
constructor(\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0) {
|
|
105
|
+
if (!\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0) this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0 = this.constructor.name || "<\u533F\u540D>";
|
|
106
|
+
else this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0 = \u4E1A\u52A1\u884C\u4E3A\u540D\u79F0;
|
|
107
|
+
}
|
|
108
|
+
// ================================= 设置 =================================
|
|
109
|
+
\u8BBE\u7F6E\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0(\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0) {
|
|
110
|
+
this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0 = \u4E1A\u52A1\u884C\u4E3A\u540D\u79F0;
|
|
111
|
+
return this;
|
|
112
|
+
}
|
|
113
|
+
\u8BBE\u7F6E\u53C2\u6570(\u8BBE\u7F6E\u53C2\u6570) {
|
|
114
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(async (\u53C2\u6570) => {
|
|
115
|
+
return await this.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A({ ...\u8BBE\u7F6E\u53C2\u6570, ...\u53C2\u6570 });
|
|
116
|
+
}, this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0);
|
|
117
|
+
}
|
|
118
|
+
// ================================= 运行 =================================
|
|
119
|
+
async \u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570) {
|
|
120
|
+
try {
|
|
121
|
+
return await this.\u4E1A\u52A1\u884C\u4E3A\u5B9E\u73B0(\u53C2\u6570);
|
|
122
|
+
} catch (e) {
|
|
123
|
+
throw e;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// ================================= 组合 =================================
|
|
127
|
+
/**
|
|
128
|
+
* 将两个模型串接, 得到一个新模型, 新模型的类型是:
|
|
129
|
+
* - 参数: a模型的参数
|
|
130
|
+
* - 错误: a模型的错误+b模型的错误
|
|
131
|
+
* - 返回值: b模型的返回值
|
|
132
|
+
*/
|
|
133
|
+
\u6D41\u5F0F\u7EC4\u5408(b) {
|
|
134
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(async (\u53C2\u6570) => {
|
|
135
|
+
const \u6211\u7684\u7ED3\u679C = await this.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570);
|
|
136
|
+
if (\u6211\u7684\u7ED3\u679C.isLeft()) return new import_ts_fp_data.Left(\u6211\u7684\u7ED3\u679C.assertLeft().getLeft());
|
|
137
|
+
return b.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u6211\u7684\u7ED3\u679C.assertRight().getRight());
|
|
138
|
+
}, `\u6D41\u5F0F\u7EC4\u5408(${this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0}, ${b.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0})`);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 将两个模型串接, 得到一个新的模型
|
|
142
|
+
* 相比流式组合, 本函数不要求串联位置参数匹配, 缺少的参数将在调用时补全
|
|
143
|
+
* 新模型的类型是:
|
|
144
|
+
* - 参数: a模型的参数+(b模型的参数-a模型的返回值)
|
|
145
|
+
* - 错误: a模型的错误+b模型的错误
|
|
146
|
+
* - 返回值: a模型的返回值+b模型的返回值
|
|
147
|
+
*/
|
|
148
|
+
\u6DF7\u5408\u7EC4\u5408(b) {
|
|
149
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(async (\u53C2\u6570) => {
|
|
150
|
+
const \u6211\u7684\u7ED3\u679C = await this.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570);
|
|
151
|
+
if (\u6211\u7684\u7ED3\u679C.isLeft()) return new import_ts_fp_data.Left(\u6211\u7684\u7ED3\u679C.assertLeft().getLeft());
|
|
152
|
+
var \u5BF9\u65B9\u7ED3\u679C = await b.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A({ ...\u53C2\u6570, ...\u6211\u7684\u7ED3\u679C.assertRight().getRight() });
|
|
153
|
+
return \u5BF9\u65B9\u7ED3\u679C.map((a) => Object.assign(a, \u6211\u7684\u7ED3\u679C.assertRight().getRight()));
|
|
154
|
+
}, `\u6DF7\u5408\u7EC4\u5408(${this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0}, ${b.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0})`);
|
|
155
|
+
}
|
|
156
|
+
// ================================= 映射 =================================
|
|
157
|
+
\u6620\u5C04\u7ED3\u679C(f) {
|
|
158
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(async (\u53C2\u6570) => {
|
|
159
|
+
const \u6211\u7684\u7ED3\u679C = await this.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570);
|
|
160
|
+
if (\u6211\u7684\u7ED3\u679C.isLeft()) return new import_ts_fp_data.Left(\u6211\u7684\u7ED3\u679C.assertLeft().getLeft());
|
|
161
|
+
return import_ts_fp_data.Either.pure(f(\u6211\u7684\u7ED3\u679C.assertRight().getRight()));
|
|
162
|
+
}, this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0);
|
|
163
|
+
}
|
|
164
|
+
\u6620\u5C04\u9519\u8BEF(f) {
|
|
165
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(async (\u53C2\u6570) => {
|
|
166
|
+
const \u6211\u7684\u7ED3\u679C = await this.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570);
|
|
167
|
+
if (\u6211\u7684\u7ED3\u679C.isLeft()) return new import_ts_fp_data.Left(f(\u6211\u7684\u7ED3\u679C.assertLeft().getLeft()));
|
|
168
|
+
return import_ts_fp_data.Either.pure(\u6211\u7684\u7ED3\u679C.assertRight().getRight());
|
|
169
|
+
}, this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
60
172
|
|
|
61
|
-
// src/interface/
|
|
62
|
-
var \u63A5\u53E3\
|
|
173
|
+
// src/interface/inst/interface-abstract.ts
|
|
174
|
+
var API\u63A5\u53E3\u57FA\u7C7B = class extends \u4E1A\u52A1\u884C\u4E3A {
|
|
175
|
+
async API\u5B9E\u73B0(\u53C2\u6570) {
|
|
176
|
+
var c = await this.\u4E1A\u52A1\u884C\u4E3A\u5B9E\u73B0(\u53C2\u6570);
|
|
177
|
+
if (c.isLeft()) return this.\u5305\u88C5\u9519\u8BEF\u7ED3\u679C(c.assertLeft().getLeft());
|
|
178
|
+
return this.\u5305\u88C5\u6B63\u786E\u7ED3\u679C(c.assertRight().getRight());
|
|
179
|
+
}
|
|
63
180
|
};
|
|
64
181
|
|
|
65
182
|
// src/global/global.ts
|
|
@@ -114,7 +231,25 @@ var \u9519\u8BEFJSON\u7ED3\u679C = class extends \u9519\u8BEF\u7ED3\u679C {
|
|
|
114
231
|
}
|
|
115
232
|
};
|
|
116
233
|
|
|
117
|
-
// src/extend/
|
|
234
|
+
// src/extend/api-json-base.ts
|
|
235
|
+
var JSON\u63A5\u53E3\u57FA\u7C7B = class extends API\u63A5\u53E3\u57FA\u7C7B {
|
|
236
|
+
\u5305\u88C5\u6B63\u786E\u7ED3\u679C(\u6570\u636E) {
|
|
237
|
+
return new \u6B63\u786EJSON\u7ED3\u679C(\u6570\u636E);
|
|
238
|
+
}
|
|
239
|
+
\u5305\u88C5\u9519\u8BEF\u7ED3\u679C(\u6570\u636E) {
|
|
240
|
+
return new \u9519\u8BEFJSON\u7ED3\u679C(\u6570\u636E);
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// src/extend/api-json-wrap.ts
|
|
245
|
+
var import_zod = require("zod");
|
|
246
|
+
var import_ts_fp_data2 = require("@lsby/ts-fp-data");
|
|
247
|
+
|
|
248
|
+
// src/interface/type/interface-type-abstract.ts
|
|
249
|
+
var \u63A5\u53E3\u7C7B\u578B\u62BD\u8C61\u7C7B = class {
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
// src/extend/api-json-wrap.ts
|
|
118
253
|
var \u5305\u88C5\u7684\u63A5\u53E3\u7C7B\u578B\u62BD\u8C61\u7C7B = class extends \u63A5\u53E3\u7C7B\u578B\u62BD\u8C61\u7C7B {
|
|
119
254
|
};
|
|
120
255
|
var \u5305\u88C5\u7684\u63A5\u53E3\u7C7B\u578B = class extends \u5305\u88C5\u7684\u63A5\u53E3\u7C7B\u578B\u62BD\u8C61\u7C7B {
|
|
@@ -142,51 +277,51 @@ var \u5305\u88C5\u7684\u63A5\u53E3\u7C7B\u578B = class extends \u5305\u88C5\u768
|
|
|
142
277
|
return import_zod.z.object({ status: import_zod.z.literal("fail"), data: this.\u9519\u8BEF\u8FD4\u56DE\u7C7B\u578B });
|
|
143
278
|
}
|
|
144
279
|
};
|
|
145
|
-
var \u5305\u88C5\
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
status: "success",
|
|
149
|
-
data
|
|
150
|
-
});
|
|
280
|
+
var JSON\u63A5\u53E3\u5305\u88C5\u57FA\u7C7B = class extends JSON\u63A5\u53E3\u57FA\u7C7B {
|
|
281
|
+
\u6784\u9020\u6B63\u786E\u8FD4\u56DE(data) {
|
|
282
|
+
return new import_ts_fp_data2.Right({ status: "success", data });
|
|
151
283
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
});
|
|
284
|
+
\u6784\u9020\u9519\u8BEF\u8FD4\u56DE(data) {
|
|
285
|
+
return new import_ts_fp_data2.Left({ status: "fail", data });
|
|
286
|
+
}
|
|
287
|
+
\u6784\u9020\u5305\u88C5\u8FD4\u56DE(data) {
|
|
288
|
+
if (data.isLeft()) return new import_ts_fp_data2.Left({ status: "fail", data: data.assertLeft().getLeft() });
|
|
289
|
+
return new import_ts_fp_data2.Right({ status: "success", data: data.assertRight().getRight() });
|
|
159
290
|
}
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
// src/interface/inst/interface-abstract.ts
|
|
163
|
-
var API\u63A5\u53E3\u57FA\u7C7B = class {
|
|
164
291
|
};
|
|
165
292
|
|
|
166
293
|
// src/interface/inst/interface.ts
|
|
167
294
|
var \u63A5\u53E3 = class extends API\u63A5\u53E3\u57FA\u7C7B {
|
|
168
|
-
constructor(\u63A5\u53E3\u7C7B\u578B2, \u5B9E\u73B0) {
|
|
295
|
+
constructor(\u63A5\u53E3\u7C7B\u578B2, \u6B63\u786E\u7ED3\u679C\u5305\u88C5\u5668, \u9519\u8BEF\u7ED3\u679C\u5305\u88C5\u5668, \u5B9E\u73B0) {
|
|
169
296
|
super();
|
|
170
297
|
this.\u63A5\u53E3\u7C7B\u578B = \u63A5\u53E3\u7C7B\u578B2;
|
|
298
|
+
this.\u6B63\u786E\u7ED3\u679C\u5305\u88C5\u5668 = \u6B63\u786E\u7ED3\u679C\u5305\u88C5\u5668;
|
|
299
|
+
this.\u9519\u8BEF\u7ED3\u679C\u5305\u88C5\u5668 = \u9519\u8BEF\u7ED3\u679C\u5305\u88C5\u5668;
|
|
171
300
|
this.\u5B9E\u73B0 = \u5B9E\u73B0;
|
|
172
301
|
}
|
|
302
|
+
\u5305\u88C5\u6B63\u786E\u7ED3\u679C(a) {
|
|
303
|
+
return this.\u6B63\u786E\u7ED3\u679C\u5305\u88C5\u5668(a);
|
|
304
|
+
}
|
|
305
|
+
\u5305\u88C5\u9519\u8BEF\u7ED3\u679C(a) {
|
|
306
|
+
return this.\u9519\u8BEF\u7ED3\u679C\u5305\u88C5\u5668(a);
|
|
307
|
+
}
|
|
308
|
+
\u4E1A\u52A1\u884C\u4E3A\u5B9E\u73B0(\u53C2\u6570) {
|
|
309
|
+
return this.\u5B9E\u73B0(\u53C2\u6570);
|
|
310
|
+
}
|
|
173
311
|
\u83B7\u5F97API\u7C7B\u578B() {
|
|
174
312
|
return this.\u63A5\u53E3\u7C7B\u578B;
|
|
175
313
|
}
|
|
176
|
-
API\u5B9E\u73B0(ctx) {
|
|
177
|
-
return this.\u5B9E\u73B0(ctx);
|
|
178
|
-
}
|
|
179
314
|
};
|
|
180
315
|
|
|
181
316
|
// src/interface/type/interface-type.ts
|
|
182
317
|
var \u63A5\u53E3\u7C7B\u578B = class extends \u63A5\u53E3\u7C7B\u578B\u62BD\u8C61\u7C7B {
|
|
183
|
-
constructor(\u8DEF\u5F84, \u65B9\u6CD5, \u63D2\u4EF6\u4EEC, \u6B63\u786E\u7ED3\
|
|
318
|
+
constructor(\u8DEF\u5F84, \u65B9\u6CD5, \u63D2\u4EF6\u4EEC, \u6B63\u786E\u7ED3\u679C3, \u9519\u8BEF\u7ED3\u679C3) {
|
|
184
319
|
super();
|
|
185
320
|
this.\u8DEF\u5F84 = \u8DEF\u5F84;
|
|
186
321
|
this.\u65B9\u6CD5 = \u65B9\u6CD5;
|
|
187
322
|
this.\u63D2\u4EF6\u4EEC = \u63D2\u4EF6\u4EEC;
|
|
188
|
-
this.\u6B63\u786E\u7ED3\u679C = \u6B63\u786E\u7ED3\
|
|
189
|
-
this.\u9519\u8BEF\u7ED3\u679C = \u9519\u8BEF\u7ED3\
|
|
323
|
+
this.\u6B63\u786E\u7ED3\u679C = \u6B63\u786E\u7ED3\u679C3;
|
|
324
|
+
this.\u9519\u8BEF\u7ED3\u679C = \u9519\u8BEF\u7ED3\u679C3;
|
|
190
325
|
}
|
|
191
326
|
\u83B7\u5F97\u8DEF\u5F84() {
|
|
192
327
|
return this.\u8DEF\u5F84;
|
|
@@ -279,8 +414,7 @@ var \u8868\u5355\u89E3\u6790\u63D2\u4EF6 = class extends \u63D2\u4EF6 {
|
|
|
279
414
|
})
|
|
280
415
|
);
|
|
281
416
|
const parseResult = t.safeParse({ body: req.body });
|
|
282
|
-
if (!parseResult.success)
|
|
283
|
-
throw new Error((0, import_node_util2.format)("parse url encoded body failed: %O", parseResult.error));
|
|
417
|
+
if (!parseResult.success) throw new Error((0, import_node_util2.format)("parse url encoded body failed: %O", parseResult.error));
|
|
284
418
|
return { body: parseResult.data.body };
|
|
285
419
|
});
|
|
286
420
|
}
|
|
@@ -348,8 +482,7 @@ var \u670D\u52A1\u5668 = class {
|
|
|
348
482
|
await new Promise((res, _rej) => {
|
|
349
483
|
server = app.listen(this.\u7AEF\u53E3, () => res());
|
|
350
484
|
});
|
|
351
|
-
if (server == null)
|
|
352
|
-
throw new Error("\u542F\u52A8\u670D\u52A1\u5668\u5931\u8D25");
|
|
485
|
+
if (server == null) throw new Error("\u542F\u52A8\u670D\u52A1\u5668\u5931\u8D25");
|
|
353
486
|
return {
|
|
354
487
|
ip: Object.values((0, import_node_os.networkInterfaces)()).flat().flatMap((address) => address !== void 0 ? [address] : []).map((wrappedAddress) => wrappedAddress.address).map((address) => `http://${address}:${this.\u7AEF\u53E3}`),
|
|
355
488
|
server
|
|
@@ -390,12 +523,12 @@ var \u6D4B\u8BD5 = class extends \u6D4B\u8BD5\u62BD\u8C61\u7C7B {
|
|
|
390
523
|
// Annotate the CommonJS export names for ESM import in node:
|
|
391
524
|
0 && (module.exports = {
|
|
392
525
|
API\u63A5\u53E3\u57FA\u7C7B,
|
|
526
|
+
JSON\u63A5\u53E3\u5305\u88C5\u57FA\u7C7B,
|
|
527
|
+
JSON\u63A5\u53E3\u57FA\u7C7B,
|
|
393
528
|
JSON\u89E3\u6790\u63D2\u4EF6,
|
|
394
529
|
\u4E2D\u6587\u8DEF\u5F84\u652F\u6301\u63D2\u4EF6,
|
|
395
530
|
\u5305\u88C5\u7684\u63A5\u53E3\u7C7B\u578B,
|
|
396
531
|
\u5305\u88C5\u7684\u63A5\u53E3\u7C7B\u578B\u62BD\u8C61\u7C7B,
|
|
397
|
-
\u5305\u88C5\u7684\u6B63\u786EJSON\u7ED3\u679C,
|
|
398
|
-
\u5305\u88C5\u7684\u9519\u8BEFJSON\u7ED3\u679C,
|
|
399
532
|
\u63A5\u53E3,
|
|
400
533
|
\u63A5\u53E3\u7C7B\u578B,
|
|
401
534
|
\u63A5\u53E3\u7C7B\u578B\u62BD\u8C61\u7C7B,
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { JSON接口基类 } from './extend/api-json-base.cjs';
|
|
2
|
+
export { JSON接口包装基类, 包装的接口类型, 包装的接口类型抽象类 } from './extend/api-json-wrap.cjs';
|
|
2
3
|
export { 接口 } from './interface/inst/interface.cjs';
|
|
3
|
-
export { API接口基类, 任意接口, 计算实现参数,
|
|
4
|
+
export { API接口基类, 任意接口, 计算实现参数, 计算实现返回 } from './interface/inst/interface-abstract.cjs';
|
|
4
5
|
export { 接口类型 } from './interface/type/interface-type.cjs';
|
|
5
|
-
export { 任意接口类型, 接口类型抽象类, 获得接口插件们 } from './interface/type/interface-type-abstract.cjs';
|
|
6
|
+
export { 任意接口类型, 接口类型抽象类, 接口类型插件们, 接口类型方法, 接口类型正确结果, 接口类型路径, 接口类型错误结果, 获得接口插件们 } from './interface/type/interface-type-abstract.cjs';
|
|
6
7
|
export { 任意插件, 包装插件项, 取插件内部类型, 合并插件结果, 插件, 插件项类型 } from './interface/plug.cjs';
|
|
7
8
|
export { 中文路径支持插件 } from './plugin/chinese-path.cjs';
|
|
8
9
|
export { 自定义数据插件 } from './plugin/custom-data.cjs';
|
|
@@ -13,6 +14,7 @@ export { 服务器 } from './server/server.cjs';
|
|
|
13
14
|
export { 测试 } from './test/test.cjs';
|
|
14
15
|
export { 测试抽象类 } from './test/test-abstract.cjs';
|
|
15
16
|
import 'zod';
|
|
16
|
-
import 'express';
|
|
17
17
|
import '@lsby/ts-fp-data';
|
|
18
|
+
import './interface/action/action.cjs';
|
|
19
|
+
import 'express';
|
|
18
20
|
import 'node:http';
|
|
@@ -0,0 +1,142 @@
|
|
|
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/interface/action/action.ts
|
|
21
|
+
var action_exports = {};
|
|
22
|
+
__export(action_exports, {
|
|
23
|
+
\u4E1A\u52A1\u884C\u4E3A: () => \u4E1A\u52A1\u884C\u4E3A
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(action_exports);
|
|
26
|
+
var import_ts_fp_data = require("@lsby/ts-fp-data");
|
|
27
|
+
var \u4E1A\u52A1\u884C\u4E3A = class _\u4E1A\u52A1\u884C\u4E3A {
|
|
28
|
+
// ================================= 静态 =================================
|
|
29
|
+
static \u901A\u8FC7\u5B9E\u73B0\u6784\u9020(\u5B9E\u73B0, \u4E1A\u52A1\u884C\u4E3A\u540D\u79F0) {
|
|
30
|
+
return new class extends _\u4E1A\u52A1\u884C\u4E3A {
|
|
31
|
+
async \u4E1A\u52A1\u884C\u4E3A\u5B9E\u73B0(\u53C2\u6570) {
|
|
32
|
+
return \u5B9E\u73B0(\u53C2\u6570);
|
|
33
|
+
}
|
|
34
|
+
}(\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0);
|
|
35
|
+
}
|
|
36
|
+
static \u6D41\u5F0F\u7EC4\u5408(a, b) {
|
|
37
|
+
return a.\u6D41\u5F0F\u7EC4\u5408(b);
|
|
38
|
+
}
|
|
39
|
+
static \u6DF7\u5408\u7EC4\u5408(a, b) {
|
|
40
|
+
return a.\u6DF7\u5408\u7EC4\u5408(b);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 对多个项混合组合
|
|
44
|
+
*/
|
|
45
|
+
static \u6DF7\u5408\u7EC4\u5408\u591A\u9879(arr) {
|
|
46
|
+
return arr.reduce((s, a) => s.\u6DF7\u5408\u7EC4\u5408(a));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 同时运行多个模型, 并提供一个函数处理它们的结果
|
|
50
|
+
* 如果其中任何一个模型发生错误, 则最终模型输出第一个错误
|
|
51
|
+
* 处理函数的类型是: 所有模型的结果合并 => 泛型A
|
|
52
|
+
* 新模型的类型是:
|
|
53
|
+
* - 参数: 所有模型的参数合并
|
|
54
|
+
* - 错误: 所有模型的错误合并
|
|
55
|
+
* - 返回值: 泛型A
|
|
56
|
+
*/
|
|
57
|
+
static \u5E76\u884C\u7EC4\u5408(arr, f) {
|
|
58
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(
|
|
59
|
+
async (\u53C2\u6570) => {
|
|
60
|
+
var \u6240\u6709\u7ED3\u679C = await Promise.all(arr.map((a) => a.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570)));
|
|
61
|
+
var \u9519\u8BEF = \u6240\u6709\u7ED3\u679C.filter((a) => a.isLeft())[0];
|
|
62
|
+
if (\u9519\u8BEF) return \u9519\u8BEF;
|
|
63
|
+
var \u6B63\u786E\u7ED3\u679C\u5408\u5E76 = \u6240\u6709\u7ED3\u679C.map((a) => a.assertRight().getRight()).reduce((s, a) => Object.assign(s, a), {});
|
|
64
|
+
return new import_ts_fp_data.Right(await f(\u6B63\u786E\u7ED3\u679C\u5408\u5E76));
|
|
65
|
+
},
|
|
66
|
+
`\u5E76\u884C\u7EC4\u5408(${arr.map((a) => a.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0).join(", ")})`
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
// ================================= 私有 =================================
|
|
70
|
+
\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0;
|
|
71
|
+
constructor(\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0) {
|
|
72
|
+
if (!\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0) this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0 = this.constructor.name || "<\u533F\u540D>";
|
|
73
|
+
else this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0 = \u4E1A\u52A1\u884C\u4E3A\u540D\u79F0;
|
|
74
|
+
}
|
|
75
|
+
// ================================= 设置 =================================
|
|
76
|
+
\u8BBE\u7F6E\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0(\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0) {
|
|
77
|
+
this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0 = \u4E1A\u52A1\u884C\u4E3A\u540D\u79F0;
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
\u8BBE\u7F6E\u53C2\u6570(\u8BBE\u7F6E\u53C2\u6570) {
|
|
81
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(async (\u53C2\u6570) => {
|
|
82
|
+
return await this.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A({ ...\u8BBE\u7F6E\u53C2\u6570, ...\u53C2\u6570 });
|
|
83
|
+
}, this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0);
|
|
84
|
+
}
|
|
85
|
+
// ================================= 运行 =================================
|
|
86
|
+
async \u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570) {
|
|
87
|
+
try {
|
|
88
|
+
return await this.\u4E1A\u52A1\u884C\u4E3A\u5B9E\u73B0(\u53C2\u6570);
|
|
89
|
+
} catch (e) {
|
|
90
|
+
throw e;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// ================================= 组合 =================================
|
|
94
|
+
/**
|
|
95
|
+
* 将两个模型串接, 得到一个新模型, 新模型的类型是:
|
|
96
|
+
* - 参数: a模型的参数
|
|
97
|
+
* - 错误: a模型的错误+b模型的错误
|
|
98
|
+
* - 返回值: b模型的返回值
|
|
99
|
+
*/
|
|
100
|
+
\u6D41\u5F0F\u7EC4\u5408(b) {
|
|
101
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(async (\u53C2\u6570) => {
|
|
102
|
+
const \u6211\u7684\u7ED3\u679C = await this.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570);
|
|
103
|
+
if (\u6211\u7684\u7ED3\u679C.isLeft()) return new import_ts_fp_data.Left(\u6211\u7684\u7ED3\u679C.assertLeft().getLeft());
|
|
104
|
+
return b.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u6211\u7684\u7ED3\u679C.assertRight().getRight());
|
|
105
|
+
}, `\u6D41\u5F0F\u7EC4\u5408(${this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0}, ${b.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0})`);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 将两个模型串接, 得到一个新的模型
|
|
109
|
+
* 相比流式组合, 本函数不要求串联位置参数匹配, 缺少的参数将在调用时补全
|
|
110
|
+
* 新模型的类型是:
|
|
111
|
+
* - 参数: a模型的参数+(b模型的参数-a模型的返回值)
|
|
112
|
+
* - 错误: a模型的错误+b模型的错误
|
|
113
|
+
* - 返回值: a模型的返回值+b模型的返回值
|
|
114
|
+
*/
|
|
115
|
+
\u6DF7\u5408\u7EC4\u5408(b) {
|
|
116
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(async (\u53C2\u6570) => {
|
|
117
|
+
const \u6211\u7684\u7ED3\u679C = await this.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570);
|
|
118
|
+
if (\u6211\u7684\u7ED3\u679C.isLeft()) return new import_ts_fp_data.Left(\u6211\u7684\u7ED3\u679C.assertLeft().getLeft());
|
|
119
|
+
var \u5BF9\u65B9\u7ED3\u679C = await b.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A({ ...\u53C2\u6570, ...\u6211\u7684\u7ED3\u679C.assertRight().getRight() });
|
|
120
|
+
return \u5BF9\u65B9\u7ED3\u679C.map((a) => Object.assign(a, \u6211\u7684\u7ED3\u679C.assertRight().getRight()));
|
|
121
|
+
}, `\u6DF7\u5408\u7EC4\u5408(${this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0}, ${b.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0})`);
|
|
122
|
+
}
|
|
123
|
+
// ================================= 映射 =================================
|
|
124
|
+
\u6620\u5C04\u7ED3\u679C(f) {
|
|
125
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(async (\u53C2\u6570) => {
|
|
126
|
+
const \u6211\u7684\u7ED3\u679C = await this.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570);
|
|
127
|
+
if (\u6211\u7684\u7ED3\u679C.isLeft()) return new import_ts_fp_data.Left(\u6211\u7684\u7ED3\u679C.assertLeft().getLeft());
|
|
128
|
+
return import_ts_fp_data.Either.pure(f(\u6211\u7684\u7ED3\u679C.assertRight().getRight()));
|
|
129
|
+
}, this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0);
|
|
130
|
+
}
|
|
131
|
+
\u6620\u5C04\u9519\u8BEF(f) {
|
|
132
|
+
return _\u4E1A\u52A1\u884C\u4E3A.\u901A\u8FC7\u5B9E\u73B0\u6784\u9020(async (\u53C2\u6570) => {
|
|
133
|
+
const \u6211\u7684\u7ED3\u679C = await this.\u8FD0\u884C\u4E1A\u52A1\u884C\u4E3A(\u53C2\u6570);
|
|
134
|
+
if (\u6211\u7684\u7ED3\u679C.isLeft()) return new import_ts_fp_data.Left(f(\u6211\u7684\u7ED3\u679C.assertLeft().getLeft()));
|
|
135
|
+
return import_ts_fp_data.Either.pure(\u6211\u7684\u7ED3\u679C.assertRight().getRight());
|
|
136
|
+
}, this.\u4E1A\u52A1\u884C\u4E3A\u540D\u79F0);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
140
|
+
0 && (module.exports = {
|
|
141
|
+
\u4E1A\u52A1\u884C\u4E3A
|
|
142
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Either } from '@lsby/ts-fp-data';
|
|
2
|
+
|
|
3
|
+
type 业务行为错误类型 = string | never;
|
|
4
|
+
type 业务行为参数类型 = Record<string, any>;
|
|
5
|
+
type 业务行为返回类型 = Record<string, any>;
|
|
6
|
+
type 任意业务行为 = 业务行为<any, any, any>;
|
|
7
|
+
type 计算混合组合<A参数类型 extends 业务行为参数类型, A错误类型 extends 业务行为错误类型, A返回类型 extends 业务行为返回类型, B参数类型 extends 业务行为参数类型, B错误类型 extends 业务行为错误类型, B返回类型 extends 业务行为返回类型> = 业务行为<A参数类型 & Omit<B参数类型, keyof A返回类型>, A错误类型 | B错误类型, A返回类型 & B返回类型>;
|
|
8
|
+
type 计算混合单一组合<A, B> = A extends 业务行为<infer A参数, infer A错误, infer A返回> ? B extends 业务行为<infer B参数, infer B错误, infer B返回> ? 计算混合组合<A参数, A错误, A返回, B参数, B错误, B返回> : never : never;
|
|
9
|
+
type 计算混合组合数组<Arr> = Arr extends [infer x, infer y] ? 计算混合单一组合<x, y> : Arr extends [infer x, infer y, ...infer s] ? 计算混合组合数组<[计算混合单一组合<x, y>, ...s]> : never;
|
|
10
|
+
type 计算合并<Arr> = Arr extends [] ? 业务行为<{}, never, {}> : Arr extends [infer x, ...infer xs] ? x extends 业务行为<infer 参数1, infer 错误1, infer 返回1> ? 计算合并<xs> extends 业务行为<infer 参数2, infer 错误2, infer 返回2> ? 业务行为<参数1 & 参数2, 错误1 | 错误2, 返回1 & 返回2> : never : never : never;
|
|
11
|
+
type 取参数<A> = A extends 业务行为<infer 参数, infer _错误, infer _返回> ? 参数 : never;
|
|
12
|
+
type 取错误<A> = A extends 业务行为<infer _参数, infer 错误, infer _返回> ? 错误 : never;
|
|
13
|
+
type 取返回<A> = A extends 业务行为<infer _参数, infer _错误, infer 返回> ? 返回 : never;
|
|
14
|
+
/**
|
|
15
|
+
* ## 业务行为
|
|
16
|
+
*
|
|
17
|
+
* 业务行为是代码中业务逻辑的抽象表示
|
|
18
|
+
* 其本质是一个执行特定业务逻辑的函数
|
|
19
|
+
* 其特点是:
|
|
20
|
+
* - 业务相关: 比起普通函数, 特化了一部分逻辑, 以更好的适应业务逻辑的需要
|
|
21
|
+
* - 类型安全: 遵循 先类型 后实现 的原则
|
|
22
|
+
* - 可组合: 基于该模型, 可以创建出各种具有想象力的组合模式
|
|
23
|
+
*
|
|
24
|
+
* ## 实现
|
|
25
|
+
*
|
|
26
|
+
* 对于业务行为而言, 至少应该明确:
|
|
27
|
+
* - 参数: 该函数需要的信息
|
|
28
|
+
* - 错误: 该函数可能发生的错误
|
|
29
|
+
* - 返回: 该函数正确执行时返回的数据
|
|
30
|
+
*
|
|
31
|
+
* 当编写一个业务行为时, 必须先明确以上值的类型, 然后继承该基类进行实现
|
|
32
|
+
*
|
|
33
|
+
* 实现中, 可以获得参数.
|
|
34
|
+
* 实现中, 必须返回一个左值或一个右值, 当然也可能意外抛出错误
|
|
35
|
+
* 当意外的抛出错误时, 会原封不动的抛出错误
|
|
36
|
+
*
|
|
37
|
+
* ## 组合
|
|
38
|
+
*
|
|
39
|
+
* 可以将业务逻辑进行组合, 创造出新的业务逻辑
|
|
40
|
+
*
|
|
41
|
+
* ## 使用
|
|
42
|
+
*
|
|
43
|
+
* 通过`运行业务行为`来执行该业务行为
|
|
44
|
+
* 这将会得到实现中返回的结果
|
|
45
|
+
*/
|
|
46
|
+
declare abstract class 业务行为<参数类型 extends 业务行为参数类型, 错误类型 extends 业务行为错误类型, 返回类型 extends 业务行为返回类型> {
|
|
47
|
+
static 通过实现构造<参数类型 extends 业务行为参数类型, 错误类型 extends 业务行为错误类型, 返回类型 extends 业务行为返回类型>(实现: (参数: 参数类型) => Promise<Either<错误类型, 返回类型>>, 业务行为名称?: string): 业务行为<参数类型, 错误类型, 返回类型>;
|
|
48
|
+
static 流式组合<A参数类型 extends 业务行为参数类型, A错误类型 extends 业务行为错误类型, A返回类型 extends 业务行为返回类型, B错误类型 extends 业务行为错误类型, B返回类型 extends 业务行为返回类型>(a: 业务行为<A参数类型, A错误类型, A返回类型>, b: 业务行为<A返回类型, B错误类型, B返回类型>): 业务行为<A参数类型, A错误类型 | B错误类型, B返回类型>;
|
|
49
|
+
static 混合组合<A参数类型 extends 业务行为参数类型, A错误类型 extends 业务行为错误类型, A返回类型 extends 业务行为返回类型, B参数类型 extends 业务行为参数类型, B错误类型 extends 业务行为错误类型, B返回类型 extends 业务行为返回类型>(a: 业务行为<A参数类型, A错误类型, A返回类型>, b: 业务行为<B参数类型, B错误类型, B返回类型>): 计算混合组合<A参数类型, A错误类型, A返回类型, B参数类型, B错误类型, B返回类型>;
|
|
50
|
+
/**
|
|
51
|
+
* 对多个项混合组合
|
|
52
|
+
*/
|
|
53
|
+
static 混合组合多项<A extends 任意业务行为[]>(arr: [...A]): 计算混合组合数组<A>;
|
|
54
|
+
/**
|
|
55
|
+
* 同时运行多个模型, 并提供一个函数处理它们的结果
|
|
56
|
+
* 如果其中任何一个模型发生错误, 则最终模型输出第一个错误
|
|
57
|
+
* 处理函数的类型是: 所有模型的结果合并 => 泛型A
|
|
58
|
+
* 新模型的类型是:
|
|
59
|
+
* - 参数: 所有模型的参数合并
|
|
60
|
+
* - 错误: 所有模型的错误合并
|
|
61
|
+
* - 返回值: 泛型A
|
|
62
|
+
*/
|
|
63
|
+
static 并行组合<X extends 任意业务行为[], A extends 业务行为返回类型>(arr: [...X], f: (a: 取返回<计算合并<X>>) => Promise<A>): 业务行为<取参数<计算合并<X>>, 取错误<计算合并<X>>, A>;
|
|
64
|
+
private 业务行为名称;
|
|
65
|
+
constructor(业务行为名称?: string);
|
|
66
|
+
protected abstract 业务行为实现(参数: 参数类型): Promise<Either<错误类型, 返回类型>>;
|
|
67
|
+
设置业务行为名称(业务行为名称: string): this;
|
|
68
|
+
设置参数<A extends Partial<参数类型>>(设置参数: A): 业务行为<Omit<参数类型, keyof A>, 错误类型, 返回类型>;
|
|
69
|
+
运行业务行为(参数: 参数类型): Promise<Either<错误类型, 返回类型>>;
|
|
70
|
+
/**
|
|
71
|
+
* 将两个模型串接, 得到一个新模型, 新模型的类型是:
|
|
72
|
+
* - 参数: a模型的参数
|
|
73
|
+
* - 错误: a模型的错误+b模型的错误
|
|
74
|
+
* - 返回值: b模型的返回值
|
|
75
|
+
*/
|
|
76
|
+
流式组合<B错误类型 extends 业务行为错误类型, B返回类型 extends 业务行为返回类型>(b: 业务行为<返回类型, B错误类型, B返回类型>): 业务行为<参数类型, 错误类型 | B错误类型, B返回类型>;
|
|
77
|
+
/**
|
|
78
|
+
* 将两个模型串接, 得到一个新的模型
|
|
79
|
+
* 相比流式组合, 本函数不要求串联位置参数匹配, 缺少的参数将在调用时补全
|
|
80
|
+
* 新模型的类型是:
|
|
81
|
+
* - 参数: a模型的参数+(b模型的参数-a模型的返回值)
|
|
82
|
+
* - 错误: a模型的错误+b模型的错误
|
|
83
|
+
* - 返回值: a模型的返回值+b模型的返回值
|
|
84
|
+
*/
|
|
85
|
+
混合组合<B参数类型 extends 业务行为参数类型, B错误类型 extends 业务行为错误类型, B返回类型 extends 业务行为返回类型>(b: 业务行为<B参数类型, B错误类型, B返回类型>): 计算混合组合<参数类型, 错误类型, 返回类型, B参数类型, B错误类型, B返回类型>;
|
|
86
|
+
映射结果<新返回类型 extends 业务行为返回类型>(f: (a: 返回类型) => 新返回类型): 业务行为<参数类型, 错误类型, 新返回类型>;
|
|
87
|
+
映射错误<新错误类型 extends 业务行为错误类型>(f: (a: 错误类型) => 新错误类型): 业务行为<参数类型, 新错误类型, 返回类型>;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export { 业务行为, type 业务行为参数类型, type 业务行为返回类型, type 业务行为错误类型 };
|