You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2015/05/08 13:36:46 UTC
[21/52] [partial] incubator-ignite git commit: # ignite-843 WIP.
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/lib/parser.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/lib/parser.js b/modules/webconfig/nodejs/node_modules/jade/lib/parser.js
new file mode 100644
index 0000000..f4afef4
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/lib/parser.js
@@ -0,0 +1,825 @@
+'use strict';
+
+var Lexer = require('./lexer');
+var nodes = require('./nodes');
+var utils = require('./utils');
+var filters = require('./filters');
+var path = require('path');
+var constantinople = require('constantinople');
+var parseJSExpression = require('character-parser').parseMax;
+var extname = path.extname;
+
+/**
+ * Initialize `Parser` with the given input `str` and `filename`.
+ *
+ * @param {String} str
+ * @param {String} filename
+ * @param {Object} options
+ * @api public
+ */
+
+var Parser = exports = module.exports = function Parser(str, filename, options){
+ //Strip any UTF-8 BOM off of the start of `str`, if it exists.
+ this.input = str.replace(/^\uFEFF/, '');
+ this.lexer = new Lexer(this.input, filename);
+ this.filename = filename;
+ this.blocks = {};
+ this.mixins = {};
+ this.options = options;
+ this.contexts = [this];
+ this.inMixin = 0;
+ this.dependencies = [];
+ this.inBlock = 0;
+};
+
+/**
+ * Parser prototype.
+ */
+
+Parser.prototype = {
+
+ /**
+ * Save original constructor
+ */
+
+ constructor: Parser,
+
+ /**
+ * Push `parser` onto the context stack,
+ * or pop and return a `Parser`.
+ */
+
+ context: function(parser){
+ if (parser) {
+ this.contexts.push(parser);
+ } else {
+ return this.contexts.pop();
+ }
+ },
+
+ /**
+ * Return the next token object.
+ *
+ * @return {Object}
+ * @api private
+ */
+
+ advance: function(){
+ return this.lexer.advance();
+ },
+
+ /**
+ * Single token lookahead.
+ *
+ * @return {Object}
+ * @api private
+ */
+
+ peek: function() {
+ return this.lookahead(1);
+ },
+
+ /**
+ * Return lexer lineno.
+ *
+ * @return {Number}
+ * @api private
+ */
+
+ line: function() {
+ return this.lexer.lineno;
+ },
+
+ /**
+ * `n` token lookahead.
+ *
+ * @param {Number} n
+ * @return {Object}
+ * @api private
+ */
+
+ lookahead: function(n){
+ return this.lexer.lookahead(n);
+ },
+
+ /**
+ * Parse input returning a string of js for evaluation.
+ *
+ * @return {String}
+ * @api public
+ */
+
+ parse: function(){
+ var block = new nodes.Block, parser;
+ block.line = 0;
+ block.filename = this.filename;
+
+ while ('eos' != this.peek().type) {
+ if ('newline' == this.peek().type) {
+ this.advance();
+ } else {
+ var next = this.peek();
+ var expr = this.parseExpr();
+ expr.filename = expr.filename || this.filename;
+ expr.line = next.line;
+ block.push(expr);
+ }
+ }
+
+ if (parser = this.extending) {
+ this.context(parser);
+ var ast = parser.parse();
+ this.context();
+
+ // hoist mixins
+ for (var name in this.mixins)
+ ast.unshift(this.mixins[name]);
+ return ast;
+ }
+
+ if (!this.extending && !this.included && Object.keys(this.blocks).length){
+ var blocks = [];
+ utils.walkAST(block, function (node) {
+ if (node.type === 'Block' && node.name) {
+ blocks.push(node.name);
+ }
+ });
+ Object.keys(this.blocks).forEach(function (name) {
+ if (blocks.indexOf(name) === -1 && !this.blocks[name].isSubBlock) {
+ console.warn('Warning: Unexpected block "'
+ + name
+ + '" '
+ + ' on line '
+ + this.blocks[name].line
+ + ' of '
+ + (this.blocks[name].filename)
+ + '. This block is never used. This warning will be an error in v2.0.0');
+ }
+ }.bind(this));
+ }
+
+ return block;
+ },
+
+ /**
+ * Expect the given type, or throw an exception.
+ *
+ * @param {String} type
+ * @api private
+ */
+
+ expect: function(type){
+ if (this.peek().type === type) {
+ return this.advance();
+ } else {
+ throw new Error('expected "' + type + '", but got "' + this.peek().type + '"');
+ }
+ },
+
+ /**
+ * Accept the given `type`.
+ *
+ * @param {String} type
+ * @api private
+ */
+
+ accept: function(type){
+ if (this.peek().type === type) {
+ return this.advance();
+ }
+ },
+
+ /**
+ * tag
+ * | doctype
+ * | mixin
+ * | include
+ * | filter
+ * | comment
+ * | text
+ * | each
+ * | code
+ * | yield
+ * | id
+ * | class
+ * | interpolation
+ */
+
+ parseExpr: function(){
+ switch (this.peek().type) {
+ case 'tag':
+ return this.parseTag();
+ case 'mixin':
+ return this.parseMixin();
+ case 'block':
+ return this.parseBlock();
+ case 'mixin-block':
+ return this.parseMixinBlock();
+ case 'case':
+ return this.parseCase();
+ case 'extends':
+ return this.parseExtends();
+ case 'include':
+ return this.parseInclude();
+ case 'doctype':
+ return this.parseDoctype();
+ case 'filter':
+ return this.parseFilter();
+ case 'comment':
+ return this.parseComment();
+ case 'text':
+ return this.parseText();
+ case 'each':
+ return this.parseEach();
+ case 'code':
+ return this.parseCode();
+ case 'call':
+ return this.parseCall();
+ case 'interpolation':
+ return this.parseInterpolation();
+ case 'yield':
+ this.advance();
+ var block = new nodes.Block;
+ block.yield = true;
+ return block;
+ case 'id':
+ case 'class':
+ var tok = this.advance();
+ this.lexer.defer(this.lexer.tok('tag', 'div'));
+ this.lexer.defer(tok);
+ return this.parseExpr();
+ default:
+ throw new Error('unexpected token "' + this.peek().type + '"');
+ }
+ },
+
+ /**
+ * Text
+ */
+
+ parseText: function(){
+ var tok = this.expect('text');
+ var tokens = this.parseInlineTagsInText(tok.val);
+ if (tokens.length === 1) return tokens[0];
+ var node = new nodes.Block;
+ for (var i = 0; i < tokens.length; i++) {
+ node.push(tokens[i]);
+ };
+ return node;
+ },
+
+ /**
+ * ':' expr
+ * | block
+ */
+
+ parseBlockExpansion: function(){
+ if (':' == this.peek().type) {
+ this.advance();
+ return new nodes.Block(this.parseExpr());
+ } else {
+ return this.block();
+ }
+ },
+
+ /**
+ * case
+ */
+
+ parseCase: function(){
+ var val = this.expect('case').val;
+ var node = new nodes.Case(val);
+ node.line = this.line();
+
+ var block = new nodes.Block;
+ block.line = this.line();
+ block.filename = this.filename;
+ this.expect('indent');
+ while ('outdent' != this.peek().type) {
+ switch (this.peek().type) {
+ case 'comment':
+ case 'newline':
+ this.advance();
+ break;
+ case 'when':
+ block.push(this.parseWhen());
+ break;
+ case 'default':
+ block.push(this.parseDefault());
+ break;
+ default:
+ throw new Error('Unexpected token "' + this.peek().type
+ + '", expected "when", "default" or "newline"');
+ }
+ }
+ this.expect('outdent');
+
+ node.block = block;
+
+ return node;
+ },
+
+ /**
+ * when
+ */
+
+ parseWhen: function(){
+ var val = this.expect('when').val;
+ if (this.peek().type !== 'newline')
+ return new nodes.Case.When(val, this.parseBlockExpansion());
+ else
+ return new nodes.Case.When(val);
+ },
+
+ /**
+ * default
+ */
+
+ parseDefault: function(){
+ this.expect('default');
+ return new nodes.Case.When('default', this.parseBlockExpansion());
+ },
+
+ /**
+ * code
+ */
+
+ parseCode: function(afterIf){
+ var tok = this.expect('code');
+ var node = new nodes.Code(tok.val, tok.buffer, tok.escape);
+ var block;
+ node.line = this.line();
+
+ // throw an error if an else does not have an if
+ if (tok.isElse && !tok.hasIf) {
+ throw new Error('Unexpected else without if');
+ }
+
+ // handle block
+ block = 'indent' == this.peek().type;
+ if (block) {
+ node.block = this.block();
+ }
+
+ // handle missing block
+ if (tok.requiresBlock && !block) {
+ node.block = new nodes.Block();
+ }
+
+ // mark presense of if for future elses
+ if (tok.isIf && this.peek().isElse) {
+ this.peek().hasIf = true;
+ } else if (tok.isIf && this.peek().type === 'newline' && this.lookahead(2).isElse) {
+ this.lookahead(2).hasIf = true;
+ }
+
+ return node;
+ },
+
+ /**
+ * comment
+ */
+
+ parseComment: function(){
+ var tok = this.expect('comment');
+ var node;
+
+ var block;
+ if (block = this.parseTextBlock()) {
+ node = new nodes.BlockComment(tok.val, block, tok.buffer);
+ } else {
+ node = new nodes.Comment(tok.val, tok.buffer);
+ }
+
+ node.line = this.line();
+ return node;
+ },
+
+ /**
+ * doctype
+ */
+
+ parseDoctype: function(){
+ var tok = this.expect('doctype');
+ var node = new nodes.Doctype(tok.val);
+ node.line = this.line();
+ return node;
+ },
+
+ /**
+ * filter attrs? text-block
+ */
+
+ parseFilter: function(){
+ var tok = this.expect('filter');
+ var attrs = this.accept('attrs');
+ var block;
+
+ block = this.parseTextBlock() || new nodes.Block();
+
+ var options = {};
+ if (attrs) {
+ attrs.attrs.forEach(function (attribute) {
+ options[attribute.name] = constantinople.toConstant(attribute.val);
+ });
+ }
+
+ var node = new nodes.Filter(tok.val, block, options);
+ node.line = this.line();
+ return node;
+ },
+
+ /**
+ * each block
+ */
+
+ parseEach: function(){
+ var tok = this.expect('each');
+ var node = new nodes.Each(tok.code, tok.val, tok.key);
+ node.line = this.line();
+ node.block = this.block();
+ if (this.peek().type == 'code' && this.peek().val == 'else') {
+ this.advance();
+ node.alternative = this.block();
+ }
+ return node;
+ },
+
+ /**
+ * Resolves a path relative to the template for use in
+ * includes and extends
+ *
+ * @param {String} path
+ * @param {String} purpose Used in error messages.
+ * @return {String}
+ * @api private
+ */
+
+ resolvePath: function (path, purpose) {
+ var p = require('path');
+ var dirname = p.dirname;
+ var basename = p.basename;
+ var join = p.join;
+
+ if (path[0] !== '/' && !this.filename)
+ throw new Error('the "filename" option is required to use "' + purpose + '" with "relative" paths');
+
+ if (path[0] === '/' && !this.options.basedir)
+ throw new Error('the "basedir" option is required to use "' + purpose + '" with "absolute" paths');
+
+ path = join(path[0] === '/' ? this.options.basedir : dirname(this.filename), path);
+
+ if (basename(path).indexOf('.') === -1) path += '.jade';
+
+ return path;
+ },
+
+ /**
+ * 'extends' name
+ */
+
+ parseExtends: function(){
+ var fs = require('fs');
+
+ var path = this.resolvePath(this.expect('extends').val.trim(), 'extends');
+ if ('.jade' != path.substr(-5)) path += '.jade';
+
+ this.dependencies.push(path);
+ var str = fs.readFileSync(path, 'utf8');
+ var parser = new this.constructor(str, path, this.options);
+ parser.dependencies = this.dependencies;
+
+ parser.blocks = this.blocks;
+ parser.included = this.included;
+ parser.contexts = this.contexts;
+ this.extending = parser;
+
+ // TODO: null node
+ return new nodes.Literal('');
+ },
+
+ /**
+ * 'block' name block
+ */
+
+ parseBlock: function(){
+ var block = this.expect('block');
+ var mode = block.mode;
+ var name = block.val.trim();
+
+ var line = block.line;
+
+ this.inBlock++;
+ block = 'indent' == this.peek().type
+ ? this.block()
+ : new nodes.Block(new nodes.Literal(''));
+ this.inBlock--;
+ block.name = name;
+ block.line = line;
+
+ var prev = this.blocks[name] || {prepended: [], appended: []}
+ if (prev.mode === 'replace') return this.blocks[name] = prev;
+
+ var allNodes = prev.prepended.concat(block.nodes).concat(prev.appended);
+
+ switch (mode) {
+ case 'append':
+ prev.appended = prev.parser === this ?
+ prev.appended.concat(block.nodes) :
+ block.nodes.concat(prev.appended);
+ break;
+ case 'prepend':
+ prev.prepended = prev.parser === this ?
+ block.nodes.concat(prev.prepended) :
+ prev.prepended.concat(block.nodes);
+ break;
+ }
+ block.nodes = allNodes;
+ block.appended = prev.appended;
+ block.prepended = prev.prepended;
+ block.mode = mode;
+ block.parser = this;
+
+ block.isSubBlock = this.inBlock > 0;
+
+ return this.blocks[name] = block;
+ },
+
+ parseMixinBlock: function () {
+ var block = this.expect('mixin-block');
+ if (!this.inMixin) {
+ throw new Error('Anonymous blocks are not allowed unless they are part of a mixin.');
+ }
+ return new nodes.MixinBlock();
+ },
+
+ /**
+ * include block?
+ */
+
+ parseInclude: function(){
+ var fs = require('fs');
+ var tok = this.expect('include');
+
+ var path = this.resolvePath(tok.val.trim(), 'include');
+ this.dependencies.push(path);
+ // has-filter
+ if (tok.filter) {
+ var str = fs.readFileSync(path, 'utf8').replace(/\r/g, '');
+ var options = {filename: path};
+ if (tok.attrs) {
+ tok.attrs.attrs.forEach(function (attribute) {
+ options[attribute.name] = constantinople.toConstant(attribute.val);
+ });
+ }
+ str = filters(tok.filter, str, options);
+ return new nodes.Literal(str);
+ }
+
+ // non-jade
+ if ('.jade' != path.substr(-5)) {
+ var str = fs.readFileSync(path, 'utf8').replace(/\r/g, '');
+ return new nodes.Literal(str);
+ }
+
+ var str = fs.readFileSync(path, 'utf8');
+ var parser = new this.constructor(str, path, this.options);
+ parser.dependencies = this.dependencies;
+
+ parser.blocks = utils.merge({}, this.blocks);
+ parser.included = true;
+
+ parser.mixins = this.mixins;
+
+ this.context(parser);
+ var ast = parser.parse();
+ this.context();
+ ast.filename = path;
+
+ if ('indent' == this.peek().type) {
+ ast.includeBlock().push(this.block());
+ }
+
+ return ast;
+ },
+
+ /**
+ * call ident block
+ */
+
+ parseCall: function(){
+ var tok = this.expect('call');
+ var name = tok.val;
+ var args = tok.args;
+ var mixin = new nodes.Mixin(name, args, new nodes.Block, true);
+
+ this.tag(mixin);
+ if (mixin.code) {
+ mixin.block.push(mixin.code);
+ mixin.code = null;
+ }
+ if (mixin.block.isEmpty()) mixin.block = null;
+ return mixin;
+ },
+
+ /**
+ * mixin block
+ */
+
+ parseMixin: function(){
+ var tok = this.expect('mixin');
+ var name = tok.val;
+ var args = tok.args;
+ var mixin;
+
+ // definition
+ if ('indent' == this.peek().type) {
+ this.inMixin++;
+ mixin = new nodes.Mixin(name, args, this.block(), false);
+ this.mixins[name] = mixin;
+ this.inMixin--;
+ return mixin;
+ // call
+ } else {
+ return new nodes.Mixin(name, args, null, true);
+ }
+ },
+
+ parseInlineTagsInText: function (str) {
+ var line = this.line();
+
+ var match = /(\\)?#\[((?:.|\n)*)$/.exec(str);
+ if (match) {
+ if (match[1]) { // escape
+ var text = new nodes.Text(str.substr(0, match.index) + '#[');
+ text.line = line;
+ var rest = this.parseInlineTagsInText(match[2]);
+ if (rest[0].type === 'Text') {
+ text.val += rest[0].val;
+ rest.shift();
+ }
+ return [text].concat(rest);
+ } else {
+ var text = new nodes.Text(str.substr(0, match.index));
+ text.line = line;
+ var buffer = [text];
+ var rest = match[2];
+ var range = parseJSExpression(rest);
+ var inner = new Parser(range.src, this.filename, this.options);
+ buffer.push(inner.parse());
+ return buffer.concat(this.parseInlineTagsInText(rest.substr(range.end + 1)));
+ }
+ } else {
+ var text = new nodes.Text(str);
+ text.line = line;
+ return [text];
+ }
+ },
+
+ /**
+ * indent (text | newline)* outdent
+ */
+
+ parseTextBlock: function(){
+ var block = new nodes.Block;
+ block.line = this.line();
+ var body = this.peek();
+ if (body.type !== 'pipeless-text') return;
+ this.advance();
+ block.nodes = body.val.reduce(function (accumulator, text) {
+ return accumulator.concat(this.parseInlineTagsInText(text));
+ }.bind(this), []);
+ return block;
+ },
+
+ /**
+ * indent expr* outdent
+ */
+
+ block: function(){
+ var block = new nodes.Block;
+ block.line = this.line();
+ block.filename = this.filename;
+ this.expect('indent');
+ while ('outdent' != this.peek().type) {
+ if ('newline' == this.peek().type) {
+ this.advance();
+ } else {
+ var expr = this.parseExpr();
+ expr.filename = this.filename;
+ block.push(expr);
+ }
+ }
+ this.expect('outdent');
+ return block;
+ },
+
+ /**
+ * interpolation (attrs | class | id)* (text | code | ':')? newline* block?
+ */
+
+ parseInterpolation: function(){
+ var tok = this.advance();
+ var tag = new nodes.Tag(tok.val);
+ tag.buffer = true;
+ return this.tag(tag);
+ },
+
+ /**
+ * tag (attrs | class | id)* (text | code | ':')? newline* block?
+ */
+
+ parseTag: function(){
+ var tok = this.advance();
+ var tag = new nodes.Tag(tok.val);
+
+ tag.selfClosing = tok.selfClosing;
+
+ return this.tag(tag);
+ },
+
+ /**
+ * Parse tag.
+ */
+
+ tag: function(tag){
+ tag.line = this.line();
+
+ var seenAttrs = false;
+ // (attrs | class | id)*
+ out:
+ while (true) {
+ switch (this.peek().type) {
+ case 'id':
+ case 'class':
+ var tok = this.advance();
+ tag.setAttribute(tok.type, "'" + tok.val + "'");
+ continue;
+ case 'attrs':
+ if (seenAttrs) {
+ console.warn(this.filename + ', line ' + this.peek().line + ':\nYou should not have jade tags with multiple attributes.');
+ }
+ seenAttrs = true;
+ var tok = this.advance();
+ var attrs = tok.attrs;
+
+ if (tok.selfClosing) tag.selfClosing = true;
+
+ for (var i = 0; i < attrs.length; i++) {
+ tag.setAttribute(attrs[i].name, attrs[i].val, attrs[i].escaped);
+ }
+ continue;
+ case '&attributes':
+ var tok = this.advance();
+ tag.addAttributes(tok.val);
+ break;
+ default:
+ break out;
+ }
+ }
+
+ // check immediate '.'
+ if ('dot' == this.peek().type) {
+ tag.textOnly = true;
+ this.advance();
+ }
+
+ // (text | code | ':')?
+ switch (this.peek().type) {
+ case 'text':
+ tag.block.push(this.parseText());
+ break;
+ case 'code':
+ tag.code = this.parseCode();
+ break;
+ case ':':
+ this.advance();
+ tag.block = new nodes.Block;
+ tag.block.push(this.parseExpr());
+ break;
+ case 'newline':
+ case 'indent':
+ case 'outdent':
+ case 'eos':
+ case 'pipeless-text':
+ break;
+ default:
+ throw new Error('Unexpected token `' + this.peek().type + '` expected `text`, `code`, `:`, `newline` or `eos`')
+ }
+
+ // newline*
+ while ('newline' == this.peek().type) this.advance();
+
+ // block?
+ if (tag.textOnly) {
+ tag.block = this.parseTextBlock() || new nodes.Block();
+ } else if ('indent' == this.peek().type) {
+ var block = this.block();
+ for (var i = 0, len = block.nodes.length; i < len; ++i) {
+ tag.block.push(block.nodes[i]);
+ }
+ }
+
+ return tag;
+ }
+};
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/lib/runtime.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/lib/runtime.js b/modules/webconfig/nodejs/node_modules/jade/lib/runtime.js
new file mode 100644
index 0000000..88c4ed3
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/lib/runtime.js
@@ -0,0 +1,232 @@
+'use strict';
+
+/**
+ * Merge two attribute objects giving precedence
+ * to values in object `b`. Classes are special-cased
+ * allowing for arrays and merging/joining appropriately
+ * resulting in a string.
+ *
+ * @param {Object} a
+ * @param {Object} b
+ * @return {Object} a
+ * @api private
+ */
+
+exports.merge = function merge(a, b) {
+ if (arguments.length === 1) {
+ var attrs = a[0];
+ for (var i = 1; i < a.length; i++) {
+ attrs = merge(attrs, a[i]);
+ }
+ return attrs;
+ }
+ var ac = a['class'];
+ var bc = b['class'];
+
+ if (ac || bc) {
+ ac = ac || [];
+ bc = bc || [];
+ if (!Array.isArray(ac)) ac = [ac];
+ if (!Array.isArray(bc)) bc = [bc];
+ a['class'] = ac.concat(bc).filter(nulls);
+ }
+
+ for (var key in b) {
+ if (key != 'class') {
+ a[key] = b[key];
+ }
+ }
+
+ return a;
+};
+
+/**
+ * Filter null `val`s.
+ *
+ * @param {*} val
+ * @return {Boolean}
+ * @api private
+ */
+
+function nulls(val) {
+ return val != null && val !== '';
+}
+
+/**
+ * join array as classes.
+ *
+ * @param {*} val
+ * @return {String}
+ */
+exports.joinClasses = joinClasses;
+function joinClasses(val) {
+ return (Array.isArray(val) ? val.map(joinClasses) :
+ (val && typeof val === 'object') ? Object.keys(val).filter(function (key) { return val[key]; }) :
+ [val]).filter(nulls).join(' ');
+}
+
+/**
+ * Render the given classes.
+ *
+ * @param {Array} classes
+ * @param {Array.<Boolean>} escaped
+ * @return {String}
+ */
+exports.cls = function cls(classes, escaped) {
+ var buf = [];
+ for (var i = 0; i < classes.length; i++) {
+ if (escaped && escaped[i]) {
+ buf.push(exports.escape(joinClasses([classes[i]])));
+ } else {
+ buf.push(joinClasses(classes[i]));
+ }
+ }
+ var text = joinClasses(buf);
+ if (text.length) {
+ return ' class="' + text + '"';
+ } else {
+ return '';
+ }
+};
+
+
+exports.style = function (val) {
+ if (val && typeof val === 'object') {
+ return Object.keys(val).map(function (style) {
+ return style + ':' + val[style];
+ }).join(';');
+ } else {
+ return val;
+ }
+};
+/**
+ * Render the given attribute.
+ *
+ * @param {String} key
+ * @param {String} val
+ * @param {Boolean} escaped
+ * @param {Boolean} terse
+ * @return {String}
+ */
+exports.attr = function attr(key, val, escaped, terse) {
+ if (key === 'style') {
+ val = exports.style(val);
+ }
+ if ('boolean' == typeof val || null == val) {
+ if (val) {
+ return ' ' + (terse ? key : key + '="' + key + '"');
+ } else {
+ return '';
+ }
+ } else if (0 == key.indexOf('data') && 'string' != typeof val) {
+ if (JSON.stringify(val).indexOf('&') !== -1) {
+ console.warn('Since Jade 2.0.0, ampersands (`&`) in data attributes ' +
+ 'will be escaped to `&`');
+ };
+ if (val && typeof val.toISOString === 'function') {
+ console.warn('Jade will eliminate the double quotes around dates in ' +
+ 'ISO form after 2.0.0');
+ }
+ return ' ' + key + "='" + JSON.stringify(val).replace(/'/g, ''') + "'";
+ } else if (escaped) {
+ if (val && typeof val.toISOString === 'function') {
+ console.warn('Jade will stringify dates in ISO form after 2.0.0');
+ }
+ return ' ' + key + '="' + exports.escape(val) + '"';
+ } else {
+ if (val && typeof val.toISOString === 'function') {
+ console.warn('Jade will stringify dates in ISO form after 2.0.0');
+ }
+ return ' ' + key + '="' + val + '"';
+ }
+};
+
+/**
+ * Render the given attributes object.
+ *
+ * @param {Object} obj
+ * @param {Object} escaped
+ * @return {String}
+ */
+exports.attrs = function attrs(obj, terse){
+ var buf = [];
+
+ var keys = Object.keys(obj);
+
+ if (keys.length) {
+ for (var i = 0; i < keys.length; ++i) {
+ var key = keys[i]
+ , val = obj[key];
+
+ if ('class' == key) {
+ if (val = joinClasses(val)) {
+ buf.push(' ' + key + '="' + val + '"');
+ }
+ } else {
+ buf.push(exports.attr(key, val, false, terse));
+ }
+ }
+ }
+
+ return buf.join('');
+};
+
+/**
+ * Escape the given string of `html`.
+ *
+ * @param {String} html
+ * @return {String}
+ * @api private
+ */
+
+exports.escape = function escape(html){
+ var result = String(html)
+ .replace(/&/g, '&')
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+ .replace(/"/g, '"');
+ if (result === '' + html) return html;
+ else return result;
+};
+
+/**
+ * Re-throw the given `err` in context to the
+ * the jade in `filename` at the given `lineno`.
+ *
+ * @param {Error} err
+ * @param {String} filename
+ * @param {String} lineno
+ * @api private
+ */
+
+exports.rethrow = function rethrow(err, filename, lineno, str){
+ if (!(err instanceof Error)) throw err;
+ if ((typeof window != 'undefined' || !filename) && !str) {
+ err.message += ' on line ' + lineno;
+ throw err;
+ }
+ try {
+ str = str || require('fs').readFileSync(filename, 'utf8')
+ } catch (ex) {
+ rethrow(err, null, lineno)
+ }
+ var context = 3
+ , lines = str.split('\n')
+ , start = Math.max(lineno - context, 0)
+ , end = Math.min(lines.length, lineno + context);
+
+ // Error context
+ var context = lines.slice(start, end).map(function(line, i){
+ var curr = i + start + 1;
+ return (curr == lineno ? ' > ' : ' ')
+ + curr
+ + '| '
+ + line;
+ }).join('\n');
+
+ // Alter exception message
+ err.path = filename;
+ err.message = (filename || 'Jade') + ':' + lineno
+ + '\n' + context + '\n\n' + err.message;
+ throw err;
+};
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/lib/utils.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/lib/utils.js b/modules/webconfig/nodejs/node_modules/jade/lib/utils.js
new file mode 100644
index 0000000..ad5f016
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/lib/utils.js
@@ -0,0 +1,53 @@
+'use strict';
+
+/**
+ * Merge `b` into `a`.
+ *
+ * @param {Object} a
+ * @param {Object} b
+ * @return {Object}
+ * @api public
+ */
+
+exports.merge = function(a, b) {
+ for (var key in b) a[key] = b[key];
+ return a;
+};
+
+exports.stringify = function(str) {
+ return JSON.stringify(str)
+ .replace(/\u2028/g, '\\u2028')
+ .replace(/\u2029/g, '\\u2029');
+};
+
+exports.walkAST = function walkAST(ast, before, after) {
+ before && before(ast);
+ switch (ast.type) {
+ case 'Block':
+ ast.nodes.forEach(function (node) {
+ walkAST(node, before, after);
+ });
+ break;
+ case 'Case':
+ case 'Each':
+ case 'Mixin':
+ case 'Tag':
+ case 'When':
+ case 'Code':
+ ast.block && walkAST(ast.block, before, after);
+ break;
+ case 'Attrs':
+ case 'BlockComment':
+ case 'Comment':
+ case 'Doctype':
+ case 'Filter':
+ case 'Literal':
+ case 'MixinBlock':
+ case 'Text':
+ break;
+ default:
+ throw new Error('Unexpected node type ' + ast.type);
+ break;
+ }
+ after && after(ast);
+};
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/node_modules/.bin/mkdirp
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/node_modules/.bin/mkdirp b/modules/webconfig/nodejs/node_modules/jade/node_modules/.bin/mkdirp
new file mode 120000
index 0000000..017896c
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/node_modules/.bin/mkdirp
@@ -0,0 +1 @@
+../mkdirp/bin/cmd.js
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/.npmignore
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/.npmignore b/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/.npmignore
new file mode 100644
index 0000000..cefaa67
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/.npmignore
@@ -0,0 +1,2 @@
+test/
+.travis.yml
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/LICENSE
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/LICENSE b/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/LICENSE
new file mode 100644
index 0000000..e1b32ec
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2013 Forbes Lindesay
+
+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.
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/README.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/README.md b/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/README.md
new file mode 100644
index 0000000..02a0b99
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/README.md
@@ -0,0 +1,142 @@
+# character-parser
+
+Parse JavaScript one character at a time to look for snippets in Templates. This is not a validator, it's just designed to allow you to have sections of JavaScript delimited by brackets robustly.
+
+[![Build Status](https://img.shields.io/travis/ForbesLindesay/character-parser/master.svg)](https://travis-ci.org/ForbesLindesay/character-parser)
+
+## Installation
+
+ npm install character-parser
+
+## Usage
+
+Work out how much depth changes:
+
+```js
+var state = parse('foo(arg1, arg2, {\n foo: [a, b\n');
+assert(state.roundDepth === 1);
+assert(state.curlyDepth === 1);
+assert(state.squareDepth === 1);
+parse(' c, d]\n })', state);
+assert(state.squareDepth === 0);
+assert(state.curlyDepth === 0);
+assert(state.roundDepth === 0);
+```
+
+### Bracketed Expressions
+
+Find all the contents of a bracketed expression:
+
+```js
+var section = parser.parseMax('foo="(", bar="}") bing bong');
+assert(section.start === 0);
+assert(section.end === 16);//exclusive end of string
+assert(section.src = 'foo="(", bar="}"');
+
+
+var section = parser.parseMax('{foo="(", bar="}"} bing bong', {start: 1});
+assert(section.start === 1);
+assert(section.end === 17);//exclusive end of string
+assert(section.src = 'foo="(", bar="}"');
+```
+
+The bracketed expression parsing simply parses up to but excluding the first unmatched closed bracket (`)`, `}`, `]`). It is clever enough to ignore brackets in comments or strings.
+
+
+### Custom Delimited Expressions
+
+Find code up to a custom delimiter:
+
+```js
+var section = parser.parseUntil('foo.bar("%>").baz%> bing bong', '%>');
+assert(section.start === 0);
+assert(section.end === 17);//exclusive end of string
+assert(section.src = 'foo.bar("%>").baz');
+
+var section = parser.parseUntil('<%foo.bar("%>").baz%> bing bong', '%>', {start: 2});
+assert(section.start === 2);
+assert(section.end === 19);//exclusive end of string
+assert(section.src = 'foo.bar("%>").baz');
+```
+
+Delimiters are ignored if they are inside strings or comments.
+
+## API
+
+### parse(str, state = defaultState(), options = {start: 0, end: src.length})
+
+Parse a string starting at the index start, and return the state after parsing that string.
+
+If you want to parse one string in multiple sections you should keep passing the resulting state to the next parse operation.
+
+Returns a `State` object.
+
+### parseMax(src, options = {start: 0})
+
+Parses the source until the first unmatched close bracket (any of `)`, `}`, `]`). It returns an object with the structure:
+
+```js
+{
+ start: 0,//index of first character of string
+ end: 13,//index of first character after the end of string
+ src: 'source string'
+}
+```
+
+### parseUntil(src, delimiter, options = {start: 0, includeLineComment: false})
+
+Parses the source until the first occurence of `delimiter` which is not in a string or a comment. If `includeLineComment` is `true`, it will still count if the delimiter occurs in a line comment, but not in a block comment. It returns an object with the structure:
+
+```js
+{
+ start: 0,//index of first character of string
+ end: 13,//index of first character after the end of string
+ src: 'source string'
+}
+```
+
+### parseChar(character, state = defaultState())
+
+Parses the single character and returns the state. See `parse` for the structure of the returned state object. N.B. character must be a single character not a multi character string.
+
+### defaultState()
+
+Get a default starting state.
+
+### isPunctuator(character)
+
+Returns `true` if `character` represents punctuation in JavaScript.
+
+### isKeyword(name)
+
+Returns `true` if `name` is a keyword in JavaScript.
+
+## State
+
+A state is an object with the following structure
+
+```js
+{
+ lineComment: false, //true if inside a line comment
+ blockComment: false, //true if inside a block comment
+
+ singleQuote: false, //true if inside a single quoted string
+ doubleQuote: false, //true if inside a double quoted string
+ regexp: false, //true if inside a regular expression
+ escaped: false, //true if in a string and the last character was an escape character
+
+ roundDepth: 0, //number of un-closed open `(` brackets
+ curlyDepth: 0, //number of un-closed open `{` brackets
+ squareDepth: 0 //number of un-closed open `[` brackets
+}
+```
+
+It also has the following useful methods:
+
+- `.isString()` returns `true` if the current location is inside a string.
+- `.isComment()` returns `true` if the current location is inside a comment.
+- `isNesting()` returns `true` if the current location is anything but at the top level, i.e. with no nesting.
+
+## License
+
+MIT
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/index.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/index.js b/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/index.js
new file mode 100644
index 0000000..271fa28
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/index.js
@@ -0,0 +1,231 @@
+exports = (module.exports = parse);
+exports.parse = parse;
+function parse(src, state, options) {
+ options = options || {};
+ state = state || exports.defaultState();
+ var start = options.start || 0;
+ var end = options.end || src.length;
+ var index = start;
+ while (index < end) {
+ if (state.roundDepth < 0 || state.curlyDepth < 0 || state.squareDepth < 0) {
+ throw new SyntaxError('Mismatched Bracket: ' + src[index - 1]);
+ }
+ exports.parseChar(src[index++], state);
+ }
+ return state;
+}
+
+exports.parseMax = parseMax;
+function parseMax(src, options) {
+ options = options || {};
+ var start = options.start || 0;
+ var index = start;
+ var state = exports.defaultState();
+ while (state.roundDepth >= 0 && state.curlyDepth >= 0 && state.squareDepth >= 0) {
+ if (index >= src.length) {
+ throw new Error('The end of the string was reached with no closing bracket found.');
+ }
+ exports.parseChar(src[index++], state);
+ }
+ var end = index - 1;
+ return {
+ start: start,
+ end: end,
+ src: src.substring(start, end)
+ };
+}
+
+exports.parseUntil = parseUntil;
+function parseUntil(src, delimiter, options) {
+ options = options || {};
+ var includeLineComment = options.includeLineComment || false;
+ var start = options.start || 0;
+ var index = start;
+ var state = exports.defaultState();
+ while (state.isString() || state.regexp || state.blockComment ||
+ (!includeLineComment && state.lineComment) || !startsWith(src, delimiter, index)) {
+ exports.parseChar(src[index++], state);
+ }
+ var end = index;
+ return {
+ start: start,
+ end: end,
+ src: src.substring(start, end)
+ };
+}
+
+
+exports.parseChar = parseChar;
+function parseChar(character, state) {
+ if (character.length !== 1) throw new Error('Character must be a string of length 1');
+ state = state || exports.defaultState();
+ state.src = state.src || '';
+ state.src += character;
+ var wasComment = state.blockComment || state.lineComment;
+ var lastChar = state.history ? state.history[0] : '';
+
+ if (state.regexpStart) {
+ if (character === '/' || character == '*') {
+ state.regexp = false;
+ }
+ state.regexpStart = false;
+ }
+ if (state.lineComment) {
+ if (character === '\n') {
+ state.lineComment = false;
+ }
+ } else if (state.blockComment) {
+ if (state.lastChar === '*' && character === '/') {
+ state.blockComment = false;
+ }
+ } else if (state.singleQuote) {
+ if (character === '\'' && !state.escaped) {
+ state.singleQuote = false;
+ } else if (character === '\\' && !state.escaped) {
+ state.escaped = true;
+ } else {
+ state.escaped = false;
+ }
+ } else if (state.doubleQuote) {
+ if (character === '"' && !state.escaped) {
+ state.doubleQuote = false;
+ } else if (character === '\\' && !state.escaped) {
+ state.escaped = true;
+ } else {
+ state.escaped = false;
+ }
+ } else if (state.regexp) {
+ if (character === '/' && !state.escaped) {
+ state.regexp = false;
+ } else if (character === '\\' && !state.escaped) {
+ state.escaped = true;
+ } else {
+ state.escaped = false;
+ }
+ } else if (lastChar === '/' && character === '/') {
+ state.history = state.history.substr(1);
+ state.lineComment = true;
+ } else if (lastChar === '/' && character === '*') {
+ state.history = state.history.substr(1);
+ state.blockComment = true;
+ } else if (character === '/' && isRegexp(state.history)) {
+ state.regexp = true;
+ state.regexpStart = true;
+ } else if (character === '\'') {
+ state.singleQuote = true;
+ } else if (character === '"') {
+ state.doubleQuote = true;
+ } else if (character === '(') {
+ state.roundDepth++;
+ } else if (character === ')') {
+ state.roundDepth--;
+ } else if (character === '{') {
+ state.curlyDepth++;
+ } else if (character === '}') {
+ state.curlyDepth--;
+ } else if (character === '[') {
+ state.squareDepth++;
+ } else if (character === ']') {
+ state.squareDepth--;
+ }
+ if (!state.blockComment && !state.lineComment && !wasComment) state.history = character + state.history;
+ state.lastChar = character; // store last character for ending block comments
+ return state;
+}
+
+exports.defaultState = function () { return new State() };
+function State() {
+ this.lineComment = false;
+ this.blockComment = false;
+
+ this.singleQuote = false;
+ this.doubleQuote = false;
+ this.regexp = false;
+
+ this.escaped = false;
+
+ this.roundDepth = 0;
+ this.curlyDepth = 0;
+ this.squareDepth = 0;
+
+ this.history = ''
+ this.lastChar = ''
+}
+State.prototype.isString = function () {
+ return this.singleQuote || this.doubleQuote;
+}
+State.prototype.isComment = function () {
+ return this.lineComment || this.blockComment;
+}
+State.prototype.isNesting = function () {
+ return this.isString() || this.isComment() || this.regexp || this.roundDepth > 0 || this.curlyDepth > 0 || this.squareDepth > 0
+}
+
+function startsWith(str, start, i) {
+ return str.substr(i || 0, start.length) === start;
+}
+
+exports.isPunctuator = isPunctuator
+function isPunctuator(c) {
+ if (!c) return true; // the start of a string is a punctuator
+ var code = c.charCodeAt(0)
+
+ switch (code) {
+ case 46: // . dot
+ case 40: // ( open bracket
+ case 41: // ) close bracket
+ case 59: // ; semicolon
+ case 44: // , comma
+ case 123: // { open curly brace
+ case 125: // } close curly brace
+ case 91: // [
+ case 93: // ]
+ case 58: // :
+ case 63: // ?
+ case 126: // ~
+ case 37: // %
+ case 38: // &
+ case 42: // *:
+ case 43: // +
+ case 45: // -
+ case 47: // /
+ case 60: // <
+ case 62: // >
+ case 94: // ^
+ case 124: // |
+ case 33: // !
+ case 61: // =
+ return true;
+ default:
+ return false;
+ }
+}
+exports.isKeyword = isKeyword
+function isKeyword(id) {
+ return (id === 'if') || (id === 'in') || (id === 'do') || (id === 'var') || (id === 'for') || (id === 'new') ||
+ (id === 'try') || (id === 'let') || (id === 'this') || (id === 'else') || (id === 'case') ||
+ (id === 'void') || (id === 'with') || (id === 'enum') || (id === 'while') || (id === 'break') || (id === 'catch') ||
+ (id === 'throw') || (id === 'const') || (id === 'yield') || (id === 'class') || (id === 'super') ||
+ (id === 'return') || (id === 'typeof') || (id === 'delete') || (id === 'switch') || (id === 'export') ||
+ (id === 'import') || (id === 'default') || (id === 'finally') || (id === 'extends') || (id === 'function') ||
+ (id === 'continue') || (id === 'debugger') || (id === 'package') || (id === 'private') || (id === 'interface') ||
+ (id === 'instanceof') || (id === 'implements') || (id === 'protected') || (id === 'public') || (id === 'static') ||
+ (id === 'yield') || (id === 'let');
+}
+
+function isRegexp(history) {
+ //could be start of regexp or divide sign
+
+ history = history.replace(/^\s*/, '');
+
+ //unless its an `if`, `while`, `for` or `with` it's a divide, so we assume it's a divide
+ if (history[0] === ')') return false;
+ //unless it's a function expression, it's a regexp, so we assume it's a regexp
+ if (history[0] === '}') return true;
+ //any punctuation means it's a regexp
+ if (isPunctuator(history[0])) return true;
+ //if the last thing was a keyword then it must be a regexp (e.g. `typeof /foo/`)
+ if (/^\w+\b/.test(history) && isKeyword(/^\w+\b/.exec(history)[0].split('').reverse().join(''))) return true;
+
+ return false;
+}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/package.json
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/package.json b/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/package.json
new file mode 100644
index 0000000..cd28fcf
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/node_modules/character-parser/package.json
@@ -0,0 +1,55 @@
+{
+ "name": "character-parser",
+ "version": "1.2.1",
+ "description": "Parse JavaScript one character at a time to look for snippets in Templates. This is not a validator, it's just designed to allow you to have sections of JavaScript delimited by brackets robustly.",
+ "main": "index.js",
+ "scripts": {
+ "test": "mocha -R spec"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/ForbesLindesay/character-parser.git"
+ },
+ "keywords": [
+ "parser",
+ "JavaScript",
+ "bracket",
+ "nesting",
+ "comment",
+ "string",
+ "escape",
+ "escaping"
+ ],
+ "author": {
+ "name": "ForbesLindesay"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "better-assert": "~1.0.0",
+ "mocha": "~1.9.0"
+ },
+ "bugs": {
+ "url": "https://github.com/ForbesLindesay/character-parser/issues"
+ },
+ "homepage": "https://github.com/ForbesLindesay/character-parser",
+ "_id": "character-parser@1.2.1",
+ "dist": {
+ "shasum": "c0dde4ab182713b919b970959a123ecc1a30fcd6",
+ "tarball": "http://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz"
+ },
+ "_from": "character-parser@1.2.1",
+ "_npmVersion": "1.4.3",
+ "_npmUser": {
+ "name": "forbeslindesay",
+ "email": "forbes@lindeay.co.uk"
+ },
+ "maintainers": [
+ {
+ "name": "forbeslindesay",
+ "email": "forbes@lindesay.co.uk"
+ }
+ ],
+ "directories": {},
+ "_shasum": "c0dde4ab182713b919b970959a123ecc1a30fcd6",
+ "_resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz"
+}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/History.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/History.md b/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/History.md
new file mode 100644
index 0000000..c927f4b
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/History.md
@@ -0,0 +1,222 @@
+2.6.0 / 2014-12-30
+==================
+
+ * added `Command#allowUnknownOption` method. Close #138 #318 @doozr @zhiyelee
+ * Add application description to the help msg. Close #112 @dalssoft
+
+2.5.1 / 2014-12-15
+==================
+
+ * fixed two bugs incurred by variadic arguments. Close #291 @Quentin01 #302 @zhiyelee
+
+2.5.0 / 2014-10-24
+==================
+
+ * add support for variadic arguments. Closes #277 @whitlockjc
+
+2.4.0 / 2014-10-17
+==================
+
+ * fixed a bug on executing the coercion function of subcommands option. Closes #270
+ * added `Command.prototype.name` to retrieve command name. Closes #264 #266 @tonylukasavage
+ * added `Command.prototype.opts` to retrieve all the options as a simple object of key-value pairs. Closes #262 @tonylukasavage
+ * fixed a bug on subcommand name. Closes #248 @jonathandelgado
+ * fixed function normalize doesn’t honor option terminator. Closes #216 @abbr
+
+2.3.0 / 2014-07-16
+==================
+
+ * add command alias'. Closes PR #210
+ * fix: Typos. Closes #99
+ * fix: Unused fs module. Closes #217
+
+2.2.0 / 2014-03-29
+==================
+
+ * add passing of previous option value
+ * fix: support subcommands on windows. Closes #142
+ * Now the defaultValue passed as the second argument of the coercion function.
+
+2.1.0 / 2013-11-21
+==================
+
+ * add: allow cflag style option params, unit test, fixes #174
+
+2.0.0 / 2013-07-18
+==================
+
+ * remove input methods (.prompt, .confirm, etc)
+
+1.3.2 / 2013-07-18
+==================
+
+ * add support for sub-commands to co-exist with the original command
+
+1.3.1 / 2013-07-18
+==================
+
+ * add quick .runningCommand hack so you can opt-out of other logic when running a sub command
+
+1.3.0 / 2013-07-09
+==================
+
+ * add EACCES error handling
+ * fix sub-command --help
+
+1.2.0 / 2013-06-13
+==================
+
+ * allow "-" hyphen as an option argument
+ * support for RegExp coercion
+
+1.1.1 / 2012-11-20
+==================
+
+ * add more sub-command padding
+ * fix .usage() when args are present. Closes #106
+
+1.1.0 / 2012-11-16
+==================
+
+ * add git-style executable subcommand support. Closes #94
+
+1.0.5 / 2012-10-09
+==================
+
+ * fix `--name` clobbering. Closes #92
+ * fix examples/help. Closes #89
+
+1.0.4 / 2012-09-03
+==================
+
+ * add `outputHelp()` method.
+
+1.0.3 / 2012-08-30
+==================
+
+ * remove invalid .version() defaulting
+
+1.0.2 / 2012-08-24
+==================
+
+ * add `--foo=bar` support [arv]
+ * fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus]
+
+1.0.1 / 2012-08-03
+==================
+
+ * fix issue #56
+ * fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode())
+
+1.0.0 / 2012-07-05
+==================
+
+ * add support for optional option descriptions
+ * add defaulting of `.version()` to package.json's version
+
+0.6.1 / 2012-06-01
+==================
+
+ * Added: append (yes or no) on confirmation
+ * Added: allow node.js v0.7.x
+
+0.6.0 / 2012-04-10
+==================
+
+ * Added `.prompt(obj, callback)` support. Closes #49
+ * Added default support to .choose(). Closes #41
+ * Fixed the choice example
+
+0.5.1 / 2011-12-20
+==================
+
+ * Fixed `password()` for recent nodes. Closes #36
+
+0.5.0 / 2011-12-04
+==================
+
+ * Added sub-command option support [itay]
+
+0.4.3 / 2011-12-04
+==================
+
+ * Fixed custom help ordering. Closes #32
+
+0.4.2 / 2011-11-24
+==================
+
+ * Added travis support
+ * Fixed: line-buffered input automatically trimmed. Closes #31
+
+0.4.1 / 2011-11-18
+==================
+
+ * Removed listening for "close" on --help
+
+0.4.0 / 2011-11-15
+==================
+
+ * Added support for `--`. Closes #24
+
+0.3.3 / 2011-11-14
+==================
+
+ * Fixed: wait for close event when writing help info [Jerry Hamlet]
+
+0.3.2 / 2011-11-01
+==================
+
+ * Fixed long flag definitions with values [felixge]
+
+0.3.1 / 2011-10-31
+==================
+
+ * Changed `--version` short flag to `-V` from `-v`
+ * Changed `.version()` so it's configurable [felixge]
+
+0.3.0 / 2011-10-31
+==================
+
+ * Added support for long flags only. Closes #18
+
+0.2.1 / 2011-10-24
+==================
+
+ * "node": ">= 0.4.x < 0.7.0". Closes #20
+
+0.2.0 / 2011-09-26
+==================
+
+ * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]
+
+0.1.0 / 2011-08-24
+==================
+
+ * Added support for custom `--help` output
+
+0.0.5 / 2011-08-18
+==================
+
+ * Changed: when the user enters nothing prompt for password again
+ * Fixed issue with passwords beginning with numbers [NuckChorris]
+
+0.0.4 / 2011-08-15
+==================
+
+ * Fixed `Commander#args`
+
+0.0.3 / 2011-08-15
+==================
+
+ * Added default option value support
+
+0.0.2 / 2011-08-15
+==================
+
+ * Added mask support to `Command#password(str[, mask], fn)`
+ * Added `Command#password(str, fn)`
+
+0.0.1 / 2010-01-03
+==================
+
+ * Initial release
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/Readme.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/Readme.md b/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/Readme.md
new file mode 100644
index 0000000..677bfc4
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/Readme.md
@@ -0,0 +1,300 @@
+# Commander.js
+
+ [![Build Status](https://api.travis-ci.org/tj/commander.js.svg)](http://travis-ci.org/tj/commander.js)
+[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander)
+[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://www.npmjs.org/package/commander)
+
+ The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/tj/commander).
+ [API documentation](http://tj.github.com/commander.js/)
+
+
+## Installation
+
+ $ npm install commander
+
+## Option parsing
+
+ Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
+
+```js
+#!/usr/bin/env node
+
+/**
+ * Module dependencies.
+ */
+
+var program = require('commander');
+
+program
+ .version('0.0.1')
+ .option('-p, --peppers', 'Add peppers')
+ .option('-P, --pineapple', 'Add pineapple')
+ .option('-b, --bbq', 'Add bbq sauce')
+ .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
+ .parse(process.argv);
+
+console.log('you ordered a pizza with:');
+if (program.peppers) console.log(' - peppers');
+if (program.pineapple) console.log(' - pineapple');
+if (program.bbq) console.log(' - bbq');
+console.log(' - %s cheese', program.cheese);
+```
+
+ Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
+
+
+## Coercion
+
+```js
+function range(val) {
+ return val.split('..').map(Number);
+}
+
+function list(val) {
+ return val.split(',');
+}
+
+function collect(val, memo) {
+ memo.push(val);
+ return memo;
+}
+
+function increaseVerbosity(v, total) {
+ return total + 1;
+}
+
+program
+ .version('0.0.1')
+ .usage('[options] <file ...>')
+ .option('-i, --integer <n>', 'An integer argument', parseInt)
+ .option('-f, --float <n>', 'A float argument', parseFloat)
+ .option('-r, --range <a>..<b>', 'A range', range)
+ .option('-l, --list <items>', 'A list', list)
+ .option('-o, --optional [value]', 'An optional value')
+ .option('-c, --collect [value]', 'A repeatable value', collect, [])
+ .option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0)
+ .parse(process.argv);
+
+console.log(' int: %j', program.integer);
+console.log(' float: %j', program.float);
+console.log(' optional: %j', program.optional);
+program.range = program.range || [];
+console.log(' range: %j..%j', program.range[0], program.range[1]);
+console.log(' list: %j', program.list);
+console.log(' collect: %j', program.collect);
+console.log(' verbosity: %j', program.verbose);
+console.log(' args: %j', program.args);
+```
+
+## Variadic arguments
+
+ The last argument of a command can be variadic, and only the last argument. To make an argument variadic you have to
+ append `...` to the argument name. Here is an example:
+
+```js
+#!/usr/bin/env node
+
+/**
+ * Module dependencies.
+ */
+
+var program = require('commander');
+
+program
+ .version('0.0.1')
+ .command('rmdir <dir> [otherDirs...]')
+ .action(function (dir, otherDirs) {
+ console.log('rmdir %s', dir);
+ if (otherDirs) {
+ otherDirs.forEach(function (oDir) {
+ console.log('rmdir %s', oDir);
+ });
+ }
+ });
+
+program.parse(process.argv);
+```
+
+ An `Array` is used for the value of a variadic argument. This applies to `program.args` as well as the argument passed
+ to your action as demonstrated above.
+
+## Git-style sub-commands
+
+```js
+// file: ./examples/pm
+var program = require('..');
+
+program
+ .version('0.0.1')
+ .command('install [name]', 'install one or more packages')
+ .command('search [query]', 'search with optional query')
+ .command('list', 'list packages installed')
+ .parse(process.argv);
+```
+
+When `.command()` is invoked with a description argument, no `.action(callback)` should be called to handle sub-commands, otherwise there will be an error. This tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools.
+The commander will try to find the executable script in __current directory__ with the name `scriptBasename-subcommand`, like `pm-install`, `pm-search`.
+
+## Automated --help
+
+ The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:
+
+```
+ $ ./examples/pizza --help
+
+ Usage: pizza [options]
+
+ An application for pizzas ordering
+
+ Options:
+
+ -h, --help output usage information
+ -V, --version output the version number
+ -p, --peppers Add peppers
+ -P, --pineapple Add pineapple
+ -b, --bbq Add bbq sauce
+ -c, --cheese <type> Add the specified type of cheese [marble]
+ -C, --no-cheese You do not want any cheese
+
+```
+
+## Custom help
+
+ You can display arbitrary `-h, --help` information
+ by listening for "--help". Commander will automatically
+ exit once you are done so that the remainder of your program
+ does not execute causing undesired behaviours, for example
+ in the following executable "stuff" will not output when
+ `--help` is used.
+
+```js
+#!/usr/bin/env node
+
+/**
+ * Module dependencies.
+ */
+
+var program = require('commander');
+
+program
+ .version('0.0.1')
+ .option('-f, --foo', 'enable some foo')
+ .option('-b, --bar', 'enable some bar')
+ .option('-B, --baz', 'enable some baz');
+
+// must be before .parse() since
+// node's emit() is immediate
+
+program.on('--help', function(){
+ console.log(' Examples:');
+ console.log('');
+ console.log(' $ custom-help --help');
+ console.log(' $ custom-help -h');
+ console.log('');
+});
+
+program.parse(process.argv);
+
+console.log('stuff');
+```
+
+Yields the following help output when `node script-name.js -h` or `node script-name.js --help` are run:
+
+```
+
+Usage: custom-help [options]
+
+Options:
+
+ -h, --help output usage information
+ -V, --version output the version number
+ -f, --foo enable some foo
+ -b, --bar enable some bar
+ -B, --baz enable some baz
+
+Examples:
+
+ $ custom-help --help
+ $ custom-help -h
+
+```
+
+## .outputHelp()
+
+ Output help information without exiting.
+
+## .help()
+
+ Output help information and exit immediately.
+
+## Examples
+
+```js
+var program = require('commander');
+
+program
+ .version('0.0.1')
+ .option('-C, --chdir <path>', 'change the working directory')
+ .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
+ .option('-T, --no-tests', 'ignore test hook')
+
+program
+ .command('setup [env]')
+ .description('run setup commands for all envs')
+ .option("-s, --setup_mode [mode]", "Which setup mode to use")
+ .action(function(env, options){
+ var mode = options.setup_mode || "normal";
+ env = env || 'all';
+ console.log('setup for %s env(s) with %s mode', env, mode);
+ });
+
+program
+ .command('exec <cmd>')
+ .alias('ex')
+ .description('execute the given remote cmd')
+ .option("-e, --exec_mode <mode>", "Which exec mode to use")
+ .action(function(cmd, options){
+ console.log('exec "%s" using %s mode', cmd, options.exec_mode);
+ }).on('--help', function() {
+ console.log(' Examples:');
+ console.log();
+ console.log(' $ deploy exec sequential');
+ console.log(' $ deploy exec async');
+ console.log();
+ });
+
+program
+ .command('*')
+ .action(function(env){
+ console.log('deploying "%s"', env);
+ });
+
+program.parse(process.argv);
+```
+
+You can see more Demos in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory.
+
+## License
+
+(The MIT License)
+
+Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
+
+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.
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/index.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/index.js b/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/index.js
new file mode 100644
index 0000000..e0299d5
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/index.js
@@ -0,0 +1,1020 @@
+
+/**
+ * Module dependencies.
+ */
+
+var EventEmitter = require('events').EventEmitter;
+var spawn = require('child_process').spawn;
+var path = require('path');
+var dirname = path.dirname;
+var basename = path.basename;
+
+/**
+ * Expose the root command.
+ */
+
+exports = module.exports = new Command();
+
+/**
+ * Expose `Command`.
+ */
+
+exports.Command = Command;
+
+/**
+ * Expose `Option`.
+ */
+
+exports.Option = Option;
+
+/**
+ * Initialize a new `Option` with the given `flags` and `description`.
+ *
+ * @param {String} flags
+ * @param {String} description
+ * @api public
+ */
+
+function Option(flags, description) {
+ this.flags = flags;
+ this.required = ~flags.indexOf('<');
+ this.optional = ~flags.indexOf('[');
+ this.bool = !~flags.indexOf('-no-');
+ flags = flags.split(/[ ,|]+/);
+ if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
+ this.long = flags.shift();
+ this.description = description || '';
+}
+
+/**
+ * Return option name.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Option.prototype.name = function() {
+ return this.long
+ .replace('--', '')
+ .replace('no-', '');
+};
+
+/**
+ * Check if `arg` matches the short or long flag.
+ *
+ * @param {String} arg
+ * @return {Boolean}
+ * @api private
+ */
+
+Option.prototype.is = function(arg) {
+ return arg == this.short || arg == this.long;
+};
+
+/**
+ * Initialize a new `Command`.
+ *
+ * @param {String} name
+ * @api public
+ */
+
+function Command(name) {
+ this.commands = [];
+ this.options = [];
+ this._execs = [];
+ this._allowUnknownOption = false;
+ this._args = [];
+ this._name = name;
+}
+
+/**
+ * Inherit from `EventEmitter.prototype`.
+ */
+
+Command.prototype.__proto__ = EventEmitter.prototype;
+
+/**
+ * Add command `name`.
+ *
+ * The `.action()` callback is invoked when the
+ * command `name` is specified via __ARGV__,
+ * and the remaining arguments are applied to the
+ * function for access.
+ *
+ * When the `name` is "*" an un-matched command
+ * will be passed as the first arg, followed by
+ * the rest of __ARGV__ remaining.
+ *
+ * Examples:
+ *
+ * program
+ * .version('0.0.1')
+ * .option('-C, --chdir <path>', 'change the working directory')
+ * .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
+ * .option('-T, --no-tests', 'ignore test hook')
+ *
+ * program
+ * .command('setup')
+ * .description('run remote setup commands')
+ * .action(function() {
+ * console.log('setup');
+ * });
+ *
+ * program
+ * .command('exec <cmd>')
+ * .description('run the given remote command')
+ * .action(function(cmd) {
+ * console.log('exec "%s"', cmd);
+ * });
+ *
+ * program
+ * .command('teardown <dir> [otherDirs...]')
+ * .description('run teardown commands')
+ * .action(function(dir, otherDirs) {
+ * console.log('dir "%s"', dir);
+ * if (otherDirs) {
+ * otherDirs.forEach(function (oDir) {
+ * console.log('dir "%s"', oDir);
+ * });
+ * }
+ * });
+ *
+ * program
+ * .command('*')
+ * .description('deploy the given env')
+ * .action(function(env) {
+ * console.log('deploying "%s"', env);
+ * });
+ *
+ * program.parse(process.argv);
+ *
+ * @param {String} name
+ * @param {String} [desc] for git-style sub-commands
+ * @return {Command} the new command
+ * @api public
+ */
+
+Command.prototype.command = function(name, desc) {
+ var args = name.split(/ +/);
+ var cmd = new Command(args.shift());
+
+ if (desc) {
+ cmd.description(desc);
+ this.executables = true;
+ this._execs[cmd._name] = true;
+ }
+
+ this.commands.push(cmd);
+ cmd.parseExpectedArgs(args);
+ cmd.parent = this;
+
+ if (desc) return this;
+ return cmd;
+};
+
+/**
+ * Add an implicit `help [cmd]` subcommand
+ * which invokes `--help` for the given command.
+ *
+ * @api private
+ */
+
+Command.prototype.addImplicitHelpCommand = function() {
+ this.command('help [cmd]', 'display help for [cmd]');
+};
+
+/**
+ * Parse expected `args`.
+ *
+ * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
+ *
+ * @param {Array} args
+ * @return {Command} for chaining
+ * @api public
+ */
+
+Command.prototype.parseExpectedArgs = function(args) {
+ if (!args.length) return;
+ var self = this;
+ args.forEach(function(arg) {
+ var argDetails = {
+ required: false,
+ name: '',
+ variadic: false
+ };
+
+ switch (arg[0]) {
+ case '<':
+ argDetails.required = true;
+ argDetails.name = arg.slice(1, -1);
+ break;
+ case '[':
+ argDetails.name = arg.slice(1, -1);
+ break;
+ }
+
+ if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') {
+ argDetails.variadic = true;
+ argDetails.name = argDetails.name.slice(0, -3);
+ }
+ if (argDetails.name) {
+ self._args.push(argDetails);
+ }
+ });
+ return this;
+};
+
+/**
+ * Register callback `fn` for the command.
+ *
+ * Examples:
+ *
+ * program
+ * .command('help')
+ * .description('display verbose help')
+ * .action(function() {
+ * // output help here
+ * });
+ *
+ * @param {Function} fn
+ * @return {Command} for chaining
+ * @api public
+ */
+
+Command.prototype.action = function(fn) {
+ var self = this;
+ var listener = function(args, unknown) {
+ // Parse any so-far unknown options
+ args = args || [];
+ unknown = unknown || [];
+
+ var parsed = self.parseOptions(unknown);
+
+ // Output help if necessary
+ outputHelpIfNecessary(self, parsed.unknown);
+
+ // If there are still any unknown options, then we simply
+ // die, unless someone asked for help, in which case we give it
+ // to them, and then we die.
+ if (parsed.unknown.length > 0) {
+ self.unknownOption(parsed.unknown[0]);
+ }
+
+ // Leftover arguments need to be pushed back. Fixes issue #56
+ if (parsed.args.length) args = parsed.args.concat(args);
+
+ self._args.forEach(function(arg, i) {
+ if (arg.required && null == args[i]) {
+ self.missingArgument(arg.name);
+ } else if (arg.variadic) {
+ if (i !== self._args.length - 1) {
+ self.variadicArgNotLast(arg.name);
+ }
+
+ args[i] = args.splice(i);
+ }
+ });
+
+ // Always append ourselves to the end of the arguments,
+ // to make sure we match the number of arguments the user
+ // expects
+ if (self._args.length) {
+ args[self._args.length] = self;
+ } else {
+ args.push(self);
+ }
+
+ fn.apply(self, args);
+ };
+ this.parent.on(this._name, listener);
+ if (this._alias) this.parent.on(this._alias, listener);
+ return this;
+};
+
+/**
+ * Define option with `flags`, `description` and optional
+ * coercion `fn`.
+ *
+ * The `flags` string should contain both the short and long flags,
+ * separated by comma, a pipe or space. The following are all valid
+ * all will output this way when `--help` is used.
+ *
+ * "-p, --pepper"
+ * "-p|--pepper"
+ * "-p --pepper"
+ *
+ * Examples:
+ *
+ * // simple boolean defaulting to false
+ * program.option('-p, --pepper', 'add pepper');
+ *
+ * --pepper
+ * program.pepper
+ * // => Boolean
+ *
+ * // simple boolean defaulting to true
+ * program.option('-C, --no-cheese', 'remove cheese');
+ *
+ * program.cheese
+ * // => true
+ *
+ * --no-cheese
+ * program.cheese
+ * // => false
+ *
+ * // required argument
+ * program.option('-C, --chdir <path>', 'change the working directory');
+ *
+ * --chdir /tmp
+ * program.chdir
+ * // => "/tmp"
+ *
+ * // optional argument
+ * program.option('-c, --cheese [type]', 'add cheese [marble]');
+ *
+ * @param {String} flags
+ * @param {String} description
+ * @param {Function|Mixed} fn or default
+ * @param {Mixed} defaultValue
+ * @return {Command} for chaining
+ * @api public
+ */
+
+Command.prototype.option = function(flags, description, fn, defaultValue) {
+ var self = this
+ , option = new Option(flags, description)
+ , oname = option.name()
+ , name = camelcase(oname);
+
+ // default as 3rd arg
+ if (typeof fn != 'function') {
+ defaultValue = fn;
+ fn = null;
+ }
+
+ // preassign default value only for --no-*, [optional], or <required>
+ if (false == option.bool || option.optional || option.required) {
+ // when --no-* we make sure default is true
+ if (false == option.bool) defaultValue = true;
+ // preassign only if we have a default
+ if (undefined !== defaultValue) self[name] = defaultValue;
+ }
+
+ // register the option
+ this.options.push(option);
+
+ // when it's passed assign the value
+ // and conditionally invoke the callback
+ this.on(oname, function(val) {
+ // coercion
+ if (null !== val && fn) val = fn(val, undefined === self[name]
+ ? defaultValue
+ : self[name]);
+
+ // unassigned or bool
+ if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) {
+ // if no value, bool true, and we have a default, then use it!
+ if (null == val) {
+ self[name] = option.bool
+ ? defaultValue || true
+ : false;
+ } else {
+ self[name] = val;
+ }
+ } else if (null !== val) {
+ // reassign
+ self[name] = val;
+ }
+ });
+
+ return this;
+};
+
+/**
+ * Allow unknown options on the command line.
+ *
+ * @param {Boolean} arg if `true` or omitted, no error will be thrown
+ * for unknown options.
+ * @api public
+ */
+Command.prototype.allowUnknownOption = function(arg) {
+ this._allowUnknownOption = arguments.length === 0 || arg;
+ return this;
+};
+
+/**
+ * Parse `argv`, settings options and invoking commands when defined.
+ *
+ * @param {Array} argv
+ * @return {Command} for chaining
+ * @api public
+ */
+
+Command.prototype.parse = function(argv) {
+ // implicit help
+ if (this.executables) this.addImplicitHelpCommand();
+
+ // store raw args
+ this.rawArgs = argv;
+
+ // guess name
+ this._name = this._name || basename(argv[1], '.js');
+
+ // process argv
+ var parsed = this.parseOptions(this.normalize(argv.slice(2)));
+ var args = this.args = parsed.args;
+
+ var result = this.parseArgs(this.args, parsed.unknown);
+
+ // executable sub-commands
+ var name = result.args[0];
+ if (this._execs[name] && typeof this._execs[name] != "function") {
+ return this.executeSubCommand(argv, args, parsed.unknown);
+ }
+
+ return result;
+};
+
+/**
+ * Execute a sub-command executable.
+ *
+ * @param {Array} argv
+ * @param {Array} args
+ * @param {Array} unknown
+ * @api private
+ */
+
+Command.prototype.executeSubCommand = function(argv, args, unknown) {
+ args = args.concat(unknown);
+
+ if (!args.length) this.help();
+ if ('help' == args[0] && 1 == args.length) this.help();
+
+ // <cmd> --help
+ if ('help' == args[0]) {
+ args[0] = args[1];
+ args[1] = '--help';
+ }
+
+ // executable
+ var dir = dirname(argv[1]);
+ var bin = basename(argv[1], '.js') + '-' + args[0];
+
+ // check for ./<bin> first
+ var local = path.join(dir, bin);
+
+ // run it
+ args = args.slice(1);
+ args.unshift(local);
+ var proc = spawn('node', args, { stdio: 'inherit', customFds: [0, 1, 2] });
+ proc.on('error', function(err) {
+ if (err.code == "ENOENT") {
+ console.error('\n %s(1) does not exist, try --help\n', bin);
+ } else if (err.code == "EACCES") {
+ console.error('\n %s(1) not executable. try chmod or run with root\n', bin);
+ }
+ });
+
+ this.runningCommand = proc;
+};
+
+/**
+ * Normalize `args`, splitting joined short flags. For example
+ * the arg "-abc" is equivalent to "-a -b -c".
+ * This also normalizes equal sign and splits "--abc=def" into "--abc def".
+ *
+ * @param {Array} args
+ * @return {Array}
+ * @api private
+ */
+
+Command.prototype.normalize = function(args) {
+ var ret = []
+ , arg
+ , lastOpt
+ , index;
+
+ for (var i = 0, len = args.length; i < len; ++i) {
+ arg = args[i];
+ if (i > 0) {
+ lastOpt = this.optionFor(args[i-1]);
+ }
+
+ if (arg === '--') {
+ // Honor option terminator
+ ret = ret.concat(args.slice(i));
+ break;
+ } else if (lastOpt && lastOpt.required) {
+ ret.push(arg);
+ } else if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) {
+ arg.slice(1).split('').forEach(function(c) {
+ ret.push('-' + c);
+ });
+ } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {
+ ret.push(arg.slice(0, index), arg.slice(index + 1));
+ } else {
+ ret.push(arg);
+ }
+ }
+
+ return ret;
+};
+
+/**
+ * Parse command `args`.
+ *
+ * When listener(s) are available those
+ * callbacks are invoked, otherwise the "*"
+ * event is emitted and those actions are invoked.
+ *
+ * @param {Array} args
+ * @return {Command} for chaining
+ * @api private
+ */
+
+Command.prototype.parseArgs = function(args, unknown) {
+ var name;
+
+ if (args.length) {
+ name = args[0];
+ if (this.listeners(name).length) {
+ this.emit(args.shift(), args, unknown);
+ } else {
+ this.emit('*', args);
+ }
+ } else {
+ outputHelpIfNecessary(this, unknown);
+
+ // If there were no args and we have unknown options,
+ // then they are extraneous and we need to error.
+ if (unknown.length > 0) {
+ this.unknownOption(unknown[0]);
+ }
+ }
+
+ return this;
+};
+
+/**
+ * Return an option matching `arg` if any.
+ *
+ * @param {String} arg
+ * @return {Option}
+ * @api private
+ */
+
+Command.prototype.optionFor = function(arg) {
+ for (var i = 0, len = this.options.length; i < len; ++i) {
+ if (this.options[i].is(arg)) {
+ return this.options[i];
+ }
+ }
+};
+
+/**
+ * Parse options from `argv` returning `argv`
+ * void of these options.
+ *
+ * @param {Array} argv
+ * @return {Array}
+ * @api public
+ */
+
+Command.prototype.parseOptions = function(argv) {
+ var args = []
+ , len = argv.length
+ , literal
+ , option
+ , arg;
+
+ var unknownOptions = [];
+
+ // parse options
+ for (var i = 0; i < len; ++i) {
+ arg = argv[i];
+
+ // literal args after --
+ if ('--' == arg) {
+ literal = true;
+ continue;
+ }
+
+ if (literal) {
+ args.push(arg);
+ continue;
+ }
+
+ // find matching Option
+ option = this.optionFor(arg);
+
+ // option is defined
+ if (option) {
+ // requires arg
+ if (option.required) {
+ arg = argv[++i];
+ if (null == arg) return this.optionMissingArgument(option);
+ this.emit(option.name(), arg);
+ // optional arg
+ } else if (option.optional) {
+ arg = argv[i+1];
+ if (null == arg || ('-' == arg[0] && '-' != arg)) {
+ arg = null;
+ } else {
+ ++i;
+ }
+ this.emit(option.name(), arg);
+ // bool
+ } else {
+ this.emit(option.name());
+ }
+ continue;
+ }
+
+ // looks like an option
+ if (arg.length > 1 && '-' == arg[0]) {
+ unknownOptions.push(arg);
+
+ // If the next argument looks like it might be
+ // an argument for this option, we pass it on.
+ // If it isn't, then it'll simply be ignored
+ if (argv[i+1] && '-' != argv[i+1][0]) {
+ unknownOptions.push(argv[++i]);
+ }
+ continue;
+ }
+
+ // arg
+ args.push(arg);
+ }
+
+ return { args: args, unknown: unknownOptions };
+};
+
+/**
+ * Return an object containing options as key-value pairs
+ *
+ * @return {Object}
+ * @api public
+ */
+Command.prototype.opts = function() {
+ var result = {}
+ , len = this.options.length;
+
+ for (var i = 0 ; i < len; i++) {
+ var key = this.options[i].name();
+ result[key] = key === 'version' ? this._version : this[key];
+ }
+ return result;
+};
+
+/**
+ * Argument `name` is missing.
+ *
+ * @param {String} name
+ * @api private
+ */
+
+Command.prototype.missingArgument = function(name) {
+ console.error();
+ console.error(" error: missing required argument `%s'", name);
+ console.error();
+ process.exit(1);
+};
+
+/**
+ * `Option` is missing an argument, but received `flag` or nothing.
+ *
+ * @param {String} option
+ * @param {String} flag
+ * @api private
+ */
+
+Command.prototype.optionMissingArgument = function(option, flag) {
+ console.error();
+ if (flag) {
+ console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag);
+ } else {
+ console.error(" error: option `%s' argument missing", option.flags);
+ }
+ console.error();
+ process.exit(1);
+};
+
+/**
+ * Unknown option `flag`.
+ *
+ * @param {String} flag
+ * @api private
+ */
+
+Command.prototype.unknownOption = function(flag) {
+ if(this._allowUnknownOption) return;
+ console.error();
+ console.error(" error: unknown option `%s'", flag);
+ console.error();
+ process.exit(1);
+};
+
+/**
+ * Variadic argument with `name` is not the last argument as required.
+ *
+ * @param {String} name
+ * @api private
+ */
+
+Command.prototype.variadicArgNotLast = function(name) {
+ console.error();
+ console.error(" error: variadic arguments must be last `%s'", name);
+ console.error();
+ process.exit(1);
+};
+
+/**
+ * Set the program version to `str`.
+ *
+ * This method auto-registers the "-V, --version" flag
+ * which will print the version number when passed.
+ *
+ * @param {String} str
+ * @param {String} flags
+ * @return {Command} for chaining
+ * @api public
+ */
+
+Command.prototype.version = function(str, flags) {
+ if (0 == arguments.length) return this._version;
+ this._version = str;
+ flags = flags || '-V, --version';
+ this.option(flags, 'output the version number');
+ this.on('version', function() {
+ process.stdout.write(str + '\n');
+ process.exit(0);
+ });
+ return this;
+};
+
+/**
+ * Set the description to `str`.
+ *
+ * @param {String} str
+ * @return {String|Command}
+ * @api public
+ */
+
+Command.prototype.description = function(str) {
+ if (0 == arguments.length) return this._description;
+ this._description = str;
+ return this;
+};
+
+/**
+ * Set an alias for the command
+ *
+ * @param {String} alias
+ * @return {String|Command}
+ * @api public
+ */
+
+Command.prototype.alias = function(alias) {
+ if (0 == arguments.length) return this._alias;
+ this._alias = alias;
+ return this;
+};
+
+/**
+ * Set / get the command usage `str`.
+ *
+ * @param {String} str
+ * @return {String|Command}
+ * @api public
+ */
+
+Command.prototype.usage = function(str) {
+ var args = this._args.map(function(arg) {
+ return humanReadableArgName(arg);
+ });
+
+ var usage = '[options]'
+ + (this.commands.length ? ' [command]' : '')
+ + (this._args.length ? ' ' + args.join(' ') : '');
+
+ if (0 == arguments.length) return this._usage || usage;
+ this._usage = str;
+
+ return this;
+};
+
+/**
+ * Get the name of the command
+ *
+ * @param {String} name
+ * @return {String|Command}
+ * @api public
+ */
+
+Command.prototype.name = function(name) {
+ return this._name;
+};
+
+/**
+ * Return the largest option length.
+ *
+ * @return {Number}
+ * @api private
+ */
+
+Command.prototype.largestOptionLength = function() {
+ return this.options.reduce(function(max, option) {
+ return Math.max(max, option.flags.length);
+ }, 0);
+};
+
+/**
+ * Return help for options.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Command.prototype.optionHelp = function() {
+ var width = this.largestOptionLength();
+
+ // Prepend the help information
+ return [pad('-h, --help', width) + ' ' + 'output usage information']
+ .concat(this.options.map(function(option) {
+ return pad(option.flags, width) + ' ' + option.description;
+ }))
+ .join('\n');
+};
+
+/**
+ * Return command help documentation.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Command.prototype.commandHelp = function() {
+ if (!this.commands.length) return '';
+
+ var commands = this.commands.map(function(cmd) {
+ var args = cmd._args.map(function(arg) {
+ return humanReadableArgName(arg);
+ }).join(' ');
+
+ return [
+ cmd._name
+ + (cmd._alias
+ ? '|' + cmd._alias
+ : '')
+ + (cmd.options.length
+ ? ' [options]'
+ : '')
+ + ' ' + args
+ , cmd.description()
+ ];
+ });
+
+ var width = commands.reduce(function(max, command) {
+ return Math.max(max, command[0].length);
+ }, 0);
+
+ return [
+ ''
+ , ' Commands:'
+ , ''
+ , commands.map(function(cmd) {
+ return pad(cmd[0], width) + ' ' + cmd[1];
+ }).join('\n').replace(/^/gm, ' ')
+ , ''
+ ].join('\n');
+};
+
+/**
+ * Return program help documentation.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Command.prototype.helpInformation = function() {
+ var desc = [];
+ if (this._description) {
+ desc = [
+ ' ' + this._description
+ , ''
+ ];
+ }
+
+ var cmdName = this._name;
+ if(this._alias) {
+ cmdName = cmdName + '|' + this._alias;
+ }
+ var usage = [
+ ''
+ ,' Usage: ' + cmdName + ' ' + this.usage()
+ , ''
+ ];
+
+ var cmds = [];
+ var commandHelp = this.commandHelp();
+ if (commandHelp) cmds = [commandHelp];
+
+ var options = [
+ ' Options:'
+ , ''
+ , '' + this.optionHelp().replace(/^/gm, ' ')
+ , ''
+ , ''
+ ];
+
+ return usage
+ .concat(cmds)
+ .concat(desc)
+ .concat(options)
+ .join('\n');
+};
+
+/**
+ * Output help information for this command
+ *
+ * @api public
+ */
+
+Command.prototype.outputHelp = function() {
+ process.stdout.write(this.helpInformation());
+ this.emit('--help');
+};
+
+/**
+ * Output help information and exit.
+ *
+ * @api public
+ */
+
+Command.prototype.help = function() {
+ this.outputHelp();
+ process.exit();
+};
+
+/**
+ * Camel-case the given `flag`
+ *
+ * @param {String} flag
+ * @return {String}
+ * @api private
+ */
+
+function camelcase(flag) {
+ return flag.split('-').reduce(function(str, word) {
+ return str + word[0].toUpperCase() + word.slice(1);
+ });
+}
+
+/**
+ * Pad `str` to `width`.
+ *
+ * @param {String} str
+ * @param {Number} width
+ * @return {String}
+ * @api private
+ */
+
+function pad(str, width) {
+ var len = Math.max(0, width - str.length);
+ return str + Array(len + 1).join(' ');
+}
+
+/**
+ * Output help information if necessary
+ *
+ * @param {Command} command to output help for
+ * @param {Array} array of options to search for -h or --help
+ * @api private
+ */
+
+function outputHelpIfNecessary(cmd, options) {
+ options = options || [];
+ for (var i = 0; i < options.length; i++) {
+ if (options[i] == '--help' || options[i] == '-h') {
+ cmd.outputHelp();
+ process.exit(0);
+ }
+ }
+}
+
+/**
+ * Takes an argument an returns its human readable equivalent for help usage.
+ *
+ * @param {Object} arg
+ * @return {String}
+ * @api private
+ */
+
+function humanReadableArgName(arg) {
+ var nameOutput = arg.name + (arg.variadic === true ? '...' : '');
+
+ return arg.required
+ ? '<' + nameOutput + '>'
+ : '[' + nameOutput + ']'
+}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/package.json
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/package.json b/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/package.json
new file mode 100644
index 0000000..160b2c2
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/node_modules/commander/package.json
@@ -0,0 +1,72 @@
+{
+ "name": "commander",
+ "version": "2.6.0",
+ "description": "the complete solution for node.js command-line programs",
+ "keywords": [
+ "command",
+ "option",
+ "parser",
+ "prompt"
+ ],
+ "author": {
+ "name": "TJ Holowaychuk",
+ "email": "tj@vision-media.ca"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/tj/commander.js.git"
+ },
+ "devDependencies": {
+ "should": ">= 0.0.1"
+ },
+ "scripts": {
+ "test": "make test"
+ },
+ "main": "index",
+ "engines": {
+ "node": ">= 0.6.x"
+ },
+ "files": [
+ "index.js"
+ ],
+ "gitHead": "c6807fd154dd3b7ce8756f141f8d3acfcc74be60",
+ "bugs": {
+ "url": "https://github.com/tj/commander.js/issues"
+ },
+ "homepage": "https://github.com/tj/commander.js",
+ "_id": "commander@2.6.0",
+ "_shasum": "9df7e52fb2a0cb0fb89058ee80c3104225f37e1d",
+ "_from": "commander@>=2.6.0 <2.7.0",
+ "_npmVersion": "2.1.12",
+ "_nodeVersion": "0.11.14",
+ "_npmUser": {
+ "name": "zhiyelee",
+ "email": "zhiyelee@gmail.com"
+ },
+ "maintainers": [
+ {
+ "name": "tjholowaychuk",
+ "email": "tj@vision-media.ca"
+ },
+ {
+ "name": "somekittens",
+ "email": "rkoutnik@gmail.com"
+ },
+ {
+ "name": "zhiyelee",
+ "email": "zhiyelee@gmail.com"
+ },
+ {
+ "name": "thethomaseffect",
+ "email": "thethomaseffect@gmail.com"
+ }
+ ],
+ "dist": {
+ "shasum": "9df7e52fb2a0cb0fb89058ee80c3104225f37e1d",
+ "tarball": "http://registry.npmjs.org/commander/-/commander-2.6.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz",
+ "readme": "ERROR: No README data found!"
+}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/jade/node_modules/constantinople/.gitattributes
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/jade/node_modules/constantinople/.gitattributes b/modules/webconfig/nodejs/node_modules/jade/node_modules/constantinople/.gitattributes
new file mode 100644
index 0000000..412eeda
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/jade/node_modules/constantinople/.gitattributes
@@ -0,0 +1,22 @@
+# Auto detect text files and perform LF normalization
+* text=auto
+
+# Custom for Visual Studio
+*.cs diff=csharp
+*.sln merge=union
+*.csproj merge=union
+*.vbproj merge=union
+*.fsproj merge=union
+*.dbproj merge=union
+
+# Standard to msysgit
+*.doc diff=astextplain
+*.DOC diff=astextplain
+*.docx diff=astextplain
+*.DOCX diff=astextplain
+*.dot diff=astextplain
+*.DOT diff=astextplain
+*.pdf diff=astextplain
+*.PDF diff=astextplain
+*.rtf diff=astextplain
+*.RTF diff=astextplain