evaengine 1.0.14 → 3.0.0
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/README.md +15 -7
- package/bin/engine +2 -31
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +32 -0
- package/dist/bin.js.map +1 -0
- package/{src/commands/index.js → dist/commands/index.d.ts} +1 -8
- package/dist/commands/index.js +6 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/interface.d.ts +18 -0
- package/dist/commands/interface.js +40 -0
- package/dist/commands/interface.js.map +1 -0
- package/dist/commands/make_entity.d.ts +47 -0
- package/dist/commands/make_entity.js +410 -0
- package/dist/commands/make_entity.js.map +1 -0
- package/dist/commands/tramp.d.ts +7 -0
- package/dist/commands/tramp.js +29 -0
- package/dist/commands/tramp.js.map +1 -0
- package/dist/config/index.d.ts +92 -0
- package/dist/config/index.js +96 -0
- package/dist/config/index.js.map +1 -0
- package/dist/di.d.ts +131 -0
- package/dist/di.js +197 -0
- package/dist/di.js.map +1 -0
- package/dist/engine.d.ts +85 -0
- package/dist/engine.js +404 -0
- package/dist/engine.js.map +1 -0
- package/dist/entities/index.d.ts +54 -0
- package/dist/entities/index.js +228 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/exceptions/index.d.ts +153 -0
- package/dist/exceptions/index.js +466 -0
- package/dist/exceptions/index.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/middlewares/auth.d.ts +5 -0
- package/dist/middlewares/auth.js +63 -0
- package/dist/middlewares/auth.js.map +1 -0
- package/dist/middlewares/auth_kong.d.ts +2 -0
- package/dist/middlewares/auth_kong.js +24 -0
- package/dist/middlewares/auth_kong.js.map +1 -0
- package/dist/middlewares/debug.d.ts +3 -0
- package/dist/middlewares/debug.js +50 -0
- package/dist/middlewares/debug.js.map +1 -0
- package/{src/middlewares/index.js → dist/middlewares/index.d.ts} +1 -11
- package/dist/middlewares/index.js +9 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/providers.d.ts +25 -0
- package/dist/middlewares/providers.js +63 -0
- package/dist/middlewares/providers.js.map +1 -0
- package/dist/middlewares/session.d.ts +5 -0
- package/dist/middlewares/session.js +46 -0
- package/dist/middlewares/session.js.map +1 -0
- package/dist/middlewares/trace.d.ts +52 -0
- package/dist/middlewares/trace.js +225 -0
- package/dist/middlewares/trace.js.map +1 -0
- package/dist/middlewares/validator.d.ts +10 -0
- package/dist/middlewares/validator.js +43 -0
- package/dist/middlewares/validator.js.map +1 -0
- package/dist/middlewares/view_cache.d.ts +14 -0
- package/dist/middlewares/view_cache.js +102 -0
- package/dist/middlewares/view_cache.js.map +1 -0
- package/dist/services/cache.d.ts +68 -0
- package/dist/services/cache.js +206 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/config.d.ts +17 -0
- package/dist/services/config.js +67 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/env.d.ts +12 -0
- package/dist/services/env.js +24 -0
- package/dist/services/env.js.map +1 -0
- package/dist/services/event_manager.d.ts +30 -0
- package/dist/services/event_manager.js +74 -0
- package/dist/services/event_manager.js.map +1 -0
- package/dist/services/http_client.d.ts +67 -0
- package/dist/services/http_client.js +61 -0
- package/dist/services/http_client.js.map +1 -0
- package/{src/services/index.js → dist/services/index.d.ts} +1 -15
- package/dist/services/index.js +14 -0
- package/dist/services/index.js.map +1 -0
- package/{src/services/interface.js → dist/services/interface.d.ts} +1 -3
- package/dist/services/interface.js +6 -0
- package/dist/services/interface.js.map +1 -0
- package/{src/services/joi.js → dist/services/joi.d.ts} +2 -9
- package/dist/services/joi.js +11 -0
- package/dist/services/joi.js.map +1 -0
- package/dist/services/jwt_token.d.ts +25 -0
- package/dist/services/jwt_token.js +76 -0
- package/dist/services/jwt_token.js.map +1 -0
- package/dist/services/jwt_token_kong.d.ts +26 -0
- package/dist/services/jwt_token_kong.js +64 -0
- package/dist/services/jwt_token_kong.js.map +1 -0
- package/dist/services/logger.d.ts +31 -0
- package/dist/services/logger.js +125 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/namespace.d.ts +62 -0
- package/dist/services/namespace.js +171 -0
- package/dist/services/namespace.js.map +1 -0
- package/dist/services/now.d.ts +15 -0
- package/dist/services/now.js +42 -0
- package/dist/services/now.js.map +1 -0
- package/dist/services/providers.d.ts +55 -0
- package/dist/services/providers.js +134 -0
- package/dist/services/providers.js.map +1 -0
- package/dist/services/redis.d.ts +19 -0
- package/dist/services/redis.js +52 -0
- package/dist/services/redis.js.map +1 -0
- package/dist/services/rest_client.d.ts +49 -0
- package/dist/services/rest_client.js +95 -0
- package/dist/services/rest_client.js.map +1 -0
- package/dist/swagger/index.d.ts +223 -0
- package/dist/swagger/index.js +564 -0
- package/dist/swagger/index.js.map +1 -0
- package/dist/types/express.d.ts +14 -0
- package/dist/types/vendor.d.ts +30 -0
- package/dist/utils/api_scaffold.d.ts +74 -0
- package/dist/utils/api_scaffold.js +220 -0
- package/dist/utils/api_scaffold.js.map +1 -0
- package/dist/utils/case_converter.d.ts +7 -0
- package/dist/utils/case_converter.js +29 -0
- package/dist/utils/case_converter.js.map +1 -0
- package/dist/utils/crc32.d.ts +2 -0
- package/dist/utils/crc32.js +43 -0
- package/dist/utils/crc32.js.map +1 -0
- package/dist/utils/cron.d.ts +27 -0
- package/dist/utils/cron.js +186 -0
- package/dist/utils/cron.js.map +1 -0
- package/dist/utils/datetime.d.ts +4 -0
- package/dist/utils/datetime.js +6 -0
- package/dist/utils/datetime.js.map +1 -0
- package/dist/utils/host.d.ts +18 -0
- package/dist/utils/host.js +33 -0
- package/dist/utils/host.js.map +1 -0
- package/{src/utils/index.js → dist/utils/index.d.ts} +2 -26
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/jwt.d.ts +16 -0
- package/dist/utils/jwt.js +93 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/pagination.d.ts +150 -0
- package/dist/utils/pagination.js +242 -0
- package/dist/utils/pagination.js.map +1 -0
- package/dist/utils/random.d.ts +3 -0
- package/dist/utils/random.js +18 -0
- package/dist/utils/random.js.map +1 -0
- package/dist/utils/request_client.d.ts +33 -0
- package/dist/utils/request_client.js +153 -0
- package/dist/utils/request_client.js.map +1 -0
- package/dist/utils/smart_query.d.ts +144 -0
- package/dist/utils/smart_query.js +310 -0
- package/dist/utils/smart_query.js.map +1 -0
- package/dist/utils/test.d.ts +14 -0
- package/dist/utils/test.js +37 -0
- package/dist/utils/test.js.map +1 -0
- package/dist/utils/wrapper.d.ts +3 -0
- package/dist/utils/wrapper.js +5 -0
- package/dist/utils/wrapper.js.map +1 -0
- package/package.json +22 -15
- package/index.js +0 -2
- package/src/commands/interface.js +0 -45
- package/src/commands/make_entity.js +0 -490
- package/src/commands/tramp.js +0 -34
- package/src/config/index.js +0 -95
- package/src/di.js +0 -96
- package/src/engine.js +0 -556
- package/src/entities/index.js +0 -272
- package/src/exceptions/index.js +0 -501
- package/src/index.js +0 -55
- package/src/middlewares/auth.js +0 -67
- package/src/middlewares/auth_kong.js +0 -28
- package/src/middlewares/debug.js +0 -88
- package/src/middlewares/providers.js +0 -73
- package/src/middlewares/session.js +0 -63
- package/src/middlewares/trace.js +0 -254
- package/src/middlewares/validator.js +0 -50
- package/src/middlewares/view_cache.js +0 -127
- package/src/services/cache.js +0 -223
- package/src/services/config.js +0 -115
- package/src/services/env.js +0 -28
- package/src/services/event_manager.js +0 -84
- package/src/services/http_client.js +0 -69
- package/src/services/jwt_token.js +0 -89
- package/src/services/jwt_token_kong.js +0 -75
- package/src/services/logger.js +0 -150
- package/src/services/namespace.js +0 -176
- package/src/services/now.js +0 -49
- package/src/services/providers.js +0 -158
- package/src/services/redis.js +0 -63
- package/src/services/rest_client.js +0 -112
- package/src/swagger/index.js +0 -665
- package/src/utils/api_scaffold.js +0 -240
- package/src/utils/case_converter.js +0 -33
- package/src/utils/crc32.js +0 -44
- package/src/utils/cron.js +0 -208
- package/src/utils/datetime.js +0 -13
- package/src/utils/host.js +0 -39
- package/src/utils/pagination.js +0 -260
- package/src/utils/random.js +0 -23
- package/src/utils/request_client.js +0 -179
- package/src/utils/smart_query.js +0 -352
- package/src/utils/test.js +0 -48
- package/src/utils/wrapper.js +0 -8
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
/*eslint new-cap: [1]*/
|
|
2
|
+
import fs, {} from 'fs';
|
|
3
|
+
import { createRequire, stripTypeScriptTypes } from 'module';
|
|
4
|
+
import { format } from 'util';
|
|
5
|
+
import assert from 'assert';
|
|
6
|
+
import merge from 'lodash/merge.js';
|
|
7
|
+
import * as doctrine from 'doctrine';
|
|
8
|
+
import * as acorn from 'acorn';
|
|
9
|
+
import * as yaml from 'js-yaml';
|
|
10
|
+
import Entitles from "../entities/index.js";
|
|
11
|
+
import { RuntimeException, StandardException } from "../exceptions/index.js";
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
export class AcornParsingException extends StandardException {
|
|
14
|
+
}
|
|
15
|
+
export class YamlParsingException extends StandardException {
|
|
16
|
+
annotation;
|
|
17
|
+
setAnnotation(annotation) {
|
|
18
|
+
this.annotation = annotation || {};
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
getAnnotation() {
|
|
22
|
+
return this.annotation || {};
|
|
23
|
+
}
|
|
24
|
+
toString() {
|
|
25
|
+
const { file, start, end, value } = this.getAnnotation();
|
|
26
|
+
return format('Yaml parsing error happened in %s Line[%s - %s]\n Yaml error: %s \nOriginal Yaml Text:', file, start, end,
|
|
27
|
+
// getPrevError() 为 unknown,这里只读取其 message 字段
|
|
28
|
+
this.getPrevError() ? this.getPrevError().message : '', value ? value.split('\n').map((v, i) => `${(i - 1).toString().padStart(5)} ${v}`) : []);
|
|
29
|
+
}
|
|
30
|
+
constructor(exceptionOrMsg) {
|
|
31
|
+
super(exceptionOrMsg);
|
|
32
|
+
this.annotation = {};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//Mapping sequelize data types to swagger data types
|
|
36
|
+
//Sequelize types: http://docs.sequelizejs.com/en/latest/api/datatypes/
|
|
37
|
+
//Swagger Data Types: http://swagger.io/specification/
|
|
38
|
+
export const MODEL_TO_FRAGMENT_TYPES_MAPPING = {
|
|
39
|
+
BIGINT: 'integer',
|
|
40
|
+
ENUM: 'string',
|
|
41
|
+
INTEGER: 'integer',
|
|
42
|
+
FLOAT: 'number',
|
|
43
|
+
DOUBLE: 'number',
|
|
44
|
+
DECIMAL: 'number',
|
|
45
|
+
BOOLEAN: 'boolean',
|
|
46
|
+
CHAR: 'string',
|
|
47
|
+
STRING: 'string',
|
|
48
|
+
TEXT: 'string',
|
|
49
|
+
REAL: 'string',
|
|
50
|
+
TIME: 'string',
|
|
51
|
+
DATE: 'string',
|
|
52
|
+
DATEONLY: 'string',
|
|
53
|
+
HSTORE: 'string',
|
|
54
|
+
JSON: 'string',
|
|
55
|
+
JSONB: 'string',
|
|
56
|
+
NOW: 'string',
|
|
57
|
+
BLOB: 'string',
|
|
58
|
+
UUID: 'string',
|
|
59
|
+
UUIDV1: 'string',
|
|
60
|
+
UUIDV4: 'string',
|
|
61
|
+
VIRTUAL: 'string'
|
|
62
|
+
};
|
|
63
|
+
// column.defaultValue 运行时可能为任意标量,parseInt/parseFloat 依赖 JS 的隐式转字符串
|
|
64
|
+
const modelDefaultValueHandlers = {
|
|
65
|
+
integer: v => parseInt(v, 10),
|
|
66
|
+
boolean: v => Boolean(parseInt(v, 10)),
|
|
67
|
+
number: v => parseFloat(v),
|
|
68
|
+
default: v => v
|
|
69
|
+
};
|
|
70
|
+
const FRAGMENT_TYPE_PATH = 'path';
|
|
71
|
+
const FRAGMENT_TYPE_DEFINITION = 'definition';
|
|
72
|
+
const FRAGMENT_TYPE_EXCEPTION = 'exception';
|
|
73
|
+
const FRAGMENT_TYPE_UNKNOWN = 'unknown';
|
|
74
|
+
export class Fragment {
|
|
75
|
+
getTypes() {
|
|
76
|
+
return [FRAGMENT_TYPE_PATH, FRAGMENT_TYPE_DEFINITION,
|
|
77
|
+
FRAGMENT_TYPE_EXCEPTION, FRAGMENT_TYPE_UNKNOWN];
|
|
78
|
+
}
|
|
79
|
+
isPath() {
|
|
80
|
+
return this.type === FRAGMENT_TYPE_PATH;
|
|
81
|
+
}
|
|
82
|
+
isDefinition() {
|
|
83
|
+
return this.type === FRAGMENT_TYPE_DEFINITION;
|
|
84
|
+
}
|
|
85
|
+
isUnknown() {
|
|
86
|
+
return this.type === FRAGMENT_TYPE_UNKNOWN;
|
|
87
|
+
}
|
|
88
|
+
isException() {
|
|
89
|
+
return this.type === FRAGMENT_TYPE_EXCEPTION;
|
|
90
|
+
}
|
|
91
|
+
setParentFragment(fragment) {
|
|
92
|
+
assert(fragment && fragment instanceof Fragment, 'Parent fragment must be instance of Fragment');
|
|
93
|
+
this.parent = fragment;
|
|
94
|
+
return this;
|
|
95
|
+
}
|
|
96
|
+
getParentFragment() {
|
|
97
|
+
return this.parent;
|
|
98
|
+
}
|
|
99
|
+
correctSwaggerPath(swaggerDoc = {}) {
|
|
100
|
+
return swaggerDoc;
|
|
101
|
+
}
|
|
102
|
+
toSwaggerDoc(exceptions = {}) {
|
|
103
|
+
if (this.isPath()) {
|
|
104
|
+
// path 片段的 value 形如 { '/path': { get: {...} } }
|
|
105
|
+
const pathValue = this.value;
|
|
106
|
+
const path = Object.keys(pathValue)[0];
|
|
107
|
+
const method = Object.keys(pathValue[path])[0];
|
|
108
|
+
return {
|
|
109
|
+
paths: {
|
|
110
|
+
[path]: {
|
|
111
|
+
[method]: this.correctSwaggerPath(pathValue[path][method])
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (this.isDefinition()) {
|
|
117
|
+
const definitionValue = this.value;
|
|
118
|
+
const key = Object.keys(definitionValue)[0];
|
|
119
|
+
return {
|
|
120
|
+
definitions: {
|
|
121
|
+
[key]: definitionValue[key]
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
if (this.isException()) {
|
|
126
|
+
if (!this.getParentFragment()) {
|
|
127
|
+
return {};
|
|
128
|
+
}
|
|
129
|
+
const key = this.value;
|
|
130
|
+
const exception = exceptions[key];
|
|
131
|
+
if (!exception) {
|
|
132
|
+
return {};
|
|
133
|
+
}
|
|
134
|
+
// 上方已断言 parent 存在
|
|
135
|
+
const parent = this.getParentFragment();
|
|
136
|
+
const parentValue = parent.value;
|
|
137
|
+
const path = Object.keys(parentValue)[0];
|
|
138
|
+
const method = Object.keys(parentValue[path])[0];
|
|
139
|
+
return {
|
|
140
|
+
definitions: {
|
|
141
|
+
[key]: Fragment.exceptionMapping(exception)
|
|
142
|
+
},
|
|
143
|
+
paths: {
|
|
144
|
+
[path]: {
|
|
145
|
+
[method]: {
|
|
146
|
+
responses: {
|
|
147
|
+
[exception.getStatusCode()]: {
|
|
148
|
+
description: this.description,
|
|
149
|
+
schema: {
|
|
150
|
+
$ref: `#/definitions/${key}`
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return {};
|
|
160
|
+
}
|
|
161
|
+
static exceptionMapping(exception) {
|
|
162
|
+
return {
|
|
163
|
+
properties: {
|
|
164
|
+
code: {
|
|
165
|
+
type: 'integer',
|
|
166
|
+
format: 'int64'
|
|
167
|
+
},
|
|
168
|
+
message: {
|
|
169
|
+
type: 'string'
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
required: [
|
|
173
|
+
'code',
|
|
174
|
+
'message'
|
|
175
|
+
],
|
|
176
|
+
example: {
|
|
177
|
+
code: exception.getCode(),
|
|
178
|
+
message: exception.message
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
static factory(jsdoc, annotation) {
|
|
183
|
+
const { title, description, type } = jsdoc;
|
|
184
|
+
if (title === 'throws') {
|
|
185
|
+
return new Fragment({
|
|
186
|
+
type: FRAGMENT_TYPE_EXCEPTION,
|
|
187
|
+
description: description,
|
|
188
|
+
// doctrine 的 type 字段为 unknown,这里只读取引用类型的 name;缺失时由 Fragment 构造器 assert 抛出
|
|
189
|
+
value: type ? type.name : FRAGMENT_TYPE_UNKNOWN,
|
|
190
|
+
file: annotation.file,
|
|
191
|
+
start: annotation.start,
|
|
192
|
+
end: annotation.end
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
let elementType = FRAGMENT_TYPE_UNKNOWN;
|
|
196
|
+
// yaml.load 返回 unknown;swagger 注解的 description 是一个 yaml 对象
|
|
197
|
+
const value = yaml.load(description);
|
|
198
|
+
const key = Object.keys(value)[0];
|
|
199
|
+
if (title === 'swagger') {
|
|
200
|
+
elementType = key.startsWith('/') ? FRAGMENT_TYPE_PATH : FRAGMENT_TYPE_DEFINITION;
|
|
201
|
+
}
|
|
202
|
+
return new Fragment({
|
|
203
|
+
type: elementType,
|
|
204
|
+
description: description,
|
|
205
|
+
value,
|
|
206
|
+
file: annotation.file,
|
|
207
|
+
start: annotation.start,
|
|
208
|
+
end: annotation.end
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
type;
|
|
212
|
+
description;
|
|
213
|
+
value;
|
|
214
|
+
file;
|
|
215
|
+
start;
|
|
216
|
+
end;
|
|
217
|
+
parent;
|
|
218
|
+
constructor({ type, description, value, file, start, end }) {
|
|
219
|
+
assert(type && description && value && file && start && end, 'Fragment require type && description && value && file && start && end');
|
|
220
|
+
assert(this.getTypes().includes(type), 'Fragment types not match input');
|
|
221
|
+
this.type = type;
|
|
222
|
+
this.description = description;
|
|
223
|
+
this.value = value;
|
|
224
|
+
this.file = file;
|
|
225
|
+
this.start = start;
|
|
226
|
+
this.end = end;
|
|
227
|
+
this.parent = null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
export class Annotation {
|
|
231
|
+
getFragments() {
|
|
232
|
+
if (this.fragments) {
|
|
233
|
+
return this.fragments;
|
|
234
|
+
}
|
|
235
|
+
//支持两种注解:
|
|
236
|
+
//1. 所有行首必定为 space*
|
|
237
|
+
//2. 所有行首必定不为 space*
|
|
238
|
+
const unwrap = this.value.startsWith('*\n *');
|
|
239
|
+
const { tags: jsDocs = [] } = doctrine.parse(this.value, { unwrap });
|
|
240
|
+
if (jsDocs.length < 1) {
|
|
241
|
+
return [];
|
|
242
|
+
}
|
|
243
|
+
const fragments = [];
|
|
244
|
+
jsDocs.filter(jsDoc => jsDoc.title
|
|
245
|
+
&& (jsDoc.title === 'swagger' || jsDoc.title === 'throws')
|
|
246
|
+
&& jsDoc.description)
|
|
247
|
+
.forEach((jsDoc) => {
|
|
248
|
+
try {
|
|
249
|
+
fragments.push(Fragment.factory(jsDoc, this));
|
|
250
|
+
}
|
|
251
|
+
catch (e) {
|
|
252
|
+
// catch 变量为 unknown;StandardException 构造器会自行校验入参类型
|
|
253
|
+
this.yamlErrors.push((new YamlParsingException(e)).setAnnotation(this));
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
fragments.forEach((fragment) => {
|
|
257
|
+
if (fragment.isException()) {
|
|
258
|
+
// 找不到 path 片段时由 setParentFragment 内的 assert 按原逻辑抛错
|
|
259
|
+
fragment.setParentFragment(fragments.filter(f => f.isPath())[0]);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
this.fragments = fragments;
|
|
263
|
+
return fragments;
|
|
264
|
+
}
|
|
265
|
+
toString() {
|
|
266
|
+
return format('Annotation %s [%s - %s]: %s', this.file, this.start, this.end, this.value);
|
|
267
|
+
}
|
|
268
|
+
getYamlErrors() {
|
|
269
|
+
return this.yamlErrors;
|
|
270
|
+
}
|
|
271
|
+
value;
|
|
272
|
+
file;
|
|
273
|
+
start;
|
|
274
|
+
end;
|
|
275
|
+
yamlErrors;
|
|
276
|
+
fragments;
|
|
277
|
+
constructor({ type, //Block
|
|
278
|
+
value, //Long string
|
|
279
|
+
file, //String
|
|
280
|
+
start, end }) {
|
|
281
|
+
assert(type && type === 'Block', 'Annotation type must be Block');
|
|
282
|
+
assert(value && typeof value === 'string', 'Annotation value must be Block');
|
|
283
|
+
assert(file, 'Annotation must have file');
|
|
284
|
+
this.value = value;
|
|
285
|
+
this.file = file;
|
|
286
|
+
this.start = start;
|
|
287
|
+
this.end = end;
|
|
288
|
+
this.yamlErrors = [];
|
|
289
|
+
this.fragments = null;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
export class AnnotationsContainer {
|
|
293
|
+
getFile() {
|
|
294
|
+
return this.file;
|
|
295
|
+
}
|
|
296
|
+
hasAnnotations() {
|
|
297
|
+
return this.annotations.length > 0;
|
|
298
|
+
}
|
|
299
|
+
getAnnotations() {
|
|
300
|
+
return this.annotations;
|
|
301
|
+
}
|
|
302
|
+
collectFragments() {
|
|
303
|
+
if (this.fragments.length > 0) {
|
|
304
|
+
return this.fragments;
|
|
305
|
+
}
|
|
306
|
+
for (const annotation of this.getAnnotations()) {
|
|
307
|
+
this.fragments = this.fragments.concat(annotation.getFragments());
|
|
308
|
+
}
|
|
309
|
+
return this.fragments;
|
|
310
|
+
}
|
|
311
|
+
collectYamlErrors() {
|
|
312
|
+
let errors = [];
|
|
313
|
+
for (const annotation of this.getAnnotations()) {
|
|
314
|
+
errors = errors.concat(annotation.getYamlErrors());
|
|
315
|
+
}
|
|
316
|
+
return errors;
|
|
317
|
+
}
|
|
318
|
+
file;
|
|
319
|
+
annotations;
|
|
320
|
+
fragments;
|
|
321
|
+
constructor(file, acornComments) {
|
|
322
|
+
assert(file && typeof file === 'string', 'Annotations require a file input');
|
|
323
|
+
assert(acornComments && Array.isArray(acornComments), `Annotations for ${file} require an array of Acorn comments input`);
|
|
324
|
+
this.file = file;
|
|
325
|
+
//Annotations MUST start with double stars
|
|
326
|
+
this.annotations = acornComments
|
|
327
|
+
.filter(v => v.type === 'Block' && v.value.startsWith('*\n'))
|
|
328
|
+
.map(c => new Annotation(Object.assign(c, { file })));
|
|
329
|
+
this.fragments = [];
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* A Swagger Json document generator
|
|
334
|
+
* Generate document from
|
|
335
|
+
* - JS source code annotations (Parser is Doctrine)
|
|
336
|
+
* - ORM entities (Based on Sequelize)
|
|
337
|
+
* - EvaEngine Exceptions
|
|
338
|
+
*/
|
|
339
|
+
export class ExSwagger {
|
|
340
|
+
/**
|
|
341
|
+
* Get file path array by glob
|
|
342
|
+
*/
|
|
343
|
+
static async scanFiles(path, options = {}) {
|
|
344
|
+
return fs.globSync(path, options);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Get annotations from comments
|
|
348
|
+
* An annotation MUST start with double stars
|
|
349
|
+
*/
|
|
350
|
+
static async filesToAnnotationsContainers(files) {
|
|
351
|
+
const results = [];
|
|
352
|
+
for (const file of files) {
|
|
353
|
+
const comments = [];
|
|
354
|
+
const source = await fs.readFileSync(file, 'utf8');
|
|
355
|
+
// acorn 只支持 JS;TS 源文件先擦除类型语法(strip 模式保留注释,swagger 注解不受影响)
|
|
356
|
+
const code = /\.(ts|mts|cts)$/.test(file) ? stripTypeScriptTypes(source) : source;
|
|
357
|
+
try {
|
|
358
|
+
acorn.parse(code, {
|
|
359
|
+
ecmaVersion: 'latest',
|
|
360
|
+
sourceType: 'module',
|
|
361
|
+
allowImportExportEverywhere: true,
|
|
362
|
+
onComment: comments
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
catch (e) {
|
|
366
|
+
throw (new AcornParsingException(`Acorn parsing file ${file} failed`)).setPrevError(e);
|
|
367
|
+
}
|
|
368
|
+
results.push(new AnnotationsContainer(file, comments));
|
|
369
|
+
}
|
|
370
|
+
return results;
|
|
371
|
+
}
|
|
372
|
+
static modelToSwaggerDefinition(model) {
|
|
373
|
+
const definition = {
|
|
374
|
+
type: 'object',
|
|
375
|
+
properties: {}
|
|
376
|
+
};
|
|
377
|
+
const requires = [];
|
|
378
|
+
Object.keys(model).forEach((columnName) => {
|
|
379
|
+
const column = model[columnName];
|
|
380
|
+
const swaggerType = MODEL_TO_FRAGMENT_TYPES_MAPPING[column.type.key];
|
|
381
|
+
const property = {
|
|
382
|
+
type: swaggerType,
|
|
383
|
+
description: column.comment
|
|
384
|
+
};
|
|
385
|
+
if (column.defaultValue) {
|
|
386
|
+
const defaultValueHandler = modelDefaultValueHandlers[swaggerType] ?
|
|
387
|
+
modelDefaultValueHandlers[swaggerType] : modelDefaultValueHandlers.default;
|
|
388
|
+
property.default = defaultValueHandler(column.defaultValue);
|
|
389
|
+
}
|
|
390
|
+
if (column.allowNull === false) {
|
|
391
|
+
requires.push(columnName);
|
|
392
|
+
}
|
|
393
|
+
definition.properties[columnName] = property;
|
|
394
|
+
});
|
|
395
|
+
definition.required = requires;
|
|
396
|
+
return definition;
|
|
397
|
+
}
|
|
398
|
+
static modelsToSwaggerDefinitions(models, blacklist = []) {
|
|
399
|
+
const definitions = new Map();
|
|
400
|
+
Object.keys(models).forEach((modelName) => {
|
|
401
|
+
if (blacklist.includes(modelName)) {
|
|
402
|
+
return true;
|
|
403
|
+
}
|
|
404
|
+
const model = models[modelName];
|
|
405
|
+
// attributes 与 rawAttributes 均缺失时保持原行为:由 modelToSwaggerDefinition 的 Object.keys 抛出 TypeError
|
|
406
|
+
const attributes = (model.attributes || model.rawAttributes);
|
|
407
|
+
const definition = ExSwagger.modelToSwaggerDefinition(attributes);
|
|
408
|
+
definitions.set(modelName, definition);
|
|
409
|
+
return true;
|
|
410
|
+
});
|
|
411
|
+
return definitions;
|
|
412
|
+
}
|
|
413
|
+
static async scanExceptions(path, exceptionInterface = Error) {
|
|
414
|
+
const exceptions = {};
|
|
415
|
+
const files = await ExSwagger.scanFiles(path);
|
|
416
|
+
if (files.length < 1) {
|
|
417
|
+
return exceptions;
|
|
418
|
+
}
|
|
419
|
+
for (const file of files) {
|
|
420
|
+
// require(esm) 与 import 共享模块实例,类身份一致;导出内容按 unknown 处理后窄化
|
|
421
|
+
const exceptionsInFile = require(file);
|
|
422
|
+
Object.keys(exceptionsInFile).forEach((exceptionName) => {
|
|
423
|
+
const exceptionClass = exceptionsInFile[exceptionName];
|
|
424
|
+
const exception = new exceptionClass(exceptionName); //eslint-disable-line new-cap
|
|
425
|
+
if (exception instanceof exceptionInterface) {
|
|
426
|
+
exceptions[exceptionName] = exception;
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
return exceptions;
|
|
431
|
+
}
|
|
432
|
+
async exportJson(dist = this.swaggerDocsPath) {
|
|
433
|
+
this.logger.debug('Start export swagger docs by meta %j', this.getStates());
|
|
434
|
+
const fileGroups = await Promise
|
|
435
|
+
.all(this.sourceFilesPath.map(path => ExSwagger.scanFiles(path)));
|
|
436
|
+
let files = [];
|
|
437
|
+
fileGroups.forEach((fileGroup) => {
|
|
438
|
+
files = files.concat(fileGroup);
|
|
439
|
+
});
|
|
440
|
+
// 声明文件是构建产物,不是注解来源(发布态 glob 同时命中 .js 与 .d.ts)
|
|
441
|
+
files = files.filter((file) => !file.endsWith('.d.ts'));
|
|
442
|
+
if (!files || files.length < 1) {
|
|
443
|
+
throw new RuntimeException('No swagger source files found');
|
|
444
|
+
}
|
|
445
|
+
this.logger.debug('Scanner will scan %s files under %j:', files.length, this.sourceFilesPath);
|
|
446
|
+
const annotationsContainers = await ExSwagger.filesToAnnotationsContainers(files);
|
|
447
|
+
let fragments = [];
|
|
448
|
+
annotationsContainers.forEach((annotationsContainer) => {
|
|
449
|
+
if (!annotationsContainer.hasAnnotations()) {
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
const annotationFragments = annotationsContainer.collectFragments();
|
|
453
|
+
fragments = fragments.concat(annotationFragments);
|
|
454
|
+
this.logger.debug('Scanner found %s annotations and collected %s fragments in file %s', annotationsContainer.getAnnotations().length.toString().padStart(3), annotationFragments.length.toString().padStart(3), annotationsContainer.getFile());
|
|
455
|
+
const yamlErrors = annotationsContainer.collectYamlErrors();
|
|
456
|
+
yamlErrors.forEach(yamlError => this.logger.error(yamlError));
|
|
457
|
+
return true;
|
|
458
|
+
});
|
|
459
|
+
this.logger.debug('Scanner collected %s fragments in total', fragments.length);
|
|
460
|
+
const template = this.swaggerDocsTemplate;
|
|
461
|
+
const exceptions = {};
|
|
462
|
+
for (const exceptionPath of this.exceptionPaths) {
|
|
463
|
+
this.logger.debug('Search exception in %s', exceptionPath);
|
|
464
|
+
const exceptionsInFile = await ExSwagger.scanExceptions(exceptionPath, this.exceptionInterface);
|
|
465
|
+
Object.assign(exceptions, exceptionsInFile);
|
|
466
|
+
this.logger.debug('Scanner found %s exceptions: %j', Object.keys(exceptions).length, Object.keys(exceptions));
|
|
467
|
+
}
|
|
468
|
+
const modelDefinitions = this.models ?
|
|
469
|
+
ExSwagger.modelsToSwaggerDefinitions(this.models, this.modelBlacklist) : new Map();
|
|
470
|
+
const swaggerDocs = ExSwagger.mergeAll(template, fragments, exceptions, modelDefinitions);
|
|
471
|
+
this.logger.debug('Export to %s', dist);
|
|
472
|
+
await fs.writeFileSync(dist, JSON.stringify(swaggerDocs));
|
|
473
|
+
return swaggerDocs;
|
|
474
|
+
}
|
|
475
|
+
static mergeAll(_template, fragments, exceptions, modelDefinitions) {
|
|
476
|
+
const template = _template;
|
|
477
|
+
fragments.forEach(fragment => merge(template, fragment.toSwaggerDoc(exceptions)));
|
|
478
|
+
if (modelDefinitions) {
|
|
479
|
+
modelDefinitions.forEach((definition, modelName) => {
|
|
480
|
+
// definitions 由片段 merge 进模板后存在;类型上对模板内部结构做局部收窄
|
|
481
|
+
template.definitions[modelName] = definition;
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
return template;
|
|
485
|
+
}
|
|
486
|
+
getStates() {
|
|
487
|
+
return {
|
|
488
|
+
swaggerTemplate: this.swaggerDocsTemplate,
|
|
489
|
+
modelBlacklist: this.modelBlacklist,
|
|
490
|
+
sourceFilesPath: this.sourceFilesPath,
|
|
491
|
+
exceptionPaths: this.exceptionPaths,
|
|
492
|
+
compileDistPath: this.compileDistPath,
|
|
493
|
+
swaggerUIPath: this.swaggerUIPath,
|
|
494
|
+
swaggerDocsPath: this.swaggerDocsPath
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
getSwaggerUIPath() {
|
|
498
|
+
return this.swaggerUIPath;
|
|
499
|
+
}
|
|
500
|
+
async getSwaggerIndexHtml() {
|
|
501
|
+
const uiPath = this.getSwaggerUIPath();
|
|
502
|
+
const content = await fs.readFileSync(`${uiPath}/index.html`);
|
|
503
|
+
return content.toString().replace('https://petstore.swagger.io/v2/swagger/index.json', this.swaggerDocsPath.replace(this.compileDistPath, ''));
|
|
504
|
+
}
|
|
505
|
+
getCompileDistPath() {
|
|
506
|
+
return this.compileDistPath;
|
|
507
|
+
}
|
|
508
|
+
logger;
|
|
509
|
+
swaggerDocsTemplate;
|
|
510
|
+
models;
|
|
511
|
+
modelBlacklist;
|
|
512
|
+
sourceFilesPath;
|
|
513
|
+
exceptionPaths;
|
|
514
|
+
exceptionInterface;
|
|
515
|
+
compileDistPath;
|
|
516
|
+
swaggerUIPath;
|
|
517
|
+
swaggerDocsPath;
|
|
518
|
+
constructor({ sourceRootPath, compileDistPath, models, modelBlacklist = [], swaggerDocsTemplate, logger, swaggerUIPath, swaggerDocsPath = `${compileDistPath}/docs.json`, sourceFilesPath = `${sourceRootPath}/**/*.js`, exceptionInterface = StandardException,
|
|
519
|
+
// 注解扫描在解析前对 TS 文件做类型擦除;{js,ts} 同时命中源码态(src/utils/**/*.ts)与发布态(dist/utils/**/*.js)
|
|
520
|
+
extraSourcePaths = [
|
|
521
|
+
`${import.meta.dirname}/../utils/**/*.{js,ts}`
|
|
522
|
+
], exceptionPaths }) {
|
|
523
|
+
this.logger = logger ||
|
|
524
|
+
{
|
|
525
|
+
debug: () => {
|
|
526
|
+
},
|
|
527
|
+
warn: () => {
|
|
528
|
+
},
|
|
529
|
+
error: () => {
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
if (!swaggerDocsTemplate) {
|
|
533
|
+
throw new RuntimeException('No swagger docs template input');
|
|
534
|
+
}
|
|
535
|
+
this.swaggerDocsTemplate = swaggerDocsTemplate;
|
|
536
|
+
if (models && !(models instanceof Entitles)) {
|
|
537
|
+
throw new RuntimeException('Input models must instance of engine.Entities');
|
|
538
|
+
}
|
|
539
|
+
this.models = models ? models.getAll() : null;
|
|
540
|
+
this.modelBlacklist = modelBlacklist;
|
|
541
|
+
this.sourceFilesPath = Array.isArray(sourceFilesPath)
|
|
542
|
+
? extraSourcePaths.concat(sourceFilesPath) :
|
|
543
|
+
extraSourcePaths.concat([sourceFilesPath]);
|
|
544
|
+
// 原默认值指向 exceptions 目录并依赖 require 的目录解析;TS 源码态文件是 index.ts,须显式指到文件
|
|
545
|
+
this.exceptionPaths = exceptionPaths ?
|
|
546
|
+
[`${import.meta.dirname}/../exceptions/index.{js,ts}`].concat(exceptionPaths) : [`${import.meta.dirname}/../exceptions/index.{js,ts}`];
|
|
547
|
+
this.exceptionInterface = exceptionInterface;
|
|
548
|
+
this.compileDistPath = compileDistPath;
|
|
549
|
+
if (swaggerUIPath) {
|
|
550
|
+
this.swaggerUIPath = swaggerUIPath;
|
|
551
|
+
}
|
|
552
|
+
else {
|
|
553
|
+
this.swaggerUIPath = `${import.meta.dirname}/../../node_modules/swagger-ui-dist`;
|
|
554
|
+
try {
|
|
555
|
+
fs.accessSync(this.swaggerUIPath, fs.constants.F_OK);
|
|
556
|
+
}
|
|
557
|
+
catch {
|
|
558
|
+
this.swaggerUIPath = `${import.meta.dirname}/../../../swagger-ui-dist`; //For NPM v3.x
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
this.swaggerDocsPath = swaggerDocsPath;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/swagger/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime request properties attached by EvaEngine middlewares that are not part
|
|
3
|
+
* of the express Request contract:
|
|
4
|
+
* - auth: set by middlewares/auth and middlewares/auth_kong, read by view_cache
|
|
5
|
+
* - uid: custom per-user cache-key rule fallback read by middlewares/view_cache
|
|
6
|
+
* Values are produced by consumer login flows or configs, so the payload shape
|
|
7
|
+
* is intentionally kept open.
|
|
8
|
+
*/
|
|
9
|
+
declare namespace Express {
|
|
10
|
+
interface Request {
|
|
11
|
+
auth?: Record<string, unknown>;
|
|
12
|
+
uid?: unknown;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hand-written ambient module declarations for dependencies that do not bundle types.
|
|
3
|
+
* Only the API surface actually used by this package is declared; keep it in sync
|
|
4
|
+
* when upgrading these dependencies.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
declare module 'doctrine' {
|
|
8
|
+
export interface AnnotationTag {
|
|
9
|
+
title: string;
|
|
10
|
+
description: string | null;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
}
|
|
13
|
+
export interface Annotation {
|
|
14
|
+
tags: AnnotationTag[];
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export function parse(
|
|
18
|
+
content: string,
|
|
19
|
+
options?: { unwrap?: boolean; sloppy?: boolean; [key: string]: unknown }
|
|
20
|
+
): Annotation;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* yargs ships no types for its "./yargs" entry point (the path engine.ts
|
|
25
|
+
* imports) and no @types package covers the subpath. Only the shorthand form
|
|
26
|
+
* works here: a full `declare module 'yargs/yargs' { ... }` block is ignored
|
|
27
|
+
* because the module resolves to untyped JavaScript. Call shapes that cross
|
|
28
|
+
* public signatures are typed locally in engine.ts.
|
|
29
|
+
*/
|
|
30
|
+
declare module 'yargs/yargs';
|