diff --git a/.gitignore b/.gitignore index b5ddaaf1..124495c4 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ reports/* swagger-ui.sublime-workspace .idea .project +node_modules/* diff --git a/Cakefile b/Cakefile index 247c29ca..c3a9a1b4 100644 --- a/Cakefile +++ b/Cakefile @@ -12,6 +12,8 @@ sourceFiles = [ 'view/ParameterView' 'view/SignatureView' 'view/ContentTypeView' + 'view/ResponseContentTypeView' + 'view/ParameterContentTypeView' ] diff --git a/dist/css/screen.css b/dist/css/screen.css index 06050e76..0d609496 100644 --- a/dist/css/screen.css +++ b/dist/css/screen.css @@ -1756,4 +1756,27 @@ pre code { .message-fail { color: #cc0000; +} + +.info_title { + padding-bottom: 10px; + font-weight: bold; + font-size: 25px; +} + +.info_description { + padding-bottom: 10px; + font-size: 15px; +} + +.info_tos { + padding-bottom: 5px; +} + +.info_license { + padding-bottom: 5px; +} + +.info_contact { + padding-bottom: 5px; } \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index 1d08ba4b..991b4310 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1,74 +1,78 @@ - Swagger UI - - - - - - - - - - - - - + Swagger UI + + + + + + + + + + + + + + + + +
-   +  
diff --git a/dist/lib/handlebars-1.0.0.js b/dist/lib/handlebars-1.0.0.js new file mode 100644 index 00000000..c70f09d1 --- /dev/null +++ b/dist/lib/handlebars-1.0.0.js @@ -0,0 +1,2278 @@ +/* + +Copyright (C) 2011 by Yehuda Katz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// lib/handlebars/browser-prefix.js +var Handlebars = {}; + +(function(Handlebars, undefined) { +; +// lib/handlebars/base.js + +Handlebars.VERSION = "1.0.0"; +Handlebars.COMPILER_REVISION = 4; + +Handlebars.REVISION_CHANGES = { + 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it + 2: '== 1.0.0-rc.3', + 3: '== 1.0.0-rc.4', + 4: '>= 1.0.0' +}; + +Handlebars.helpers = {}; +Handlebars.partials = {}; + +var toString = Object.prototype.toString, + functionType = '[object Function]', + objectType = '[object Object]'; + +Handlebars.registerHelper = function(name, fn, inverse) { + if (toString.call(name) === objectType) { + if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); } + Handlebars.Utils.extend(this.helpers, name); + } else { + if (inverse) { fn.not = inverse; } + this.helpers[name] = fn; + } +}; + +Handlebars.registerPartial = function(name, str) { + if (toString.call(name) === objectType) { + Handlebars.Utils.extend(this.partials, name); + } else { + this.partials[name] = str; + } +}; + +Handlebars.registerHelper('helperMissing', function(arg) { + if(arguments.length === 2) { + return undefined; + } else { + throw new Error("Missing helper: '" + arg + "'"); + } +}); + +Handlebars.registerHelper('blockHelperMissing', function(context, options) { + var inverse = options.inverse || function() {}, fn = options.fn; + + var type = toString.call(context); + + if(type === functionType) { context = context.call(this); } + + if(context === true) { + return fn(this); + } else if(context === false || context == null) { + return inverse(this); + } else if(type === "[object Array]") { + if(context.length > 0) { + return Handlebars.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + return fn(context); + } +}); + +Handlebars.K = function() {}; + +Handlebars.createFrame = Object.create || function(object) { + Handlebars.K.prototype = object; + var obj = new Handlebars.K(); + Handlebars.K.prototype = null; + return obj; +}; + +Handlebars.logger = { + DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3, + + methodMap: {0: 'debug', 1: 'info', 2: 'warn', 3: 'error'}, + + // can be overridden in the host environment + log: function(level, obj) { + if (Handlebars.logger.level <= level) { + var method = Handlebars.logger.methodMap[level]; + if (typeof console !== 'undefined' && console[method]) { + console[method].call(console, obj); + } + } + } +}; + +Handlebars.log = function(level, obj) { Handlebars.logger.log(level, obj); }; + +Handlebars.registerHelper('each', function(context, options) { + var fn = options.fn, inverse = options.inverse; + var i = 0, ret = "", data; + + var type = toString.call(context); + if(type === functionType) { context = context.call(this); } + + if (options.data) { + data = Handlebars.createFrame(options.data); + } + + if(context && typeof context === 'object') { + if(context instanceof Array){ + for(var j = context.length; i 2) { + expected.push("'" + this.terminals_[p] + "'"); + } + if (this.lexer.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); + } + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(this.lexer.yytext); + lstack.push(this.lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + if (recovering > 0) + recovering--; + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column}; + if (ranges) { + yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; + } + r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; +} +}; +/* Jison generated lexer */ +var lexer = (function(){ +var lexer = ({EOF:1, +parseError:function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, +setInput:function (input) { + this._input = input; + this._more = this._less = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; + if (this.options.ranges) this.yylloc.range = [0,0]; + this.offset = 0; + return this; + }, +input:function () { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) this.yylloc.range[1]++; + + this._input = this._input.slice(1); + return ch; + }, +unput:function (ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length-len-1); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length-1); + this.matched = this.matched.substr(0, this.matched.length-1); + + if (lines.length-1) this.yylineno -= lines.length-1; + var r = this.yylloc.range; + + this.yylloc = {first_line: this.yylloc.first_line, + last_line: this.yylineno+1, + first_column: this.yylloc.first_column, + last_column: lines ? + (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length: + this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + return this; + }, +more:function () { + this._more = true; + return this; + }, +less:function (n) { + this.unput(this.match.slice(n)); + }, +pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, +upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); + }, +showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c+"^"; + }, +next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) this.done = true; + + var token, + match, + tempMatch, + index, + col, + lines; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i=0;i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (!this.options.flex) break; + } + } + if (match) { + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) this.yylineno += lines.length; + this.yylloc = {first_line: this.yylloc.last_line, + last_line: this.yylineno+1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length}; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); + if (this.done && this._input) this.done = false; + if (token) return token; + else return; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), + {text: "", token: null, line: this.yylineno}); + } + }, +lex:function lex() { + var r = this.next(); + if (typeof r !== 'undefined') { + return r; + } else { + return this.lex(); + } + }, +begin:function begin(condition) { + this.conditionStack.push(condition); + }, +popState:function popState() { + return this.conditionStack.pop(); + }, +_currentRules:function _currentRules() { + return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; + }, +topState:function () { + return this.conditionStack[this.conditionStack.length-2]; + }, +pushState:function begin(condition) { + this.begin(condition); + }}); +lexer.options = {}; +lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { + +var YYSTATE=YY_START +switch($avoiding_name_collisions) { +case 0: yy_.yytext = "\\"; return 14; +break; +case 1: + if(yy_.yytext.slice(-1) !== "\\") this.begin("mu"); + if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1), this.begin("emu"); + if(yy_.yytext) return 14; + +break; +case 2: return 14; +break; +case 3: + if(yy_.yytext.slice(-1) !== "\\") this.popState(); + if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1); + return 14; + +break; +case 4: yy_.yytext = yy_.yytext.substr(0, yy_.yyleng-4); this.popState(); return 15; +break; +case 5: return 25; +break; +case 6: return 16; +break; +case 7: return 20; +break; +case 8: return 19; +break; +case 9: return 19; +break; +case 10: return 23; +break; +case 11: return 22; +break; +case 12: this.popState(); this.begin('com'); +break; +case 13: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15; +break; +case 14: return 22; +break; +case 15: return 37; +break; +case 16: return 36; +break; +case 17: return 36; +break; +case 18: return 40; +break; +case 19: /*ignore whitespace*/ +break; +case 20: this.popState(); return 24; +break; +case 21: this.popState(); return 18; +break; +case 22: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 31; +break; +case 23: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\'/g,"'"); return 31; +break; +case 24: return 38; +break; +case 25: return 33; +break; +case 26: return 33; +break; +case 27: return 32; +break; +case 28: return 36; +break; +case 29: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 36; +break; +case 30: return 'INVALID'; +break; +case 31: return 5; +break; +} +}; +lexer.rules = [/^(?:\\\\(?=(\{\{)))/,/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\{\{>)/,/^(?:\{\{#)/,/^(?:\{\{\/)/,/^(?:\{\{\^)/,/^(?:\{\{\s*else\b)/,/^(?:\{\{\{)/,/^(?:\{\{&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{)/,/^(?:=)/,/^(?:\.(?=[}\/ ]))/,/^(?:\.\.)/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}\}\})/,/^(?:\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=[}\s]))/,/^(?:false(?=[}\s]))/,/^(?:-?[0-9]+(?=[}\s]))/,/^(?:[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/]; +lexer.conditions = {"mu":{"rules":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],"inclusive":false},"emu":{"rules":[3],"inclusive":false},"com":{"rules":[4],"inclusive":false},"INITIAL":{"rules":[0,1,2,31],"inclusive":true}}; +return lexer;})() +parser.lexer = lexer; +function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser; +return new Parser; +})();; +// lib/handlebars/compiler/base.js + +Handlebars.Parser = handlebars; + +Handlebars.parse = function(input) { + + // Just return if an already-compile AST was passed in. + if(input.constructor === Handlebars.AST.ProgramNode) { return input; } + + Handlebars.Parser.yy = Handlebars.AST; + return Handlebars.Parser.parse(input); +}; +; +// lib/handlebars/compiler/ast.js +Handlebars.AST = {}; + +Handlebars.AST.ProgramNode = function(statements, inverse) { + this.type = "program"; + this.statements = statements; + if(inverse) { this.inverse = new Handlebars.AST.ProgramNode(inverse); } +}; + +Handlebars.AST.MustacheNode = function(rawParams, hash, unescaped) { + this.type = "mustache"; + this.escaped = !unescaped; + this.hash = hash; + + var id = this.id = rawParams[0]; + var params = this.params = rawParams.slice(1); + + // a mustache is an eligible helper if: + // * its id is simple (a single part, not `this` or `..`) + var eligibleHelper = this.eligibleHelper = id.isSimple; + + // a mustache is definitely a helper if: + // * it is an eligible helper, and + // * it has at least one parameter or hash segment + this.isHelper = eligibleHelper && (params.length || hash); + + // if a mustache is an eligible helper but not a definite + // helper, it is ambiguous, and will be resolved in a later + // pass or at runtime. +}; + +Handlebars.AST.PartialNode = function(partialName, context) { + this.type = "partial"; + this.partialName = partialName; + this.context = context; +}; + +Handlebars.AST.BlockNode = function(mustache, program, inverse, close) { + var verifyMatch = function(open, close) { + if(open.original !== close.original) { + throw new Handlebars.Exception(open.original + " doesn't match " + close.original); + } + }; + + verifyMatch(mustache.id, close); + this.type = "block"; + this.mustache = mustache; + this.program = program; + this.inverse = inverse; + + if (this.inverse && !this.program) { + this.isInverse = true; + } +}; + +Handlebars.AST.ContentNode = function(string) { + this.type = "content"; + this.string = string; +}; + +Handlebars.AST.HashNode = function(pairs) { + this.type = "hash"; + this.pairs = pairs; +}; + +Handlebars.AST.IdNode = function(parts) { + this.type = "ID"; + + var original = "", + dig = [], + depth = 0; + + for(var i=0,l=parts.length; i 0) { throw new Handlebars.Exception("Invalid path: " + original); } + else if (part === "..") { depth++; } + else { this.isScoped = true; } + } + else { dig.push(part); } + } + + this.original = original; + this.parts = dig; + this.string = dig.join('.'); + this.depth = depth; + + // an ID is simple if it only has one part, and that part is not + // `..` or `this`. + this.isSimple = parts.length === 1 && !this.isScoped && depth === 0; + + this.stringModeValue = this.string; +}; + +Handlebars.AST.PartialNameNode = function(name) { + this.type = "PARTIAL_NAME"; + this.name = name.original; +}; + +Handlebars.AST.DataNode = function(id) { + this.type = "DATA"; + this.id = id; +}; + +Handlebars.AST.StringNode = function(string) { + this.type = "STRING"; + this.original = + this.string = + this.stringModeValue = string; +}; + +Handlebars.AST.IntegerNode = function(integer) { + this.type = "INTEGER"; + this.original = + this.integer = integer; + this.stringModeValue = Number(integer); +}; + +Handlebars.AST.BooleanNode = function(bool) { + this.type = "BOOLEAN"; + this.bool = bool; + this.stringModeValue = bool === "true"; +}; + +Handlebars.AST.CommentNode = function(comment) { + this.type = "comment"; + this.comment = comment; +}; +; +// lib/handlebars/utils.js + +var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; + +Handlebars.Exception = function(message) { + var tmp = Error.prototype.constructor.apply(this, arguments); + + // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. + for (var idx = 0; idx < errorProps.length; idx++) { + this[errorProps[idx]] = tmp[errorProps[idx]]; + } +}; +Handlebars.Exception.prototype = new Error(); + +// Build out our basic SafeString type +Handlebars.SafeString = function(string) { + this.string = string; +}; +Handlebars.SafeString.prototype.toString = function() { + return this.string.toString(); +}; + +var escape = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + "`": "`" +}; + +var badChars = /[&<>"'`]/g; +var possible = /[&<>"'`]/; + +var escapeChar = function(chr) { + return escape[chr] || "&"; +}; + +Handlebars.Utils = { + extend: function(obj, value) { + for(var key in value) { + if(value.hasOwnProperty(key)) { + obj[key] = value[key]; + } + } + }, + + escapeExpression: function(string) { + // don't escape SafeStrings, since they're already safe + if (string instanceof Handlebars.SafeString) { + return string.toString(); + } else if (string == null || string === false) { + return ""; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = string.toString(); + + if(!possible.test(string)) { return string; } + return string.replace(badChars, escapeChar); + }, + + isEmpty: function(value) { + if (!value && value !== 0) { + return true; + } else if(toString.call(value) === "[object Array]" && value.length === 0) { + return true; + } else { + return false; + } + } +}; +; +// lib/handlebars/compiler/compiler.js + +/*jshint eqnull:true*/ +var Compiler = Handlebars.Compiler = function() {}; +var JavaScriptCompiler = Handlebars.JavaScriptCompiler = function() {}; + +// the foundHelper register will disambiguate helper lookup from finding a +// function in a context. This is necessary for mustache compatibility, which +// requires that context functions in blocks are evaluated by blockHelperMissing, +// and then proceed as if the resulting value was provided to blockHelperMissing. + +Compiler.prototype = { + compiler: Compiler, + + disassemble: function() { + var opcodes = this.opcodes, opcode, out = [], params, param; + + for (var i=0, l=opcodes.length; i 0) { + this.source[1] = this.source[1] + ", " + locals.join(", "); + } + + // Generate minimizer alias mappings + if (!this.isChild) { + for (var alias in this.context.aliases) { + if (this.context.aliases.hasOwnProperty(alias)) { + this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias]; + } + } + } + + if (this.source[1]) { + this.source[1] = "var " + this.source[1].substring(2) + ";"; + } + + // Merge children + if (!this.isChild) { + this.source[1] += '\n' + this.context.programs.join('\n') + '\n'; + } + + if (!this.environment.isSimple) { + this.source.push("return buffer;"); + } + + var params = this.isChild ? ["depth0", "data"] : ["Handlebars", "depth0", "helpers", "partials", "data"]; + + for(var i=0, l=this.environment.depths.list.length; i this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); } + return this.topStackName(); + }, + topStackName: function() { + return "stack" + this.stackSlot; + }, + flushInline: function() { + var inlineStack = this.inlineStack; + if (inlineStack.length) { + this.inlineStack = []; + for (var i = 0, len = inlineStack.length; i < len; i++) { + var entry = inlineStack[i]; + if (entry instanceof Literal) { + this.compileStack.push(entry); + } else { + this.pushStack(entry); + } + } + } + }, + isInline: function() { + return this.inlineStack.length; + }, + + popStack: function(wrapped) { + var inline = this.isInline(), + item = (inline ? this.inlineStack : this.compileStack).pop(); + + if (!wrapped && (item instanceof Literal)) { + return item.value; + } else { + if (!inline) { + this.stackSlot--; + } + return item; + } + }, + + topStack: function(wrapped) { + var stack = (this.isInline() ? this.inlineStack : this.compileStack), + item = stack[stack.length - 1]; + + if (!wrapped && (item instanceof Literal)) { + return item.value; + } else { + return item; + } + }, + + quotedString: function(str) { + return '"' + str + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + .replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 + .replace(/\u2029/g, '\\u2029') + '"'; + }, + + setupHelper: function(paramSize, name, missingParams) { + var params = []; + this.setupParams(paramSize, params, missingParams); + var foundHelper = this.nameLookup('helpers', name, 'helper'); + + return { + params: params, + name: foundHelper, + callParams: ["depth0"].concat(params).join(", "), + helperMissingParams: missingParams && ["depth0", this.quotedString(name)].concat(params).join(", ") + }; + }, + + // the params and contexts arguments are passed in arrays + // to fill in + setupParams: function(paramSize, params, useRegister) { + var options = [], contexts = [], types = [], param, inverse, program; + + options.push("hash:" + this.popStack()); + + inverse = this.popStack(); + program = this.popStack(); + + // Avoid setting fn and inverse if neither are set. This allows + // helpers to do a check for `if (options.fn)` + if (program || inverse) { + if (!program) { + this.context.aliases.self = "this"; + program = "self.noop"; + } + + if (!inverse) { + this.context.aliases.self = "this"; + inverse = "self.noop"; + } + + options.push("inverse:" + inverse); + options.push("fn:" + program); + } + + for(var i=0; i 0) { - return Handlebars.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - return fn(context); - } -}); - -Handlebars.K = function() {}; - -Handlebars.createFrame = Object.create || function(object) { - Handlebars.K.prototype = object; - var obj = new Handlebars.K(); - Handlebars.K.prototype = null; - return obj; -}; - -Handlebars.registerHelper('each', function(context, options) { - var fn = options.fn, inverse = options.inverse; - var ret = "", data; - - if (options.data) { - data = Handlebars.createFrame(options.data); - } - - if(context && context.length > 0) { - for(var i=0, j=context.length; i 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column}; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; -} -}; -/* Jison generated lexer */ -var lexer = (function(){ -var lexer = ({EOF:1, -parseError:function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, -setInput:function (input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; - if (this.options.ranges) this.yylloc.range = [0,0]; - this.offset = 0; - return this; - }, -input:function () { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, -unput:function (ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length-len-1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length-1); - this.matched = this.matched.substr(0, this.matched.length-1); - - if (lines.length-1) this.yylineno -= lines.length-1; - var r = this.yylloc.range; - - this.yylloc = {first_line: this.yylloc.first_line, - last_line: this.yylineno+1, - first_column: this.yylloc.first_column, - last_column: lines ? - (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length: - this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, -more:function () { - this._more = true; - return this; - }, -less:function (n) { - this.unput(this.match.slice(n)); - }, -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); - }, -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c+"^"; - }, -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, - match, - tempMatch, - index, - col, - lines; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i=0;i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = {first_line: this.yylloc.last_line, - last_line: this.yylineno+1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length}; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); - if (this.done && this._input) this.done = false; - if (token) return token; - else return; - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), - {text: "", token: null, line: this.yylineno}); - } - }, -lex:function lex() { - var r = this.next(); - if (typeof r !== 'undefined') { - return r; - } else { - return this.lex(); - } - }, -begin:function begin(condition) { - this.conditionStack.push(condition); - }, -popState:function popState() { - return this.conditionStack.pop(); - }, -_currentRules:function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; - }, -topState:function () { - return this.conditionStack[this.conditionStack.length-2]; - }, -pushState:function begin(condition) { - this.begin(condition); - }}); -lexer.options = {}; -lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { - -var YYSTATE=YY_START -switch($avoiding_name_collisions) { -case 0: - if(yy_.yytext.slice(-1) !== "\\") this.begin("mu"); - if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1), this.begin("emu"); - if(yy_.yytext) return 14; - -break; -case 1: return 14; -break; -case 2: - if(yy_.yytext.slice(-1) !== "\\") this.popState(); - if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1); - return 14; - -break; -case 3: return 24; -break; -case 4: return 16; -break; -case 5: return 20; -break; -case 6: return 19; -break; -case 7: return 19; -break; -case 8: return 23; -break; -case 9: return 23; -break; -case 10: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15; -break; -case 11: return 22; -break; -case 12: return 35; -break; -case 13: return 34; -break; -case 14: return 34; -break; -case 15: return 37; -break; -case 16: /*ignore whitespace*/ -break; -case 17: this.popState(); return 18; -break; -case 18: this.popState(); return 18; -break; -case 19: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 29; -break; -case 20: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 29; -break; -case 21: yy_.yytext = yy_.yytext.substr(1); return 27; -break; -case 22: return 31; -break; -case 23: return 31; -break; -case 24: return 30; -break; -case 25: return 34; -break; -case 26: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 34; -break; -case 27: return 'INVALID'; -break; -case 28: return 5; -break; -} -}; -lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:\{\{>)/,/^(?:\{\{#)/,/^(?:\{\{\/)/,/^(?:\{\{\^)/,/^(?:\{\{\s*else\b)/,/^(?:\{\{\{)/,/^(?:\{\{&)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{)/,/^(?:=)/,/^(?:\.(?=[} ]))/,/^(?:\.\.)/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}\}\})/,/^(?:\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@[a-zA-Z]+)/,/^(?:true(?=[}\s]))/,/^(?:false(?=[}\s]))/,/^(?:[0-9]+(?=[}\s]))/,/^(?:[a-zA-Z0-9_$-]+(?=[=}\s\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/]; -lexer.conditions = {"mu":{"rules":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"INITIAL":{"rules":[0,1,28],"inclusive":true}}; -return lexer;})() -parser.lexer = lexer; -function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})(); -if (typeof require !== 'undefined' && typeof exports !== 'undefined') { -exports.parser = handlebars; -exports.Parser = handlebars.Parser; -exports.parse = function () { return handlebars.parse.apply(handlebars, arguments); } -exports.main = function commonjsMain(args) { - if (!args[1]) - throw new Error('Usage: '+args[0]+' FILE'); - var source, cwd; - if (typeof process !== 'undefined') { - source = require('fs').readFileSync(require('path').resolve(args[1]), "utf8"); - } else { - source = require("file").path(require("file").cwd()).join(args[1]).read({charset: "utf-8"}); - } - return exports.parser.parse(source); -} -if (typeof module !== 'undefined' && require.main === module) { - exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args); -} -}; -; -// lib/handlebars/compiler/base.js -Handlebars.Parser = handlebars; - -Handlebars.parse = function(string) { - Handlebars.Parser.yy = Handlebars.AST; - return Handlebars.Parser.parse(string); -}; - -Handlebars.print = function(ast) { - return new Handlebars.PrintVisitor().accept(ast); -}; - -Handlebars.logger = { - DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3, - - // override in the host environment - log: function(level, str) {} -}; - -Handlebars.log = function(level, str) { Handlebars.logger.log(level, str); }; -; -// lib/handlebars/compiler/ast.js -(function() { - - Handlebars.AST = {}; - - Handlebars.AST.ProgramNode = function(statements, inverse) { - this.type = "program"; - this.statements = statements; - if(inverse) { this.inverse = new Handlebars.AST.ProgramNode(inverse); } - }; - - Handlebars.AST.MustacheNode = function(rawParams, hash, unescaped) { - this.type = "mustache"; - this.escaped = !unescaped; - this.hash = hash; - - var id = this.id = rawParams[0]; - var params = this.params = rawParams.slice(1); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - var eligibleHelper = this.eligibleHelper = id.isSimple; - - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - this.isHelper = eligibleHelper && (params.length || hash); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - }; - - Handlebars.AST.PartialNode = function(id, context) { - this.type = "partial"; - - // TODO: disallow complex IDs - - this.id = id; - this.context = context; - }; - - var verifyMatch = function(open, close) { - if(open.original !== close.original) { - throw new Handlebars.Exception(open.original + " doesn't match " + close.original); - } - }; - - Handlebars.AST.BlockNode = function(mustache, program, inverse, close) { - verifyMatch(mustache.id, close); - this.type = "block"; - this.mustache = mustache; - this.program = program; - this.inverse = inverse; - - if (this.inverse && !this.program) { - this.isInverse = true; - } - }; - - Handlebars.AST.ContentNode = function(string) { - this.type = "content"; - this.string = string; - }; - - Handlebars.AST.HashNode = function(pairs) { - this.type = "hash"; - this.pairs = pairs; - }; - - Handlebars.AST.IdNode = function(parts) { - this.type = "ID"; - this.original = parts.join("."); - - var dig = [], depth = 0; - - for(var i=0,l=parts.length; i": ">", - '"': """, - "'": "'", - "`": "`" - }; - - var badChars = /[&<>"'`]/g; - var possible = /[&<>"'`]/; - - var escapeChar = function(chr) { - return escape[chr] || "&"; - }; - - Handlebars.Utils = { - escapeExpression: function(string) { - // don't escape SafeStrings, since they're already safe - if (string instanceof Handlebars.SafeString) { - return string.toString(); - } else if (string == null || string === false) { - return ""; - } - - if(!possible.test(string)) { return string; } - return string.replace(badChars, escapeChar); - }, - - isEmpty: function(value) { - if (typeof value === "undefined") { - return true; - } else if (value === null) { - return true; - } else if (value === false) { - return true; - } else if(Object.prototype.toString.call(value) === "[object Array]" && value.length === 0) { - return true; - } else { - return false; - } - } - }; -})();; -// lib/handlebars/compiler/compiler.js - -/*jshint eqnull:true*/ -Handlebars.Compiler = function() {}; -Handlebars.JavaScriptCompiler = function() {}; - -(function(Compiler, JavaScriptCompiler) { - // the foundHelper register will disambiguate helper lookup from finding a - // function in a context. This is necessary for mustache compatibility, which - // requires that context functions in blocks are evaluated by blockHelperMissing, - // and then proceed as if the resulting value was provided to blockHelperMissing. - - Compiler.prototype = { - compiler: Compiler, - - disassemble: function() { - var opcodes = this.opcodes, opcode, out = [], params, param; - - for (var i=0, l=opcodes.length; i 0) { - this.source[1] = this.source[1] + ", " + locals.join(", "); - } - - // Generate minimizer alias mappings - if (!this.isChild) { - var aliases = []; - for (var alias in this.context.aliases) { - this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias]; - } - } - - if (this.source[1]) { - this.source[1] = "var " + this.source[1].substring(2) + ";"; - } - - // Merge children - if (!this.isChild) { - this.source[1] += '\n' + this.context.programs.join('\n') + '\n'; - } - - if (!this.environment.isSimple) { - this.source.push("return buffer;"); - } - - var params = this.isChild ? ["depth0", "data"] : ["Handlebars", "depth0", "helpers", "partials", "data"]; - - for(var i=0, l=this.environment.depths.list.length; i this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); } - return "stack" + this.stackSlot; - }, - - popStack: function() { - var item = this.compileStack.pop(); - - if (item instanceof Literal) { - return item.value; - } else { - this.stackSlot--; - return item; - } - }, - - topStack: function() { - var item = this.compileStack[this.compileStack.length - 1]; - - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - quotedString: function(str) { - return '"' + str - .replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') + '"'; - }, - - setupHelper: function(paramSize, name) { - var params = []; - this.setupParams(paramSize, params); - var foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - name: foundHelper, - callParams: ["depth0"].concat(params).join(", "), - helperMissingParams: ["depth0", this.quotedString(name)].concat(params).join(", ") - }; - }, - - // the params and contexts arguments are passed in arrays - // to fill in - setupParams: function(paramSize, params) { - var options = [], contexts = [], param, inverse, program; - - options.push("hash:" + this.popStack()); - - inverse = this.popStack(); - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - if (!program) { - this.context.aliases.self = "this"; - program = "self.noop"; - } - - if (!inverse) { - this.context.aliases.self = "this"; - inverse = "self.noop"; - } - - options.push("inverse:" + inverse); - options.push("fn:" + program); - } - - for(var i=0; i= 0; i--) { + if (parts[i] === 'node_modules') continue; + var dir = parts.slice(0, i + 1).join('/') + '/node_modules'; + dirs.push(dir); + } + + return dirs; + } + }; +})(); + +require.alias = function (from, to) { + var path = require.modules.path(); + var res = null; + try { + res = require.resolve(from + '/package.json', '/'); + } + catch (err) { + res = require.resolve(from, '/'); + } + var basedir = path.dirname(res); + + var keys = (Object.keys || function (obj) { + var res = []; + for (var key in obj) res.push(key) + return res; + })(require.modules); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (key.slice(0, basedir.length + 1) === basedir + '/') { + var f = key.slice(basedir.length); + require.modules[to + f] = require.modules[basedir + f]; + } + else if (key === basedir) { + require.modules[to] = require.modules[basedir]; + } + } +}; + +require.define = function (filename, fn) { + var dirname = require._core[filename] + ? '' + : require.modules.path().dirname(filename) + ; + + var require_ = function (file) { + return require(file, dirname) + }; + require_.resolve = function (name) { + return require.resolve(name, dirname); + }; + require_.modules = require.modules; + require_.define = require.define; + var module_ = { exports : {} }; + + require.modules[filename] = function () { + require.modules[filename]._cached = module_.exports; + fn.call( + module_.exports, + require_, + module_, + module_.exports, + dirname, + filename + ); + require.modules[filename]._cached = module_.exports; + return module_.exports; + }; +}; + +if (typeof process === 'undefined') process = {}; + +if (!process.nextTick) process.nextTick = (function () { + var queue = []; + var canPost = typeof window !== 'undefined' + && window.postMessage && window.addEventListener + ; + + if (canPost) { + window.addEventListener('message', function (ev) { + if (ev.source === window && ev.data === 'browserify-tick') { + ev.stopPropagation(); + if (queue.length > 0) { + var fn = queue.shift(); + fn(); + } + } + }, true); + } + + return function (fn) { + if (canPost) { + queue.push(fn); + window.postMessage('browserify-tick', '*'); + } + else setTimeout(fn, 0); + }; +})(); + +if (!process.title) process.title = 'browser'; + +if (!process.binding) process.binding = function (name) { + if (name === 'evals') return require('vm') + else throw new Error('No such module') +}; + +if (!process.cwd) process.cwd = function () { return '.' }; + +require.define("path", function (require, module, exports, __dirname, __filename) { + function filter (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + if (fn(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length; i >= 0; i--) { + var last = parts[i]; + if (last == '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// Regex to split a filename into [*, dir, basename, ext] +// posix version +var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/; + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { +var resolvedPath = '', + resolvedAbsolute = false; + +for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) + ? arguments[i] + : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string' || !path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; +} + +// At this point the path should be resolved to a full absolute path, but +// handle relative paths to be safe (might happen when process.cwd() fails) + +// Normalize the path +resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { +var isAbsolute = path.charAt(0) === '/', + trailingSlash = path.slice(-1) === '/'; + +// Normalize the path +path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + return p && typeof p === 'string'; + }).join('/')); +}; + + +exports.dirname = function(path) { + var dir = splitPathRe.exec(path)[1] || ''; + var isWindows = false; + if (!dir) { + // No dirname + return '.'; + } else if (dir.length === 1 || + (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) { + // It is just a slash or a drive letter with a slash + return dir; + } else { + // It is a full dirname, strip trailing slash + return dir.substring(0, dir.length - 1); + } +}; + + +exports.basename = function(path, ext) { + var f = splitPathRe.exec(path)[2] || ''; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + + +exports.extname = function(path) { + return splitPathRe.exec(path)[3] || ''; +}; + +}); + +require.define("/shred.js", function (require, module, exports, __dirname, __filename) { + // Shred is an HTTP client library intended to simplify the use of Node's +// built-in HTTP library. In particular, we wanted to make it easier to interact +// with HTTP-based APIs. +// +// See the [examples](./examples.html) for more details. + +// Ax is a nice logging library we wrote. You can use any logger, providing it +// has `info`, `warn`, `debug`, and `error` methods that take a string. +var Ax = require("ax") + , CookieJarLib = require( "cookiejar" ) + , CookieJar = CookieJarLib.CookieJar +; + +// Shred takes some options, including a logger and request defaults. + +var Shred = function(options) { + options = (options||{}); + this.agent = options.agent; + this.defaults = options.defaults||{}; + this.log = options.logger||(new Ax({ level: "info" })); + this._sharedCookieJar = new CookieJar(); + this.logCurl = options.logCurl || false; +}; + +// Most of the real work is done in the request and reponse classes. + +Shred.Request = require("./shred/request"); +Shred.Response = require("./shred/response"); + +// The `request` method kicks off a new request, instantiating a new `Request` +// object and passing along whatever default options we were given. + +Shred.prototype = { + request: function(options) { + options.logger = this.log; + options.logCurl = options.logCurl || this.logCurl; + options.cookieJar = ( 'cookieJar' in options ) ? options.cookieJar : this._sharedCookieJar; // let them set cookieJar = null + options.agent = options.agent || this.agent; + // fill in default options + for (var key in this.defaults) { + if (this.defaults.hasOwnProperty(key) && !options[key]) { + options[key] = this.defaults[key] + } + } + return new Shred.Request(options); + } +}; + +// Define a bunch of convenience methods so that you don't have to include +// a `method` property in your request options. + +"get put post delete".split(" ").forEach(function(method) { + Shred.prototype[method] = function(options) { + options.method = method; + return this.request(options); + }; +}); + + +module.exports = Shred; + +}); + +require.define("/node_modules/ax/package.json", function (require, module, exports, __dirname, __filename) { + module.exports = {"main":"./lib/ax.js"} +}); + +require.define("/node_modules/ax/lib/ax.js", function (require, module, exports, __dirname, __filename) { + var inspect = require("util").inspect + , fs = require("fs") +; + + +// this is a quick-and-dirty logger. there are other nicer loggers out there +// but the ones i found were also somewhat involved. this one has a Ruby +// logger type interface +// +// we can easily replace this, provide the info, debug, etc. methods are the +// same. or, we can change Haiku to use a more standard node.js interface + +var format = function(level,message) { + var debug = (level=="debug"||level=="error"); + if (!message) { return message.toString(); } + if (typeof(message) == "object") { + if (message instanceof Error && debug) { + return message.stack; + } else { + return inspect(message); + } + } else { + return message.toString(); + } +}; + +var noOp = function(message) { return this; } +var makeLogger = function(level,fn) { + return function(message) { + this.stream.write(this.format(level, message)+"\n"); + return this; + } +}; + +var Logger = function(options) { + var logger = this; + var options = options||{}; + + // Default options + options.level = options.level || "info"; + options.timestamp = options.timestamp || true; + options.prefix = options.prefix || ""; + logger.options = options; + + // Allows a prefix to be added to the message. + // + // var logger = new Ax({ module: 'Haiku' }) + // logger.warn('this is going to be awesome!'); + // //=> Haiku: this is going to be awesome! + // + if (logger.options.module){ + logger.options.prefix = logger.options.module; + } + + // Write to stderr or a file + if (logger.options.file){ + logger.stream = fs.createWriteStream(logger.options.file, {"flags": "a"}); + } else { + if(process.title === "node") + logger.stream = process.stderr; + else if(process.title === "browser") + logger.stream = function () { + // Work around weird console context issue: http://code.google.com/p/chromium/issues/detail?id=48662 + return console[logger.options.level].apply(console, arguments); + }; + } + + switch(logger.options.level){ + case 'debug': + ['debug', 'info', 'warn'].forEach(function (level) { + logger[level] = Logger.writer(level); + }); + case 'info': + ['info', 'warn'].forEach(function (level) { + logger[level] = Logger.writer(level); + }); + case 'warn': + logger.warn = Logger.writer('warn'); + } +} + +// Used to define logger methods +Logger.writer = function(level){ + return function(message){ + var logger = this; + + if(process.title === "node") + logger.stream.write(logger.format(level, message) + '\n'); + else if(process.title === "browser") + logger.stream(logger.format(level, message) + '\n'); + + }; +} + + +Logger.prototype = { + info: function(){}, + debug: function(){}, + warn: function(){}, + error: Logger.writer('error'), + format: function(level, message){ + if (! message) return ''; + + var logger = this + , prefix = logger.options.prefix + , timestamp = logger.options.timestamp ? " " + (new Date().toISOString()) : "" + ; + + return (prefix + timestamp + ": " + message); + } +}; + +module.exports = Logger; + +}); + +require.define("util", function (require, module, exports, __dirname, __filename) { + // todo + +}); + +require.define("fs", function (require, module, exports, __dirname, __filename) { + // nothing to see here... no file methods for the browser + +}); + +require.define("/node_modules/cookiejar/package.json", function (require, module, exports, __dirname, __filename) { + module.exports = {"main":"cookiejar.js"} +}); + +require.define("/node_modules/cookiejar/cookiejar.js", function (require, module, exports, __dirname, __filename) { + exports.CookieAccessInfo=CookieAccessInfo=function CookieAccessInfo(domain,path,secure,script) { + if(this instanceof CookieAccessInfo) { + this.domain=domain||undefined; + this.path=path||"/"; + this.secure=!!secure; + this.script=!!script; + return this; + } + else { + return new CookieAccessInfo(domain,path,secure,script) + } +} + +exports.Cookie=Cookie=function Cookie(cookiestr) { + if(cookiestr instanceof Cookie) { + return cookiestr; + } + else { + if(this instanceof Cookie) { + this.name = null; + this.value = null; + this.expiration_date = Infinity; + this.path = "/"; + this.domain = null; + this.secure = false; //how to define? + this.noscript = false; //httponly + if(cookiestr) { + this.parse(cookiestr) + } + return this; + } + return new Cookie(cookiestr) + } +} + +Cookie.prototype.toString = function toString() { + var str=[this.name+"="+this.value]; + if(this.expiration_date !== Infinity) { + str.push("expires="+(new Date(this.expiration_date)).toGMTString()); + } + if(this.domain) { + str.push("domain="+this.domain); + } + if(this.path) { + str.push("path="+this.path); + } + if(this.secure) { + str.push("secure"); + } + if(this.noscript) { + str.push("httponly"); + } + return str.join("; "); +} + +Cookie.prototype.toValueString = function toValueString() { + return this.name+"="+this.value; +} + +var cookie_str_splitter=/[:](?=\s*[a-zA-Z0-9_\-]+\s*[=])/g +Cookie.prototype.parse = function parse(str) { + if(this instanceof Cookie) { + var parts=str.split(";") + , pair=parts[0].match(/([^=]+)=((?:.|\n)*)/) + , key=pair[1] + , value=pair[2]; + this.name = key; + this.value = value; + + for(var i=1;i ", request.method.toUpperCase(), + request.url].join(" ") + return [ summary, "- Headers:", headers].join("\n"); +}; + +Request.prototype.format_headers = function () { + var array = [] + var headers = this._headers + for (var key in headers) { + if (headers.hasOwnProperty(key)) { + var value = headers[key] + array.push("\t" + key + ": " + value); + } + } + return array.join("\n"); +}; + +// Allow chainable 'on's: shred.get({ ... }).on( ... ). You can pass in a +// single function, a pair (event, function), or a hash: +// { event: function, event: function } +Request.prototype.on = function (eventOrHash, listener) { + var emitter = this.emitter; + // Pass in a single argument as a function then make it the default response handler + if (arguments.length === 1 && typeof(eventOrHash) === 'function') { + emitter.on('response', eventOrHash); + } else if (arguments.length === 1 && typeof(eventOrHash) === 'object') { + for (var key in eventOrHash) { + if (eventOrHash.hasOwnProperty(key)) { + emitter.on(key, eventOrHash[key]); + } + } + } else { + emitter.on(eventOrHash, listener); + } + return this; +}; + +// Add in the header methods. Again, these ensure we don't get the same header +// multiple times with different case conventions. +HeaderMixins.gettersAndSetters(Request); + +// `processOptions` is called from the constructor to handle all the work +// associated with making sure we do our best to ensure we have a valid request. + +var processOptions = function(request,options) { + + request.log.debug("Processing request options .."); + + // We'll use `request.emitter` to manage the `on` event handlers. + request.emitter = (new Emitter); + + request.agent = options.agent; + + // Set up the handlers ... + if (options.on) { + for (var key in options.on) { + if (options.on.hasOwnProperty(key)) { + request.emitter.on(key, options.on[key]); + } + } + } + + // Make sure we were give a URL or a host + if (!options.url && !options.host) { + request.emitter.emit("request_error", + new Error("No url or url options (host, port, etc.)")); + return; + } + + // Allow for the [use of a proxy](http://www.jmarshall.com/easy/http/#proxies). + + if (options.url) { + if (options.proxy) { + request.url = options.proxy; + request.path = options.url; + } else { + request.url = options.url; + } + } + + // Set the remaining options. + request.query = options.query||options.parameters||request.query ; + request.method = options.method; + request.setHeader("user-agent",options.agent||"Shred"); + request.setHeaders(options.headers); + + if (request.cookieJar) { + var cookies = request.cookieJar.getCookies( CookieAccessInfo( request.host, request.path ) ); + if (cookies.length) { + var cookieString = request.getHeader('cookie')||''; + for (var cookieIndex = 0; cookieIndex < cookies.length; ++cookieIndex) { + if ( cookieString.length && cookieString[ cookieString.length - 1 ] != ';' ) + { + cookieString += ';'; + } + cookieString += cookies[ cookieIndex ].name + '=' + cookies[ cookieIndex ].value + ';'; + } + request.setHeader("cookie", cookieString); + } + } + + // The content entity can be set either using the `body` or `content` attributes. + if (options.body||options.content) { + request.content = options.body||options.content; + } + request.timeout = options.timeout; + +}; + +// `createRequest` is also called by the constructor, after `processOptions`. +// This actually makes the request and processes the response, so `createRequest` +// is a bit of a misnomer. + +var createRequest = function(request) { + var timeout ; + + request.log.debug("Creating request .."); + request.log.debug(request); + + var reqParams = { + host: request.host, + port: request.port, + method: request.method, + path: request.path + (request.query ? '?'+request.query : ""), + headers: request.getHeaders(), + // Node's HTTP/S modules will ignore this, but we are using the + // browserify-http module in the browser for both HTTP and HTTPS, and this + // is how you differentiate the two. + scheme: request.scheme, + // Use a provided agent. 'Undefined' is the default, which uses a global + // agent. + agent: request.agent + }; + + if (request.logCurl) { + logCurl(request); + } + + var http = request.scheme == "http" ? HTTP : HTTPS; + + // Set up the real request using the selected library. The request won't be + // sent until we call `.end()`. + request._raw = http.request(reqParams, function(response) { + request.log.debug("Received response .."); + + // We haven't timed out and we have a response, so make sure we clear the + // timeout so it doesn't fire while we're processing the response. + clearTimeout(timeout); + + // Construct a Shred `Response` object from the response. This will stream + // the response, thus the need for the callback. We can access the response + // entity safely once we're in the callback. + response = new Response(response, request, function(response) { + + // Set up some event magic. The precedence is given first to + // status-specific handlers, then to responses for a given event, and then + // finally to the more general `response` handler. In the last case, we + // need to first make sure we're not dealing with a a redirect. + var emit = function(event) { + var emitter = request.emitter; + var textStatus = STATUS_CODES[response.status] ? STATUS_CODES[response.status].toLowerCase() : null; + if (emitter.listeners(response.status).length > 0 || emitter.listeners(textStatus).length > 0) { + emitter.emit(response.status, response); + emitter.emit(textStatus, response); + } else { + if (emitter.listeners(event).length>0) { + emitter.emit(event, response); + } else if (!response.isRedirect) { + emitter.emit("response", response); + //console.warn("Request has no event listener for status code " + response.status); + } + } + }; + + // Next, check for a redirect. We simply repeat the request with the URL + // given in the `Location` header. We fire a `redirect` event. + if (response.isRedirect) { + request.log.debug("Redirecting to " + + response.getHeader("Location")); + request.url = response.getHeader("Location"); + emit("redirect"); + createRequest(request); + + // Okay, it's not a redirect. Is it an error of some kind? + } else if (response.isError) { + emit("error"); + } else { + // It looks like we're good shape. Trigger the `success` event. + emit("success"); + } + }); + }); + + // We're still setting up the request. Next, we're going to handle error cases + // where we have no response. We don't emit an error event because that event + // takes a response. We don't response handlers to have to check for a null + // value. However, we [should introduce a different event + // type](https://github.com/spire-io/shred/issues/3) for this type of error. + request._raw.on("error", function(error) { + request.emitter.emit("request_error", error); + }); + + request._raw.on("socket", function(socket) { + request.emitter.emit("socket", socket); + }); + + // TCP timeouts should also trigger the "response_error" event. + request._raw.on('socket', function () { + request._raw.socket.on('timeout', function () { + // This should trigger the "error" event on the raw request, which will + // trigger the "response_error" on the shred request. + request._raw.abort(); + }); + }); + + + // We're almost there. Next, we need to write the request entity to the + // underlying request object. + if (request.content) { + request.log.debug("Streaming body: '" + + request.content.data.slice(0,59) + "' ... "); + request._raw.write(request.content.data); + } + + // Finally, we need to set up the timeout. We do this last so that we don't + // start the clock ticking until the last possible moment. + if (request.timeout) { + timeout = setTimeout(function() { + request.log.debug("Timeout fired, aborting request ..."); + request._raw.abort(); + request.emitter.emit("timeout", request); + },request.timeout); + } + + // The `.end()` method will cause the request to fire. Technically, it might + // have already sent the headers and body. + request.log.debug("Sending request ..."); + request._raw.end(); +}; + +// Logs the curl command for the request. +var logCurl = function (req) { + var headers = req.getHeaders(); + var headerString = ""; + + for (var key in headers) { + headerString += '-H "' + key + ": " + headers[key] + '" '; + } + + var bodyString = "" + + if (req.content) { + bodyString += "-d '" + req.content.body + "' "; + } + + var query = req.query ? '?' + req.query : ""; + + console.log("curl " + + "-X " + req.method.toUpperCase() + " " + + req.scheme + "://" + req.host + ":" + req.port + req.path + query + " " + + headerString + + bodyString + ); +}; + + +module.exports = Request; + +}); + +require.define("http", function (require, module, exports, __dirname, __filename) { + // todo + +}); + +require.define("https", function (require, module, exports, __dirname, __filename) { + // todo + +}); + +require.define("/shred/parseUri.js", function (require, module, exports, __dirname, __filename) { + // parseUri 1.2.2 +// (c) Steven Levithan +// MIT License + +function parseUri (str) { + var o = parseUri.options, + m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), + uri = {}, + i = 14; + + while (i--) uri[o.key[i]] = m[i] || ""; + + uri[o.q.name] = {}; + uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { + if ($1) uri[o.q.name][$1] = $2; + }); + + return uri; +}; + +parseUri.options = { + strictMode: false, + key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], + q: { + name: "queryKey", + parser: /(?:^|&)([^&=]*)=?([^&]*)/g + }, + parser: { + strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, + loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ + } +}; + +module.exports = parseUri; + +}); + +require.define("events", function (require, module, exports, __dirname, __filename) { + if (!process.EventEmitter) process.EventEmitter = function () {}; + +var EventEmitter = exports.EventEmitter = process.EventEmitter; +var isArray = typeof Array.isArray === 'function' + ? Array.isArray + : function (xs) { + return Object.toString.call(xs) === '[object Array]' + } +; + +// By default EventEmitters will print a warning if more than +// 10 listeners are added to it. This is a useful default which +// helps finding memory leaks. +// +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +var defaultMaxListeners = 10; +EventEmitter.prototype.setMaxListeners = function(n) { + if (!this._events) this._events = {}; + this._events.maxListeners = n; +}; + + +EventEmitter.prototype.emit = function(type) { + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events || !this._events.error || + (isArray(this._events.error) && !this._events.error.length)) + { + if (arguments[1] instanceof Error) { + throw arguments[1]; // Unhandled 'error' event + } else { + throw new Error("Uncaught, unspecified 'error' event."); + } + return false; + } + } + + if (!this._events) return false; + var handler = this._events[type]; + if (!handler) return false; + + if (typeof handler == 'function') { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + var args = Array.prototype.slice.call(arguments, 1); + handler.apply(this, args); + } + return true; + + } else if (isArray(handler)) { + var args = Array.prototype.slice.call(arguments, 1); + + var listeners = handler.slice(); + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + return true; + + } else { + return false; + } +}; + +// EventEmitter is defined in src/node_events.cc +// EventEmitter.prototype.emit() is also defined there. +EventEmitter.prototype.addListener = function(type, listener) { + if ('function' !== typeof listener) { + throw new Error('addListener only takes instances of Function'); + } + + if (!this._events) this._events = {}; + + // To avoid recursion in the case that type == "newListeners"! Before + // adding it to the listeners, first emit "newListeners". + this.emit('newListener', type, listener); + + if (!this._events[type]) { + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + } else if (isArray(this._events[type])) { + + // Check for listener leak + if (!this._events[type].warned) { + var m; + if (this._events.maxListeners !== undefined) { + m = this._events.maxListeners; + } else { + m = defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + console.trace(); + } + } + + // If we've already got an array, just append. + this._events[type].push(listener); + } else { + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + var self = this; + self.on(type, function g() { + self.removeListener(type, g); + listener.apply(this, arguments); + }); + + return this; +}; + +EventEmitter.prototype.removeListener = function(type, listener) { + if ('function' !== typeof listener) { + throw new Error('removeListener only takes instances of Function'); + } + + // does not use listeners(), so no side effect of creating _events[type] + if (!this._events || !this._events[type]) return this; + + var list = this._events[type]; + + if (isArray(list)) { + var i = list.indexOf(listener); + if (i < 0) return this; + list.splice(i, 1); + if (list.length == 0) + delete this._events[type]; + } else if (this._events[type] === listener) { + delete this._events[type]; + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + // does not use listeners(), so no side effect of creating _events[type] + if (type && this._events && this._events[type]) this._events[type] = null; + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + if (!this._events) this._events = {}; + if (!this._events[type]) this._events[type] = []; + if (!isArray(this._events[type])) { + this._events[type] = [this._events[type]]; + } + return this._events[type]; +}; + +}); + +require.define("/node_modules/sprintf/package.json", function (require, module, exports, __dirname, __filename) { + module.exports = {"main":"./lib/sprintf"} +}); + +require.define("/node_modules/sprintf/lib/sprintf.js", function (require, module, exports, __dirname, __filename) { + /** +sprintf() for JavaScript 0.7-beta1 +http://www.diveintojavascript.com/projects/javascript-sprintf + +Copyright (c) Alexandru Marasteanu +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of sprintf() for JavaScript nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Changelog: +2010.11.07 - 0.7-beta1-node + - converted it to a node.js compatible module + +2010.09.06 - 0.7-beta1 + - features: vsprintf, support for named placeholders + - enhancements: format cache, reduced global namespace pollution + +2010.05.22 - 0.6: + - reverted to 0.4 and fixed the bug regarding the sign of the number 0 + Note: + Thanks to Raphael Pigulla (http://www.n3rd.org/) + who warned me about a bug in 0.5, I discovered that the last update was + a regress. I appologize for that. + +2010.05.09 - 0.5: + - bug fix: 0 is now preceeded with a + sign + - bug fix: the sign was not at the right position on padded results (Kamal Abdali) + - switched from GPL to BSD license + +2007.10.21 - 0.4: + - unit test and patch (David Baird) + +2007.09.17 - 0.3: + - bug fix: no longer throws exception on empty paramenters (Hans Pufal) + +2007.09.11 - 0.2: + - feature: added argument swapping + +2007.04.03 - 0.1: + - initial release +**/ + +var sprintf = (function() { + function get_type(variable) { + return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase(); + } + function str_repeat(input, multiplier) { + for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */} + return output.join(''); + } + + var str_format = function() { + if (!str_format.cache.hasOwnProperty(arguments[0])) { + str_format.cache[arguments[0]] = str_format.parse(arguments[0]); + } + return str_format.format.call(null, str_format.cache[arguments[0]], arguments); + }; + + str_format.format = function(parse_tree, argv) { + var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length; + for (i = 0; i < tree_length; i++) { + node_type = get_type(parse_tree[i]); + if (node_type === 'string') { + output.push(parse_tree[i]); + } + else if (node_type === 'array') { + match = parse_tree[i]; // convenience purposes only + if (match[2]) { // keyword argument + arg = argv[cursor]; + for (k = 0; k < match[2].length; k++) { + if (!arg.hasOwnProperty(match[2][k])) { + throw(sprintf('[sprintf] property "%s" does not exist', match[2][k])); + } + arg = arg[match[2][k]]; + } + } + else if (match[1]) { // positional argument (explicit) + arg = argv[match[1]]; + } + else { // positional argument (implicit) + arg = argv[cursor++]; + } + + if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) { + throw(sprintf('[sprintf] expecting number but found %s', get_type(arg))); + } + switch (match[8]) { + case 'b': arg = arg.toString(2); break; + case 'c': arg = String.fromCharCode(arg); break; + case 'd': arg = parseInt(arg, 10); break; + case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break; + case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break; + case 'o': arg = arg.toString(8); break; + case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break; + case 'u': arg = Math.abs(arg); break; + case 'x': arg = arg.toString(16); break; + case 'X': arg = arg.toString(16).toUpperCase(); break; + } + arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg); + pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '; + pad_length = match[6] - String(arg).length; + pad = match[6] ? str_repeat(pad_character, pad_length) : ''; + output.push(match[5] ? arg + pad : pad + arg); + } + } + return output.join(''); + }; + + str_format.cache = {}; + + str_format.parse = function(fmt) { + var _fmt = fmt, match = [], parse_tree = [], arg_names = 0; + while (_fmt) { + if ((match = /^[^\x25]+/.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } + else if ((match = /^\x25{2}/.exec(_fmt)) !== null) { + parse_tree.push('%'); + } + else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) { + if (match[2]) { + arg_names |= 1; + var field_list = [], replacement_field = match[2], field_match = []; + if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { + if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else { + throw('[sprintf] huh?'); + } + } + } + else { + throw('[sprintf] huh?'); + } + match[2] = field_list; + } + else { + arg_names |= 2; + } + if (arg_names === 3) { + throw('[sprintf] mixing positional and named placeholders is not (yet) supported'); + } + parse_tree.push(match); + } + else { + throw('[sprintf] huh?'); + } + _fmt = _fmt.substring(match[0].length); + } + return parse_tree; + }; + + return str_format; +})(); + +var vsprintf = function(fmt, argv) { + argv.unshift(fmt); + return sprintf.apply(null, argv); +}; + +exports.sprintf = sprintf; +exports.vsprintf = vsprintf; +}); + +require.define("/shred/response.js", function (require, module, exports, __dirname, __filename) { + // The `Response object` encapsulates a Node.js HTTP response. + +var Content = require("./content") + , HeaderMixins = require("./mixins/headers") + , CookieJarLib = require( "cookiejar" ) + , Cookie = CookieJarLib.Cookie +; + +// Browser doesn't have zlib. +var zlib = null; +try { + zlib = require('zlib'); +} catch (e) { + console.warn("no zlib library"); +} + +// Iconv doesn't work in browser +var Iconv = null; +try { + Iconv = require('iconv-lite'); +} catch (e) { + console.warn("no iconv library"); +} + +// Construct a `Response` object. You should never have to do this directly. The +// `Request` object handles this, getting the raw response object and passing it +// in here, along with the request. The callback allows us to stream the response +// and then use the callback to let the request know when it's ready. +var Response = function(raw, request, callback) { + var response = this; + this._raw = raw; + + // The `._setHeaders` method is "private"; you can't otherwise set headers on + // the response. + this._setHeaders.call(this,raw.headers); + + // store any cookies + if (request.cookieJar && this.getHeader('set-cookie')) { + var cookieStrings = this.getHeader('set-cookie'); + var cookieObjs = [] + , cookie; + + for (var i = 0; i < cookieStrings.length; i++) { + var cookieString = cookieStrings[i]; + if (!cookieString) { + continue; + } + + if (!cookieString.match(/domain\=/i)) { + cookieString += '; domain=' + request.host; + } + + if (!cookieString.match(/path\=/i)) { + cookieString += '; path=' + request.path; + } + + try { + cookie = new Cookie(cookieString); + if (cookie) { + cookieObjs.push(cookie); + } + } catch (e) { + console.warn("Tried to set bad cookie: " + cookieString); + } + } + + request.cookieJar.setCookies(cookieObjs); + } + + this.request = request; + this.client = request.client; + this.log = this.request.log; + + // Stream the response content entity and fire the callback when we're done. + // Store the incoming data in a array of Buffers which we concatinate into one + // buffer at the end. We need to use buffers instead of strings here in order + // to preserve binary data. + var chunkBuffers = []; + var dataLength = 0; + raw.on("data", function(chunk) { + chunkBuffers.push(chunk); + dataLength += chunk.length; + }); + raw.on("end", function() { + var body; + if (typeof Buffer === 'undefined') { + // Just concatinate into a string + body = chunkBuffers.join(''); + } else { + // Initialize new buffer and add the chunks one-at-a-time. + body = new Buffer(dataLength); + for (var i = 0, pos = 0; i < chunkBuffers.length; i++) { + chunkBuffers[i].copy(body, pos); + pos += chunkBuffers[i].length; + } + } + + var setBodyAndFinish = function (body) { + response._body = new Content({ + body: body, + type: response.getHeader("Content-Type") + }); + callback(response); + } + + if (zlib && response.getHeader("Content-Encoding") === 'gzip'){ + zlib.gunzip(body, function (err, gunzippedBody) { + if (Iconv && response.request.encoding){ + body = Iconv.fromEncoding(gunzippedBody,response.request.encoding); + } else { + body = gunzippedBody.toString(); + } + setBodyAndFinish(body); + }) + } + else{ + if (response.request.encoding){ + body = Iconv.fromEncoding(body,response.request.encoding); + } + setBodyAndFinish(body); + } + }); +}; + +// The `Response` object can be pretty overwhelming to view using the built-in +// Node.js inspect method. We want to make it a bit more manageable. This +// probably goes [too far in the other +// direction](https://github.com/spire-io/shred/issues/2). + +Response.prototype = { + inspect: function() { + var response = this; + var headers = this.format_headers(); + var summary = [" ", response.status].join(" ") + return [ summary, "- Headers:", headers].join("\n"); + }, + format_headers: function () { + var array = [] + var headers = this._headers + for (var key in headers) { + if (headers.hasOwnProperty(key)) { + var value = headers[key] + array.push("\t" + key + ": " + value); + } + } + return array.join("\n"); + } +}; + +// `Response` object properties, all of which are read-only: +Object.defineProperties(Response.prototype, { + +// - **status**. The HTTP status code for the response. + status: { + get: function() { return this._raw.statusCode; }, + enumerable: true + }, + +// - **content**. The HTTP content entity, if any. Provided as a [content +// object](./content.html), which will attempt to convert the entity based upon +// the `content-type` header. The converted value is available as +// `content.data`. The original raw content entity is available as +// `content.body`. + body: { + get: function() { return this._body; } + }, + content: { + get: function() { return this.body; }, + enumerable: true + }, + +// - **isRedirect**. Is the response a redirect? These are responses with 3xx +// status and a `Location` header. + isRedirect: { + get: function() { + return (this.status>299 + &&this.status<400 + &&this.getHeader("Location")); + }, + enumerable: true + }, + +// - **isError**. Is the response an error? These are responses with status of +// 400 or greater. + isError: { + get: function() { + return (this.status === 0 || this.status > 399) + }, + enumerable: true + } +}); + +// Add in the [getters for accessing the normalized headers](./headers.js). +HeaderMixins.getters(Response); +HeaderMixins.privateSetters(Response); + +// Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes +// getAllResponseHeaders() to return {} if the response is a CORS request. +// xhr.getHeader still works correctly. +var getHeader = Response.prototype.getHeader; +Response.prototype.getHeader = function (name) { + return (getHeader.call(this,name) || + (typeof this._raw.getHeader === 'function' && this._raw.getHeader(name))); +}; + +module.exports = Response; + +}); + +require.define("/shred/content.js", function (require, module, exports, __dirname, __filename) { + +// The purpose of the `Content` object is to abstract away the data conversions +// to and from raw content entities as strings. For example, you want to be able +// to pass in a Javascript object and have it be automatically converted into a +// JSON string if the `content-type` is set to a JSON-based media type. +// Conversely, you want to be able to transparently get back a Javascript object +// in the response if the `content-type` is a JSON-based media-type. + +// One limitation of the current implementation is that it [assumes the `charset` is UTF-8](https://github.com/spire-io/shred/issues/5). + +// The `Content` constructor takes an options object, which *must* have either a +// `body` or `data` property and *may* have a `type` property indicating the +// media type. If there is no `type` attribute, a default will be inferred. +var Content = function(options) { + this.body = options.body; + this.data = options.data; + this.type = options.type; +}; + +Content.prototype = { + // Treat `toString()` as asking for the `content.body`. That is, the raw content entity. + // + // toString: function() { return this.body; } + // + // Commented out, but I've forgotten why. :/ +}; + + +// `Content` objects have the following attributes: +Object.defineProperties(Content.prototype,{ + +// - **type**. Typically accessed as `content.type`, reflects the `content-type` +// header associated with the request or response. If not passed as an options +// to the constructor or set explicitly, it will infer the type the `data` +// attribute, if possible, and, failing that, will default to `text/plain`. + type: { + get: function() { + if (this._type) { + return this._type; + } else { + if (this._data) { + switch(typeof this._data) { + case "string": return "text/plain"; + case "object": return "application/json"; + } + } + } + return "text/plain"; + }, + set: function(value) { + this._type = value; + return this; + }, + enumerable: true + }, + +// - **data**. Typically accessed as `content.data`, reflects the content entity +// converted into Javascript data. This can be a string, if the `type` is, say, +// `text/plain`, but can also be a Javascript object. The conversion applied is +// based on the `processor` attribute. The `data` attribute can also be set +// directly, in which case the conversion will be done the other way, to infer +// the `body` attribute. + data: { + get: function() { + if (this._body) { + return this.processor.parser(this._body); + } else { + return this._data; + } + }, + set: function(data) { + if (this._body&&data) Errors.setDataWithBody(this); + this._data = data; + return this; + }, + enumerable: true + }, + +// - **body**. Typically accessed as `content.body`, reflects the content entity +// as a UTF-8 string. It is the mirror of the `data` attribute. If you set the +// `data` attribute, the `body` attribute will be inferred and vice-versa. If +// you attempt to set both, an exception is raised. + body: { + get: function() { + if (this._data) { + return this.processor.stringify(this._data); + } else { + return this.processor.stringify(this._body); + } + }, + set: function(body) { + if (this._data&&body) Errors.setBodyWithData(this); + this._body = body; + return this; + }, + enumerable: true + }, + +// - **processor**. The functions that will be used to convert to/from `data` and +// `body` attributes. You can add processors. The two that are built-in are for +// `text/plain`, which is basically an identity transformation and +// `application/json` and other JSON-based media types (including custom media +// types with `+json`). You can add your own processors. See below. + processor: { + get: function() { + var processor = Content.processors[this.type]; + if (processor) { + return processor; + } else { + // Return the first processor that matches any part of the + // content type. ex: application/vnd.foobar.baz+json will match json. + var main = this.type.split(";")[0]; + var parts = main.split(/\+|\//); + for (var i=0, l=parts.length; i < l; i++) { + processor = Content.processors[parts[i]] + } + return processor || {parser:identity,stringify:toString}; + } + }, + enumerable: true + }, + +// - **length**. Typically accessed as `content.length`, returns the length in +// bytes of the raw content entity. + length: { + get: function() { + if (typeof Buffer !== 'undefined') { + return Buffer.byteLength(this.body); + } + return this.body.length; + } + } +}); + +Content.processors = {}; + +// The `registerProcessor` function allows you to add your own processors to +// convert content entities. Each processor consists of a Javascript object with +// two properties: +// - **parser**. The function used to parse a raw content entity and convert it +// into a Javascript data type. +// - **stringify**. The function used to convert a Javascript data type into a +// raw content entity. +Content.registerProcessor = function(types,processor) { + +// You can pass an array of types that will trigger this processor, or just one. +// We determine the array via duck-typing here. + if (types.forEach) { + types.forEach(function(type) { + Content.processors[type] = processor; + }); + } else { + // If you didn't pass an array, we just use what you pass in. + Content.processors[types] = processor; + } +}; + +// Register the identity processor, which is used for text-based media types. +var identity = function(x) { return x; } + , toString = function(x) { return x.toString(); } +Content.registerProcessor( + ["text/html","text/plain","text"], + { parser: identity, stringify: toString }); + +// Register the JSON processor, which is used for JSON-based media types. +Content.registerProcessor( + ["application/json; charset=utf-8","application/json","json"], + { + parser: function(string) { + return JSON.parse(string); + }, + stringify: function(data) { + return JSON.stringify(data); }}); + +// Error functions are defined separately here in an attempt to make the code +// easier to read. +var Errors = { + setDataWithBody: function(object) { + throw new Error("Attempt to set data attribute of a content object " + + "when the body attributes was already set."); + }, + setBodyWithData: function(object) { + throw new Error("Attempt to set body attribute of a content object " + + "when the data attributes was already set."); + } +} +module.exports = Content; + +}); + +require.define("/shred/mixins/headers.js", function (require, module, exports, __dirname, __filename) { + // The header mixins allow you to add HTTP header support to any object. This +// might seem pointless: why not simply use a hash? The main reason is that, per +// the [HTTP spec](http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2), +// headers are case-insensitive. So, for example, `content-type` is the same as +// `CONTENT-TYPE` which is the same as `Content-Type`. Since there is no way to +// overload the index operator in Javascript, using a hash to represent the +// headers means it's possible to have two conflicting values for a single +// header. +// +// The solution to this is to provide explicit methods to set or get headers. +// This also has the benefit of allowing us to introduce additional variations, +// including snake case, which we automatically convert to what Matthew King has +// dubbed "corset case" - the hyphen-separated names with initial caps: +// `Content-Type`. We use corset-case just in case we're dealing with servers +// that haven't properly implemented the spec. + +// Convert headers to corset-case. **Example:** `CONTENT-TYPE` will be converted +// to `Content-Type`. + +var corsetCase = function(string) { + return string.toLowerCase() + //.replace("_","-") + .replace(/(^|-)(\w)/g, + function(s) { return s.toUpperCase(); }); +}; + +// We suspect that `initializeHeaders` was once more complicated ... +var initializeHeaders = function(object) { + return {}; +}; + +// Access the `_headers` property using lazy initialization. **Warning:** If you +// mix this into an object that is using the `_headers` property already, you're +// going to have trouble. +var $H = function(object) { + return object._headers||(object._headers=initializeHeaders(object)); +}; + +// Hide the implementations as private functions, separate from how we expose them. + +// The "real" `getHeader` function: get the header after normalizing the name. +var getHeader = function(object,name) { + return $H(object)[corsetCase(name)]; +}; + +// The "real" `getHeader` function: get one or more headers, or all of them +// if you don't ask for any specifics. +var getHeaders = function(object,names) { + var keys = (names && names.length>0) ? names : Object.keys($H(object)); + var hash = keys.reduce(function(hash,key) { + hash[key] = getHeader(object,key); + return hash; + },{}); + // Freeze the resulting hash so you don't mistakenly think you're modifying + // the real headers. + Object.freeze(hash); + return hash; +}; + +// The "real" `setHeader` function: set a header, after normalizing the name. +var setHeader = function(object,name,value) { + $H(object)[corsetCase(name)] = value; + return object; +}; + +// The "real" `setHeaders` function: set multiple headers based on a hash. +var setHeaders = function(object,hash) { + for( var key in hash ) { setHeader(object,key,hash[key]); }; + return this; +}; + +// Here's where we actually bind the functionality to an object. These mixins work by +// exposing mixin functions. Each function mixes in a specific batch of features. +module.exports = { + + // Add getters. + getters: function(constructor) { + constructor.prototype.getHeader = function(name) { return getHeader(this,name); }; + constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); }; + }, + // Add setters but as "private" methods. + privateSetters: function(constructor) { + constructor.prototype._setHeader = function(key,value) { return setHeader(this,key,value); }; + constructor.prototype._setHeaders = function(hash) { return setHeaders(this,hash); }; + }, + // Add setters. + setters: function(constructor) { + constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); }; + constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); }; + }, + // Add both getters and setters. + gettersAndSetters: function(constructor) { + constructor.prototype.getHeader = function(name) { return getHeader(this,name); }; + constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); }; + constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); }; + constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); }; + }, +}; + +}); + +require.define("/node_modules/iconv-lite/package.json", function (require, module, exports, __dirname, __filename) { + module.exports = {} +}); + +require.define("/node_modules/iconv-lite/index.js", function (require, module, exports, __dirname, __filename) { + // Module exports +var iconv = module.exports = { + toEncoding: function(str, encoding) { + return iconv.getCodec(encoding).toEncoding(str); + }, + fromEncoding: function(buf, encoding) { + return iconv.getCodec(encoding).fromEncoding(buf); + }, + + defaultCharUnicode: '�', + defaultCharSingleByte: '?', + + // Get correct codec for given encoding. + getCodec: function(encoding) { + var enc = encoding || "utf8"; + var codecOptions = undefined; + while (1) { + if (getType(enc) === "String") + enc = enc.replace(/[- ]/g, "").toLowerCase(); + var codec = iconv.encodings[enc]; + var type = getType(codec); + if (type === "String") { + // Link to other encoding. + codecOptions = {originalEncoding: enc}; + enc = codec; + } + else if (type === "Object" && codec.type != undefined) { + // Options for other encoding. + codecOptions = codec; + enc = codec.type; + } + else if (type === "Function") + // Codec itself. + return codec(codecOptions); + else + throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')"); + } + }, + + // Define basic encodings + encodings: { + internal: function(options) { + return { + toEncoding: function(str) { + return new Buffer(ensureString(str), options.originalEncoding); + }, + fromEncoding: function(buf) { + return ensureBuffer(buf).toString(options.originalEncoding); + } + }; + }, + utf8: "internal", + ucs2: "internal", + binary: "internal", + ascii: "internal", + base64: "internal", + + // Codepage single-byte encodings. + singlebyte: function(options) { + // Prepare chars if needed + if (!options.chars || (options.chars.length !== 128 && options.chars.length !== 256)) + throw new Error("Encoding '"+options.type+"' has incorrect 'chars' (must be of len 128 or 256)"); + + if (options.chars.length === 128) + options.chars = asciiString + options.chars; + + if (!options.charsBuf) { + options.charsBuf = new Buffer(options.chars, 'ucs2'); + } + + if (!options.revCharsBuf) { + options.revCharsBuf = new Buffer(65536); + var defChar = iconv.defaultCharSingleByte.charCodeAt(0); + for (var i = 0; i < options.revCharsBuf.length; i++) + options.revCharsBuf[i] = defChar; + for (var i = 0; i < options.chars.length; i++) + options.revCharsBuf[options.chars.charCodeAt(i)] = i; + } + + return { + toEncoding: function(str) { + str = ensureString(str); + + var buf = new Buffer(str.length); + var revCharsBuf = options.revCharsBuf; + for (var i = 0; i < str.length; i++) + buf[i] = revCharsBuf[str.charCodeAt(i)]; + + return buf; + }, + fromEncoding: function(buf) { + buf = ensureBuffer(buf); + + // Strings are immutable in JS -> we use ucs2 buffer to speed up computations. + var charsBuf = options.charsBuf; + var newBuf = new Buffer(buf.length*2); + var idx1 = 0, idx2 = 0; + for (var i = 0, _len = buf.length; i < _len; i++) { + idx1 = buf[i]*2; idx2 = i*2; + newBuf[idx2] = charsBuf[idx1]; + newBuf[idx2+1] = charsBuf[idx1+1]; + } + return newBuf.toString('ucs2'); + } + }; + }, + + // Codepage double-byte encodings. + table: function(options) { + var table = options.table, key, revCharsTable = options.revCharsTable; + if (!table) { + throw new Error("Encoding '" + options.type +"' has incorect 'table' option"); + } + if(!revCharsTable) { + revCharsTable = options.revCharsTable = {}; + for (key in table) { + revCharsTable[table[key]] = parseInt(key); + } + } + + return { + toEncoding: function(str) { + str = ensureString(str); + var strLen = str.length; + var bufLen = strLen; + for (var i = 0; i < strLen; i++) + if (str.charCodeAt(i) >> 7) + bufLen++; + + var newBuf = new Buffer(bufLen), gbkcode, unicode, + defaultChar = revCharsTable[iconv.defaultCharUnicode.charCodeAt(0)]; + + for (var i = 0, j = 0; i < strLen; i++) { + unicode = str.charCodeAt(i); + if (unicode >> 7) { + gbkcode = revCharsTable[unicode] || defaultChar; + newBuf[j++] = gbkcode >> 8; //high byte; + newBuf[j++] = gbkcode & 0xFF; //low byte + } else {//ascii + newBuf[j++] = unicode; + } + } + return newBuf; + }, + fromEncoding: function(buf) { + buf = ensureBuffer(buf); + var bufLen = buf.length, strLen = 0; + for (var i = 0; i < bufLen; i++) { + strLen++; + if (buf[i] & 0x80) //the high bit is 1, so this byte is gbkcode's high byte.skip next byte + i++; + } + var newBuf = new Buffer(strLen*2), unicode, gbkcode, + defaultChar = iconv.defaultCharUnicode.charCodeAt(0); + + for (var i = 0, j = 0; i < bufLen; i++, j+=2) { + gbkcode = buf[i]; + if (gbkcode & 0x80) { + gbkcode = (gbkcode << 8) + buf[++i]; + unicode = table[gbkcode] || defaultChar; + } else { + unicode = gbkcode; + } + newBuf[j] = unicode & 0xFF; //low byte + newBuf[j+1] = unicode >> 8; //high byte + } + return newBuf.toString('ucs2'); + } + } + } + } +}; + +// Add aliases to convert functions +iconv.encode = iconv.toEncoding; +iconv.decode = iconv.fromEncoding; + +// Load other encodings from files in /encodings dir. +var encodingsDir = __dirname+"/encodings/", + fs = require('fs'); +fs.readdirSync(encodingsDir).forEach(function(file) { + if(fs.statSync(encodingsDir + file).isDirectory()) return; + var encodings = require(encodingsDir + file) + for (var key in encodings) + iconv.encodings[key] = encodings[key] +}); + +// Utilities +var asciiString = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'+ + ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f'; + +var ensureBuffer = function(buf) { + buf = buf || new Buffer(0); + return (buf instanceof Buffer) ? buf : new Buffer(buf.toString(), "utf8"); +} + +var ensureString = function(str) { + str = str || ""; + return (str instanceof String) ? str : str.toString((str instanceof Buffer) ? 'utf8' : undefined); +} + +var getType = function(obj) { + return Object.prototype.toString.call(obj).slice(8, -1); +} + + +}); + +require.define("/node_modules/http-browserify/package.json", function (require, module, exports, __dirname, __filename) { + module.exports = {"main":"index.js","browserify":"browser.js"} +}); + +require.define("/node_modules/http-browserify/browser.js", function (require, module, exports, __dirname, __filename) { + var http = module.exports; +var EventEmitter = require('events').EventEmitter; +var Request = require('./lib/request'); + +http.request = function (params, cb) { + if (!params) params = {}; + if (!params.host) params.host = window.location.host.split(':')[0]; + if (!params.port) params.port = window.location.port; + + var req = new Request(new xhrHttp, params); + if (cb) req.on('response', cb); + return req; +}; + +http.get = function (params, cb) { + params.method = 'GET'; + var req = http.request(params, cb); + req.end(); + return req; +}; + +var xhrHttp = (function () { + if (typeof window === 'undefined') { + throw new Error('no window object present'); + } + else if (window.XMLHttpRequest) { + return window.XMLHttpRequest; + } + else if (window.ActiveXObject) { + var axs = [ + 'Msxml2.XMLHTTP.6.0', + 'Msxml2.XMLHTTP.3.0', + 'Microsoft.XMLHTTP' + ]; + for (var i = 0; i < axs.length; i++) { + try { + var ax = new(window.ActiveXObject)(axs[i]); + return function () { + if (ax) { + var ax_ = ax; + ax = null; + return ax_; + } + else { + return new(window.ActiveXObject)(axs[i]); + } + }; + } + catch (e) {} + } + throw new Error('ajax not supported in this browser') + } + else { + throw new Error('ajax not supported in this browser'); + } +})(); + +http.STATUS_CODES = { + 100 : 'Continue', + 101 : 'Switching Protocols', + 102 : 'Processing', // RFC 2518, obsoleted by RFC 4918 + 200 : 'OK', + 201 : 'Created', + 202 : 'Accepted', + 203 : 'Non-Authoritative Information', + 204 : 'No Content', + 205 : 'Reset Content', + 206 : 'Partial Content', + 207 : 'Multi-Status', // RFC 4918 + 300 : 'Multiple Choices', + 301 : 'Moved Permanently', + 302 : 'Moved Temporarily', + 303 : 'See Other', + 304 : 'Not Modified', + 305 : 'Use Proxy', + 307 : 'Temporary Redirect', + 400 : 'Bad Request', + 401 : 'Unauthorized', + 402 : 'Payment Required', + 403 : 'Forbidden', + 404 : 'Not Found', + 405 : 'Method Not Allowed', + 406 : 'Not Acceptable', + 407 : 'Proxy Authentication Required', + 408 : 'Request Time-out', + 409 : 'Conflict', + 410 : 'Gone', + 411 : 'Length Required', + 412 : 'Precondition Failed', + 413 : 'Request Entity Too Large', + 414 : 'Request-URI Too Large', + 415 : 'Unsupported Media Type', + 416 : 'Requested Range Not Satisfiable', + 417 : 'Expectation Failed', + 418 : 'I\'m a teapot', // RFC 2324 + 422 : 'Unprocessable Entity', // RFC 4918 + 423 : 'Locked', // RFC 4918 + 424 : 'Failed Dependency', // RFC 4918 + 425 : 'Unordered Collection', // RFC 4918 + 426 : 'Upgrade Required', // RFC 2817 + 500 : 'Internal Server Error', + 501 : 'Not Implemented', + 502 : 'Bad Gateway', + 503 : 'Service Unavailable', + 504 : 'Gateway Time-out', + 505 : 'HTTP Version not supported', + 506 : 'Variant Also Negotiates', // RFC 2295 + 507 : 'Insufficient Storage', // RFC 4918 + 509 : 'Bandwidth Limit Exceeded', + 510 : 'Not Extended' // RFC 2774 +}; + +}); + +require.define("/node_modules/http-browserify/lib/request.js", function (require, module, exports, __dirname, __filename) { + var EventEmitter = require('events').EventEmitter; +var Response = require('./response'); +var isSafeHeader = require('./isSafeHeader'); + +var Request = module.exports = function (xhr, params) { + var self = this; + self.xhr = xhr; + self.body = ''; + + var uri = params.host + ':' + params.port + (params.path || '/'); + + xhr.open( + params.method || 'GET', + (params.scheme || 'http') + '://' + uri, + true + ); + + if (params.headers) { + Object.keys(params.headers).forEach(function (key) { + if (!isSafeHeader(key)) return; + var value = params.headers[key]; + if (Array.isArray(value)) { + value.forEach(function (v) { + xhr.setRequestHeader(key, v); + }); + } + else xhr.setRequestHeader(key, value) + }); + } + + var res = new Response(xhr); + res.on('ready', function () { + self.emit('response', res); + }); + + xhr.onreadystatechange = function () { + res.handle(xhr); + }; +}; + +Request.prototype = new EventEmitter; + +Request.prototype.setHeader = function (key, value) { + if ((Array.isArray && Array.isArray(value)) + || value instanceof Array) { + for (var i = 0; i < value.length; i++) { + this.xhr.setRequestHeader(key, value[i]); + } + } + else { + this.xhr.setRequestHeader(key, value); + } +}; + +Request.prototype.write = function (s) { + this.body += s; +}; + +Request.prototype.end = function (s) { + if (s !== undefined) this.write(s); + this.xhr.send(this.body); +}; + +}); + +require.define("/node_modules/http-browserify/lib/response.js", function (require, module, exports, __dirname, __filename) { + var EventEmitter = require('events').EventEmitter; +var isSafeHeader = require('./isSafeHeader'); + +var Response = module.exports = function (xhr) { + this.xhr = xhr; + this.offset = 0; +}; + +Response.prototype = new EventEmitter; + +var capable = { + streaming : true, + status2 : true +}; + +function parseHeaders (xhr) { + var lines = xhr.getAllResponseHeaders().split(/\r?\n/); + var headers = {}; + for (var i = 0; i < lines.length; i++) { + var line = lines[i]; + if (line === '') continue; + + var m = line.match(/^([^:]+):\s*(.*)/); + if (m) { + var key = m[1].toLowerCase(), value = m[2]; + + if (headers[key] !== undefined) { + if ((Array.isArray && Array.isArray(headers[key])) + || headers[key] instanceof Array) { + headers[key].push(value); + } + else { + headers[key] = [ headers[key], value ]; + } + } + else { + headers[key] = value; + } + } + else { + headers[line] = true; + } + } + return headers; +} + +Response.prototype.getHeader = function (key) { + var header = this.headers ? this.headers[key.toLowerCase()] : null; + if (header) return header; + + // Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes + // getAllResponseHeaders() to return {} if the response is a CORS request. + // xhr.getHeader still works correctly. + if (isSafeHeader(key)) { + return this.xhr.getResponseHeader(key); + } + return null; +}; + +Response.prototype.handle = function () { + var xhr = this.xhr; + if (xhr.readyState === 2 && capable.status2) { + try { + this.statusCode = xhr.status; + this.headers = parseHeaders(xhr); + } + catch (err) { + capable.status2 = false; + } + + if (capable.status2) { + this.emit('ready'); + } + } + else if (capable.streaming && xhr.readyState === 3) { + try { + if (!this.statusCode) { + this.statusCode = xhr.status; + this.headers = parseHeaders(xhr); + this.emit('ready'); + } + } + catch (err) {} + + try { + this.write(); + } + catch (err) { + capable.streaming = false; + } + } + else if (xhr.readyState === 4) { + if (!this.statusCode) { + this.statusCode = xhr.status; + this.emit('ready'); + } + this.write(); + + if (xhr.error) { + this.emit('error', xhr.responseText); + } + else this.emit('end'); + } +}; + +Response.prototype.write = function () { + var xhr = this.xhr; + if (xhr.responseText.length > this.offset) { + this.emit('data', xhr.responseText.slice(this.offset)); + this.offset = xhr.responseText.length; + } +}; + +}); + +require.define("/node_modules/http-browserify/lib/isSafeHeader.js", function (require, module, exports, __dirname, __filename) { + // Taken from http://dxr.mozilla.org/mozilla/mozilla-central/content/base/src/nsXMLHttpRequest.cpp.html +var unsafeHeaders = [ + "accept-charset", + "accept-encoding", + "access-control-request-headers", + "access-control-request-method", + "connection", + "content-length", + "cookie", + "cookie2", + "content-transfer-encoding", + "date", + "expect", + "host", + "keep-alive", + "origin", + "referer", + "set-cookie", + "te", + "trailer", + "transfer-encoding", + "upgrade", + "user-agent", + "via" +]; + +module.exports = function (headerName) { + if (!headerName) return false; + return (unsafeHeaders.indexOf(headerName.toLowerCase()) === -1) +}; + +}); + +require.alias("http-browserify", "/node_modules/http"); + +require.alias("http-browserify", "/node_modules/https"); \ No newline at end of file diff --git a/dist/lib/shred/content.js b/dist/lib/shred/content.js new file mode 100644 index 00000000..b8051fed --- /dev/null +++ b/dist/lib/shred/content.js @@ -0,0 +1,193 @@ + +// The purpose of the `Content` object is to abstract away the data conversions +// to and from raw content entities as strings. For example, you want to be able +// to pass in a Javascript object and have it be automatically converted into a +// JSON string if the `content-type` is set to a JSON-based media type. +// Conversely, you want to be able to transparently get back a Javascript object +// in the response if the `content-type` is a JSON-based media-type. + +// One limitation of the current implementation is that it [assumes the `charset` is UTF-8](https://github.com/spire-io/shred/issues/5). + +// The `Content` constructor takes an options object, which *must* have either a +// `body` or `data` property and *may* have a `type` property indicating the +// media type. If there is no `type` attribute, a default will be inferred. +var Content = function(options) { + this.body = options.body; + this.data = options.data; + this.type = options.type; +}; + +Content.prototype = { + // Treat `toString()` as asking for the `content.body`. That is, the raw content entity. + // + // toString: function() { return this.body; } + // + // Commented out, but I've forgotten why. :/ +}; + + +// `Content` objects have the following attributes: +Object.defineProperties(Content.prototype,{ + +// - **type**. Typically accessed as `content.type`, reflects the `content-type` +// header associated with the request or response. If not passed as an options +// to the constructor or set explicitly, it will infer the type the `data` +// attribute, if possible, and, failing that, will default to `text/plain`. + type: { + get: function() { + if (this._type) { + return this._type; + } else { + if (this._data) { + switch(typeof this._data) { + case "string": return "text/plain"; + case "object": return "application/json"; + } + } + } + return "text/plain"; + }, + set: function(value) { + this._type = value; + return this; + }, + enumerable: true + }, + +// - **data**. Typically accessed as `content.data`, reflects the content entity +// converted into Javascript data. This can be a string, if the `type` is, say, +// `text/plain`, but can also be a Javascript object. The conversion applied is +// based on the `processor` attribute. The `data` attribute can also be set +// directly, in which case the conversion will be done the other way, to infer +// the `body` attribute. + data: { + get: function() { + if (this._body) { + return this.processor.parser(this._body); + } else { + return this._data; + } + }, + set: function(data) { + if (this._body&&data) Errors.setDataWithBody(this); + this._data = data; + return this; + }, + enumerable: true + }, + +// - **body**. Typically accessed as `content.body`, reflects the content entity +// as a UTF-8 string. It is the mirror of the `data` attribute. If you set the +// `data` attribute, the `body` attribute will be inferred and vice-versa. If +// you attempt to set both, an exception is raised. + body: { + get: function() { + if (this._data) { + return this.processor.stringify(this._data); + } else { + return this._body.toString(); + } + }, + set: function(body) { + if (this._data&&body) Errors.setBodyWithData(this); + this._body = body; + return this; + }, + enumerable: true + }, + +// - **processor**. The functions that will be used to convert to/from `data` and +// `body` attributes. You can add processors. The two that are built-in are for +// `text/plain`, which is basically an identity transformation and +// `application/json` and other JSON-based media types (including custom media +// types with `+json`). You can add your own processors. See below. + processor: { + get: function() { + var processor = Content.processors[this.type]; + if (processor) { + return processor; + } else { + // Return the first processor that matches any part of the + // content type. ex: application/vnd.foobar.baz+json will match json. + var main = this.type.split(";")[0]; + var parts = main.split(/\+|\//); + for (var i=0, l=parts.length; i < l; i++) { + processor = Content.processors[parts[i]] + } + return processor || {parser:identity,stringify:toString}; + } + }, + enumerable: true + }, + +// - **length**. Typically accessed as `content.length`, returns the length in +// bytes of the raw content entity. + length: { + get: function() { + if (typeof Buffer !== 'undefined') { + return Buffer.byteLength(this.body); + } + return this.body.length; + } + } +}); + +Content.processors = {}; + +// The `registerProcessor` function allows you to add your own processors to +// convert content entities. Each processor consists of a Javascript object with +// two properties: +// - **parser**. The function used to parse a raw content entity and convert it +// into a Javascript data type. +// - **stringify**. The function used to convert a Javascript data type into a +// raw content entity. +Content.registerProcessor = function(types,processor) { + +// You can pass an array of types that will trigger this processor, or just one. +// We determine the array via duck-typing here. + if (types.forEach) { + types.forEach(function(type) { + Content.processors[type] = processor; + }); + } else { + // If you didn't pass an array, we just use what you pass in. + Content.processors[types] = processor; + } +}; + +// Register the identity processor, which is used for text-based media types. +var identity = function(x) { return x; } + , toString = function(x) { return x.toString(); } +Content.registerProcessor( + ["text/html","text/plain","text"], + { parser: identity, stringify: toString }); + +// Register the JSON processor, which is used for JSON-based media types. +Content.registerProcessor( + ["application/json; charset=utf-8","application/json","json"], + { + parser: function(string) { + return JSON.parse(string); + }, + stringify: function(data) { + return JSON.stringify(data); }}); + +var qs = require('querystring'); +// Register the post processor, which is used for JSON-based media types. +Content.registerProcessor( + ["application/x-www-form-urlencoded"], + { parser : qs.parse, stringify : qs.stringify }); + +// Error functions are defined separately here in an attempt to make the code +// easier to read. +var Errors = { + setDataWithBody: function(object) { + throw new Error("Attempt to set data attribute of a content object " + + "when the body attributes was already set."); + }, + setBodyWithData: function(object) { + throw new Error("Attempt to set body attribute of a content object " + + "when the data attributes was already set."); + } +} +module.exports = Content; \ No newline at end of file diff --git a/dist/lib/swagger.js b/dist/lib/swagger.js index 0ce1513e..d690b52b 100644 --- a/dist/lib/swagger.js +++ b/dist/lib/swagger.js @@ -1,116 +1,132 @@ // Generated by CoffeeScript 1.4.0 (function() { - var SwaggerApi, SwaggerModel, SwaggerModelProperty, SwaggerOperation, SwaggerRequest, SwaggerResource, + var ApiKeyAuthorization, SwaggerApi, SwaggerAuthorizations, SwaggerHttp, SwaggerModel, SwaggerModelProperty, SwaggerOperation, SwaggerRequest, SwaggerResource, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; SwaggerApi = (function() { - SwaggerApi.prototype.discoveryUrl = "http://api.wordnik.com/v4/resources.json"; + SwaggerApi.prototype.url = "http://api.wordnik.com/v4/resources.json"; SwaggerApi.prototype.debug = false; - SwaggerApi.prototype.api_key = null; - SwaggerApi.prototype.basePath = null; - function SwaggerApi(options) { + SwaggerApi.prototype.authorizations = null; + + SwaggerApi.prototype.authorizationScheme = null; + + SwaggerApi.prototype.info = null; + + function SwaggerApi(url, options) { if (options == null) { options = {}; } - if (options.discoveryUrl != null) { - this.discoveryUrl = options.discoveryUrl; + if (url) { + if (url.url) { + options = url; + } else { + this.url = url; + } + } else { + options = url; } - if (options.debug != null) { - this.debug = options.debug; + if (options.url != null) { + this.url = options.url; } - this.apiKeyName = options.apiKeyName != null ? options.apiKeyName : 'api_key'; - if (options.apiKey != null) { - this.api_key = options.apiKey; - } - if (options.api_key != null) { - this.api_key = options.api_key; - } - if (options.verbose != null) { - this.verbose = options.verbose; - } - this.supportHeaderParams = options.supportHeaderParams != null ? options.supportHeaderParams : false; this.supportedSubmitMethods = options.supportedSubmitMethods != null ? options.supportedSubmitMethods : ['get']; if (options.success != null) { this.success = options.success; } this.failure = options.failure != null ? options.failure : function() {}; this.progress = options.progress != null ? options.progress : function() {}; - this.headers = options.headers != null ? options.headers : {}; - this.booleanValues = options.booleanValues != null ? options.booleanValues : new Array('true', 'false'); - this.discoveryUrl = this.suffixApiKey(this.discoveryUrl); + this.defaultHeaders = options.headers != null ? options.headers : {}; if (options.success != null) { this.build(); } } SwaggerApi.prototype.build = function() { - var _this = this; - this.progress('fetching resource list: ' + this.discoveryUrl); - return jQuery.getJSON(this.discoveryUrl, function(response) { - var res, resource, _i, _j, _len, _len1, _ref, _ref1; - if (response.apiVersion != null) { - _this.apiVersion = response.apiVersion; - } - if ((response.basePath != null) && jQuery.trim(response.basePath).length > 0) { - _this.basePath = response.basePath; - if (_this.basePath.match(/^HTTP/i) == null) { - _this.fail("discoveryUrl basePath must be a URL."); - } - _this.basePath = _this.basePath.replace(/\/$/, ''); - } else { - if (_this.discoveryUrl.indexOf('?') > 0) { - _this.basePath = _this.discoveryUrl.substring(0, _this.discoveryUrl.lastIndexOf('?')); - } else { - _this.basePath = _this.discoveryUrl; - } - log('derived basepath from discoveryUrl as ' + _this.basePath); - } - _this.apis = {}; - _this.apisArray = []; - if (response.resourcePath != null) { - _this.resourcePath = response.resourcePath; - res = null; - _ref = response.apis; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - resource = _ref[_i]; - if (res === null) { - res = new SwaggerResource(resource, _this); + var e, obj, + _this = this; + this.progress('fetching resource list: ' + this.url); + obj = { + url: this.url, + method: "get", + headers: {}, + on: { + error: function(response) { + if (_this.url.substring(0, 4) !== 'http') { + return _this.fail('Please specify the protocol for ' + _this.url); + } else if (error.status === 0) { + return _this.fail('Can\'t read from server. It may not have the appropriate access-control-origin settings.'); + } else if (error.status === 404) { + return _this.fail('Can\'t read swagger JSON from ' + _this.url); } else { - res.addOperations(resource.path, resource.operations); + return _this.fail(error.status + ' : ' + error.statusText + ' ' + _this.url); } - } - if (res != null) { - _this.apis[res.name] = res; - _this.apisArray.push(res); - res.ready = true; - _this.selfReflect(); - } - } else { - _ref1 = response.apis; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - resource = _ref1[_j]; - res = new SwaggerResource(resource, _this); - _this.apis[res.name] = res; - _this.apisArray.push(res); + }, + response: function(rawResponse) { + var api, isApi, newName, operation, res, resource, response, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2; + response = JSON.parse(rawResponse.content.data); + if (response.apiVersion != null) { + _this.apiVersion = response.apiVersion; + } + _this.apis = {}; + _this.apisArray = []; + _this.produces = response.produces; + if (response.info != null) { + _this.info = response.info; + } + isApi = false; + _ref = response.apis; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + api = _ref[_i]; + if (api.operations) { + _ref1 = api.operations; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + operation = _ref1[_j]; + isApi = true; + } + } + } + if (isApi) { + newName = response.resourcePath.replace(/\//g, ''); + _this.resourcePath = response.resourcePath; + res = new SwaggerResource(response, _this); + _this.apis[newName] = res; + _this.apisArray.push(res); + } else { + if (response.basePath) { + _this.basePath = response.basePath; + } else if (_this.url.indexOf('?') > 0) { + _this.basePath = _this.url.substring(0, _this.url.lastIndexOf('?')); + } else { + _this.basePath = _this.url; + } + _ref2 = response.apis; + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + resource = _ref2[_k]; + res = new SwaggerResource(resource, _this); + _this.apis[res.name] = res; + _this.apisArray.push(res); + } + } + if (_this.success) { + _this.success(); + } + return _this; } } - return _this; - }).error(function(error) { - if (_this.discoveryUrl.substring(0, 4) !== 'http') { - return _this.fail('Please specify the protocol for ' + _this.discoveryUrl); - } else if (error.status === 0) { - return _this.fail('Can\'t read from server. It may not have the appropriate access-control-origin settings.'); - } else if (error.status === 404) { - return _this.fail('Can\'t read swagger JSON from ' + _this.discoveryUrl); - } else { - return _this.fail(error.status + ' : ' + error.statusText + ' ' + _this.discoveryUrl); - } - }); + }; + e = {}; + if (typeof window !== 'undefined') { + e = window; + } else { + e = exports; + } + e.authorizations.apply(obj); + new SwaggerHttp().execute(obj); + return this; }; SwaggerApi.prototype.selfReflect = function() { @@ -160,16 +176,6 @@ return _results; }; - SwaggerApi.prototype.suffixApiKey = function(url) { - var sep; - if ((this.api_key != null) && jQuery.trim(this.api_key).length > 0 && (url != null)) { - sep = url.indexOf('?') > 0 ? '&' : '?'; - return url + sep + this.apiKeyName + '=' + this.api_key; - } else { - return url; - } - }; - SwaggerApi.prototype.help = function() { var operation, operation_name, parameter, resource, resource_name, _i, _len, _ref, _ref1, _ref2; _ref = this.apis; @@ -196,56 +202,92 @@ SwaggerResource = (function() { + SwaggerResource.prototype.api = null; + + SwaggerResource.prototype.produces = null; + + SwaggerResource.prototype.consumes = null; + function SwaggerResource(resourceObj, api) { - var parts, + var consumes, e, obj, parts, produces, _this = this; this.api = api; + this.api = this.api; + produces = []; + consumes = []; this.path = this.api.resourcePath != null ? this.api.resourcePath : resourceObj.path; + console.log("we produce " + resourceObj.produces); + console.log('using path ' + this.path); this.description = resourceObj.description; parts = this.path.split("/"); this.name = parts[parts.length - 1].replace('.{format}', ''); this.basePath = this.api.basePath; - console.log('bp: ' + this.basePath); this.operations = {}; this.operationsArray = []; this.modelsArray = []; this.models = {}; - if ((resourceObj.operations != null) && (this.api.resourcePath != null)) { - this.api.progress('reading resource ' + this.name + ' models and operations'); - this.addModels(resourceObj.models); - this.addOperations(resourceObj.path, resourceObj.operations); - this.api[this.name] = this; + if ((resourceObj.apis != null) && (this.api.resourcePath != null)) { + this.addApiDeclaration(resourceObj); } else { if (this.path == null) { this.api.fail("SwaggerResources must have a path."); } - this.url = this.api.suffixApiKey(this.api.basePath + this.path.replace('{format}', 'json')); - console.log('basePath: ' + this.api.basePath); - console.log('url: ' + this.url); + if (this.path.substring(0, 4) === 'http') { + this.url = this.path.replace('{format}', 'json'); + } else { + this.url = this.api.basePath + this.path.replace('{format}', 'json'); + } this.api.progress('fetching resource ' + this.name + ': ' + this.url); - jQuery.getJSON(this.url, function(response) { - var endpoint, _i, _len, _ref; - if ((response.basePath != null) && jQuery.trim(response.basePath).length > 0) { - _this.basePath = response.basePath; - _this.basePath = _this.basePath.replace(/\/$/, ''); - } - _this.addModels(response.models); - if (response.apis) { - _ref = response.apis; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - endpoint = _ref[_i]; - _this.addOperations(endpoint.path, endpoint.operations); + obj = { + url: this.url, + method: "get", + headers: {}, + on: { + error: function(response) { + return _this.api.fail("Unable to read api '" + _this.name + "' from path " + _this.url + " (server returned " + error.statusText + ")"); + }, + response: function(rawResponse) { + var response; + response = JSON.parse(rawResponse.content.data); + return _this.addApiDeclaration(response); } } - _this.api[_this.name] = _this; - _this.ready = true; - return _this.api.selfReflect(); - }).error(function(error) { - return _this.api.fail("Unable to read api '" + _this.name + "' from path " + _this.url + " (server returned " + error.statusText + ")"); - }); + }; + e = {}; + if (typeof window !== 'undefined') { + e = window; + } else { + e = exports; + } + e.authorizations.apply(obj); + new SwaggerHttp().execute(obj); } } + SwaggerResource.prototype.addApiDeclaration = function(response) { + var endpoint, _i, _len, _ref; + if (response.produces != null) { + this.produces = response.produces; + } + if (response.consumes != null) { + this.consumes = response.consumes; + } + if ((response.basePath != null) && response.basePath.replace(/\s/g, '').length > 0) { + this.basePath = response.basePath; + } + this.addModels(response.models); + if (response.apis) { + _ref = response.apis; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + endpoint = _ref[_i]; + this.addOperations(endpoint.path, endpoint.operations, response.consumes, response.produces); + } + } + this.api[this.name] = this; + this.ready = true; + return this.api.selfReflect(); + }; + SwaggerResource.prototype.addModels = function(models) { var model, modelName, swaggerModel, _i, _len, _ref, _results; if (models != null) { @@ -266,30 +308,38 @@ } }; - SwaggerResource.prototype.addOperations = function(resource_path, ops) { - var consumes, err, errorResponses, o, op, _i, _j, _len, _len1, _results; + SwaggerResource.prototype.addOperations = function(resource_path, ops, consumes, produces) { + var method, o, op, responseMessages, type, _i, _len, _results; if (ops) { _results = []; for (_i = 0, _len = ops.length; _i < _len; _i++) { o = ops[_i]; - consumes = o.consumes; + consumes = this.consumes; + produces = this.produces; + if (o.consumes != null) { + consumes = o.consumes; + } else { + consumes = this.consumes; + } + if (o.produces != null) { + produces = o.produces; + } else { + produces = this.produces; + } + type = o.type || o.responseClass; + responseMessages = o.responseMessages; + method = o.method; + if (o.httpMethod) { + method = o.httpMethod; + } if (o.supportedContentTypes) { consumes = o.supportedContentTypes; } - errorResponses = o.responseMessages; - if (errorResponses) { - for (_j = 0, _len1 = errorResponses.length; _j < _len1; _j++) { - err = errorResponses[_j]; - err.reason = err.message; - } - } if (o.errorResponses) { - errorResponses = o.errorResponses; + responseMessages = o.errorResponses; } - if (o.method) { - o.httpMethod = o.method; - } - op = new SwaggerOperation(o.nickname, resource_path, o.httpMethod, o.parameters, o.summary, o.notes, o.responseClass, errorResponses, this, o.consumes, o.produces); + o.nickname = this.sanitize(o.nickname); + op = new SwaggerOperation(o.nickname, resource_path, method, o.parameters, o.summary, o.notes, type, responseMessages, this, consumes, produces); this.operations[op.nickname] = op; _results.push(this.operationsArray.push(op)); } @@ -297,19 +347,30 @@ } }; + SwaggerResource.prototype.sanitize = function(nickname) { + var op; + op = nickname.replace(/[\s!@#$%^&*()_+=\[{\]};:<>|./?,\\'""-]/g, '_'); + op = op.replace(/((_){2,})/g, '_'); + op = op.replace(/^(_)*/g, ''); + op = op.replace(/([_])*$/g, ''); + return op; + }; + SwaggerResource.prototype.help = function() { - var operation, operation_name, parameter, _i, _len, _ref, _ref1; + var msg, operation, operation_name, parameter, _i, _len, _ref, _ref1, _results; _ref = this.operations; + _results = []; for (operation_name in _ref) { operation = _ref[operation_name]; - console.log(" " + operation.nickname); + msg = " " + operation.nickname; _ref1 = operation.parameters; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { parameter = _ref1[_i]; - console.log(" " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description); + msg.concat(" " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description); } + _results.push(msg); } - return this; + return _results; }; return SwaggerResource; @@ -328,13 +389,14 @@ } SwaggerModel.prototype.setReferencedModels = function(allModels) { - var prop, _i, _len, _ref, _results; + var prop, type, _i, _len, _ref, _results; _ref = this.properties; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { prop = _ref[_i]; - if (allModels[prop.dataType] != null) { - _results.push(prop.refModel = allModels[prop.dataType]); + type = prop.type || prop.dataType; + if (allModels[type] != null) { + _results.push(prop.refModel = allModels[type]); } else if ((prop.refDataType != null) && (allModels[prop.refDataType] != null)) { _results.push(prop.refModel = allModels[prop.refDataType]); } else { @@ -456,17 +518,17 @@ SwaggerOperation = (function() { - function SwaggerOperation(nickname, path, httpMethod, parameters, summary, notes, responseClass, errorResponses, resource, consumes, produces) { + function SwaggerOperation(nickname, path, method, parameters, summary, notes, type, responseMessages, resource, consumes, produces) { var parameter, v, _i, _j, _len, _len1, _ref, _ref1, _ref2, _this = this; this.nickname = nickname; this.path = path; - this.httpMethod = httpMethod; + this.method = method; this.parameters = parameters != null ? parameters : []; this.summary = summary; this.notes = notes; - this.responseClass = responseClass; - this.errorResponses = errorResponses; + this.type = type; + this.responseMessages = responseMessages; this.resource = resource; this.consumes = consumes; this.produces = produces; @@ -478,31 +540,32 @@ if (this.path == null) { this.resource.api.fail("SwaggerOperation " + nickname + " is missing path."); } - if (this.httpMethod == null) { - this.resource.api.fail("SwaggerOperation " + nickname + " is missing httpMethod."); + if (this.method == null) { + this.resource.api.fail("SwaggerOperation " + nickname + " is missing method."); } this.path = this.path.replace('{format}', 'json'); - this.httpMethod = this.httpMethod.toLowerCase(); - this.isGetMethod = this.httpMethod === "get"; + this.method = this.method.toLowerCase(); + this.isGetMethod = this.method === "get"; this.resourceName = this.resource.name; - if (((_ref = this.responseClass) != null ? _ref.toLowerCase() : void 0) === 'void') { - this.responseClass = void 0; + if (((_ref = this.type) != null ? _ref.toLowerCase() : void 0) === 'void') { + this.type = void 0; } - if (this.responseClass != null) { - this.responseClassSignature = this.getSignature(this.responseClass, this.resource.models); - this.responseSampleJSON = this.getSampleJSON(this.responseClass, this.resource.models); + if (this.type != null) { + this.responseClassSignature = this.getSignature(this.type, this.resource.models); + this.responseSampleJSON = this.getSampleJSON(this.type, this.resource.models); } - this.errorResponses = this.errorResponses || []; + this.responseMessages = this.responseMessages || []; _ref1 = this.parameters; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { parameter = _ref1[_i]; - parameter.name = parameter.name || parameter.dataType; - if (parameter.dataType.toLowerCase() === 'boolean') { + parameter.name = parameter.name || parameter.type || parameter.dataType; + type = parameter.type || parameter.dataType; + if (type.toLowerCase() === 'boolean') { parameter.allowableValues = {}; parameter.allowableValues.values = this.resource.api.booleanValues; } - parameter.signature = this.getSignature(parameter.dataType, this.resource.models); - parameter.sampleJSON = this.getSampleJSON(parameter.dataType, this.resource.models); + parameter.signature = this.getSignature(type, this.resource.models); + parameter.sampleJSON = this.getSampleJSON(type, this.resource.models); if (parameter.allowableValues != null) { if (parameter.allowableValues.valueType === "RANGE") { parameter.isRange = true; @@ -532,52 +595,64 @@ this.resource[this.nickname] = function(args, callback, error) { return _this["do"](args, callback, error); }; + this.resource[this.nickname].help = function() { + return _this.help(); + }; } - SwaggerOperation.prototype.isListType = function(dataType) { - if (dataType.indexOf('[') >= 0) { - return dataType.substring(dataType.indexOf('[') + 1, dataType.indexOf(']')); + SwaggerOperation.prototype.isListType = function(type) { + if (type.indexOf('[') >= 0) { + return type.substring(type.indexOf('[') + 1, type.indexOf(']')); } else { return void 0; } }; - SwaggerOperation.prototype.getSignature = function(dataType, models) { + SwaggerOperation.prototype.getSignature = function(type, models) { var isPrimitive, listType; - listType = this.isListType(dataType); - isPrimitive = ((listType != null) && models[listType]) || (models[dataType] != null) ? false : true; + listType = this.isListType(type); + isPrimitive = ((listType != null) && models[listType]) || (models[type] != null) ? false : true; if (isPrimitive) { - return dataType; + return type; } else { if (listType != null) { return models[listType].getMockSignature(); } else { - return models[dataType].getMockSignature(); + return models[type].getMockSignature(); } } }; - SwaggerOperation.prototype.getSampleJSON = function(dataType, models) { + SwaggerOperation.prototype.getSampleJSON = function(type, models) { var isPrimitive, listType, val; - listType = this.isListType(dataType); - isPrimitive = ((listType != null) && models[listType]) || (models[dataType] != null) ? false : true; - val = isPrimitive ? void 0 : (listType != null ? models[listType].createJSONSample() : models[dataType].createJSONSample()); + listType = this.isListType(type); + isPrimitive = ((listType != null) && models[listType]) || (models[type] != null) ? false : true; + val = isPrimitive ? void 0 : (listType != null ? models[listType].createJSONSample() : models[type].createJSONSample()); if (val) { val = listType ? [val] : val; return JSON.stringify(val, null, 2); } }; - SwaggerOperation.prototype["do"] = function(args, callback, error) { - var body, headers; + SwaggerOperation.prototype["do"] = function(args, opts, callback, error) { + var key, param, params, possibleParams, req, requestContentType, responseContentType, value; if (args == null) { args = {}; } + if (opts == null) { + opts = {}; + } + requestContentType = null; + responseContentType = null; if ((typeof args) === "function") { - error = callback; + error = opts; callback = args; args = {}; } + if ((typeof opts) === "function") { + error = callback; + callback = opts; + } if (error == null) { error = function(xhr, textStatus, error) { return console.log(xhr, textStatus, error); @@ -585,18 +660,51 @@ } if (callback == null) { callback = function(data) { - return console.log(data); + var content; + content = null; + if (data.content != null) { + content = data.content.data; + } else { + content = "no data"; + } + return console.log("default callback: " + content); }; } + params = {}; if (args.headers != null) { - headers = args.headers; + params.headers = args.headers; delete args.headers; } if (args.body != null) { - body = args.body; + params.body = args.body; delete args.body; } - return new SwaggerRequest(this.httpMethod, this.urlify(args), headers, body, callback, error, this); + possibleParams = (function() { + var _i, _len, _ref, _results; + _ref = this.parameters; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + param = _ref[_i]; + if (param.paramType === "form" || param.paramType.toLowerCase() === "file") { + _results.push(param); + } + } + return _results; + }).call(this); + if (possibleParams) { + for (key in possibleParams) { + value = possibleParams[key]; + if (args[value.name]) { + params[value.name] = args[value.name]; + } + } + } + req = new SwaggerRequest(this.method, this.urlify(args), params, opts, callback, error, this); + if (opts.mock != null) { + return req; + } else { + return true; + } }; SwaggerOperation.prototype.pathJson = function() { @@ -607,11 +715,8 @@ return this.path.replace("{format}", "xml"); }; - SwaggerOperation.prototype.urlify = function(args, includeApiKey) { - var param, queryParams, reg, url, _i, _len, _ref; - if (includeApiKey == null) { - includeApiKey = true; - } + SwaggerOperation.prototype.urlify = function(args) { + var param, queryParams, reg, url, _i, _j, _len, _len1, _ref, _ref1; url = this.resource.basePath + this.pathJson(); _ref = this.parameters; for (_i = 0, _len = _ref.length; _i < _len; _i++) { @@ -626,13 +731,18 @@ } } } - if (includeApiKey && (this.resource.api.api_key != null) && this.resource.api.api_key.length > 0) { - args[this.apiKeyName] = this.resource.api.api_key; - } - if (this.supportHeaderParams()) { - queryParams = jQuery.param(this.getQueryParams(args, includeApiKey)); - } else { - queryParams = jQuery.param(this.getQueryAndHeaderParams(args, includeApiKey)); + queryParams = ""; + _ref1 = this.parameters; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + param = _ref1[_j]; + if (param.paramType === 'query') { + if (args[param.name]) { + if (queryParams !== "") { + queryParams += "&"; + } + queryParams += encodeURIComponent(param.name) + '=' + encodeURIComponent(args[param.name]); + } + } } if ((queryParams != null) && queryParams.length > 0) { url += "?" + queryParams; @@ -648,58 +758,44 @@ return this.resource.api.supportedSubmitMethods; }; - SwaggerOperation.prototype.getQueryAndHeaderParams = function(args, includeApiKey) { - if (includeApiKey == null) { - includeApiKey = true; - } - return this.getMatchingParams(['query', 'header'], args, includeApiKey); + SwaggerOperation.prototype.getQueryParams = function(args) { + return this.getMatchingParams(['query'], args); }; - SwaggerOperation.prototype.getQueryParams = function(args, includeApiKey) { - if (includeApiKey == null) { - includeApiKey = true; - } - return this.getMatchingParams(['query'], args, includeApiKey); + SwaggerOperation.prototype.getHeaderParams = function(args) { + return this.getMatchingParams(['header'], args); }; - SwaggerOperation.prototype.getHeaderParams = function(args, includeApiKey) { - if (includeApiKey == null) { - includeApiKey = true; - } - return this.getMatchingParams(['header'], args, includeApiKey); - }; - - SwaggerOperation.prototype.getMatchingParams = function(paramTypes, args, includeApiKey) { + SwaggerOperation.prototype.getMatchingParams = function(paramTypes, args) { var matchingParams, name, param, value, _i, _len, _ref, _ref1; matchingParams = {}; _ref = this.parameters; for (_i = 0, _len = _ref.length; _i < _len; _i++) { param = _ref[_i]; - if ((jQuery.inArray(param.paramType, paramTypes) >= 0) && args[param.name]) { + if (args && args[param.name]) { matchingParams[param.name] = args[param.name]; } } - if (includeApiKey && (this.resource.api.api_key != null) && this.resource.api.api_key.length > 0) { - matchingParams[this.resource.api.apiKeyName] = this.resource.api.api_key; - } - if (jQuery.inArray('header', paramTypes) >= 0) { - _ref1 = this.resource.api.headers; - for (name in _ref1) { - value = _ref1[name]; - matchingParams[name] = value; - } + _ref1 = this.resource.api.headers; + for (name in _ref1) { + value = _ref1[name]; + matchingParams[name] = value; } return matchingParams; }; SwaggerOperation.prototype.help = function() { - var parameter, _i, _len, _ref; + var msg, parameter, _i, _len, _ref; + msg = ""; _ref = this.parameters; for (_i = 0, _len = _ref.length; _i < _len; _i++) { parameter = _ref[_i]; - console.log(" " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description); + if (msg !== "") { + msg += "\n"; + } + msg += "* " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description; } - return this; + return msg; }; return SwaggerOperation; @@ -708,16 +804,17 @@ SwaggerRequest = (function() { - function SwaggerRequest(type, url, headers, body, successCallback, errorCallback, operation) { - var obj, + function SwaggerRequest(type, url, params, opts, successCallback, errorCallback, operation, execution) { + var body, e, fields, headers, key, myHeaders, obj, param, parent, possibleParams, requestContentType, responseContentType, urlEncoded, value, values, _this = this; this.type = type; this.url = url; - this.headers = headers; - this.body = body; + this.params = params; + this.opts = opts; this.successCallback = successCallback; this.errorCallback = errorCallback; this.operation = operation; + this.execution = execution; if (this.type == null) { throw "SwaggerRequest type is required (get/post/put/delete)."; } @@ -733,30 +830,144 @@ if (this.operation == null) { throw "SwaggerRequest operation is required."; } - if (this.operation.resource.api.verbose) { - console.log(this.asCurl()); + this.type = this.type.toUpperCase(); + headers = params.headers; + myHeaders = {}; + body = params.body; + parent = params["parent"]; + requestContentType = "application/json"; + if (body && (this.type === "POST" || this.type === "PUT" || this.type === "PATCH")) { + if (this.opts.requestContentType) { + requestContentType = this.opts.requestContentType; + } + } else { + if (((function() { + var _i, _len, _ref, _results; + _ref = this.operation.parameters; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + param = _ref[_i]; + if (param.paramType === "form") { + _results.push(param); + } + } + return _results; + }).call(this)).length > 0) { + type = param.type || param.dataType; + if (((function() { + var _i, _len, _ref, _results; + _ref = this.operation.parameters; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + param = _ref[_i]; + if (type.toLowerCase() === "file") { + _results.push(param); + } + } + return _results; + }).call(this)).length > 0) { + requestContentType = "multipart/form-data"; + } else { + requestContentType = "application/x-www-form-urlencoded"; + } + } else if (this.type !== "DELETE") { + requestContentType = null; + } } - this.headers || (this.headers = {}); - if (this.operation.resource.api.api_key != null) { - this.headers[this.apiKeyName] = this.operation.resource.api.api_key; + if (requestContentType && this.operation.consumes) { + if (this.operation.consumes.indexOf(requestContentType) === -1) { + console.log("server doesn't consume " + requestContentType + ", try " + JSON.stringify(this.operation.consumes)); + if (this.requestContentType === null) { + requestContentType = this.operation.consumes[0]; + } + } } - if (this.headers.mock == null) { + responseContentType = null; + if (this.type === "POST" || this.type === "GET" || this.type === "PATCH") { + if (this.opts.responseContentType) { + responseContentType = this.opts.responseContentType; + } else { + responseContentType = "application/json"; + } + } else { + responseContentType = null; + } + if (responseContentType && this.operation.produces) { + if (this.operation.produces.indexOf(responseContentType) === -1) { + console.log("server can't produce " + responseContentType); + } + } + if (requestContentType && requestContentType.indexOf("application/x-www-form-urlencoded") === 0) { + fields = {}; + possibleParams = (function() { + var _i, _len, _ref, _results; + _ref = this.operation.parameters; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + param = _ref[_i]; + if (param.paramType === "form") { + _results.push(param); + } + } + return _results; + }).call(this); + values = {}; + for (key in possibleParams) { + value = possibleParams[key]; + if (this.params[value.name]) { + values[value.name] = this.params[value.name]; + } + } + urlEncoded = ""; + for (key in values) { + value = values[key]; + if (urlEncoded !== "") { + urlEncoded += "&"; + } + urlEncoded += encodeURIComponent(key) + '=' + encodeURIComponent(value); + } + body = urlEncoded; + } + if (requestContentType) { + myHeaders["Content-Type"] = requestContentType; + } + if (responseContentType) { + myHeaders["Accept"] = responseContentType; + } + if (!((headers != null) && (headers.mock != null))) { obj = { - type: this.type, url: this.url, - data: JSON.stringify(this.body), - dataType: 'json', - error: function(xhr, textStatus, error) { - return _this.errorCallback(xhr, textStatus, error); - }, - success: function(data) { - return _this.successCallback(data); + method: this.type, + headers: myHeaders, + body: body, + on: { + error: function(response) { + return _this.errorCallback(response, _this.opts.parent); + }, + redirect: function(response) { + return _this.successCallback(response, _this.opts.parent); + }, + 307: function(response) { + return _this.successCallback(response, _this.opts.parent); + }, + response: function(response) { + return _this.successCallback(response, _this.opts.parent); + } } }; - if (obj.type.toLowerCase() === "post" || obj.type.toLowerCase() === "put") { - obj.contentType = "application/json"; + e = {}; + if (typeof window !== 'undefined') { + e = window; + } else { + e = exports; + } + e.authorizations.apply(obj); + if (opts.mock == null) { + new SwaggerHttp().execute(obj); + } else { + console.log(obj); + return obj; } - jQuery.ajax(obj); } } @@ -779,14 +990,122 @@ })(); - window.SwaggerApi = SwaggerApi; + SwaggerHttp = (function() { - window.SwaggerResource = SwaggerResource; + SwaggerHttp.prototype.Shred = null; - window.SwaggerOperation = SwaggerOperation; + SwaggerHttp.prototype.shred = null; - window.SwaggerRequest = SwaggerRequest; + SwaggerHttp.prototype.content = null; - window.SwaggerModelProperty = SwaggerModelProperty; + function SwaggerHttp() { + var identity, toString, + _this = this; + if (typeof window !== 'undefined') { + this.Shred = require("./shred"); + } else { + this.Shred = require("shred"); + } + this.shred = new this.Shred(); + identity = function(x) { + return x; + }; + toString = function(x) { + return x.toString(); + }; + if (typeof window !== 'undefined') { + this.content = require("./shred/content"); + this.content.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], { + parser: identity, + stringify: toString + }); + } else { + this.Shred.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], { + parser: identity, + stringify: toString + }); + } + } + + SwaggerHttp.prototype.execute = function(obj) { + return this.shred.request(obj); + }; + + return SwaggerHttp; + + })(); + + SwaggerAuthorizations = (function() { + + SwaggerAuthorizations.prototype.authz = null; + + function SwaggerAuthorizations() { + this.authz = {}; + } + + SwaggerAuthorizations.prototype.add = function(name, auth) { + this.authz[name] = auth; + return auth; + }; + + SwaggerAuthorizations.prototype.apply = function(obj) { + var key, value, _ref, _results; + _ref = this.authz; + _results = []; + for (key in _ref) { + value = _ref[key]; + _results.push(value.apply(obj)); + } + return _results; + }; + + return SwaggerAuthorizations; + + })(); + + ApiKeyAuthorization = (function() { + + ApiKeyAuthorization.prototype.type = null; + + ApiKeyAuthorization.prototype.name = null; + + ApiKeyAuthorization.prototype.value = null; + + function ApiKeyAuthorization(name, value, type) { + this.name = name; + this.value = value; + this.type = type; + } + + ApiKeyAuthorization.prototype.apply = function(obj) { + if (this.type === "query") { + if (obj.url.indexOf('?') > 0) { + obj.url = obj.url + "&" + this.name + "=" + this.value; + } else { + obj.url = obj.url + "?" + this.name + "=" + this.value; + } + return true; + } else if (this.type === "header") { + return obj.headers[this.name] = this.value; + } + }; + + return ApiKeyAuthorization; + + })(); + + this.SwaggerApi = SwaggerApi; + + this.SwaggerResource = SwaggerResource; + + this.SwaggerOperation = SwaggerOperation; + + this.SwaggerRequest = SwaggerRequest; + + this.SwaggerModelProperty = SwaggerModelProperty; + + this.ApiKeyAuthorization = ApiKeyAuthorization; + + this.authorizations = new SwaggerAuthorizations(); }).call(this); diff --git a/dist/swagger-ui.js b/dist/swagger-ui.js index 7727a913..2bcc9a0f 100644 --- a/dist/swagger-ui.js +++ b/dist/swagger-ui.js @@ -185,1041 +185,968 @@ var Docs = { (function() { var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; templates['content_type'] = template(function (Handlebars,depth0,helpers,partials,data) { - helpers = helpers || Handlebars.helpers; - var buffer = "", stack1, stack2, foundHelper, tmp1, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0; + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", self=this; function program1(depth0,data) { - var buffer = "", stack1, stack2; - buffer += "\n "; - foundHelper = helpers.produces; - stack1 = foundHelper || depth0.produces; - stack2 = helpers.each; - tmp1 = self.program(2, program2, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.noop; - stack1 = stack2.call(depth0, stack1, tmp1); + var buffer = "", stack1; + buffer += "\n "; + stack1 = helpers.each.call(depth0, depth0.produces, {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n"; - return buffer;} + return buffer; + } function program2(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + return buffer; + } function program4(depth0,data) { - return "\n \n";} + return "\n \n"; + } buffer += "\n\n"; - return buffer;}); + return buffer; + }); })(); (function() { var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; templates['main'] = template(function (Handlebars,depth0,helpers,partials,data) { - helpers = helpers || Handlebars.helpers; - var buffer = "", stack1, stack2, foundHelper, tmp1, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0, escapeExpression=this.escapeExpression; + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; function program1(depth0,data) { + var buffer = "", stack1, stack2; + buffer += "\n
" + + escapeExpression(((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.title)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "
\n
"; + stack2 = ((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.description)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1); + if(stack2 || stack2 === 0) { buffer += stack2; } + buffer += "
\n "; + stack2 = helpers['if'].call(depth0, ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.termsOfServiceUrl), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data}); + if(stack2 || stack2 === 0) { buffer += stack2; } + buffer += "\n "; + stack2 = helpers['if'].call(depth0, ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.contact), {hash:{},inverse:self.noop,fn:self.program(4, program4, data),data:data}); + if(stack2 || stack2 === 0) { buffer += stack2; } + buffer += "\n "; + stack2 = helpers['if'].call(depth0, ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.license), {hash:{},inverse:self.noop,fn:self.program(6, program6, data),data:data}); + if(stack2 || stack2 === 0) { buffer += stack2; } + buffer += "\n "; + return buffer; + } +function program2(depth0,data) { + + var buffer = "", stack1; + buffer += ""; + return buffer; + } + +function program4(depth0,data) { + + var buffer = "", stack1; + buffer += ""; + return buffer; + } + +function program6(depth0,data) { + + var buffer = "", stack1; + buffer += ""; + return buffer; + } + +function program8(depth0,data) { + var buffer = "", stack1; buffer += "\n , api version: "; - foundHelper = helpers.apiVersion; - stack1 = foundHelper || depth0.apiVersion; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "apiVersion", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n "; - return buffer;} + if (stack1 = helpers.apiVersion) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.apiVersion; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n "; + return buffer; + } - buffer += "\n
\n
    \n
\n\n
\n
\n
\n

[ base url: "; - foundHelper = helpers.basePath; - stack1 = foundHelper || depth0.basePath; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "basePath", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n "; - foundHelper = helpers.apiVersion; - stack1 = foundHelper || depth0.apiVersion; - stack2 = helpers['if']; - tmp1 = self.program(1, program1, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.noop; - stack1 = stack2.call(depth0, stack1, tmp1); + buffer += "
\n "; + stack1 = helpers['if'].call(depth0, depth0.info, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n
\n
\n
    \n
\n\n
\n
\n
\n

[ base url: "; + if (stack1 = helpers.basePath) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.basePath; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n "; + stack1 = helpers['if'].call(depth0, depth0.apiVersion, {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "]

\n
\n
\n"; - return buffer;}); + return buffer; + }); })(); (function() { var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; templates['operation'] = template(function (Handlebars,depth0,helpers,partials,data) { - helpers = helpers || Handlebars.helpers; - var buffer = "", stack1, stack2, foundHelper, tmp1, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0, escapeExpression=this.escapeExpression; + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; function program1(depth0,data) { var buffer = "", stack1; buffer += "\n

Implementation Notes

\n

"; - foundHelper = helpers.notes; - stack1 = foundHelper || depth0.notes; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "notes", { hash: {} }); } + if (stack1 = helpers.notes) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.notes; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "

\n "; - return buffer;} + return buffer; + } function program3(depth0,data) { - return "\n

Response Class

\n

\n
\n
\n ";} + return "\n

Response Class

\n

\n
\n
\n "; + } function program5(depth0,data) { - return "\n

Parameters

\n \n \n \n \n \n \n \n \n \n \n \n\n \n
ParameterValueDescriptionParameter TypeData Type
\n ";} + return "\n

Parameters

\n \n \n \n \n \n \n \n \n \n \n \n\n \n
ParameterValueDescriptionParameter TypeData Type
\n "; + } function program7(depth0,data) { - return "\n
\n

Error Status Codes

\n \n \n \n \n \n \n \n \n \n \n
HTTP Status CodeReason
\n ";} + return "\n
\n

Error Status Codes

\n \n \n \n \n \n \n \n \n \n \n
HTTP Status CodeReason
\n "; + } function program9(depth0,data) { - return "\n ";} + return "\n "; + } function program11(depth0,data) { - return "\n
\n \n \n \n
\n ";} + return "\n
\n \n \n \n
\n "; + } buffer += "\n
    \n
  • \n
    \n

    \n \n "; - foundHelper = helpers.httpMethod; - stack1 = foundHelper || depth0.httpMethod; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "httpMethod", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n \n \n "; - foundHelper = helpers.path; - stack1 = foundHelper || depth0.path; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "path", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n \n

    \n \n"; - return buffer;}); + return buffer; + }); })(); (function() { var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; templates['param'] = template(function (Handlebars,depth0,helpers,partials,data) { - helpers = helpers || Handlebars.helpers; - var buffer = "", stack1, stack2, foundHelper, tmp1, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0, escapeExpression=this.escapeExpression; + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; function program1(depth0,data) { - var buffer = "", stack1, stack2; + var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.isFile; - stack1 = foundHelper || depth0.isFile; - stack2 = helpers['if']; - tmp1 = self.program(2, program2, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(4, program4, data); - stack1 = stack2.call(depth0, stack1, tmp1); + stack1 = helpers['if'].call(depth0, depth0.isFile, {hash:{},inverse:self.program(4, program4, data),fn:self.program(2, program2, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - return buffer;} + return buffer; + } function program2(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'/>\n
    \n "; + return buffer; + } function program4(depth0,data) { - var buffer = "", stack1, stack2; + var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.defaultValue; - stack1 = foundHelper || depth0.defaultValue; - stack2 = helpers['if']; - tmp1 = self.program(5, program5, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(7, program7, data); - stack1 = stack2.call(depth0, stack1, tmp1); + stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(7, program7, data),fn:self.program(5, program5, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - return buffer;} + return buffer; + } function program5(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'>"; + if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n "; + return buffer; + } function program7(depth0,data) { var buffer = "", stack1; buffer += "\n \n
    \n
    \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'>\n
    \n
    \n "; + return buffer; + } function program9(depth0,data) { - var buffer = "", stack1, stack2; + var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.defaultValue; - stack1 = foundHelper || depth0.defaultValue; - stack2 = helpers['if']; - tmp1 = self.program(10, program10, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(12, program12, data); - stack1 = stack2.call(depth0, stack1, tmp1); + stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(12, program12, data),fn:self.program(10, program10, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - return buffer;} + return buffer; + } function program10(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "' placeholder='' type='text' value='"; + if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'/>\n "; + return buffer; + } function program12(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "' placeholder='' type='text' value=''/>\n "; + return buffer; + } buffer += ""; - foundHelper = helpers.name; - stack1 = foundHelper || depth0.name; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "name", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n\n\n "; - foundHelper = helpers.isBody; - stack1 = foundHelper || depth0.isBody; - stack2 = helpers['if']; - tmp1 = self.program(1, program1, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(9, program9, data); - stack1 = stack2.call(depth0, stack1, tmp1); + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n\n\n "; + stack1 = helpers['if'].call(depth0, depth0.isBody, {hash:{},inverse:self.program(9, program9, data),fn:self.program(1, program1, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n\n\n"; - foundHelper = helpers.description; - stack1 = foundHelper || depth0.description; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "description", { hash: {} }); } + if (stack1 = helpers.description) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n"; - foundHelper = helpers.paramType; - stack1 = foundHelper || depth0.paramType; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "paramType", { hash: {} }); } + if (stack1 = helpers.paramType) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.paramType; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if(stack1 || stack1 === 0) { buffer += stack1; } - buffer += "\n\n \n\n\n"; - return buffer;}); + buffer += "\n\n \n\n"; + return buffer; + }); })(); (function() { var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; templates['param_list'] = template(function (Handlebars,depth0,helpers,partials,data) { - helpers = helpers || Handlebars.helpers; - var buffer = "", stack1, stack2, foundHelper, tmp1, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0, escapeExpression=this.escapeExpression; + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, stack2, self=this, functionType="function", escapeExpression=this.escapeExpression; function program1(depth0,data) { - return "\n ";} + return "\n "; + } function program3(depth0,data) { - var buffer = "", stack1, stack2; + var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.defaultValue; - stack1 = foundHelper || depth0.defaultValue; - stack2 = helpers['if']; - tmp1 = self.program(4, program4, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(6, program6, data); - stack1 = stack2.call(depth0, stack1, tmp1); + stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(6, program6, data),fn:self.program(4, program4, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - return buffer;} + return buffer; + } function program4(depth0,data) { - return "\n ";} + return "\n "; + } function program6(depth0,data) { - return "\n \n ";} + return "\n \n "; + } function program8(depth0,data) { - var buffer = "", stack1, stack2; + var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.isDefault; - stack1 = foundHelper || depth0.isDefault; - stack2 = helpers['if']; - tmp1 = self.program(9, program9, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(11, program11, data); - stack1 = stack2.call(depth0, stack1, tmp1); + stack1 = helpers['if'].call(depth0, depth0.isDefault, {hash:{},inverse:self.program(11, program11, data),fn:self.program(9, program9, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - return buffer;} + return buffer; + } function program9(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.value) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.value; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'>"; + if (stack1 = helpers.value) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.value; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + " (default)\n "; + return buffer; + } function program11(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.value) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.value; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'>"; + if (stack1 = helpers.value) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.value; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n "; + return buffer; + } buffer += ""; - foundHelper = helpers.name; - stack1 = foundHelper || depth0.name; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "name", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n\n \n "; + stack1 = helpers['if'].call(depth0, depth0.required, {hash:{},inverse:self.program(3, program3, data),fn:self.program(1, program1, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - foundHelper = helpers.allowableValues; - stack1 = foundHelper || depth0.allowableValues; - stack1 = (stack1 === null || stack1 === undefined || stack1 === false ? stack1 : stack1.descriptiveValues); - stack2 = helpers.each; - tmp1 = self.program(8, program8, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.noop; - stack1 = stack2.call(depth0, stack1, tmp1); - if(stack1 || stack1 === 0) { buffer += stack1; } + stack2 = helpers.each.call(depth0, ((stack1 = depth0.allowableValues),stack1 == null || stack1 === false ? stack1 : stack1.descriptiveValues), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data}); + if(stack2 || stack2 === 0) { buffer += stack2; } buffer += "\n \n\n"; - foundHelper = helpers.description; - stack1 = foundHelper || depth0.description; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "description", { hash: {} }); } - if(stack1 || stack1 === 0) { buffer += stack1; } + if (stack2 = helpers.description) { stack2 = stack2.call(depth0, {hash:{},data:data}); } + else { stack2 = depth0.description; stack2 = typeof stack2 === functionType ? stack2.apply(depth0) : stack2; } + if(stack2 || stack2 === 0) { buffer += stack2; } buffer += "\n"; - foundHelper = helpers.paramType; - stack1 = foundHelper || depth0.paramType; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "paramType", { hash: {} }); } - if(stack1 || stack1 === 0) { buffer += stack1; } + if (stack2 = helpers.paramType) { stack2 = stack2.call(depth0, {hash:{},data:data}); } + else { stack2 = depth0.paramType; stack2 = typeof stack2 === functionType ? stack2.apply(depth0) : stack2; } + if(stack2 || stack2 === 0) { buffer += stack2; } buffer += "\n\n"; - return buffer;}); + return buffer; + }); })(); (function() { var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; templates['param_readonly'] = template(function (Handlebars,depth0,helpers,partials,data) { - helpers = helpers || Handlebars.helpers; - var buffer = "", stack1, stack2, foundHelper, tmp1, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0, escapeExpression=this.escapeExpression; + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; function program1(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'>"; + if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n "; + return buffer; + } function program3(depth0,data) { - var buffer = "", stack1, stack2; + var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.defaultValue; - stack1 = foundHelper || depth0.defaultValue; - stack2 = helpers['if']; - tmp1 = self.program(4, program4, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(6, program6, data); - stack1 = stack2.call(depth0, stack1, tmp1); + stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(6, program6, data),fn:self.program(4, program4, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - return buffer;} + return buffer; + } function program4(depth0,data) { var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.defaultValue; - stack1 = foundHelper || depth0.defaultValue; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "defaultValue", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n "; - return buffer;} + if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n "; + return buffer; + } function program6(depth0,data) { - return "\n (empty)\n ";} + return "\n (empty)\n "; + } buffer += ""; - foundHelper = helpers.name; - stack1 = foundHelper || depth0.name; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "name", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n\n "; - foundHelper = helpers.isBody; - stack1 = foundHelper || depth0.isBody; - stack2 = helpers['if']; - tmp1 = self.program(1, program1, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(3, program3, data); - stack1 = stack2.call(depth0, stack1, tmp1); + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n\n "; + stack1 = helpers['if'].call(depth0, depth0.isBody, {hash:{},inverse:self.program(3, program3, data),fn:self.program(1, program1, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n\n"; - foundHelper = helpers.description; - stack1 = foundHelper || depth0.description; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "description", { hash: {} }); } + if (stack1 = helpers.description) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n"; - foundHelper = helpers.paramType; - stack1 = foundHelper || depth0.paramType; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "paramType", { hash: {} }); } + if (stack1 = helpers.paramType) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.paramType; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n\n"; - return buffer;}); + return buffer; + }); })(); (function() { var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; templates['param_readonly_required'] = template(function (Handlebars,depth0,helpers,partials,data) { - helpers = helpers || Handlebars.helpers; - var buffer = "", stack1, stack2, foundHelper, tmp1, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0, escapeExpression=this.escapeExpression; + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; function program1(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'>"; + if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n "; + return buffer; + } function program3(depth0,data) { - var buffer = "", stack1, stack2; + var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.defaultValue; - stack1 = foundHelper || depth0.defaultValue; - stack2 = helpers['if']; - tmp1 = self.program(4, program4, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(6, program6, data); - stack1 = stack2.call(depth0, stack1, tmp1); + stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(6, program6, data),fn:self.program(4, program4, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - return buffer;} + return buffer; + } function program4(depth0,data) { var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.defaultValue; - stack1 = foundHelper || depth0.defaultValue; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "defaultValue", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n "; - return buffer;} + if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n "; + return buffer; + } function program6(depth0,data) { - return "\n (empty)\n ";} + return "\n (empty)\n "; + } buffer += ""; - foundHelper = helpers.name; - stack1 = foundHelper || depth0.name; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "name", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n\n "; - foundHelper = helpers.isBody; - stack1 = foundHelper || depth0.isBody; - stack2 = helpers['if']; - tmp1 = self.program(1, program1, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(3, program3, data); - stack1 = stack2.call(depth0, stack1, tmp1); + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n\n "; + stack1 = helpers['if'].call(depth0, depth0.isBody, {hash:{},inverse:self.program(3, program3, data),fn:self.program(1, program1, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n\n"; - foundHelper = helpers.description; - stack1 = foundHelper || depth0.description; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "description", { hash: {} }); } + if (stack1 = helpers.description) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n"; - foundHelper = helpers.paramType; - stack1 = foundHelper || depth0.paramType; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "paramType", { hash: {} }); } + if (stack1 = helpers.paramType) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.paramType; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n\n"; - return buffer;}); + return buffer; + }); })(); (function() { var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; templates['param_required'] = template(function (Handlebars,depth0,helpers,partials,data) { - helpers = helpers || Handlebars.helpers; - var buffer = "", stack1, stack2, foundHelper, tmp1, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0, escapeExpression=this.escapeExpression; + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; function program1(depth0,data) { - var buffer = "", stack1, stack2; + var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.isFile; - stack1 = foundHelper || depth0.isFile; - stack2 = helpers['if']; - tmp1 = self.program(2, program2, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(4, program4, data); - stack1 = stack2.call(depth0, stack1, tmp1); + stack1 = helpers['if'].call(depth0, depth0.isFile, {hash:{},inverse:self.program(4, program4, data),fn:self.program(2, program2, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - return buffer;} + return buffer; + } function program2(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'/>\n "; + return buffer; + } function program4(depth0,data) { - var buffer = "", stack1, stack2; + var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.defaultValue; - stack1 = foundHelper || depth0.defaultValue; - stack2 = helpers['if']; - tmp1 = self.program(5, program5, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(7, program7, data); - stack1 = stack2.call(depth0, stack1, tmp1); + stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(7, program7, data),fn:self.program(5, program5, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - return buffer;} + return buffer; + } function program5(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'>"; + if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n "; + return buffer; + } function program7(depth0,data) { var buffer = "", stack1; buffer += "\n \n
    \n
    \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'>\n
    \n
    \n "; + return buffer; + } function program9(depth0,data) { - var buffer = "", stack1, stack2; + var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.isFile; - stack1 = foundHelper || depth0.isFile; - stack2 = helpers['if']; - tmp1 = self.program(10, program10, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(12, program12, data); - stack1 = stack2.call(depth0, stack1, tmp1); + stack1 = helpers['if'].call(depth0, depth0.isFile, {hash:{},inverse:self.program(12, program12, data),fn:self.program(10, program10, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - return buffer;} + return buffer; + } function program10(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'/>\n "; + return buffer; + } function program12(depth0,data) { - var buffer = "", stack1, stack2; + var buffer = "", stack1; buffer += "\n "; - foundHelper = helpers.defaultValue; - stack1 = foundHelper || depth0.defaultValue; - stack2 = helpers['if']; - tmp1 = self.program(13, program13, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(15, program15, data); - stack1 = stack2.call(depth0, stack1, tmp1); + stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(15, program15, data),fn:self.program(13, program13, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n "; - return buffer;} + return buffer; + } function program13(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "' placeholder='(required)' type='text' value='"; + if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "'/>\n "; + return buffer; + } function program15(depth0,data) { var buffer = "", stack1; buffer += "\n \n "; - return buffer;} + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "' placeholder='(required)' type='text' value=''/>\n "; + return buffer; + } buffer += ""; - foundHelper = helpers.name; - stack1 = foundHelper || depth0.name; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "name", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n\n "; - foundHelper = helpers.isBody; - stack1 = foundHelper || depth0.isBody; - stack2 = helpers['if']; - tmp1 = self.program(1, program1, data); - tmp1.hash = {}; - tmp1.fn = tmp1; - tmp1.inverse = self.program(9, program9, data); - stack1 = stack2.call(depth0, stack1, tmp1); + if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n\n "; + stack1 = helpers['if'].call(depth0, depth0.isBody, {hash:{},inverse:self.program(9, program9, data),fn:self.program(1, program1, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n\n\n "; - foundHelper = helpers.description; - stack1 = foundHelper || depth0.description; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "description", { hash: {} }); } + if (stack1 = helpers.description) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n\n"; - foundHelper = helpers.paramType; - stack1 = foundHelper || depth0.paramType; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "paramType", { hash: {} }); } + if (stack1 = helpers.paramType) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.paramType; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n\n"; - return buffer;}); + return buffer; + }); +})(); + +(function() { + var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; +templates['parameter_content_type'] = template(function (Handlebars,depth0,helpers,partials,data) { + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", self=this; + +function program1(depth0,data) { + + var buffer = "", stack1; + buffer += "\n "; + stack1 = helpers.each.call(depth0, depth0.consumes, {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n"; + return buffer; + } +function program2(depth0,data) { + + var buffer = "", stack1; + buffer += "\n \n "; + return buffer; + } + +function program4(depth0,data) { + + + return "\n \n"; + } + + buffer += "\n\n"; + return buffer; + }); })(); (function() { var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; templates['resource'] = template(function (Handlebars,depth0,helpers,partials,data) { - helpers = helpers || Handlebars.helpers; - var buffer = "", stack1, foundHelper, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0, escapeExpression=this.escapeExpression; + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression; - buffer += "\n\n"; - return buffer;}); + buffer += "\n\n"; + return buffer; + }); +})(); + +(function() { + var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; +templates['response_content_type'] = template(function (Handlebars,depth0,helpers,partials,data) { + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", self=this; + +function program1(depth0,data) { + + var buffer = "", stack1; + buffer += "\n "; + stack1 = helpers.each.call(depth0, depth0.produces, {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n"; + return buffer; + } +function program2(depth0,data) { + + var buffer = "", stack1; + buffer += "\n \n "; + return buffer; + } + +function program4(depth0,data) { + + + return "\n \n"; + } + + buffer += "\n\n"; + return buffer; + }); })(); (function() { var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; templates['signature'] = template(function (Handlebars,depth0,helpers,partials,data) { - helpers = helpers || Handlebars.helpers; - var buffer = "", stack1, foundHelper, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0, escapeExpression=this.escapeExpression; + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression; buffer += "
    \n\n
    \n\n
    \n
    \n "; - foundHelper = helpers.signature; - stack1 = foundHelper || depth0.signature; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "signature", { hash: {} }); } + if (stack1 = helpers.signature) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.signature; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n
    \n\n
    \n
    ";
    -  foundHelper = helpers.sampleJSON;
    -  stack1 = foundHelper || depth0.sampleJSON;
    -  if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); }
    -  else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "sampleJSON", { hash: {} }); }
    -  buffer += escapeExpression(stack1) + "
    \n \n
    \n
    \n\n"; - return buffer;}); + if (stack1 = helpers.sampleJSON) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.sampleJSON; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n \n
    \n
    \n\n"; + return buffer; + }); })(); (function() { var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; templates['status_code'] = template(function (Handlebars,depth0,helpers,partials,data) { - helpers = helpers || Handlebars.helpers; - var buffer = "", stack1, foundHelper, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0, escapeExpression=this.escapeExpression; + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression; buffer += ""; - foundHelper = helpers.code; - stack1 = foundHelper || depth0.code; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "code", { hash: {} }); } - buffer += escapeExpression(stack1) + "\n"; - foundHelper = helpers.reason; - stack1 = foundHelper || depth0.reason; - if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); } - else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "reason", { hash: {} }); } + if (stack1 = helpers.code) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.code; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + buffer += escapeExpression(stack1) + + "\n"; + if (stack1 = helpers.reason) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.reason; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n\n"; - return buffer;}); + return buffer; + }); })(); // Generated by CoffeeScript 1.4.0 (function() { - var ContentTypeView, HeaderView, MainView, OperationView, ParameterView, ResourceView, SignatureView, StatusCodeView, SwaggerUi, + var ContentTypeView, HeaderView, MainView, OperationView, ParameterContentTypeView, ParameterView, ResourceView, ResponseContentTypeView, SignatureView, StatusCodeView, SwaggerUi, __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; @@ -1272,18 +1199,24 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials }; SwaggerUi.prototype.updateSwaggerUi = function(data) { - this.options.discoveryUrl = data.discoveryUrl; - this.options.apiKey = data.apiKey; + this.options.url = data.url; return this.load(); }; SwaggerUi.prototype.load = function() { - var _ref; + var url, _ref; if ((_ref = this.mainView) != null) { _ref.clear(); } - this.headerView.update(this.options.discoveryUrl, this.options.apiKey); - return this.api = new SwaggerApi(this.options); + url = this.options.url; + if (url.indexOf("http") !== 0) { + url = this.buildUrl(window.location.href.toString(), url); + } + this.options.url = url; + this.headerView.update(url); + this.api = new SwaggerApi(this.options); + this.api.build(); + return this.api; }; SwaggerUi.prototype.render = function() { @@ -1309,6 +1242,18 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials }, 400); }; + SwaggerUi.prototype.buildUrl = function(base, url) { + var parts; + console.log("base is " + base); + parts = base.split("/"); + base = parts[0] + "//" + parts[2]; + if (url.indexOf("/") === 0) { + return base + url; + } else { + return base + "/" + url; + } + }; + SwaggerUi.prototype.showMessage = function(data) { if (data == null) { data = ''; @@ -1358,15 +1303,13 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials HeaderView.prototype.showPetStore = function(e) { return this.trigger('update-swagger-ui', { - discoveryUrl: "http://petstore.swagger.wordnik.com/api/api-docs.json", - apiKey: "special-key" + url: "http://petstore.swagger.wordnik.com/api/api-docs.json" }); }; HeaderView.prototype.showWordnikDev = function(e) { return this.trigger('update-swagger-ui', { - discoveryUrl: "http://api.wordnik.com/v4/resources.json", - apiKey: "" + url: "http://api.wordnik.com/v4/resources.json" }); }; @@ -1381,7 +1324,7 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials e.preventDefault(); } return this.trigger('update-swagger-ui', { - discoveryUrl: $('#input_baseUrl').val(), + url: $('#input_baseUrl').val(), apiKey: $('#input_apiKey').val() }); }; @@ -1391,11 +1334,9 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials trigger = false; } $('#input_baseUrl').val(url); - $('#input_apiKey').val(apiKey); if (trigger) { return this.trigger('update-swagger-ui', { - discoveryUrl: url, - apiKey: apiKey + url: url }); } }; @@ -1500,8 +1441,8 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials OperationView.prototype.initialize = function() {}; OperationView.prototype.render = function() { - var contentTypeModel, contentTypeView, isMethodSubmissionSupported, param, responseSignatureView, signatureModel, statusCode, _i, _j, _len, _len1, _ref, _ref1; - isMethodSubmissionSupported = jQuery.inArray(this.model.httpMethod, this.model.supportedSubmitMethods()) >= 0; + var contentTypeModel, isMethodSubmissionSupported, param, responseContentTypeView, responseSignatureView, signatureModel, statusCode, type, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2; + isMethodSubmissionSupported = true; if (!isMethodSubmissionSupported) { this.model.isReadOnly = true; } @@ -1518,36 +1459,44 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials }); $('.model-signature', $(this.el)).append(responseSignatureView.render().el); } else { - $('.model-signature', $(this.el)).html(this.model.responseClass); + $('.model-signature', $(this.el)).html(this.model.type); } contentTypeModel = { isParam: false }; - if (this.model.supportedContentTypes) { - contentTypeModel.produces = this.model.supportedContentTypes; - } - if (this.model.produces) { - contentTypeModel.produces = this.model.produces; - } - contentTypeView = new ContentTypeView({ - model: contentTypeModel - }); - $('.content-type', $(this.el)).append(contentTypeView.render().el); + contentTypeModel.consumes = this.model.consumes; + contentTypeModel.produces = this.model.produces; _ref = this.model.parameters; for (_i = 0, _len = _ref.length; _i < _len; _i++) { param = _ref[_i]; - this.addParameter(param); + type = param.type || param.dataType; + if (type.toLowerCase() === 'file') { + if (!contentTypeModel.consumes) { + console.log("set content type "); + contentTypeModel.consumes = 'multipart/form-data'; + } + } } - _ref1 = this.model.errorResponses; + responseContentTypeView = new ResponseContentTypeView({ + model: contentTypeModel + }); + $('.response-content-type', $(this.el)).append(responseContentTypeView.render().el); + _ref1 = this.model.parameters; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - statusCode = _ref1[_j]; + param = _ref1[_j]; + this.addParameter(param, contentTypeModel.consumes); + } + _ref2 = this.model.responseMessages; + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + statusCode = _ref2[_k]; this.addStatusCode(statusCode); } return this; }; - OperationView.prototype.addParameter = function(param) { + OperationView.prototype.addParameter = function(param, consumes) { var paramView; + param.consumes = consumes; paramView = new ParameterView({ model: param, tagName: 'tr', @@ -1566,8 +1515,7 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials }; OperationView.prototype.submitOperation = function(e) { - var bodyParam, consumes, error_free, form, headerParams, invocationUrl, isFileUpload, isFormPost, map, o, obj, param, paramContentTypeField, responseContentTypeField, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2, _ref3, _ref4, - _this = this; + var error_free, form, map, o, opts, _i, _j, _len, _len1, _ref, _ref1; if (e != null) { e.preventDefault(); } @@ -1588,108 +1536,33 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials }); if (error_free) { map = {}; - _ref = form.serializeArray(); + opts = { + parent: this + }; + _ref = form.find("input"); for (_i = 0, _len = _ref.length; _i < _len; _i++) { o = _ref[_i]; if ((o.value != null) && jQuery.trim(o.value).length > 0) { - map[o.name] = o.value; + map[o.name] = encodeURI(o.value); } } - isFileUpload = form.children().find('input[type~="file"]').size() !== 0; - isFormPost = false; - consumes = "application/json"; - if (this.model.consumes && this.model.consumes.length > 0) { - consumes = this.model.consumes[0]; - } else { - _ref1 = this.model.parameters; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - o = _ref1[_j]; - if (o.paramType === 'form') { - isFormPost = true; - consumes = false; - } - } - if (isFileUpload) { - consumes = false; - } else if (this.model.httpMethod.toLowerCase() === "post" && isFormPost === false) { - consumes = "application/json"; + _ref1 = form.find("textarea"); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + o = _ref1[_j]; + if ((o.value != null) && jQuery.trim(o.value).length > 0) { + map["body"] = o.value; } } - if (isFileUpload) { - bodyParam = new FormData(); - _ref2 = this.model.parameters; - for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { - param = _ref2[_k]; - if ((param.paramType === 'body' || 'form') && param.name !== 'file' && param.name !== 'File' && (map[param.name] != null)) { - bodyParam.append(param.name, map[param.name]); - } - } - $.each(form.children().find('input[type~="file"]'), function(i, el) { - return bodyParam.append($(el).attr('name'), el.files[0]); - }); - console.log(bodyParam); - } else if (isFormPost) { - bodyParam = new FormData(); - _ref3 = this.model.parameters; - for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { - param = _ref3[_l]; - if (map[param.name] != null) { - bodyParam.append(param.name, map[param.name]); - } - } - } else { - bodyParam = null; - _ref4 = this.model.parameters; - for (_m = 0, _len4 = _ref4.length; _m < _len4; _m++) { - param = _ref4[_m]; - if (param.paramType === 'body') { - bodyParam = map[param.name]; - } - } - } - log("bodyParam = " + bodyParam); - headerParams = null; - invocationUrl = this.model.supportHeaderParams() ? (headerParams = this.model.getHeaderParams(map), this.model.urlify(map, false)) : this.model.urlify(map, true); - log('submitting ' + invocationUrl); - $(".request_url", $(this.el)).html("
    " + invocationUrl + "
    "); - $(".response_throbber", $(this.el)).show(); - obj = { - type: this.model.httpMethod, - url: invocationUrl, - headers: headerParams, - data: bodyParam, - contentType: consumes, - dataType: 'json', - processData: false, - error: function(xhr, textStatus, error) { - return _this.showErrorStatus(xhr, textStatus, error); - }, - success: function(data) { - return _this.showResponse(data); - }, - complete: function(data) { - return _this.showCompleteStatus(data); - } - }; - paramContentTypeField = $("td select[name=contentType]", $(this.el)).val(); - if (paramContentTypeField) { - obj.contentType = paramContentTypeField; - } - log('content type = ' + obj.contentType); - if (!(obj.data || (obj.type === 'GET' || obj.type === 'DELETE')) && obj.contentType === !"application/x-www-form-urlencoded") { - obj.contentType = false; - } - log('content type is now = ' + obj.contentType); - responseContentTypeField = $('.content > .content-type > div > select[name=contentType]', $(this.el)).val(); - if (responseContentTypeField) { - obj.headers = obj.headers != null ? obj.headers : {}; - obj.headers.accept = responseContentTypeField; - } - jQuery.ajax(obj); - return false; + opts.responseContentType = $("div select[name=responseContentType]", $(this.el)).val(); + opts.requestContentType = $("div select[name=parameterContentType]", $(this.el)).val(); + return this.model["do"](map, opts, this.showCompleteStatus, this.showErrorStatus, this); } }; + OperationView.prototype.success = function(response, parent) { + return parent.showCompleteStatus(response); + }; + OperationView.prototype.hideResponse = function(e) { if (e != null) { e.preventDefault(); @@ -1704,12 +1577,12 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials return $(".response_body", $(this.el)).html(escape(prettyJson)); }; - OperationView.prototype.showErrorStatus = function(data) { - return this.showStatus(data); + OperationView.prototype.showErrorStatus = function(data, parent) { + return parent.showStatus(data); }; - OperationView.prototype.showCompleteStatus = function(data) { - return this.showStatus(data); + OperationView.prototype.showCompleteStatus = function(data, parent) { + return parent.showStatus(data); }; OperationView.prototype.formatXml = function(xml) { @@ -1786,18 +1659,31 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials }; OperationView.prototype.showStatus = function(data) { - var code, pre, response_body; - try { - code = $('').text(JSON.stringify(JSON.parse(data.responseText), null, 2)); + var code, content, contentType, headers, pre, response_body; + content = data.content.data; + headers = data.getHeaders(); + contentType = headers["Content-Type"]; + if (content === void 0) { + code = $('').text("no content"); pre = $('
    ').append(code);
    -      } catch (error) {
    -        code = $('').text(this.formatXml(data.responseText));
    +      } else if (contentType.indexOf("application/json") === 0) {
    +        code = $('').text(JSON.stringify(JSON.parse(content), null, 2));
    +        pre = $('
    ').append(code);
    +      } else if (contentType.indexOf("application/xml") === 0) {
    +        code = $('').text(this.formatXml(content));
             pre = $('
    ').append(code);
    +      } else if (contentType.indexOf("text/html") === 0) {
    +        code = $('').html(content);
    +        pre = $('
    ').append(code);
    +      } else {
    +        code = $('').text(content);
    +        pre = $('
    ').append(code);
           }
           response_body = pre;
    +      $(".request_url").html("
    " + data.request.url + "
    "); $(".response_code", $(this.el)).html("
    " + data.status + "
    "); $(".response_body", $(this.el)).html(response_body); - $(".response_headers", $(this.el)).html("
    " + data.getAllResponseHeaders() + "
    "); + $(".response_headers", $(this.el)).html("
    " + JSON.stringify(data.getHeaders()) + "
    "); $(".response", $(this.el)).slideDown(); $(".response_hider", $(this.el)).show(); $(".response_throbber", $(this.el)).hide(); @@ -1806,7 +1692,7 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials OperationView.prototype.toggleOperationContent = function() { var elem; - elem = $('#' + Docs.escapeResourceName(this.model.resourceName) + "_" + this.model.nickname + "_" + this.model.httpMethod + "_" + this.model.number + "_content"); + elem = $('#' + Docs.escapeResourceName(this.model.resourceName) + "_" + this.model.nickname + "_" + this.model.method + "_" + this.model.number + "_content"); if (elem.is(':visible')) { return Docs.collapseOperation(elem); } else { @@ -1854,11 +1740,12 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials ParameterView.prototype.initialize = function() {}; ParameterView.prototype.render = function() { - var contentTypeModel, contentTypeView, signatureModel, signatureView, template; + var contentTypeModel, isParam, parameterContentTypeView, responseContentTypeView, signatureModel, signatureView, template, type; + type = this.model.type || this.model.dataType; if (this.model.paramType === 'body') { this.model.isBody = true; } - if (this.model.dataType === 'file') { + if (type.toLowerCase() === 'file') { this.model.isFile = true; } template = this.template(); @@ -1877,19 +1764,25 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials } else { $('.model-signature', $(this.el)).html(this.model.signature); } + isParam = false; + if (this.model.isBody) { + isParam = true; + } contentTypeModel = { - isParam: false + isParam: isParam }; - if (this.model.supportedContentTypes) { - contentTypeModel.produces = this.model.supportedContentTypes; + contentTypeModel.consumes = this.model.consumes; + if (isParam) { + parameterContentTypeView = new ParameterContentTypeView({ + model: contentTypeModel + }); + $('.parameter-content-type', $(this.el)).append(parameterContentTypeView.render().el); + } else { + responseContentTypeView = new ResponseContentTypeView({ + model: contentTypeModel + }); + $('.response-content-type', $(this.el)).append(responseContentTypeView.render().el); } - if (this.model.produces) { - contentTypeModel.produces = this.model.produces; - } - contentTypeView = new ContentTypeView({ - model: contentTypeModel - }); - $('.content-type', $(this.el)).append(contentTypeView.render().el); return this; }; @@ -2000,12 +1893,7 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials var template; template = this.template(); $(this.el).html(template(this.model)); - this.isParam = this.model.isParam; - if (this.isParam) { - $('label[for=contentType]', $(this.el)).text('Parameter content type:'); - } else { - $('label[for=contentType]', $(this.el)).text('Response Content Type'); - } + $('label[for=contentType]', $(this.el)).text('Response Content Type'); return this; }; @@ -2017,4 +1905,56 @@ templates['status_code'] = template(function (Handlebars,depth0,helpers,partials })(Backbone.View); + ResponseContentTypeView = (function(_super) { + + __extends(ResponseContentTypeView, _super); + + function ResponseContentTypeView() { + return ResponseContentTypeView.__super__.constructor.apply(this, arguments); + } + + ResponseContentTypeView.prototype.initialize = function() {}; + + ResponseContentTypeView.prototype.render = function() { + var template; + template = this.template(); + $(this.el).html(template(this.model)); + $('label[for=responseContentType]', $(this.el)).text('Response Content Type'); + return this; + }; + + ResponseContentTypeView.prototype.template = function() { + return Handlebars.templates.response_content_type; + }; + + return ResponseContentTypeView; + + })(Backbone.View); + + ParameterContentTypeView = (function(_super) { + + __extends(ParameterContentTypeView, _super); + + function ParameterContentTypeView() { + return ParameterContentTypeView.__super__.constructor.apply(this, arguments); + } + + ParameterContentTypeView.prototype.initialize = function() {}; + + ParameterContentTypeView.prototype.render = function() { + var template; + template = this.template(); + $(this.el).html(template(this.model)); + $('label[for=parameterContentType]', $(this.el)).text('Parameter content type:'); + return this; + }; + + ParameterContentTypeView.prototype.template = function() { + return Handlebars.templates.parameter_content_type; + }; + + return ParameterContentTypeView; + + })(Backbone.View); + }).call(this); diff --git a/dist/swagger-ui.min.js b/dist/swagger-ui.min.js index 4947965e..3188d3f9 100644 --- a/dist/swagger-ui.min.js +++ b/dist/swagger-ui.min.js @@ -1 +1 @@ -$(function(){$.fn.vAlign=function(){return this.each(function(c){var a=$(this).height();var d=$(this).parent().height();var b=(d-a)/2;$(this).css("margin-top",b)})};$.fn.stretchFormtasticInputWidthToParent=function(){return this.each(function(b){var d=$(this).closest("form").innerWidth();var c=parseInt($(this).closest("form").css("padding-left"),10)+parseInt($(this).closest("form").css("padding-right"),10);var a=parseInt($(this).css("padding-left"),10)+parseInt($(this).css("padding-right"),10);$(this).css("width",d-c-a)})};$("form.formtastic li.string input, form.formtastic textarea").stretchFormtasticInputWidthToParent();$("ul.downplayed li div.content p").vAlign();$("form.sandbox").submit(function(){var a=true;$(this).find("input.required").each(function(){$(this).removeClass("error");if($(this).val()==""){$(this).addClass("error");$(this).wiggle();a=false}});return a})});function clippyCopiedCallback(b){$("#api_key_copied").fadeIn().delay(1000).fadeOut()}function log(){if(window.console){console.log.apply(console,arguments)}}if(Function.prototype.bind&&console&&typeof console.log=="object"){["log","info","warn","error","assert","dir","clear","profile","profileEnd"].forEach(function(a){console[a]=this.bind(console[a],console)},Function.prototype.call)}var Docs={shebang:function(){var b=$.param.fragment().split("/");b.shift();switch(b.length){case 1:var d="resource_"+b[0];Docs.expandEndpointListForResource(b[0]);$("#"+d).slideto({highlight:false});break;case 2:Docs.expandEndpointListForResource(b[0]);$("#"+d).slideto({highlight:false});var c=b.join("_");var a=c+"_content";Docs.expandOperation($("#"+a));$("#"+c).slideto({highlight:false});break}},toggleEndpointListForResource:function(b){var a=$("li#resource_"+Docs.escapeResourceName(b)+" ul.endpoints");if(a.is(":visible")){Docs.collapseEndpointListForResource(b)}else{Docs.expandEndpointListForResource(b)}},expandEndpointListForResource:function(b){var b=Docs.escapeResourceName(b);if(b==""){$(".resource ul.endpoints").slideDown();return}$("li#resource_"+b).addClass("active");var a=$("li#resource_"+b+" ul.endpoints");a.slideDown()},collapseEndpointListForResource:function(b){var b=Docs.escapeResourceName(b);$("li#resource_"+b).removeClass("active");var a=$("li#resource_"+b+" ul.endpoints");a.slideUp()},expandOperationsForResource:function(a){Docs.expandEndpointListForResource(a);if(a==""){$(".resource ul.endpoints li.operation div.content").slideDown();return}$("li#resource_"+Docs.escapeResourceName(a)+" li.operation div.content").each(function(){Docs.expandOperation($(this))})},collapseOperationsForResource:function(a){Docs.expandEndpointListForResource(a);$("li#resource_"+Docs.escapeResourceName(a)+" li.operation div.content").each(function(){Docs.collapseOperation($(this))})},escapeResourceName:function(a){return a.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^`{|}~]/g,"\\$&")},expandOperation:function(a){a.slideDown()},collapseOperation:function(a){a.slideUp()}};(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.content_type=b(function(g,p,f,n,m){f=f||g.helpers;var l="",c,s,k,j,q=this,h="function",o=f.helperMissing,i=void 0;function e(x,w){var t="",v,u;t+="\n ";k=f.produces;v=k||x.produces;u=f.each;j=q.program(2,d,w);j.hash={};j.fn=j;j.inverse=q.noop;v=u.call(x,v,j);if(v||v===0){t+=v}t+="\n";return t}function d(w,v){var t="",u;t+='\n \n ";return t}function r(u,t){return'\n \n'}l+='\n\n";return l})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.main=b(function(f,p,e,n,m){e=e||f.helpers;var k="",c,r,j,i,q=this,g="function",o=e.helperMissing,h=void 0,l=this.escapeExpression;function d(v,u){var s="",t;s+='\n , api version: ';j=e.apiVersion;t=j||v.apiVersion;if(typeof t===g){t=t.call(v,{hash:{}})}else{if(t===h){t=o.call(v,"apiVersion",{hash:{}})}}s+=l(t)+"\n ";return s}k+="\n
    \n
      \n
    \n\n
    \n
    \n
    \n

    [ base url: ";j=e.basePath;c=j||p.basePath;if(typeof c===g){c=c.call(p,{hash:{}})}else{if(c===h){c=o.call(p,"basePath",{hash:{}})}}k+=l(c)+"\n ";j=e.apiVersion;c=j||p.apiVersion;r=e["if"];i=q.program(1,d,m);i.hash={};i.fn=i;i.inverse=q.noop;c=r.call(p,c,i);if(c||c===0){k+=c}k+="]

    \n
    \n
    \n";return k})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.operation=b(function(h,u,s,m,w){s=s||h.helpers;var t="",j,g,i,q,p=this,e="function",r=s.helperMissing,c=void 0,d=this.escapeExpression;function o(A,z){var x="",y;x+="\n

    Implementation Notes

    \n

    ";i=s.notes;y=i||A.notes;if(typeof y===e){y=y.call(A,{hash:{}})}else{if(y===c){y=r.call(A,"notes",{hash:{}})}}if(y||y===0){x+=y}x+="

    \n ";return x}function n(y,x){return'\n

    Response Class

    \n

    \n
    \n
    \n '}function l(y,x){return'\n

    Parameters

    \n \n \n \n \n \n \n \n \n \n \n \n\n \n
    ParameterValueDescriptionParameter TypeData Type
    \n '}function k(y,x){return"\n
    \n

    Error Status Codes

    \n \n \n \n \n \n \n \n \n \n \n
    HTTP Status CodeReason
    \n "}function f(y,x){return"\n "}function v(y,x){return"\n
    \n \n \n \n
    \n "}t+="\n \n";return t})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param=b(function(h,v,t,m,y){t=t||h.helpers;var u="",j,g,i,r,q=this,e="function",s=t.helperMissing,c=void 0,d=this.escapeExpression;function p(D,C){var z="",B,A;z+="\n ";i=t.isFile;B=i||D.isFile;A=t["if"];r=q.program(2,o,C);r.hash={};r.fn=r;r.inverse=q.program(4,n,C);B=A.call(D,B,r);if(B||B===0){z+=B}z+="\n ";return z}function o(C,B){var z="",A;z+='\n \n ";return z}function n(D,C){var z="",B,A;z+="\n ";i=t.defaultValue;B=i||D.defaultValue;A=t["if"];r=q.program(5,l,C);r.hash={};r.fn=r;r.inverse=q.program(7,k,C);B=A.call(D,B,r);if(B||B===0){z+=B}z+="\n ";return z}function l(C,B){var z="",A;z+="\n \n ";return z}function k(C,B){var z="",A;z+="\n \n
    \n
    \n ';return z}function f(D,C){var z="",B,A;z+="\n ";i=t.defaultValue;B=i||D.defaultValue;A=t["if"];r=q.program(10,x,C);r.hash={};r.fn=r;r.inverse=q.program(12,w,C);B=A.call(D,B,r);if(B||B===0){z+=B}z+="\n ";return z}function x(C,B){var z="",A;z+="\n \n ";return z}function w(C,B){var z="",A;z+="\n \n ";return z}u+="";i=t.name;j=i||v.name;if(typeof j===e){j=j.call(v,{hash:{}})}else{if(j===c){j=s.call(v,"name",{hash:{}})}}u+=d(j)+"\n\n\n ";i=t.isBody;j=i||v.isBody;g=t["if"];r=q.program(1,p,y);r.hash={};r.fn=r;r.inverse=q.program(9,f,y);j=g.call(v,j,r);if(j||j===0){u+=j}u+="\n\n\n";i=t.description;j=i||v.description;if(typeof j===e){j=j.call(v,{hash:{}})}else{if(j===c){j=s.call(v,"description",{hash:{}})}}if(j||j===0){u+=j}u+="\n";i=t.paramType;j=i||v.paramType;if(typeof j===e){j=j.call(v,{hash:{}})}else{if(j===c){j=s.call(v,"paramType",{hash:{}})}}if(j||j===0){u+=j}u+='\n\n \n\n\n';return u})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_list=b(function(h,v,t,m,x){t=t||h.helpers;var u="",k,g,j,r,q=this,e="function",s=t.helperMissing,c=void 0,d=this.escapeExpression;function p(z,y){return"\n "}function o(C,B){var y="",A,z;y+="\n ";j=t.defaultValue;A=j||C.defaultValue;z=t["if"];r=q.program(4,n,B);r.hash={};r.fn=r;r.inverse=q.program(6,l,B);A=z.call(C,A,r);if(A||A===0){y+=A}y+="\n ";return y}function n(z,y){return"\n "}function l(z,y){return"\n \n "}function i(C,B){var y="",A,z;y+="\n ";j=t.isDefault;A=j||C.isDefault;z=t["if"];r=q.program(9,f,B);r.hash={};r.fn=r;r.inverse=q.program(11,w,B);A=z.call(C,A,r);if(A||A===0){y+=A}y+="\n ";return y}function f(B,A){var y="",z;y+="\n \n ";return y}function w(B,A){var y="",z;y+="\n \n ";return y}u+="";j=t.name;k=j||v.name;if(typeof k===e){k=k.call(v,{hash:{}})}else{if(k===c){k=s.call(v,"name",{hash:{}})}}u+=d(k)+"\n\n \n\n";j=t.description;k=j||v.description;if(typeof k===e){k=k.call(v,{hash:{}})}else{if(k===c){k=s.call(v,"description",{hash:{}})}}if(k||k===0){u+=k}u+="\n";j=t.paramType;k=j||v.paramType;if(typeof k===e){k=k.call(v,{hash:{}})}else{if(k===c){k=s.call(v,"paramType",{hash:{}})}}if(k||k===0){u+=k}u+='\n\n';return u})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_readonly=b(function(g,t,r,k,u){r=r||g.helpers;var s="",i,f,h,p,o=this,e="function",q=r.helperMissing,c=void 0,d=this.escapeExpression;function n(y,x){var v="",w;v+="\n \n ";return v}function m(z,y){var v="",x,w;v+="\n ";h=r.defaultValue;x=h||z.defaultValue;w=r["if"];p=o.program(4,l,y);p.hash={};p.fn=p;p.inverse=o.program(6,j,y);x=w.call(z,x,p);if(x||x===0){v+=x}v+="\n ";return v}function l(y,x){var v="",w;v+="\n ";h=r.defaultValue;w=h||y.defaultValue;if(typeof w===e){w=w.call(y,{hash:{}})}else{if(w===c){w=q.call(y,"defaultValue",{hash:{}})}}v+=d(w)+"\n ";return v}function j(w,v){return"\n (empty)\n "}s+="";h=r.name;i=h||t.name;if(typeof i===e){i=i.call(t,{hash:{}})}else{if(i===c){i=q.call(t,"name",{hash:{}})}}s+=d(i)+"\n\n ";h=r.isBody;i=h||t.isBody;f=r["if"];p=o.program(1,n,u);p.hash={};p.fn=p;p.inverse=o.program(3,m,u);i=f.call(t,i,p);if(i||i===0){s+=i}s+="\n\n";h=r.description;i=h||t.description;if(typeof i===e){i=i.call(t,{hash:{}})}else{if(i===c){i=q.call(t,"description",{hash:{}})}}if(i||i===0){s+=i}s+="\n";h=r.paramType;i=h||t.paramType;if(typeof i===e){i=i.call(t,{hash:{}})}else{if(i===c){i=q.call(t,"paramType",{hash:{}})}}if(i||i===0){s+=i}s+='\n\n';return s})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_readonly_required=b(function(g,t,r,k,u){r=r||g.helpers;var s="",i,f,h,p,o=this,e="function",q=r.helperMissing,c=void 0,d=this.escapeExpression;function n(y,x){var v="",w;v+="\n \n ";return v}function m(z,y){var v="",x,w;v+="\n ";h=r.defaultValue;x=h||z.defaultValue;w=r["if"];p=o.program(4,l,y);p.hash={};p.fn=p;p.inverse=o.program(6,j,y);x=w.call(z,x,p);if(x||x===0){v+=x}v+="\n ";return v}function l(y,x){var v="",w;v+="\n ";h=r.defaultValue;w=h||y.defaultValue;if(typeof w===e){w=w.call(y,{hash:{}})}else{if(w===c){w=q.call(y,"defaultValue",{hash:{}})}}v+=d(w)+"\n ";return v}function j(w,v){return"\n (empty)\n "}s+="";h=r.name;i=h||t.name;if(typeof i===e){i=i.call(t,{hash:{}})}else{if(i===c){i=q.call(t,"name",{hash:{}})}}s+=d(i)+"\n\n ";h=r.isBody;i=h||t.isBody;f=r["if"];p=o.program(1,n,u);p.hash={};p.fn=p;p.inverse=o.program(3,m,u);i=f.call(t,i,p);if(i||i===0){s+=i}s+="\n\n";h=r.description;i=h||t.description;if(typeof i===e){i=i.call(t,{hash:{}})}else{if(i===c){i=q.call(t,"description",{hash:{}})}}if(i||i===0){s+=i}s+="\n";h=r.paramType;i=h||t.paramType;if(typeof i===e){i=i.call(t,{hash:{}})}else{if(i===c){i=q.call(t,"paramType",{hash:{}})}}if(i||i===0){s+=i}s+='\n\n';return s})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_required=b(function(h,v,t,m,A){t=t||h.helpers;var u="",j,g,i,r,q=this,e="function",s=t.helperMissing,c=void 0,d=this.escapeExpression;function p(F,E){var B="",D,C;B+="\n ";i=t.isFile;D=i||F.isFile;C=t["if"];r=q.program(2,o,E);r.hash={};r.fn=r;r.inverse=q.program(4,n,E);D=C.call(F,D,r);if(D||D===0){B+=D}B+="\n ";return B}function o(E,D){var B="",C;B+='\n \n ";return B}function n(F,E){var B="",D,C;B+="\n ";i=t.defaultValue;D=i||F.defaultValue;C=t["if"];r=q.program(5,l,E);r.hash={};r.fn=r;r.inverse=q.program(7,k,E);D=C.call(F,D,r);if(D||D===0){B+=D}B+="\n ";return B}function l(E,D){var B="",C;B+="\n \n ";return B}function k(E,D){var B="",C;B+="\n \n
    \n
    \n ';return B}function f(F,E){var B="",D,C;B+="\n ";i=t.isFile;D=i||F.isFile;C=t["if"];r=q.program(10,z,E);r.hash={};r.fn=r;r.inverse=q.program(12,y,E);D=C.call(F,D,r);if(D||D===0){B+=D}B+="\n ";return B}function z(E,D){var B="",C;B+="\n \n ";return B}function y(F,E){var B="",D,C;B+="\n ";i=t.defaultValue;D=i||F.defaultValue;C=t["if"];r=q.program(13,x,E);r.hash={};r.fn=r;r.inverse=q.program(15,w,E);D=C.call(F,D,r);if(D||D===0){B+=D}B+="\n ";return B}function x(E,D){var B="",C;B+="\n \n ";return B}function w(E,D){var B="",C;B+="\n \n ";return B}u+="";i=t.name;j=i||v.name;if(typeof j===e){j=j.call(v,{hash:{}})}else{if(j===c){j=s.call(v,"name",{hash:{}})}}u+=d(j)+"\n\n ";i=t.isBody;j=i||v.isBody;g=t["if"];r=q.program(1,p,A);r.hash={};r.fn=r;r.inverse=q.program(9,f,A);j=g.call(v,j,r);if(j||j===0){u+=j}u+="\n\n\n ";i=t.description;j=i||v.description;if(typeof j===e){j=j.call(v,{hash:{}})}else{if(j===c){j=s.call(v,"description",{hash:{}})}}if(j||j===0){u+=j}u+="\n\n";i=t.paramType;j=i||v.paramType;if(typeof j===e){j=j.call(v,{hash:{}})}else{if(j===c){j=s.call(v,"paramType",{hash:{}})}}if(j||j===0){u+=j}u+='\n\n';return u})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.resource=b(function(e,n,d,l,k){d=d||e.helpers;var i="",c,h,o=this,f="function",m=d.helperMissing,g=void 0,j=this.escapeExpression;i+="\n\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.signature=b(function(e,n,d,l,k){d=d||e.helpers;var i="",c,h,o=this,f="function",m=d.helperMissing,g=void 0,j=this.escapeExpression;i+='
    \n\n
    \n\n
    \n
    \n ';h=d.signature;c=h||n.signature;if(typeof c===f){c=c.call(n,{hash:{}})}else{if(c===g){c=m.call(n,"signature",{hash:{}})}}if(c||c===0){i+=c}i+='\n
    \n\n
    \n
    ';h=d.sampleJSON;c=h||n.sampleJSON;if(typeof c===f){c=c.call(n,{hash:{}})}else{if(c===g){c=m.call(n,"sampleJSON",{hash:{}})}}i+=j(c)+'
    \n \n
    \n
    \n\n';return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.status_code=b(function(e,n,d,l,k){d=d||e.helpers;var i="",c,h,o=this,f="function",m=d.helperMissing,g=void 0,j=this.escapeExpression;i+="";h=d.code;c=h||n.code;if(typeof c===f){c=c.call(n,{hash:{}})}else{if(c===g){c=m.call(n,"code",{hash:{}})}}i+=j(c)+"\n";h=d.reason;c=h||n.reason;if(typeof c===f){c=c.call(n,{hash:{}})}else{if(c===g){c=m.call(n,"reason",{hash:{}})}}if(c||c===0){i+=c}i+="\n\n";return i})})();(function(){var f,b,h,c,e,j,k,i,a,g={}.hasOwnProperty,d=function(o,m){for(var l in m){if(g.call(m,l)){o[l]=m[l]}}function n(){this.constructor=o}n.prototype=m.prototype;o.prototype=new n();o.__super__=m.prototype;return o};a=(function(m){d(l,m);function l(){return l.__super__.constructor.apply(this,arguments)}l.prototype.dom_id="swagger_ui";l.prototype.options=null;l.prototype.api=null;l.prototype.headerView=null;l.prototype.mainView=null;l.prototype.initialize=function(n){var o=this;if(n==null){n={}}if(n.dom_id!=null){this.dom_id=n.dom_id;delete n.dom_id}if(!($("#"+this.dom_id)!=null)){$("body").append('
    ')}this.options=n;this.options.success=function(){return o.render()};this.options.progress=function(p){return o.showMessage(p)};this.options.failure=function(p){return o.onLoadFailure(p)};this.headerView=new b({el:$("#header")});return this.headerView.on("update-swagger-ui",function(p){return o.updateSwaggerUi(p)})};l.prototype.updateSwaggerUi=function(n){this.options.discoveryUrl=n.discoveryUrl;this.options.apiKey=n.apiKey;return this.load()};l.prototype.load=function(){var n;if((n=this.mainView)!=null){n.clear()}this.headerView.update(this.options.discoveryUrl,this.options.apiKey);return this.api=new SwaggerApi(this.options)};l.prototype.render=function(){var n=this;this.showMessage("Finished Loading Resource Information. Rendering Swagger UI...");this.mainView=new h({model:this.api,el:$("#"+this.dom_id)}).render();this.showMessage();switch(this.options.docExpansion){case"full":Docs.expandOperationsForResource("");break;case"list":Docs.collapseOperationsForResource("")}if(this.options.onComplete){this.options.onComplete(this.api,this)}return setTimeout(function(){return Docs.shebang()},400)};l.prototype.showMessage=function(n){if(n==null){n=""}$("#message-bar").removeClass("message-fail");$("#message-bar").addClass("message-success");return $("#message-bar").html(n)};l.prototype.onLoadFailure=function(n){var o;if(n==null){n=""}$("#message-bar").removeClass("message-success");$("#message-bar").addClass("message-fail");o=$("#message-bar").html(n);if(this.options.onFailure!=null){this.options.onFailure(n)}return o};return l})(Backbone.Router);window.SwaggerUi=a;b=(function(m){d(l,m);function l(){return l.__super__.constructor.apply(this,arguments)}l.prototype.events={"click #show-pet-store-icon":"showPetStore","click #show-wordnik-dev-icon":"showWordnikDev","click #explore":"showCustom","keyup #input_baseUrl":"showCustomOnKeyup","keyup #input_apiKey":"showCustomOnKeyup"};l.prototype.initialize=function(){};l.prototype.showPetStore=function(n){return this.trigger("update-swagger-ui",{discoveryUrl:"http://petstore.swagger.wordnik.com/api/api-docs.json",apiKey:"special-key"})};l.prototype.showWordnikDev=function(n){return this.trigger("update-swagger-ui",{discoveryUrl:"http://api.wordnik.com/v4/resources.json",apiKey:""})};l.prototype.showCustomOnKeyup=function(n){if(n.keyCode===13){return this.showCustom()}};l.prototype.showCustom=function(n){if(n!=null){n.preventDefault()}return this.trigger("update-swagger-ui",{discoveryUrl:$("#input_baseUrl").val(),apiKey:$("#input_apiKey").val()})};l.prototype.update=function(o,p,n){if(n==null){n=false}$("#input_baseUrl").val(o);$("#input_apiKey").val(p);if(n){return this.trigger("update-swagger-ui",{discoveryUrl:o,apiKey:p})}};return l})(Backbone.View);h=(function(l){d(m,l);function m(){return m.__super__.constructor.apply(this,arguments)}m.prototype.initialize=function(){};m.prototype.render=function(){var q,p,n,o;$(this.el).html(Handlebars.templates.main(this.model));o=this.model.apisArray;for(p=0,n=o.length;p=0;if(!y){this.model.isReadOnly=true}$(this.el).html(Handlebars.templates.operation(this.model));if(this.model.responseClassSignature&&this.model.responseClassSignature!=="string"){z={sampleJSON:this.model.responseSampleJSON,isParam:false,signature:this.model.responseClassSignature};u=new k({model:z,tagName:"div"});$(".model-signature",$(this.el)).append(u.render().el)}else{$(".model-signature",$(this.el)).html(this.model.responseClass)}n={isParam:false};if(this.model.supportedContentTypes){n.produces=this.model.supportedContentTypes}if(this.model.produces){n.produces=this.model.produces}x=new f({model:n});$(".content-type",$(this.el)).append(x.render().el);t=this.model.parameters;for(s=0,w=t.length;s0){Q[H.name]=H.value}}P=v.children().find('input[type~="file"]').size()!==0;J=false;L="application/json";if(this.model.consumes&&this.model.consumes.length>0){L=this.model.consumes[0]}else{z=this.model.parameters;for(u=0,S=z.length;u"+A+"
    ");$(".response_throbber",$(this.el)).show();D={type:this.model.httpMethod,url:A,headers:q,data:F,contentType:L,dataType:"json",processData:false,error:function(T,U,o){return I.showErrorStatus(T,U,o)},success:function(o){return I.showResponse(o)},complete:function(o){return I.showCompleteStatus(o)}};G=$("td select[name=contentType]",$(this.el)).val();if(G){D.contentType=G}log("content type = "+D.contentType);if(!(D.data||(D.type==="GET"||D.type==="DELETE"))&&D.contentType===!"application/x-www-form-urlencoded"){D.contentType=false}log("content type is now = "+D.contentType);s=$(".content > .content-type > div > select[name=contentType]",$(this.el)).val();if(s){D.headers=D.headers!=null?D.headers:{};D.headers.accept=s}jQuery.ajax(D);return false}};l.prototype.hideResponse=function(n){if(n!=null){n.preventDefault()}$(".response",$(this.el)).slideUp();return $(".response_hider",$(this.el)).fadeOut()};l.prototype.showResponse=function(n){var o;o=JSON.stringify(n,null,"\t").replace(/\n/g,"
    ");return $(".response_body",$(this.el)).html(escape(o))};l.prototype.showErrorStatus=function(n){return this.showStatus(n)};l.prototype.showCompleteStatus=function(n){return this.showStatus(n)};l.prototype.formatXml=function(u){var q,t,o,v,A,w,p,n,y,z,s,r,x;n=/(>)(<)(\/*)/g;z=/[ ]*(.*)[ ]+\n/g;q=/(<.+>)(.+\n)/g;u=u.replace(n,"$1\n$2$3").replace(z,"$1\n").replace(q,"$1\n$2");p=0;t="";A=u.split("\n");o=0;v="other";y={"single->single":0,"single->closing":-1,"single->opening":0,"single->other":0,"closing->single":0,"closing->closing":-1,"closing->opening":0,"closing->other":0,"opening->single":1,"opening->closing":0,"opening->opening":1,"opening->other":1,"other->single":0,"other->closing":-1,"other->opening":0,"other->other":0};s=function(G){var C,B,E,I,F,D,H;D={single:Boolean(G.match(/<.+\/>/)),closing:Boolean(G.match(/<\/.+>/)),opening:Boolean(G.match(/<[^!?].*>/))};F=((function(){var J;J=[];for(E in D){H=D[E];if(H){J.push(E)}}return J})())[0];F=F===void 0?"other":F;C=v+"->"+F;v=F;I="";o+=y[C];I=((function(){var K,L,J;J=[];for(B=K=0,L=o;0<=L?KL;B=0<=L?++K:--K){J.push(" ")}return J})()).join("");if(C==="opening->closing"){return t=t.substr(0,t.length-1)+G+"\n"}else{return t+=I+G+"\n"}};for(r=0,x=A.length;r").text(JSON.stringify(JSON.parse(q.responseText),null,2));r=$('
    ').append(p)}catch(n){p=$("").text(this.formatXml(q.responseText));r=$('
    ').append(p)}o=r;$(".response_code",$(this.el)).html("
    "+q.status+"
    ");$(".response_body",$(this.el)).html(o);$(".response_headers",$(this.el)).html("
    "+q.getAllResponseHeaders()+"
    ");$(".response",$(this.el)).slideDown();$(".response_hider",$(this.el)).show();$(".response_throbber",$(this.el)).hide();return hljs.highlightBlock($(".response_body",$(this.el))[0])};l.prototype.toggleOperationContent=function(){var n;n=$("#"+Docs.escapeResourceName(this.model.resourceName)+"_"+this.model.nickname+"_"+this.model.httpMethod+"_"+this.model.number+"_content");if(n.is(":visible")){return Docs.collapseOperation(n)}else{return Docs.expandOperation(n)}};return l})(Backbone.View);i=(function(m){d(l,m);function l(){return l.__super__.constructor.apply(this,arguments)}l.prototype.initialize=function(){};l.prototype.render=function(){var n;n=this.template();$(this.el).html(n(this.model));return this};l.prototype.template=function(){return Handlebars.templates.status_code};return l})(Backbone.View);e=(function(m){d(l,m);function l(){return l.__super__.constructor.apply(this,arguments)}l.prototype.initialize=function(){};l.prototype.render=function(){var q,o,n,r,p;if(this.model.paramType==="body"){this.model.isBody=true}if(this.model.dataType==="file"){this.model.isFile=true}p=this.template();$(this.el).html(p(this.model));n={sampleJSON:this.model.sampleJSON,isParam:true,signature:this.model.signature};if(this.model.sampleJSON){r=new k({model:n,tagName:"div"});$(".model-signature",$(this.el)).append(r.render().el)}else{$(".model-signature",$(this.el)).html(this.model.signature)}q={isParam:false};if(this.model.supportedContentTypes){q.produces=this.model.supportedContentTypes}if(this.model.produces){q.produces=this.model.produces}o=new f({model:q});$(".content-type",$(this.el)).append(o.render().el);return this};l.prototype.template=function(){if(this.model.isList){return Handlebars.templates.param_list}else{if(this.options.readOnly){if(this.model.required){return Handlebars.templates.param_readonly_required}else{return Handlebars.templates.param_readonly}}else{if(this.model.required){return Handlebars.templates.param_required}else{return Handlebars.templates.param}}}};return l})(Backbone.View);k=(function(m){d(l,m);function l(){return l.__super__.constructor.apply(this,arguments)}l.prototype.events={"click a.description-link":"switchToDescription","click a.snippet-link":"switchToSnippet","mousedown .snippet":"snippetToTextArea"};l.prototype.initialize=function(){};l.prototype.render=function(){var n;n=this.template();$(this.el).html(n(this.model));this.switchToDescription();this.isParam=this.model.isParam;if(this.isParam){$(".notice",$(this.el)).text("Click to set as parameter value")}return this};l.prototype.template=function(){return Handlebars.templates.signature};l.prototype.switchToDescription=function(n){if(n!=null){n.preventDefault()}$(".snippet",$(this.el)).hide();$(".description",$(this.el)).show();$(".description-link",$(this.el)).addClass("selected");return $(".snippet-link",$(this.el)).removeClass("selected")};l.prototype.switchToSnippet=function(n){if(n!=null){n.preventDefault()}$(".description",$(this.el)).hide();$(".snippet",$(this.el)).show();$(".snippet-link",$(this.el)).addClass("selected");return $(".description-link",$(this.el)).removeClass("selected")};l.prototype.snippetToTextArea=function(n){var o;if(this.isParam){if(n!=null){n.preventDefault()}o=$("textarea",$(this.el.parentNode.parentNode.parentNode));if($.trim(o.val())===""){return o.val(this.model.sampleJSON)}}};return l})(Backbone.View);f=(function(l){d(m,l);function m(){return m.__super__.constructor.apply(this,arguments)}m.prototype.initialize=function(){};m.prototype.render=function(){var n;n=this.template();$(this.el).html(n(this.model));this.isParam=this.model.isParam;if(this.isParam){$("label[for=contentType]",$(this.el)).text("Parameter content type:")}else{$("label[for=contentType]",$(this.el)).text("Response Content Type")}return this};m.prototype.template=function(){return Handlebars.templates.content_type};return m})(Backbone.View)}).call(this); \ No newline at end of file +$(function(){$.fn.vAlign=function(){return this.each(function(c){var a=$(this).height();var d=$(this).parent().height();var b=(d-a)/2;$(this).css("margin-top",b)})};$.fn.stretchFormtasticInputWidthToParent=function(){return this.each(function(b){var d=$(this).closest("form").innerWidth();var c=parseInt($(this).closest("form").css("padding-left"),10)+parseInt($(this).closest("form").css("padding-right"),10);var a=parseInt($(this).css("padding-left"),10)+parseInt($(this).css("padding-right"),10);$(this).css("width",d-c-a)})};$("form.formtastic li.string input, form.formtastic textarea").stretchFormtasticInputWidthToParent();$("ul.downplayed li div.content p").vAlign();$("form.sandbox").submit(function(){var a=true;$(this).find("input.required").each(function(){$(this).removeClass("error");if($(this).val()==""){$(this).addClass("error");$(this).wiggle();a=false}});return a})});function clippyCopiedCallback(b){$("#api_key_copied").fadeIn().delay(1000).fadeOut()}function log(){if(window.console){console.log.apply(console,arguments)}}if(Function.prototype.bind&&console&&typeof console.log=="object"){["log","info","warn","error","assert","dir","clear","profile","profileEnd"].forEach(function(a){console[a]=this.bind(console[a],console)},Function.prototype.call)}var Docs={shebang:function(){var b=$.param.fragment().split("/");b.shift();switch(b.length){case 1:var d="resource_"+b[0];Docs.expandEndpointListForResource(b[0]);$("#"+d).slideto({highlight:false});break;case 2:Docs.expandEndpointListForResource(b[0]);$("#"+d).slideto({highlight:false});var c=b.join("_");var a=c+"_content";Docs.expandOperation($("#"+a));$("#"+c).slideto({highlight:false});break}},toggleEndpointListForResource:function(b){var a=$("li#resource_"+Docs.escapeResourceName(b)+" ul.endpoints");if(a.is(":visible")){Docs.collapseEndpointListForResource(b)}else{Docs.expandEndpointListForResource(b)}},expandEndpointListForResource:function(b){var b=Docs.escapeResourceName(b);if(b==""){$(".resource ul.endpoints").slideDown();return}$("li#resource_"+b).addClass("active");var a=$("li#resource_"+b+" ul.endpoints");a.slideDown()},collapseEndpointListForResource:function(b){var b=Docs.escapeResourceName(b);$("li#resource_"+b).removeClass("active");var a=$("li#resource_"+b+" ul.endpoints");a.slideUp()},expandOperationsForResource:function(a){Docs.expandEndpointListForResource(a);if(a==""){$(".resource ul.endpoints li.operation div.content").slideDown();return}$("li#resource_"+Docs.escapeResourceName(a)+" li.operation div.content").each(function(){Docs.expandOperation($(this))})},collapseOperationsForResource:function(a){Docs.expandEndpointListForResource(a);$("li#resource_"+Docs.escapeResourceName(a)+" li.operation div.content").each(function(){Docs.collapseOperation($(this))})},escapeResourceName:function(a){return a.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^`{|}~]/g,"\\$&")},expandOperation:function(a){a.slideDown()},collapseOperation:function(a){a.slideUp()}};(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n ";p=f.each.call(r,r.produces,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n \n ";return o}function n(p,o){return'\n \n'}i+='\n\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.main=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",c,h="function",j=this.escapeExpression,p=this;function e(v,u){var r="",t,s;r+='\n
    '+j(((t=((t=v.info),t==null||t===false?t:t.title)),typeof t===h?t.apply(v):t))+'
    \n
    ';s=((t=((t=v.info),t==null||t===false?t:t.description)),typeof t===h?t.apply(v):t);if(s||s===0){r+=s}r+="
    \n ";s=f["if"].call(v,((t=v.info),t==null||t===false?t:t.termsOfServiceUrl),{hash:{},inverse:p.noop,fn:p.program(2,d,u),data:u});if(s||s===0){r+=s}r+="\n ";s=f["if"].call(v,((t=v.info),t==null||t===false?t:t.contact),{hash:{},inverse:p.noop,fn:p.program(4,q,u),data:u});if(s||s===0){r+=s}r+="\n ";s=f["if"].call(v,((t=v.info),t==null||t===false?t:t.license),{hash:{},inverse:p.noop,fn:p.program(6,o,u),data:u});if(s||s===0){r+=s}r+="\n ";return r}function d(u,t){var r="",s;r+='';return r}function q(u,t){var r="",s;r+="';return r}function o(u,t){var r="",s;r+="";return r}function n(u,t){var r="",s;r+='\n , api version: ';if(s=f.apiVersion){s=s.call(u,{hash:{},data:t})}else{s=u.apiVersion;s=typeof s===h?s.apply(u):s}r+=j(s)+"\n ";return r}i+="
    \n ";c=f["if"].call(m,m.info,{hash:{},inverse:p.noop,fn:p.program(1,e,k),data:k});if(c||c===0){i+=c}i+="\n
    \n
    \n
      \n
    \n\n
    \n
    \n
    \n

    [ base url: ";if(c=f.basePath){c=c.call(m,{hash:{},data:k})}else{c=m.basePath;c=typeof c===h?c.apply(m):c}i+=j(c)+"\n ";c=f["if"].call(m,m.apiVersion,{hash:{},inverse:p.noop,fn:p.program(8,n,k),data:k});if(c||c===0){i+=c}i+="]

    \n
    \n
    \n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.operation=b(function(h,n,g,m,l){this.compilerInfo=[4,">= 1.0.0"];g=this.merge(g,h.helpers);l=l||{};var j="",d,i="function",k=this.escapeExpression,r=this;function f(v,u){var s="",t;s+="\n

    Implementation Notes

    \n

    ";if(t=g.notes){t=t.call(v,{hash:{},data:u})}else{t=v.notes;t=typeof t===i?t.apply(v):t}if(t||t===0){s+=t}s+="

    \n ";return s}function c(t,s){return'\n

    Response Class

    \n

    \n
    \n
    \n '}function q(t,s){return'\n

    Parameters

    \n \n \n \n \n \n \n \n \n \n \n \n\n \n
    ParameterValueDescriptionParameter TypeData Type
    \n '}function p(t,s){return"\n
    \n

    Error Status Codes

    \n \n \n \n \n \n \n \n \n \n \n
    HTTP Status CodeReason
    \n "}function o(t,s){return"\n "}function e(t,s){return"\n
    \n \n \n \n
    \n "}j+="\n \n";return j})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param=b(function(f,q,o,j,s){this.compilerInfo=[4,">= 1.0.0"];o=this.merge(o,f.helpers);s=s||{};var p="",g,d="function",c=this.escapeExpression,n=this;function m(x,w){var u="",v;u+="\n ";v=o["if"].call(x,x.isFile,{hash:{},inverse:n.program(4,k,w),fn:n.program(2,l,w),data:w});if(v||v===0){u+=v}u+="\n ";return u}function l(x,w){var u="",v;u+='\n \n
    \n ';return u}function k(x,w){var u="",v;u+="\n ";v=o["if"].call(x,x.defaultValue,{hash:{},inverse:n.program(7,h,w),fn:n.program(5,i,w),data:w});if(v||v===0){u+=v}u+="\n ";return u}function i(x,w){var u="",v;u+="\n \n ";return u}function h(x,w){var u="",v;u+="\n \n
    \n
    \n ';return u}function e(x,w){var u="",v;u+="\n ";v=o["if"].call(x,x.defaultValue,{hash:{},inverse:n.program(12,r,w),fn:n.program(10,t,w),data:w});if(v||v===0){u+=v}u+="\n ";return u}function t(x,w){var u="",v;u+="\n \n ";return u}function r(x,w){var u="",v;u+="\n \n ";return u}p+="";if(g=o.name){g=g.call(q,{hash:{},data:s})}else{g=q.name;g=typeof g===d?g.apply(q):g}p+=c(g)+"\n\n\n ";g=o["if"].call(q,q.isBody,{hash:{},inverse:n.program(9,e,s),fn:n.program(1,m,s),data:s});if(g||g===0){p+=g}p+="\n\n\n";if(g=o.description){g=g.call(q,{hash:{},data:s})}else{g=q.description;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+="\n";if(g=o.paramType){g=g.call(q,{hash:{},data:s})}else{g=q.paramType;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+='\n\n \n\n';return p})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_list=b(function(g,r,p,k,t){this.compilerInfo=[4,">= 1.0.0"];p=this.merge(p,g.helpers);t=t||{};var q="",i,e,o=this,d="function",c=this.escapeExpression;function n(v,u){return"\n "}function m(x,w){var u="",v;u+="\n ";v=p["if"].call(x,x.defaultValue,{hash:{},inverse:o.program(6,j,w),fn:o.program(4,l,w),data:w});if(v||v===0){u+=v}u+="\n ";return u}function l(v,u){return"\n "}function j(v,u){return"\n \n "}function h(x,w){var u="",v;u+="\n ";v=p["if"].call(x,x.isDefault,{hash:{},inverse:o.program(11,s,w),fn:o.program(9,f,w),data:w});if(v||v===0){u+=v}u+="\n ";return u}function f(x,w){var u="",v;u+="\n \n ";return u}function s(x,w){var u="",v;u+="\n \n ";return u}q+="";if(i=p.name){i=i.call(r,{hash:{},data:t})}else{i=r.name;i=typeof i===d?i.apply(r):i}q+=c(i)+"\n\n \n\n";if(e=p.description){e=e.call(r,{hash:{},data:t})}else{e=r.description;e=typeof e===d?e.apply(r):e}if(e||e===0){q+=e}q+="\n";if(e=p.paramType){e=e.call(r,{hash:{},data:t})}else{e=r.paramType;e=typeof e===d?e.apply(r):e}if(e||e===0){q+=e}q+='\n\n';return q})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_readonly=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",d,h="function",j=this.escapeExpression,o=this;function e(t,s){var q="",r;q+="\n \n ";return q}function c(t,s){var q="",r;q+="\n ";r=f["if"].call(t,t.defaultValue,{hash:{},inverse:o.program(6,n,s),fn:o.program(4,p,s),data:s});if(r||r===0){q+=r}q+="\n ";return q}function p(t,s){var q="",r;q+="\n ";if(r=f.defaultValue){r=r.call(t,{hash:{},data:s})}else{r=t.defaultValue;r=typeof r===h?r.apply(t):r}q+=j(r)+"\n ";return q}function n(r,q){return"\n (empty)\n "}i+="";if(d=f.name){d=d.call(m,{hash:{},data:k})}else{d=m.name;d=typeof d===h?d.apply(m):d}i+=j(d)+"\n\n ";d=f["if"].call(m,m.isBody,{hash:{},inverse:o.program(3,c,k),fn:o.program(1,e,k),data:k});if(d||d===0){i+=d}i+="\n\n";if(d=f.description){d=d.call(m,{hash:{},data:k})}else{d=m.description;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+="\n";if(d=f.paramType){d=d.call(m,{hash:{},data:k})}else{d=m.paramType;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+='\n\n';return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_readonly_required=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",d,h="function",j=this.escapeExpression,o=this;function e(t,s){var q="",r;q+="\n \n ";return q}function c(t,s){var q="",r;q+="\n ";r=f["if"].call(t,t.defaultValue,{hash:{},inverse:o.program(6,n,s),fn:o.program(4,p,s),data:s});if(r||r===0){q+=r}q+="\n ";return q}function p(t,s){var q="",r;q+="\n ";if(r=f.defaultValue){r=r.call(t,{hash:{},data:s})}else{r=t.defaultValue;r=typeof r===h?r.apply(t):r}q+=j(r)+"\n ";return q}function n(r,q){return"\n (empty)\n "}i+="";if(d=f.name){d=d.call(m,{hash:{},data:k})}else{d=m.name;d=typeof d===h?d.apply(m):d}i+=j(d)+"\n\n ";d=f["if"].call(m,m.isBody,{hash:{},inverse:o.program(3,c,k),fn:o.program(1,e,k),data:k});if(d||d===0){i+=d}i+="\n\n";if(d=f.description){d=d.call(m,{hash:{},data:k})}else{d=m.description;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+="\n";if(d=f.paramType){d=d.call(m,{hash:{},data:k})}else{d=m.paramType;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+='\n\n';return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_required=b(function(f,q,o,j,u){this.compilerInfo=[4,">= 1.0.0"];o=this.merge(o,f.helpers);u=u||{};var p="",g,d="function",c=this.escapeExpression,n=this;function m(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.isFile,{hash:{},inverse:n.program(4,k,y),fn:n.program(2,l,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function l(z,y){var w="",x;w+='\n \n ";return w}function k(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.defaultValue,{hash:{},inverse:n.program(7,h,y),fn:n.program(5,i,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function i(z,y){var w="",x;w+="\n \n ";return w}function h(z,y){var w="",x;w+="\n \n
    \n
    \n ';return w}function e(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.isFile,{hash:{},inverse:n.program(12,t,y),fn:n.program(10,v,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function v(z,y){var w="",x;w+="\n \n ";return w}function t(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.defaultValue,{hash:{},inverse:n.program(15,r,y),fn:n.program(13,s,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function s(z,y){var w="",x;w+="\n \n ";return w}function r(z,y){var w="",x;w+="\n \n ";return w}p+="";if(g=o.name){g=g.call(q,{hash:{},data:u})}else{g=q.name;g=typeof g===d?g.apply(q):g}p+=c(g)+"\n\n ";g=o["if"].call(q,q.isBody,{hash:{},inverse:n.program(9,e,u),fn:n.program(1,m,u),data:u});if(g||g===0){p+=g}p+="\n\n\n ";if(g=o.description){g=g.call(q,{hash:{},data:u})}else{g=q.description;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+="\n\n";if(g=o.paramType){g=g.call(q,{hash:{},data:u})}else{g=q.paramType;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+='\n\n';return p})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.parameter_content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n ";p=f.each.call(r,r.consumes,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n \n ";return o}function n(p,o){return'\n \n'}i+='\n\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.resource=b(function(e,k,d,j,i){this.compilerInfo=[4,">= 1.0.0"];d=this.merge(d,e.helpers);i=i||{};var g="",c,f="function",h=this.escapeExpression;g+="\n\n";return g})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.response_content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n ";p=f.each.call(r,r.produces,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n \n ";return o}function n(p,o){return'\n \n'}i+='\n\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.signature=b(function(e,k,d,j,i){this.compilerInfo=[4,">= 1.0.0"];d=this.merge(d,e.helpers);i=i||{};var g="",c,f="function",h=this.escapeExpression;g+='
    \n\n
    \n\n
    \n
    \n ';if(c=d.signature){c=c.call(k,{hash:{},data:i})}else{c=k.signature;c=typeof c===f?c.apply(k):c}if(c||c===0){g+=c}g+='\n
    \n\n
    \n
    ';if(c=d.sampleJSON){c=c.call(k,{hash:{},data:i})}else{c=k.sampleJSON;c=typeof c===f?c.apply(k):c}g+=h(c)+'
    \n \n
    \n
    \n\n';return g})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.status_code=b(function(e,k,d,j,i){this.compilerInfo=[4,">= 1.0.0"];d=this.merge(d,e.helpers);i=i||{};var g="",c,f="function",h=this.escapeExpression;g+="";if(c=d.code){c=c.call(k,{hash:{},data:i})}else{c=k.code;c=typeof c===f?c.apply(k):c}g+=h(c)+"\n";if(c=d.reason){c=c.call(k,{hash:{},data:i})}else{c=k.reason;c=typeof c===f?c.apply(k):c}if(c||c===0){g+=c}g+="\n\n";return g})})();(function(){var g,c,i,d,m,f,k,a,l,j,b,h={}.hasOwnProperty,e=function(q,o){for(var n in o){if(h.call(o,n)){q[n]=o[n]}}function p(){this.constructor=q}p.prototype=o.prototype;q.prototype=new p();q.__super__=o.prototype;return q};b=(function(o){e(n,o);function n(){return n.__super__.constructor.apply(this,arguments)}n.prototype.dom_id="swagger_ui";n.prototype.options=null;n.prototype.api=null;n.prototype.headerView=null;n.prototype.mainView=null;n.prototype.initialize=function(p){var q=this;if(p==null){p={}}if(p.dom_id!=null){this.dom_id=p.dom_id;delete p.dom_id}if(!($("#"+this.dom_id)!=null)){$("body").append('
    ')}this.options=p;this.options.success=function(){return q.render()};this.options.progress=function(r){return q.showMessage(r)};this.options.failure=function(r){return q.onLoadFailure(r)};this.headerView=new c({el:$("#header")});return this.headerView.on("update-swagger-ui",function(r){return q.updateSwaggerUi(r)})};n.prototype.updateSwaggerUi=function(p){this.options.url=p.url;return this.load()};n.prototype.load=function(){var p,q;if((q=this.mainView)!=null){q.clear()}p=this.options.url;if(p.indexOf("http")!==0){p=this.buildUrl(window.location.href.toString(),p)}this.options.url=p;this.headerView.update(p);this.api=new SwaggerApi(this.options);this.api.build();return this.api};n.prototype.render=function(){var p=this;this.showMessage("Finished Loading Resource Information. Rendering Swagger UI...");this.mainView=new i({model:this.api,el:$("#"+this.dom_id)}).render();this.showMessage();switch(this.options.docExpansion){case"full":Docs.expandOperationsForResource("");break;case"list":Docs.collapseOperationsForResource("")}if(this.options.onComplete){this.options.onComplete(this.api,this)}return setTimeout(function(){return Docs.shebang()},400)};n.prototype.buildUrl=function(q,p){var r;console.log("base is "+q);r=q.split("/");q=r[0]+"//"+r[2];if(p.indexOf("/")===0){return q+p}else{return q+"/"+p}};n.prototype.showMessage=function(p){if(p==null){p=""}$("#message-bar").removeClass("message-fail");$("#message-bar").addClass("message-success");return $("#message-bar").html(p)};n.prototype.onLoadFailure=function(p){var q;if(p==null){p=""}$("#message-bar").removeClass("message-success");$("#message-bar").addClass("message-fail");q=$("#message-bar").html(p);if(this.options.onFailure!=null){this.options.onFailure(p)}return q};return n})(Backbone.Router);window.SwaggerUi=b;c=(function(o){e(n,o);function n(){return n.__super__.constructor.apply(this,arguments)}n.prototype.events={"click #show-pet-store-icon":"showPetStore","click #show-wordnik-dev-icon":"showWordnikDev","click #explore":"showCustom","keyup #input_baseUrl":"showCustomOnKeyup","keyup #input_apiKey":"showCustomOnKeyup"};n.prototype.initialize=function(){};n.prototype.showPetStore=function(p){return this.trigger("update-swagger-ui",{url:"http://petstore.swagger.wordnik.com/api/api-docs.json"})};n.prototype.showWordnikDev=function(p){return this.trigger("update-swagger-ui",{url:"http://api.wordnik.com/v4/resources.json"})};n.prototype.showCustomOnKeyup=function(p){if(p.keyCode===13){return this.showCustom()}};n.prototype.showCustom=function(p){if(p!=null){p.preventDefault()}return this.trigger("update-swagger-ui",{url:$("#input_baseUrl").val(),apiKey:$("#input_apiKey").val()})};n.prototype.update=function(q,r,p){if(p==null){p=false}$("#input_baseUrl").val(q);if(p){return this.trigger("update-swagger-ui",{url:q})}};return n})(Backbone.View);i=(function(n){e(o,n);function o(){return o.__super__.constructor.apply(this,arguments)}o.prototype.initialize=function(){};o.prototype.render=function(){var s,r,p,q;$(this.el).html(Handlebars.templates.main(this.model));q=this.model.apisArray;for(r=0,p=q.length;r0){q[t.name]=encodeURI(t.value)}}u=s.find("textarea");for(v=0,r=u.length;v0){q.body=t.value}}p.responseContentType=$("div select[name=responseContentType]",$(this.el)).val();p.requestContentType=$("div select[name=parameterContentType]",$(this.el)).val();return this.model["do"](q,p,this.showCompleteStatus,this.showErrorStatus,this)}};n.prototype.success=function(p,q){return q.showCompleteStatus(p)};n.prototype.hideResponse=function(p){if(p!=null){p.preventDefault()}$(".response",$(this.el)).slideUp();return $(".response_hider",$(this.el)).fadeOut()};n.prototype.showResponse=function(p){var q;q=JSON.stringify(p,null,"\t").replace(/\n/g,"
    ");return $(".response_body",$(this.el)).html(escape(q))};n.prototype.showErrorStatus=function(q,p){return p.showStatus(q)};n.prototype.showCompleteStatus=function(q,p){return p.showStatus(q)};n.prototype.formatXml=function(w){var s,v,q,x,C,y,r,p,A,B,u,t,z;p=/(>)(<)(\/*)/g;B=/[ ]*(.*)[ ]+\n/g;s=/(<.+>)(.+\n)/g;w=w.replace(p,"$1\n$2$3").replace(B,"$1\n").replace(s,"$1\n$2");r=0;v="";C=w.split("\n");q=0;x="other";A={"single->single":0,"single->closing":-1,"single->opening":0,"single->other":0,"closing->single":0,"closing->closing":-1,"closing->opening":0,"closing->other":0,"opening->single":1,"opening->closing":0,"opening->opening":1,"opening->other":1,"other->single":0,"other->closing":-1,"other->opening":0,"other->other":0};u=function(I){var E,D,G,K,H,F,J;F={single:Boolean(I.match(/<.+\/>/)),closing:Boolean(I.match(/<\/.+>/)),opening:Boolean(I.match(/<[^!?].*>/))};H=((function(){var L;L=[];for(G in F){J=F[G];if(J){L.push(G)}}return L})())[0];H=H===void 0?"other":H;E=x+"->"+H;x=H;K="";q+=A[E];K=((function(){var M,N,L;L=[];for(D=M=0,N=q;0<=N?MN;D=0<=N?++M:--M){L.push(" ")}return L})()).join("");if(E==="opening->closing"){return v=v.substr(0,v.length-1)+I+"\n"}else{return v+=K+I+"\n"}};for(t=0,z=C.length;t").text("no content");t=$('
    ').append(r)}else{if(v.indexOf("application/json")===0){r=$("").text(JSON.stringify(JSON.parse(q),null,2));t=$('
    ').append(r)}else{if(v.indexOf("application/xml")===0){r=$("").text(this.formatXml(q));t=$('
    ').append(r)}else{if(v.indexOf("text/html")===0){r=$("").html(q);t=$('
    ').append(r)}else{r=$("").text(q);t=$('
    ').append(r)}}}}p=t;$(".request_url").html("
    "+s.request.url+"
    ");$(".response_code",$(this.el)).html("
    "+s.status+"
    ");$(".response_body",$(this.el)).html(p);$(".response_headers",$(this.el)).html("
    "+JSON.stringify(s.getHeaders())+"
    ");$(".response",$(this.el)).slideDown();$(".response_hider",$(this.el)).show();$(".response_throbber",$(this.el)).hide();return hljs.highlightBlock($(".response_body",$(this.el))[0])};n.prototype.toggleOperationContent=function(){var p;p=$("#"+Docs.escapeResourceName(this.model.resourceName)+"_"+this.model.nickname+"_"+this.model.method+"_"+this.model.number+"_content");if(p.is(":visible")){return Docs.collapseOperation(p)}else{return Docs.expandOperation(p)}};return n})(Backbone.View);j=(function(o){e(n,o);function n(){return n.__super__.constructor.apply(this,arguments)}n.prototype.initialize=function(){};n.prototype.render=function(){var p;p=this.template();$(this.el).html(p(this.model));return this};n.prototype.template=function(){return Handlebars.templates.status_code};return n})(Backbone.View);f=(function(o){e(n,o);function n(){return n.__super__.constructor.apply(this,arguments)}n.prototype.initialize=function(){};n.prototype.render=function(){var v,p,r,u,q,w,t,s;s=this.model.type||this.model.dataType;if(this.model.paramType==="body"){this.model.isBody=true}if(s.toLowerCase()==="file"){this.model.isFile=true}t=this.template();$(this.el).html(t(this.model));q={sampleJSON:this.model.sampleJSON,isParam:true,signature:this.model.signature};if(this.model.sampleJSON){w=new l({model:q,tagName:"div"});$(".model-signature",$(this.el)).append(w.render().el)}else{$(".model-signature",$(this.el)).html(this.model.signature)}p=false;if(this.model.isBody){p=true}v={isParam:p};v.consumes=this.model.consumes;if(p){r=new m({model:v});$(".parameter-content-type",$(this.el)).append(r.render().el)}else{u=new a({model:v});$(".response-content-type",$(this.el)).append(u.render().el)}return this};n.prototype.template=function(){if(this.model.isList){return Handlebars.templates.param_list}else{if(this.options.readOnly){if(this.model.required){return Handlebars.templates.param_readonly_required}else{return Handlebars.templates.param_readonly}}else{if(this.model.required){return Handlebars.templates.param_required}else{return Handlebars.templates.param}}}};return n})(Backbone.View);l=(function(o){e(n,o);function n(){return n.__super__.constructor.apply(this,arguments)}n.prototype.events={"click a.description-link":"switchToDescription","click a.snippet-link":"switchToSnippet","mousedown .snippet":"snippetToTextArea"};n.prototype.initialize=function(){};n.prototype.render=function(){var p;p=this.template();$(this.el).html(p(this.model));this.switchToDescription();this.isParam=this.model.isParam;if(this.isParam){$(".notice",$(this.el)).text("Click to set as parameter value")}return this};n.prototype.template=function(){return Handlebars.templates.signature};n.prototype.switchToDescription=function(p){if(p!=null){p.preventDefault()}$(".snippet",$(this.el)).hide();$(".description",$(this.el)).show();$(".description-link",$(this.el)).addClass("selected");return $(".snippet-link",$(this.el)).removeClass("selected")};n.prototype.switchToSnippet=function(p){if(p!=null){p.preventDefault()}$(".description",$(this.el)).hide();$(".snippet",$(this.el)).show();$(".snippet-link",$(this.el)).addClass("selected");return $(".description-link",$(this.el)).removeClass("selected")};n.prototype.snippetToTextArea=function(p){var q;if(this.isParam){if(p!=null){p.preventDefault()}q=$("textarea",$(this.el.parentNode.parentNode.parentNode));if($.trim(q.val())===""){return q.val(this.model.sampleJSON)}}};return n})(Backbone.View);g=(function(n){e(o,n);function o(){return o.__super__.constructor.apply(this,arguments)}o.prototype.initialize=function(){};o.prototype.render=function(){var p;p=this.template();$(this.el).html(p(this.model));$("label[for=contentType]",$(this.el)).text("Response Content Type");return this};o.prototype.template=function(){return Handlebars.templates.content_type};return o})(Backbone.View);a=(function(n){e(o,n);function o(){return o.__super__.constructor.apply(this,arguments)}o.prototype.initialize=function(){};o.prototype.render=function(){var p;p=this.template();$(this.el).html(p(this.model));$("label[for=responseContentType]",$(this.el)).text("Response Content Type");return this};o.prototype.template=function(){return Handlebars.templates.response_content_type};return o})(Backbone.View);m=(function(o){e(n,o);function n(){return n.__super__.constructor.apply(this,arguments)}n.prototype.initialize=function(){};n.prototype.render=function(){var p;p=this.template();$(this.el).html(p(this.model));$("label[for=parameterContentType]",$(this.el)).text("Parameter content type:");return this};n.prototype.template=function(){return Handlebars.templates.parameter_content_type};return n})(Backbone.View)}).call(this); \ No newline at end of file diff --git a/lib/handlebars-1.0.rc.1.js b/lib/handlebars-1.0.rc.1.js deleted file mode 100644 index 05346370..00000000 --- a/lib/handlebars-1.0.rc.1.js +++ /dev/null @@ -1,1920 +0,0 @@ -// lib/handlebars/base.js - -/*jshint eqnull:true*/ -this.Handlebars = {}; - -(function(Handlebars) { - -Handlebars.VERSION = "1.0.rc.1"; - -Handlebars.helpers = {}; -Handlebars.partials = {}; - -Handlebars.registerHelper = function(name, fn, inverse) { - if(inverse) { fn.not = inverse; } - this.helpers[name] = fn; -}; - -Handlebars.registerPartial = function(name, str) { - this.partials[name] = str; -}; - -Handlebars.registerHelper('helperMissing', function(arg) { - if(arguments.length === 2) { - return undefined; - } else { - throw new Error("Could not find property '" + arg + "'"); - } -}); - -var toString = Object.prototype.toString, functionType = "[object Function]"; - -Handlebars.registerHelper('blockHelperMissing', function(context, options) { - var inverse = options.inverse || function() {}, fn = options.fn; - - - var ret = ""; - var type = toString.call(context); - - if(type === functionType) { context = context.call(this); } - - if(context === true) { - return fn(this); - } else if(context === false || context == null) { - return inverse(this); - } else if(type === "[object Array]") { - if(context.length > 0) { - return Handlebars.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - return fn(context); - } -}); - -Handlebars.K = function() {}; - -Handlebars.createFrame = Object.create || function(object) { - Handlebars.K.prototype = object; - var obj = new Handlebars.K(); - Handlebars.K.prototype = null; - return obj; -}; - -Handlebars.registerHelper('each', function(context, options) { - var fn = options.fn, inverse = options.inverse; - var ret = "", data; - - if (options.data) { - data = Handlebars.createFrame(options.data); - } - - if(context && context.length > 0) { - for(var i=0, j=context.length; i 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column}; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; -} -}; -/* Jison generated lexer */ -var lexer = (function(){ -var lexer = ({EOF:1, -parseError:function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, -setInput:function (input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; - if (this.options.ranges) this.yylloc.range = [0,0]; - this.offset = 0; - return this; - }, -input:function () { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, -unput:function (ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length-len-1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length-1); - this.matched = this.matched.substr(0, this.matched.length-1); - - if (lines.length-1) this.yylineno -= lines.length-1; - var r = this.yylloc.range; - - this.yylloc = {first_line: this.yylloc.first_line, - last_line: this.yylineno+1, - first_column: this.yylloc.first_column, - last_column: lines ? - (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length: - this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, -more:function () { - this._more = true; - return this; - }, -less:function (n) { - this.unput(this.match.slice(n)); - }, -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); - }, -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c+"^"; - }, -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, - match, - tempMatch, - index, - col, - lines; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i=0;i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = {first_line: this.yylloc.last_line, - last_line: this.yylineno+1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length}; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); - if (this.done && this._input) this.done = false; - if (token) return token; - else return; - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), - {text: "", token: null, line: this.yylineno}); - } - }, -lex:function lex() { - var r = this.next(); - if (typeof r !== 'undefined') { - return r; - } else { - return this.lex(); - } - }, -begin:function begin(condition) { - this.conditionStack.push(condition); - }, -popState:function popState() { - return this.conditionStack.pop(); - }, -_currentRules:function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; - }, -topState:function () { - return this.conditionStack[this.conditionStack.length-2]; - }, -pushState:function begin(condition) { - this.begin(condition); - }}); -lexer.options = {}; -lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { - -var YYSTATE=YY_START -switch($avoiding_name_collisions) { -case 0: - if(yy_.yytext.slice(-1) !== "\\") this.begin("mu"); - if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1), this.begin("emu"); - if(yy_.yytext) return 14; - -break; -case 1: return 14; -break; -case 2: - if(yy_.yytext.slice(-1) !== "\\") this.popState(); - if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1); - return 14; - -break; -case 3: return 24; -break; -case 4: return 16; -break; -case 5: return 20; -break; -case 6: return 19; -break; -case 7: return 19; -break; -case 8: return 23; -break; -case 9: return 23; -break; -case 10: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15; -break; -case 11: return 22; -break; -case 12: return 35; -break; -case 13: return 34; -break; -case 14: return 34; -break; -case 15: return 37; -break; -case 16: /*ignore whitespace*/ -break; -case 17: this.popState(); return 18; -break; -case 18: this.popState(); return 18; -break; -case 19: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 29; -break; -case 20: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 29; -break; -case 21: yy_.yytext = yy_.yytext.substr(1); return 27; -break; -case 22: return 31; -break; -case 23: return 31; -break; -case 24: return 30; -break; -case 25: return 34; -break; -case 26: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 34; -break; -case 27: return 'INVALID'; -break; -case 28: return 5; -break; -} -}; -lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:\{\{>)/,/^(?:\{\{#)/,/^(?:\{\{\/)/,/^(?:\{\{\^)/,/^(?:\{\{\s*else\b)/,/^(?:\{\{\{)/,/^(?:\{\{&)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{)/,/^(?:=)/,/^(?:\.(?=[} ]))/,/^(?:\.\.)/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}\}\})/,/^(?:\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@[a-zA-Z]+)/,/^(?:true(?=[}\s]))/,/^(?:false(?=[}\s]))/,/^(?:[0-9]+(?=[}\s]))/,/^(?:[a-zA-Z0-9_$-]+(?=[=}\s\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/]; -lexer.conditions = {"mu":{"rules":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"INITIAL":{"rules":[0,1,28],"inclusive":true}}; -return lexer;})() -parser.lexer = lexer; -function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})(); -if (typeof require !== 'undefined' && typeof exports !== 'undefined') { -exports.parser = handlebars; -exports.Parser = handlebars.Parser; -exports.parse = function () { return handlebars.parse.apply(handlebars, arguments); } -exports.main = function commonjsMain(args) { - if (!args[1]) - throw new Error('Usage: '+args[0]+' FILE'); - var source, cwd; - if (typeof process !== 'undefined') { - source = require('fs').readFileSync(require('path').resolve(args[1]), "utf8"); - } else { - source = require("file").path(require("file").cwd()).join(args[1]).read({charset: "utf-8"}); - } - return exports.parser.parse(source); -} -if (typeof module !== 'undefined' && require.main === module) { - exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args); -} -}; -; -// lib/handlebars/compiler/base.js -Handlebars.Parser = handlebars; - -Handlebars.parse = function(string) { - Handlebars.Parser.yy = Handlebars.AST; - return Handlebars.Parser.parse(string); -}; - -Handlebars.print = function(ast) { - return new Handlebars.PrintVisitor().accept(ast); -}; - -Handlebars.logger = { - DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3, - - // override in the host environment - log: function(level, str) {} -}; - -Handlebars.log = function(level, str) { Handlebars.logger.log(level, str); }; -; -// lib/handlebars/compiler/ast.js -(function() { - - Handlebars.AST = {}; - - Handlebars.AST.ProgramNode = function(statements, inverse) { - this.type = "program"; - this.statements = statements; - if(inverse) { this.inverse = new Handlebars.AST.ProgramNode(inverse); } - }; - - Handlebars.AST.MustacheNode = function(rawParams, hash, unescaped) { - this.type = "mustache"; - this.escaped = !unescaped; - this.hash = hash; - - var id = this.id = rawParams[0]; - var params = this.params = rawParams.slice(1); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - var eligibleHelper = this.eligibleHelper = id.isSimple; - - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - this.isHelper = eligibleHelper && (params.length || hash); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - }; - - Handlebars.AST.PartialNode = function(id, context) { - this.type = "partial"; - - // TODO: disallow complex IDs - - this.id = id; - this.context = context; - }; - - var verifyMatch = function(open, close) { - if(open.original !== close.original) { - throw new Handlebars.Exception(open.original + " doesn't match " + close.original); - } - }; - - Handlebars.AST.BlockNode = function(mustache, program, inverse, close) { - verifyMatch(mustache.id, close); - this.type = "block"; - this.mustache = mustache; - this.program = program; - this.inverse = inverse; - - if (this.inverse && !this.program) { - this.isInverse = true; - } - }; - - Handlebars.AST.ContentNode = function(string) { - this.type = "content"; - this.string = string; - }; - - Handlebars.AST.HashNode = function(pairs) { - this.type = "hash"; - this.pairs = pairs; - }; - - Handlebars.AST.IdNode = function(parts) { - this.type = "ID"; - this.original = parts.join("."); - - var dig = [], depth = 0; - - for(var i=0,l=parts.length; i": ">", - '"': """, - "'": "'", - "`": "`" - }; - - var badChars = /[&<>"'`]/g; - var possible = /[&<>"'`]/; - - var escapeChar = function(chr) { - return escape[chr] || "&"; - }; - - Handlebars.Utils = { - escapeExpression: function(string) { - // don't escape SafeStrings, since they're already safe - if (string instanceof Handlebars.SafeString) { - return string.toString(); - } else if (string == null || string === false) { - return ""; - } - - if(!possible.test(string)) { return string; } - return string.replace(badChars, escapeChar); - }, - - isEmpty: function(value) { - if (typeof value === "undefined") { - return true; - } else if (value === null) { - return true; - } else if (value === false) { - return true; - } else if(Object.prototype.toString.call(value) === "[object Array]" && value.length === 0) { - return true; - } else { - return false; - } - } - }; -})();; -// lib/handlebars/compiler/compiler.js - -/*jshint eqnull:true*/ -Handlebars.Compiler = function() {}; -Handlebars.JavaScriptCompiler = function() {}; - -(function(Compiler, JavaScriptCompiler) { - // the foundHelper register will disambiguate helper lookup from finding a - // function in a context. This is necessary for mustache compatibility, which - // requires that context functions in blocks are evaluated by blockHelperMissing, - // and then proceed as if the resulting value was provided to blockHelperMissing. - - Compiler.prototype = { - compiler: Compiler, - - disassemble: function() { - var opcodes = this.opcodes, opcode, out = [], params, param; - - for (var i=0, l=opcodes.length; i 0) { - this.source[1] = this.source[1] + ", " + locals.join(", "); - } - - // Generate minimizer alias mappings - if (!this.isChild) { - var aliases = []; - for (var alias in this.context.aliases) { - this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias]; - } - } - - if (this.source[1]) { - this.source[1] = "var " + this.source[1].substring(2) + ";"; - } - - // Merge children - if (!this.isChild) { - this.source[1] += '\n' + this.context.programs.join('\n') + '\n'; - } - - if (!this.environment.isSimple) { - this.source.push("return buffer;"); - } - - var params = this.isChild ? ["depth0", "data"] : ["Handlebars", "depth0", "helpers", "partials", "data"]; - - for(var i=0, l=this.environment.depths.list.length; i this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); } - return "stack" + this.stackSlot; - }, - - popStack: function() { - var item = this.compileStack.pop(); - - if (item instanceof Literal) { - return item.value; - } else { - this.stackSlot--; - return item; - } - }, - - topStack: function() { - var item = this.compileStack[this.compileStack.length - 1]; - - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - quotedString: function(str) { - return '"' + str - .replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') + '"'; - }, - - setupHelper: function(paramSize, name) { - var params = []; - this.setupParams(paramSize, params); - var foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - name: foundHelper, - callParams: ["depth0"].concat(params).join(", "), - helperMissingParams: ["depth0", this.quotedString(name)].concat(params).join(", ") - }; - }, - - // the params and contexts arguments are passed in arrays - // to fill in - setupParams: function(paramSize, params) { - var options = [], contexts = [], param, inverse, program; - - options.push("hash:" + this.popStack()); - - inverse = this.popStack(); - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - if (!program) { - this.context.aliases.self = "this"; - program = "self.noop"; - } - - if (!inverse) { - this.context.aliases.self = "this"; - inverse = "self.noop"; - } - - options.push("inverse:" + inverse); - options.push("fn:" + program); - } - - for(var i=0; i= 0; i--) { + if (parts[i] === 'node_modules') continue; + var dir = parts.slice(0, i + 1).join('/') + '/node_modules'; + dirs.push(dir); + } + + return dirs; + } + }; +})(); + +require.alias = function (from, to) { + var path = require.modules.path(); + var res = null; + try { + res = require.resolve(from + '/package.json', '/'); + } + catch (err) { + res = require.resolve(from, '/'); + } + var basedir = path.dirname(res); + + var keys = (Object.keys || function (obj) { + var res = []; + for (var key in obj) res.push(key) + return res; + })(require.modules); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (key.slice(0, basedir.length + 1) === basedir + '/') { + var f = key.slice(basedir.length); + require.modules[to + f] = require.modules[basedir + f]; + } + else if (key === basedir) { + require.modules[to] = require.modules[basedir]; + } + } +}; + +require.define = function (filename, fn) { + var dirname = require._core[filename] + ? '' + : require.modules.path().dirname(filename) + ; + + var require_ = function (file) { + return require(file, dirname) + }; + require_.resolve = function (name) { + return require.resolve(name, dirname); + }; + require_.modules = require.modules; + require_.define = require.define; + var module_ = { exports : {} }; + + require.modules[filename] = function () { + require.modules[filename]._cached = module_.exports; + fn.call( + module_.exports, + require_, + module_, + module_.exports, + dirname, + filename + ); + require.modules[filename]._cached = module_.exports; + return module_.exports; + }; +}; + +if (typeof process === 'undefined') process = {}; + +if (!process.nextTick) process.nextTick = (function () { + var queue = []; + var canPost = typeof window !== 'undefined' + && window.postMessage && window.addEventListener + ; + + if (canPost) { + window.addEventListener('message', function (ev) { + if (ev.source === window && ev.data === 'browserify-tick') { + ev.stopPropagation(); + if (queue.length > 0) { + var fn = queue.shift(); + fn(); + } + } + }, true); + } + + return function (fn) { + if (canPost) { + queue.push(fn); + window.postMessage('browserify-tick', '*'); + } + else setTimeout(fn, 0); + }; +})(); + +if (!process.title) process.title = 'browser'; + +if (!process.binding) process.binding = function (name) { + if (name === 'evals') return require('vm') + else throw new Error('No such module') +}; + +if (!process.cwd) process.cwd = function () { return '.' }; + +require.define("path", function (require, module, exports, __dirname, __filename) { + function filter (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + if (fn(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length; i >= 0; i--) { + var last = parts[i]; + if (last == '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// Regex to split a filename into [*, dir, basename, ext] +// posix version +var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/; + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { +var resolvedPath = '', + resolvedAbsolute = false; + +for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) + ? arguments[i] + : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string' || !path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; +} + +// At this point the path should be resolved to a full absolute path, but +// handle relative paths to be safe (might happen when process.cwd() fails) + +// Normalize the path +resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { +var isAbsolute = path.charAt(0) === '/', + trailingSlash = path.slice(-1) === '/'; + +// Normalize the path +path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + return p && typeof p === 'string'; + }).join('/')); +}; + + +exports.dirname = function(path) { + var dir = splitPathRe.exec(path)[1] || ''; + var isWindows = false; + if (!dir) { + // No dirname + return '.'; + } else if (dir.length === 1 || + (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) { + // It is just a slash or a drive letter with a slash + return dir; + } else { + // It is a full dirname, strip trailing slash + return dir.substring(0, dir.length - 1); + } +}; + + +exports.basename = function(path, ext) { + var f = splitPathRe.exec(path)[2] || ''; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + + +exports.extname = function(path) { + return splitPathRe.exec(path)[3] || ''; +}; + +}); + +require.define("/shred.js", function (require, module, exports, __dirname, __filename) { + // Shred is an HTTP client library intended to simplify the use of Node's +// built-in HTTP library. In particular, we wanted to make it easier to interact +// with HTTP-based APIs. +// +// See the [examples](./examples.html) for more details. + +// Ax is a nice logging library we wrote. You can use any logger, providing it +// has `info`, `warn`, `debug`, and `error` methods that take a string. +var Ax = require("ax") + , CookieJarLib = require( "cookiejar" ) + , CookieJar = CookieJarLib.CookieJar +; + +// Shred takes some options, including a logger and request defaults. + +var Shred = function(options) { + options = (options||{}); + this.agent = options.agent; + this.defaults = options.defaults||{}; + this.log = options.logger||(new Ax({ level: "info" })); + this._sharedCookieJar = new CookieJar(); + this.logCurl = options.logCurl || false; +}; + +// Most of the real work is done in the request and reponse classes. + +Shred.Request = require("./shred/request"); +Shred.Response = require("./shred/response"); + +// The `request` method kicks off a new request, instantiating a new `Request` +// object and passing along whatever default options we were given. + +Shred.prototype = { + request: function(options) { + options.logger = this.log; + options.logCurl = options.logCurl || this.logCurl; + options.cookieJar = ( 'cookieJar' in options ) ? options.cookieJar : this._sharedCookieJar; // let them set cookieJar = null + options.agent = options.agent || this.agent; + // fill in default options + for (var key in this.defaults) { + if (this.defaults.hasOwnProperty(key) && !options[key]) { + options[key] = this.defaults[key] + } + } + return new Shred.Request(options); + } +}; + +// Define a bunch of convenience methods so that you don't have to include +// a `method` property in your request options. + +"get put post delete".split(" ").forEach(function(method) { + Shred.prototype[method] = function(options) { + options.method = method; + return this.request(options); + }; +}); + + +module.exports = Shred; + +}); + +require.define("/node_modules/ax/package.json", function (require, module, exports, __dirname, __filename) { + module.exports = {"main":"./lib/ax.js"} +}); + +require.define("/node_modules/ax/lib/ax.js", function (require, module, exports, __dirname, __filename) { + var inspect = require("util").inspect + , fs = require("fs") +; + + +// this is a quick-and-dirty logger. there are other nicer loggers out there +// but the ones i found were also somewhat involved. this one has a Ruby +// logger type interface +// +// we can easily replace this, provide the info, debug, etc. methods are the +// same. or, we can change Haiku to use a more standard node.js interface + +var format = function(level,message) { + var debug = (level=="debug"||level=="error"); + if (!message) { return message.toString(); } + if (typeof(message) == "object") { + if (message instanceof Error && debug) { + return message.stack; + } else { + return inspect(message); + } + } else { + return message.toString(); + } +}; + +var noOp = function(message) { return this; } +var makeLogger = function(level,fn) { + return function(message) { + this.stream.write(this.format(level, message)+"\n"); + return this; + } +}; + +var Logger = function(options) { + var logger = this; + var options = options||{}; + + // Default options + options.level = options.level || "info"; + options.timestamp = options.timestamp || true; + options.prefix = options.prefix || ""; + logger.options = options; + + // Allows a prefix to be added to the message. + // + // var logger = new Ax({ module: 'Haiku' }) + // logger.warn('this is going to be awesome!'); + // //=> Haiku: this is going to be awesome! + // + if (logger.options.module){ + logger.options.prefix = logger.options.module; + } + + // Write to stderr or a file + if (logger.options.file){ + logger.stream = fs.createWriteStream(logger.options.file, {"flags": "a"}); + } else { + if(process.title === "node") + logger.stream = process.stderr; + else if(process.title === "browser") + logger.stream = function () { + // Work around weird console context issue: http://code.google.com/p/chromium/issues/detail?id=48662 + return console[logger.options.level].apply(console, arguments); + }; + } + + switch(logger.options.level){ + case 'debug': + ['debug', 'info', 'warn'].forEach(function (level) { + logger[level] = Logger.writer(level); + }); + case 'info': + ['info', 'warn'].forEach(function (level) { + logger[level] = Logger.writer(level); + }); + case 'warn': + logger.warn = Logger.writer('warn'); + } +} + +// Used to define logger methods +Logger.writer = function(level){ + return function(message){ + var logger = this; + + if(process.title === "node") + logger.stream.write(logger.format(level, message) + '\n'); + else if(process.title === "browser") + logger.stream(logger.format(level, message) + '\n'); + + }; +} + + +Logger.prototype = { + info: function(){}, + debug: function(){}, + warn: function(){}, + error: Logger.writer('error'), + format: function(level, message){ + if (! message) return ''; + + var logger = this + , prefix = logger.options.prefix + , timestamp = logger.options.timestamp ? " " + (new Date().toISOString()) : "" + ; + + return (prefix + timestamp + ": " + message); + } +}; + +module.exports = Logger; + +}); + +require.define("util", function (require, module, exports, __dirname, __filename) { + // todo + +}); + +require.define("fs", function (require, module, exports, __dirname, __filename) { + // nothing to see here... no file methods for the browser + +}); + +require.define("/node_modules/cookiejar/package.json", function (require, module, exports, __dirname, __filename) { + module.exports = {"main":"cookiejar.js"} +}); + +require.define("/node_modules/cookiejar/cookiejar.js", function (require, module, exports, __dirname, __filename) { + exports.CookieAccessInfo=CookieAccessInfo=function CookieAccessInfo(domain,path,secure,script) { + if(this instanceof CookieAccessInfo) { + this.domain=domain||undefined; + this.path=path||"/"; + this.secure=!!secure; + this.script=!!script; + return this; + } + else { + return new CookieAccessInfo(domain,path,secure,script) + } +} + +exports.Cookie=Cookie=function Cookie(cookiestr) { + if(cookiestr instanceof Cookie) { + return cookiestr; + } + else { + if(this instanceof Cookie) { + this.name = null; + this.value = null; + this.expiration_date = Infinity; + this.path = "/"; + this.domain = null; + this.secure = false; //how to define? + this.noscript = false; //httponly + if(cookiestr) { + this.parse(cookiestr) + } + return this; + } + return new Cookie(cookiestr) + } +} + +Cookie.prototype.toString = function toString() { + var str=[this.name+"="+this.value]; + if(this.expiration_date !== Infinity) { + str.push("expires="+(new Date(this.expiration_date)).toGMTString()); + } + if(this.domain) { + str.push("domain="+this.domain); + } + if(this.path) { + str.push("path="+this.path); + } + if(this.secure) { + str.push("secure"); + } + if(this.noscript) { + str.push("httponly"); + } + return str.join("; "); +} + +Cookie.prototype.toValueString = function toValueString() { + return this.name+"="+this.value; +} + +var cookie_str_splitter=/[:](?=\s*[a-zA-Z0-9_\-]+\s*[=])/g +Cookie.prototype.parse = function parse(str) { + if(this instanceof Cookie) { + var parts=str.split(";") + , pair=parts[0].match(/([^=]+)=((?:.|\n)*)/) + , key=pair[1] + , value=pair[2]; + this.name = key; + this.value = value; + + for(var i=1;i ", request.method.toUpperCase(), + request.url].join(" ") + return [ summary, "- Headers:", headers].join("\n"); +}; + +Request.prototype.format_headers = function () { + var array = [] + var headers = this._headers + for (var key in headers) { + if (headers.hasOwnProperty(key)) { + var value = headers[key] + array.push("\t" + key + ": " + value); + } + } + return array.join("\n"); +}; + +// Allow chainable 'on's: shred.get({ ... }).on( ... ). You can pass in a +// single function, a pair (event, function), or a hash: +// { event: function, event: function } +Request.prototype.on = function (eventOrHash, listener) { + var emitter = this.emitter; + // Pass in a single argument as a function then make it the default response handler + if (arguments.length === 1 && typeof(eventOrHash) === 'function') { + emitter.on('response', eventOrHash); + } else if (arguments.length === 1 && typeof(eventOrHash) === 'object') { + for (var key in eventOrHash) { + if (eventOrHash.hasOwnProperty(key)) { + emitter.on(key, eventOrHash[key]); + } + } + } else { + emitter.on(eventOrHash, listener); + } + return this; +}; + +// Add in the header methods. Again, these ensure we don't get the same header +// multiple times with different case conventions. +HeaderMixins.gettersAndSetters(Request); + +// `processOptions` is called from the constructor to handle all the work +// associated with making sure we do our best to ensure we have a valid request. + +var processOptions = function(request,options) { + + request.log.debug("Processing request options .."); + + // We'll use `request.emitter` to manage the `on` event handlers. + request.emitter = (new Emitter); + + request.agent = options.agent; + + // Set up the handlers ... + if (options.on) { + for (var key in options.on) { + if (options.on.hasOwnProperty(key)) { + request.emitter.on(key, options.on[key]); + } + } + } + + // Make sure we were give a URL or a host + if (!options.url && !options.host) { + request.emitter.emit("request_error", + new Error("No url or url options (host, port, etc.)")); + return; + } + + // Allow for the [use of a proxy](http://www.jmarshall.com/easy/http/#proxies). + + if (options.url) { + if (options.proxy) { + request.url = options.proxy; + request.path = options.url; + } else { + request.url = options.url; + } + } + + // Set the remaining options. + request.query = options.query||options.parameters||request.query ; + request.method = options.method; + request.setHeader("user-agent",options.agent||"Shred"); + request.setHeaders(options.headers); + + if (request.cookieJar) { + var cookies = request.cookieJar.getCookies( CookieAccessInfo( request.host, request.path ) ); + if (cookies.length) { + var cookieString = request.getHeader('cookie')||''; + for (var cookieIndex = 0; cookieIndex < cookies.length; ++cookieIndex) { + if ( cookieString.length && cookieString[ cookieString.length - 1 ] != ';' ) + { + cookieString += ';'; + } + cookieString += cookies[ cookieIndex ].name + '=' + cookies[ cookieIndex ].value + ';'; + } + request.setHeader("cookie", cookieString); + } + } + + // The content entity can be set either using the `body` or `content` attributes. + if (options.body||options.content) { + request.content = options.body||options.content; + } + request.timeout = options.timeout; + +}; + +// `createRequest` is also called by the constructor, after `processOptions`. +// This actually makes the request and processes the response, so `createRequest` +// is a bit of a misnomer. + +var createRequest = function(request) { + var timeout ; + + request.log.debug("Creating request .."); + request.log.debug(request); + + var reqParams = { + host: request.host, + port: request.port, + method: request.method, + path: request.path + (request.query ? '?'+request.query : ""), + headers: request.getHeaders(), + // Node's HTTP/S modules will ignore this, but we are using the + // browserify-http module in the browser for both HTTP and HTTPS, and this + // is how you differentiate the two. + scheme: request.scheme, + // Use a provided agent. 'Undefined' is the default, which uses a global + // agent. + agent: request.agent + }; + + if (request.logCurl) { + logCurl(request); + } + + var http = request.scheme == "http" ? HTTP : HTTPS; + + // Set up the real request using the selected library. The request won't be + // sent until we call `.end()`. + request._raw = http.request(reqParams, function(response) { + request.log.debug("Received response .."); + + // We haven't timed out and we have a response, so make sure we clear the + // timeout so it doesn't fire while we're processing the response. + clearTimeout(timeout); + + // Construct a Shred `Response` object from the response. This will stream + // the response, thus the need for the callback. We can access the response + // entity safely once we're in the callback. + response = new Response(response, request, function(response) { + + // Set up some event magic. The precedence is given first to + // status-specific handlers, then to responses for a given event, and then + // finally to the more general `response` handler. In the last case, we + // need to first make sure we're not dealing with a a redirect. + var emit = function(event) { + var emitter = request.emitter; + var textStatus = STATUS_CODES[response.status] ? STATUS_CODES[response.status].toLowerCase() : null; + if (emitter.listeners(response.status).length > 0 || emitter.listeners(textStatus).length > 0) { + emitter.emit(response.status, response); + emitter.emit(textStatus, response); + } else { + if (emitter.listeners(event).length>0) { + emitter.emit(event, response); + } else if (!response.isRedirect) { + emitter.emit("response", response); + //console.warn("Request has no event listener for status code " + response.status); + } + } + }; + + // Next, check for a redirect. We simply repeat the request with the URL + // given in the `Location` header. We fire a `redirect` event. + if (response.isRedirect) { + request.log.debug("Redirecting to " + + response.getHeader("Location")); + request.url = response.getHeader("Location"); + emit("redirect"); + createRequest(request); + + // Okay, it's not a redirect. Is it an error of some kind? + } else if (response.isError) { + emit("error"); + } else { + // It looks like we're good shape. Trigger the `success` event. + emit("success"); + } + }); + }); + + // We're still setting up the request. Next, we're going to handle error cases + // where we have no response. We don't emit an error event because that event + // takes a response. We don't response handlers to have to check for a null + // value. However, we [should introduce a different event + // type](https://github.com/spire-io/shred/issues/3) for this type of error. + request._raw.on("error", function(error) { + request.emitter.emit("request_error", error); + }); + + request._raw.on("socket", function(socket) { + request.emitter.emit("socket", socket); + }); + + // TCP timeouts should also trigger the "response_error" event. + request._raw.on('socket', function () { + request._raw.socket.on('timeout', function () { + // This should trigger the "error" event on the raw request, which will + // trigger the "response_error" on the shred request. + request._raw.abort(); + }); + }); + + + // We're almost there. Next, we need to write the request entity to the + // underlying request object. + if (request.content) { + request.log.debug("Streaming body: '" + + request.content.data.slice(0,59) + "' ... "); + request._raw.write(request.content.data); + } + + // Finally, we need to set up the timeout. We do this last so that we don't + // start the clock ticking until the last possible moment. + if (request.timeout) { + timeout = setTimeout(function() { + request.log.debug("Timeout fired, aborting request ..."); + request._raw.abort(); + request.emitter.emit("timeout", request); + },request.timeout); + } + + // The `.end()` method will cause the request to fire. Technically, it might + // have already sent the headers and body. + request.log.debug("Sending request ..."); + request._raw.end(); +}; + +// Logs the curl command for the request. +var logCurl = function (req) { + var headers = req.getHeaders(); + var headerString = ""; + + for (var key in headers) { + headerString += '-H "' + key + ": " + headers[key] + '" '; + } + + var bodyString = "" + + if (req.content) { + bodyString += "-d '" + req.content.body + "' "; + } + + var query = req.query ? '?' + req.query : ""; + + console.log("curl " + + "-X " + req.method.toUpperCase() + " " + + req.scheme + "://" + req.host + ":" + req.port + req.path + query + " " + + headerString + + bodyString + ); +}; + + +module.exports = Request; + +}); + +require.define("http", function (require, module, exports, __dirname, __filename) { + // todo + +}); + +require.define("https", function (require, module, exports, __dirname, __filename) { + // todo + +}); + +require.define("/shred/parseUri.js", function (require, module, exports, __dirname, __filename) { + // parseUri 1.2.2 +// (c) Steven Levithan +// MIT License + +function parseUri (str) { + var o = parseUri.options, + m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), + uri = {}, + i = 14; + + while (i--) uri[o.key[i]] = m[i] || ""; + + uri[o.q.name] = {}; + uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { + if ($1) uri[o.q.name][$1] = $2; + }); + + return uri; +}; + +parseUri.options = { + strictMode: false, + key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], + q: { + name: "queryKey", + parser: /(?:^|&)([^&=]*)=?([^&]*)/g + }, + parser: { + strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, + loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ + } +}; + +module.exports = parseUri; + +}); + +require.define("events", function (require, module, exports, __dirname, __filename) { + if (!process.EventEmitter) process.EventEmitter = function () {}; + +var EventEmitter = exports.EventEmitter = process.EventEmitter; +var isArray = typeof Array.isArray === 'function' + ? Array.isArray + : function (xs) { + return Object.toString.call(xs) === '[object Array]' + } +; + +// By default EventEmitters will print a warning if more than +// 10 listeners are added to it. This is a useful default which +// helps finding memory leaks. +// +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +var defaultMaxListeners = 10; +EventEmitter.prototype.setMaxListeners = function(n) { + if (!this._events) this._events = {}; + this._events.maxListeners = n; +}; + + +EventEmitter.prototype.emit = function(type) { + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events || !this._events.error || + (isArray(this._events.error) && !this._events.error.length)) + { + if (arguments[1] instanceof Error) { + throw arguments[1]; // Unhandled 'error' event + } else { + throw new Error("Uncaught, unspecified 'error' event."); + } + return false; + } + } + + if (!this._events) return false; + var handler = this._events[type]; + if (!handler) return false; + + if (typeof handler == 'function') { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + var args = Array.prototype.slice.call(arguments, 1); + handler.apply(this, args); + } + return true; + + } else if (isArray(handler)) { + var args = Array.prototype.slice.call(arguments, 1); + + var listeners = handler.slice(); + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + return true; + + } else { + return false; + } +}; + +// EventEmitter is defined in src/node_events.cc +// EventEmitter.prototype.emit() is also defined there. +EventEmitter.prototype.addListener = function(type, listener) { + if ('function' !== typeof listener) { + throw new Error('addListener only takes instances of Function'); + } + + if (!this._events) this._events = {}; + + // To avoid recursion in the case that type == "newListeners"! Before + // adding it to the listeners, first emit "newListeners". + this.emit('newListener', type, listener); + + if (!this._events[type]) { + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + } else if (isArray(this._events[type])) { + + // Check for listener leak + if (!this._events[type].warned) { + var m; + if (this._events.maxListeners !== undefined) { + m = this._events.maxListeners; + } else { + m = defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + console.trace(); + } + } + + // If we've already got an array, just append. + this._events[type].push(listener); + } else { + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + var self = this; + self.on(type, function g() { + self.removeListener(type, g); + listener.apply(this, arguments); + }); + + return this; +}; + +EventEmitter.prototype.removeListener = function(type, listener) { + if ('function' !== typeof listener) { + throw new Error('removeListener only takes instances of Function'); + } + + // does not use listeners(), so no side effect of creating _events[type] + if (!this._events || !this._events[type]) return this; + + var list = this._events[type]; + + if (isArray(list)) { + var i = list.indexOf(listener); + if (i < 0) return this; + list.splice(i, 1); + if (list.length == 0) + delete this._events[type]; + } else if (this._events[type] === listener) { + delete this._events[type]; + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + // does not use listeners(), so no side effect of creating _events[type] + if (type && this._events && this._events[type]) this._events[type] = null; + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + if (!this._events) this._events = {}; + if (!this._events[type]) this._events[type] = []; + if (!isArray(this._events[type])) { + this._events[type] = [this._events[type]]; + } + return this._events[type]; +}; + +}); + +require.define("/node_modules/sprintf/package.json", function (require, module, exports, __dirname, __filename) { + module.exports = {"main":"./lib/sprintf"} +}); + +require.define("/node_modules/sprintf/lib/sprintf.js", function (require, module, exports, __dirname, __filename) { + /** +sprintf() for JavaScript 0.7-beta1 +http://www.diveintojavascript.com/projects/javascript-sprintf + +Copyright (c) Alexandru Marasteanu +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of sprintf() for JavaScript nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Changelog: +2010.11.07 - 0.7-beta1-node + - converted it to a node.js compatible module + +2010.09.06 - 0.7-beta1 + - features: vsprintf, support for named placeholders + - enhancements: format cache, reduced global namespace pollution + +2010.05.22 - 0.6: + - reverted to 0.4 and fixed the bug regarding the sign of the number 0 + Note: + Thanks to Raphael Pigulla (http://www.n3rd.org/) + who warned me about a bug in 0.5, I discovered that the last update was + a regress. I appologize for that. + +2010.05.09 - 0.5: + - bug fix: 0 is now preceeded with a + sign + - bug fix: the sign was not at the right position on padded results (Kamal Abdali) + - switched from GPL to BSD license + +2007.10.21 - 0.4: + - unit test and patch (David Baird) + +2007.09.17 - 0.3: + - bug fix: no longer throws exception on empty paramenters (Hans Pufal) + +2007.09.11 - 0.2: + - feature: added argument swapping + +2007.04.03 - 0.1: + - initial release +**/ + +var sprintf = (function() { + function get_type(variable) { + return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase(); + } + function str_repeat(input, multiplier) { + for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */} + return output.join(''); + } + + var str_format = function() { + if (!str_format.cache.hasOwnProperty(arguments[0])) { + str_format.cache[arguments[0]] = str_format.parse(arguments[0]); + } + return str_format.format.call(null, str_format.cache[arguments[0]], arguments); + }; + + str_format.format = function(parse_tree, argv) { + var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length; + for (i = 0; i < tree_length; i++) { + node_type = get_type(parse_tree[i]); + if (node_type === 'string') { + output.push(parse_tree[i]); + } + else if (node_type === 'array') { + match = parse_tree[i]; // convenience purposes only + if (match[2]) { // keyword argument + arg = argv[cursor]; + for (k = 0; k < match[2].length; k++) { + if (!arg.hasOwnProperty(match[2][k])) { + throw(sprintf('[sprintf] property "%s" does not exist', match[2][k])); + } + arg = arg[match[2][k]]; + } + } + else if (match[1]) { // positional argument (explicit) + arg = argv[match[1]]; + } + else { // positional argument (implicit) + arg = argv[cursor++]; + } + + if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) { + throw(sprintf('[sprintf] expecting number but found %s', get_type(arg))); + } + switch (match[8]) { + case 'b': arg = arg.toString(2); break; + case 'c': arg = String.fromCharCode(arg); break; + case 'd': arg = parseInt(arg, 10); break; + case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break; + case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break; + case 'o': arg = arg.toString(8); break; + case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break; + case 'u': arg = Math.abs(arg); break; + case 'x': arg = arg.toString(16); break; + case 'X': arg = arg.toString(16).toUpperCase(); break; + } + arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg); + pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '; + pad_length = match[6] - String(arg).length; + pad = match[6] ? str_repeat(pad_character, pad_length) : ''; + output.push(match[5] ? arg + pad : pad + arg); + } + } + return output.join(''); + }; + + str_format.cache = {}; + + str_format.parse = function(fmt) { + var _fmt = fmt, match = [], parse_tree = [], arg_names = 0; + while (_fmt) { + if ((match = /^[^\x25]+/.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } + else if ((match = /^\x25{2}/.exec(_fmt)) !== null) { + parse_tree.push('%'); + } + else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) { + if (match[2]) { + arg_names |= 1; + var field_list = [], replacement_field = match[2], field_match = []; + if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { + if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else { + throw('[sprintf] huh?'); + } + } + } + else { + throw('[sprintf] huh?'); + } + match[2] = field_list; + } + else { + arg_names |= 2; + } + if (arg_names === 3) { + throw('[sprintf] mixing positional and named placeholders is not (yet) supported'); + } + parse_tree.push(match); + } + else { + throw('[sprintf] huh?'); + } + _fmt = _fmt.substring(match[0].length); + } + return parse_tree; + }; + + return str_format; +})(); + +var vsprintf = function(fmt, argv) { + argv.unshift(fmt); + return sprintf.apply(null, argv); +}; + +exports.sprintf = sprintf; +exports.vsprintf = vsprintf; +}); + +require.define("/shred/response.js", function (require, module, exports, __dirname, __filename) { + // The `Response object` encapsulates a Node.js HTTP response. + +var Content = require("./content") + , HeaderMixins = require("./mixins/headers") + , CookieJarLib = require( "cookiejar" ) + , Cookie = CookieJarLib.Cookie +; + +// Browser doesn't have zlib. +var zlib = null; +try { + zlib = require('zlib'); +} catch (e) { + console.warn("no zlib library"); +} + +// Iconv doesn't work in browser +var Iconv = null; +try { + Iconv = require('iconv-lite'); +} catch (e) { + console.warn("no iconv library"); +} + +// Construct a `Response` object. You should never have to do this directly. The +// `Request` object handles this, getting the raw response object and passing it +// in here, along with the request. The callback allows us to stream the response +// and then use the callback to let the request know when it's ready. +var Response = function(raw, request, callback) { + var response = this; + this._raw = raw; + + // The `._setHeaders` method is "private"; you can't otherwise set headers on + // the response. + this._setHeaders.call(this,raw.headers); + + // store any cookies + if (request.cookieJar && this.getHeader('set-cookie')) { + var cookieStrings = this.getHeader('set-cookie'); + var cookieObjs = [] + , cookie; + + for (var i = 0; i < cookieStrings.length; i++) { + var cookieString = cookieStrings[i]; + if (!cookieString) { + continue; + } + + if (!cookieString.match(/domain\=/i)) { + cookieString += '; domain=' + request.host; + } + + if (!cookieString.match(/path\=/i)) { + cookieString += '; path=' + request.path; + } + + try { + cookie = new Cookie(cookieString); + if (cookie) { + cookieObjs.push(cookie); + } + } catch (e) { + console.warn("Tried to set bad cookie: " + cookieString); + } + } + + request.cookieJar.setCookies(cookieObjs); + } + + this.request = request; + this.client = request.client; + this.log = this.request.log; + + // Stream the response content entity and fire the callback when we're done. + // Store the incoming data in a array of Buffers which we concatinate into one + // buffer at the end. We need to use buffers instead of strings here in order + // to preserve binary data. + var chunkBuffers = []; + var dataLength = 0; + raw.on("data", function(chunk) { + chunkBuffers.push(chunk); + dataLength += chunk.length; + }); + raw.on("end", function() { + var body; + if (typeof Buffer === 'undefined') { + // Just concatinate into a string + body = chunkBuffers.join(''); + } else { + // Initialize new buffer and add the chunks one-at-a-time. + body = new Buffer(dataLength); + for (var i = 0, pos = 0; i < chunkBuffers.length; i++) { + chunkBuffers[i].copy(body, pos); + pos += chunkBuffers[i].length; + } + } + + var setBodyAndFinish = function (body) { + response._body = new Content({ + body: body, + type: response.getHeader("Content-Type") + }); + callback(response); + } + + if (zlib && response.getHeader("Content-Encoding") === 'gzip'){ + zlib.gunzip(body, function (err, gunzippedBody) { + if (Iconv && response.request.encoding){ + body = Iconv.fromEncoding(gunzippedBody,response.request.encoding); + } else { + body = gunzippedBody.toString(); + } + setBodyAndFinish(body); + }) + } + else{ + if (response.request.encoding){ + body = Iconv.fromEncoding(body,response.request.encoding); + } + setBodyAndFinish(body); + } + }); +}; + +// The `Response` object can be pretty overwhelming to view using the built-in +// Node.js inspect method. We want to make it a bit more manageable. This +// probably goes [too far in the other +// direction](https://github.com/spire-io/shred/issues/2). + +Response.prototype = { + inspect: function() { + var response = this; + var headers = this.format_headers(); + var summary = [" ", response.status].join(" ") + return [ summary, "- Headers:", headers].join("\n"); + }, + format_headers: function () { + var array = [] + var headers = this._headers + for (var key in headers) { + if (headers.hasOwnProperty(key)) { + var value = headers[key] + array.push("\t" + key + ": " + value); + } + } + return array.join("\n"); + } +}; + +// `Response` object properties, all of which are read-only: +Object.defineProperties(Response.prototype, { + +// - **status**. The HTTP status code for the response. + status: { + get: function() { return this._raw.statusCode; }, + enumerable: true + }, + +// - **content**. The HTTP content entity, if any. Provided as a [content +// object](./content.html), which will attempt to convert the entity based upon +// the `content-type` header. The converted value is available as +// `content.data`. The original raw content entity is available as +// `content.body`. + body: { + get: function() { return this._body; } + }, + content: { + get: function() { return this.body; }, + enumerable: true + }, + +// - **isRedirect**. Is the response a redirect? These are responses with 3xx +// status and a `Location` header. + isRedirect: { + get: function() { + return (this.status>299 + &&this.status<400 + &&this.getHeader("Location")); + }, + enumerable: true + }, + +// - **isError**. Is the response an error? These are responses with status of +// 400 or greater. + isError: { + get: function() { + return (this.status === 0 || this.status > 399) + }, + enumerable: true + } +}); + +// Add in the [getters for accessing the normalized headers](./headers.js). +HeaderMixins.getters(Response); +HeaderMixins.privateSetters(Response); + +// Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes +// getAllResponseHeaders() to return {} if the response is a CORS request. +// xhr.getHeader still works correctly. +var getHeader = Response.prototype.getHeader; +Response.prototype.getHeader = function (name) { + return (getHeader.call(this,name) || + (typeof this._raw.getHeader === 'function' && this._raw.getHeader(name))); +}; + +module.exports = Response; + +}); + +require.define("/shred/content.js", function (require, module, exports, __dirname, __filename) { + +// The purpose of the `Content` object is to abstract away the data conversions +// to and from raw content entities as strings. For example, you want to be able +// to pass in a Javascript object and have it be automatically converted into a +// JSON string if the `content-type` is set to a JSON-based media type. +// Conversely, you want to be able to transparently get back a Javascript object +// in the response if the `content-type` is a JSON-based media-type. + +// One limitation of the current implementation is that it [assumes the `charset` is UTF-8](https://github.com/spire-io/shred/issues/5). + +// The `Content` constructor takes an options object, which *must* have either a +// `body` or `data` property and *may* have a `type` property indicating the +// media type. If there is no `type` attribute, a default will be inferred. +var Content = function(options) { + this.body = options.body; + this.data = options.data; + this.type = options.type; +}; + +Content.prototype = { + // Treat `toString()` as asking for the `content.body`. That is, the raw content entity. + // + // toString: function() { return this.body; } + // + // Commented out, but I've forgotten why. :/ +}; + + +// `Content` objects have the following attributes: +Object.defineProperties(Content.prototype,{ + +// - **type**. Typically accessed as `content.type`, reflects the `content-type` +// header associated with the request or response. If not passed as an options +// to the constructor or set explicitly, it will infer the type the `data` +// attribute, if possible, and, failing that, will default to `text/plain`. + type: { + get: function() { + if (this._type) { + return this._type; + } else { + if (this._data) { + switch(typeof this._data) { + case "string": return "text/plain"; + case "object": return "application/json"; + } + } + } + return "text/plain"; + }, + set: function(value) { + this._type = value; + return this; + }, + enumerable: true + }, + +// - **data**. Typically accessed as `content.data`, reflects the content entity +// converted into Javascript data. This can be a string, if the `type` is, say, +// `text/plain`, but can also be a Javascript object. The conversion applied is +// based on the `processor` attribute. The `data` attribute can also be set +// directly, in which case the conversion will be done the other way, to infer +// the `body` attribute. + data: { + get: function() { + if (this._body) { + return this.processor.parser(this._body); + } else { + return this._data; + } + }, + set: function(data) { + if (this._body&&data) Errors.setDataWithBody(this); + this._data = data; + return this; + }, + enumerable: true + }, + +// - **body**. Typically accessed as `content.body`, reflects the content entity +// as a UTF-8 string. It is the mirror of the `data` attribute. If you set the +// `data` attribute, the `body` attribute will be inferred and vice-versa. If +// you attempt to set both, an exception is raised. + body: { + get: function() { + if (this._data) { + return this.processor.stringify(this._data); + } else { + return this.processor.stringify(this._body); + } + }, + set: function(body) { + if (this._data&&body) Errors.setBodyWithData(this); + this._body = body; + return this; + }, + enumerable: true + }, + +// - **processor**. The functions that will be used to convert to/from `data` and +// `body` attributes. You can add processors. The two that are built-in are for +// `text/plain`, which is basically an identity transformation and +// `application/json` and other JSON-based media types (including custom media +// types with `+json`). You can add your own processors. See below. + processor: { + get: function() { + var processor = Content.processors[this.type]; + if (processor) { + return processor; + } else { + // Return the first processor that matches any part of the + // content type. ex: application/vnd.foobar.baz+json will match json. + var main = this.type.split(";")[0]; + var parts = main.split(/\+|\//); + for (var i=0, l=parts.length; i < l; i++) { + processor = Content.processors[parts[i]] + } + return processor || {parser:identity,stringify:toString}; + } + }, + enumerable: true + }, + +// - **length**. Typically accessed as `content.length`, returns the length in +// bytes of the raw content entity. + length: { + get: function() { + if (typeof Buffer !== 'undefined') { + return Buffer.byteLength(this.body); + } + return this.body.length; + } + } +}); + +Content.processors = {}; + +// The `registerProcessor` function allows you to add your own processors to +// convert content entities. Each processor consists of a Javascript object with +// two properties: +// - **parser**. The function used to parse a raw content entity and convert it +// into a Javascript data type. +// - **stringify**. The function used to convert a Javascript data type into a +// raw content entity. +Content.registerProcessor = function(types,processor) { + +// You can pass an array of types that will trigger this processor, or just one. +// We determine the array via duck-typing here. + if (types.forEach) { + types.forEach(function(type) { + Content.processors[type] = processor; + }); + } else { + // If you didn't pass an array, we just use what you pass in. + Content.processors[types] = processor; + } +}; + +// Register the identity processor, which is used for text-based media types. +var identity = function(x) { return x; } + , toString = function(x) { return x.toString(); } +Content.registerProcessor( + ["text/html","text/plain","text"], + { parser: identity, stringify: toString }); + +// Register the JSON processor, which is used for JSON-based media types. +Content.registerProcessor( + ["application/json; charset=utf-8","application/json","json"], + { + parser: function(string) { + return JSON.parse(string); + }, + stringify: function(data) { + return JSON.stringify(data); }}); + +// Error functions are defined separately here in an attempt to make the code +// easier to read. +var Errors = { + setDataWithBody: function(object) { + throw new Error("Attempt to set data attribute of a content object " + + "when the body attributes was already set."); + }, + setBodyWithData: function(object) { + throw new Error("Attempt to set body attribute of a content object " + + "when the data attributes was already set."); + } +} +module.exports = Content; + +}); + +require.define("/shred/mixins/headers.js", function (require, module, exports, __dirname, __filename) { + // The header mixins allow you to add HTTP header support to any object. This +// might seem pointless: why not simply use a hash? The main reason is that, per +// the [HTTP spec](http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2), +// headers are case-insensitive. So, for example, `content-type` is the same as +// `CONTENT-TYPE` which is the same as `Content-Type`. Since there is no way to +// overload the index operator in Javascript, using a hash to represent the +// headers means it's possible to have two conflicting values for a single +// header. +// +// The solution to this is to provide explicit methods to set or get headers. +// This also has the benefit of allowing us to introduce additional variations, +// including snake case, which we automatically convert to what Matthew King has +// dubbed "corset case" - the hyphen-separated names with initial caps: +// `Content-Type`. We use corset-case just in case we're dealing with servers +// that haven't properly implemented the spec. + +// Convert headers to corset-case. **Example:** `CONTENT-TYPE` will be converted +// to `Content-Type`. + +var corsetCase = function(string) { + return string.toLowerCase() + //.replace("_","-") + .replace(/(^|-)(\w)/g, + function(s) { return s.toUpperCase(); }); +}; + +// We suspect that `initializeHeaders` was once more complicated ... +var initializeHeaders = function(object) { + return {}; +}; + +// Access the `_headers` property using lazy initialization. **Warning:** If you +// mix this into an object that is using the `_headers` property already, you're +// going to have trouble. +var $H = function(object) { + return object._headers||(object._headers=initializeHeaders(object)); +}; + +// Hide the implementations as private functions, separate from how we expose them. + +// The "real" `getHeader` function: get the header after normalizing the name. +var getHeader = function(object,name) { + return $H(object)[corsetCase(name)]; +}; + +// The "real" `getHeader` function: get one or more headers, or all of them +// if you don't ask for any specifics. +var getHeaders = function(object,names) { + var keys = (names && names.length>0) ? names : Object.keys($H(object)); + var hash = keys.reduce(function(hash,key) { + hash[key] = getHeader(object,key); + return hash; + },{}); + // Freeze the resulting hash so you don't mistakenly think you're modifying + // the real headers. + Object.freeze(hash); + return hash; +}; + +// The "real" `setHeader` function: set a header, after normalizing the name. +var setHeader = function(object,name,value) { + $H(object)[corsetCase(name)] = value; + return object; +}; + +// The "real" `setHeaders` function: set multiple headers based on a hash. +var setHeaders = function(object,hash) { + for( var key in hash ) { setHeader(object,key,hash[key]); }; + return this; +}; + +// Here's where we actually bind the functionality to an object. These mixins work by +// exposing mixin functions. Each function mixes in a specific batch of features. +module.exports = { + + // Add getters. + getters: function(constructor) { + constructor.prototype.getHeader = function(name) { return getHeader(this,name); }; + constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); }; + }, + // Add setters but as "private" methods. + privateSetters: function(constructor) { + constructor.prototype._setHeader = function(key,value) { return setHeader(this,key,value); }; + constructor.prototype._setHeaders = function(hash) { return setHeaders(this,hash); }; + }, + // Add setters. + setters: function(constructor) { + constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); }; + constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); }; + }, + // Add both getters and setters. + gettersAndSetters: function(constructor) { + constructor.prototype.getHeader = function(name) { return getHeader(this,name); }; + constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); }; + constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); }; + constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); }; + }, +}; + +}); + +require.define("/node_modules/iconv-lite/package.json", function (require, module, exports, __dirname, __filename) { + module.exports = {} +}); + +require.define("/node_modules/iconv-lite/index.js", function (require, module, exports, __dirname, __filename) { + // Module exports +var iconv = module.exports = { + toEncoding: function(str, encoding) { + return iconv.getCodec(encoding).toEncoding(str); + }, + fromEncoding: function(buf, encoding) { + return iconv.getCodec(encoding).fromEncoding(buf); + }, + + defaultCharUnicode: '�', + defaultCharSingleByte: '?', + + // Get correct codec for given encoding. + getCodec: function(encoding) { + var enc = encoding || "utf8"; + var codecOptions = undefined; + while (1) { + if (getType(enc) === "String") + enc = enc.replace(/[- ]/g, "").toLowerCase(); + var codec = iconv.encodings[enc]; + var type = getType(codec); + if (type === "String") { + // Link to other encoding. + codecOptions = {originalEncoding: enc}; + enc = codec; + } + else if (type === "Object" && codec.type != undefined) { + // Options for other encoding. + codecOptions = codec; + enc = codec.type; + } + else if (type === "Function") + // Codec itself. + return codec(codecOptions); + else + throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')"); + } + }, + + // Define basic encodings + encodings: { + internal: function(options) { + return { + toEncoding: function(str) { + return new Buffer(ensureString(str), options.originalEncoding); + }, + fromEncoding: function(buf) { + return ensureBuffer(buf).toString(options.originalEncoding); + } + }; + }, + utf8: "internal", + ucs2: "internal", + binary: "internal", + ascii: "internal", + base64: "internal", + + // Codepage single-byte encodings. + singlebyte: function(options) { + // Prepare chars if needed + if (!options.chars || (options.chars.length !== 128 && options.chars.length !== 256)) + throw new Error("Encoding '"+options.type+"' has incorrect 'chars' (must be of len 128 or 256)"); + + if (options.chars.length === 128) + options.chars = asciiString + options.chars; + + if (!options.charsBuf) { + options.charsBuf = new Buffer(options.chars, 'ucs2'); + } + + if (!options.revCharsBuf) { + options.revCharsBuf = new Buffer(65536); + var defChar = iconv.defaultCharSingleByte.charCodeAt(0); + for (var i = 0; i < options.revCharsBuf.length; i++) + options.revCharsBuf[i] = defChar; + for (var i = 0; i < options.chars.length; i++) + options.revCharsBuf[options.chars.charCodeAt(i)] = i; + } + + return { + toEncoding: function(str) { + str = ensureString(str); + + var buf = new Buffer(str.length); + var revCharsBuf = options.revCharsBuf; + for (var i = 0; i < str.length; i++) + buf[i] = revCharsBuf[str.charCodeAt(i)]; + + return buf; + }, + fromEncoding: function(buf) { + buf = ensureBuffer(buf); + + // Strings are immutable in JS -> we use ucs2 buffer to speed up computations. + var charsBuf = options.charsBuf; + var newBuf = new Buffer(buf.length*2); + var idx1 = 0, idx2 = 0; + for (var i = 0, _len = buf.length; i < _len; i++) { + idx1 = buf[i]*2; idx2 = i*2; + newBuf[idx2] = charsBuf[idx1]; + newBuf[idx2+1] = charsBuf[idx1+1]; + } + return newBuf.toString('ucs2'); + } + }; + }, + + // Codepage double-byte encodings. + table: function(options) { + var table = options.table, key, revCharsTable = options.revCharsTable; + if (!table) { + throw new Error("Encoding '" + options.type +"' has incorect 'table' option"); + } + if(!revCharsTable) { + revCharsTable = options.revCharsTable = {}; + for (key in table) { + revCharsTable[table[key]] = parseInt(key); + } + } + + return { + toEncoding: function(str) { + str = ensureString(str); + var strLen = str.length; + var bufLen = strLen; + for (var i = 0; i < strLen; i++) + if (str.charCodeAt(i) >> 7) + bufLen++; + + var newBuf = new Buffer(bufLen), gbkcode, unicode, + defaultChar = revCharsTable[iconv.defaultCharUnicode.charCodeAt(0)]; + + for (var i = 0, j = 0; i < strLen; i++) { + unicode = str.charCodeAt(i); + if (unicode >> 7) { + gbkcode = revCharsTable[unicode] || defaultChar; + newBuf[j++] = gbkcode >> 8; //high byte; + newBuf[j++] = gbkcode & 0xFF; //low byte + } else {//ascii + newBuf[j++] = unicode; + } + } + return newBuf; + }, + fromEncoding: function(buf) { + buf = ensureBuffer(buf); + var bufLen = buf.length, strLen = 0; + for (var i = 0; i < bufLen; i++) { + strLen++; + if (buf[i] & 0x80) //the high bit is 1, so this byte is gbkcode's high byte.skip next byte + i++; + } + var newBuf = new Buffer(strLen*2), unicode, gbkcode, + defaultChar = iconv.defaultCharUnicode.charCodeAt(0); + + for (var i = 0, j = 0; i < bufLen; i++, j+=2) { + gbkcode = buf[i]; + if (gbkcode & 0x80) { + gbkcode = (gbkcode << 8) + buf[++i]; + unicode = table[gbkcode] || defaultChar; + } else { + unicode = gbkcode; + } + newBuf[j] = unicode & 0xFF; //low byte + newBuf[j+1] = unicode >> 8; //high byte + } + return newBuf.toString('ucs2'); + } + } + } + } +}; + +// Add aliases to convert functions +iconv.encode = iconv.toEncoding; +iconv.decode = iconv.fromEncoding; + +// Load other encodings from files in /encodings dir. +var encodingsDir = __dirname+"/encodings/", + fs = require('fs'); +fs.readdirSync(encodingsDir).forEach(function(file) { + if(fs.statSync(encodingsDir + file).isDirectory()) return; + var encodings = require(encodingsDir + file) + for (var key in encodings) + iconv.encodings[key] = encodings[key] +}); + +// Utilities +var asciiString = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'+ + ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f'; + +var ensureBuffer = function(buf) { + buf = buf || new Buffer(0); + return (buf instanceof Buffer) ? buf : new Buffer(buf.toString(), "utf8"); +} + +var ensureString = function(str) { + str = str || ""; + return (str instanceof String) ? str : str.toString((str instanceof Buffer) ? 'utf8' : undefined); +} + +var getType = function(obj) { + return Object.prototype.toString.call(obj).slice(8, -1); +} + + +}); + +require.define("/node_modules/http-browserify/package.json", function (require, module, exports, __dirname, __filename) { + module.exports = {"main":"index.js","browserify":"browser.js"} +}); + +require.define("/node_modules/http-browserify/browser.js", function (require, module, exports, __dirname, __filename) { + var http = module.exports; +var EventEmitter = require('events').EventEmitter; +var Request = require('./lib/request'); + +http.request = function (params, cb) { + if (!params) params = {}; + if (!params.host) params.host = window.location.host.split(':')[0]; + if (!params.port) params.port = window.location.port; + + var req = new Request(new xhrHttp, params); + if (cb) req.on('response', cb); + return req; +}; + +http.get = function (params, cb) { + params.method = 'GET'; + var req = http.request(params, cb); + req.end(); + return req; +}; + +var xhrHttp = (function () { + if (typeof window === 'undefined') { + throw new Error('no window object present'); + } + else if (window.XMLHttpRequest) { + return window.XMLHttpRequest; + } + else if (window.ActiveXObject) { + var axs = [ + 'Msxml2.XMLHTTP.6.0', + 'Msxml2.XMLHTTP.3.0', + 'Microsoft.XMLHTTP' + ]; + for (var i = 0; i < axs.length; i++) { + try { + var ax = new(window.ActiveXObject)(axs[i]); + return function () { + if (ax) { + var ax_ = ax; + ax = null; + return ax_; + } + else { + return new(window.ActiveXObject)(axs[i]); + } + }; + } + catch (e) {} + } + throw new Error('ajax not supported in this browser') + } + else { + throw new Error('ajax not supported in this browser'); + } +})(); + +http.STATUS_CODES = { + 100 : 'Continue', + 101 : 'Switching Protocols', + 102 : 'Processing', // RFC 2518, obsoleted by RFC 4918 + 200 : 'OK', + 201 : 'Created', + 202 : 'Accepted', + 203 : 'Non-Authoritative Information', + 204 : 'No Content', + 205 : 'Reset Content', + 206 : 'Partial Content', + 207 : 'Multi-Status', // RFC 4918 + 300 : 'Multiple Choices', + 301 : 'Moved Permanently', + 302 : 'Moved Temporarily', + 303 : 'See Other', + 304 : 'Not Modified', + 305 : 'Use Proxy', + 307 : 'Temporary Redirect', + 400 : 'Bad Request', + 401 : 'Unauthorized', + 402 : 'Payment Required', + 403 : 'Forbidden', + 404 : 'Not Found', + 405 : 'Method Not Allowed', + 406 : 'Not Acceptable', + 407 : 'Proxy Authentication Required', + 408 : 'Request Time-out', + 409 : 'Conflict', + 410 : 'Gone', + 411 : 'Length Required', + 412 : 'Precondition Failed', + 413 : 'Request Entity Too Large', + 414 : 'Request-URI Too Large', + 415 : 'Unsupported Media Type', + 416 : 'Requested Range Not Satisfiable', + 417 : 'Expectation Failed', + 418 : 'I\'m a teapot', // RFC 2324 + 422 : 'Unprocessable Entity', // RFC 4918 + 423 : 'Locked', // RFC 4918 + 424 : 'Failed Dependency', // RFC 4918 + 425 : 'Unordered Collection', // RFC 4918 + 426 : 'Upgrade Required', // RFC 2817 + 500 : 'Internal Server Error', + 501 : 'Not Implemented', + 502 : 'Bad Gateway', + 503 : 'Service Unavailable', + 504 : 'Gateway Time-out', + 505 : 'HTTP Version not supported', + 506 : 'Variant Also Negotiates', // RFC 2295 + 507 : 'Insufficient Storage', // RFC 4918 + 509 : 'Bandwidth Limit Exceeded', + 510 : 'Not Extended' // RFC 2774 +}; + +}); + +require.define("/node_modules/http-browserify/lib/request.js", function (require, module, exports, __dirname, __filename) { + var EventEmitter = require('events').EventEmitter; +var Response = require('./response'); +var isSafeHeader = require('./isSafeHeader'); + +var Request = module.exports = function (xhr, params) { + var self = this; + self.xhr = xhr; + self.body = ''; + + var uri = params.host + ':' + params.port + (params.path || '/'); + + xhr.open( + params.method || 'GET', + (params.scheme || 'http') + '://' + uri, + true + ); + + if (params.headers) { + Object.keys(params.headers).forEach(function (key) { + if (!isSafeHeader(key)) return; + var value = params.headers[key]; + if (Array.isArray(value)) { + value.forEach(function (v) { + xhr.setRequestHeader(key, v); + }); + } + else xhr.setRequestHeader(key, value) + }); + } + + var res = new Response(xhr); + res.on('ready', function () { + self.emit('response', res); + }); + + xhr.onreadystatechange = function () { + res.handle(xhr); + }; +}; + +Request.prototype = new EventEmitter; + +Request.prototype.setHeader = function (key, value) { + if ((Array.isArray && Array.isArray(value)) + || value instanceof Array) { + for (var i = 0; i < value.length; i++) { + this.xhr.setRequestHeader(key, value[i]); + } + } + else { + this.xhr.setRequestHeader(key, value); + } +}; + +Request.prototype.write = function (s) { + this.body += s; +}; + +Request.prototype.end = function (s) { + if (s !== undefined) this.write(s); + this.xhr.send(this.body); +}; + +}); + +require.define("/node_modules/http-browserify/lib/response.js", function (require, module, exports, __dirname, __filename) { + var EventEmitter = require('events').EventEmitter; +var isSafeHeader = require('./isSafeHeader'); + +var Response = module.exports = function (xhr) { + this.xhr = xhr; + this.offset = 0; +}; + +Response.prototype = new EventEmitter; + +var capable = { + streaming : true, + status2 : true +}; + +function parseHeaders (xhr) { + var lines = xhr.getAllResponseHeaders().split(/\r?\n/); + var headers = {}; + for (var i = 0; i < lines.length; i++) { + var line = lines[i]; + if (line === '') continue; + + var m = line.match(/^([^:]+):\s*(.*)/); + if (m) { + var key = m[1].toLowerCase(), value = m[2]; + + if (headers[key] !== undefined) { + if ((Array.isArray && Array.isArray(headers[key])) + || headers[key] instanceof Array) { + headers[key].push(value); + } + else { + headers[key] = [ headers[key], value ]; + } + } + else { + headers[key] = value; + } + } + else { + headers[line] = true; + } + } + return headers; +} + +Response.prototype.getHeader = function (key) { + var header = this.headers ? this.headers[key.toLowerCase()] : null; + if (header) return header; + + // Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes + // getAllResponseHeaders() to return {} if the response is a CORS request. + // xhr.getHeader still works correctly. + if (isSafeHeader(key)) { + return this.xhr.getResponseHeader(key); + } + return null; +}; + +Response.prototype.handle = function () { + var xhr = this.xhr; + if (xhr.readyState === 2 && capable.status2) { + try { + this.statusCode = xhr.status; + this.headers = parseHeaders(xhr); + } + catch (err) { + capable.status2 = false; + } + + if (capable.status2) { + this.emit('ready'); + } + } + else if (capable.streaming && xhr.readyState === 3) { + try { + if (!this.statusCode) { + this.statusCode = xhr.status; + this.headers = parseHeaders(xhr); + this.emit('ready'); + } + } + catch (err) {} + + try { + this.write(); + } + catch (err) { + capable.streaming = false; + } + } + else if (xhr.readyState === 4) { + if (!this.statusCode) { + this.statusCode = xhr.status; + this.emit('ready'); + } + this.write(); + + if (xhr.error) { + this.emit('error', xhr.responseText); + } + else this.emit('end'); + } +}; + +Response.prototype.write = function () { + var xhr = this.xhr; + if (xhr.responseText.length > this.offset) { + this.emit('data', xhr.responseText.slice(this.offset)); + this.offset = xhr.responseText.length; + } +}; + +}); + +require.define("/node_modules/http-browserify/lib/isSafeHeader.js", function (require, module, exports, __dirname, __filename) { + // Taken from http://dxr.mozilla.org/mozilla/mozilla-central/content/base/src/nsXMLHttpRequest.cpp.html +var unsafeHeaders = [ + "accept-charset", + "accept-encoding", + "access-control-request-headers", + "access-control-request-method", + "connection", + "content-length", + "cookie", + "cookie2", + "content-transfer-encoding", + "date", + "expect", + "host", + "keep-alive", + "origin", + "referer", + "set-cookie", + "te", + "trailer", + "transfer-encoding", + "upgrade", + "user-agent", + "via" +]; + +module.exports = function (headerName) { + if (!headerName) return false; + return (unsafeHeaders.indexOf(headerName.toLowerCase()) === -1) +}; + +}); + +require.alias("http-browserify", "/node_modules/http"); + +require.alias("http-browserify", "/node_modules/https"); \ No newline at end of file diff --git a/lib/shred/content.js b/lib/shred/content.js new file mode 100644 index 00000000..b8051fed --- /dev/null +++ b/lib/shred/content.js @@ -0,0 +1,193 @@ + +// The purpose of the `Content` object is to abstract away the data conversions +// to and from raw content entities as strings. For example, you want to be able +// to pass in a Javascript object and have it be automatically converted into a +// JSON string if the `content-type` is set to a JSON-based media type. +// Conversely, you want to be able to transparently get back a Javascript object +// in the response if the `content-type` is a JSON-based media-type. + +// One limitation of the current implementation is that it [assumes the `charset` is UTF-8](https://github.com/spire-io/shred/issues/5). + +// The `Content` constructor takes an options object, which *must* have either a +// `body` or `data` property and *may* have a `type` property indicating the +// media type. If there is no `type` attribute, a default will be inferred. +var Content = function(options) { + this.body = options.body; + this.data = options.data; + this.type = options.type; +}; + +Content.prototype = { + // Treat `toString()` as asking for the `content.body`. That is, the raw content entity. + // + // toString: function() { return this.body; } + // + // Commented out, but I've forgotten why. :/ +}; + + +// `Content` objects have the following attributes: +Object.defineProperties(Content.prototype,{ + +// - **type**. Typically accessed as `content.type`, reflects the `content-type` +// header associated with the request or response. If not passed as an options +// to the constructor or set explicitly, it will infer the type the `data` +// attribute, if possible, and, failing that, will default to `text/plain`. + type: { + get: function() { + if (this._type) { + return this._type; + } else { + if (this._data) { + switch(typeof this._data) { + case "string": return "text/plain"; + case "object": return "application/json"; + } + } + } + return "text/plain"; + }, + set: function(value) { + this._type = value; + return this; + }, + enumerable: true + }, + +// - **data**. Typically accessed as `content.data`, reflects the content entity +// converted into Javascript data. This can be a string, if the `type` is, say, +// `text/plain`, but can also be a Javascript object. The conversion applied is +// based on the `processor` attribute. The `data` attribute can also be set +// directly, in which case the conversion will be done the other way, to infer +// the `body` attribute. + data: { + get: function() { + if (this._body) { + return this.processor.parser(this._body); + } else { + return this._data; + } + }, + set: function(data) { + if (this._body&&data) Errors.setDataWithBody(this); + this._data = data; + return this; + }, + enumerable: true + }, + +// - **body**. Typically accessed as `content.body`, reflects the content entity +// as a UTF-8 string. It is the mirror of the `data` attribute. If you set the +// `data` attribute, the `body` attribute will be inferred and vice-versa. If +// you attempt to set both, an exception is raised. + body: { + get: function() { + if (this._data) { + return this.processor.stringify(this._data); + } else { + return this._body.toString(); + } + }, + set: function(body) { + if (this._data&&body) Errors.setBodyWithData(this); + this._body = body; + return this; + }, + enumerable: true + }, + +// - **processor**. The functions that will be used to convert to/from `data` and +// `body` attributes. You can add processors. The two that are built-in are for +// `text/plain`, which is basically an identity transformation and +// `application/json` and other JSON-based media types (including custom media +// types with `+json`). You can add your own processors. See below. + processor: { + get: function() { + var processor = Content.processors[this.type]; + if (processor) { + return processor; + } else { + // Return the first processor that matches any part of the + // content type. ex: application/vnd.foobar.baz+json will match json. + var main = this.type.split(";")[0]; + var parts = main.split(/\+|\//); + for (var i=0, l=parts.length; i < l; i++) { + processor = Content.processors[parts[i]] + } + return processor || {parser:identity,stringify:toString}; + } + }, + enumerable: true + }, + +// - **length**. Typically accessed as `content.length`, returns the length in +// bytes of the raw content entity. + length: { + get: function() { + if (typeof Buffer !== 'undefined') { + return Buffer.byteLength(this.body); + } + return this.body.length; + } + } +}); + +Content.processors = {}; + +// The `registerProcessor` function allows you to add your own processors to +// convert content entities. Each processor consists of a Javascript object with +// two properties: +// - **parser**. The function used to parse a raw content entity and convert it +// into a Javascript data type. +// - **stringify**. The function used to convert a Javascript data type into a +// raw content entity. +Content.registerProcessor = function(types,processor) { + +// You can pass an array of types that will trigger this processor, or just one. +// We determine the array via duck-typing here. + if (types.forEach) { + types.forEach(function(type) { + Content.processors[type] = processor; + }); + } else { + // If you didn't pass an array, we just use what you pass in. + Content.processors[types] = processor; + } +}; + +// Register the identity processor, which is used for text-based media types. +var identity = function(x) { return x; } + , toString = function(x) { return x.toString(); } +Content.registerProcessor( + ["text/html","text/plain","text"], + { parser: identity, stringify: toString }); + +// Register the JSON processor, which is used for JSON-based media types. +Content.registerProcessor( + ["application/json; charset=utf-8","application/json","json"], + { + parser: function(string) { + return JSON.parse(string); + }, + stringify: function(data) { + return JSON.stringify(data); }}); + +var qs = require('querystring'); +// Register the post processor, which is used for JSON-based media types. +Content.registerProcessor( + ["application/x-www-form-urlencoded"], + { parser : qs.parse, stringify : qs.stringify }); + +// Error functions are defined separately here in an attempt to make the code +// easier to read. +var Errors = { + setDataWithBody: function(object) { + throw new Error("Attempt to set data attribute of a content object " + + "when the body attributes was already set."); + }, + setBodyWithData: function(object) { + throw new Error("Attempt to set body attribute of a content object " + + "when the data attributes was already set."); + } +} +module.exports = Content; \ No newline at end of file diff --git a/lib/swagger.js b/lib/swagger.js new file mode 100644 index 00000000..d690b52b --- /dev/null +++ b/lib/swagger.js @@ -0,0 +1,1111 @@ +// Generated by CoffeeScript 1.4.0 +(function() { + var ApiKeyAuthorization, SwaggerApi, SwaggerAuthorizations, SwaggerHttp, SwaggerModel, SwaggerModelProperty, SwaggerOperation, SwaggerRequest, SwaggerResource, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + SwaggerApi = (function() { + + SwaggerApi.prototype.url = "http://api.wordnik.com/v4/resources.json"; + + SwaggerApi.prototype.debug = false; + + SwaggerApi.prototype.basePath = null; + + SwaggerApi.prototype.authorizations = null; + + SwaggerApi.prototype.authorizationScheme = null; + + SwaggerApi.prototype.info = null; + + function SwaggerApi(url, options) { + if (options == null) { + options = {}; + } + if (url) { + if (url.url) { + options = url; + } else { + this.url = url; + } + } else { + options = url; + } + if (options.url != null) { + this.url = options.url; + } + this.supportedSubmitMethods = options.supportedSubmitMethods != null ? options.supportedSubmitMethods : ['get']; + if (options.success != null) { + this.success = options.success; + } + this.failure = options.failure != null ? options.failure : function() {}; + this.progress = options.progress != null ? options.progress : function() {}; + this.defaultHeaders = options.headers != null ? options.headers : {}; + if (options.success != null) { + this.build(); + } + } + + SwaggerApi.prototype.build = function() { + var e, obj, + _this = this; + this.progress('fetching resource list: ' + this.url); + obj = { + url: this.url, + method: "get", + headers: {}, + on: { + error: function(response) { + if (_this.url.substring(0, 4) !== 'http') { + return _this.fail('Please specify the protocol for ' + _this.url); + } else if (error.status === 0) { + return _this.fail('Can\'t read from server. It may not have the appropriate access-control-origin settings.'); + } else if (error.status === 404) { + return _this.fail('Can\'t read swagger JSON from ' + _this.url); + } else { + return _this.fail(error.status + ' : ' + error.statusText + ' ' + _this.url); + } + }, + response: function(rawResponse) { + var api, isApi, newName, operation, res, resource, response, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2; + response = JSON.parse(rawResponse.content.data); + if (response.apiVersion != null) { + _this.apiVersion = response.apiVersion; + } + _this.apis = {}; + _this.apisArray = []; + _this.produces = response.produces; + if (response.info != null) { + _this.info = response.info; + } + isApi = false; + _ref = response.apis; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + api = _ref[_i]; + if (api.operations) { + _ref1 = api.operations; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + operation = _ref1[_j]; + isApi = true; + } + } + } + if (isApi) { + newName = response.resourcePath.replace(/\//g, ''); + _this.resourcePath = response.resourcePath; + res = new SwaggerResource(response, _this); + _this.apis[newName] = res; + _this.apisArray.push(res); + } else { + if (response.basePath) { + _this.basePath = response.basePath; + } else if (_this.url.indexOf('?') > 0) { + _this.basePath = _this.url.substring(0, _this.url.lastIndexOf('?')); + } else { + _this.basePath = _this.url; + } + _ref2 = response.apis; + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + resource = _ref2[_k]; + res = new SwaggerResource(resource, _this); + _this.apis[res.name] = res; + _this.apisArray.push(res); + } + } + if (_this.success) { + _this.success(); + } + return _this; + } + } + }; + e = {}; + if (typeof window !== 'undefined') { + e = window; + } else { + e = exports; + } + e.authorizations.apply(obj); + new SwaggerHttp().execute(obj); + return this; + }; + + SwaggerApi.prototype.selfReflect = function() { + var resource, resource_name, _ref; + if (this.apis == null) { + return false; + } + _ref = this.apis; + for (resource_name in _ref) { + resource = _ref[resource_name]; + if (resource.ready == null) { + return false; + } + } + this.setConsolidatedModels(); + this.ready = true; + if (this.success != null) { + return this.success(); + } + }; + + SwaggerApi.prototype.fail = function(message) { + this.failure(message); + throw message; + }; + + SwaggerApi.prototype.setConsolidatedModels = function() { + var model, modelName, resource, resource_name, _i, _len, _ref, _ref1, _results; + this.modelsArray = []; + this.models = {}; + _ref = this.apis; + for (resource_name in _ref) { + resource = _ref[resource_name]; + for (modelName in resource.models) { + if (!(this.models[modelName] != null)) { + this.models[modelName] = resource.models[modelName]; + this.modelsArray.push(resource.models[modelName]); + } + } + } + _ref1 = this.modelsArray; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + model = _ref1[_i]; + _results.push(model.setReferencedModels(this.models)); + } + return _results; + }; + + SwaggerApi.prototype.help = function() { + var operation, operation_name, parameter, resource, resource_name, _i, _len, _ref, _ref1, _ref2; + _ref = this.apis; + for (resource_name in _ref) { + resource = _ref[resource_name]; + console.log(resource_name); + _ref1 = resource.operations; + for (operation_name in _ref1) { + operation = _ref1[operation_name]; + console.log(" " + operation.nickname); + _ref2 = operation.parameters; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + parameter = _ref2[_i]; + console.log(" " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description); + } + } + } + return this; + }; + + return SwaggerApi; + + })(); + + SwaggerResource = (function() { + + SwaggerResource.prototype.api = null; + + SwaggerResource.prototype.produces = null; + + SwaggerResource.prototype.consumes = null; + + function SwaggerResource(resourceObj, api) { + var consumes, e, obj, parts, produces, + _this = this; + this.api = api; + this.api = this.api; + produces = []; + consumes = []; + this.path = this.api.resourcePath != null ? this.api.resourcePath : resourceObj.path; + console.log("we produce " + resourceObj.produces); + console.log('using path ' + this.path); + this.description = resourceObj.description; + parts = this.path.split("/"); + this.name = parts[parts.length - 1].replace('.{format}', ''); + this.basePath = this.api.basePath; + this.operations = {}; + this.operationsArray = []; + this.modelsArray = []; + this.models = {}; + if ((resourceObj.apis != null) && (this.api.resourcePath != null)) { + this.addApiDeclaration(resourceObj); + } else { + if (this.path == null) { + this.api.fail("SwaggerResources must have a path."); + } + if (this.path.substring(0, 4) === 'http') { + this.url = this.path.replace('{format}', 'json'); + } else { + this.url = this.api.basePath + this.path.replace('{format}', 'json'); + } + this.api.progress('fetching resource ' + this.name + ': ' + this.url); + obj = { + url: this.url, + method: "get", + headers: {}, + on: { + error: function(response) { + return _this.api.fail("Unable to read api '" + _this.name + "' from path " + _this.url + " (server returned " + error.statusText + ")"); + }, + response: function(rawResponse) { + var response; + response = JSON.parse(rawResponse.content.data); + return _this.addApiDeclaration(response); + } + } + }; + e = {}; + if (typeof window !== 'undefined') { + e = window; + } else { + e = exports; + } + e.authorizations.apply(obj); + new SwaggerHttp().execute(obj); + } + } + + SwaggerResource.prototype.addApiDeclaration = function(response) { + var endpoint, _i, _len, _ref; + if (response.produces != null) { + this.produces = response.produces; + } + if (response.consumes != null) { + this.consumes = response.consumes; + } + if ((response.basePath != null) && response.basePath.replace(/\s/g, '').length > 0) { + this.basePath = response.basePath; + } + this.addModels(response.models); + if (response.apis) { + _ref = response.apis; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + endpoint = _ref[_i]; + this.addOperations(endpoint.path, endpoint.operations, response.consumes, response.produces); + } + } + this.api[this.name] = this; + this.ready = true; + return this.api.selfReflect(); + }; + + SwaggerResource.prototype.addModels = function(models) { + var model, modelName, swaggerModel, _i, _len, _ref, _results; + if (models != null) { + for (modelName in models) { + if (!(this.models[modelName] != null)) { + swaggerModel = new SwaggerModel(modelName, models[modelName]); + this.modelsArray.push(swaggerModel); + this.models[modelName] = swaggerModel; + } + } + _ref = this.modelsArray; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + model = _ref[_i]; + _results.push(model.setReferencedModels(this.models)); + } + return _results; + } + }; + + SwaggerResource.prototype.addOperations = function(resource_path, ops, consumes, produces) { + var method, o, op, responseMessages, type, _i, _len, _results; + if (ops) { + _results = []; + for (_i = 0, _len = ops.length; _i < _len; _i++) { + o = ops[_i]; + consumes = this.consumes; + produces = this.produces; + if (o.consumes != null) { + consumes = o.consumes; + } else { + consumes = this.consumes; + } + if (o.produces != null) { + produces = o.produces; + } else { + produces = this.produces; + } + type = o.type || o.responseClass; + responseMessages = o.responseMessages; + method = o.method; + if (o.httpMethod) { + method = o.httpMethod; + } + if (o.supportedContentTypes) { + consumes = o.supportedContentTypes; + } + if (o.errorResponses) { + responseMessages = o.errorResponses; + } + o.nickname = this.sanitize(o.nickname); + op = new SwaggerOperation(o.nickname, resource_path, method, o.parameters, o.summary, o.notes, type, responseMessages, this, consumes, produces); + this.operations[op.nickname] = op; + _results.push(this.operationsArray.push(op)); + } + return _results; + } + }; + + SwaggerResource.prototype.sanitize = function(nickname) { + var op; + op = nickname.replace(/[\s!@#$%^&*()_+=\[{\]};:<>|./?,\\'""-]/g, '_'); + op = op.replace(/((_){2,})/g, '_'); + op = op.replace(/^(_)*/g, ''); + op = op.replace(/([_])*$/g, ''); + return op; + }; + + SwaggerResource.prototype.help = function() { + var msg, operation, operation_name, parameter, _i, _len, _ref, _ref1, _results; + _ref = this.operations; + _results = []; + for (operation_name in _ref) { + operation = _ref[operation_name]; + msg = " " + operation.nickname; + _ref1 = operation.parameters; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + parameter = _ref1[_i]; + msg.concat(" " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description); + } + _results.push(msg); + } + return _results; + }; + + return SwaggerResource; + + })(); + + SwaggerModel = (function() { + + function SwaggerModel(modelName, obj) { + var propertyName; + this.name = obj.id != null ? obj.id : modelName; + this.properties = []; + for (propertyName in obj.properties) { + this.properties.push(new SwaggerModelProperty(propertyName, obj.properties[propertyName])); + } + } + + SwaggerModel.prototype.setReferencedModels = function(allModels) { + var prop, type, _i, _len, _ref, _results; + _ref = this.properties; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + prop = _ref[_i]; + type = prop.type || prop.dataType; + if (allModels[type] != null) { + _results.push(prop.refModel = allModels[type]); + } else if ((prop.refDataType != null) && (allModels[prop.refDataType] != null)) { + _results.push(prop.refModel = allModels[prop.refDataType]); + } else { + _results.push(void 0); + } + } + return _results; + }; + + SwaggerModel.prototype.getMockSignature = function(modelsToIgnore) { + var classClose, classOpen, prop, propertiesStr, returnVal, strong, strongClose, stronger, _i, _j, _len, _len1, _ref, _ref1; + propertiesStr = []; + _ref = this.properties; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + prop = _ref[_i]; + propertiesStr.push(prop.toString()); + } + strong = ''; + stronger = ''; + strongClose = ''; + classOpen = strong + this.name + ' {' + strongClose; + classClose = strong + '}' + strongClose; + returnVal = classOpen + '
    ' + propertiesStr.join(',
    ') + '
    ' + classClose; + if (!modelsToIgnore) { + modelsToIgnore = []; + } + modelsToIgnore.push(this); + _ref1 = this.properties; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + prop = _ref1[_j]; + if ((prop.refModel != null) && (modelsToIgnore.indexOf(prop.refModel)) === -1) { + returnVal = returnVal + ('
    ' + prop.refModel.getMockSignature(modelsToIgnore)); + } + } + return returnVal; + }; + + SwaggerModel.prototype.createJSONSample = function(modelsToIgnore) { + var prop, result, _i, _len, _ref; + result = {}; + modelsToIgnore = modelsToIgnore || []; + modelsToIgnore.push(this.name); + _ref = this.properties; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + prop = _ref[_i]; + result[prop.name] = prop.getSampleValue(modelsToIgnore); + } + return result; + }; + + return SwaggerModel; + + })(); + + SwaggerModelProperty = (function() { + + function SwaggerModelProperty(name, obj) { + this.name = name; + this.dataType = obj.type; + this.isCollection = this.dataType && (this.dataType.toLowerCase() === 'array' || this.dataType.toLowerCase() === 'list' || this.dataType.toLowerCase() === 'set'); + this.descr = obj.description; + this.required = obj.required; + if (obj.items != null) { + if (obj.items.type != null) { + this.refDataType = obj.items.type; + } + if (obj.items.$ref != null) { + this.refDataType = obj.items.$ref; + } + } + this.dataTypeWithRef = this.refDataType != null ? this.dataType + '[' + this.refDataType + ']' : this.dataType; + if (obj.allowableValues != null) { + this.valueType = obj.allowableValues.valueType; + this.values = obj.allowableValues.values; + if (this.values != null) { + this.valuesString = "'" + this.values.join("' or '") + "'"; + } + } + } + + SwaggerModelProperty.prototype.getSampleValue = function(modelsToIgnore) { + var result; + if ((this.refModel != null) && (modelsToIgnore.indexOf(this.refModel.name) === -1)) { + result = this.refModel.createJSONSample(modelsToIgnore); + } else { + if (this.isCollection) { + result = this.refDataType; + } else { + result = this.dataType; + } + } + if (this.isCollection) { + return [result]; + } else { + return result; + } + }; + + SwaggerModelProperty.prototype.toString = function() { + var req, str; + req = this.required ? 'propReq' : 'propOpt'; + str = '' + this.name + ' (' + this.dataTypeWithRef + ''; + if (!this.required) { + str += ', optional'; + } + str += ')'; + if (this.values != null) { + str += " = ['" + this.values.join("' or '") + "']"; + } + if (this.descr != null) { + str += ': ' + this.descr + ''; + } + return str; + }; + + return SwaggerModelProperty; + + })(); + + SwaggerOperation = (function() { + + function SwaggerOperation(nickname, path, method, parameters, summary, notes, type, responseMessages, resource, consumes, produces) { + var parameter, v, _i, _j, _len, _len1, _ref, _ref1, _ref2, + _this = this; + this.nickname = nickname; + this.path = path; + this.method = method; + this.parameters = parameters != null ? parameters : []; + this.summary = summary; + this.notes = notes; + this.type = type; + this.responseMessages = responseMessages; + this.resource = resource; + this.consumes = consumes; + this.produces = produces; + this["do"] = __bind(this["do"], this); + + if (this.nickname == null) { + this.resource.api.fail("SwaggerOperations must have a nickname."); + } + if (this.path == null) { + this.resource.api.fail("SwaggerOperation " + nickname + " is missing path."); + } + if (this.method == null) { + this.resource.api.fail("SwaggerOperation " + nickname + " is missing method."); + } + this.path = this.path.replace('{format}', 'json'); + this.method = this.method.toLowerCase(); + this.isGetMethod = this.method === "get"; + this.resourceName = this.resource.name; + if (((_ref = this.type) != null ? _ref.toLowerCase() : void 0) === 'void') { + this.type = void 0; + } + if (this.type != null) { + this.responseClassSignature = this.getSignature(this.type, this.resource.models); + this.responseSampleJSON = this.getSampleJSON(this.type, this.resource.models); + } + this.responseMessages = this.responseMessages || []; + _ref1 = this.parameters; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + parameter = _ref1[_i]; + parameter.name = parameter.name || parameter.type || parameter.dataType; + type = parameter.type || parameter.dataType; + if (type.toLowerCase() === 'boolean') { + parameter.allowableValues = {}; + parameter.allowableValues.values = this.resource.api.booleanValues; + } + parameter.signature = this.getSignature(type, this.resource.models); + parameter.sampleJSON = this.getSampleJSON(type, this.resource.models); + if (parameter.allowableValues != null) { + if (parameter.allowableValues.valueType === "RANGE") { + parameter.isRange = true; + } else { + parameter.isList = true; + } + if (parameter.allowableValues.values != null) { + parameter.allowableValues.descriptiveValues = []; + _ref2 = parameter.allowableValues.values; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + v = _ref2[_j]; + if ((parameter.defaultValue != null) && parameter.defaultValue === v) { + parameter.allowableValues.descriptiveValues.push({ + value: v, + isDefault: true + }); + } else { + parameter.allowableValues.descriptiveValues.push({ + value: v, + isDefault: false + }); + } + } + } + } + } + this.resource[this.nickname] = function(args, callback, error) { + return _this["do"](args, callback, error); + }; + this.resource[this.nickname].help = function() { + return _this.help(); + }; + } + + SwaggerOperation.prototype.isListType = function(type) { + if (type.indexOf('[') >= 0) { + return type.substring(type.indexOf('[') + 1, type.indexOf(']')); + } else { + return void 0; + } + }; + + SwaggerOperation.prototype.getSignature = function(type, models) { + var isPrimitive, listType; + listType = this.isListType(type); + isPrimitive = ((listType != null) && models[listType]) || (models[type] != null) ? false : true; + if (isPrimitive) { + return type; + } else { + if (listType != null) { + return models[listType].getMockSignature(); + } else { + return models[type].getMockSignature(); + } + } + }; + + SwaggerOperation.prototype.getSampleJSON = function(type, models) { + var isPrimitive, listType, val; + listType = this.isListType(type); + isPrimitive = ((listType != null) && models[listType]) || (models[type] != null) ? false : true; + val = isPrimitive ? void 0 : (listType != null ? models[listType].createJSONSample() : models[type].createJSONSample()); + if (val) { + val = listType ? [val] : val; + return JSON.stringify(val, null, 2); + } + }; + + SwaggerOperation.prototype["do"] = function(args, opts, callback, error) { + var key, param, params, possibleParams, req, requestContentType, responseContentType, value; + if (args == null) { + args = {}; + } + if (opts == null) { + opts = {}; + } + requestContentType = null; + responseContentType = null; + if ((typeof args) === "function") { + error = opts; + callback = args; + args = {}; + } + if ((typeof opts) === "function") { + error = callback; + callback = opts; + } + if (error == null) { + error = function(xhr, textStatus, error) { + return console.log(xhr, textStatus, error); + }; + } + if (callback == null) { + callback = function(data) { + var content; + content = null; + if (data.content != null) { + content = data.content.data; + } else { + content = "no data"; + } + return console.log("default callback: " + content); + }; + } + params = {}; + if (args.headers != null) { + params.headers = args.headers; + delete args.headers; + } + if (args.body != null) { + params.body = args.body; + delete args.body; + } + possibleParams = (function() { + var _i, _len, _ref, _results; + _ref = this.parameters; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + param = _ref[_i]; + if (param.paramType === "form" || param.paramType.toLowerCase() === "file") { + _results.push(param); + } + } + return _results; + }).call(this); + if (possibleParams) { + for (key in possibleParams) { + value = possibleParams[key]; + if (args[value.name]) { + params[value.name] = args[value.name]; + } + } + } + req = new SwaggerRequest(this.method, this.urlify(args), params, opts, callback, error, this); + if (opts.mock != null) { + return req; + } else { + return true; + } + }; + + SwaggerOperation.prototype.pathJson = function() { + return this.path.replace("{format}", "json"); + }; + + SwaggerOperation.prototype.pathXml = function() { + return this.path.replace("{format}", "xml"); + }; + + SwaggerOperation.prototype.urlify = function(args) { + var param, queryParams, reg, url, _i, _j, _len, _len1, _ref, _ref1; + url = this.resource.basePath + this.pathJson(); + _ref = this.parameters; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + param = _ref[_i]; + if (param.paramType === 'path') { + if (args[param.name]) { + reg = new RegExp('\{' + param.name + '[^\}]*\}', 'gi'); + url = url.replace(reg, encodeURIComponent(args[param.name])); + delete args[param.name]; + } else { + throw "" + param.name + " is a required path param."; + } + } + } + queryParams = ""; + _ref1 = this.parameters; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + param = _ref1[_j]; + if (param.paramType === 'query') { + if (args[param.name]) { + if (queryParams !== "") { + queryParams += "&"; + } + queryParams += encodeURIComponent(param.name) + '=' + encodeURIComponent(args[param.name]); + } + } + } + if ((queryParams != null) && queryParams.length > 0) { + url += "?" + queryParams; + } + return url; + }; + + SwaggerOperation.prototype.supportHeaderParams = function() { + return this.resource.api.supportHeaderParams; + }; + + SwaggerOperation.prototype.supportedSubmitMethods = function() { + return this.resource.api.supportedSubmitMethods; + }; + + SwaggerOperation.prototype.getQueryParams = function(args) { + return this.getMatchingParams(['query'], args); + }; + + SwaggerOperation.prototype.getHeaderParams = function(args) { + return this.getMatchingParams(['header'], args); + }; + + SwaggerOperation.prototype.getMatchingParams = function(paramTypes, args) { + var matchingParams, name, param, value, _i, _len, _ref, _ref1; + matchingParams = {}; + _ref = this.parameters; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + param = _ref[_i]; + if (args && args[param.name]) { + matchingParams[param.name] = args[param.name]; + } + } + _ref1 = this.resource.api.headers; + for (name in _ref1) { + value = _ref1[name]; + matchingParams[name] = value; + } + return matchingParams; + }; + + SwaggerOperation.prototype.help = function() { + var msg, parameter, _i, _len, _ref; + msg = ""; + _ref = this.parameters; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + parameter = _ref[_i]; + if (msg !== "") { + msg += "\n"; + } + msg += "* " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description; + } + return msg; + }; + + return SwaggerOperation; + + })(); + + SwaggerRequest = (function() { + + function SwaggerRequest(type, url, params, opts, successCallback, errorCallback, operation, execution) { + var body, e, fields, headers, key, myHeaders, obj, param, parent, possibleParams, requestContentType, responseContentType, urlEncoded, value, values, + _this = this; + this.type = type; + this.url = url; + this.params = params; + this.opts = opts; + this.successCallback = successCallback; + this.errorCallback = errorCallback; + this.operation = operation; + this.execution = execution; + if (this.type == null) { + throw "SwaggerRequest type is required (get/post/put/delete)."; + } + if (this.url == null) { + throw "SwaggerRequest url is required."; + } + if (this.successCallback == null) { + throw "SwaggerRequest successCallback is required."; + } + if (this.errorCallback == null) { + throw "SwaggerRequest error callback is required."; + } + if (this.operation == null) { + throw "SwaggerRequest operation is required."; + } + this.type = this.type.toUpperCase(); + headers = params.headers; + myHeaders = {}; + body = params.body; + parent = params["parent"]; + requestContentType = "application/json"; + if (body && (this.type === "POST" || this.type === "PUT" || this.type === "PATCH")) { + if (this.opts.requestContentType) { + requestContentType = this.opts.requestContentType; + } + } else { + if (((function() { + var _i, _len, _ref, _results; + _ref = this.operation.parameters; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + param = _ref[_i]; + if (param.paramType === "form") { + _results.push(param); + } + } + return _results; + }).call(this)).length > 0) { + type = param.type || param.dataType; + if (((function() { + var _i, _len, _ref, _results; + _ref = this.operation.parameters; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + param = _ref[_i]; + if (type.toLowerCase() === "file") { + _results.push(param); + } + } + return _results; + }).call(this)).length > 0) { + requestContentType = "multipart/form-data"; + } else { + requestContentType = "application/x-www-form-urlencoded"; + } + } else if (this.type !== "DELETE") { + requestContentType = null; + } + } + if (requestContentType && this.operation.consumes) { + if (this.operation.consumes.indexOf(requestContentType) === -1) { + console.log("server doesn't consume " + requestContentType + ", try " + JSON.stringify(this.operation.consumes)); + if (this.requestContentType === null) { + requestContentType = this.operation.consumes[0]; + } + } + } + responseContentType = null; + if (this.type === "POST" || this.type === "GET" || this.type === "PATCH") { + if (this.opts.responseContentType) { + responseContentType = this.opts.responseContentType; + } else { + responseContentType = "application/json"; + } + } else { + responseContentType = null; + } + if (responseContentType && this.operation.produces) { + if (this.operation.produces.indexOf(responseContentType) === -1) { + console.log("server can't produce " + responseContentType); + } + } + if (requestContentType && requestContentType.indexOf("application/x-www-form-urlencoded") === 0) { + fields = {}; + possibleParams = (function() { + var _i, _len, _ref, _results; + _ref = this.operation.parameters; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + param = _ref[_i]; + if (param.paramType === "form") { + _results.push(param); + } + } + return _results; + }).call(this); + values = {}; + for (key in possibleParams) { + value = possibleParams[key]; + if (this.params[value.name]) { + values[value.name] = this.params[value.name]; + } + } + urlEncoded = ""; + for (key in values) { + value = values[key]; + if (urlEncoded !== "") { + urlEncoded += "&"; + } + urlEncoded += encodeURIComponent(key) + '=' + encodeURIComponent(value); + } + body = urlEncoded; + } + if (requestContentType) { + myHeaders["Content-Type"] = requestContentType; + } + if (responseContentType) { + myHeaders["Accept"] = responseContentType; + } + if (!((headers != null) && (headers.mock != null))) { + obj = { + url: this.url, + method: this.type, + headers: myHeaders, + body: body, + on: { + error: function(response) { + return _this.errorCallback(response, _this.opts.parent); + }, + redirect: function(response) { + return _this.successCallback(response, _this.opts.parent); + }, + 307: function(response) { + return _this.successCallback(response, _this.opts.parent); + }, + response: function(response) { + return _this.successCallback(response, _this.opts.parent); + } + } + }; + e = {}; + if (typeof window !== 'undefined') { + e = window; + } else { + e = exports; + } + e.authorizations.apply(obj); + if (opts.mock == null) { + new SwaggerHttp().execute(obj); + } else { + console.log(obj); + return obj; + } + } + } + + SwaggerRequest.prototype.asCurl = function() { + var header_args, k, v; + header_args = (function() { + var _ref, _results; + _ref = this.headers; + _results = []; + for (k in _ref) { + v = _ref[k]; + _results.push("--header \"" + k + ": " + v + "\""); + } + return _results; + }).call(this); + return "curl " + (header_args.join(" ")) + " " + this.url; + }; + + return SwaggerRequest; + + })(); + + SwaggerHttp = (function() { + + SwaggerHttp.prototype.Shred = null; + + SwaggerHttp.prototype.shred = null; + + SwaggerHttp.prototype.content = null; + + function SwaggerHttp() { + var identity, toString, + _this = this; + if (typeof window !== 'undefined') { + this.Shred = require("./shred"); + } else { + this.Shred = require("shred"); + } + this.shred = new this.Shred(); + identity = function(x) { + return x; + }; + toString = function(x) { + return x.toString(); + }; + if (typeof window !== 'undefined') { + this.content = require("./shred/content"); + this.content.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], { + parser: identity, + stringify: toString + }); + } else { + this.Shred.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], { + parser: identity, + stringify: toString + }); + } + } + + SwaggerHttp.prototype.execute = function(obj) { + return this.shred.request(obj); + }; + + return SwaggerHttp; + + })(); + + SwaggerAuthorizations = (function() { + + SwaggerAuthorizations.prototype.authz = null; + + function SwaggerAuthorizations() { + this.authz = {}; + } + + SwaggerAuthorizations.prototype.add = function(name, auth) { + this.authz[name] = auth; + return auth; + }; + + SwaggerAuthorizations.prototype.apply = function(obj) { + var key, value, _ref, _results; + _ref = this.authz; + _results = []; + for (key in _ref) { + value = _ref[key]; + _results.push(value.apply(obj)); + } + return _results; + }; + + return SwaggerAuthorizations; + + })(); + + ApiKeyAuthorization = (function() { + + ApiKeyAuthorization.prototype.type = null; + + ApiKeyAuthorization.prototype.name = null; + + ApiKeyAuthorization.prototype.value = null; + + function ApiKeyAuthorization(name, value, type) { + this.name = name; + this.value = value; + this.type = type; + } + + ApiKeyAuthorization.prototype.apply = function(obj) { + if (this.type === "query") { + if (obj.url.indexOf('?') > 0) { + obj.url = obj.url + "&" + this.name + "=" + this.value; + } else { + obj.url = obj.url + "?" + this.name + "=" + this.value; + } + return true; + } else if (this.type === "header") { + return obj.headers[this.name] = this.value; + } + }; + + return ApiKeyAuthorization; + + })(); + + this.SwaggerApi = SwaggerApi; + + this.SwaggerResource = SwaggerResource; + + this.SwaggerOperation = SwaggerOperation; + + this.SwaggerRequest = SwaggerRequest; + + this.SwaggerModelProperty = SwaggerModelProperty; + + this.ApiKeyAuthorization = ApiKeyAuthorization; + + this.authorizations = new SwaggerAuthorizations(); + +}).call(this); diff --git a/package.json b/package.json index 0623b2c6..94763615 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "swagger-ui", - "version": "1.1.15", + "version": "2.0.0", "description": "Swagger UI is a dependency-free collection of HTML, Javascript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API", "scripts": { "build": "PATH=$PATH:./node_modules/.bin cake dist", @@ -19,7 +19,6 @@ "readmeFilename": "README.md", "dependencies": { "coffee-script": "~1.5.0", - "swagger-client": "1.0.4", "handlebars": "~1.0.10" } } diff --git a/src/main/coffeescript/SwaggerUi.coffee b/src/main/coffeescript/SwaggerUi.coffee index 10a0a1a3..9bb40fd0 100644 --- a/src/main/coffeescript/SwaggerUi.coffee +++ b/src/main/coffeescript/SwaggerUi.coffee @@ -34,16 +34,22 @@ class SwaggerUi extends Backbone.Router # Event handler for when url/key is received from user updateSwaggerUi: (data) -> - @options.discoveryUrl = data.discoveryUrl - @options.apiKey = data.apiKey + @options.url = data.url @load() # Create an api and render load: -> # Initialize the API object @mainView?.clear() - @headerView.update(@options.discoveryUrl, @options.apiKey) + url = @options.url + if url.indexOf("http") isnt 0 + url = @buildUrl(window.location.href.toString(), url) + + @options.url = url + @headerView.update(url) @api = new SwaggerApi(@options) + @api.build() + @api # This is bound to success handler for SwaggerApi # so it gets called when SwaggerApi completes loading @@ -52,8 +58,8 @@ class SwaggerUi extends Backbone.Router @mainView = new MainView({model: @api, el: $('#' + @dom_id)}).render() @showMessage() switch @options.docExpansion - when "full" then Docs.expandOperationsForResource('') - when "list" then Docs.collapseOperationsForResource('') + when "full" then Docs.expandOperationsForResource('') + when "list" then Docs.collapseOperationsForResource('') @options.onComplete(@api, @) if @options.onComplete setTimeout( => @@ -61,6 +67,16 @@ class SwaggerUi extends Backbone.Router 400 ) + buildUrl: (base, url) -> + console.log "base is " + base + parts = base.split("/") + base = parts[0] + "//" + parts[2] + if url.indexOf("/") is 0 + base + url + else + base + "/" + url + + # Shows message on topbar of the ui showMessage: (data = '') -> $('#message-bar').removeClass 'message-fail' diff --git a/src/main/coffeescript/view/ContentTypeView.coffee b/src/main/coffeescript/view/ContentTypeView.coffee index 4f113810..1c7a6515 100644 --- a/src/main/coffeescript/view/ContentTypeView.coffee +++ b/src/main/coffeescript/view/ContentTypeView.coffee @@ -5,12 +5,7 @@ class ContentTypeView extends Backbone.View template = @template() $(@el).html(template(@model)) - @isParam = @model.isParam - - if @isParam - $('label[for=contentType]', $(@el)).text('Parameter content type:') - else - $('label[for=contentType]', $(@el)).text('Response Content Type') + $('label[for=contentType]', $(@el)).text('Response Content Type') @ diff --git a/src/main/coffeescript/view/HeaderView.coffee b/src/main/coffeescript/view/HeaderView.coffee index 527fa71e..3d6b9f3f 100644 --- a/src/main/coffeescript/view/HeaderView.coffee +++ b/src/main/coffeescript/view/HeaderView.coffee @@ -9,17 +9,16 @@ class HeaderView extends Backbone.View initialize: -> - showPetStore: (e) -> @trigger( 'update-swagger-ui' - {discoveryUrl:"http://petstore.swagger.wordnik.com/api/api-docs.json", apiKey:"special-key"} + {url:"http://petstore.swagger.wordnik.com/api/api-docs.json"} ) showWordnikDev: (e) -> @trigger( 'update-swagger-ui' - {discoveryUrl:"http://api.wordnik.com/v4/resources.json", apiKey:""} + {url:"http://api.wordnik.com/v4/resources.json"} ) showCustomOnKeyup: (e) -> @@ -29,10 +28,10 @@ class HeaderView extends Backbone.View e?.preventDefault() @trigger( 'update-swagger-ui' - {discoveryUrl: $('#input_baseUrl').val(), apiKey: $('#input_apiKey').val()} + {url: $('#input_baseUrl').val(), apiKey: $('#input_apiKey').val()} ) update: (url, apiKey, trigger = false) -> $('#input_baseUrl').val url - $('#input_apiKey').val apiKey - @trigger 'update-swagger-ui', {discoveryUrl:url, apiKey:apiKey} if trigger + #$('#input_apiKey').val apiKey + @trigger 'update-swagger-ui', {url:url} if trigger diff --git a/src/main/coffeescript/view/OperationView.coffee b/src/main/coffeescript/view/OperationView.coffee index 44f794e3..dd28f6f1 100644 --- a/src/main/coffeescript/view/OperationView.coffee +++ b/src/main/coffeescript/view/OperationView.coffee @@ -9,7 +9,7 @@ class OperationView extends Backbone.View initialize: -> render: -> - isMethodSubmissionSupported = jQuery.inArray(@model.httpMethod, @model.supportedSubmitMethods()) >= 0 + isMethodSubmissionSupported = true #jQuery.inArray(@model.method, @model.supportedSubmitMethods) >= 0 @model.isReadOnly = true unless isMethodSubmissionSupported $(@el).html(Handlebars.templates.operation(@model)) @@ -23,31 +23,35 @@ class OperationView extends Backbone.View responseSignatureView = new SignatureView({model: signatureModel, tagName: 'div'}) $('.model-signature', $(@el)).append responseSignatureView.render().el else - $('.model-signature', $(@el)).html(@model.responseClass) + $('.model-signature', $(@el)).html(@model.type) contentTypeModel = isParam: false - # support old syntax - if @model.supportedContentTypes - contentTypeModel.produces = @model.supportedContentTypes + contentTypeModel.consumes = @model.consumes + contentTypeModel.produces = @model.produces - if @model.produces - contentTypeModel.produces = @model.produces + for param in @model.parameters + type = param.type || param.dataType + if type.toLowerCase() == 'file' + if !contentTypeModel.consumes + console.log "set content type " + contentTypeModel.consumes = 'multipart/form-data' - contentTypeView = new ContentTypeView({model: contentTypeModel}) - $('.content-type', $(@el)).append contentTypeView.render().el + responseContentTypeView = new ResponseContentTypeView({model: contentTypeModel}) + $('.response-content-type', $(@el)).append responseContentTypeView.render().el # Render each parameter - @addParameter param for param in @model.parameters + @addParameter param, contentTypeModel.consumes for param in @model.parameters # Render each response code - @addStatusCode statusCode for statusCode in @model.errorResponses + @addStatusCode statusCode for statusCode in @model.responseMessages @ - addParameter: (param) -> + addParameter: (param, consumes) -> # Render a parameter + param.consumes = consumes paramView = new ParameterView({model: param, tagName: 'tr', readOnly: @model.isReadOnly}) $('.operation-params', $(@el)).append paramView.render().el @@ -72,103 +76,27 @@ class OperationView extends Backbone.View # if error free submit it if error_free map = {} - for o in form.serializeArray() + opts = {parent: @} + #for o in form.serializeArray() + #if(o.value? && jQuery.trim(o.value).length > 0) + #map[o.name] = o.value + + for o in form.find("input") if(o.value? && jQuery.trim(o.value).length > 0) - map[o.name] = o.value + map[o.name] = encodeURI(o.value) - isFileUpload = form.children().find('input[type~="file"]').size() != 0 + for o in form.find("textarea") + if(o.value? && jQuery.trim(o.value).length > 0) + map["body"] = o.value - isFormPost = false - consumes = "application/json" - if @model.consumes and @model.consumes.length > 0 - # honor the consumes setting above everything else - consumes = @model.consumes[0] - else - for o in @model.parameters - if o.paramType == 'form' - isFormPost = true - consumes = false + opts.responseContentType = $("div select[name=responseContentType]", $(@el)).val() + opts.requestContentType = $("div select[name=parameterContentType]", $(@el)).val() - if isFileUpload - consumes = false - else if @model.httpMethod.toLowerCase() == "post" and isFormPost is false - consumes = "application/json" + @model.do(map, opts, @showCompleteStatus, @showErrorStatus, @) - if isFileUpload - # requires HTML5 compatible browser - bodyParam = new FormData() + success: (response, parent) -> + parent.showCompleteStatus response - # add params except file - for param in @model.parameters - if (param.paramType is 'body' or 'form') and param.name isnt 'file' and param.name isnt 'File' and map[param.name]? - bodyParam.append(param.name, map[param.name]) - - # add files - $.each form.children().find('input[type~="file"]'), (i, el) -> - bodyParam.append($(el).attr('name'), el.files[0]) - - console.log(bodyParam) - else if isFormPost - bodyParam = new FormData() - for param in @model.parameters - if map[param.name]? - bodyParam.append(param.name, map[param.name]) - else - bodyParam = null - for param in @model.parameters - if param.paramType is 'body' - bodyParam = map[param.name] - - log "bodyParam = " + bodyParam - - headerParams = null - invocationUrl = - if @model.supportHeaderParams() - headerParams = @model.getHeaderParams(map) - @model.urlify(map, false) - else - @model.urlify(map, true) - - log 'submitting ' + invocationUrl - - - $(".request_url", $(@el)).html "
    " + invocationUrl + "
    " - $(".response_throbber", $(@el)).show() - - obj = - type: @model.httpMethod - url: invocationUrl - headers: headerParams - data: bodyParam - contentType: consumes - dataType: 'json' - processData: false - error: (xhr, textStatus, error) => - @showErrorStatus(xhr, textStatus, error) - success: (data) => - @showResponse(data) - complete: (data) => - @showCompleteStatus(data) - - paramContentTypeField = $("td select[name=contentType]", $(@el)).val() - if paramContentTypeField - obj.contentType = paramContentTypeField - - log 'content type = ' + obj.contentType - - if not (obj.data or (obj.type is 'GET' or obj.type is 'DELETE')) and obj.contentType is not "application/x-www-form-urlencoded" - obj.contentType = false - - log 'content type is now = ' + obj.contentType - - responseContentTypeField = $('.content > .content-type > div > select[name=contentType]', $(@el)).val() - if responseContentTypeField - obj.headers = if obj.headers? then obj.headers else {} - obj.headers.accept = responseContentTypeField - - jQuery.ajax(obj) - false - # $.getJSON(invocationUrl, (r) => @showResponse(r)).complete((r) => @showCompleteStatus(r)).error (r) => @showErrorStatus(r) # handler for hide response link hideResponse: (e) -> @@ -182,14 +110,13 @@ class OperationView extends Backbone.View prettyJson = JSON.stringify(response, null, "\t").replace(/\n/g, "
    ") $(".response_body", $(@el)).html escape(prettyJson) - # Show error from server - showErrorStatus: (data) -> - @showStatus data + showErrorStatus: (data, parent) -> + parent.showStatus data # show the status codes - showCompleteStatus: (data) -> - @showStatus data + showCompleteStatus: (data, parent) -> + parent.showStatus data # Adapted from http://stackoverflow.com/a/2893259/454004 formatXml: (xml) -> @@ -252,21 +179,39 @@ class OperationView extends Backbone.View # puts the response data in UI showStatus: (data) -> - try - code = $('').text(JSON.stringify(JSON.parse(data.responseText), null, 2)) + content = data.content.data + headers = data.getHeaders() + + # if server is nice, and sends content-type back, we can use it + contentType = headers["Content-Type"] + + if content == undefined + code = $('').text("no content") pre = $('
    ').append(code)
    -    catch error
    -      code = $('').text(@formatXml(data.responseText))
    +    else if contentType.indexOf("application/json") == 0
    +      code = $('').text(JSON.stringify(JSON.parse(content), null, 2))
    +      pre = $('
    ').append(code)
    +    else if contentType.indexOf("application/xml") == 0
    +      code = $('').text(@formatXml(content))
           pre = $('
    ').append(code)
    +    else if contentType.indexOf("text/html") == 0
    +      code = $('').html(content)
    +      pre = $('
    ').append(code)
    +    else
    +      # don't know what to render!
    +      code = $('').text(content)
    +      pre = $('
    ').append(code)
    +
         response_body = pre
    +    $(".request_url").html "
    " + data.request.url + "
    " $(".response_code", $(@el)).html "
    " + data.status + "
    " $(".response_body", $(@el)).html response_body - $(".response_headers", $(@el)).html "
    " + data.getAllResponseHeaders() + "
    " + $(".response_headers", $(@el)).html "
    " + JSON.stringify(data.getHeaders()) + "
    " $(".response", $(@el)).slideDown() $(".response_hider", $(@el)).show() $(".response_throbber", $(@el)).hide() hljs.highlightBlock($('.response_body', $(@el))[0]) toggleOperationContent: -> - elem = $('#' + Docs.escapeResourceName(@model.resourceName) + "_" + @model.nickname + "_" + @model.httpMethod + "_" + @model.number + "_content") + elem = $('#' + Docs.escapeResourceName(@model.resourceName) + "_" + @model.nickname + "_" + @model.method + "_" + @model.number + "_content") if elem.is(':visible') then Docs.collapseOperation(elem) else Docs.expandOperation(elem) diff --git a/src/main/coffeescript/view/ParameterContentTypeView.coffee b/src/main/coffeescript/view/ParameterContentTypeView.coffee new file mode 100644 index 00000000..3a969733 --- /dev/null +++ b/src/main/coffeescript/view/ParameterContentTypeView.coffee @@ -0,0 +1,14 @@ +class ParameterContentTypeView extends Backbone.View + initialize: -> + + render: -> + template = @template() + $(@el).html(template(@model)) + + $('label[for=parameterContentType]', $(@el)).text('Parameter content type:') + + @ + + template: -> + Handlebars.templates.parameter_content_type + diff --git a/src/main/coffeescript/view/ParameterView.coffee b/src/main/coffeescript/view/ParameterView.coffee index 37c1eb4f..bf747b89 100644 --- a/src/main/coffeescript/view/ParameterView.coffee +++ b/src/main/coffeescript/view/ParameterView.coffee @@ -2,8 +2,9 @@ class ParameterView extends Backbone.View initialize: -> render: -> + type = @model.type || @model.dataType @model.isBody = true if @model.paramType == 'body' - @model.isFile = true if @model.dataType == 'file' + @model.isFile = true if type.toLowerCase() == 'file' template = @template() $(@el).html(template(@model)) @@ -19,18 +20,23 @@ class ParameterView extends Backbone.View else $('.model-signature', $(@el)).html(@model.signature) + isParam = false + + if @model.isBody + isParam = true + contentTypeModel = - isParam: false + isParam: isParam - # support old syntax - if @model.supportedContentTypes - contentTypeModel.produces = @model.supportedContentTypes + contentTypeModel.consumes = @model.consumes - if @model.produces - contentTypeModel.produces = @model.produces + if isParam + parameterContentTypeView = new ParameterContentTypeView({model: contentTypeModel}) + $('.parameter-content-type', $(@el)).append parameterContentTypeView.render().el - contentTypeView = new ContentTypeView({model: contentTypeModel}) - $('.content-type', $(@el)).append contentTypeView.render().el + else + responseContentTypeView = new ResponseContentTypeView({model: contentTypeModel}) + $('.response-content-type', $(@el)).append responseContentTypeView.render().el @ diff --git a/src/main/coffeescript/view/ResponseContentTypeView.coffee b/src/main/coffeescript/view/ResponseContentTypeView.coffee new file mode 100644 index 00000000..3d17d477 --- /dev/null +++ b/src/main/coffeescript/view/ResponseContentTypeView.coffee @@ -0,0 +1,14 @@ +class ResponseContentTypeView extends Backbone.View + initialize: -> + + render: -> + template = @template() + + $(@el).html(template(@model)) + + $('label[for=responseContentType]', $(@el)).text('Response Content Type') + + @ + + template: -> + Handlebars.templates.response_content_type diff --git a/src/main/html/css/screen.css b/src/main/html/css/screen.css index 06050e76..0d609496 100644 --- a/src/main/html/css/screen.css +++ b/src/main/html/css/screen.css @@ -1756,4 +1756,27 @@ pre code { .message-fail { color: #cc0000; +} + +.info_title { + padding-bottom: 10px; + font-weight: bold; + font-size: 25px; +} + +.info_description { + padding-bottom: 10px; + font-size: 15px; +} + +.info_tos { + padding-bottom: 5px; +} + +.info_license { + padding-bottom: 5px; +} + +.info_contact { + padding-bottom: 5px; } \ No newline at end of file diff --git a/src/main/html/index.html b/src/main/html/index.html index 2aa853df..991b4310 100644 --- a/src/main/html/index.html +++ b/src/main/html/index.html @@ -1,74 +1,78 @@ - Swagger UI - - - - - - - - - - - - - + Swagger UI + + + + + + + + + + + + + + + + +
    -   +  
    diff --git a/src/main/template/content_type.handlebars b/src/main/template/content_type.handlebars index dca2a827..063f6a6e 100644 --- a/src/main/template/content_type.handlebars +++ b/src/main/template/content_type.handlebars @@ -1,10 +1,10 @@ diff --git a/src/main/template/main.handlebars b/src/main/template/main.handlebars index 91b5ce9b..151239e5 100644 --- a/src/main/template/main.handlebars +++ b/src/main/template/main.handlebars @@ -1,4 +1,12 @@ - +
    + {{#if info}} +
    {{info.title}}
    +
    {{{info.description}}}
    + {{#if info.termsOfServiceUrl}}{{/if}} + {{#if info.contact}}{{/if}} + {{#if info.license}}{{/if}} + {{/if}} +
    diff --git a/src/main/template/operation.handlebars b/src/main/template/operation.handlebars index 2d1c2b0c..afdf8ba5 100644 --- a/src/main/template/operation.handlebars +++ b/src/main/template/operation.handlebars @@ -1,49 +1,49 @@
      -
    • +
    • -