You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.2 KiB
108 lines
3.2 KiB
3 years ago
|
const fs = require('fs')
|
||
|
const fse = require('fs-extra')
|
||
|
const crypto = require('crypto')
|
||
|
const swaggerUiAssetPath = require('swagger-ui-dist').getAbsoluteFSPath()
|
||
|
const resolve = require('path').resolve
|
||
|
|
||
|
fse.emptyDirSync(resolve('./static'))
|
||
|
|
||
|
// since the original swagger-ui-dist folder contains non UI files
|
||
|
const filesToCopy = ['favicon-16x16.png',
|
||
|
'favicon-32x32.png',
|
||
|
'index.html',
|
||
|
'oauth2-redirect.html',
|
||
|
'swagger-ui-bundle.js',
|
||
|
'swagger-ui-bundle.js.map',
|
||
|
'swagger-ui-standalone-preset.js',
|
||
|
'swagger-ui-standalone-preset.js.map',
|
||
|
'swagger-ui.css',
|
||
|
'swagger-ui.css.map',
|
||
|
'swagger-ui.js',
|
||
|
'swagger-ui.js.map']
|
||
|
filesToCopy.forEach(filename => {
|
||
|
fse.copySync(`${swaggerUiAssetPath}/${filename}`, resolve(`./static/${filename}`))
|
||
|
})
|
||
|
|
||
|
const newIndex = fs.readFileSync(resolve('./static/index.html'), 'utf8')
|
||
|
.replace(/<script>(.*)<\/script>/gs, `
|
||
|
<script>
|
||
|
window.onload = function () {
|
||
|
function resolveUrl (url) {
|
||
|
const anchor = document.createElement('a')
|
||
|
anchor.href = url
|
||
|
return anchor.href
|
||
|
}
|
||
|
|
||
|
function resolveConfig (cb) {
|
||
|
return fetch(
|
||
|
resolveUrl('./uiConfig').replace('static/uiConfig', 'uiConfig')
|
||
|
)
|
||
|
.then(res => res.json())
|
||
|
.then((config) => {
|
||
|
const resConfig = Object.assign({}, {
|
||
|
dom_id: '#swagger-ui',
|
||
|
deepLinking: true,
|
||
|
presets: [
|
||
|
SwaggerUIBundle.presets.apis,
|
||
|
SwaggerUIStandalonePreset
|
||
|
],
|
||
|
plugins: [
|
||
|
SwaggerUIBundle.plugins.DownloadUrl
|
||
|
],
|
||
|
layout: "StandaloneLayout"
|
||
|
}, config, {
|
||
|
url: resolveUrl('./json').replace('static/json', 'json'),
|
||
|
oauth2RedirectUrl: resolveUrl('./oauth2-redirect.html')
|
||
|
});
|
||
|
return cb(resConfig);
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// Begin Swagger UI call region
|
||
|
const buildUi = function (config) {
|
||
|
const ui = SwaggerUIBundle(config)
|
||
|
window.ui = ui
|
||
|
|
||
|
fetch(resolveUrl('./initOAuth').replace('static/initOAuth', 'initOAuth'))
|
||
|
.then(res => res.json())
|
||
|
.then((config) => {
|
||
|
ui.initOAuth(config);
|
||
|
});
|
||
|
|
||
|
}
|
||
|
// End Swagger UI call region
|
||
|
|
||
|
resolveConfig(buildUi);
|
||
|
}
|
||
|
</script>
|
||
|
`)
|
||
|
|
||
|
fse.writeFileSync(resolve('./static/index.html'), newIndex)
|
||
|
|
||
|
const sha = {
|
||
|
script: [],
|
||
|
style: []
|
||
|
}
|
||
|
function computeCSPHashes (path) {
|
||
|
const scriptRegex = /<script>(.*)<\/script>/gs
|
||
|
const styleRegex = /<style>(.*)<\/style>/gs
|
||
|
const indexSrc = fs.readFileSync(resolve(path)).toString('utf8')
|
||
|
let result = scriptRegex.exec(indexSrc)
|
||
|
while (result !== null) {
|
||
|
const hash = crypto.createHash('sha256')
|
||
|
hash.update(result[1])
|
||
|
sha.script.push(`'sha256-${hash.digest().toString('base64')}'`)
|
||
|
result = scriptRegex.exec(indexSrc)
|
||
|
}
|
||
|
result = styleRegex.exec(indexSrc)
|
||
|
while (result !== null) {
|
||
|
const hash = crypto.createHash('sha256')
|
||
|
hash.update(result[1])
|
||
|
sha.style.push(`'sha256-${hash.digest().toString('base64')}'`)
|
||
|
result = styleRegex.exec(indexSrc)
|
||
|
}
|
||
|
}
|
||
|
computeCSPHashes('./static/index.html')
|
||
|
computeCSPHashes('./static/oauth2-redirect.html')
|
||
|
fse.writeFileSync(resolve('./static/csp.json'), JSON.stringify(sha))
|