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
						
					
					
				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))
 |