@midwayjs/swagger 1.3.0 → 3.0.0-beta.9

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.
Files changed (72) hide show
  1. package/README.md +7 -23
  2. package/dist/common/enum.utils.d.ts +9 -0
  3. package/dist/common/enum.utils.js +63 -0
  4. package/dist/common/httpStatus.d.ts +51 -0
  5. package/dist/common/httpStatus.js +55 -0
  6. package/dist/config/config.default.d.ts +2 -8
  7. package/dist/config/config.default.js +6 -6
  8. package/dist/configuration.d.ts +4 -2
  9. package/dist/configuration.js +27 -11
  10. package/dist/constants.d.ts +15 -0
  11. package/dist/constants.js +18 -0
  12. package/dist/decorators/api-basic.decorator.d.ts +2 -0
  13. package/dist/decorators/api-basic.decorator.js +9 -0
  14. package/dist/decorators/api-bearer.decorator.d.ts +2 -0
  15. package/dist/decorators/api-bearer.decorator.js +9 -0
  16. package/dist/decorators/api-body.decorator.d.ts +16 -0
  17. package/dist/decorators/api-body.decorator.js +27 -0
  18. package/dist/decorators/api-cookie.decorator.d.ts +2 -0
  19. package/dist/decorators/api-cookie.decorator.js +9 -0
  20. package/dist/decorators/api-exclude-controller.decorator.d.ts +2 -0
  21. package/dist/decorators/api-exclude-controller.decorator.js +12 -0
  22. package/dist/decorators/api-exclude-endpoint.decorator.d.ts +2 -0
  23. package/dist/decorators/api-exclude-endpoint.decorator.js +12 -0
  24. package/dist/decorators/api-extension.decorator.d.ts +2 -0
  25. package/dist/decorators/api-extension.decorator.js +16 -0
  26. package/dist/decorators/api-header.decorator.d.ts +7 -0
  27. package/dist/decorators/api-header.decorator.js +43 -0
  28. package/dist/decorators/api-oauth2.decorator.d.ts +2 -0
  29. package/dist/decorators/api-oauth2.decorator.js +9 -0
  30. package/dist/decorators/api-operation.decorator.d.ts +4 -0
  31. package/dist/decorators/api-operation.decorator.js +16 -0
  32. package/dist/decorators/api-param.decorator.d.ts +15 -0
  33. package/dist/decorators/api-param.decorator.js +30 -0
  34. package/dist/decorators/api-property.decorator.d.ts +11 -0
  35. package/dist/decorators/api-property.decorator.js +56 -0
  36. package/dist/decorators/api-query.decorator.d.ts +17 -0
  37. package/dist/decorators/api-query.decorator.js +31 -0
  38. package/dist/decorators/api-response.decorator.d.ts +41 -0
  39. package/dist/decorators/api-response.decorator.js +149 -0
  40. package/dist/decorators/api-security.decorator.d.ts +3 -0
  41. package/dist/decorators/api-security.decorator.js +17 -0
  42. package/dist/decorators/api-tags.decorator.d.ts +2 -0
  43. package/dist/decorators/api-tags.decorator.js +10 -0
  44. package/dist/decorators/helpers.d.ts +7 -0
  45. package/dist/decorators/helpers.js +41 -0
  46. package/dist/decorators/index.d.ts +18 -0
  47. package/dist/decorators/index.js +35 -0
  48. package/dist/documentBuilder.d.ts +25 -0
  49. package/dist/documentBuilder.js +192 -0
  50. package/dist/index.d.ts +5 -5
  51. package/dist/index.js +8 -6
  52. package/dist/interfaces/index.d.ts +268 -0
  53. package/dist/interfaces/index.js +7 -0
  54. package/dist/swaggerExplorer.d.ts +30 -0
  55. package/dist/swaggerExplorer.js +567 -0
  56. package/dist/swaggerMiddleware.d.ts +9 -0
  57. package/dist/swaggerMiddleware.js +123 -0
  58. package/index.d.ts +8 -0
  59. package/package.json +13 -12
  60. package/CHANGELOG.md +0 -121
  61. package/dist/controller/swagger.d.ts +0 -31
  62. package/dist/controller/swagger.js +0 -96
  63. package/dist/interface.d.ts +0 -16
  64. package/dist/interface.js +0 -3
  65. package/dist/lib/createAPI.d.ts +0 -52
  66. package/dist/lib/createAPI.js +0 -276
  67. package/dist/lib/document.d.ts +0 -117
  68. package/dist/lib/document.js +0 -131
  69. package/dist/lib/generator.d.ts +0 -31
  70. package/dist/lib/generator.js +0 -310
  71. package/dist/service/generator.d.ts +0 -24
  72. package/dist/service/generator.js +0 -37
@@ -1,310 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SwaggerMetaGenerator = void 0;
4
- const decorator_1 = require("@midwayjs/decorator");
5
- const document_1 = require("./document");
6
- const createAPI_1 = require("./createAPI");
7
- class SwaggerMetaGenerator {
8
- constructor(options) {
9
- var _a;
10
- this.document = new document_1.SwaggerDocument();
11
- const info = new document_1.SwaggerDocumentInfo();
12
- info.title = (options === null || options === void 0 ? void 0 : options.title) || 'Midway2 Swagger API';
13
- info.version = options.version || '1.0.0';
14
- info.description = options === null || options === void 0 ? void 0 : options.description;
15
- info.termsOfService = options === null || options === void 0 ? void 0 : options.termsOfService;
16
- info.contact = options === null || options === void 0 ? void 0 : options.contact;
17
- info.license = ((_a = options === null || options === void 0 ? void 0 : options.license) === null || _a === void 0 ? void 0 : _a.name) ? options === null || options === void 0 ? void 0 : options.license : undefined;
18
- this.document.info = info;
19
- }
20
- generateController(module) {
21
- const controllerOption = (0, decorator_1.getClassMetadata)(decorator_1.CONTROLLER_KEY, module);
22
- const prefix = controllerOption.prefix;
23
- const tag = new document_1.SwaggerDocumentTag();
24
- if (prefix !== '/') {
25
- tag.name =
26
- (controllerOption === null || controllerOption === void 0 ? void 0 : controllerOption.routerOptions.tagName) ||
27
- (/^\//.test(prefix) ? prefix.split('/')[1] : prefix);
28
- tag.description = (controllerOption === null || controllerOption === void 0 ? void 0 : controllerOption.routerOptions.description) || tag.name;
29
- }
30
- else {
31
- tag.name = (controllerOption === null || controllerOption === void 0 ? void 0 : controllerOption.routerOptions.tagName) || 'default';
32
- tag.description = (controllerOption === null || controllerOption === void 0 ? void 0 : controllerOption.routerOptions.description) || tag.name;
33
- }
34
- this.document.tags.push(tag);
35
- // const globalMiddleware = controllerOption.routerOptions.middleware;
36
- // get router info
37
- const webRouterInfo = (0, decorator_1.getClassMetadata)(decorator_1.WEB_ROUTER_KEY, module);
38
- if (webRouterInfo && typeof webRouterInfo[Symbol.iterator] === 'function') {
39
- for (const webRouter of webRouterInfo) {
40
- let url = (prefix + webRouter.path).replace('//', '/');
41
- url = replaceUrl(url, parseParamsInPath(url));
42
- const router = new document_1.SwaggerDocumentRouter(webRouter.requestMethod, url);
43
- router.tags = [tag.name];
44
- this.generateRouter(webRouter, router, module);
45
- this.document.addRouter(router);
46
- }
47
- }
48
- }
49
- generate() {
50
- return this.document.toJSON();
51
- }
52
- generateRouter(webRouterInfo, swaggerRouter, module) {
53
- const ins = new module();
54
- const swaggerApi = (0, decorator_1.getPropertyMetadata)(createAPI_1.SWAGGER_DOCUMENT_KEY, ins, webRouterInfo.method);
55
- swaggerRouter.summary =
56
- (swaggerApi === null || swaggerApi === void 0 ? void 0 : swaggerApi.summary) || webRouterInfo.summary || webRouterInfo.routerName;
57
- swaggerRouter.description =
58
- (swaggerApi === null || swaggerApi === void 0 ? void 0 : swaggerApi.description) ||
59
- webRouterInfo.description ||
60
- webRouterInfo.routerName;
61
- // swaggerRouter.operationId = webRouterInfo.method;
62
- swaggerRouter.parameters = [];
63
- const routeArgsInfo = (0, decorator_1.getPropertyDataFromClass)(decorator_1.WEB_ROUTER_PARAM_KEY, module, webRouterInfo.method) || [];
64
- // 获取方法参数类型
65
- const paramTypes = (0, decorator_1.getMethodParamTypes)(ins, webRouterInfo.method);
66
- for (const routeArgs of routeArgsInfo) {
67
- const swaggerParameter = new document_1.SwaggerDocumentParameter();
68
- const argsApiInfo = swaggerApi === null || swaggerApi === void 0 ? void 0 : swaggerApi.params[routeArgs.index];
69
- swaggerParameter.description = argsApiInfo === null || argsApiInfo === void 0 ? void 0 : argsApiInfo.description;
70
- swaggerParameter.name = (argsApiInfo === null || argsApiInfo === void 0 ? void 0 : argsApiInfo.name) || (routeArgs === null || routeArgs === void 0 ? void 0 : routeArgs.propertyData);
71
- swaggerParameter.in = convertTypeToString(routeArgs.type);
72
- swaggerParameter.required = argsApiInfo === null || argsApiInfo === void 0 ? void 0 : argsApiInfo.required;
73
- swaggerParameter.deprecated = argsApiInfo === null || argsApiInfo === void 0 ? void 0 : argsApiInfo.deprecated;
74
- swaggerParameter.allowEmptyValue = argsApiInfo === null || argsApiInfo === void 0 ? void 0 : argsApiInfo.allowEmptyValue;
75
- swaggerParameter.example = argsApiInfo === null || argsApiInfo === void 0 ? void 0 : argsApiInfo.example;
76
- if (swaggerParameter.in === 'path') {
77
- swaggerParameter.required = true;
78
- // if path not include this args, must be ignore
79
- if (swaggerRouter.url.indexOf('{' + swaggerParameter.name + '}') === -1) {
80
- continue;
81
- }
82
- }
83
- if ((0, decorator_1.isClass)(paramTypes[routeArgs.index])) {
84
- this.generateSwaggerDefinition(paramTypes[routeArgs.index]);
85
- swaggerParameter.schema = {
86
- $ref: '#/components/schemas/' + paramTypes[routeArgs.index].name,
87
- };
88
- }
89
- else {
90
- swaggerParameter.schema = {
91
- type: convertSchemaType(paramTypes[routeArgs.index].name),
92
- name: undefined,
93
- };
94
- }
95
- // add body
96
- if (swaggerParameter.in === 'body') {
97
- swaggerRouter.requestBody = {
98
- description: (argsApiInfo === null || argsApiInfo === void 0 ? void 0 : argsApiInfo.description) || (routeArgs === null || routeArgs === void 0 ? void 0 : routeArgs.propertyData),
99
- content: {
100
- 'application/json': {
101
- schema: swaggerParameter.schema,
102
- },
103
- },
104
- };
105
- continue;
106
- }
107
- // add parameter
108
- swaggerRouter.parameters.push(swaggerParameter);
109
- }
110
- swaggerRouter.responses = {};
111
- for (const apiResponse of (swaggerApi === null || swaggerApi === void 0 ? void 0 : swaggerApi.response) || []) {
112
- // 获取方法返回值
113
- swaggerRouter.responses[apiResponse.status] = {
114
- description: apiResponse === null || apiResponse === void 0 ? void 0 : apiResponse.description,
115
- headers: apiResponse === null || apiResponse === void 0 ? void 0 : apiResponse.headers,
116
- content: apiResponse === null || apiResponse === void 0 ? void 0 : apiResponse.content,
117
- };
118
- }
119
- // 兜底加个 200
120
- if (Object.keys(swaggerRouter.responses).length === 0) {
121
- swaggerRouter.responses = { 200: { description: '' } };
122
- }
123
- }
124
- generateSwaggerDefinition(definitionClass) {
125
- var _a, _b;
126
- const swaggerDefinition = new document_1.SwaggerDefinition();
127
- swaggerDefinition.name = definitionClass.name;
128
- swaggerDefinition.type = 'object';
129
- const properties = (0, decorator_1.getClassMetadata)(createAPI_1.SWAGGER_DOCUMENT_KEY, definitionClass);
130
- for (const propertyName in properties) {
131
- swaggerDefinition.properties[propertyName] = {
132
- type: properties[propertyName].type.toLowerCase(),
133
- description: properties[propertyName].description,
134
- example: properties[propertyName].example,
135
- };
136
- }
137
- // for rule decorator
138
- const rules = (0, decorator_1.getClassExtendedMetadata)(decorator_1.RULES_KEY, definitionClass);
139
- if (rules) {
140
- const properties = Object.keys(rules);
141
- for (const property of properties) {
142
- // set required
143
- if (((_b = (_a = rules[property]) === null || _a === void 0 ? void 0 : _a._flags) === null || _b === void 0 ? void 0 : _b.presence) === 'required') {
144
- swaggerDefinition.required.push(property);
145
- }
146
- // 没找到这行代码对应的装饰器
147
- // get property description
148
- let propertyInfo = (0, decorator_1.getPropertyMetadata)(createAPI_1.SWAGGER_DOCUMENT_KEY, definitionClass, property);
149
- if (!propertyInfo) {
150
- propertyInfo = this.generateSwaggerByJoiProperty(rules[property], joinCamel(definitionClass.name, property));
151
- }
152
- if (swaggerDefinition.properties[property] && !(propertyInfo === null || propertyInfo === void 0 ? void 0 : propertyInfo.$ref)) {
153
- mixWhenPropertyEmpty(swaggerDefinition.properties[property], propertyInfo);
154
- }
155
- else {
156
- swaggerDefinition.properties[property] = propertyInfo;
157
- }
158
- }
159
- }
160
- this.document.definitions.push(swaggerDefinition);
161
- // DTO
162
- for (const key in properties) {
163
- // 必须加了属性装饰器
164
- if (!(rules === null || rules === void 0 ? void 0 : rules[key]) &&
165
- properties[key].originDesign &&
166
- !properties[key].isBaseType) {
167
- this.generateSwaggerDefinition(properties[key].originDesign);
168
- // 把复杂类型属性指向新的定义
169
- swaggerDefinition.properties[key] = {};
170
- swaggerDefinition.properties[key]['$ref'] =
171
- '#/components/schemas/' + properties[key].type;
172
- }
173
- }
174
- }
175
- generateSwaggerByJoiProperty(joiSchema, pathName) {
176
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
177
- const describe = joiSchema.describe();
178
- if (((_a = describe.flags) === null || _a === void 0 ? void 0 : _a.presence) === 'forbidden') {
179
- return undefined;
180
- }
181
- let define = {
182
- type: describe.type,
183
- default: (_b = describe.flags) === null || _b === void 0 ? void 0 : _b.default,
184
- description: (_c = describe.flags) === null || _c === void 0 ? void 0 : _c.description,
185
- example: (_d = describe.examples) === null || _d === void 0 ? void 0 : _d.join(' '),
186
- };
187
- let min;
188
- let max;
189
- for (const r of describe.rules || []) {
190
- if (r.name === 'min' && r.args) {
191
- min = r.args.limit;
192
- }
193
- else if (r.name === 'max') {
194
- max = r.args.limit;
195
- }
196
- }
197
- if ((_e = describe.flags) === null || _e === void 0 ? void 0 : _e.only) {
198
- define.enum = describe.allow;
199
- }
200
- if (describe.invalid) {
201
- define.not = { enum: describe.invalid };
202
- }
203
- switch (describe.type) {
204
- case 'string':
205
- define.minLength = min;
206
- define.maxLength = max;
207
- break;
208
- case 'number':
209
- define.minimum = min;
210
- define.maximum = max;
211
- if ((_f = describe.rules) === null || _f === void 0 ? void 0 : _f.some(r => r.name === 'integer')) {
212
- define.type = 'integer';
213
- }
214
- break;
215
- case 'date':
216
- define.type = 'string';
217
- define.format = 'date-time';
218
- break;
219
- case 'object': {
220
- const swaggerDefinition = new document_1.SwaggerDefinition();
221
- const schemaMeta = (_g = describe.metas) === null || _g === void 0 ? void 0 : _g.find(m => Boolean(m.id));
222
- swaggerDefinition.name = (schemaMeta === null || schemaMeta === void 0 ? void 0 : schemaMeta.id) || pathName;
223
- swaggerDefinition.type = 'object';
224
- swaggerDefinition.required = [];
225
- for (const prop of (_h = joiSchema.$_terms) === null || _h === void 0 ? void 0 : _h.keys) {
226
- if (((_j = prop.schema._flags) === null || _j === void 0 ? void 0 : _j.presence) === 'required') {
227
- swaggerDefinition.required.push(prop.key);
228
- }
229
- swaggerDefinition.properties[prop.key] =
230
- this.generateSwaggerByJoiProperty(prop.schema, joinCamel(pathName, prop.key));
231
- }
232
- this.document.definitions.push(swaggerDefinition);
233
- define = { $ref: '#/components/schemas/' + swaggerDefinition.name };
234
- break;
235
- }
236
- case 'array':
237
- define.minItems = min;
238
- define.maxItems = max;
239
- if (joiSchema.$_terms.items[0]) {
240
- define.items = this.generateSwaggerByJoiProperty(joiSchema.$_terms.items[0], pathName);
241
- }
242
- }
243
- return define;
244
- }
245
- }
246
- exports.SwaggerMetaGenerator = SwaggerMetaGenerator;
247
- function joinCamel(word1, word2) {
248
- return `${word1}${word2[0].toUpperCase()}${word2.slice(1)}`;
249
- }
250
- function convertTypeToString(type) {
251
- switch (type) {
252
- case decorator_1.RouteParamTypes.HEADERS:
253
- return 'header';
254
- case decorator_1.RouteParamTypes.QUERY:
255
- return 'query';
256
- case decorator_1.RouteParamTypes.PARAM:
257
- return 'path';
258
- case decorator_1.RouteParamTypes.BODY:
259
- return 'body';
260
- default:
261
- return 'header';
262
- }
263
- }
264
- /**
265
- * 解释路由上的参数
266
- * @param url
267
- */
268
- function parseParamsInPath(url) {
269
- const names = [];
270
- url.split('/').forEach(item => {
271
- if (item.startsWith(':')) {
272
- const paramName = item.substr(1);
273
- names.push(paramName);
274
- }
275
- });
276
- return names;
277
- }
278
- /**
279
- * 替换成 openapi 的url
280
- * @param url
281
- * @param names
282
- */
283
- function replaceUrl(url, names) {
284
- names.forEach(n => {
285
- url = url.replace(`:${n}`, `{${n}}`);
286
- });
287
- return url;
288
- }
289
- function convertSchemaType(value) {
290
- switch (value) {
291
- case 'Object':
292
- return 'object';
293
- case 'Boolean':
294
- return 'boolean';
295
- case 'Number':
296
- return 'number';
297
- case 'String':
298
- return 'string';
299
- default:
300
- return 'object';
301
- }
302
- }
303
- function mixWhenPropertyEmpty(target, source) {
304
- for (const key in source) {
305
- if (!target[key] && source[key]) {
306
- target[key] = source[key];
307
- }
308
- }
309
- }
310
- //# sourceMappingURL=generator.js.map
@@ -1,24 +0,0 @@
1
- import { SwaggerGeneratorInfoOptions } from '../interface';
2
- export declare class SwaggerGenerator {
3
- swaggerConfig: SwaggerGeneratorInfoOptions;
4
- generate(): {
5
- openapi: string;
6
- info: {
7
- description: string;
8
- version: string;
9
- title: string;
10
- termsOfService: any;
11
- contact: any;
12
- license: any;
13
- };
14
- host: string;
15
- basePath: string;
16
- tags: any;
17
- schemas: string[];
18
- paths: {};
19
- components: {
20
- schemas: {};
21
- };
22
- };
23
- }
24
- //# sourceMappingURL=generator.d.ts.map
@@ -1,37 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.SwaggerGenerator = void 0;
13
- const decorator_1 = require("@midwayjs/decorator");
14
- const generator_1 = require("../lib/generator");
15
- const swagger_1 = require("../controller/swagger");
16
- let SwaggerGenerator = class SwaggerGenerator {
17
- generate() {
18
- const controllerModules = (0, decorator_1.listModule)(decorator_1.CONTROLLER_KEY);
19
- const generator = new generator_1.SwaggerMetaGenerator(this.swaggerConfig);
20
- for (const module of controllerModules) {
21
- if (module !== swagger_1.SwaggerController) {
22
- generator.generateController(module);
23
- }
24
- }
25
- return generator.generate();
26
- }
27
- };
28
- __decorate([
29
- (0, decorator_1.Config)('swagger'),
30
- __metadata("design:type", Object)
31
- ], SwaggerGenerator.prototype, "swaggerConfig", void 0);
32
- SwaggerGenerator = __decorate([
33
- (0, decorator_1.Provide)('swaggerGenerator'),
34
- (0, decorator_1.Scope)(decorator_1.ScopeEnum.Singleton)
35
- ], SwaggerGenerator);
36
- exports.SwaggerGenerator = SwaggerGenerator;
37
- //# sourceMappingURL=generator.js.map