loadSwaggerUI.js 3.84 KB
// Copyright IBM Corp. 2014,2016. All Rights Reserved.
// Node module: loopback-component-explorer
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT

'use strict';

// Refactoring of inline script from index.html.
/*global SwaggerUi, log, ApiKeyAuthorization, hljs, window, $ */
$(function() {
  // Pre load translate...
  if (window.SwaggerTranslator) {
    window.SwaggerTranslator.translate();
  }

  var lsKey = 'swagger_accessToken';
  $.getJSON('config.json', function(config) {
    log(config);
    loadSwaggerUi(config);
  });

  var accessToken;
  function loadSwaggerUi(config) {
    var methodOrder = ['get', 'head', 'options', 'put', 'post', 'delete'];
    /* eslint-disable camelcase */
    window.swaggerUi = new SwaggerUi({
      validatorUrl: null,
      url: config.url || '/swagger/resources',
      apiKey: '',
      dom_id: 'swagger-ui-container',
      supportHeaderParams: true,
      onComplete: function(swaggerApi, swaggerUi) {
        log('Loaded SwaggerUI');
        log(swaggerApi);
        log(swaggerUi);

        if (window.SwaggerTranslator) {
          window.SwaggerTranslator.translate();
        }

        $('pre code').each(function(i, e) {
          hljs.highlightBlock(e);
        });

        // Recover accessToken from localStorage if present.
        if (window.localStorage) {
          var key = window.localStorage.getItem(lsKey);
          if (key) {
            $('#input_accessToken').val(key).submit();
          }
        }
      },
      onFailure: function(data) {
        log('Unable to Load SwaggerUI');
        log(data);
      },
      docExpansion: 'none',
      highlightSizeThreshold: 16384,
      apisSorter: 'alpha',
      operationsSorter: function(a, b) {
        var pathCompare = a.path.localeCompare(b.path);
        return pathCompare !== 0 ?
          pathCompare :
          methodOrder.indexOf(a.method) - methodOrder.indexOf(b.method);
      },
    });
    /* eslint-disable camelcase */

    $('#explore').click(setAccessToken);
    $('#api_selector').submit(setAccessToken);
    $('#input_accessToken').keyup(onInputChange);

    window.swaggerUi.load();
  }

  function setAccessToken(e) {
    e.stopPropagation(); // Don't let the default #explore handler fire
    e.preventDefault();
    var key = $('#input_accessToken')[0].value;
    log('key: ' + key);
    if (key && key.trim() !== '') {
      log('added accessToken ' + key);
      var apiKeyAuth =
        new SwaggerClient.ApiKeyAuthorization('access_token', key, 'query');
      window.swaggerUi.api.clientAuthorizations.add('key', apiKeyAuth);
      accessToken = key;
      $('.accessTokenDisplay').text('Token Set.').addClass('set');
      $('.accessTokenDisplay').attr('data-tooltip', 'Current Token: ' + key);

      // Save this token to localStorage if we can to make it persist on refresh.
      if (window.localStorage) {
        window.localStorage.setItem(lsKey, key);
      }
    } else {
      // If submitted with an empty token, remove the current token. Can be
      // useful to intentionally remove authorization.
      log('removed accessToken.');
      $('.accessTokenDisplay').text('Token Not Set.').removeClass('set');
      $('.accessTokenDisplay').removeAttr('data-tooltip');
      if (window.swaggerUi) {
        window.swaggerUi.api.clientAuthorizations.remove('key');
      }
      if (window.localStorage) {
        window.localStorage.removeItem(lsKey);
      }
    }
  }

  function onInputChange(e) {
    var el = e.currentTarget;
    var key = $(e.currentTarget)[0].value;
    if (!key || key.trim === '') return;
    if (accessToken !== key) {
      $('.accessTokenDisplay').text('Token changed; submit to confirm.');
    } else {
      $('.accessTokenDisplay').text('Token Set.');
    }
  }

  function log() {
    if ('console' in window) {
      console.log.apply(console, arguments);
    }
  }
});