angular-swagger-ui
Version:
AngularJS implementation of OpenAPI (aka Swagger) UI
8 lines • 33.4 kB
JavaScript
/*
* Orange angular-swagger-ui - v0.6.5
*
* (C) 2015 Orange, all right reserved
* MIT Licensed
*/
"use strict";angular.module("swaggerUi",["ng"]).directive("swaggerUi",["$injector",function(a){return{restrict:"A",controller:"swaggerUiController",templateUrl:function(a,b){return b.templateUrl||"templates/swagger-ui.html"},scope:{url:"=?",parser:"@?",loading:"=?",permalinks:"=?",download:"@?",apiExplorer:"=?",errorHandler:"=?",trustedSources:"=?",validatorUrl:"@?",inputType:"@?",input:"=?",showInheritedProperties:"=?"},link:function(b){b.trustedSources||a.has("$sanitize")||console.warn("AngularSwaggerUI: You must use ngSanitize OR set trusted-sources=true as directive param if OpenApi specifications are loaded from trusted sources"),void 0===b.validatorUrl&&(b.validatorUrl="http://online.swagger.io/validator"),"undefined"==typeof b.download&&(b.download=null)}}}]),angular.module("swaggerUi").controller("swaggerUiController",["$scope","$window","$location","$anchorScroll","$timeout","$sce","$q","swaggerClient","swaggerModules","swaggerTranslator","swaggerLoader","swaggerModel",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(b,c){a.loading=!1,l.clearCache(),i.execute(i.PARSE,c).then(function(a){a?n(c):o({code:415,message:j.translate("errorNoParserFound",{type:c.contentType})})})["catch"](o)}function n(b){i.execute(i.BEFORE_DISPLAY,b).then(function(){v=b.openApiSpec,a.ui=b.ui,a.permalinks&&e(function(){d()},200)})["catch"](o)}function o(b){console.error("AngularSwaggerUI",b),a.loading=!1,"function"==typeof a.errorHandler&&a.errorHandler(b.message,b.code)}function p(){return a.$watch("input",function(b){r(),b&&(a.loading=!0,m(null,{openApiSpec:angular.copy(b),parser:a.parser||a.inputType||"json",contentType:"application/"+(a.inputType||"json")}))})}function q(b){return a.$watch(b,function(b){if(r(),b&&""!==b){if(a.loading,a.validatorUrl&&0!==b.indexOf("http"))return void(a.url=t(b));a.loading=!0;var c={url:b,parser:a.parser||"auto",trustedSources:a.trustedSources};k.get(c).then(function(){return i.execute(i.BEFORE_PARSE,c)}).then(function(){m(b,c)})["catch"](o)}})}function r(){a.ui={form:{},infos:{},resources:[]},v=null}function s(){var b;a.$watch("inputType",function(c){switch(r(),b&&b(),c){case"json":case"yaml":a.validatorUrl=!1,b=p();break;case"url":b=q("input");break;default:b=q("url")}})}function t(a){var b=document.createElement("a");return b.href=a,b.href}function u(a){var b,c,d=0,e={},f=a.security||[];if(v)for(;d<f.length;d++){b=f[d];for(c in b)e[c]=v.securityDefinitions[c]}return e}var v;s(),a.expand=function(a,b){a.open=!0;for(var c=0,d=a.operations,e=d.length;c<e;c++)d[c].open=b},b.swaggerlink=a.permalink=function(b){a.permalinks&&e(function(){c.hash(b),d(b)},50)},a.submitExplorer=function(b){b.loading=!0,h.send(v,b,a.ui.form[b.id],u(b)).then(function(a){b.loading=!1,b.explorerResult=a})},a.auth=function(a){i.execute(i.AUTH,{securityDefinitions:u(a)})["catch"](o)},a.authValid=function(a){var b,c=u(a);for(b in c)if(!c[b].valid)return!1;return!0},a.getModel=function(b,c,d){var e=c+"-"+d;return b.models=b.models||{},!b.models[e]&&b.schema&&(b.models[e]=f.trustAsHtml(l.generateModel(v,b.schema,e,a.showInheritedProperties))),b.models[e]},a.getSample=function(a,b){return a.samples=a.samples||{},b&&!a.samples[b]&&a.schema&&(a.samples[b]=l[b.indexOf("/xml")>=0?"generateSampleXml":"generateSampleJson"](v,a.schema,a.examples&&a.examples[b])),a.samples[b]}}]),angular.module("swaggerUi").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").directive("selectOnDbClick",["$window",function(a){return{restrict:"A",link:function(b,c){c.bind("dblclick",function(){var b=a.getSelection(),d=document.createRange();d.selectNodeContents(c[0]),b.removeAllRanges(),b.addRange(d)})}}}]),angular.module("swaggerUi").service("swaggerClient",["$q","$http","$httpParamSerializer","swaggerModules",function(a,b,c,d){function e(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(f,g,h,i){var j,k=a.defer(),l={},m={},n=g.path,o="application/x-www-form-urlencoded"===h.contentType;n.match(/.*\?.*({(\?|&).*})/)?n=n.split("?")[0]:n.match(/.*({(\?).*})/)&&(n=n.split("{?")[0]);for(var p=0,q=g.parameters||[],r=q.length;p<r;p++){var s=q[p],t=h[s.name];switch(s["in"]){case"query":t&&(l[s.name]=t);break;case"path":n=n.replace(new RegExp("{"+s.name+"[^}]*}"),encodeURIComponent(t));break;case"header":t&&(m[s.name]=t);break;case"formData":j=j||(o?{}:new FormData),t&&("file"===s.type&&(h.contentType=void 0),o?j[s.name]=t:j.append(s.name,t));break;case"body":j=j||t}}angular.forEach(i,function(a){if(a.valid)switch(a.type){case"apiKey":switch(a["in"]){case"header":m[a.name]=a.apiKey;break;case"query":l[a.name]=a.apiKey}break;default:a.tokenType&&a.accessToken&&(m.Authorization=a.tokenType+" "+a.accessToken)}}),m.Accept=h.responseType,m["Content-Type"]=j?h.contentType:"text/plain";var u=f.basePath||"",v=[f.schemes[0],"://",f.host,u.length>0&&"/"===u.substring(u.length-1)?u.slice(0,-1):u].join(""),w={method:g.httpMethod,url:v+n,headers:m,data:o?c(j):j,params:l},x=function(a){var b={data:a.data,status:a.status,headers:a.headers,config:a.config};d.execute(d.AFTER_EXPLORER_LOAD,b).then(function(){e(k,b)})};return d.execute(d.BEFORE_EXPLORER_LOAD,w).then(function(){b(w).then(x)["catch"](x)}),k.promise}}]),angular.module("swaggerUi").provider("swaggerTranslator",function(){var a="en",b={};this.setLanguage=function(b){return a=b,this},this.addTranslations=function(a,c){var d=b[a]=b[a]||{};return angular.merge(d,c),this},this.$get=["$rootScope","$interpolate",function(c,d){return{useLanguage:function(d){"undefined"==typeof b[d]&&console.error("AngularSwaggerUI: No translations found for language "+d),a=d,c.$emit("swaggerTranslateLangChanged")},translate:function(c,e){return a&&b&&b[a]&&b[a][c]?d(b[a][c])(e):c},language:function(){return a}}}]}).directive("swaggerTranslate",["$rootScope","$parse","swaggerTranslator",function(a,b,c){return{restrict:"A",link:function(d,e,f){function g(){var a;f.swaggerTranslateValue&&(a=b(f.swaggerTranslateValue)(d.$parent)),e.text(c.translate(f.swaggerTranslate,a))}var h=a.$on("swaggerTranslateLangChanged",function(){g()});d.$on("$destroy",h),g()}}}]).filter("swaggerTranslate",["swaggerTranslator",function(a){var b=function(b,c){return a.translate(b,c)};return b.$stateful=!0,b}]),angular.module("swaggerUi").service("swaggerLoader",["$q","$http","swaggerModules",function(a,b,c){this.get=function(d){var e=a.defer(),f={method:"GET",url:d.url};return c.execute(c.BEFORE_LOAD,f).then(function(){return b(f)}).then(function(a){return d.openApiSpec=a.data,d.contentType=(a.headers()["content-type"]||"application/json").split(";")[0],c.execute(c.AFTER_LOAD,d)}).then(function(){e.resolve(d)})["catch"](function(a){a.status&&(a={code:a.status,message:a.data}),e.reject(a)}),e.promise}}]),angular.module("swaggerUi").service("swaggerModel",["swaggerTranslator",function(a){function b(a,b){return b.allOf&&(b=angular.copy(b),angular.forEach(b.allOf,function(c){var d=s(a,c);c.$ref&&d.discriminator||angular.merge(b,d)}),delete b.allOf),b}function c(a,e,f){var g,h,i,j;if(f=f||{},e=b(a,e),e.parentModelsRef&&angular.forEach(e.parentModelsRef,function(b){var c=s(a,b);angular.merge(e,c)}),e["default"]||e.example)g=e["default"]||e.example;else if(e.properties){g={};for(i in e.properties)j=e.properties[i],g[i]=c(a,j.schema||j,f)}else e.additionalProperties?(h=s(a,e.additionalProperties),g={string:c(a,h,f)}):e.$ref?(h=s(a,e),h?(r[e.$ref]||f[e.$ref]||(f[e.$ref]=!0,r[e.$ref]=c(a,h,f)),g=r[e.$ref]||{}):(console.warn("AngularSwaggerUI: schema not found",e.$ref),g=e.$ref)):g="array"===e.type?[c(a,e.items,f)]:"object"===e.type?{}:e.defaultValue||e.example||d(e);return g}function d(a){var b,c=t(a);switch(c){case"long":case"integer":b=0;break;case"boolean":b=!1;break;case"float":case"double":case"number":b=0;break;case"string":case"byte":case"binary":case"password":b="string",a["enum"]&&a["enum"].length>0&&(b=a["enum"][0]);break;case"date":b=(new Date).toISOString().split("T")[0];break;case"date-time":b=(new Date).toISOString()}return b}function e(a){var b=a.$ref.split("/");return b[b.length-1]}function f(a,b){return a.required&&a.required.indexOf(b)!==-1}function g(){return q+u++}function h(a,b,c,d){c.discriminator&&!b.subModelsRef&&(b.subModelsRef=[],angular.forEach(a.definitions,function(c,f){d!==f&&c.allOf&&angular.forEach(c.allOf,function(g){g.$ref&&d===e(g)&&(c.parentModelsRef=c.parentModelsRef||[],c.parentModelsRef.push({$ref:"#/definitions/"+d}),b.subModelsRef.push({$ref:"#/definitions/"+f})),h(a,c,g,f)})}))}function i(a,c,d,f,g){var h={};if(f){if(g=g||{},g[f])return h;g[f]=!0}if(c=b(a,c),c.properties)angular.forEach(c.properties,function(b){k(a,b,h,d,g)});else if(c.schema||c.$ref){var l=c.schema||c,m=s(a,l),n=e(l);!m||m.type&&"object"!==m.type&&"array"!==m.type||(m=b(a,m),h[n]=m,d[n]=v++,angular.merge(h,i(a,m,d,n,g)))}else"array"===c.type?k(a,c.items,h,d,g):c.additionalProperties&&k(a,c.additionalProperties,h,d,g);if(c.subModelsRef){for(var o=[],p=Object.keys(d),q=0;q<c.subModelsRef.length;q++)p.indexOf(e(c.subModelsRef[q]))===-1&&o.push(c.subModelsRef[q]);o.length>0&&j(a,o,h,d,g)}return c.parentModelsRef&&j(a,c.parentModelsRef,h,d,g),h}function j(a,b,c,d,f){angular.forEach(b,function(b){var g=s(a,b),h=e(b);c[h]=g,d[h]=v++,angular.merge(c,i(a,g,d,h,f))})}function k(a,b,c,d,e){var f=l(b,c,d);angular.merge(c,i(a,b,d,f,e))}function l(a,b,c){var d;return a.properties&&(d=g(),a.modelName=d,c[d]=v++,b[d]=a),d}function m(a,b){var c=a+"-model-"+b;return['<a class="model-link type" onclick="swaggerlink(\'',c,"')\">",b,"</a>"].join("")}function n(c,d,h,i,j,k,l){var n=['<div class="model" id="',k+"-model-"+h,'">'];if(d=b(c,d),d.properties){n.push("<div><strong>",h),d.parentModelsRef&&(n.push("</strong> extends <strong>"),angular.forEach(d.parentModelsRef,function(a){if(n.push(m(k,e(a))," "),!l){var b=s(c,a);angular.forEach(b.properties,function(a,b){d.properties[b]&&delete d.properties[b]})}}),n.pop()),n.push(" {</strong></div>");var p=!1;angular.forEach(d.properties,function(b,e){if(p=!0,!b.type&&b.$ref){var g=s(c,b);"object"!==g.type&&"array"!==g.type&&(b=g)}n.push('<div class="pad"><strong>',e,'</strong> (<span class="type">'),n.push(o(b,i,j,k)),n.push("</span>"),f(d,e)||n.push(", ","<em>"+a.translate("modelOptional")+"</em>"),n.push(")"),b.description&&n.push(": ",b.description);var h=b["enum"]||b.items&&b.items["enum"];h&&n.push(", Enum = ",angular.toJson(h).replace(/,/g,", ")),n.push(",</div>")}),p&&(n.pop(),n.push("</div>")),n.push("<div><strong>}</strong></div>")}else"array"===d.type||d.additionalProperties?n.push(o(d,i,j,k)):"object"===d.type?n.push("<strong>",h||g()," {<br>}</strong>"):d.type&&n.push("<strong>",t(d),"</strong>");return n.join("")}function o(a,b,c,d){var f,g=[];return a.modelName?g.push(m(d,a.modelName)):a.schema||a.$ref?(f=e(a.schema||a),g.push(m(d,f))):"array"===a.type?(g.push("Array["),g.push(o(a.items,b,c,d)),g.push("]")):a.properties?g.push(m(d,f)):a.additionalProperties?(g.push("Map<string, "),g.push(o(a.additionalProperties,b,c,d)),g.push(">")):g.push(t(a)),g.join("")}function p(){v=0,u=1}var q="InlineModel",r={},s=this.resolveReference=function(a,c){var d=c;if(c.$ref){var e=c.$ref.replace("#/","").split("/");d=a;for(var f=0,g=e.length;f<g;f++)d=d[e[f]];d||console.error("could not resolve model definition",c.$ref)}return d=b(a,d),angular.copy(d)},t=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,b,d){var e,f;try{e=d||c(a,b),e&&(f=angular.toJson(e,!0))}catch(g){console.error("AngularSwaggerUI: failed to generate sample json",b,g),f="failed to generate sample json"}return f},this.generateSampleXml=function(a,b,c){return'<?xml version="1.0" encoding="UTF-8"?>\n<!-- XML example cannot be generated -->'};var u=1;this.resolveInheritance=function(a){angular.forEach(a.definitions,function(b,c){h(a,b,b,c)})},this.generateModel=function(a,c,d,e){var f,h=[],j={},k={};try{c=b(a,c),c.properties?(k[g()]=c,angular.merge(k,i(a,c,j))):k=i(a,c,j),f=s(a,c),f.properties||h.push("<strong>",o(f,k,j,d),"</strong><br><br>"),angular.forEach(k,function(b,c){h.push(n(a,b,c,k,j,d,e))})}catch(l){console.error("AngularSwaggerUI: failed to generate model",c,l),h=["failed to generate model"]}return p(),h.join("")};var v=0;this.clearCache=function(){r={}}}]),angular.module("swaggerUi").service("swaggerModules",["$q",function(a){function b(a,c,d,e){var f=c.shift();f?f.execute(d).then(function(f){e=e||f,b(a,c,d,e)})["catch"](a.reject):a.resolve(e)}var c={};this.AUTH="AUTH",this.BEFORE_LOAD="BEFORE_LOAD",this.AFTER_LOAD="AFTER_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.BEFORE_CONVERT="BEFORE_CONVERT",this.add=function(a,b,d){c[a]||(c[a]=[]),d||(d=1),b.swaggerModulePriority=d,c[a].indexOf(b)<0&&c[a].push(b),c[a].sort(function(a,b){return a.swaggerModulePriority>b.swaggerModulePriority?-1:a.swaggerModulePriority<b.swaggerModulePriority?1:0})},this.execute=function(d,e){var f=a.defer(),g=c[d]||[];return angular.isObject(e)||console.warn("AngularSwaggerUI: module execution argument should be an object!"),b(f,[].concat(g),e),f.promise}}]),angular.module("swaggerUi").service("swaggerParser",["$q","$sce","$location","swaggerModel","swaggerTranslator",function(a,b,c,d,e){function f(a,b){var e={},f={},j=[],k=b.openApiSpec.info,l=c.hash(),m="application/json",o=!b.openApiSpec.tags;r=0,s=0,g(b.openApiSpec,b.url,k,m),h(b.openApiSpec,j,e),i(b.openApiSpec,j,f,e,m,l),d.resolveInheritance(b.openApiSpec),n(j,l,o),b.ui={infos:k,form:f,resources:j},a.resolve(!0)}function g(a,b,c,d){var e=angular.element('<a href="'+b+'"></a>')[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.schemes=a.schemes,c.basePath=a.basePath,c.host=a.host,c.description=o(c.description),c.externalDocs=a.externalDocs,c.externalDocs&&(c.externalDocs.description=o(c.externalDocs.description))}function h(a,b,c){var d,e,f;if(a.tags)for(d=0,e=a.tags.length;d<e;d++)f=a.tags[d],b.push(f),c[f.name]=d;else b.push({name:"default",open:!0}),c["default"]=0}function i(a,b,c,e,f,g){var h,i,j,m,n,p,q,s;for(i in a.paths){j=a.paths[i]=d.resolveReference(a,a.paths[i]),m=j.parameters||[],delete j.parameters;for(n in j)if(t.indexOf(n)>=0)for(p=j[n],p.description=o(p.description),p.produces=p.produces||a.produces,c[r]={responseType:p.produces&&p.produces[0]||f},p.httpMethod=n,p.path=i,p.security=p.security||a.security,k(a,p,m,c,f,g),l(a,p,g),p.tags=p.tags||["default"],h=0;h<p.tags.length;h++)q=p.tags[h],"undefined"==typeof e[q]&&(e[q]=b.length,b.push({name:q})),s=b[e[q]],s.operations=s.operations||[],p.id=r++,p.operationId=p.operationId||"operation-"+p.id,p.open=g&&g.match(new RegExp(p.operationId+"$|"+p.operationId+"-(default|parameter|response)-model-.*|"+s.name+"\\*$")),s.operations.push(angular.copy(p)),p.open&&(s.open=!0)}}function j(a,b,c){var e,f,g,h,i,j,k,l=c.parameters||[],m=[].concat(l);for(e=0,h=b.length;e<h;e++){for(i=!1,j=d.resolveReference(a,b[e]),f=0,g=l.length;f<g;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 k(a,b,c,e,f,g){var h,i,k,l,m=b.parameters=j(a,c,b);for(h=0,i=m.length;h<i;h++)k=m[h]=d.resolveReference(a,m[h]),k.id=s,k.type=d.getType(k),k.description=o(k.description),k.items&&k.items["enum"]&&(k["enum"]=k.items["enum"],k["default"]=k.items["default"]),k.subtype=k["enum"]?"enum":k.type,e[r][k.name]=k["default"]||"",k.schema&&(l=g&&g.match(new RegExp(b.operationId+"-parameter-model-.*")),k.schema.display=l?0:1),"body"===k["in"]?(b.consumes=b.consumes||a.consumes||[f],e[r].contentType=b.consumes&&b.consumes[0]):"formData"===k["in"]&&(b.consumes=b.consumes||["file"===k.subtype?"multipart/form-data":"application/x-www-form-urlencoded"],e[r].contentType=b.consumes&&b.consumes[0]),k.schema&&b.consumes&&b.consumes.indexOf("application/xml")>=0&&(k.schema.xml=d.generateSampleXml(a,k.schema)),s++}function l(a,b,c){var e,f,g;if(b.responses)for(e in b.responses)f=b.responses[e]=d.resolveReference(a,b.responses[e]),f.description=o(f.description),f.schema?"200"===e||"201"===e?(b.responseClass=f,g=c&&c.match(new RegExp(b.operationId+"-default-model-.*")),b.responseClass.display=g?0:1,b.responseClass.status=e,m(a,b,f),delete b.responses[e]):(g=c&&c.match(new RegExp(b.operationId+"-response-model-.*")),f.display=g?0:1,b.hasResponses=!0):b.hasResponses=!0}function m(a,b,c){if(c.headers){b.headers=c.headers;for(var e in b.headers){var f=b.headers[e];f.type=d.getType(f),"array"===f.type&&(f.type="Array["+d.getType(f.items)+"]"),f.description=o(f.description)}delete c.headers}}function n(a,b,c){var d,e,f;for(d=0;d<a.length;d++)e=a[d],f=a[d].operations,e.open=e.open||b===e.name||b===e.name+"*",(!f||f&&0===f.length)&&a.splice(d--,1);c&&a.sort(function(a,b){return a.name>b.name?1:a.name<b.name?-1:0})}function o(a){var c=a;return"string"==typeof a&&q&&(c=b.trustAsHtml(p(a))),c}function p(a){return a.replace(/&/g,"&").replace(/<([^\/a-zA-Z])/g,"<$1").replace(/"/g,""").replace(/'/g,"'")}var q,r,s,t=["get","put","post","delete","options","head","patch","trace"];this.execute=function(b){var c=a.defer();if(b.openApiSpec&&"2.0"===b.openApiSpec.swagger&&("json"===b.parser||"auto"===b.parser&&"application/json"===b.contentType)){q=b.trustedSources;try{f(c,b)}catch(d){c.reject({code:500,message:e.translate("errorParseFailed",d)})}}else c.resolve(!1);return c.promise}}]).run(["swaggerModules","swaggerParser",function(a,b){a.add(a.PARSE,b,1)}]),angular.module("swaggerUi").config(["swaggerTranslatorProvider",function(a){a.addTranslations("en",{infoContactCreatedBy:"Created by {{name}}",infoContactUrl:"See more at",infoContactEmail:"Contact the developer",infoLicense:"License: ",infoBaseUrl:"BASE URL",infoApiVersion:"API VERSION",infoHost:"HOST",endPointToggleOperations:"Open/Hide",endPointListOperations:"List operations",endPointExpandOperations:"Expand operations",operationDeprected:"Warning: Deprecated",operationImplementationNotes:"Implementation notes",externalDocs:"External docs",headers:"Response headers",headerName:"Header",headerDescription:"Description",headerType:"Type",parameters:"Parameters",parameterName:"Parameter",parameterValue:"Value",parameterDescription:"Description",parameterType:"Parameter type",parameterDataType:"Data type",parameterOr:" or ",parameterRequired:"(required)",parameterModel:"Model",parameterSchema:"Example value",parameterContentType:"Parameter content type",parameterDefault:"{{default}} (default)",parameterSetValue:"Click to set as parameter value",responseClass:"Response class (status {{status}})",responseModel:"Model",responseSchema:"Example value",responseContentType:"Response content type",responses:"Response messages",responseCode:"HTTP status code",responseReason:"Reason",responseHide:"Hide response",modelOptional:"optional",modelOr:" or ",explorerUrl:"Request URL",explorerBody:"Response body",explorerCode:"Response code",explorerHeaders:"Response headers",explorerLoading:"Loading...",explorerTryIt:"Try it out!",errorNoParserFound:"No parser found for OpenApi specification of type {{type}}",errorParseFailed:"Failed to parse OpenApi specification: {{message}}",errorJsonParse:"Failed to parse JSON",errorNoYamlParser:"No YAML parser found, please make sure to include js-yaml library",authRequired:"Authorization required",authAvailable:"Available authorizations",apiKey:"API key authorization",authParamName:"Name",authParamType:"In",authParamValue:"Value",basic:"Basic authorization",authLogin:"Login",authPassword:"Password",oauth2:"oAuth2 authorization",authOAuthDesc:"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes. API requires the following scopes. Select which ones you want to grant.",authAuthorizationUrl:"Authorization URL",authFlow:"Flow",authTokenUrl:"Token URL",authScopes:"Scopes",authDone:"Done",authAuthorize:"Authorize",authClientId:"Client ID",authClientSecret:"Client secret",authLogout:"Logout",authLogged:"You're currently logged in"})}]),angular.module("swaggerUi").run(["$templateCache",function(a){a.put("templates/endpoint.html",'<div id="{{api.name}}" class="clearfix" ng-class="api.css"> <ul id="{{api.name}}*" class="list-inline pull-left endpoint-heading"> <li> <h4> <a ng-click="api.open=!api.open;api.open?permalink(api.name):\'\';" ng-bind="api.name"></a> <span ng-if="api.description"> : <span ng-bind="api.description"></span></span> </h4> </li> </ul> <ul class="list-inline pull-right endpoint-actions"> <li> <a ng-click="api.open=!api.open;api.open?permalink(api.name):\'\';" swagger-translate="endPointToggleOperations"></a> </li> <li> <a ng-click="expand(api);api.open?permalink(api.name):\'\';" swagger-translate="endPointListOperations"></a> </li> <li> <a ng-click="expand(api,true);api.open?permalink(api.name+\'*\'):\'\';" swagger-translate="endPointExpandOperations"></a> </li> </ul> </div> <ul class="list-unstyled operations" ng-class="api.css" ng-if="api.open"> <li ng-repeat="op in api.operations track by $index" class="operation" ng-class="[op.httpMethod,op.css,{\'has-authorization\':op.security.length}]" ng-include="\'templates/operation.html\'"></li> </ul>'),a.put("templates/operation.html",'<div id="{{op.operationId}}" class="heading"> <a ng-click="op.open=!op.open;op.open?permalink(op.operationId):\'\'"> <div class="clearfix"> <span class="http-method text-uppercase" ng-bind="op.httpMethod"></span> <span class="path" ng-class="{deprecated:op.deprecated}" ng-bind="op.path"></span> <span class="description pull-right" ng-bind="op.summary"></span> </div> </a> </div> <div class="content" ng-if="op.open"> <div class="h5" ng-if="op.deprecated" swagger-translate="operationDeprected"></div> <div ng-if="op.description"> <h5 swagger-translate="operationImplementationNotes"></h5> <p ng-bind-html="op.description"></p> </div> <div ng-if="op.externalDocs"> <h5 swagger-translate="externalDocs"></h5> <span ng-bind-html="op.externalDocs.description"></span> <a target="_blank" ng-href="{{op.externalDocs.url}}" ng-bind="op.externalDocs.url"></a> </div> <button ng-if="op.security.length>0" ng-click="auth(op)" class="auth-required" ng-class="{valid:authValid(op)}" title="{{\'authRequired\'|swaggerTranslate}}">!</button> <form role="form" name="explorerForm" ng-submit="explorerForm.$valid&&submitExplorer(op)"> <div ng-if="op.responseClass" class="response"> <h5 swagger-translate="responseClass" swagger-translate-value="op.responseClass"></h5> <div ng-if="op.responseClass.display!=-1"> <ul class="list-inline schema"> <li><a ng-click="op.responseClass.display=0" ng-class="{active:op.responseClass.display==0}" swagger-translate="responseModel"></a></li> <li><a ng-click="op.responseClass.display=1" ng-class="{active:op.responseClass.display==1}" swagger-translate="responseSchema"></a></li> </ul> <pre class="model" ng-if="op.responseClass.display==0" ng-bind-html="getModel(op.responseClass,op.operationId,\'default\')"></pre> <pre select-on-db-click class="model-schema" ng-if="op.responseClass.display==1" ng-bind="getSample(op.responseClass,ui.form[op.id].responseType)"></pre> </div> </div> <div ng-if="op.headers" class="table-responsive"> <h5 swagger-translate="headers"></h5> <table class="table table-condensed headers"> <thead> <tr> <th class="name" swagger-translate="headerName"></th> <th class="desc" swagger-translate="headerDescription"></th> <th class="type" swagger-translate="headerType"></th> </tr> </thead> <tbody> <tr ng-repeat="(name,header) in op.headers track by $index" ng-class="header.css" class="response-header"> <td class="bold" ng-bind="name"></td> <td ng-bind-html="header.description"></td> <td ng-bind="header.type"></td> </tr> </tbody> </table> </div> <div ng-if="op.parameters&&op.parameters.length>0" class="table-responsive"> <h5 swagger-translate="parameters"></h5> <table class="table table-condensed parameters"> <thead> <tr> <th class="name" swagger-translate="parameterName"></th> <th class="value" swagger-translate="parameterValue"></th> <th class="desc" swagger-translate="parameterDescription"></th> <th class="type" swagger-translate="parameterType"></th> <th class="data" swagger-translate="parameterDataType"></th> </tr> </thead> <tbody> <tr ng-repeat="param in op.parameters track by $index" ng-include="\'templates/parameter.html\'" class="operation-parameter" ng-class="[param.css,\'operation-parameter-\'+param.in]"></tr> </tbody> </table> </div> <div ng-if="op.produces" class="content-type"> <label for="responseContentType{{op.id}}" swagger-translate="responseContentType"></label> <select ng-model="ui.form[op.id].responseType" ng-options="item for item in op.produces track by item" id="responseContentType{{op.id}}" name="responseContentType{{op.id}}" required></select> </div> <div class="table-responsive" ng-if="op.hasResponses"> <h5 swagger-translate="responses"></h5> <table class="table responses"> <thead> <tr> <th class="code" swagger-translate="responseCode"></th> <th swagger-translate="responseReason"></th> <th swagger-translate="responseModel"></th> </tr> </thead> <tbody> <tr ng-repeat="(code,resp) in op.responses track by $index" ng-include="\'templates/response.html\'" class="operation-response" ng-class="resp.css"></tr> </tbody> </table> </div> <div ng-if="apiExplorer"> <button class="btn btn-default" ng-click="op.explorerResult=false;op.hideExplorerResult=false" type="submit" ng-disabled="op.loading" ng-bind="op.loading?\'explorerLoading\':\'explorerTryIt\'|swaggerTranslate"></button> <a class="hide-try-it" ng-if="op.explorerResult&&!op.hideExplorerResult" ng-click="op.hideExplorerResult=true" swagger-translate="responseHide"></a> </div> </form> <div ng-if="op.explorerResult" ng-show="!op.hideExplorerResult" class="explorer-result"> <h5 swagger-translate="explorerUrl"></h5> <pre select-on-db-click ng-bind="op.explorerResult.url" class="explorer-url"></pre> <h5 swagger-translate="explorerBody"></h5> <pre select-on-db-click ng-bind="op.explorerResult.response.body" class="explorer-body"></pre> <h5 swagger-translate="explorerCode"></h5> <pre select-on-db-click ng-bind="op.explorerResult.response.status" class="explorer-status"></pre> <h5 swagger-translate="explorerHeaders"></h5> <pre select-on-db-click ng-bind="op.explorerResult.response.headers" class="explorer-headers"></pre> </div> </div>'),a.put("templates/parameter.html",'<td ng-class="{bold:param.required}" class="operation-parameter-name"> <label for="param{{param.id}}" ng-bind="param.name"></label> </td> <td ng-class="{bold:param.required}" class="operation-parameter-value"> <div ng-if="apiExplorer"> <div ng-if="param.in!=\'body\'" ng-switch="param.subtype"> <input ng-switch-when="file" type="file" file-input ng-model="ui.form[op.id][param.name]" id="param{{param.id}}" placeholder="{{param.required?\'parameterRequired\':\'\'|swaggerTranslate}}" ng-required="param.required" name="{{param.name}}"> <select ng-switch-when="enum" ng-model="ui.form[op.id][param.name]" id="param{{param.id}}" name="{{param.name}}" ng-required="param.required"> <option value="" ng-if="!param.required"></option> <option ng-repeat="value in param.enum" value="{{value}}" ng-bind="value+(param.default==value?\'parameterDefault\':\'\'|swaggerTranslate)" ng-selected="param.default==value"></option> </select> <input ng-switch-default type="text" ng-model="ui.form[op.id][param.name]" id="param{{param.id}}" placeholder="{{param.required?\'parameterRequired\':\'\'|swaggerTranslate}}" ng-required="param.required" name="{{param.name}}"> </div> <div ng-if="param.in==\'body\'"> <textarea id="param{{param.id}}" ng-model="ui.form[op.id][param.name]" ng-required="param.required" name="{{param.name}}"></textarea> <br> <div ng-if="op.consumes" class="content-type"> <label for="bodyContentType{{op.id}}" swagger-translate="parameterContentType"></label> <select ng-model="ui.form[op.id].contentType" id="bodyContentType{{op.id}}" name="bodyContentType{{op.id}}" ng-options="item for item in op.consumes track by item"></select> </div> </div> </div> <div ng-if="!apiExplorer"> <div ng-if="param.in!=\'body\'"> <div ng-if="param.default" swagger-translate="parameterDefault" swagger-translate-value="param.default"></div> <div ng-if="param.enum"> <span ng-repeat="value in param.enum track by $index">{{value}}<span ng-if="!$last" swagger-translate="parameterOr"></span></span> </div> <div ng-if="param.required"><strong swagger-translate="parameterRequired"></strong></div> </div> </div> </td> <td ng-class="{bold:param.required}" ng-bind-html="param.description" class="operation-parameter-description"></td> <td ng-bind="param.in" class="operation-parameter-in"></td> <td ng-if="param.type" ng-switch="param.type" class="operation-parameter-type"> <span ng-switch-when="array" ng-bind="\'Array[\'+param.items.type+\']\'"></span> <span ng-switch-default ng-bind="param.type"></span> </td> <td ng-if="param.schema" class="operation-parameter-model"> <ul class="list-inline schema"> <li><a ng-click="param.schema.display=0" ng-class="{active:param.schema.display==0}" swagger-translate="parameterModel"></a></li> <li><a ng-click="param.schema.display=1" ng-class="{active:param.schema.display==1}" swagger-translate="parameterSchema"></a></li> </ul> <pre class="model" ng-if="param.schema.display==0" ng-bind-html="getModel(param,op.operationId,\'parameter\')"></pre> <div ng-if="param.schema.display==1"> <pre select-on-db-click class="model-schema" ng-bind="getSample(param,ui.form[op.id].contentType)" ng-click="ui.form[op.id][param.name]=getSample(param,ui.form[op.id].contentType)" aria-described-by="help-{{param.id}}"></pre> <div id="help-{{param.id}}" swagger-translate="parameterSetValue"></div> </div> '),a.put("templates/response.html",'<td ng-bind="code" class="operation-response-code"></td> <td ng-bind-html="resp.description" class="operation-response-description"></td> <td class="operation-response-model"> <ul ng-if="resp.schema" class="list-inline schema"> <li><a ng-click="resp.display=0" ng-class="{active:resp.display==0}" swagger-translate="responseModel"></a></li> <li><a ng-click="resp.display=1" ng-class="{active:resp.display==1}" swagger-translate="responseSchema"></a></li> </ul> <pre class="model" ng-if="resp.display==0&&resp.schema" ng-bind-html="getModel(resp,op.operationId,\'responses\')"></pre> <pre select-on-db-click class="model-schema" ng-if="resp.display==1&&resp.schema" ng-bind="getSample(resp,ui.form[op.id].responseType)"></pre> '),a.put("templates/swagger-ui.html",'<div class="swagger-ui" aria-live="polite" aria-relevant="additions removals"> <div class="api-name"> <h3 ng-bind="ui.infos.title"></h3> </div> <div ng-if="download!=null" class="download"> <a ng-href="{{url}}" target="_blank" swagger-translate="{{download.length==0?url:download}}"></a> </div> <div class="api-description" ng-bind-html="ui.infos.description"></div> <div class="external-docs" ng-if="ui.infos.externalDocs"> <span ng-bind-html="ui.infos.externalDocs.description"></span> <a target="_blank" ng-href="{{ui.infos.externalDocs.url}}">{{ui.infos.externalDocs.url}}</a> </div> <div class="api-infos"> <div class="api-infos-contact" ng-if="ui.infos.contact"> <div ng-if="ui.infos.contact.name" class="api-infos-contact-name"><span swagger-translate="infoContactCreatedBy" swagger-translate-value="ui.infos.contact"></span></div> <div ng-if="ui.infos.contact.url" class="api-infos-contact-url"><span swagger-translate="infoContactUrl"></span> <a ng-href="{{ui.infos.contact.url}}" ng-bind="ui.infos.contact.url"></a></div> <a ng-if="ui.infos.contact.email" class="api-infos-contact-url" ng-href="mailto:{{ui.infos.contact.email}}?subject={{ui.infos.title}}" swagger-translate="infoContactEmail"></a> </div> <div class="api-infos-license" ng-if="ui.infos.license"> <span swagger-translate="infoLicense"></span><a ng-href="{{ui.infos.license.url}}" ng-bind="ui.infos.license.name"></a> </div> </div> <ul class="list-unstyled endpoints"> <li ng-repeat="api in ui.resources track by $index" class="endpoint" ng-class="{active:api.open}" ng-include="\'templates/endpoint.html\'"></li> </ul> <div class="api-version clearfix" ng-if="ui.infos"> [<span swagger-translate="infoBaseUrl"></span>: <span class="h4" ng-bind="ui.infos.basePath"></span>, <span swagger-translate="infoApiVersion"></span>: <span class="h4" ng-bind="ui.infos.version"></span>, <span swagger-translate="infoHost"></span>: <span class="h4" ng-bind="ui.infos.scheme"></span>://<span class="h4" ng-bind="ui.infos.host"></span>] <a ng-if="validatorUrl!=\'false\'" target="_blank" ng-href="{{validatorUrl}}/debug?url={{url}}"><img class="pull-right swagger-validator" ng-src="{{validatorUrl}}?url={{url}}"></a> </div> </div>');
}]);