@tsed/swagger 6.88.1 → 6.89.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.
Files changed (122) hide show
  1. package/lib/{SwaggerModule.d.ts → cjs/SwaggerModule.d.ts} +2 -0
  2. package/lib/cjs/SwaggerModule.js +135 -0
  3. package/lib/cjs/SwaggerModule.js.map +1 -0
  4. package/lib/{decorators → cjs/decorators}/docs.d.ts +0 -0
  5. package/lib/cjs/decorators/docs.js +18 -0
  6. package/lib/cjs/decorators/docs.js.map +1 -0
  7. package/lib/{decorators → cjs/decorators}/hidden.d.ts +0 -0
  8. package/lib/cjs/decorators/hidden.js +40 -0
  9. package/lib/cjs/decorators/hidden.js.map +1 -0
  10. package/lib/{index.d.ts → cjs/index.d.ts} +0 -0
  11. package/lib/cjs/index.js +9 -0
  12. package/lib/cjs/index.js.map +1 -0
  13. package/lib/{interfaces → cjs/interfaces}/SwaggerSettings.d.ts +0 -0
  14. package/lib/cjs/interfaces/SwaggerSettings.js +3 -0
  15. package/lib/cjs/interfaces/SwaggerSettings.js.map +1 -0
  16. package/lib/{interfaces → cjs/interfaces}/index.d.ts +0 -0
  17. package/lib/cjs/interfaces/index.js +5 -0
  18. package/lib/cjs/interfaces/index.js.map +1 -0
  19. package/lib/{middlewares → cjs/middlewares}/cssMiddleware.d.ts +0 -0
  20. package/lib/cjs/middlewares/cssMiddleware.js +23 -0
  21. package/lib/cjs/middlewares/cssMiddleware.js.map +1 -0
  22. package/lib/{middlewares → cjs/middlewares}/indexMiddleware.d.ts +0 -0
  23. package/lib/cjs/middlewares/indexMiddleware.js +24 -0
  24. package/lib/cjs/middlewares/indexMiddleware.js.map +1 -0
  25. package/lib/{middlewares → cjs/middlewares}/jsMiddleware.d.ts +0 -0
  26. package/lib/cjs/middlewares/jsMiddleware.js +18 -0
  27. package/lib/cjs/middlewares/jsMiddleware.js.map +1 -0
  28. package/lib/{middlewares → cjs/middlewares}/redirectMiddleware.d.ts +0 -0
  29. package/lib/cjs/middlewares/redirectMiddleware.js +16 -0
  30. package/lib/cjs/middlewares/redirectMiddleware.js.map +1 -0
  31. package/lib/{services → cjs/services}/SwaggerService.d.ts +0 -0
  32. package/lib/cjs/services/SwaggerService.js +103 -0
  33. package/lib/cjs/services/SwaggerService.js.map +1 -0
  34. package/lib/{utils → cjs/utils}/getSpecType.d.ts +0 -0
  35. package/lib/cjs/utils/getSpecType.js +21 -0
  36. package/lib/cjs/utils/getSpecType.js.map +1 -0
  37. package/lib/{utils → cjs/utils}/includeRoute.d.ts +0 -0
  38. package/lib/cjs/utils/includeRoute.js +20 -0
  39. package/lib/cjs/utils/includeRoute.js.map +1 -0
  40. package/lib/{utils → cjs/utils}/index.d.ts +0 -0
  41. package/lib/cjs/utils/index.js +11 -0
  42. package/lib/cjs/utils/index.js.map +1 -0
  43. package/lib/{utils → cjs/utils}/mapOpenSpec.d.ts +0 -0
  44. package/lib/cjs/utils/mapOpenSpec.js +40 -0
  45. package/lib/cjs/utils/mapOpenSpec.js.map +1 -0
  46. package/lib/{utils → cjs/utils}/mapOpenSpec2.d.ts +0 -0
  47. package/lib/cjs/utils/mapOpenSpec2.js +34 -0
  48. package/lib/cjs/utils/mapOpenSpec2.js.map +1 -0
  49. package/lib/{utils → cjs/utils}/mapOpenSpec3.d.ts +0 -0
  50. package/lib/cjs/utils/mapOpenSpec3.js +26 -0
  51. package/lib/cjs/utils/mapOpenSpec3.js.map +1 -0
  52. package/lib/{utils → cjs/utils}/mapOpenSpecInfo.d.ts +0 -0
  53. package/lib/cjs/utils/mapOpenSpecInfo.js +21 -0
  54. package/lib/cjs/utils/mapOpenSpecInfo.js.map +1 -0
  55. package/lib/{utils → cjs/utils}/matchPath.d.ts +0 -0
  56. package/lib/cjs/utils/matchPath.js +10 -0
  57. package/lib/cjs/utils/matchPath.js.map +1 -0
  58. package/lib/esm/SwaggerModule.js +132 -0
  59. package/lib/esm/SwaggerModule.js.map +1 -0
  60. package/lib/esm/decorators/docs.js +14 -0
  61. package/lib/esm/decorators/docs.js.map +1 -0
  62. package/lib/esm/decorators/hidden.js +36 -0
  63. package/lib/esm/decorators/hidden.js.map +1 -0
  64. package/lib/esm/index.js +6 -0
  65. package/lib/esm/index.js.map +1 -0
  66. package/lib/esm/interfaces/SwaggerSettings.js +2 -0
  67. package/lib/esm/interfaces/SwaggerSettings.js.map +1 -0
  68. package/lib/esm/interfaces/index.js +2 -0
  69. package/lib/esm/interfaces/index.js.map +1 -0
  70. package/lib/esm/middlewares/cssMiddleware.js +18 -0
  71. package/lib/esm/middlewares/cssMiddleware.js.map +1 -0
  72. package/lib/esm/middlewares/indexMiddleware.js +20 -0
  73. package/lib/esm/middlewares/indexMiddleware.js.map +1 -0
  74. package/lib/esm/middlewares/jsMiddleware.js +13 -0
  75. package/lib/esm/middlewares/jsMiddleware.js.map +1 -0
  76. package/lib/esm/middlewares/redirectMiddleware.js +12 -0
  77. package/lib/esm/middlewares/redirectMiddleware.js.map +1 -0
  78. package/lib/esm/services/SwaggerService.js +100 -0
  79. package/lib/esm/services/SwaggerService.js.map +1 -0
  80. package/lib/esm/utils/getSpecType.js +16 -0
  81. package/lib/esm/utils/getSpecType.js.map +1 -0
  82. package/lib/esm/utils/includeRoute.js +16 -0
  83. package/lib/esm/utils/includeRoute.js.map +1 -0
  84. package/lib/esm/utils/index.js +8 -0
  85. package/lib/esm/utils/index.js.map +1 -0
  86. package/lib/esm/utils/mapOpenSpec.js +36 -0
  87. package/lib/esm/utils/mapOpenSpec.js.map +1 -0
  88. package/lib/esm/utils/mapOpenSpec2.js +30 -0
  89. package/lib/esm/utils/mapOpenSpec2.js.map +1 -0
  90. package/lib/esm/utils/mapOpenSpec3.js +22 -0
  91. package/lib/esm/utils/mapOpenSpec3.js.map +1 -0
  92. package/lib/esm/utils/mapOpenSpecInfo.js +17 -0
  93. package/lib/esm/utils/mapOpenSpecInfo.js.map +1 -0
  94. package/lib/esm/utils/matchPath.js +5 -0
  95. package/lib/esm/utils/matchPath.js.map +1 -0
  96. package/lib/types/SwaggerModule.d.ts +30 -0
  97. package/lib/types/decorators/docs.d.ts +10 -0
  98. package/lib/types/decorators/hidden.d.ts +32 -0
  99. package/lib/types/index.d.ts +5 -0
  100. package/lib/types/interfaces/SwaggerSettings.d.ts +99 -0
  101. package/lib/types/interfaces/index.d.ts +9 -0
  102. package/lib/types/middlewares/cssMiddleware.d.ts +6 -0
  103. package/lib/types/middlewares/indexMiddleware.d.ts +10 -0
  104. package/lib/types/middlewares/jsMiddleware.d.ts +6 -0
  105. package/lib/types/middlewares/redirectMiddleware.d.ts +6 -0
  106. package/lib/types/services/SwaggerService.d.ts +29 -0
  107. package/lib/types/utils/getSpecType.d.ts +12 -0
  108. package/lib/types/utils/includeRoute.d.ts +3 -0
  109. package/lib/types/utils/index.d.ts +7 -0
  110. package/lib/types/utils/mapOpenSpec.d.ts +10 -0
  111. package/lib/types/utils/mapOpenSpec2.d.ts +9 -0
  112. package/lib/types/utils/mapOpenSpec3.d.ts +8 -0
  113. package/lib/types/utils/mapOpenSpecInfo.d.ts +6 -0
  114. package/lib/types/utils/matchPath.d.ts +1 -0
  115. package/lib/views/index.ejs +145 -0
  116. package/lib/views/index.html +144 -0
  117. package/package.json +22 -18
  118. package/tsconfig.compile.esm.json +24 -0
  119. package/lib/index.js +0 -623
  120. package/lib/index.js.map +0 -1
  121. package/lib/index.modern.js +0 -617
  122. package/lib/index.modern.js.map +0 -1
@@ -1,617 +0,0 @@
1
- import { __decorate, __param, __metadata } from 'tslib';
2
- import { Injectable, Configuration, InjectorService, Platform, useCtxHandler, normalizePath, PlatformRouter, Inject, PlatformApplication, Module } from '@tsed/common';
3
- import { cleanObject, uniq, getValue, setValue, StoreMerge } from '@tsed/core';
4
- import { SpecTypes, mergeSpec, getSpec, Hidden as Hidden$1 } from '@tsed/schema';
5
- import Fs from 'fs';
6
- import micromatch from 'micromatch';
7
- import { resolve, join } from 'path';
8
-
9
- function _extends() {
10
- _extends = Object.assign || function (target) {
11
- for (var i = 1; i < arguments.length; i++) {
12
- var source = arguments[i];
13
-
14
- for (var key in source) {
15
- if (Object.prototype.hasOwnProperty.call(source, key)) {
16
- target[key] = source[key];
17
- }
18
- }
19
- }
20
-
21
- return target;
22
- };
23
-
24
- return _extends.apply(this, arguments);
25
- }
26
-
27
- var id = 0;
28
-
29
- function _classPrivateFieldLooseKey(name) {
30
- return "__private_" + id++ + "_" + name;
31
- }
32
-
33
- function _classPrivateFieldLooseBase(receiver, privateKey) {
34
- if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
35
- throw new TypeError("attempted to use private field on non-instance");
36
- }
37
-
38
- return receiver;
39
- }
40
-
41
- /**
42
- * @ignore
43
- * @param version
44
- */
45
-
46
- function getSpecType(version) {
47
- return version.startsWith("3.") ? SpecTypes.OPENAPI : SpecTypes.SWAGGER;
48
- }
49
- /**
50
- * @ignore
51
- * @param spec
52
- */
53
-
54
- function getSpecTypeFromSpec(spec) {
55
- return "openapi" in spec ? SpecTypes.OPENAPI : SpecTypes.SWAGGER;
56
- }
57
-
58
- /**
59
- * @ignore
60
- * @param info
61
- */
62
-
63
- function mapOpenSpecInfo(info) {
64
- const {
65
- title,
66
- description,
67
- version,
68
- termsOfService,
69
- contact,
70
- license
71
- } = info;
72
- return cleanObject({
73
- version,
74
- title,
75
- description,
76
- termsOfService,
77
- contact,
78
- license
79
- });
80
- }
81
-
82
- /**
83
- * @ignore
84
- * @param spec
85
- * @param version
86
- * @param specVersion
87
- * @param acceptMimes
88
- */
89
-
90
- function mapOpenSpec2(spec, {
91
- version,
92
- specVersion,
93
- acceptMimes = ["application/json"]
94
- }) {
95
- const {
96
- paths,
97
- security,
98
- tags,
99
- host,
100
- basePath,
101
- schemes,
102
- consumes = [],
103
- produces = ["application/json"],
104
- definitions,
105
- parameters,
106
- responses,
107
- securityDefinitions,
108
- externalDocs
109
- } = spec;
110
- return {
111
- swagger: specVersion,
112
- consumes: uniq([...acceptMimes, ...consumes]),
113
- produces: uniq([...produces]),
114
- info: mapOpenSpecInfo(getValue(spec, "info", {})),
115
- paths,
116
- host,
117
- basePath,
118
- schemes,
119
- definitions,
120
- parameters,
121
- responses,
122
- security,
123
- securityDefinitions,
124
- tags,
125
- externalDocs
126
- };
127
- }
128
-
129
- /**
130
- * @ignore
131
- * @param spec
132
- * @param version
133
- * @param specVersion
134
- */
135
-
136
- function mapOpenSpec3(spec, {
137
- specVersion
138
- }) {
139
- const {
140
- servers,
141
- paths,
142
- components,
143
- security,
144
- tags,
145
- externalDocs
146
- } = spec;
147
- return {
148
- openapi: specVersion,
149
- info: mapOpenSpecInfo(getValue(spec, "info", {})),
150
- servers,
151
- paths,
152
- components,
153
- security,
154
- tags,
155
- externalDocs
156
- };
157
- }
158
-
159
- /**
160
- * @ignore
161
- * @param spec
162
- * @param fileSpec
163
- * @param version
164
- * @param acceptMimes
165
- * @param specVersion
166
- */
167
-
168
- function mapOpenSpec(spec, {
169
- fileSpec,
170
- acceptMimes,
171
- specVersion,
172
- version
173
- }) {
174
- specVersion = specVersion || getValue(spec, "openapi", getValue(spec, "swagger", "2.0"));
175
- const options = {
176
- specVersion,
177
- acceptMimes
178
- };
179
-
180
- switch (getSpecType(specVersion)) {
181
- case SpecTypes.OPENAPI:
182
- spec = mapOpenSpec3(spec, options);
183
- fileSpec = fileSpec ? mapOpenSpec3(fileSpec, options) : fileSpec;
184
- break;
185
-
186
- default:
187
- case SpecTypes.SWAGGER:
188
- spec = mapOpenSpec2(spec, options);
189
- fileSpec = fileSpec ? mapOpenSpec2(fileSpec, options) : fileSpec;
190
- break;
191
- }
192
-
193
- spec = mergeSpec(spec, fileSpec);
194
- setValue(spec, "info.title", getValue(spec, "info.title", "Api documentation"));
195
- setValue(spec, "info.version", getValue(spec, "info.version", version));
196
- return spec;
197
- }
198
-
199
- function matchPath(path, patterns) {
200
- return patterns && patterns.length ? micromatch.isMatch(path, patterns) : true;
201
- }
202
-
203
- function includeRoute(route, provider, conf) {
204
- const hidden = provider.store.get("hidden");
205
- const docs = provider.store.get("docs") || [];
206
- const {
207
- doc,
208
- pathPatterns
209
- } = conf;
210
- const inDoc = doc && docs.indexOf(doc) > -1;
211
- const pathPatternMatch = pathPatterns && matchPath(route, pathPatterns);
212
-
213
- if (hidden) {
214
- return false;
215
- }
216
-
217
- if (!doc && !pathPatterns) {
218
- return true;
219
- }
220
-
221
- return !!(inDoc || pathPatternMatch);
222
- }
223
-
224
- var _specs;
225
- let SwaggerService = (_specs = /*#__PURE__*/_classPrivateFieldLooseKey("specs"), class SwaggerService {
226
- constructor(injectorService, platform, configuration) {
227
- Object.defineProperty(this, _specs, {
228
- writable: true,
229
- value: void 0
230
- });
231
- this.injectorService = injectorService;
232
- this.platform = platform;
233
- this.configuration = configuration;
234
- _classPrivateFieldLooseBase(this, _specs)[_specs] = new Map();
235
- }
236
-
237
- getOpenAPISpec(conf) {
238
- if (!_classPrivateFieldLooseBase(this, _specs)[_specs].has(conf.path)) {
239
- const defaultSpec = this.getDefaultSpec(conf);
240
- const specType = getSpecTypeFromSpec(defaultSpec);
241
- let finalSpec = {};
242
- const options = {
243
- paths: {},
244
- tags: [],
245
- schemas: {},
246
- specType,
247
- operationIdFormatter: conf.operationIdFormatter,
248
- operationIdPattern: conf.operationIdPattern,
249
-
250
- append(spec) {
251
- finalSpec = mergeSpec(finalSpec, spec);
252
- }
253
-
254
- };
255
- this.platform.getMountedControllers().forEach(({
256
- route,
257
- provider
258
- }) => {
259
- if (includeRoute(route, provider, conf)) {
260
- const spec = this.buildRoutes(provider, _extends({}, options, {
261
- rootPath: route.replace(provider.path, "")
262
- }));
263
- options.append(spec);
264
- }
265
- });
266
-
267
- _classPrivateFieldLooseBase(this, _specs)[_specs].set(conf.path, mergeSpec(defaultSpec, finalSpec));
268
- }
269
-
270
- return _classPrivateFieldLooseBase(this, _specs)[_specs].get(conf.path);
271
- }
272
- /**
273
- * Return the global api information.
274
- */
275
-
276
-
277
- getDefaultSpec(conf) {
278
- const {
279
- version = "1.0.0",
280
- acceptMimes
281
- } = this.configuration;
282
- const {
283
- specPath,
284
- specVersion
285
- } = conf;
286
- const fileSpec = specPath ? this.readSpecPath(specPath) : {};
287
- return mapOpenSpec(getValue(conf, "spec", {}), {
288
- fileSpec,
289
- version,
290
- specVersion,
291
- acceptMimes
292
- });
293
- }
294
-
295
- readSpecPath(path) {
296
- path = this.configuration.resolve(path);
297
-
298
- if (Fs.existsSync(path)) {
299
- const json = Fs.readFileSync(path, {
300
- encoding: "utf8"
301
- });
302
- /* istanbul ignore else */
303
-
304
- if (json !== "") {
305
- return JSON.parse(json);
306
- }
307
- }
308
-
309
- return {};
310
- }
311
- /**
312
- *
313
- * @param ctrl
314
- * @param options
315
- */
316
-
317
-
318
- buildRoutes(ctrl, options) {
319
- const rootPath = options.rootPath + ctrl.path;
320
- ctrl.children.map(ctrl => this.injectorService.getProvider(ctrl)).forEach(provider => {
321
- if (!provider.store.get("hidden")) {
322
- const spec = this.buildRoutes(provider, _extends({}, options, {
323
- rootPath
324
- }));
325
- options.append(spec);
326
- }
327
- });
328
- return getSpec(ctrl.token, options);
329
- }
330
-
331
- });
332
- SwaggerService = __decorate([Injectable(), __param(2, Configuration()), __metadata("design:paramtypes", [InjectorService, Platform, Object])], SwaggerService);
333
-
334
- /**
335
- * @ignore
336
- * @param path
337
- */
338
-
339
- function cssMiddleware(path) {
340
- return ctx => {
341
- const content = Fs.readFileSync(resolve(path), {
342
- encoding: "utf8"
343
- });
344
- ctx.response.setHeaders({
345
- "Content-Type": "text/css"
346
- }).status(200).body(content);
347
- };
348
- }
349
-
350
- /**
351
- * @ignore
352
- * @param viewPath
353
- * @param conf
354
- */
355
- function indexMiddleware(viewPath, conf) {
356
- return async ctx => {
357
- const {
358
- path = "/",
359
- options = {},
360
- showExplorer,
361
- cssPath,
362
- jsPath,
363
- urls
364
- } = conf;
365
- ctx.response.body(await ctx.response.render(viewPath, {
366
- spec: {},
367
- url: `${path}/swagger.json`,
368
- urls,
369
- showExplorer,
370
- cssPath,
371
- jsPath,
372
- swaggerOptions: options
373
- }));
374
- };
375
- }
376
-
377
- /**
378
- * @ignore
379
- * @param path
380
- */
381
-
382
- function jsMiddleware(path) {
383
- return ctx => {
384
- const content = Fs.readFileSync(resolve(path), {
385
- encoding: "utf8"
386
- });
387
- ctx.response.setHeaders({
388
- "Content-Type": "application/javascript"
389
- }).status(200).body(content);
390
- };
391
- }
392
-
393
- /**
394
- * @ignore
395
- * @param path
396
- */
397
- function redirectMiddleware(path) {
398
- return ctx => {
399
- if (ctx.request.url === path && !ctx.request.url.match(/\/$/)) {
400
- ctx.response.redirect(302, `${path}/`);
401
- }
402
- };
403
- }
404
-
405
- const swaggerUiPath = require("swagger-ui-dist").absolutePath();
406
- /**
407
- * @ignore
408
- */
409
-
410
-
411
- let SwaggerModule = class SwaggerModule {
412
- constructor() {
413
- this.loaded = false;
414
- }
415
-
416
- get settings() {
417
- return [].concat(this.configuration.get("swagger")).filter(o => !!o);
418
- }
419
- /**
420
- *
421
- */
422
-
423
-
424
- $beforeRoutesInit() {
425
- if (this.loaded) {
426
- return;
427
- }
428
-
429
- const urls = this.getUrls();
430
- this.settings.forEach(conf => {
431
- const {
432
- path = "/"
433
- } = conf;
434
- this.app.get(path, useCtxHandler(redirectMiddleware(path)));
435
- this.app.use(path, this.createRouter(conf, urls));
436
- });
437
- this.loaded = true;
438
- }
439
-
440
- $onReady() {
441
- // istanbul ignore next
442
- if (this.configuration.getBestHost) {
443
- const host = this.configuration.getBestHost();
444
-
445
- if (!host) {
446
- return;
447
- }
448
-
449
- const displayLog = conf => {
450
- const {
451
- path = "/",
452
- fileName = "swagger.json",
453
- doc
454
- } = conf;
455
- let url = "/";
456
-
457
- if (host) {
458
- url = typeof host.port === "number" ? `${host.protocol}://${host.address}:${host.port}` : "";
459
- }
460
-
461
- this.injector.logger.info(`[${doc || "default"}] Swagger JSON is available on ${url}${normalizePath(path, fileName)}`);
462
- this.injector.logger.info(`[${doc || "default"}] Swagger UI is available on ${url}${path}/`);
463
- };
464
-
465
- this.settings.forEach(conf => {
466
- displayLog(conf);
467
- });
468
- }
469
-
470
- this.generateSpecFiles();
471
- }
472
-
473
- generateSpecFiles() {
474
- return Promise.all(this.settings.map(conf => {
475
- const {
476
- outFile
477
- } = conf;
478
-
479
- if (outFile) {
480
- const spec = this.swaggerService.getOpenAPISpec(conf);
481
- return Fs.writeFile(outFile, JSON.stringify(spec, null, 2), {
482
- encoding: "utf8"
483
- }, () => {});
484
- }
485
- }));
486
- }
487
-
488
- getUrls() {
489
- return this.settings.reduce((acc, conf) => {
490
- const {
491
- path = "/",
492
- fileName = "swagger.json",
493
- doc,
494
- hidden
495
- } = conf;
496
-
497
- if (!hidden) {
498
- acc.push({
499
- url: normalizePath(path, fileName),
500
- name: doc || path
501
- });
502
- }
503
-
504
- return acc;
505
- }, []);
506
- }
507
- /**
508
- *
509
- * @param conf
510
- * @param urls
511
- */
512
-
513
-
514
- createRouter(conf, urls) {
515
- const {
516
- disableSpec = false,
517
- fileName = "swagger.json",
518
- cssPath,
519
- jsPath,
520
- viewPath = join(__dirname, "../views/index.ejs")
521
- } = conf;
522
- const router = PlatformRouter.create(this.injector);
523
-
524
- if (!disableSpec) {
525
- router.get(normalizePath("/", fileName), useCtxHandler(this.middlewareSwaggerJson(conf)));
526
- }
527
-
528
- if (viewPath) {
529
- if (cssPath) {
530
- router.get("/main.css", useCtxHandler(cssMiddleware(cssPath)));
531
- }
532
-
533
- if (jsPath) {
534
- router.get("/main.js", useCtxHandler(jsMiddleware(jsPath)));
535
- }
536
-
537
- router.get("/", useCtxHandler(indexMiddleware(viewPath, _extends({
538
- urls
539
- }, conf))));
540
- router.statics("/", {
541
- root: swaggerUiPath
542
- });
543
- }
544
-
545
- return router;
546
- }
547
-
548
- middlewareSwaggerJson(conf) {
549
- return ctx => {
550
- ctx.response.status(200).body(this.swaggerService.getOpenAPISpec(conf));
551
- };
552
- }
553
-
554
- };
555
-
556
- __decorate([Inject(), __metadata("design:type", InjectorService)], SwaggerModule.prototype, "injector", void 0);
557
-
558
- __decorate([Inject(), __metadata("design:type", PlatformApplication)], SwaggerModule.prototype, "app", void 0);
559
-
560
- __decorate([Configuration(), __metadata("design:type", Object)], SwaggerModule.prototype, "configuration", void 0);
561
-
562
- __decorate([Inject(), __metadata("design:type", SwaggerService)], SwaggerModule.prototype, "swaggerService", void 0);
563
-
564
- SwaggerModule = __decorate([Module()], SwaggerModule);
565
-
566
- /**
567
- * Set the type documentation for this class.
568
- *
569
- * See [swagger documentation](/tutorials/swagger.html)
570
- *
571
- * @decorator
572
- * @swagger
573
- * @param docs
574
- */
575
-
576
- function Docs(...docs) {
577
- return StoreMerge("docs", docs);
578
- }
579
-
580
- /**
581
- * Disable documentation for the class and his endpoint.
582
- *
583
- * ````typescript
584
- * @Controller('/')
585
- * export class Ctrl {
586
- *
587
- * @Get('/')
588
- * @Hidden()
589
- * hiddenRoute(){
590
- *
591
- * }
592
- * }
593
- *
594
- * @Controller('/')
595
- * @Hidden()
596
- * export class Ctrl {
597
- * @Get('/')
598
- * hiddenRoute() {
599
- *
600
- * }
601
- * @Get('/2')
602
- * hiddenRoute2() {
603
- *
604
- * }
605
- * }
606
- * ```
607
- *
608
- * @decorator
609
- * @swagger
610
- */
611
-
612
- function Hidden() {
613
- return Hidden$1();
614
- }
615
-
616
- export { Docs, Hidden, SwaggerModule, SwaggerService };
617
- //# sourceMappingURL=index.modern.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.modern.js","sources":["../src/utils/getSpecType.ts","../src/utils/mapOpenSpecInfo.ts","../src/utils/mapOpenSpec2.ts","../src/utils/mapOpenSpec3.ts","../src/utils/mapOpenSpec.ts","../src/utils/matchPath.ts","../src/utils/includeRoute.ts","../src/services/SwaggerService.ts","../src/middlewares/cssMiddleware.ts","../src/middlewares/indexMiddleware.ts","../src/middlewares/jsMiddleware.ts","../src/middlewares/redirectMiddleware.ts","../src/SwaggerModule.ts","../src/decorators/docs.ts","../src/decorators/hidden.ts"],"sourcesContent":["import {OpenSpec2, OpenSpec3} from \"@tsed/openspec\";\nimport {SpecTypes} from \"@tsed/schema\";\n\n/**\n * @ignore\n * @param version\n */\nexport function getSpecType(version: string) {\n return version.startsWith(\"3.\") ? SpecTypes.OPENAPI : SpecTypes.SWAGGER;\n}\n\n/**\n * @ignore\n * @param spec\n */\nexport function getSpecTypeFromSpec(spec: Partial<OpenSpec2 | OpenSpec3>) {\n return \"openapi\" in spec ? SpecTypes.OPENAPI : SpecTypes.SWAGGER;\n}\n","import {cleanObject} from \"@tsed/core\";\nimport {OpenSpecInfo} from \"@tsed/openspec\";\n\n/**\n * @ignore\n * @param info\n */\nexport function mapOpenSpecInfo(info: Partial<OpenSpecInfo>): OpenSpecInfo {\n const {title, description, version, termsOfService, contact, license} = info;\n\n return cleanObject({\n version,\n title,\n description,\n termsOfService,\n contact,\n license\n });\n}\n","import {getValue, uniq} from \"@tsed/core\";\nimport {OpenSpec2} from \"@tsed/openspec\";\nimport {mapOpenSpecInfo} from \"./mapOpenSpecInfo\";\n\n/**\n * @ignore\n * @param spec\n * @param version\n * @param specVersion\n * @param acceptMimes\n */\nexport function mapOpenSpec2(\n spec: Partial<OpenSpec2>,\n {version, specVersion, acceptMimes = [\"application/json\"]}: any\n): Partial<OpenSpec2> {\n const {\n paths,\n security,\n tags,\n host,\n basePath,\n schemes,\n consumes = [],\n produces = [\"application/json\"],\n definitions,\n parameters,\n responses,\n securityDefinitions,\n externalDocs\n } = spec;\n\n return {\n swagger: specVersion,\n consumes: uniq([...acceptMimes, ...consumes]),\n produces: uniq<string>([...produces]),\n info: mapOpenSpecInfo(getValue(spec, \"info\", {})),\n paths,\n host,\n basePath,\n schemes,\n definitions,\n parameters,\n responses,\n security,\n securityDefinitions,\n tags,\n externalDocs\n };\n}\n","import {getValue} from \"@tsed/core\";\nimport {OpenSpec3} from \"@tsed/openspec\";\nimport {mapOpenSpecInfo} from \"./mapOpenSpecInfo\";\n\n/**\n * @ignore\n * @param spec\n * @param version\n * @param specVersion\n */\nexport function mapOpenSpec3(spec: any, {specVersion}: any): Partial<OpenSpec3> {\n const {servers, paths, components, security, tags, externalDocs} = spec;\n\n return {\n openapi: specVersion,\n info: mapOpenSpecInfo(getValue(spec, \"info\", {})),\n servers,\n paths,\n components,\n security,\n tags,\n externalDocs\n };\n}\n","import {getValue, setValue} from \"@tsed/core\";\nimport {OpenSpec2, OpenSpec3, OpenSpecVersions} from \"@tsed/openspec\";\nimport {mergeSpec, SpecTypes} from \"@tsed/schema\";\nimport {getSpecType} from \"./getSpecType\";\nimport {mapOpenSpec2} from \"./mapOpenSpec2\";\nimport {mapOpenSpec3} from \"./mapOpenSpec3\";\n\n/**\n * @ignore\n * @param spec\n * @param fileSpec\n * @param version\n * @param acceptMimes\n * @param specVersion\n */\nexport function mapOpenSpec(spec: any, {fileSpec, acceptMimes, specVersion, version}: any): Partial<OpenSpec2 | OpenSpec3> {\n specVersion = specVersion || getValue<OpenSpecVersions>(spec, \"openapi\", getValue(spec, \"swagger\", \"2.0\"));\n\n const options = {\n specVersion,\n acceptMimes\n };\n\n switch (getSpecType(specVersion)) {\n case SpecTypes.OPENAPI:\n spec = mapOpenSpec3(spec, options);\n fileSpec = fileSpec ? mapOpenSpec3(fileSpec, options) : fileSpec;\n break;\n default:\n case SpecTypes.SWAGGER:\n spec = mapOpenSpec2(spec, options);\n fileSpec = fileSpec ? mapOpenSpec2(fileSpec, options) : fileSpec;\n break;\n }\n\n spec = mergeSpec(spec, fileSpec);\n\n setValue(spec, \"info.title\", getValue(spec, \"info.title\", \"Api documentation\"));\n setValue(spec, \"info.version\", getValue(spec, \"info.version\", version));\n\n return spec;\n}\n","import micromatch from \"micromatch\";\n\nexport function matchPath(path: string, patterns?: string[]) {\n return patterns && patterns.length ? micromatch.isMatch(path, patterns) : true;\n}\n","import {ControllerProvider} from \"@tsed/common\";\nimport {matchPath} from \".\";\nimport {SwaggerSettings} from \"..\";\n\nexport function includeRoute(route: string, provider: ControllerProvider, conf: SwaggerSettings): boolean {\n const hidden = provider.store.get(\"hidden\");\n const docs = provider.store.get(\"docs\") || [];\n const {doc, pathPatterns} = conf;\n const inDoc = doc && docs.indexOf(doc) > -1;\n const pathPatternMatch = pathPatterns && matchPath(route, pathPatterns);\n\n if (hidden) {\n return false;\n }\n\n if (!doc && !pathPatterns) {\n return true;\n }\n\n return !!(inDoc || pathPatternMatch);\n}\n","import {Configuration, ControllerProvider, Injectable, InjectorService, Platform} from \"@tsed/common\";\nimport {getValue} from \"@tsed/core\";\nimport {OpenSpec2, OpenSpec3} from \"@tsed/openspec\";\nimport {getSpec, mergeSpec, SpecSerializerOptions} from \"@tsed/schema\";\nimport Fs from \"fs\";\nimport {SwaggerOS2Settings, SwaggerOS3Settings, SwaggerSettings} from \"../interfaces/SwaggerSettings\";\nimport {getSpecTypeFromSpec} from \"../utils/getSpecType\";\nimport {includeRoute} from \"../utils/includeRoute\";\nimport {mapOpenSpec} from \"../utils/mapOpenSpec\";\n\n@Injectable()\nexport class SwaggerService {\n #specs: Map<string, OpenSpec3 | OpenSpec2> = new Map();\n\n constructor(\n private injectorService: InjectorService,\n private platform: Platform,\n @Configuration() private configuration: Configuration\n ) {}\n\n /**\n * Generate Spec for the given configuration\n * @returns {Spec}\n */\n public getOpenAPISpec(conf: SwaggerOS3Settings): OpenSpec3;\n public getOpenAPISpec(conf: SwaggerOS2Settings): OpenSpec2;\n public getOpenAPISpec(conf: SwaggerSettings): OpenSpec2;\n public getOpenAPISpec(conf: SwaggerSettings) {\n if (!this.#specs.has(conf.path)) {\n const defaultSpec: any = this.getDefaultSpec(conf);\n const specType = getSpecTypeFromSpec(defaultSpec);\n let finalSpec: any = {};\n\n const options: SpecSerializerOptions = {\n paths: {},\n tags: [],\n schemas: {},\n specType,\n operationIdFormatter: conf.operationIdFormatter,\n operationIdPattern: conf.operationIdPattern,\n append(spec: any) {\n finalSpec = mergeSpec(finalSpec, spec);\n }\n };\n\n this.platform.getMountedControllers().forEach(({route, provider}) => {\n if (includeRoute(route, provider, conf)) {\n const spec = this.buildRoutes(provider, {\n ...options,\n rootPath: route.replace(provider.path, \"\")\n });\n\n options.append(spec);\n }\n });\n\n this.#specs.set(conf.path, mergeSpec(defaultSpec, finalSpec) as any);\n }\n\n return this.#specs.get(conf.path);\n }\n\n /**\n * Return the global api information.\n */\n protected getDefaultSpec(conf: Partial<SwaggerSettings>): Partial<OpenSpec2 | OpenSpec3> {\n const {version = \"1.0.0\", acceptMimes} = this.configuration;\n const {specPath, specVersion} = conf;\n const fileSpec: Partial<OpenSpec2 | OpenSpec3> = specPath ? this.readSpecPath(specPath) : {};\n\n return mapOpenSpec(getValue(conf, \"spec\", {}), {\n fileSpec,\n version,\n specVersion,\n acceptMimes\n });\n }\n\n protected readSpecPath(path: string) {\n path = this.configuration.resolve(path);\n if (Fs.existsSync(path)) {\n const json = Fs.readFileSync(path, {encoding: \"utf8\"});\n /* istanbul ignore else */\n if (json !== \"\") {\n return JSON.parse(json);\n }\n }\n\n return {};\n }\n\n /**\n *\n * @param ctrl\n * @param options\n */\n protected buildRoutes(ctrl: ControllerProvider, options: SpecSerializerOptions) {\n const rootPath = options.rootPath + ctrl.path;\n\n ctrl.children\n .map((ctrl) => this.injectorService.getProvider(ctrl))\n .forEach((provider: ControllerProvider) => {\n if (!provider.store.get(\"hidden\")) {\n const spec = this.buildRoutes(provider, {\n ...options,\n rootPath\n });\n\n options.append(spec);\n }\n });\n\n return getSpec(ctrl.token, options);\n }\n}\n","import {PlatformContext} from \"@tsed/common\";\nimport Fs from \"fs\";\nimport {resolve} from \"path\";\n\n/**\n * @ignore\n * @param path\n */\nexport function cssMiddleware(path: string) {\n return (ctx: PlatformContext) => {\n const content = Fs.readFileSync(resolve(path), {encoding: \"utf8\"});\n ctx.response\n .setHeaders({\n \"Content-Type\": \"text/css\"\n })\n .status(200)\n .body(content);\n };\n}\n","import {PlatformContext} from \"@tsed/common\";\nimport {SwaggerSettings} from \"../interfaces/SwaggerSettings\";\n\n/**\n * @ignore\n * @param viewPath\n * @param conf\n */\nexport function indexMiddleware(viewPath: string, conf: SwaggerSettings & {urls: string[]}) {\n return async (ctx: PlatformContext) => {\n const {path = \"/\", options = {}, showExplorer, cssPath, jsPath, urls} = conf;\n\n ctx.response.body(\n await ctx.response.render(viewPath, {\n spec: {},\n url: `${path}/swagger.json`,\n urls,\n showExplorer,\n cssPath,\n jsPath,\n swaggerOptions: options\n })\n );\n };\n}\n","import {PlatformContext} from \"@tsed/common\";\nimport Fs from \"fs\";\nimport {resolve} from \"path\";\n\n/**\n * @ignore\n * @param path\n */\nexport function jsMiddleware(path: string) {\n return (ctx: PlatformContext) => {\n const content = Fs.readFileSync(resolve(path), {encoding: \"utf8\"});\n ctx.response.setHeaders({\"Content-Type\": \"application/javascript\"}).status(200).body(content);\n };\n}\n","import {PlatformContext} from \"@tsed/common\";\n\n/**\n * @ignore\n * @param path\n */\nexport function redirectMiddleware(path: string) {\n return (ctx: PlatformContext) => {\n if (ctx.request.url === path && !ctx.request.url.match(/\\/$/)) {\n ctx.response.redirect(302, `${path}/`);\n }\n };\n}\n","import {\n BeforeRoutesInit,\n Configuration,\n Inject,\n InjectorService,\n Module,\n normalizePath,\n OnReady,\n PlatformApplication,\n PlatformContext,\n PlatformRouter,\n useCtxHandler\n} from \"@tsed/common\";\nimport Fs from \"fs\";\nimport {join} from \"path\";\nimport {SwaggerSettings} from \"./interfaces\";\nimport {cssMiddleware} from \"./middlewares/cssMiddleware\";\nimport {indexMiddleware} from \"./middlewares/indexMiddleware\";\nimport {jsMiddleware} from \"./middlewares/jsMiddleware\";\nimport {redirectMiddleware} from \"./middlewares/redirectMiddleware\";\nimport {SwaggerService} from \"./services/SwaggerService\";\n\nconst swaggerUiPath = require(\"swagger-ui-dist\").absolutePath();\n\n/**\n * @ignore\n */\n@Module()\nexport class SwaggerModule implements BeforeRoutesInit, OnReady {\n @Inject()\n injector: InjectorService;\n\n @Inject()\n app: PlatformApplication;\n\n @Configuration()\n configuration: Configuration;\n\n @Inject()\n swaggerService: SwaggerService;\n\n private loaded = false;\n\n get settings() {\n return ([] as SwaggerSettings[]).concat(this.configuration.get<SwaggerSettings[]>(\"swagger\")).filter((o) => !!o);\n }\n\n /**\n *\n */\n $beforeRoutesInit() {\n if (this.loaded) {\n return;\n }\n\n const urls: any[] = this.getUrls();\n\n this.settings.forEach((conf: SwaggerSettings) => {\n const {path = \"/\"} = conf;\n\n this.app.get(path, useCtxHandler(redirectMiddleware(path)));\n this.app.use(path, this.createRouter(conf, urls));\n });\n\n this.loaded = true;\n }\n\n $onReady() {\n // istanbul ignore next\n if (this.configuration.getBestHost) {\n const host = this.configuration.getBestHost();\n\n if (!host) {\n return;\n }\n\n const displayLog = (conf: SwaggerSettings) => {\n const {path = \"/\", fileName = \"swagger.json\", doc} = conf;\n\n let url = \"/\";\n\n if (host) {\n url = typeof host.port === \"number\" ? `${host.protocol}://${host.address}:${host.port}` : \"\";\n }\n\n this.injector.logger.info(`[${doc || \"default\"}] Swagger JSON is available on ${url}${normalizePath(path, fileName)}`);\n this.injector.logger.info(`[${doc || \"default\"}] Swagger UI is available on ${url}${path}/`);\n };\n\n this.settings.forEach((conf) => {\n displayLog(conf);\n });\n }\n\n this.generateSpecFiles();\n }\n\n generateSpecFiles() {\n return Promise.all(\n this.settings.map((conf) => {\n const {outFile} = conf;\n\n if (outFile) {\n const spec = this.swaggerService.getOpenAPISpec(conf);\n return Fs.writeFile(outFile, JSON.stringify(spec, null, 2), {encoding: \"utf8\"}, () => {});\n }\n })\n );\n }\n\n private getUrls() {\n return this.settings.reduce((acc: any[], conf) => {\n const {path = \"/\", fileName = \"swagger.json\", doc, hidden} = conf;\n\n if (!hidden) {\n acc.push({url: normalizePath(path, fileName), name: doc || path});\n }\n\n return acc;\n }, []);\n }\n\n /**\n *\n * @param conf\n * @param urls\n */\n private createRouter(conf: SwaggerSettings, urls: string[]) {\n const {disableSpec = false, fileName = \"swagger.json\", cssPath, jsPath, viewPath = join(__dirname, \"../views/index.ejs\")} = conf;\n const router = PlatformRouter.create(this.injector);\n\n if (!disableSpec) {\n router.get(normalizePath(\"/\", fileName), useCtxHandler(this.middlewareSwaggerJson(conf)));\n }\n\n if (viewPath) {\n if (cssPath) {\n router.get(\"/main.css\", useCtxHandler(cssMiddleware(cssPath)));\n }\n\n if (jsPath) {\n router.get(\"/main.js\", useCtxHandler(jsMiddleware(jsPath)));\n }\n\n router.get(\"/\", useCtxHandler(indexMiddleware(viewPath, {urls, ...conf})));\n router.statics(\"/\", {root: swaggerUiPath});\n }\n\n return router;\n }\n\n private middlewareSwaggerJson(conf: SwaggerSettings) {\n return (ctx: PlatformContext) => {\n ctx.response.status(200).body(this.swaggerService.getOpenAPISpec(conf));\n };\n }\n}\n","import {StoreMerge} from \"@tsed/core\";\n\n/**\n * Set the type documentation for this class.\n *\n * See [swagger documentation](/tutorials/swagger.html)\n *\n * @decorator\n * @swagger\n * @param docs\n */\nexport function Docs(...docs: string[]) {\n return StoreMerge(\"docs\", docs);\n}\n","import {Hidden as H} from \"@tsed/schema\";\n\n/**\n * Disable documentation for the class and his endpoint.\n *\n * ````typescript\n * @Controller('/')\n * export class Ctrl {\n *\n * @Get('/')\n * @Hidden()\n * hiddenRoute(){\n *\n * }\n * }\n *\n * @Controller('/')\n * @Hidden()\n * export class Ctrl {\n * @Get('/')\n * hiddenRoute() {\n *\n * }\n * @Get('/2')\n * hiddenRoute2() {\n *\n * }\n * }\n * ```\n *\n * @decorator\n * @swagger\n */\nexport function Hidden() {\n return H();\n}\n"],"names":["getSpecType","version","startsWith","SpecTypes","OPENAPI","SWAGGER","getSpecTypeFromSpec","spec","mapOpenSpecInfo","info","title","description","termsOfService","contact","license","cleanObject","mapOpenSpec2","specVersion","acceptMimes","paths","security","tags","host","basePath","schemes","consumes","produces","definitions","parameters","responses","securityDefinitions","externalDocs","swagger","uniq","getValue","mapOpenSpec3","servers","components","openapi","mapOpenSpec","fileSpec","options","mergeSpec","setValue","matchPath","path","patterns","length","micromatch","isMatch","includeRoute","route","provider","conf","hidden","store","get","docs","doc","pathPatterns","inDoc","indexOf","pathPatternMatch","SwaggerService","constructor","injectorService","platform","configuration","Map","getOpenAPISpec","has","defaultSpec","getDefaultSpec","specType","finalSpec","schemas","operationIdFormatter","operationIdPattern","append","getMountedControllers","forEach","buildRoutes","rootPath","replace","set","specPath","readSpecPath","resolve","Fs","existsSync","json","readFileSync","encoding","JSON","parse","ctrl","children","map","getProvider","getSpec","token","Injectable","__param","Configuration","InjectorService","Platform","cssMiddleware","ctx","content","response","setHeaders","status","body","indexMiddleware","viewPath","showExplorer","cssPath","jsPath","urls","render","url","swaggerOptions","jsMiddleware","redirectMiddleware","request","match","redirect","swaggerUiPath","require","absolutePath","SwaggerModule","settings","concat","filter","o","$beforeRoutesInit","loaded","getUrls","app","useCtxHandler","use","createRouter","$onReady","getBestHost","displayLog","fileName","port","protocol","address","injector","logger","normalizePath","generateSpecFiles","Promise","all","outFile","swaggerService","writeFile","stringify","reduce","acc","push","name","disableSpec","join","__dirname","router","PlatformRouter","create","middlewareSwaggerJson","statics","root","__decorate","Inject","PlatformApplication","Module","Docs","StoreMerge","Hidden","H"],"mappings":"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"}