randydev commited on
Commit
787d9f7
·
verified ·
1 Parent(s): ea9ab95

Upload swagger.js

Browse files
Files changed (1) hide show
  1. swagger.js +540 -14
swagger.js CHANGED
@@ -1,16 +1,542 @@
1
- import swaggerJsdoc from 'swagger-jsdoc';
2
-
3
- const options = {
4
- definition: {
5
- openapi: '3.0.0',
6
- info: {
7
- title: 'AkenoXJS',
8
- version: '1.0.0',
9
- },
10
- },
11
- apis: ['./src/routes*.js'],
12
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
- const openapiSpecification = swaggerJsdoc(options);
15
 
16
- export { openapiSpecification };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var express = require('express');
2
+ var getAbsoluteSwaggerFsPath = require("swagger-ui-dist").getAbsoluteFSPath();
3
+ var favIconHtml = '<link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />' +
4
+ '<link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />';
5
+ var swaggerInit = '';
6
+
7
+ function trimQuery(q) {
8
+ return q && q.split('?')[0];
9
+ }
10
+
11
+ var htmlTplString = `
12
+ <!-- HTML for static distribution bundle build -->
13
+ <!DOCTYPE html>
14
+ <html lang="en">
15
+ <head>
16
+ <meta charset="UTF-8">
17
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
18
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
19
+ <meta property="og:type" content="website">
20
+ <meta name="apple-mobile-web-app-capable" content="yes">
21
+ <% robotsMetaString %>
22
+ <link rel="stylesheet" type="text/css" href="./swagger-ui.css" >
23
+ <% favIconString %>
24
+ <style>
25
+ html
26
+ {
27
+ box-sizing: border-box;
28
+ overflow: -moz-scrollbars-vertical;
29
+ overflow-y: scroll;
30
+ }
31
+ *,
32
+ *:before,
33
+ *:after
34
+ {
35
+ box-sizing: inherit;
36
+ }
37
+ body {
38
+ margin:0;
39
+ background: #fafafa;
40
+ }
41
+ .swagger-ui section.models h4 span {
42
+ flex: 1;
43
+ color: black;
44
+ }
45
+
46
+ .swagger-ui .model-toggle {
47
+ cursor: pointer;
48
+ display: inline-block;
49
+ font-size: 10px;
50
+ margin: auto .3em;
51
+ position: relative;
52
+ top: 6px;
53
+ transform: rotate(90deg);
54
+ transform-origin: 50% 50%;
55
+ transition: transform .15s ease-in;
56
+ background-color: white;
57
+ border-radius: 50%;
58
+ }
59
+
60
+ .dark-mode body {
61
+ background-color: #1f1f1f;
62
+ color: #ffffff;
63
+ }
64
+
65
+ .dark-mode .swagger-ui {
66
+ color: #3b4151;
67
+ background-color: #1f1f1f;
68
+ }
69
+
70
+ .dark-mode .swagger-ui .topbar {
71
+ background-color: #131414;
72
+ }
73
+
74
+ .dark-mode .swagger-ui .info .title {
75
+ color: #fff;
76
+ }
77
+
78
+ .dark-mode .swagger-ui .opblock-description-wrapper, .swagger-ui .opblock-external-docs-wrapper, .swagger-ui .opblock-title_normal {
79
+ color: #fff;
80
+ }
81
+
82
+ .dark-mode .swagger-ui .info li, .dark-mode .swagger-ui .info p, .dark-mode .swagger-ui .info table {
83
+ color: #fff;
84
+ }
85
+
86
+ .dark-mode .swagger-ui .scheme-container {
87
+ background: #131414;
88
+ box-shadow: 0 1px 2px 0 rgba(0,0,0,.15);
89
+ }
90
+
91
+ .dark-mode .swagger-ui .servers-title {
92
+ color: #fff;
93
+ }
94
+
95
+ .dark-mode .swagger-ui select {
96
+ background: #131414 url("data:image/svg+xml;charset=utf-8,<svg xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 20 20\\"><path d=\\"M13.418 7.859a.695.695 0 0 1 .978 0 .68.68 0 0 1 0 .969l-3.908 3.83a.697.697 0 0 1-.979 0l-3.908-3.83a.68.68 0 0 1 0-.969.695.695 0 0 1 .978 0L10 11z\\"/></svg>") right 10px center no-repeat;
97
+ border: 2px solid #41444e;
98
+ box-shadow: 0 1px 2px 0 rgba(0,0,0,.25);
99
+ color: #fff;
100
+ }
101
+
102
+ .dark-mode .swagger-ui a.nostyle, .dark-mode .swagger-ui a.nostyle:visited {
103
+ color: #fff;
104
+ }
105
+
106
+ .dark-mode .swagger-ui .opblock-tag small {
107
+ color: #fff;
108
+ }
109
+
110
+ .dark-mode .swagger-ui .opblock .opblock-summary-description {
111
+ color: #fff;
112
+ }
113
+
114
+ .dark-mode .swagger-ui .opblock-description-wrapper p, .dark-mode .swagger-ui .opblock-external-docs-wrapper p, .dark-mode .swagger-ui .opblock-title_normal p {
115
+ color: #fff;
116
+ }
117
+
118
+ .dark-mode .swagger-ui .opblock .opblock-section-header {
119
+ align-items: center;
120
+ background: #131414;
121
+ box-shadow: 0 1px 2px rgba(0,0,0,.1);
122
+ }
123
+
124
+ .dark-mode .swagger-ui .btn {
125
+ box-shadow: 0 1px 2px rgba(0,0,0,.1);
126
+ color: #fff;
127
+ }
128
+
129
+ .dark-mode .swagger-ui .opblock .opblock-section-header h4 {
130
+ color: #fff;
131
+ }
132
+
133
+ .dark-mode .swagger-ui .responses-inner h4, .swagger-ui .responses-inner h5 {
134
+ color: #fff;
135
+ }
136
+
137
+ .dark-mode .swagger-ui table thead tr td, .dark-mode .swagger-ui table thead tr th {
138
+ border-bottom: 1px solid rgba(59,65,81,.2);
139
+ color: #fff;
140
+ }
141
+
142
+ .dark-mode .swagger-ui .parameter__name {
143
+ color: #fff;
144
+ }
145
+
146
+ .dark-mode .swagger-ui .parameters-col_description .markdown p, .dark-mode .swagger-ui .parameters-col_description .renderedMarkdown p {
147
+ color: #fff;
148
+ }
149
+
150
+ .dark-mode .swagger-ui .parameter__type {
151
+ color: #fff;
152
+ }
153
+
154
+ .dark-mode .swagger-ui .parameter__extension, .dark-mode .swagger-ui .parameter__in {
155
+ color: #fff;
156
+ }
157
+
158
+ .dark-mode .swagger-ui input[disabled], .dark-mode .swagger-ui select[disabled], .dark-mode .swagger-ui textarea[disabled] {
159
+ background-color: #131414;
160
+ color: #fff;
161
+ }
162
+
163
+ .dark-mode .swagger-ui input[type="email"], .dark-mode .swagger-ui input[type="file"], .dark-mode .swagger-ui input[type="password"], .dark-mode .swagger-ui input[type="search"], .dark-mode .swagger-ui input[type="text"], .dark-mode .swagger-ui textarea {
164
+ background: #131414;
165
+ border: 1px solid #d9d9d9;
166
+ color: #fff;
167
+ }
168
+
169
+ .dark-mode .swagger-ui input[type="email"].invalid, .dark-mode .swagger-ui input[type="file"].invalid, .dark-mode .swagger-ui input[type="password"].invalid, .dark-mode .swagger-ui input[type="search"].invalid, .dark-mode .swagger-ui input[type="text"].invalid, .dark-mode .swagger-ui textarea.invalid {
170
+ background: #400c0c;
171
+ border-color: #f93e3e;
172
+ }
173
+
174
+ .dark-mode .swagger-ui .errors-wrapper {
175
+ background: rgba(249,62,62,.1);
176
+ border: 2px solid #f93e3e;
177
+ color: #fff;
178
+ }
179
+
180
+ .dark-mode .swagger-ui .response-col_status {
181
+ color: #fff;
182
+ }
183
+
184
+ .dark-mode .swagger-ui .response-col_description .markdown p, .dark-mode .swagger-ui .response-col_description .renderedMarkdown p {
185
+ color: #fff;
186
+ }
187
+
188
+ .dark-mode .swagger-ui .response-control-examples__title, .dark-mode .swagger-ui .response-control-media-type__title {
189
+ color: #fff;
190
+ }
191
+
192
+ .dark-mode .swagger-ui .tab li button.tablinks {
193
+ color: #fff;
194
+ }
195
+
196
+ .dark-mode .swagger-ui .expand-methods svg, .swagger-ui .expand-operation svg {
197
+ fill: white;
198
+ }
199
+
200
+ .dark-mode .swagger-ui svg:not(:root) {
201
+ fill: white;
202
+ }
203
+
204
+ .dark-mode .swagger-ui section.models h4 span {
205
+ color: white;
206
+ }
207
+
208
+ .dark-mode .swagger-ui .model {
209
+ color: white;
210
+ }
211
+
212
+ .dark-mode .swagger-ui .model-title {
213
+ color: white;
214
+ }
215
+
216
+ .dark-mode .swagger-ui label {
217
+ color: white;
218
+ }
219
+
220
+ .dark-mode .swagger-ui .model-toggle {
221
+ background-color: white;
222
+ }
223
+
224
+ .dark-mode .swagger-ui table.model tr.property-row td:first-child {
225
+ color: white;
226
+ }
227
+
228
+ .dark-mode .swagger-ui .model-box-control, .swagger-ui .models-control, .swagger-ui .opblock-summary-control {
229
+ color: white;
230
+ }
231
+
232
+ .dark-mode .swagger-ui section.models .model-container {
233
+ background-color: #1a1a1a;
234
+ }
235
+
236
+ .dark-mode .swagger-ui .info .base-url {
237
+ color: white;
238
+ }
239
+
240
+ .dark-mode .swagger-ui .scheme-container .schemes > .schemes-server-container > label {
241
+ color: white;
242
+ }
243
+ </style>
244
+ </head>
245
 
246
+ <body>
247
 
248
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0">
249
+ <defs>
250
+ <symbol viewBox="0 0 20 20" id="unlocked">
251
+ <path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"></path>
252
+ </symbol>
253
+
254
+ <symbol viewBox="0 0 20 20" id="locked">
255
+ <path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"/>
256
+ </symbol>
257
+
258
+ <symbol viewBox="0 0 20 20" id="close">
259
+ <path d="M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"/>
260
+ </symbol>
261
+
262
+ <symbol viewBox="0 0 20 20" id="large-arrow">
263
+ <path d="M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"/>
264
+ </symbol>
265
+
266
+ <symbol viewBox="0 0 20 20" id="large-arrow-down">
267
+ <path d="M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"/>
268
+ </symbol>
269
+
270
+
271
+ <symbol viewBox="0 0 24 24" id="jump-to">
272
+ <path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"/>
273
+ </symbol>
274
+
275
+ <symbol viewBox="0 0 24 24" id="expand">
276
+ <path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>
277
+ </symbol>
278
+
279
+ </defs>
280
+ </svg>
281
+
282
+ <div id="swagger-ui"></div>
283
+
284
+ <script src="./swagger-ui-bundle.js"> </script>
285
+ <script src="./swagger-ui-standalone-preset.js"> </script>
286
+ <script src="./swagger-ui-init.js"> </script>
287
+
288
+ <% customJs %>
289
+ <% customJsStr %>
290
+ <% customCssUrl %>
291
+ <style>
292
+ <% customCss %>
293
+ </style>
294
+
295
+ <script>
296
+ document.addEventListener('DOMContentLoaded', function() {
297
+ const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
298
+
299
+ function updateTheme() {
300
+ if (darkModeMediaQuery.matches) {
301
+ document.documentElement.classList.add('dark-mode');
302
+ document.documentElement.classList.remove('light-mode');
303
+ } else {
304
+ document.documentElement.classList.remove('dark-mode');
305
+ document.documentElement.classList.add('light-mode');
306
+ }
307
+ }
308
+
309
+ darkModeMediaQuery.addListener(updateTheme);
310
+ updateTheme();
311
+ });
312
+
313
+ </script>
314
+ </body>
315
+ </html>
316
+ `
317
+
318
+ var jsTplString = `
319
+ window.onload = function() {
320
+ // Build a system
321
+
322
+ var url = window.location.search.match(/url=([^&]+)/);
323
+ if (url && url.length > 1) {
324
+ url = decodeURIComponent(url[1]);
325
+ } else {
326
+ url = window.location.origin;
327
+ }
328
+
329
+ <% swaggerOptions %>
330
+ url = options.swaggerUrl || url
331
+ var urls = options.swaggerUrls
332
+ var customOptions = options.customOptions
333
+ var spec1 = options.swaggerDoc
334
+ var swaggerOptions = {
335
+ spec: spec1,
336
+ url: url,
337
+ urls: urls,
338
+ dom_id: '#swagger-ui',
339
+ deepLinking: true,
340
+ presets: [
341
+ SwaggerUIBundle.presets.apis,
342
+ SwaggerUIStandalonePreset
343
+ ],
344
+
345
+ plugins: [
346
+ SwaggerUIBundle.plugins.DownloadUrl
347
+ ],
348
+ layout: "StandaloneLayout"
349
+ }
350
+
351
+ for (var attrname in customOptions) {
352
+ swaggerOptions[attrname] = customOptions[attrname];
353
+ }
354
+ var ui = SwaggerUIBundle(swaggerOptions)
355
+
356
+ if (customOptions.oauth) {
357
+ ui.initOAuth(customOptions.oauth)
358
+ }
359
+
360
+ if (customOptions.preauthorizeApiKey) {
361
+ const key = customOptions.preauthorizeApiKey.authDefinitionKey;
362
+ const value = customOptions.preauthorizeApiKey.apiKeyValue;
363
+ if (!!key && !!value) {
364
+ const pid = setInterval(() => {
365
+ const authorized = ui.preauthorizeApiKey(key, value);
366
+ if(!!authorized) clearInterval(pid);
367
+ }, 500)
368
+
369
+ }
370
+ }
371
+
372
+ if (customOptions.authAction) {
373
+ ui.authActions.authorize(customOptions.authAction)
374
+ }
375
+
376
+ window.ui = ui
377
+ }
378
+ `
379
+
380
+ function toExternalScriptTag(url) {
381
+ return `<script src='${url}'></script>`
382
+ }
383
+
384
+ function toInlineScriptTag(jsCode) {
385
+ return `<script>${jsCode}</script>`
386
+ }
387
+
388
+ function toExternalStylesheetTag(url) {
389
+ return `<link href='${url}' rel='stylesheet'>`
390
+ }
391
+
392
+ function toTags(customCode, toScript) {
393
+ if (typeof customCode === 'string') {
394
+ return toScript(customCode)
395
+ } else if (Array.isArray(customCode)) {
396
+ return customCode.map(toScript).join('\n')
397
+ } else {
398
+ return ''
399
+ }
400
+ }
401
+
402
+ var generateHTML = function (swaggerDoc, opts, options, customCss, customfavIcon, swaggerUrl, customSiteTitle, _htmlTplString, _jsTplString) {
403
+
404
+ var isExplorer
405
+ var customJs
406
+ var customJsStr
407
+ var swaggerUrls
408
+ var customCssUrl
409
+ var customRobots
410
+
411
+ if (opts && typeof opts === 'object') {
412
+ options = opts.swaggerOptions
413
+ customCss = opts.customCss
414
+ customJs = opts.customJs
415
+ customJsStr = opts.customJsStr
416
+ customfavIcon = opts.customfavIcon
417
+ customRobots = opts.customRobots
418
+ swaggerUrl = opts.swaggerUrl
419
+ swaggerUrls = opts.swaggerUrls
420
+ isExplorer = opts.explorer || !!swaggerUrls
421
+ customSiteTitle = opts.customSiteTitle
422
+ customCssUrl = opts.customCssUrl
423
+ } else {
424
+ //support legacy params based function
425
+ isExplorer = opts
426
+ }
427
+
428
+ options = options || {}
429
+ var explorerString = isExplorer ? '' : '.swagger-ui .topbar .download-url-wrapper { display: none }'
430
+ customCss = explorerString + ' ' + customCss || explorerString
431
+ customfavIcon = customfavIcon || false
432
+ customSiteTitle = customSiteTitle || 'Swagger UI'
433
+ _htmlTplString = _htmlTplString || htmlTplString
434
+ _jsTplString = _jsTplString || jsTplString
435
+
436
+ var robotsMetaString = customRobots ? '<meta name="robots" content="' + customRobots + '" />' : ''
437
+ var favIconString = customfavIcon ? '<link rel="icon" href="' + customfavIcon + '" />' : favIconHtml
438
+ var htmlWithCustomCss = _htmlTplString.toString().replace('<% customCss %>', customCss)
439
+ var htmlWithCustomRobots = htmlWithCustomCss.replace('<% robotsMetaString %>', robotsMetaString)
440
+ var htmlWithFavIcon = htmlWithCustomRobots.replace('<% favIconString %>', favIconString)
441
+ var htmlWithCustomJsUrl = htmlWithFavIcon.replace('<% customJs %>', toTags(customJs, toExternalScriptTag))
442
+ var htmlWithCustomJs = htmlWithCustomJsUrl.replace('<% customJsStr %>', toTags(customJsStr, toInlineScriptTag))
443
+ var htmlWithCustomCssUrl = htmlWithCustomJs.replace('<% customCssUrl %>', toTags(customCssUrl, toExternalStylesheetTag))
444
+
445
+ var initOptions = {
446
+ swaggerDoc: swaggerDoc || undefined,
447
+ customOptions: options,
448
+ swaggerUrl: swaggerUrl || undefined,
449
+ swaggerUrls: swaggerUrls || undefined
450
+ }
451
+
452
+ swaggerInit = _jsTplString.toString().replace('<% swaggerOptions %>', stringify(initOptions))
453
+ return htmlWithCustomCssUrl.replace('<% title %>', customSiteTitle)
454
+ }
455
+
456
+ var setup = function (swaggerDoc, opts, options, customCss, customfavIcon, swaggerUrl, customSiteTitle) {
457
+ var html = generateHTML(swaggerDoc, opts, options, customCss, customfavIcon, swaggerUrl, customSiteTitle, htmlTplString, jsTplString)
458
+ return function (req, res) {
459
+ if (req.swaggerDoc) {
460
+ var reqHtml = generateHTML(req.swaggerDoc, opts, options, customCss, customfavIcon, swaggerUrl, customSiteTitle, htmlTplString, jsTplString)
461
+ res.send(reqHtml)
462
+ } else {
463
+ res.send(html)
464
+ }
465
+ }
466
+ }
467
+
468
+ function swaggerInitFn(req, res, next) {
469
+ if (trimQuery(req.url).endsWith('/package.json')) {
470
+ res.sendStatus(404)
471
+ } else if (trimQuery(req.url).endsWith('/swagger-ui-init.js')) {
472
+ res.set('Content-Type', 'application/javascript')
473
+ res.send(swaggerInit)
474
+ } else {
475
+ next()
476
+ }
477
+ }
478
+
479
+ var swaggerInitFunction = function (swaggerDoc, opts) {
480
+ var swaggerInitFile = jsTplString.toString().replace('<% swaggerOptions %>', stringify(opts))
481
+ return function (req, res, next) {
482
+ if (trimQuery(req.url).endsWith('/package.json')) {
483
+ res.sendStatus(404)
484
+ } else if (trimQuery(req.url).endsWith('/swagger-ui-init.js')) {
485
+ if (req.swaggerDoc) {
486
+ opts.swaggerDoc = req.swaggerDoc
487
+ swaggerInitFile = jsTplString.toString().replace('<% swaggerOptions %>', stringify(opts))
488
+ }
489
+ res.set('Content-Type', 'application/javascript')
490
+ res.send(swaggerInitFile)
491
+ } else {
492
+ next()
493
+ }
494
+ }
495
+ }
496
+
497
+
498
+ var swaggerAssetMiddleware = options => {
499
+ var opts = options || {}
500
+ opts.index = false
501
+ return express.static(getAbsoluteSwaggerFsPath, opts)
502
+ }
503
+
504
+ var serveFiles = function (swaggerDoc, opts) {
505
+ opts = opts || {}
506
+
507
+ var initOptions = {
508
+ swaggerDoc: swaggerDoc || undefined,
509
+ customOptions: opts.swaggerOptions || {},
510
+ swaggerUrl: opts.swaggerUrl || {},
511
+ swaggerUrls: opts.swaggerUrls || undefined
512
+ }
513
+ var swaggerInitWithOpts = swaggerInitFunction(swaggerDoc, initOptions)
514
+ return [swaggerInitWithOpts, swaggerAssetMiddleware()]
515
+ }
516
+
517
+ var serve = [swaggerInitFn, swaggerAssetMiddleware()]
518
+ var serveWithOptions = options => [swaggerInitFn, swaggerAssetMiddleware(options)]
519
+
520
+ var stringify = function (obj, prop) {
521
+ var placeholder = '____FUNCTIONPLACEHOLDER____'
522
+ var fns = []
523
+ var json = JSON.stringify(obj, function (key, value) {
524
+ if (typeof value === 'function') {
525
+ fns.push(value)
526
+ return placeholder
527
+ }
528
+ return value
529
+ }, 2)
530
+ json = json.replace(new RegExp('"' + placeholder + '"', 'g'), function (_) {
531
+ return fns.shift()
532
+ })
533
+ return 'var options = ' + json + ';'
534
+ }
535
+
536
+ module.exports = {
537
+ setup,
538
+ serve,
539
+ serveWithOptions,
540
+ generateHTML,
541
+ serveFiles
542
+ };