From 0f2972c8505e6d99a7f89bc0930c89d9d4096a32 Mon Sep 17 00:00:00 2001 From: Mathieu Ales Date: Mon, 22 Feb 2016 14:20:25 +0100 Subject: [PATCH] new release --- dist/css/swagger-ui.css | 2 +- dist/css/swagger-ui.min.css | 2 +- dist/less/swagger-ui.less | 2 +- .../swagger-external-references.min.js | 4 +- .../modules/swagger-xml-formatter.min.js | 4 +- .../swagger1-to-swagger2-converter.min.js | 4 +- dist/scripts/swagger-ui.js | 454 +++++++++--------- dist/scripts/swagger-ui.min.js | 4 +- 8 files changed, 244 insertions(+), 232 deletions(-) diff --git a/dist/css/swagger-ui.css b/dist/css/swagger-ui.css index fadcad9..cd242d7 100644 --- a/dist/css/swagger-ui.css +++ b/dist/css/swagger-ui.css @@ -1,5 +1,5 @@ /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed diff --git a/dist/css/swagger-ui.min.css b/dist/css/swagger-ui.min.css index 78ab754..b75b0d7 100644 --- a/dist/css/swagger-ui.min.css +++ b/dist/css/swagger-ui.min.css @@ -1,5 +1,5 @@ /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed diff --git a/dist/less/swagger-ui.less b/dist/less/swagger-ui.less index 9fdf1d0..a499b88 100644 --- a/dist/less/swagger-ui.less +++ b/dist/less/swagger-ui.less @@ -1,5 +1,5 @@ /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed diff --git a/dist/scripts/modules/swagger-external-references.min.js b/dist/scripts/modules/swagger-external-references.min.js index 657e7d5..e87bee1 100644 --- a/dist/scripts/modules/swagger-external-references.min.js +++ b/dist/scripts/modules/swagger-external-references.min.js @@ -1,7 +1,7 @@ /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed */ -"use strict";angular.module("swaggerUi").service("swaggerUiExternalReferences",["$http","$q","swaggerModules",function(a,b,c){function d(a){k.reject(a)}function e(b,e,f){var g={method:"GET",url:b,transformResponse:function(a){f&&(a=a.replace(/"\$ref": ?"#\/(.*)\/(.*)"/g,'"$ref": "#/$1/'+f+'/$2"'));var b;try{b=angular.fromJson(a)}catch(c){d({code:500,message:"failed to parse JSON"})}return b}};c.execute(c.BEFORE_LOAD,g).then(function(){a(g).success(e).error(function(a,b){d({message:a,code:b})})})["catch"](d)}function f(a){var b=a.split("#/"),c=b[0];if(0!==c.indexOf("http")&&0!==c.indexOf("https"))if(0===c.indexOf("/")){var d=URL.parse(j);c=d.protocol+"//"+d.host+c}else{var e=j.lastIndexOf("/");c=j.substring(0,e)+"/"+c}return c}function g(){function a(a){b++,e(f(a.$ref),function(c){b--,delete a.$ref;for(var d in c)a[d]=c[d];0===b&&i()})}var b=0;for(var c in l.paths){var d=l.paths[c];h(d)&&a(d)}0===b&&i()}function h(a){return a&&a.$ref&&0!==a.$ref.indexOf("#/")}function i(){function a(a){var b=a.$ref.match(/(.*)#\/(.*)\/(.*)/),c=b[1],h=b[2],i=f(a.$ref);a.$ref=a.$ref.replace(/(.*)#\/(.*)\/(.*)/,"#/$2/$1/$3"),g[i]||(d++,g[i]=!0,e(i,function(a){for(var b in a)l[h][c]=a[b];d--,0===d&&k.resolve(!0)},c))}function b(b){h(b)?a(b):h(b.items)&&a(b.items)}function c(a){for(var c=0,d=a.parameters||[],e=d.length;e>c;c++)d[c].schema&&b(d[c].schema);for(var f in a.responses||{})a.responses[f].schema&&b(a.responses[f].schema)}var d=0,g={};for(var i in l.paths){var j=l.paths[i];for(var m in j)c(j[m])}0===d&&k.resolve(!0)}var j,k,l;this.execute=function(a,c){return j=a,l=c,k=b.defer(),g(),k.promise}}]); \ No newline at end of file +"use strict";angular.module("swaggerUi").service("swaggerUiExternalReferences",["$http","$q","swaggerModules",function(a,b,c){function d(a){k.reject(a)}function e(b,e,f){var g={method:"GET",url:b,transformResponse:function(a){f&&(a=a.replace(/"\$ref": ?"#\/(.*)\/(.*)"/g,'"$ref": "#/$1/'+f+'/$2"'));var b;try{b=angular.fromJson(a)}catch(c){d({code:500,message:"failed to parse JSON"})}return b}};c.execute(c.BEFORE_LOAD,g).then(function(){a(g).success(e).error(function(a,b){d({message:a,code:b})})})["catch"](d)}function f(a){var b=a.split("#/"),c=b[0];if(0!==c.indexOf("http")&&0!==c.indexOf("https"))if(0===c.indexOf("/")){var d=URL.parse(j);c=d.protocol+"//"+d.host+c}else{var e=j.lastIndexOf("/");c=j.substring(0,e)+"/"+c}return c}function g(){function a(a){b++,e(f(a.$ref),function(c){b--,delete a.$ref;for(var d in c)a[d]=c[d];0===b&&i()})}var b=0;for(var c in l.paths){var d=l.paths[c];h(d)&&a(d)}0===b&&i()}function h(a){return a&&a.$ref&&0!==a.$ref.indexOf("#/")}function i(){function a(a){var b=a.$ref.match(/(.*)#\/(.*)\/(.*)/),c=b[1],h=b[2],i=f(a.$ref);a.$ref=a.$ref.replace(/(.*)#\/(.*)\/(.*)/,"#/$2/$1/$3"),g[i]||(d++,g[i]=!0,e(i,function(a){for(var b in a)l[h][c]=a[b];d--,0===d&&k.resolve(!0)},c))}function b(b){h(b)?a(b):h(b.items)&&a(b.items)}function c(a){for(var c=0,d=a.parameters||[],e=d.length;e>c;c++)d[c].schema&&b(d[c].schema);for(var f in a.responses||{})a.responses[f].schema&&b(a.responses[f].schema)}var d=0,g={};for(var i in l.paths){var j=l.paths[i];for(var m in j)c(j[m])}0===d&&k.resolve(!0)}var j,k,l;this.execute=function(a,c){return j=a,l=c,k=b.defer(),g(),k.promise}}]).run(["swaggerModules","swaggerUiExternalReferences",function(a,b){a.add(a.BEFORE_PARSE,b)}]); \ No newline at end of file diff --git a/dist/scripts/modules/swagger-xml-formatter.min.js b/dist/scripts/modules/swagger-xml-formatter.min.js index f8b022f..4b7ffc5 100644 --- a/dist/scripts/modules/swagger-xml-formatter.min.js +++ b/dist/scripts/modules/swagger-xml-formatter.min.js @@ -1,7 +1,7 @@ /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed */ -"use strict";angular.module("swaggerUi").service("swaggerUiXmlFormatter",["$q",function(a){function b(a){var b="",c=/(>)(<)(\/*)/g,d=0;return a=a.replace(c,"$1\r\n$2$3"),angular.forEach(a.split("\r\n"),function(a){var c=0,e="";a.match(/.+<\/\w[^>]*>$/)?c=0:a.match(/^<\/\w/)?0!==d&&(d-=1):c=a.match(/^<\w[^>]*[^\/]>.*$/)?1:0;for(var f=0;d>f;f++)e+=" ";b+=e+a+"\r\n",d+=c}),b}this.execute=function(c){var d=!1,e=a.defer();return c.headers&&"application/xml"===c.headers()["content-type"]&&(c.data=b(c.data),d=!0),e.resolve(d),e.promise}}]); \ No newline at end of file +"use strict";angular.module("swaggerUi").service("swaggerUiXmlFormatter",["$q",function(a){function b(a){var b="",c=/(>)(<)(\/*)/g,d=0;return a=a.replace(c,"$1\r\n$2$3"),angular.forEach(a.split("\r\n"),function(a){var c=0,e="";a.match(/.+<\/\w[^>]*>$/)?c=0:a.match(/^<\/\w/)?0!==d&&(d-=1):c=a.match(/^<\w[^>]*[^\/]>.*$/)?1:0;for(var f=0;d>f;f++)e+=" ";b+=e+a+"\r\n",d+=c}),b}this.execute=function(c){var d=!1,e=a.defer(),f=c.headers&&c.headers()["content-type"];return f&&f.toLowerCase().indexOf("/xml")>0&&(c.data=b(c.data),d=!0),e.resolve(d),e.promise}}]).run(["swaggerModules","swaggerUiXmlFormatter",function(a,b){a.add(a.AFTER_EXPLORER_LOAD,b)}]); \ No newline at end of file diff --git a/dist/scripts/modules/swagger1-to-swagger2-converter.min.js b/dist/scripts/modules/swagger1-to-swagger2-converter.min.js index d7d1a15..3fb8ec6 100644 --- a/dist/scripts/modules/swagger1-to-swagger2-converter.min.js +++ b/dist/scripts/modules/swagger1-to-swagger2-converter.min.js @@ -1,7 +1,7 @@ /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed */ -"use strict";angular.module("swaggerUi").service("swagger1ToSwagger2Converter",["$q","$http","swaggerModules",function(a,b,c){function d(d){var e=a.defer(),f={method:"GET",url:d};return c.execute(c.BEFORE_LOAD,f).then(function(){b(f).success(e.resolve).error(e.reject)})["catch"](e.reject),e.promise}function e(b,c,e){var h=e,i=h.info,k=[];i.contact={email:i.contact},i.license={name:i.license,url:i.licenseUrl},i.termsOfService=i.termsOfServiceUrl,h.paths={},h.definitions={},h.tags=[],angular.forEach(h.apis,function(a){k.push(d(c+a.path))}),a.all(k).then(function(a){angular.forEach(a,function(a){f(a,h),g(a,h),j(a,h)}),h.swagger="2.0",b.resolve(!0)})["catch"](b.reject)}function f(a,b){if(b.info.version=b.info.version||a.apiVersion,b.basePath=b.basePath||a.basePath,0===b.basePath.indexOf("http")){var c=angular.element('')[0];b.schemes=[c.protocol.replace(":","")],b.host=c.host,b.basePath=c.pathname}b.tags.push({name:a.resourcePath})}function g(a,b){var c,d;angular.forEach(a.apis,function(e){c=b.paths[e.path]=b.paths[e.path]||{},angular.forEach(e.operations,function(b){d={},c[b.method.toLowerCase()]={deprecated:b.deprecated,description:b.notes,summary:b.summary,operationId:b.nickname,produces:b.produces||a.produces,consumes:b.consumes||a.consumes,parameters:b.parameters,responses:d,tags:[a.resourcePath]},h(a,b),i(a,b,d)})})}function h(a,b){angular.forEach(b.parameters,function(b){b["in"]=b.paramType,a.models&&a.models[b.type]&&(b.schema={$ref:"#/definitions/"+b.type},delete b.type)})}function i(a,b,c){var d;angular.forEach(b.responseMessages,function(e){d=c[e.code]={description:e.message},e.responseModel?a.models&&a.models[e.responseModel]?d.schema={$ref:"#/definitions/"+e.responseModel}:d.type=e.responseModel:200===e.code&&"void"!==b.type&&(d.schema={type:b.type},"array"===b.type&&(d.schema.items={$ref:a.models&&a.models[b.items.type]?"#/definitions/"+b.items.type:b.items.type}))})}function j(a,b){var c;angular.forEach(a.models,function(d,e){b.definitions[e]=d,d.subTypes&&(angular.forEach(d.subTypes,function(b){c=a.models&&a.models[b],c&&(d.required=(d.required||[]).concat(c.required||[]),angular.forEach(c.properties,function(a,b){d.properties[b]=a}))}),delete d.subTypes),angular.forEach(d.properties,function(b){a.models&&a.models[b.type]&&(b.$ref="#/definitions/"+b.type,delete b.type),b.items&&a.models&&a.models[b.items.type]&&(b.items.$ref="#/definitions/"+b.items.type,delete b.items.type)})})}this.execute=function(b,c){var d=a.defer(),f=c.swaggerVersion;return f&&0===f.indexOf("1.")?e(d,b,c):d.resolve(!1),d.promise}}]); \ No newline at end of file +"use strict";angular.module("swaggerUi").service("swagger1ToSwagger2Converter",["$q","$http","swaggerModules",function(a,b,c){function d(d){var e=a.defer(),f={method:"GET",url:d};return c.execute(c.BEFORE_LOAD,f).then(function(){b(f).success(e.resolve).error(e.reject)})["catch"](e.reject),e.promise}function e(b,c,e){var h=e,i=h.info,k=[];i.contact={email:i.contact},i.license={name:i.license,url:i.licenseUrl},i.termsOfService=i.termsOfServiceUrl,h.paths={},h.definitions={},h.tags=[],angular.forEach(h.apis,function(a){k.push(d(c+a.path))}),a.all(k).then(function(a){angular.forEach(a,function(a){f(a,h),g(a,h),j(a,h)}),h.swagger="2.0",b.resolve(!0)})["catch"](b.reject)}function f(a,b){if(b.info.version=b.info.version||a.apiVersion,b.basePath=b.basePath||a.basePath,0===b.basePath.indexOf("http")){var c=angular.element('')[0];b.schemes=[c.protocol.replace(":","")],b.host=c.host,b.basePath=c.pathname}b.tags.push({name:a.resourcePath})}function g(a,b){var c,d;angular.forEach(a.apis,function(e){c=b.paths[e.path]=b.paths[e.path]||{},angular.forEach(e.operations,function(b){d={},c[b.method.toLowerCase()]={deprecated:b.deprecated,description:b.notes,summary:b.summary,operationId:b.nickname,produces:b.produces||a.produces,consumes:b.consumes||a.consumes,parameters:b.parameters,responses:d,tags:[a.resourcePath]},h(a,b),i(a,b,d)})})}function h(a,b){angular.forEach(b.parameters,function(b){b["in"]=b.paramType;var c=b.type||b.$ref;a.models&&c&&a.models[c]&&(b.schema={$ref:"#/definitions/"+c},delete b.type)})}function i(a,b,c){var d;angular.forEach(b.responseMessages,function(e){if(d=c[e.code]={description:e.message},e.responseModel)a.models&&a.models[e.responseModel]?d.schema={$ref:"#/definitions/"+e.responseModel}:d.type=e.responseModel;else if(200===e.code&&"void"!==b.type&&(d.schema={type:b.type},"array"===b.type)){var f=b.items.type||b.items.$ref,g=d.schema.items={};a.models&&a.models[f]?g.$ref="#/definitions/"+f:g.type=f}})}function j(a,b){var c;angular.forEach(a.models,function(d,e){b.definitions[e]=d,d.subTypes&&(angular.forEach(d.subTypes,function(b){c=a.models&&a.models[b],c&&(d.required=(d.required||[]).concat(c.required||[]),angular.forEach(c.properties,function(a,b){d.properties[b]=a}))}),delete d.subTypes),angular.forEach(d.properties,function(b){var c=b.type||b.$ref;a.models&&c&&a.models[c]&&(b.$ref="#/definitions/"+c,delete b.type),b.items&&(c=b.items.type||b.items.$ref,a.models&&c&&a.models[c]&&(b.items.$ref="#/definitions/"+c),delete b.items.type)})})}this.execute=function(b,c){var d=a.defer(),f=c.swaggerVersion;return f&&0===f.indexOf("1.")?e(d,b,c):d.resolve(!1),d.promise}}]).run(["swaggerModules","swagger1ToSwagger2Converter",function(a,b){a.add(a.BEFORE_PARSE,b)}]); \ No newline at end of file diff --git a/dist/scripts/swagger-ui.js b/dist/scripts/swagger-ui.js index cb40286..06fec48 100644 --- a/dist/scripts/swagger-ui.js +++ b/dist/scripts/swagger-ui.js @@ -1,5 +1,5 @@ /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed @@ -7,8 +7,8 @@ 'use strict'; angular - .module('swaggerUi', ['ng', 'swaggerUiTemplates']) - .directive('swaggerUi', ['$injector', function($injector) { + .module('swaggerUi', ['ng']) + .directive('swaggerUi', ["$injector", function($injector) { return { restrict: 'A', @@ -22,13 +22,11 @@ angular // "auto": (default) parser is based on response Content-Type // "json": force using JSON parser // - // More types could be defined by external modules + // More types could be defined by external modules parser: '@?', // Swagger descriptor loading indicator (variables, optional) loading: '=?', // Use permalinks? (boolean, optional, default = false) - // If true and if using $routeProvider, should set 'reloadOnSearch: false' in route - // configuration to avoid UI being rendered multiple times permalinks: '=?', // Display API explorer (boolean, optional, default = false) apiExplorer: '=?', @@ -41,164 +39,166 @@ angular // If false, Swagger validation will be disabled // If URL, will be used as Swagger validator // If not defined, validator will be 'http://online.swagger.io/validator' - validatorUrl: '@?' + validatorUrl: '@?', + // Allows defining a custom Swagger UI template (string, optional) + templateUrl: '@?' }, link: function(scope) { // check parameters - if (scope.permalinks && $injector.has('$route')) { - var $route = $injector.get('$route'); - if ($route.current && $route.current.$$route && $route.current.$$route.reloadOnSearch) { - console.warn('AngularSwaggerUI: when using permalinks you should set reloadOnSearch=false in your route config to avoid UI being rebuilt multiple times'); - } - } if (!scope.trustedSources && !$injector.has('$sanitize')) { console.warn('AngularSwaggerUI: you must use ngSanitize OR set trusted-sources=true as directive param if swagger descriptors are loaded from trusted sources'); } if (scope.validatorUrl === undefined) { scope.validatorUrl = 'http://online.swagger.io/validator'; } + if (scope.templateUrl === undefined) { + scope.templateUrl = 'templates/main.html'; + } } }; }]) - .controller('swaggerUiController', ['$scope', '$http', '$location', '$q', 'swaggerClient', 'swaggerModules', 'swagger2JsonParser', - function($scope, $http, $location, $q, swaggerClient, swaggerModules, swagger2JsonParser) { - - var swagger; - - // WARNING authentication is not implemented, please use 'api-explorer-transform' directive's param to customize API calls + .controller('swaggerUiController', ["$scope", "$http", "$location", "$q", "$anchorScroll", "$timeout", "swaggerClient", "swaggerModules", function($scope, $http, $location, $q, $anchorScroll, $timeout, swaggerClient, swaggerModules) { - // add default Swagger parser (JSON) - swaggerModules.add(swaggerModules.PARSE, swagger2JsonParser); + var swagger; - /** - * Load Swagger descriptor - */ - function loadSwagger(url, callback) { - $scope.loading = true; - var options = { - method: 'GET', - url: url - }; - swaggerModules - .execute(swaggerModules.BEFORE_LOAD, options) - .then(function() { - $http(options) - .success(callback) - .error(function(data, status) { - onError({ - code: status, - message: data - }); - }); - }) - .catch(onError); - } + // WARNING authentication is not implemented, please use 'api-explorer-transform' directive's param to customize API calls - /** - * Swagger descriptor has been loaded, launch parsing - */ - function swaggerLoaded(swaggerUrl, swaggerType) { - $scope.loading = false; - var parseResult = {}; - // execute modules - $scope.parser = $scope.parser || 'auto'; - swaggerModules - .execute(swaggerModules.PARSE, $scope.parser, swaggerUrl, swaggerType, swagger, $scope.trustedSources, parseResult) - .then(function(executed) { - if (executed) { - swaggerParsed(parseResult); - } else { + /** + * Load Swagger descriptor + */ + function loadSwagger(url, callback) { + $scope.loading = true; + var options = { + method: 'GET', + url: url + }; + swaggerModules + .execute(swaggerModules.BEFORE_LOAD, options) + .then(function() { + $http(options) + .success(callback) + .error(function(data, status) { onError({ - code: 415, - message: 'no parser found for Swagger descriptor of type ' + swaggerType + ' and version ' + swagger.swagger + code: status, + message: data }); - } - }) - .catch(onError); - } + }); + }) + .catch(onError); + } - /** - * Swagger descriptor has parsed, launch display - */ - function swaggerParsed(parseResult) { - // execute modules - swaggerModules - .execute(swaggerModules.BEFORE_DISPLAY, parseResult) - .then(function() { - // display swagger UI - $scope.infos = parseResult.infos; - $scope.form = parseResult.form; - $scope.resources = parseResult.resources; - }) - .catch(onError); - } + /** + * Swagger descriptor has been loaded, launch parsing + */ + function swaggerLoaded(swaggerUrl, swaggerType) { + $scope.loading = false; + var parseResult = {}; + // execute modules + $scope.parser = $scope.parser || 'auto'; + swaggerModules + .execute(swaggerModules.PARSE, $scope.parser, swaggerUrl, swaggerType, swagger, $scope.trustedSources, parseResult) + .then(function(executed) { + if (executed) { + swaggerParsed(parseResult); + } else { + onError({ + code: 415, + message: 'no parser found for Swagger descriptor of type ' + swaggerType + ' and version ' + swagger.swagger + }); + } + }) + .catch(onError); + } - function onError(error) { - $scope.loading = false; - if (typeof $scope.errorHandler === 'function') { - $scope.errorHandler(error.message, error.code); - } else { - console.error(error.code, 'AngularSwaggerUI: ' + error.message); - } + /** + * Swagger descriptor has parsed, launch display + */ + function swaggerParsed(parseResult) { + // execute modules + swaggerModules + .execute(swaggerModules.BEFORE_DISPLAY, parseResult) + .then(function() { + // display swagger UI + $scope.infos = parseResult.infos; + $scope.form = parseResult.form; + $scope.resources = parseResult.resources; + if ($scope.permalinks) { + $timeout(function() { + $anchorScroll(); + }, 100); + } + }) + .catch(onError); + } + + function onError(error) { + $scope.loading = false; + if (typeof $scope.errorHandler === 'function') { + $scope.errorHandler(error.message, error.code); + } else { + console.error(error.code, 'AngularSwaggerUI: ' + error.message); } + } - $scope.$watch('url', function(url) { - //reset - $scope.infos = {}; - $scope.resources = []; - $scope.form = {}; - if (url && url !== '') { - if ($scope.loading) { - //TODO cancel current loading swagger - } - // load Swagger descriptor - loadSwagger(url, function(data, status, headers) { - swagger = data; - // execute modules - swaggerModules - .execute(swaggerModules.BEFORE_PARSE, url, swagger) - .then(function() { - var contentType = headers()['content-type'] || 'application/json', - swaggerType = contentType.split(';')[0]; - - swaggerLoaded(url, swaggerType); - }) - .catch(onError); - }); + $scope.$watch('url', function(url) { + //reset + $scope.infos = {}; + $scope.resources = []; + $scope.form = {}; + if (url && url !== '') { + if ($scope.loading) { + //TODO cancel current loading swagger } - }); + // load Swagger descriptor + loadSwagger(url, function(data, status, headers) { + swagger = data; + // execute modules + swaggerModules + .execute(swaggerModules.BEFORE_PARSE, url, swagger) + .then(function() { + var contentType = headers()['content-type'] || 'application/json', + swaggerType = contentType.split(';')[0]; - /** - * show all resource's operations as list or as expanded list - */ - $scope.expand = function(resource, expandOperations) { - resource.open = true; - for (var i = 0, op = resource.operations, l = op.length; i < l; i++) { - op[i].open = expandOperations; - } - }; + swaggerLoaded(url, swaggerType); + }) + .catch(onError); + }); + } + }); - $scope.permalink = function(name) { - if ($scope.permalinks) { - $location.search('swagger', name); - } - }; + /** + * show all resource's operations as list or as expanded list + */ + $scope.expand = function(resource, expandOperations) { + resource.open = true; + for (var i = 0, op = resource.operations, l = op.length; i < l; i++) { + op[i].open = expandOperations; + } + }; - /** - * sends a sample API request - */ - $scope.submitExplorer = function(operation) { - operation.loading = true; - swaggerClient - .send(swagger, operation, $scope.form[operation.id]) - .then(function(result) { - operation.loading = false; - operation.explorerResult = result; - }); - }; + $scope.permalink = function(name) { + if ($scope.permalinks) { + $location.hash(name); + $timeout(function() { + $anchorScroll(); + }, 50); + } + }; - } - ]) + /** + * sends a sample API request + */ + $scope.submitExplorer = function(operation) { + operation.loading = true; + swaggerClient + .send(swagger, operation, $scope.form[operation.id]) + .then(function(result) { + operation.loading = false; + operation.explorerResult = result; + }); + }; + + }]) .directive('fileInput', function() { // helper to be able to retrieve HTML5 File in ngModel from input return { @@ -215,7 +215,7 @@ angular }; }); /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed @@ -224,7 +224,7 @@ angular angular .module('swaggerUi') - .service('swaggerClient', ['$q', '$http', 'swaggerModules', function($q, $http, swaggerModules) { + .service('swaggerClient', ["$q", "$http", "swaggerModules", function($q, $http, swaggerModules) { /** * format API explorer response before display @@ -260,7 +260,8 @@ angular var deferred = $q.defer(), query = {}, headers = {}, - path = operation.path; + path = operation.path, + body; // build request parameters for (var i = 0, params = operation.parameters || [], l = params.length; i < l; i++) { @@ -283,23 +284,23 @@ angular } break; case 'formData': - values.body = values.body || new FormData(); + body = body || new FormData(); if (!!value) { if (param.type === 'file') { values.contentType = undefined; // make browser defining it by himself } - values.body.append(param.name, value); + body.append(param.name, value); } break; case 'body': - values.body = values.body || value; + body = body || value; break; } } // add headers headers.Accept = values.responseType; - headers['Content-Type'] = values.body ? values.contentType : 'text/plain'; + headers['Content-Type'] = body ? values.contentType : 'text/plain'; // build request var baseUrl = [ @@ -312,7 +313,7 @@ angular method: operation.httpMethod, url: baseUrl + path, headers: headers, - data: values.body, + data: body, params: query }, callback = function(data, status, headers, config) { @@ -344,8 +345,9 @@ angular }; }]); + /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed @@ -493,7 +495,17 @@ angular * generates object's model */ var generateModel = this.generateModel = function(swagger, schema, modelName, currentGenerated) { - var model = ''; + var model = '', + buffer, + submodels, + propertyName, + property, + hasProperties = false, + name, + className, + def, + sub; + currentGenerated = currentGenerated || {}; // used to handle circular references function isRequired(item, name) { @@ -503,15 +515,15 @@ angular if (schema.properties) { modelName = modelName || ('Inline Model' + countInLine++); currentGenerated[modelName] = true; - var buffer = ['
' + modelName + ' {'], - submodels = []; - - for (var propertyName in schema.properties) { - var property = schema.properties[propertyName]; + buffer = ['
' + modelName + ' {']; + submodels = []; + for (propertyName in schema.properties) { + hasProperties = true; + property = schema.properties[propertyName]; buffer.push('
', propertyName, ' ('); // build type if (property.properties) { - var name = 'Inline Model' + countInLine++; + name = 'Inline Model' + countInLine++; buffer.push(name); submodels.push(generateModel(swagger, property, name, currentGenerated)); } else if (property.$ref) { @@ -520,7 +532,7 @@ angular } else if (property.type === 'array') { buffer.push('Array['); if (property.items.properties) { - var name = 'Inline Model' + countInLine++; + name = 'Inline Model' + countInLine++; buffer.push(name); submodels.push(generateModel(swagger, property, name, currentGenerated)); } else if (property.items.$ref) { @@ -549,15 +561,16 @@ angular } buffer.push(',
'); } - buffer.pop(); - buffer.push('
'); - buffer.push('}'); + if (hasProperties) { + buffer.pop(); + buffer.push('
'); + } + buffer.push('
}
'); buffer.push(submodels.join(''), ''); model = buffer.join(''); } else if (schema.$ref) { - var className = getClassName(schema), - def = resolveReference(swagger, schema); - + className = getClassName(schema); + def = resolveReference(swagger, schema); if (currentGenerated[className]) { return ''; // already generated } @@ -570,10 +583,10 @@ angular model = modelCache[schema.$ref]; } } else if (schema.type === 'array') { - var buffer = ['Array [']; - var sub = ''; + buffer = ['Array [']; + sub = ''; if (schema.items.properties) { - var name = 'Inline Model' + countInLine++; + name = 'Inline Model' + countInLine++; buffer.push(name); sub = generateModel(swagger, schema.items, name, currentGenerated); } else if (schema.items.$ref) { @@ -600,7 +613,7 @@ angular }); /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed @@ -609,7 +622,7 @@ angular angular .module('swaggerUi') - .service('swaggerModules', ['$q', function($q) { + .service('swaggerModules', ["$q", function($q) { var modules = {}; @@ -664,8 +677,9 @@ angular }; }]); + /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed @@ -674,9 +688,32 @@ angular angular .module('swaggerUi') - .service('swagger2JsonParser', ['$q', '$sce', '$location', 'swaggerModel', function($q, $sce, $location, swaggerModel) { + .service('swaggerParser', ["$q", "$sce", "$location", "swaggerModel", function($q, $sce, $location, swaggerModel) { + + var trustedSources, + operationId, + paramId; - var trustedSources; + /** + * Module entry point + */ + this.execute = function(parserType, url, contentType, data, isTrustedSources, parseResult) { + var deferred = $q.defer(); + if (data.swagger === '2.0' && (parserType === 'json' || (parserType === 'auto' && contentType === 'application/json'))) { + trustedSources = isTrustedSources; + try { + parseSwagger2Json(data, url, deferred, parseResult); + } catch (e) { + deferred.reject({ + code: 500, + message: 'failed to parse swagger: ' + e.message + }); + } + } else { + deferred.resolve(false); + } + return deferred.promise; + }; /** * parse swagger description to ease HTML generation @@ -686,9 +723,11 @@ angular form = {}, resources = [], infos = swagger.info, - openPath = $location.search().swagger, + openPath = $location.hash(), defaultContentType = 'application/json'; + operationId = 0; + paramId = 0; parseInfos(swagger, url, infos, defaultContentType); parseTags(swagger, resources, map); parseOperations(swagger, resources, form, map, defaultContentType, openPath); @@ -747,9 +786,7 @@ angular httpMethod, operation, tag, - resource, - operationId = 0, - paramId = 0; + resource; for (path in swagger.paths) { pathObject = swagger.paths[path]; @@ -766,7 +803,7 @@ angular }; operation.httpMethod = httpMethod; operation.path = path; - parseParameters(swagger, operation, pathParameters, form, defaultContentType, operationId, paramId); + parseParameters(swagger, operation, pathParameters, form, defaultContentType); parseResponses(swagger, operation); operation.tags = operation.tags || ['default']; // map operation to resource @@ -823,7 +860,7 @@ angular /** * parse operation parameters */ - function parseParameters(swagger, operation, pathParameters, form, defaultContentType, operationId, paramId) { + function parseParameters(swagger, operation, pathParameters, form, defaultContentType) { var i, l, param, parameters = operation.parameters = computeParameters(swagger, pathParameters, operation); @@ -847,7 +884,7 @@ angular param.schema.json = swaggerModel.generateSampleJson(swagger, param.schema); param.schema.model = $sce.trustAsHtml(swaggerModel.generateModel(swagger, param.schema)); } - if (param.in === 'body') { + if (param.in === 'body' || param.in === 'formData') { operation.consumes = operation.consumes || swagger.consumes; form[operationId].contentType = operation.consumes.length === 1 ? operation.consumes[0] : defaultContentType; } @@ -860,7 +897,8 @@ angular */ function parseResponses(swagger, operation) { var code, - response; + response, + sampleJson; if (operation.responses) { for (code in operation.responses) { @@ -868,7 +906,12 @@ angular response = operation.responses[code]; response.description = trustHtml(response.description); if (response.schema) { - response.schema.json = response.examples && response.examples[operation.produces[0]] || swaggerModel.generateSampleJson(swagger, response.schema); + if (response.examples && response.examples[operation.produces[0]]) { + sampleJson = angular.toJson(response.examples[operation.produces[0]], true); + } else { + sampleJson = swaggerModel.generateSampleJson(swagger, response.schema); + } + response.schema.json = sampleJson; if (response.schema.type === 'object' || response.schema.type === 'array' || response.schema.$ref) { response.display = 1; // display schema response.schema.model = $sce.trustAsHtml(swaggerModel.generateModel(swagger, response.schema)); @@ -925,59 +968,28 @@ angular } function escapeChars(text) { - return text && text + return text .replace(/&/g, '&') .replace(/<([^\/a-zA-Z])/g, '<$1') .replace(/"/g, '"') .replace(/'/g, '''); } - /** - * Module entry point - */ - this.execute = function(parserType, url, contentType, data, isTrustedSources, parseResult) { - var deferred = $q.defer(); - if (data.swagger === '2.0' && (parserType === 'json' || (parserType === 'auto' && contentType === 'application/json'))) { - trustedSources = isTrustedSources; - try { - parseSwagger2Json(data, url, deferred, parseResult); - } catch (e) { - deferred.reject({ - code: 500, - message: 'failed to parse swagger: ' + e.message - }); - } - } else { - deferred.resolve(false); - } - return deferred.promise; - }; - + }]) + .run(["swaggerModules", "swaggerParser", function(swaggerModules, swaggerParser) { + swaggerModules.add(swaggerModules.PARSE, swaggerParser); }]); - -angular.module('swaggerUiTemplates', ['templates/endpoint.html', 'templates/operation.html', 'templates/parameter.html', 'templates/response.html', 'templates/swagger-ui.html']); - -angular.module('templates/endpoint.html', []).run(['$templateCache', function($templateCache) { +angular.module('swaggerUi').run(['$templateCache', function($templateCache) { $templateCache.put('templates/endpoint.html', - '
'); -}]); - -angular.module('templates/operation.html', []).run(['$templateCache', function($templateCache) { + '
'); + $templateCache.put('templates/main.html', + '

created by
see more at
contact the developer
license:
[BASE URL: , API VERSION: , HOST: ://]
'); $templateCache.put('templates/operation.html', - '
implementation notes

response class (status {{op.responseClass.status}})
parameters
parameter value description parameter type data type
response messages
HTTP status code reason response model
request URL
 
response body
 
response code
 
response headers
 
'); -}]); - -angular.module('templates/parameter.html', []).run(['$templateCache', function($templateCache) { + '
implementation notes

response class (status {{op.responseClass.status}})
parameters
parameter value description parameter type data type
response messages
HTTP status code reason response model
request URL
 
response body
 
response code
 
response headers
 
'); $templateCache.put('templates/parameter.html', - '

(default)
{{value}} or
(required)
 
 
click to set as parameter value
'); -}]); - -angular.module('templates/response.html', []).run(['$templateCache', function($templateCache) { + '

(default)
{{value}} or
(required)
 
 
click to set as parameter value
'); $templateCache.put('templates/response.html', - '
 
 ');
-}]);
-
-angular.module('templates/swagger-ui.html', []).run(['$templateCache', function($templateCache) {
+    '    
 
 ');
   $templateCache.put('templates/swagger-ui.html',
-    '

created by
see more at
contact the developer
license:
[BASE URL: , API VERSION: , HOST: ://]
'); + '
'); }]); diff --git a/dist/scripts/swagger-ui.min.js b/dist/scripts/swagger-ui.min.js index 78a6541..89473f2 100644 --- a/dist/scripts/swagger-ui.min.js +++ b/dist/scripts/swagger-ui.min.js @@ -1,7 +1,7 @@ /* - * Orange angular-swagger-ui - v0.2.7 + * Orange angular-swagger-ui - v0.3.0 * * (C) 2015 Orange, all right reserved * MIT Licensed */ -"use strict";angular.module("swaggerUi",["ng","swaggerUiTemplates"]).directive("swaggerUi",["$injector",function(a){return{restrict:"A",controller:"swaggerUiController",templateUrl:"templates/swagger-ui.html",scope:{url:"=",parser:"@?",loading:"=?",permalinks:"=?",apiExplorer:"=?",errorHandler:"=?",trustedSources:"=?",validatorUrl:"@?"},link:function(b){if(b.permalinks&&a.has("$route")){var c=a.get("$route");c.current&&c.current.$$route&&c.current.$$route.reloadOnSearch&&console.warn("AngularSwaggerUI: when using permalinks you should set reloadOnSearch=false in your route config to avoid UI being rebuilt multiple times")}b.trustedSources||a.has("$sanitize")||console.warn("AngularSwaggerUI: you must use ngSanitize OR set trusted-sources=true as directive param if swagger descriptors are loaded from trusted sources"),void 0===b.validatorUrl&&(b.validatorUrl="http://online.swagger.io/validator")}}}]).controller("swaggerUiController",["$scope","$http","$location","$q","swaggerClient","swaggerModules","swagger2JsonParser",function(a,b,c,d,e,f,g){function h(c,d){a.loading=!0;var e={method:"GET",url:c};f.execute(f.BEFORE_LOAD,e).then(function(){b(e).success(d).error(function(a,b){k({code:b,message:a})})})["catch"](k)}function i(b,c){a.loading=!1;var d={};a.parser=a.parser||"auto",f.execute(f.PARSE,a.parser,b,c,l,a.trustedSources,d).then(function(a){a?j(d):k({code:415,message:"no parser found for Swagger descriptor of type "+c+" and version "+l.swagger})})["catch"](k)}function j(b){f.execute(f.BEFORE_DISPLAY,b).then(function(){a.infos=b.infos,a.form=b.form,a.resources=b.resources})["catch"](k)}function k(b){a.loading=!1,"function"==typeof a.errorHandler?a.errorHandler(b.message,b.code):console.error(b.code,"AngularSwaggerUI: "+b.message)}var l;f.add(f.PARSE,g),a.$watch("url",function(b){a.infos={},a.resources=[],a.form={},b&&""!==b&&(a.loading,h(b,function(a,c,d){l=a,f.execute(f.BEFORE_PARSE,b,l).then(function(){var a=d()["content-type"]||"application/json",c=a.split(";")[0];i(b,c)})["catch"](k)}))}),a.expand=function(a,b){a.open=!0;for(var c=0,d=a.operations,e=d.length;e>c;c++)d[c].open=b},a.permalink=function(b){a.permalinks&&c.search("swagger",b)},a.submitExplorer=function(b){b.loading=!0,e.send(l,b,a.form[b.id]).then(function(a){b.loading=!1,b.explorerResult=a})}}]).directive("fileInput",function(){return{restrict:"A",require:"ngModel",link:function(a,b,c,d){b.bind("change",function(){a.$apply(function(){d.$setViewValue(b[0].files[0])})})}}}),angular.module("swaggerUi").service("swaggerClient",["$q","$http","swaggerModules",function(a,b,c){function d(a,b){var c="",d=b.data,e=b.config;if(e.params){var f=[];for(var g in e.params)f.push(g+"="+encodeURIComponent(e.params[g]));f.length>0&&(c="?"+f.join("&"))}a.resolve({url:e.url+c,response:{body:d?angular.isString(d)?d:angular.toJson(d,!0):"no content",status:b.status,headers:angular.toJson(b.headers(),!0)}})}this.send=function(e,f,g){for(var h=a.defer(),i={},j={},k=f.path,l=0,m=f.parameters||[],n=m.length;n>l;l++){var o=m[l],p=g[o.name];switch(o["in"]){case"query":p&&(i[o.name]=p);break;case"path":k=k.replace("{"+o.name+"}",encodeURIComponent(p));break;case"header":p&&(j[o.name]=p);break;case"formData":g.body=g.body||new FormData,p&&("file"===o.type&&(g.contentType=void 0),g.body.append(o.name,p));break;case"body":g.body=g.body||p}}j.Accept=g.responseType,j["Content-Type"]=g.body?g.contentType:"text/plain";var q=[e.schemes[0],"://",e.host,e.basePath||""].join(""),r={method:f.httpMethod,url:q+k,headers:j,data:g.body,params:i},s=function(a,b,e,f){var g={data:a,status:b,headers:e,config:f};c.execute(c.AFTER_EXPLORER_LOAD,g).then(function(){d(h,g)})};return c.execute(c.BEFORE_EXPLORER_LOAD,r).then(function(){b(r).success(s).error(s)}),h.promise}}]),angular.module("swaggerUi").service("swaggerModel",function(){function a(a){var b=a.$ref.split("/");return b[b.length-1]}function b(a,e,h){var i;if(h=h||{},e["default"]||e.example)i=e["default"]||e.example;else if(e.properties){i={};for(var j in e.properties)i[j]=b(a,e.properties[j],h)}else if(e.$ref){var k=f(a,e);k?(d[e.$ref]||h[e.$ref]||(h[e.$ref]=!0,d[e.$ref]=b(a,k,h)),i=d[e.$ref]||{}):console.warn("schema not found",e.$ref)}else"array"===e.type?i=[b(a,e.items,h)]:"object"===e.type?i={}:(i=c(g(e)),i=e.defaultValue||e.example||c(g(e)));return i}function c(a){var b;switch(a){case"long":case"integer":b=0;break;case"boolean":b=!1;break;case"double":case"number":b=0;break;case"string":b="string";break;case"date":b=(new Date).toISOString().split("T")[0];break;case"date-time":b=(new Date).toISOString()}return b}var d={},e={},f=this.resolveReference=function(a,b){if(b.$ref){var c=b.$ref.replace("#/","").split("/");b=a;for(var d=0,e=c.length;e>d;d++)b=b[c[d]]}return b},g=this.getType=function(a){var b=a.format;switch(b){case"int32":b=a.type;break;case"int64":b="long"}return b||a.type};this.generateSampleJson=function(a,c){var d,e=b(a,c);return e&&(d=angular.toJson(e,!0)),d};var h=0,i=this.generateModel=function(b,c,d,j){function k(a,b){return a.required&&-1!==a.required.indexOf(b)}var l="";if(j=j||{},c.properties){d=d||"Inline Model"+h++,j[d]=!0;var m=["
"+d+" {"],n=[];for(var o in c.properties){var p=c.properties[o];if(m.push('
',o,' ('),p.properties){var q="Inline Model"+h++;m.push(q),n.push(i(b,p,q,j))}else if(p.$ref)m.push(a(p)),n.push(i(b,p,null,j));else if("array"===p.type){if(m.push("Array["),p.items.properties){var q="Inline Model"+h++;m.push(q),n.push(i(b,p,q,j))}else p.items.$ref?(m.push(a(p.items)),n.push(i(b,p.items,null,j))):m.push(g(p.items));m.push("]")}else m.push(g(p));m.push(""),k(c,o)||m.push(", ","optional"),m.push(")"),p.description&&m.push(": ",p.description),p["enum"]&&m.push(" = ",angular.toJson(p["enum"]).replace(/,/g," or ")),m.push(",
")}m.pop(),m.push("
"),m.push("}"),m.push(n.join(""),""),l=m.join("")}else if(c.$ref){var r=a(c),s=f(b,c);if(j[r])return"";s&&(e[c.$ref]||(e[c.$ref]=i(b,s,r,j)),j[r]=!0,l=e[c.$ref])}else if("array"===c.type){var m=["Array ["],t="";if(c.items.properties){var q="Inline Model"+h++;m.push(q),t=i(b,c.items,q,j)}else c.items.$ref?(m.push(a(c.items)),t=i(b,c.items,null,j)):m.push(g(c.items));m.push("]

",t),l=m.join("")}else"object"===c.type&&(l="Inline Model {
}
");return l};this.clearCache=function(){d={},e={}}}),angular.module("swaggerUi").service("swaggerModules",["$q",function(a){function b(a,c,d,e){var f=c.shift();f?f.execute.apply(f,d).then(function(f){e=e||f,b(a,c,d,e)})["catch"](a.reject):a.resolve(e)}var c={};this.BEFORE_LOAD="BEFORE_LOAD",this.BEFORE_PARSE="BEFORE_PARSE",this.PARSE="PARSE",this.BEFORE_DISPLAY="BEFORE_DISPLAY",this.BEFORE_EXPLORER_LOAD="BEFORE_EXPLORER_LOAD",this.AFTER_EXPLORER_LOAD="AFTER_EXPLORER_LOAD",this.add=function(a,b){c[a]||(c[a]=[]),c[a].indexOf(b)<0&&c[a].push(b)},this.execute=function(){var d=Array.prototype.slice.call(arguments),e=d.splice(0,1),f=a.defer(),g=c[e]||[];return b(f,[].concat(g),d),f.promise}}]),angular.module("swaggerUi").service("swagger2JsonParser",["$q","$sce","$location","swaggerModel",function(a,b,c,d){function e(a,b,d,e){var i={},j={},k=[],m=a.info,n=c.search().swagger,o="application/json";f(a,b,m,o),g(a,k,i),h(a,k,j,i,o,n),l(k,n),e.infos=m,e.resources=k,e.form=j,d.resolve(!0)}function f(a,b,c,d){var e=angular.element('')[0];a.schemes=[a.schemes&&a.schemes[0]||e.protocol.replace(":","")],a.host=a.host||e.host,a.consumes=a.consumes||[d],a.produces=a.produces||[d],c.scheme=a.schemes[0],c.basePath=a.basePath,c.host=a.host,c.description=m(c.description)}function g(a,b,c){var d,e,f;if(a.tags)for(d=0,e=a.tags.length;e>d;d++)f=a.tags[d],b.push(f),c[f.name]=d;else b.push({name:"default",open:!0}),c["default"]=0}function h(a,b,c,d,e,f){var g,h,i,l,n,o,p,q=0,r=0;for(g in a.paths){h=a.paths[g],i=h.parameters||[],delete h.parameters;for(l in h)n=h[l],n.id=q,n.description=m(n.description),n.produces=n.produces||a.produces,c[q]={responseType:e},n.httpMethod=l,n.path=g,j(a,n,i,c,e,q,r),k(a,n),n.tags=n.tags||["default"],o=n.tags[0],"undefined"==typeof d[o]&&(d[o]=b.length,b.push({name:o})),p=b[d[n.tags[0]]],n.open=f&&f===n.operationId||f===p.name+"*",p.operations=p.operations||[],p.operations.push(n),n.open&&(p.open=!0),q++}}function i(a,b,c){var e,f,g,h,i,j,k,l=c.parameters||[],m=[].concat(l);for(e=0,h=b.length;h>e;e++){for(i=!1,j=d.resolveReference(a,b[e]),f=0,g=l.length;g>f;f++)if(k=d.resolveReference(a,l[f]),j.name===k.name&&j["in"]===k["in"]){i=!0;break}i||m.push(j)}return m}function j(a,c,e,f,g,h,j){var k,l,n,o=c.parameters=i(a,e,c);for(k=0,l=o.length;l>k;k++)n=o[k]=d.resolveReference(a,o[k]),n.id=j,n.type=d.getType(n),n.description=m(n.description),n.items&&n.items["enum"]&&(n["enum"]=n.items["enum"],n["default"]=n.items["default"]),n.subtype=n["enum"]?"enum":n.type,f[h][n.name]=n["default"]||"",n.schema&&(n.schema.display=1,n.schema.json=d.generateSampleJson(a,n.schema),n.schema.model=b.trustAsHtml(d.generateModel(a,n.schema))),"body"===n["in"]&&(c.consumes=c.consumes||a.consumes,f[h].contentType=1===c.consumes.length?c.consumes[0]:g),j++}function k(a,c){var e,f;if(c.responses)for(e in c.responses)f=c.responses[e],f.description=m(f.description),f.schema?(f.schema.json=f.examples&&f.examples[c.produces[0]]||d.generateSampleJson(a,f.schema),"object"===f.schema.type||"array"===f.schema.type||f.schema.$ref?(f.display=1,f.schema.model=b.trustAsHtml(d.generateModel(a,f.schema))):"string"===f.schema.type&&delete f.schema,"200"===e||"201"===e?(c.responseClass=f,c.responseClass.display=1,c.responseClass.status=e,delete c.responses[e]):c.hasResponses=!0):c.hasResponses=!0}function l(a,b){var c,e,f;for(c=0;cb.name?1:a.name
  • :

')}]),angular.module("templates/operation.html",[]).run(["$templateCache",function(a){a.put("templates/operation.html",'
implementation notes

response class (status {{op.responseClass.status}})
parameters
parameter value description parameter type data type
response messages
HTTP status code reason response model
request URL
 
response body
 
response code
 
response headers
 
')}]),angular.module("templates/parameter.html",[]).run(["$templateCache",function(a){a.put("templates/parameter.html",'

(default)
{{value}} or
(required)
 
 
click to set as parameter value
')}]),angular.module("templates/response.html",[]).run(["$templateCache",function(a){a.put("templates/response.html",'
 
 ')}]),angular.module("templates/swagger-ui.html",[]).run(["$templateCache",function(a){a.put("templates/swagger-ui.html",'

created by
see more at
contact the developer
license:
[BASE URL: , API VERSION: , HOST: ://]
')}]); \ No newline at end of file +"use strict";angular.module("swaggerUi",["ng"]).directive("swaggerUi",["$injector",function(a){return{restrict:"A",controller:"swaggerUiController",templateUrl:"templates/swagger-ui.html",scope:{url:"=",parser:"@?",loading:"=?",permalinks:"=?",apiExplorer:"=?",errorHandler:"=?",trustedSources:"=?",validatorUrl:"@?",templateUrl:"@?"},link:function(b){b.trustedSources||a.has("$sanitize")||console.warn("AngularSwaggerUI: you must use ngSanitize OR set trusted-sources=true as directive param if swagger descriptors are loaded from trusted sources"),void 0===b.validatorUrl&&(b.validatorUrl="http://online.swagger.io/validator"),void 0===b.templateUrl&&(b.templateUrl="templates/main.html")}}}]).controller("swaggerUiController",["$scope","$http","$location","$q","$anchorScroll","$timeout","swaggerClient","swaggerModules",function(a,b,c,d,e,f,g,h){function i(c,d){a.loading=!0;var e={method:"GET",url:c};h.execute(h.BEFORE_LOAD,e).then(function(){b(e).success(d).error(function(a,b){l({code:b,message:a})})})["catch"](l)}function j(b,c){a.loading=!1;var d={};a.parser=a.parser||"auto",h.execute(h.PARSE,a.parser,b,c,m,a.trustedSources,d).then(function(a){a?k(d):l({code:415,message:"no parser found for Swagger descriptor of type "+c+" and version "+m.swagger})})["catch"](l)}function k(b){h.execute(h.BEFORE_DISPLAY,b).then(function(){a.infos=b.infos,a.form=b.form,a.resources=b.resources,a.permalinks&&f(function(){e()},100)})["catch"](l)}function l(b){a.loading=!1,"function"==typeof a.errorHandler?a.errorHandler(b.message,b.code):console.error(b.code,"AngularSwaggerUI: "+b.message)}var m;a.$watch("url",function(b){a.infos={},a.resources=[],a.form={},b&&""!==b&&(a.loading,i(b,function(a,c,d){m=a,h.execute(h.BEFORE_PARSE,b,m).then(function(){var a=d()["content-type"]||"application/json",c=a.split(";")[0];j(b,c)})["catch"](l)}))}),a.expand=function(a,b){a.open=!0;for(var c=0,d=a.operations,e=d.length;e>c;c++)d[c].open=b},a.permalink=function(b){a.permalinks&&(c.hash(b),f(function(){e()},50))},a.submitExplorer=function(b){b.loading=!0,g.send(m,b,a.form[b.id]).then(function(a){b.loading=!1,b.explorerResult=a})}}]).directive("fileInput",function(){return{restrict:"A",require:"ngModel",link:function(a,b,c,d){b.bind("change",function(){a.$apply(function(){d.$setViewValue(b[0].files[0])})})}}}),angular.module("swaggerUi").service("swaggerClient",["$q","$http","swaggerModules",function(a,b,c){function d(a,b){var c="",d=b.data,e=b.config;if(e.params){var f=[];for(var g in e.params)f.push(g+"="+encodeURIComponent(e.params[g]));f.length>0&&(c="?"+f.join("&"))}a.resolve({url:e.url+c,response:{body:d?angular.isString(d)?d:angular.toJson(d,!0):"no content",status:b.status,headers:angular.toJson(b.headers(),!0)}})}this.send=function(e,f,g){for(var h,i=a.defer(),j={},k={},l=f.path,m=0,n=f.parameters||[],o=n.length;o>m;m++){var p=n[m],q=g[p.name];switch(p["in"]){case"query":q&&(j[p.name]=q);break;case"path":l=l.replace("{"+p.name+"}",encodeURIComponent(q));break;case"header":q&&(k[p.name]=q);break;case"formData":h=h||new FormData,q&&("file"===p.type&&(g.contentType=void 0),h.append(p.name,q));break;case"body":h=h||q}}k.Accept=g.responseType,k["Content-Type"]=h?g.contentType:"text/plain";var r=[e.schemes[0],"://",e.host,e.basePath||""].join(""),s={method:f.httpMethod,url:r+l,headers:k,data:h,params:j},t=function(a,b,e,f){var g={data:a,status:b,headers:e,config:f};c.execute(c.AFTER_EXPLORER_LOAD,g).then(function(){d(i,g)})};return c.execute(c.BEFORE_EXPLORER_LOAD,s).then(function(){b(s).success(t).error(t)}),i.promise}}]),angular.module("swaggerUi").service("swaggerModel",function(){function a(a){var b=a.$ref.split("/");return b[b.length-1]}function b(a,e,h){var i;if(h=h||{},e["default"]||e.example)i=e["default"]||e.example;else if(e.properties){i={};for(var j in e.properties)i[j]=b(a,e.properties[j],h)}else if(e.$ref){var k=f(a,e);k?(d[e.$ref]||h[e.$ref]||(h[e.$ref]=!0,d[e.$ref]=b(a,k,h)),i=d[e.$ref]||{}):console.warn("schema not found",e.$ref)}else"array"===e.type?i=[b(a,e.items,h)]:"object"===e.type?i={}:(i=c(g(e)),i=e.defaultValue||e.example||c(g(e)));return i}function c(a){var b;switch(a){case"long":case"integer":b=0;break;case"boolean":b=!1;break;case"double":case"number":b=0;break;case"string":b="string";break;case"date":b=(new Date).toISOString().split("T")[0];break;case"date-time":b=(new Date).toISOString()}return b}var d={},e={},f=this.resolveReference=function(a,b){if(b.$ref){var c=b.$ref.replace("#/","").split("/");b=a;for(var d=0,e=c.length;e>d;d++)b=b[c[d]]}return b},g=this.getType=function(a){var b=a.format;switch(b){case"int32":b=a.type;break;case"int64":b="long"}return b||a.type};this.generateSampleJson=function(a,c){var d,e=b(a,c);return e&&(d=angular.toJson(e,!0)),d};var h=0,i=this.generateModel=function(b,c,d,j){function k(a,b){return a.required&&-1!==a.required.indexOf(b)}var l,m,n,o,p,q,r,s,t="",u=!1;if(j=j||{},c.properties){d=d||"Inline Model"+h++,j[d]=!0,l=["
"+d+" {"],m=[];for(n in c.properties)u=!0,o=c.properties[n],l.push('
',n,' ('),o.properties?(p="Inline Model"+h++,l.push(p),m.push(i(b,o,p,j))):o.$ref?(l.push(a(o)),m.push(i(b,o,null,j))):"array"===o.type?(l.push("Array["),o.items.properties?(p="Inline Model"+h++,l.push(p),m.push(i(b,o,p,j))):o.items.$ref?(l.push(a(o.items)),m.push(i(b,o.items,null,j))):l.push(g(o.items)),l.push("]")):l.push(g(o)),l.push(""),k(c,n)||l.push(", ","optional"),l.push(")"),o.description&&l.push(": ",o.description),o["enum"]&&l.push(" = ",angular.toJson(o["enum"]).replace(/,/g," or ")),l.push(",
");u&&(l.pop(),l.push("
")),l.push("
}
"),l.push(m.join(""),""),t=l.join("")}else if(c.$ref){if(q=a(c),r=f(b,c),j[q])return"";r&&(e[c.$ref]||(e[c.$ref]=i(b,r,q,j)),j[q]=!0,t=e[c.$ref])}else"array"===c.type?(l=["Array ["],s="",c.items.properties?(p="Inline Model"+h++,l.push(p),s=i(b,c.items,p,j)):c.items.$ref?(l.push(a(c.items)),s=i(b,c.items,null,j)):l.push(g(c.items)),l.push("]

",s),t=l.join("")):"object"===c.type&&(t="Inline Model {
}
");return t};this.clearCache=function(){d={},e={}}}),angular.module("swaggerUi").service("swaggerModules",["$q",function(a){function b(a,c,d,e){var f=c.shift();f?f.execute.apply(f,d).then(function(f){e=e||f,b(a,c,d,e)})["catch"](a.reject):a.resolve(e)}var c={};this.BEFORE_LOAD="BEFORE_LOAD",this.BEFORE_PARSE="BEFORE_PARSE",this.PARSE="PARSE",this.BEFORE_DISPLAY="BEFORE_DISPLAY",this.BEFORE_EXPLORER_LOAD="BEFORE_EXPLORER_LOAD",this.AFTER_EXPLORER_LOAD="AFTER_EXPLORER_LOAD",this.add=function(a,b){c[a]||(c[a]=[]),c[a].indexOf(b)<0&&c[a].push(b)},this.execute=function(){var d=Array.prototype.slice.call(arguments),e=d.splice(0,1),f=a.defer(),g=c[e]||[];return b(f,[].concat(g),d),f.promise}}]),angular.module("swaggerUi").service("swaggerParser",["$q","$sce","$location","swaggerModel",function(a,b,c,d){function e(a,b,d,e){var i={},j={},k=[],m=a.info,n=c.hash(),o="application/json";p=0,q=0,f(a,b,m,o),g(a,k,i),h(a,k,j,i,o,n),l(k,n),e.infos=m,e.resources=k,e.form=j,d.resolve(!0)}function f(a,b,c,d){var e=angular.element('')[0];a.schemes=[a.schemes&&a.schemes[0]||e.protocol.replace(":","")],a.host=a.host||e.host,a.consumes=a.consumes||[d],a.produces=a.produces||[d],c.scheme=a.schemes[0],c.basePath=a.basePath,c.host=a.host,c.description=m(c.description)}function g(a,b,c){var d,e,f;if(a.tags)for(d=0,e=a.tags.length;e>d;d++)f=a.tags[d],b.push(f),c[f.name]=d;else b.push({name:"default",open:!0}),c["default"]=0}function h(a,b,c,d,e,f){var g,h,i,l,n,o,q;for(g in a.paths){h=a.paths[g],i=h.parameters||[],delete h.parameters;for(l in h)n=h[l],n.id=p,n.description=m(n.description),n.produces=n.produces||a.produces,c[p]={responseType:e},n.httpMethod=l,n.path=g,j(a,n,i,c,e),k(a,n),n.tags=n.tags||["default"],o=n.tags[0],"undefined"==typeof d[o]&&(d[o]=b.length,b.push({name:o})),q=b[d[n.tags[0]]],n.open=f&&f===n.operationId||f===q.name+"*",q.operations=q.operations||[],q.operations.push(n),n.open&&(q.open=!0),p++}}function i(a,b,c){var e,f,g,h,i,j,k,l=c.parameters||[],m=[].concat(l);for(e=0,h=b.length;h>e;e++){for(i=!1,j=d.resolveReference(a,b[e]),f=0,g=l.length;g>f;f++)if(k=d.resolveReference(a,l[f]),j.name===k.name&&j["in"]===k["in"]){i=!0;break}i||m.push(j)}return m}function j(a,c,e,f,g){var h,j,k,l=c.parameters=i(a,e,c);for(h=0,j=l.length;j>h;h++)k=l[h]=d.resolveReference(a,l[h]),k.id=q,k.type=d.getType(k),k.description=m(k.description),k.items&&k.items["enum"]&&(k["enum"]=k.items["enum"],k["default"]=k.items["default"]),k.subtype=k["enum"]?"enum":k.type,f[p][k.name]=k["default"]||"",k.schema&&(k.schema.display=1,k.schema.json=d.generateSampleJson(a,k.schema),k.schema.model=b.trustAsHtml(d.generateModel(a,k.schema))),("body"===k["in"]||"formData"===k["in"])&&(c.consumes=c.consumes||a.consumes,f[p].contentType=1===c.consumes.length?c.consumes[0]:g),q++}function k(a,c){var e,f,g;if(c.responses)for(e in c.responses)f=c.responses[e],f.description=m(f.description),f.schema?(g=f.examples&&f.examples[c.produces[0]]?angular.toJson(f.examples[c.produces[0]],!0):d.generateSampleJson(a,f.schema),f.schema.json=g,"object"===f.schema.type||"array"===f.schema.type||f.schema.$ref?(f.display=1,f.schema.model=b.trustAsHtml(d.generateModel(a,f.schema))):"string"===f.schema.type&&delete f.schema,"200"===e||"201"===e?(c.responseClass=f,c.responseClass.display=1,c.responseClass.status=e,delete c.responses[e]):c.hasResponses=!0):c.hasResponses=!0}function l(a,b){var c,e,f;for(c=0;cb.name?1:a.name
  • :

'),a.put("templates/main.html",'

created by
see more at
contact the developer
license:
[BASE URL: , API VERSION: , HOST: ://]
'),a.put("templates/operation.html",'
implementation notes

response class (status {{op.responseClass.status}})
parameters
parameter value description parameter type data type
response messages
HTTP status code reason response model
request URL
 
response body
 
response code
 
response headers
 
'),a.put("templates/parameter.html",'

(default)
{{value}} or
(required)
 
 
click to set as parameter value
'),a.put("templates/response.html",'
 
 '),a.put("templates/swagger-ui.html",'
')}]); \ No newline at end of file