diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..2fd5c014 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + extends: [ + "lddubeau-base", + ], + env: { + node: true, + }, +}; diff --git a/examples/example.js b/examples/example.js index cf083ef3..a6ba922f 100644 --- a/examples/example.js +++ b/examples/example.js @@ -1,30 +1,42 @@ -var fs = require('fs'), - util = require('util'), - path = require('path'), - xml = fs.readFileSync(path.join(__dirname, 'test.xml'), 'utf8'), - saxes = require('../lib/saxes'), - parser = saxes.parser(), - inspector = function (ev) { return function (data) { - console.error('%s %s %j', this.line + ':' + this.column, ev, data) +"use strict"; + +/* eslint-disable no-console */ + +const fs = require("fs"); +const path = require("path"); +const saxes = require("../lib/saxes"); + +const parser = saxes.parser(); + +function inspector(ev) { + return function handler(data) { + console.error("%s %s %j", `${this.line}:${this.column}`, ev, data); if (ev === "error") { - parser.resume() + parser.resume(); } - }} - -saxes.EVENTS.forEach(function (ev) { - parser['on' + ev] = inspector(ev) -}) -parser.onend = function () { - console.error('end') - console.error(parser) + }; } -// do this in random bits at a time to verify that it works. -(function () { +saxes.EVENTS.forEach((ev) => { + parser[`on${ev}`] = inspector(ev); +}); + +parser.onend = () => { + console.error("end"); + console.error(parser); +}; + +let xml = fs.readFileSync(path.join(__dirname, "test.xml"), "utf8"); +function processChunk() { if (xml) { - var c = Math.ceil(Math.random() * 1000) - parser.write(xml.substr(0, c)) - xml = xml.substr(c) - process.nextTick(arguments.callee) - } else parser.close() -}()) + const c = Math.ceil(Math.random() * 1000); + parser.write(xml.substr(0, c)); + xml = xml.substr(c); + process.nextTick(processChunk); + } + else { + parser.close(); + } +} + +processChunk(); diff --git a/lib/.eslintrc.js b/lib/.eslintrc.js new file mode 100644 index 00000000..6d551cc1 --- /dev/null +++ b/lib/.eslintrc.js @@ -0,0 +1,6 @@ +module.exports = { + extends: "../.eslintrc.js", + rules: { + "no-continue": "off", + }, +} diff --git a/lib/saxes.js b/lib/saxes.js index 610eb26e..9abef85f 100644 --- a/lib/saxes.js +++ b/lib/saxes.js @@ -1,1230 +1,1218 @@ -;(function (sax) { // wrapper for non-node envs - sax.parser = function (opt) { return new SAXParser(opt) } - sax.SAXParser = SAXParser - sax.SAXStream = SAXStream - sax.createStream = createStream - - // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. - // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), - // since that's the earliest that a buffer overrun could occur. This way, checks are - // as rare as required, but as often as necessary to ensure never crossing this bound. - // Furthermore, buffers are only tested at most once per write(), so passing a very - // large string into write() might have undesirable effects, but this is manageable by - // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme - // edge case, result in creating at most one complete copy of the string passed in. - // Set to Infinity to have unlimited buffers. - sax.MAX_BUFFER_LENGTH = 64 * 1024 - - var buffers = [ - 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype', - 'procInstName', 'procInstBody', 'entity', 'attribName', - 'attribValue', 'cdata' - ] - - sax.EVENTS = [ - 'text', - 'processinginstruction', - 'sgmldeclaration', - 'doctype', - 'comment', - 'opentagstart', - 'attribute', - 'opentag', - 'closetag', - 'opencdata', - 'cdata', - 'closecdata', - 'error', - 'end', - 'ready', - 'opennamespace', - 'closenamespace' - ] - - function SAXParser (opt) { - if (!(this instanceof SAXParser)) { - return new SAXParser(opt) - } - - var parser = this - clearBuffers(parser) - parser.q = parser.c = '' - parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH - parser.opt = opt || {} - parser.tags = [] - parser.closed = parser.closedRoot = parser.sawRoot = false - parser.tag = parser.error = null - parser.state = S.BEGIN - parser.ENTITIES = Object.create(sax.XML_ENTITIES) - parser.attribList = [] - - // namespaces form a prototype chain. - // it always points at the current tag, - // which protos to its parent tag. - if (parser.opt.xmlns) { - parser.ns = Object.create(rootNS) - } - - // mostly just for error reporting - parser.trackPosition = parser.opt.position !== false - if (parser.trackPosition) { - parser.position = parser.line = parser.column = 0 - } - emit(parser, 'onready') +// this really needs to be replaced with character classes. +// XML allows all manner of ridiculous numbers and digits. + +"use strict"; + +const CDATA = "[CDATA["; +const DOCTYPE = "DOCTYPE"; +const XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"; +const XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/"; + +// http://www.w3.org/TR/REC-xml/#NT-NameStartChar +// This implementation works on strings, a single character at a time +// as such, it cannot ever support astral-plane characters (10000-EFFFF) +// without a significant breaking change to either this parser, or the +// JavaScript language. Implementation of an emoji-capable xml parser +// is left as an exercise for the reader. +const nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/; + +const nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/; + +const entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/; +const entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/; + +const rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }; + +const XML_ENTITIES = { + amp: "&", + gt: ">", + lt: "<", + quot: "\"", + apos: "'", +}; + +let S_INDEX = 0; +const S = { + BEGIN: S_INDEX++, // leading byte order mark or whitespace + BEGIN_WHITESPACE: S_INDEX++, // leading whitespace + TEXT: S_INDEX++, // general stuff + TEXT_ENTITY: S_INDEX++, // & and such. + OPEN_WAKA: S_INDEX++, // < + SGML_DECL: S_INDEX++, // +}; + +// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. +// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), +// since that's the earliest that a buffer overrun could occur. This way, checks are +// as rare as required, but as often as necessary to ensure never crossing this bound. +// Furthermore, buffers are only tested at most once per write(), so passing a very +// large string into write() might have undesirable effects, but this is manageable by +// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme +// edge case, result in creating at most one complete copy of the string passed in. +// Set to Infinity to have unlimited buffers. +exports.MAX_BUFFER_LENGTH = 64 * 1024; + +exports.EVENTS = [ + "text", + "processinginstruction", + "sgmldeclaration", + "doctype", + "comment", + "opentagstart", + "attribute", + "opentag", + "closetag", + "opencdata", + "cdata", + "closecdata", + "error", + "end", + "ready", + "opennamespace", + "closenamespace", +]; + +const buffers = [ + "comment", "sgmlDecl", "textNode", "tagName", "doctype", + "procInstName", "procInstBody", "entity", "attribName", + "attribValue", "cdata", +]; + +function clearBuffers(parser) { + for (const buffer of buffers) { + parser[buffer] = ""; } +} - if (!Object.create) { - Object.create = function (o) { - function F () {} - F.prototype = o - var newf = new F() - return newf - } +function emit(parser, event, data) { + if (parser[event]) { + parser[event](data); } +} - if (!Object.keys) { - Object.keys = function (o) { - var a = [] - for (var i in o) if (o.hasOwnProperty(i)) a.push(i) - return a - } +function closeText(parser) { + if (parser.textNode) { + emit(parser, "ontext", parser.textNode); } + parser.textNode = ""; +} - function checkBufferLength (parser) { - var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) - var maxActual = 0 - for (var i = 0, l = buffers.length; i < l; i++) { - var len = parser[buffers[i]].length - if (len > maxAllowed) { - // Text/cdata nodes can get big, and since they're buffered, - // we can get here under normal conditions. - // Avoid issues by emitting the text node now, - // so at least it won't get any bigger. - switch (buffers[i]) { - case 'textNode': - closeText(parser) - break - - case 'cdata': - emitNode(parser, 'oncdata', parser.cdata) - parser.cdata = '' - break - - default: - error(parser, 'Max buffer length exceeded: ' + buffers[i]) - } +function emitNode(parser, nodeType, data) { + if (parser.textNode) { + closeText(parser); + } + emit(parser, nodeType, data); +} + +function error(parser, er) { + closeText(parser); + if (parser.trackPosition) { + er += `\nLine: ${parser.line + }\nColumn: ${parser.column + }\nChar: ${parser.c}`; + } + er = new Error(er); + parser.error = er; + emit(parser, "onerror", er); + return parser; +} + +function flushBuffers(parser) { + closeText(parser); + if (parser.cdata !== "") { + emitNode(parser, "oncdata", parser.cdata); + parser.cdata = ""; + } +} + +function checkBufferLength(parser) { + const maxAllowed = Math.max(exports.MAX_BUFFER_LENGTH, 10); + let maxActual = 0; + for (const buffer of buffers) { + const len = parser[buffer].length; + if (len > maxAllowed) { + // Text/cdata nodes can get big, and since they're buffered, + // we can get here under normal conditions. + // Avoid issues by emitting the text node now, + // so at least it won't get any bigger. + switch (buffer) { + case "textNode": + closeText(parser); + break; + + case "cdata": + emitNode(parser, "oncdata", parser.cdata); + parser.cdata = ""; + break; + + default: + error(parser, `Max buffer length exceeded: ${buffer}`); } - maxActual = Math.max(maxActual, len) } - // schedule the next check for the earliest possible buffer overrun. - var m = sax.MAX_BUFFER_LENGTH - maxActual - parser.bufferCheckPosition = m + parser.position + maxActual = Math.max(maxActual, len); } - - function clearBuffers (parser) { - for (var i = 0, l = buffers.length; i < l; i++) { - parser[buffers[i]] = '' - } + // schedule the next check for the earliest possible buffer overrun. + const m = exports.MAX_BUFFER_LENGTH - maxActual; + parser.bufferCheckPosition = m + parser.position; +} + +let Stream; +try { + // eslint-disable-next-line global-require + ({ Stream } = require("stream")); +} +catch (ex) { + Stream = function FakeStream() {}; +} + +const streamWraps = exports.EVENTS.filter(ev => ev !== "error" && ev !== "end"); + +function isWhitespace(c) { + return c === " " || c === "\n" || c === "\r" || c === "\t"; +} + +function isQuote(c) { + return c === "\"" || c === "'"; +} + +function isAttribEnd(c) { + return c === ">" || isWhitespace(c); +} + +function isMatch(regex, c) { + return regex.test(c); +} + +function notMatch(regex, c) { + return !isMatch(regex, c); +} + +function fail(parser, message) { + // eslint-disable-next-line no-use-before-define + if (!(parser instanceof SAXParser)) { + throw new Error("bad call to fail"); } + error(parser, message); +} - function flushBuffers (parser) { - closeText(parser) - if (parser.cdata !== '') { - emitNode(parser, 'oncdata', parser.cdata) - parser.cdata = '' - } +function end(parser) { + if (parser.sawRoot && !parser.closedRoot) { + fail(parser, "Unclosed root tag"); } - - SAXParser.prototype = { - end: function () { end(this) }, - write: write, - resume: function () { this.error = null; return this }, - close: function () { return this.write(null) }, - flush: function () { flushBuffers(this) } + if ((parser.state !== S.BEGIN) && + (parser.state !== S.BEGIN_WHITESPACE) && + (parser.state !== S.TEXT)) { + error(parser, "Unexpected end"); } - - var Stream - try { - Stream = require('stream').Stream - } catch (ex) { - Stream = function () {} + closeText(parser); + parser.c = ""; + parser.closed = true; + emit(parser, "onend"); + parser._init(parser.opt); + return parser; +} + +function newTag(parser) { + const parent = parser.tags[parser.tags.length - 1] || parser; + const tag = parser.tag = { + name: parser.tagName, + attributes: Object.create(null), + }; + + // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar" + if (parser.opt.xmlns) { + tag.ns = parent.ns; } + parser.attribList.length = 0; + emitNode(parser, "onopentagstart", tag); +} - var streamWraps = sax.EVENTS.filter(function (ev) { - return ev !== 'error' && ev !== 'end' - }) +function qname(name, attribute) { + let [prefix, local] = (name.indexOf(":") < 0 ? ["", name] : name.split(":")); - function createStream (opt) { - return new SAXStream(opt) + // + if (attribute && name === "xmlns") { + prefix = "xmlns"; + local = ""; } - function SAXStream (opt) { - if (!(this instanceof SAXStream)) { - return new SAXStream(opt) - } - - Stream.apply(this) - - this._parser = new SAXParser(opt) - this.writable = true - this.readable = true - - var me = this + return { prefix, local }; +} - this._parser.onend = function () { - me.emit('end') - } - - this._parser.onerror = function (er) { - me.emit('error', er) - - // if didn't throw, then means error was handled. - // go ahead and clear error, so we can write again. - me._parser.error = null - } - - this._decoder = null - - streamWraps.forEach(function (ev) { - Object.defineProperty(me, 'on' + ev, { - get: function () { - return me._parser['on' + ev] - }, - set: function (h) { - if (!h) { - me.removeAllListeners(ev) - me._parser['on' + ev] = h - return h - } - me.on(ev, h) - }, - enumerable: true, - configurable: false - }) - }) +function attrib(parser) { + if (parser.attribList.indexOf(parser.attribName) !== -1 || + parser.tag.attributes[parser.attribName]) { + parser.attribName = parser.attribValue = ""; + return; } - SAXStream.prototype = Object.create(Stream.prototype, { - constructor: { - value: SAXStream - } - }) + if (parser.opt.xmlns) { + const { prefix, local } = qname(parser.attribName, true); - SAXStream.prototype.write = function (data) { - if (typeof Buffer === 'function' && - typeof Buffer.isBuffer === 'function' && - Buffer.isBuffer(data)) { - if (!this._decoder) { - var SD = require('string_decoder').StringDecoder - this._decoder = new SD('utf8') + if (prefix === "xmlns") { + // namespace binding attribute. push the binding into scope + if (local === "xml" && parser.attribValue !== XML_NAMESPACE) { + fail(parser, + `xml: prefix must be bound to ${XML_NAMESPACE}\n` + + `Actual: ${parser.attribValue}`); } - data = this._decoder.write(data) - } - - this._parser.write(data.toString()) - this.emit('data', data) - return true - } - - SAXStream.prototype.end = function (chunk) { - if (chunk && chunk.length) { - this.write(chunk) - } - this._parser.end() - return true - } - - SAXStream.prototype.on = function (ev, handler) { - var me = this - if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) { - me._parser['on' + ev] = function () { - var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments) - args.splice(0, 0, ev) - me.emit.apply(me, args) + else if (local === "xmlns" && parser.attribValue !== XMLNS_NAMESPACE) { + fail(parser, + `xmlns: prefix must be bound to ${XMLNS_NAMESPACE}\n` + + `Actual: ${parser.attribValue}`); + } + else { + const { tag } = parser; + const parent = parser.tags[parser.tags.length - 1] || parser; + if (tag.ns === parent.ns) { + tag.ns = Object.create(parent.ns); + } + tag.ns[local] = parser.attribValue; } } - return Stream.prototype.on.call(me, ev, handler) + // defer onattribute events until all attributes have been seen + // so any new bindings can take effect. preserve attribute order + // so deferred events can be emitted in document order + parser.attribList.push([parser.attribName, parser.attribValue]); } - - // this really needs to be replaced with character classes. - // XML allows all manner of ridiculous numbers and digits. - var CDATA = '[CDATA[' - var DOCTYPE = 'DOCTYPE' - var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace' - var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/' - var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } - - // http://www.w3.org/TR/REC-xml/#NT-NameStartChar - // This implementation works on strings, a single character at a time - // as such, it cannot ever support astral-plane characters (10000-EFFFF) - // without a significant breaking change to either this parser, or the - // JavaScript language. Implementation of an emoji-capable xml parser - // is left as an exercise for the reader. - var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ - - var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ - - var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ - var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ - - function isWhitespace (c) { - return c === ' ' || c === '\n' || c === '\r' || c === '\t' + else { + // in non-xmlns mode, we can emit the event right away + parser.tag.attributes[parser.attribName] = parser.attribValue; + emitNode(parser, "onattribute", { + name: parser.attribName, + value: parser.attribValue, + }); } - function isQuote (c) { - return c === '"' || c === '\'' - } + parser.attribName = parser.attribValue = ""; +} - function isAttribEnd (c) { - return c === '>' || isWhitespace(c) - } +function openTag(parser, selfClosing) { + if (parser.opt.xmlns) { + // emit namespace binding events + const { tag } = parser; - function isMatch (regex, c) { - return regex.test(c) - } - - function notMatch (regex, c) { - return !isMatch(regex, c) - } - - var S = 0 - sax.STATE = { - BEGIN: S++, // leading byte order mark or whitespace - BEGIN_WHITESPACE: S++, // leading whitespace - TEXT: S++, // general stuff - TEXT_ENTITY: S++, // & and such. - OPEN_WAKA: S++, // < - SGML_DECL: S++, // - } - - sax.XML_ENTITIES = { - 'amp': '&', - 'gt': '>', - 'lt': '<', - 'quot': '"', - 'apos': "'" - } - - for (var s in sax.STATE) { - sax.STATE[sax.STATE[s]] = s - } + // add namespace info to tag + const qn = qname(parser.tagName); + tag.prefix = qn.prefix; + tag.local = qn.local; + tag.uri = tag.ns[qn.prefix] || ""; - // shorthand - S = sax.STATE - - function emit (parser, event, data) { - parser[event] && parser[event](data) - } - - function emitNode (parser, nodeType, data) { - if (parser.textNode) closeText(parser) - emit(parser, nodeType, data) - } - - function closeText (parser) { - if (parser.textNode) emit(parser, 'ontext', parser.textNode) - parser.textNode = '' - } - - function error (parser, er) { - closeText(parser) - if (parser.trackPosition) { - er += '\nLine: ' + parser.line + - '\nColumn: ' + parser.column + - '\nChar: ' + parser.c + if (tag.prefix && !tag.uri) { + fail(parser, `Unbound namespace prefix: ${ + JSON.stringify(parser.tagName)}`); + tag.uri = qn.prefix; } - er = new Error(er) - parser.error = er - emit(parser, 'onerror', er) - return parser - } - function end (parser) { - if (parser.sawRoot && !parser.closedRoot) fail(parser, 'Unclosed root tag') - if ((parser.state !== S.BEGIN) && - (parser.state !== S.BEGIN_WHITESPACE) && - (parser.state !== S.TEXT)) { - error(parser, 'Unexpected end') + const parent = parser.tags[parser.tags.length - 1] || parser; + if (tag.ns && parent.ns !== tag.ns) { + for (const p of Object.keys(tag.ns)) { + emitNode(parser, "onopennamespace", { prefix: p, uri: tag.ns[p] }); + } } - closeText(parser) - parser.c = '' - parser.closed = true - emit(parser, 'onend') - SAXParser.call(parser, parser.opt) - return parser - } - function fail (parser, message) { - if (typeof parser !== 'object' || !(parser instanceof SAXParser)) { - throw new Error('bad call to fail') + // handle deferred onattribute events + // Note: do not apply default ns to attributes: + // http://www.w3.org/TR/REC-xml-names/#defaulting + for (const [name, value] of parser.attribList) { + const { prefix, local } = qname(name, true); + const uri = prefix === "" ? "" : (tag.ns[prefix] || ""); + const a = { + name, + value, + prefix, + local, + uri, + }; + + // if there's any attributes with an undefined namespace, + // then fail on them now. + if (prefix && prefix !== "xmlns" && !uri) { + fail(parser, `Unbound namespace prefix: ${ + JSON.stringify(prefix)}`); + a.uri = prefix; + } + parser.tag.attributes[name] = a; + emitNode(parser, "onattribute", a); } - error(parser, message) + parser.attribList.length = 0; } - function newTag (parser) { - var parent = parser.tags[parser.tags.length - 1] || parser - var tag = parser.tag = { name: parser.tagName, attributes: {} } + parser.tag.isSelfClosing = !!selfClosing; - // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar" - if (parser.opt.xmlns) { - tag.ns = parent.ns - } - parser.attribList.length = 0 - emitNode(parser, 'onopentagstart', tag) + // process the tag + parser.sawRoot = true; + parser.tags.push(parser.tag); + emitNode(parser, "onopentag", parser.tag); + if (!selfClosing) { + parser.state = S.TEXT; + parser.tag = null; + parser.tagName = ""; + } + parser.attribName = parser.attribValue = ""; + parser.attribList.length = 0; +} + +function closeTag(parser) { + if (!parser.tagName) { + fail(parser, "Weird empty close tag."); + parser.textNode += ""; + parser.state = S.TEXT; + return; } - function qname (name, attribute) { - var i = name.indexOf(':') - var qualName = i < 0 ? [ '', name ] : name.split(':') - var prefix = qualName[0] - var local = qualName[1] - - // - if (attribute && name === 'xmlns') { - prefix = 'xmlns' - local = '' + // first make sure that the closing tag actually exists. + // will close everything, otherwise. + let t = parser.tags.length; + const { tagName } = parser; + const closeTo = tagName; + while (t--) { + const close = parser.tags[t]; + if (close.name !== closeTo) { + fail(parser, "Unexpected close tag"); + } + else { + break; } - - return { prefix: prefix, local: local } } - function attrib (parser) { - if (parser.attribList.indexOf(parser.attribName) !== -1 || - parser.tag.attributes.hasOwnProperty(parser.attribName)) { - parser.attribName = parser.attribValue = '' - return + if (t < 0) { + fail(parser, `Unmatched closing tag: ${parser.tagName}`); + parser.textNode += ``; + parser.state = S.TEXT; + return; + } + parser.tagName = tagName; + let s = parser.tags.length; + while (s-- > t) { + const tag = parser.tag = parser.tags.pop(); + parser.tagName = parser.tag.name; + emitNode(parser, "onclosetag", parser.tagName); + + const x = {}; + // eslint-disable-next-line guard-for-in + for (const i in tag.ns) { + x[i] = tag.ns[i]; } - if (parser.opt.xmlns) { - var qn = qname(parser.attribName, true) - var prefix = qn.prefix - var local = qn.local - - if (prefix === 'xmlns') { - // namespace binding attribute. push the binding into scope - if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) { - fail(parser, - 'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' + - 'Actual: ' + parser.attribValue) - } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) { - fail(parser, - 'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' + - 'Actual: ' + parser.attribValue) - } else { - var tag = parser.tag - var parent = parser.tags[parser.tags.length - 1] || parser - if (tag.ns === parent.ns) { - tag.ns = Object.create(parent.ns) - } - tag.ns[local] = parser.attribValue - } + const parent = parser.tags[parser.tags.length - 1] || parser; + if (parser.opt.xmlns && tag.ns !== parent.ns) { + // remove namespace bindings introduced by tag + for (const p of Object.keys(tag.ns)) { + emitNode(parser, "onclosenamespace", { prefix: p, uri: tag.ns[p] }); } - - // defer onattribute events until all attributes have been seen - // so any new bindings can take effect. preserve attribute order - // so deferred events can be emitted in document order - parser.attribList.push([parser.attribName, parser.attribValue]) - } else { - // in non-xmlns mode, we can emit the event right away - parser.tag.attributes[parser.attribName] = parser.attribValue - emitNode(parser, 'onattribute', { - name: parser.attribName, - value: parser.attribValue - }) } - - parser.attribName = parser.attribValue = '' } + if (t === 0) { + parser.closedRoot = true; + } + parser.tagName = parser.attribValue = parser.attribName = ""; + parser.attribList.length = 0; + parser.state = S.TEXT; +} - function openTag (parser, selfClosing) { - if (parser.opt.xmlns) { - // emit namespace binding events - var tag = parser.tag - - // add namespace info to tag - var qn = qname(parser.tagName) - tag.prefix = qn.prefix - tag.local = qn.local - tag.uri = tag.ns[qn.prefix] || '' - - if (tag.prefix && !tag.uri) { - fail(parser, 'Unbound namespace prefix: ' + - JSON.stringify(parser.tagName)) - tag.uri = qn.prefix - } +function parseEntity(parser) { + let { entity } = parser; - var parent = parser.tags[parser.tags.length - 1] || parser - if (tag.ns && parent.ns !== tag.ns) { - Object.keys(tag.ns).forEach(function (p) { - emitNode(parser, 'onopennamespace', { - prefix: p, - uri: tag.ns[p] - }) - }) - } + if (parser.ENTITIES[entity]) { + return parser.ENTITIES[entity]; + } - // handle deferred onattribute events - // Note: do not apply default ns to attributes: - // http://www.w3.org/TR/REC-xml-names/#defaulting - for (var i = 0, l = parser.attribList.length; i < l; i++) { - var nv = parser.attribList[i] - var name = nv[0] - var value = nv[1] - var qualName = qname(name, true) - var prefix = qualName.prefix - var local = qualName.local - var uri = prefix === '' ? '' : (tag.ns[prefix] || '') - var a = { - name: name, - value: value, - prefix: prefix, - local: local, - uri: uri - } - - // if there's any attributes with an undefined namespace, - // then fail on them now. - if (prefix && prefix !== 'xmlns' && !uri) { - fail(parser, 'Unbound namespace prefix: ' + - JSON.stringify(prefix)) - a.uri = prefix - } - parser.tag.attributes[name] = a - emitNode(parser, 'onattribute', a) - } - parser.attribList.length = 0 + let num; + let numStr = ""; + entity = entity.toLowerCase(); + if (entity[0] === "#") { + if (entity[1] === "x") { + entity = entity.slice(2); + num = parseInt(entity, 16); + numStr = num.toString(16); } - - parser.tag.isSelfClosing = !!selfClosing - - // process the tag - parser.sawRoot = true - parser.tags.push(parser.tag) - emitNode(parser, 'onopentag', parser.tag) - if (!selfClosing) { - parser.state = S.TEXT - parser.tag = null - parser.tagName = '' + else { + entity = entity.slice(1); + num = parseInt(entity); + numStr = num.toString(10); } - parser.attribName = parser.attribValue = '' - parser.attribList.length = 0 + } + entity = entity.replace(/^0+/, ""); + if (Number.isNaN(num) || numStr.toLowerCase() !== entity) { + fail(parser, "Invalid character entity"); + return `&${parser.entity};`; } - function closeTag (parser) { - if (!parser.tagName) { - fail(parser, 'Weird empty close tag.') - parser.textNode += '' - parser.state = S.TEXT - return - } - - // first make sure that the closing tag actually exists. - // will close everything, otherwise. - var t = parser.tags.length - var tagName = parser.tagName - var closeTo = tagName - while (t--) { - var close = parser.tags[t] - if (close.name !== closeTo) { - fail(parser, 'Unexpected close tag') - } else { - break - } - } + return String.fromCodePoint(num); +} - if (t < 0) { - fail(parser, 'Unmatched closing tag: ' + parser.tagName) - parser.textNode += '' - parser.state = S.TEXT - return - } - parser.tagName = tagName - var s = parser.tags.length - while (s-- > t) { - var tag = parser.tag = parser.tags.pop() - parser.tagName = parser.tag.name - emitNode(parser, 'onclosetag', parser.tagName) - - var x = {} - for (var i in tag.ns) { - x[i] = tag.ns[i] - } +function beginWhiteSpace(parser, c) { + if (c === "<") { + parser.state = S.OPEN_WAKA; + parser.startTagPosition = parser.position; + } + else if (!isWhitespace(c)) { + // have to process this as a text node. + // weird, but happens. + fail(parser, "Non-whitespace before first tag."); + parser.textNode = c; + parser.state = S.TEXT; + } +} - var parent = parser.tags[parser.tags.length - 1] || parser - if (parser.opt.xmlns && tag.ns !== parent.ns) { - // remove namespace bindings introduced by tag - Object.keys(tag.ns).forEach(function (p) { - var n = tag.ns[p] - emitNode(parser, 'onclosenamespace', { prefix: p, uri: n }) - }) - } - } - if (t === 0) parser.closedRoot = true - parser.tagName = parser.attribValue = parser.attribName = '' - parser.attribList.length = 0 - parser.state = S.TEXT +class SAXParser { + constructor(opt) { + this._init(opt); } - function parseEntity (parser) { - var entity = parser.entity - var num - var numStr = '' + _init(opt) { + const parser = this; + clearBuffers(parser); + parser.q = parser.c = ""; + parser.bufferCheckPosition = exports.MAX_BUFFER_LENGTH; + parser.opt = opt || {}; + parser.tags = []; + parser.closed = parser.closedRoot = parser.sawRoot = false; + parser.tag = parser.error = null; + parser.state = S.BEGIN; + parser.ENTITIES = Object.create(XML_ENTITIES); + parser.attribList = []; - if (parser.ENTITIES[entity]) { - return parser.ENTITIES[entity] - } - entity = entity.toLowerCase() - if (entity.charAt(0) === '#') { - if (entity.charAt(1) === 'x') { - entity = entity.slice(2) - num = parseInt(entity, 16) - numStr = num.toString(16) - } else { - entity = entity.slice(1) - num = parseInt(entity, 10) - numStr = num.toString(10) - } - } - entity = entity.replace(/^0+/, '') - if (isNaN(num) || numStr.toLowerCase() !== entity) { - fail(parser, 'Invalid character entity') - return '&' + parser.entity + ';' + // namespaces form a prototype chain. + // it always points at the current tag, + // which protos to its parent tag. + if (parser.opt.xmlns) { + parser.ns = Object.create(rootNS); } - return String.fromCodePoint(num) - } - - function beginWhiteSpace (parser, c) { - if (c === '<') { - parser.state = S.OPEN_WAKA - parser.startTagPosition = parser.position - } else if (!isWhitespace(c)) { - // have to process this as a text node. - // weird, but happens. - fail(parser, 'Non-whitespace before first tag.') - parser.textNode = c - parser.state = S.TEXT + // mostly just for error reporting + parser.trackPosition = parser.opt.position !== false; + if (parser.trackPosition) { + parser.position = parser.line = parser.column = 0; } + emit(parser, "onready"); } - function charAt (chunk, i) { - var result = '' - if (i < chunk.length) { - result = chunk.charAt(i) - } - return result + end() { + end(this); } - function write (chunk) { - var parser = this + write(chunk) { + const parser = this; if (this.error) { - throw this.error + throw this.error; } if (parser.closed) { return error(parser, - 'Cannot write after close. Assign an onready handler.') + "Cannot write after close. Assign an onready handler."); } if (chunk === null) { - return end(parser) + return end(parser); } - if (typeof chunk === 'object') { - chunk = chunk.toString() + if (typeof chunk === "object") { + chunk = chunk.toString(); } - var i = 0 - var c = '' + let i = 0; + let c = ""; + // eslint-disable-next-line no-constant-condition while (true) { - c = charAt(chunk, i++) - parser.c = c + c = chunk[i++] || ""; + parser.c = c; if (!c) { - break + break; } if (parser.trackPosition) { - parser.position++ - if (c === '\n') { - parser.line++ - parser.column = 0 - } else { - parser.column++ + parser.position++; + if (c === "\n") { + parser.line++; + parser.column = 0; + } + else { + parser.column++; } } switch (parser.state) { - case S.BEGIN: - parser.state = S.BEGIN_WHITESPACE - if (c === '\uFEFF') { - continue - } - beginWhiteSpace(parser, c) - continue - - case S.BEGIN_WHITESPACE: - beginWhiteSpace(parser, c) - continue - - case S.TEXT: - if (parser.sawRoot && !parser.closedRoot) { - var starti = i - 1 - while (c && c !== '<' && c !== '&') { - c = charAt(chunk, i++) - if (c && parser.trackPosition) { - parser.position++ - if (c === '\n') { - parser.line++ - parser.column = 0 - } else { - parser.column++ - } + case S.BEGIN: + parser.state = S.BEGIN_WHITESPACE; + if (c === "\uFEFF") { + continue; + } + beginWhiteSpace(parser, c); + continue; + + case S.BEGIN_WHITESPACE: + beginWhiteSpace(parser, c); + continue; + + case S.TEXT: + if (parser.sawRoot && !parser.closedRoot) { + const starti = i - 1; + while (c && c !== "<" && c !== "&") { + c = chunk[i++] || ""; + if (c && parser.trackPosition) { + parser.position++; + if (c === "\n") { + parser.line++; + parser.column = 0; + } + else { + parser.column++; } } - parser.textNode += chunk.substring(starti, i - 1) } - if (c === '<') { - parser.state = S.OPEN_WAKA - parser.startTagPosition = parser.position - } else { - if (!isWhitespace(c)) { - // We use the reportedTextBeforeRoot and - // reportedTextAfterRoot flags to avoid reporting errors - // for every single character that is out of place. - if (!parser.sawRoot && !parser.reportedTextBeforeRoot) { - fail(parser, 'Text data outside of root node.') - parser.reportedTextBeforeRoot = true - } - - if (parser.closedRoot && !parser.reportedTextAfterRoot) { - fail(parser, 'Text data outside of root node.') - parser.reportedTextAfterRoot = true - } + parser.textNode += chunk.substring(starti, i - 1); + } + if (c === "<") { + parser.state = S.OPEN_WAKA; + parser.startTagPosition = parser.position; + } + else { + if (!isWhitespace(c)) { + // We use the reportedTextBeforeRoot and + // reportedTextAfterRoot flags to avoid reporting errors + // for every single character that is out of place. + if (!parser.sawRoot && !parser.reportedTextBeforeRoot) { + fail(parser, "Text data outside of root node."); + parser.reportedTextBeforeRoot = true; } - if (c === '&') { - parser.state = S.TEXT_ENTITY - } else { - parser.textNode += c + + if (parser.closedRoot && !parser.reportedTextAfterRoot) { + fail(parser, "Text data outside of root node."); + parser.reportedTextAfterRoot = true; } } - continue - - case S.OPEN_WAKA: - // either a /, ?, !, or text is coming next. - if (c === '!') { - parser.state = S.SGML_DECL - parser.sgmlDecl = '' - } else if (isWhitespace(c)) { - // wait for it... - } else if (isMatch(nameStart, c)) { - parser.state = S.OPEN_TAG - parser.tagName = c - } else if (c === '/') { - parser.state = S.CLOSE_TAG - parser.tagName = '' - } else if (c === '?') { - parser.state = S.PROC_INST - parser.procInstName = parser.procInstBody = '' - } else { - fail(parser, 'Unencoded <') - // if there was some whitespace, then add that in. - if (parser.startTagPosition + 1 < parser.position) { - var pad = parser.position - parser.startTagPosition - c = new Array(pad).join(' ') + c - } - parser.textNode += '<' + c - parser.state = S.TEXT + if (c === "&") { + parser.state = S.TEXT_ENTITY; } - continue - - case S.SGML_DECL: - if ((parser.sgmlDecl + c).toUpperCase() === CDATA) { - emitNode(parser, 'onopencdata') - parser.state = S.CDATA - parser.sgmlDecl = '' - parser.cdata = '' - } else if (parser.sgmlDecl + c === '--') { - parser.state = S.COMMENT - parser.comment = '' - parser.sgmlDecl = '' - } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) { - parser.state = S.DOCTYPE - if (parser.doctype || parser.sawRoot) { - fail(parser, - 'Inappropriately located doctype declaration') - } - parser.doctype = '' - parser.sgmlDecl = '' - } else if (c === '>') { - emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl) - parser.sgmlDecl = '' - parser.state = S.TEXT - } else if (isQuote(c)) { - parser.state = S.SGML_DECL_QUOTED - parser.sgmlDecl += c - } else { - parser.sgmlDecl += c + else { + parser.textNode += c; } - continue + } + continue; - case S.SGML_DECL_QUOTED: - if (c === parser.q) { - parser.state = S.SGML_DECL - parser.q = '' + case S.OPEN_WAKA: + // either a /, ?, !, or text is coming next. + if (c === "!") { + parser.state = S.SGML_DECL; + parser.sgmlDecl = ""; + } + else if (isWhitespace(c)) { + // wait for it... + } + else if (isMatch(nameStart, c)) { + parser.state = S.OPEN_TAG; + parser.tagName = c; + } + else if (c === "/") { + parser.state = S.CLOSE_TAG; + parser.tagName = ""; + } + else if (c === "?") { + parser.state = S.PROC_INST; + parser.procInstName = parser.procInstBody = ""; + } + else { + fail(parser, "Unencoded <"); + // if there was some whitespace, then add that in. + if (parser.startTagPosition + 1 < parser.position) { + const pad = parser.position - parser.startTagPosition; + c = new Array(pad).join(" ") + c; } - parser.sgmlDecl += c - continue - - case S.DOCTYPE: - if (c === '>') { - parser.state = S.TEXT - emitNode(parser, 'ondoctype', parser.doctype) - parser.doctype = true // just remember that we saw it. - } else { - parser.doctype += c - if (c === '[') { - parser.state = S.DOCTYPE_DTD - } else if (isQuote(c)) { - parser.state = S.DOCTYPE_QUOTED - parser.q = c - } + parser.textNode += `<${c}`; + parser.state = S.TEXT; + } + continue; + + case S.SGML_DECL: + if ((parser.sgmlDecl + c).toUpperCase() === CDATA) { + emitNode(parser, "onopencdata"); + parser.state = S.CDATA; + parser.sgmlDecl = ""; + parser.cdata = ""; + } + else if (parser.sgmlDecl + c === "--") { + parser.state = S.COMMENT; + parser.comment = ""; + parser.sgmlDecl = ""; + } + else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) { + parser.state = S.DOCTYPE; + if (parser.doctype || parser.sawRoot) { + fail(parser, + "Inappropriately located doctype declaration"); } - continue + parser.doctype = ""; + parser.sgmlDecl = ""; + } + else if (c === ">") { + emitNode(parser, "onsgmldeclaration", parser.sgmlDecl); + parser.sgmlDecl = ""; + parser.state = S.TEXT; + } + else if (isQuote(c)) { + parser.state = S.SGML_DECL_QUOTED; + parser.sgmlDecl += c; + } + else { + parser.sgmlDecl += c; + } + continue; - case S.DOCTYPE_QUOTED: - parser.doctype += c - if (c === parser.q) { - parser.q = '' - parser.state = S.DOCTYPE + case S.SGML_DECL_QUOTED: + if (c === parser.q) { + parser.state = S.SGML_DECL; + parser.q = ""; + } + parser.sgmlDecl += c; + continue; + + case S.DOCTYPE: + if (c === ">") { + parser.state = S.TEXT; + emitNode(parser, "ondoctype", parser.doctype); + parser.doctype = true; // just remember that we saw it. + } + else { + parser.doctype += c; + if (c === "[") { + parser.state = S.DOCTYPE_DTD; } - continue - - case S.DOCTYPE_DTD: - parser.doctype += c - if (c === ']') { - parser.state = S.DOCTYPE - } else if (isQuote(c)) { - parser.state = S.DOCTYPE_DTD_QUOTED - parser.q = c + else if (isQuote(c)) { + parser.state = S.DOCTYPE_QUOTED; + parser.q = c; } - continue + } + continue; - case S.DOCTYPE_DTD_QUOTED: - parser.doctype += c - if (c === parser.q) { - parser.state = S.DOCTYPE_DTD - parser.q = '' - } - continue + case S.DOCTYPE_QUOTED: + parser.doctype += c; + if (c === parser.q) { + parser.q = ""; + parser.state = S.DOCTYPE; + } + continue; - case S.COMMENT: - if (c === '-') { - parser.state = S.COMMENT_ENDING - } else { - parser.comment += c - } - continue + case S.DOCTYPE_DTD: + parser.doctype += c; + if (c === "]") { + parser.state = S.DOCTYPE; + } + else if (isQuote(c)) { + parser.state = S.DOCTYPE_DTD_QUOTED; + parser.q = c; + } + continue; - case S.COMMENT_ENDING: - if (c === '-') { - parser.state = S.COMMENT_ENDED - if (parser.comment) { - emitNode(parser, 'oncomment', parser.comment) - } - parser.comment = '' - } else { - parser.comment += '-' + c - parser.state = S.COMMENT - } - continue - - case S.COMMENT_ENDED: - if (c !== '>') { - fail(parser, 'Malformed comment') - // will be recorded as - // a comment of " blah -- bloo " - parser.comment += '--' + c - parser.state = S.COMMENT - } else { - parser.state = S.TEXT - } - continue + case S.DOCTYPE_DTD_QUOTED: + parser.doctype += c; + if (c === parser.q) { + parser.state = S.DOCTYPE_DTD; + parser.q = ""; + } + continue; - case S.CDATA: - if (c === ']') { - parser.state = S.CDATA_ENDING - } else { - parser.cdata += c - } - continue - - case S.CDATA_ENDING: - if (c === ']') { - parser.state = S.CDATA_ENDING_2 - } else { - parser.cdata += ']' + c - parser.state = S.CDATA - } - continue + case S.COMMENT: + if (c === "-") { + parser.state = S.COMMENT_ENDING; + } + else { + parser.comment += c; + } + continue; - case S.CDATA_ENDING_2: - if (c === '>') { - if (parser.cdata) { - emitNode(parser, 'oncdata', parser.cdata) - } - emitNode(parser, 'onclosecdata') - parser.cdata = '' - parser.state = S.TEXT - } else if (c === ']') { - parser.cdata += ']' - } else { - parser.cdata += ']]' + c - parser.state = S.CDATA + case S.COMMENT_ENDING: + if (c === "-") { + parser.state = S.COMMENT_ENDED; + if (parser.comment) { + emitNode(parser, "oncomment", parser.comment); } - continue - - case S.PROC_INST: - if (c === '?') { - parser.state = S.PROC_INST_ENDING - } else if (isWhitespace(c)) { - parser.state = S.PROC_INST_BODY - } else { - parser.procInstName += c + parser.comment = ""; + } + else { + parser.comment += `-${c}`; + parser.state = S.COMMENT; + } + continue; + + case S.COMMENT_ENDED: + if (c !== ">") { + fail(parser, "Malformed comment"); + // will be recorded as + // a comment of " blah -- bloo " + parser.comment += `--${c}`; + parser.state = S.COMMENT; + } + else { + parser.state = S.TEXT; + } + continue; + + case S.CDATA: + if (c === "]") { + parser.state = S.CDATA_ENDING; + } + else { + parser.cdata += c; + } + continue; + + case S.CDATA_ENDING: + if (c === "]") { + parser.state = S.CDATA_ENDING_2; + } + else { + parser.cdata += `]${c}`; + parser.state = S.CDATA; + } + continue; + + case S.CDATA_ENDING_2: + if (c === ">") { + if (parser.cdata) { + emitNode(parser, "oncdata", parser.cdata); } - continue - - case S.PROC_INST_BODY: - if (!parser.procInstBody && isWhitespace(c)) { - continue - } else if (c === '?') { - parser.state = S.PROC_INST_ENDING - } else { - parser.procInstBody += c + emitNode(parser, "onclosecdata"); + parser.cdata = ""; + parser.state = S.TEXT; + } + else if (c === "]") { + parser.cdata += "]"; + } + else { + parser.cdata += `]]${c}`; + parser.state = S.CDATA; + } + continue; + + case S.PROC_INST: + if (c === "?") { + parser.state = S.PROC_INST_ENDING; + } + else if (isWhitespace(c)) { + parser.state = S.PROC_INST_BODY; + } + else { + parser.procInstName += c; + } + continue; + + case S.PROC_INST_BODY: + if (!parser.procInstBody && isWhitespace(c)) { + continue; + } + else if (c === "?") { + parser.state = S.PROC_INST_ENDING; + } + else { + parser.procInstBody += c; + } + continue; + + case S.PROC_INST_ENDING: + if (c === ">") { + emitNode(parser, "onprocessinginstruction", { + name: parser.procInstName, + body: parser.procInstBody, + }); + parser.procInstName = parser.procInstBody = ""; + parser.state = S.TEXT; + } + else { + parser.procInstBody += `?${c}`; + parser.state = S.PROC_INST_BODY; + } + continue; + + case S.OPEN_TAG: + if (isMatch(nameBody, c)) { + parser.tagName += c; + } + else { + newTag(parser); + if (c === ">") { + openTag(parser); } - continue - - case S.PROC_INST_ENDING: - if (c === '>') { - emitNode(parser, 'onprocessinginstruction', { - name: parser.procInstName, - body: parser.procInstBody - }) - parser.procInstName = parser.procInstBody = '' - parser.state = S.TEXT - } else { - parser.procInstBody += '?' + c - parser.state = S.PROC_INST_BODY + else if (c === "/") { + parser.state = S.OPEN_TAG_SLASH; } - continue - - case S.OPEN_TAG: - if (isMatch(nameBody, c)) { - parser.tagName += c - } else { - newTag(parser) - if (c === '>') { - openTag(parser) - } else if (c === '/') { - parser.state = S.OPEN_TAG_SLASH - } else { - if (!isWhitespace(c)) { - fail(parser, 'Invalid character in tag name') - } - parser.state = S.ATTRIB + else { + if (!isWhitespace(c)) { + fail(parser, "Invalid character in tag name"); } + parser.state = S.ATTRIB; } - continue - - case S.OPEN_TAG_SLASH: - if (c === '>') { - openTag(parser, true) - closeTag(parser) - } else { - fail(parser, 'Forward-slash in opening tag not followed by >') - parser.state = S.ATTRIB - } - continue + } + continue; - case S.ATTRIB: - // haven't read the attribute name yet. - if (isWhitespace(c)) { - continue - } else if (c === '>') { - openTag(parser) - } else if (c === '/') { - parser.state = S.OPEN_TAG_SLASH - } else if (isMatch(nameStart, c)) { - parser.attribName = c - parser.attribValue = '' - parser.state = S.ATTRIB_NAME - } else { - fail(parser, 'Invalid attribute name') + case S.OPEN_TAG_SLASH: + if (c === ">") { + openTag(parser, true); + closeTag(parser); + } + else { + fail(parser, "Forward-slash in opening tag not followed by >"); + parser.state = S.ATTRIB; + } + continue; + + case S.ATTRIB: + // haven't read the attribute name yet. + if (isWhitespace(c)) { + continue; + } + else if (c === ">") { + openTag(parser); + } + else if (c === "/") { + parser.state = S.OPEN_TAG_SLASH; + } + else if (isMatch(nameStart, c)) { + parser.attribName = c; + parser.attribValue = ""; + parser.state = S.ATTRIB_NAME; + } + else { + fail(parser, "Invalid attribute name"); + } + continue; + + case S.ATTRIB_NAME: + if (c === "=") { + parser.state = S.ATTRIB_VALUE; + } + else if (c === ">") { + fail(parser, "Attribute without value"); + parser.attribValue = parser.attribName; + attrib(parser); + openTag(parser); + } + else if (isWhitespace(c)) { + parser.state = S.ATTRIB_NAME_SAW_WHITE; + } + else if (isMatch(nameBody, c)) { + parser.attribName += c; + } + else { + fail(parser, "Invalid attribute name"); + } + continue; + + case S.ATTRIB_NAME_SAW_WHITE: + if (c === "=") { + parser.state = S.ATTRIB_VALUE; + } + else if (isWhitespace(c)) { + continue; + } + else { + fail(parser, "Attribute without value"); + parser.tag.attributes[parser.attribName] = ""; + parser.attribValue = ""; + emitNode(parser, "onattribute", { + name: parser.attribName, + value: "", + }); + parser.attribName = ""; + if (c === ">") { + openTag(parser); } - continue - - case S.ATTRIB_NAME: - if (c === '=') { - parser.state = S.ATTRIB_VALUE - } else if (c === '>') { - fail(parser, 'Attribute without value') - parser.attribValue = parser.attribName - attrib(parser) - openTag(parser) - } else if (isWhitespace(c)) { - parser.state = S.ATTRIB_NAME_SAW_WHITE - } else if (isMatch(nameBody, c)) { - parser.attribName += c - } else { - fail(parser, 'Invalid attribute name') + else if (isMatch(nameStart, c)) { + parser.attribName = c; + parser.state = S.ATTRIB_NAME; } - continue - - case S.ATTRIB_NAME_SAW_WHITE: - if (c === '=') { - parser.state = S.ATTRIB_VALUE - } else if (isWhitespace(c)) { - continue - } else { - fail(parser, 'Attribute without value') - parser.tag.attributes[parser.attribName] = '' - parser.attribValue = '' - emitNode(parser, 'onattribute', { - name: parser.attribName, - value: '' - }) - parser.attribName = '' - if (c === '>') { - openTag(parser) - } else if (isMatch(nameStart, c)) { - parser.attribName = c - parser.state = S.ATTRIB_NAME - } else { - fail(parser, 'Invalid attribute name') - parser.state = S.ATTRIB - } + else { + fail(parser, "Invalid attribute name"); + parser.state = S.ATTRIB; } - continue + } + continue; - case S.ATTRIB_VALUE: - if (isWhitespace(c)) { - continue - } else if (isQuote(c)) { - parser.q = c - parser.state = S.ATTRIB_VALUE_QUOTED - } else { - fail(parser, 'Unquoted attribute value') - parser.state = S.ATTRIB_VALUE_UNQUOTED - parser.attribValue = c - } - continue - - case S.ATTRIB_VALUE_QUOTED: - if (c !== parser.q) { - if (c === '&') { - parser.state = S.ATTRIB_VALUE_ENTITY_Q - } else { - parser.attribValue += c - } - continue - } - attrib(parser) - parser.q = '' - parser.state = S.ATTRIB_VALUE_CLOSED - continue + case S.ATTRIB_VALUE: + if (isWhitespace(c)) { + continue; + } + else if (isQuote(c)) { + parser.q = c; + parser.state = S.ATTRIB_VALUE_QUOTED; + } + else { + fail(parser, "Unquoted attribute value"); + parser.state = S.ATTRIB_VALUE_UNQUOTED; + parser.attribValue = c; + } + continue; - case S.ATTRIB_VALUE_CLOSED: - if (isWhitespace(c)) { - parser.state = S.ATTRIB - } else if (c === '>') { - openTag(parser) - } else if (c === '/') { - parser.state = S.OPEN_TAG_SLASH - } else if (isMatch(nameStart, c)) { - fail(parser, 'No whitespace between attributes') - parser.attribName = c - parser.attribValue = '' - parser.state = S.ATTRIB_NAME - } else { - fail(parser, 'Invalid attribute name') + case S.ATTRIB_VALUE_QUOTED: + if (c !== parser.q) { + if (c === "&") { + parser.state = S.ATTRIB_VALUE_ENTITY_Q; } - continue - - case S.ATTRIB_VALUE_UNQUOTED: - if (!isAttribEnd(c)) { - if (c === '&') { - parser.state = S.ATTRIB_VALUE_ENTITY_U - } else { - parser.attribValue += c - } - continue + else { + parser.attribValue += c; } - attrib(parser) - if (c === '>') { - openTag(parser) - } else { - parser.state = S.ATTRIB + continue; + } + attrib(parser); + parser.q = ""; + parser.state = S.ATTRIB_VALUE_CLOSED; + continue; + + case S.ATTRIB_VALUE_CLOSED: + if (isWhitespace(c)) { + parser.state = S.ATTRIB; + } + else if (c === ">") { + openTag(parser); + } + else if (c === "/") { + parser.state = S.OPEN_TAG_SLASH; + } + else if (isMatch(nameStart, c)) { + fail(parser, "No whitespace between attributes"); + parser.attribName = c; + parser.attribValue = ""; + parser.state = S.ATTRIB_NAME; + } + else { + fail(parser, "Invalid attribute name"); + } + continue; + + case S.ATTRIB_VALUE_UNQUOTED: + if (!isAttribEnd(c)) { + if (c === "&") { + parser.state = S.ATTRIB_VALUE_ENTITY_U; } - continue - - case S.CLOSE_TAG: - if (!parser.tagName) { - if (isWhitespace(c)) { - continue - } else if (notMatch(nameStart, c)) { - fail(parser, 'Invalid tagname in closing tag.') - } else { - parser.tagName = c - } - } else if (c === '>') { - closeTag(parser) - } else if (isMatch(nameBody, c)) { - parser.tagName += c - } else { - if (!isWhitespace(c)) { - fail(parser, 'Invalid tagname in closing tag') - } - parser.state = S.CLOSE_TAG_SAW_WHITE + else { + parser.attribValue += c; } - continue + continue; + } + attrib(parser); + if (c === ">") { + openTag(parser); + } + else { + parser.state = S.ATTRIB; + } + continue; - case S.CLOSE_TAG_SAW_WHITE: + case S.CLOSE_TAG: + if (!parser.tagName) { if (isWhitespace(c)) { - continue + continue; } - if (c === '>') { - closeTag(parser) - } else { - fail(parser, 'Invalid characters in closing tag') + else if (notMatch(nameStart, c)) { + fail(parser, "Invalid tagname in closing tag."); } - continue + else { + parser.tagName = c; + } + } + else if (c === ">") { + closeTag(parser); + } + else if (isMatch(nameBody, c)) { + parser.tagName += c; + } + else { + if (!isWhitespace(c)) { + fail(parser, "Invalid tagname in closing tag"); + } + parser.state = S.CLOSE_TAG_SAW_WHITE; + } + continue; + case S.CLOSE_TAG_SAW_WHITE: + if (isWhitespace(c)) { + continue; + } + if (c === ">") { + closeTag(parser); + } + else { + fail(parser, "Invalid characters in closing tag"); + } + continue; + + case S.TEXT_ENTITY: + case S.ATTRIB_VALUE_ENTITY_Q: + case S.ATTRIB_VALUE_ENTITY_U: { + let returnState; + let buffer; + switch (parser.state) { case S.TEXT_ENTITY: + returnState = S.TEXT; + buffer = "textNode"; + break; + case S.ATTRIB_VALUE_ENTITY_Q: + returnState = S.ATTRIB_VALUE_QUOTED; + buffer = "attribValue"; + break; + case S.ATTRIB_VALUE_ENTITY_U: - var returnState - var buffer - switch (parser.state) { - case S.TEXT_ENTITY: - returnState = S.TEXT - buffer = 'textNode' - break - - case S.ATTRIB_VALUE_ENTITY_Q: - returnState = S.ATTRIB_VALUE_QUOTED - buffer = 'attribValue' - break - - case S.ATTRIB_VALUE_ENTITY_U: - returnState = S.ATTRIB_VALUE_UNQUOTED - buffer = 'attribValue' - break - } + returnState = S.ATTRIB_VALUE_UNQUOTED; + buffer = "attribValue"; + break; - if (c === ';') { - parser[buffer] += parseEntity(parser) - parser.entity = '' - parser.state = returnState - } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) { - parser.entity += c - } else { - fail(parser, 'Invalid character in entity name') - parser[buffer] += '&' + parser.entity + c - parser.entity = '' - parser.state = returnState - } + default: + } - continue + if (c === ";") { + parser[buffer] += parseEntity(parser); + parser.entity = ""; + parser.state = returnState; + } + else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) { + parser.entity += c; + } + else { + fail(parser, "Invalid character in entity name"); + parser[buffer] += `&${parser.entity}${c}`; + parser.entity = ""; + parser.state = returnState; + } - default: - throw new Error(parser, 'Unknown state: ' + parser.state) + continue; + } + default: + throw new Error(parser, `Unknown state: ${parser.state}`); } } // while if (parser.position >= parser.bufferCheckPosition) { - checkBufferLength(parser) + checkBufferLength(parser); } - return parser + return parser; } - /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */ - /* istanbul ignore next */ - if (!String.fromCodePoint) { - (function () { - var stringFromCharCode = String.fromCharCode - var floor = Math.floor - var fromCodePoint = function () { - var MAX_SIZE = 0x4000 - var codeUnits = [] - var highSurrogate - var lowSurrogate - var index = -1 - var length = arguments.length - if (!length) { - return '' - } - var result = '' - while (++index < length) { - var codePoint = Number(arguments[index]) - if ( - !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity` - codePoint < 0 || // not a valid Unicode code point - codePoint > 0x10FFFF || // not a valid Unicode code point - floor(codePoint) !== codePoint // not an integer - ) { - throw RangeError('Invalid code point: ' + codePoint) - } - if (codePoint <= 0xFFFF) { // BMP code point - codeUnits.push(codePoint) - } else { // Astral code point; split in surrogate halves - // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae - codePoint -= 0x10000 - highSurrogate = (codePoint >> 10) + 0xD800 - lowSurrogate = (codePoint % 0x400) + 0xDC00 - codeUnits.push(highSurrogate, lowSurrogate) - } - if (index + 1 === length || codeUnits.length > MAX_SIZE) { - result += stringFromCharCode.apply(null, codeUnits) - codeUnits.length = 0 + resume() { + this.error = null; return this; + } + + close() { + return this.write(null); + } + + flush() { + flushBuffers(this); + } +} + +class SAXStream extends Stream { + constructor(opt) { + super(); + + this._parser = new SAXParser(opt); + this.writable = true; + this.readable = true; + + this._parser.onend = () => { + this.emit("end"); + }; + + this._parser.onerror = (er) => { + this.emit("error", er); + + // if didn't throw, then means error was handled. + // go ahead and clear error, so we can write again. + this._parser.error = null; + }; + + this._decoder = null; + + for (const ev of streamWraps) { + Object.defineProperty(this, `on${ev}`, { + get() { + return this._parser[`on${ev}`]; + }, + set(h) { + if (!h) { + this.removeAllListeners(ev); + this._parser[`on${ev}`] = h; + return; } - } - return result - } - /* istanbul ignore next */ - if (Object.defineProperty) { - Object.defineProperty(String, 'fromCodePoint', { - value: fromCodePoint, - configurable: true, - writable: true - }) - } else { - String.fromCodePoint = fromCodePoint + this.on(ev, h); + }, + enumerable: true, + configurable: false, + }); + } + } + + write(data) { + if (typeof Buffer === "function" && + typeof Buffer.isBuffer === "function" && + Buffer.isBuffer(data)) { + if (!this._decoder) { + // eslint-disable-next-line global-require + const SD = require("string_decoder").StringDecoder; + this._decoder = new SD("utf8"); } - }()) + data = this._decoder.write(data); + } + + this._parser.write(data.toString()); + this.emit("data", data); + return true; + } + + end(chunk) { + if (chunk && chunk.length) { + this.write(chunk); + } + this._parser.end(); + return true; } -})(typeof exports === 'undefined' ? this.sax = {} : exports) + + on(ev, handler) { + if (!this._parser[`on${ev}`] && streamWraps.indexOf(ev) !== -1) { + this._parser[`on${ev}`] = (...args) => { + this.emit(ev, ...args); + }; + } + + return Stream.prototype.on.call(this, ev, handler); + } +} + +function createStream(opt) { + return new SAXStream(opt); +} + + +exports.parser = function parser(opt) { + return new SAXParser(opt); +}; +exports.SAXParser = SAXParser; +exports.SAXStream = SAXStream; +exports.createStream = createStream; diff --git a/package-lock.json b/package-lock.json index c019cccd..ddaf3574 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "sax", + "name": "saxes", "version": "1.2.4", "lockfileVersion": 1, "requires": true, @@ -20,6 +20,43 @@ "lodash.merge": "4.6.1", "lodash.pick": "4.4.0", "meow": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.2.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@commitlint/config-angular": { @@ -67,6 +104,43 @@ "requires": { "babel-runtime": "^6.23.0", "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@commitlint/is-ignored": { @@ -106,6 +180,14 @@ "lodash.pick": "4.4.0", "lodash.topairs": "4.3.0", "resolve-from": "4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } } }, "@commitlint/message": { @@ -148,6 +230,14 @@ "require-uncached": "^1.0.3", "resolve-from": "^4.0.0", "resolve-global": "^0.1.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } } }, "@commitlint/rules": { @@ -186,6 +276,17 @@ "graceful-fs": "^4.1.3", "mkdirp": "^0.5.1", "rimraf": "^2.5.2" + }, + "dependencies": { + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + } } }, "JSONStream": { @@ -199,9 +300,9 @@ } }, "acorn": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.4.tgz", - "integrity": "sha1-F6jWp6bE71OLgU7Jq6wneSk78wo=", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", "dev": true }, "acorn-jsx": { @@ -222,25 +323,27 @@ } }, "ajv": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.2.tgz", - "integrity": "sha1-8WbDwRy8bLncwQKlvP5bcslSh+Y=", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "dev": true }, "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, "ansi-regex": { @@ -264,6 +367,16 @@ "sprintf-js": "~1.0.2" } }, + "aria-query": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.1.tgz", + "integrity": "sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -276,6 +389,16 @@ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -309,6 +432,12 @@ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "dev": true }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -327,22 +456,44 @@ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "dev": true }, + "axobject-query": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", + "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "^1.1.0", + "chalk": "^1.1.3", "esutils": "^2.0.2", - "js-tokens": "^3.0.0" + "js-tokens": "^3.0.2" }, "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } } } }, @@ -375,12 +526,6 @@ "regenerator-runtime": "^0.11.0" } }, - "balanced-match": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", - "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", - "dev": true - }, "bcrypt-pbkdf": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", @@ -412,20 +557,10 @@ "hoek": "2.x.x" } }, - "brace-expansion": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", - "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", - "dev": true, - "requires": { - "balanced-match": "^0.3.0", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", "dev": true }, "builtin-modules": { @@ -493,6 +628,12 @@ } } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "ci-info": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", @@ -500,9 +641,9 @@ "dev": true }, "circular-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", - "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, "clean-yaml-object": { @@ -512,18 +653,18 @@ "dev": true }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "^2.0.0" } }, "cli-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, "co": { @@ -532,15 +673,21 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", - "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "color-name": "1.1.1" } }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, "color-support": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.2.tgz", @@ -556,6 +703,12 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", + "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", + "dev": true + }, "compare-func": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", @@ -573,11 +726,12 @@ "dev": true }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { + "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" @@ -596,28 +750,43 @@ "dev": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "readable-stream": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz", - "integrity": "sha1-qeb+w8fdqF+LsbO6cChgRVb8gl4=", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "buffer-shims": "^1.0.0", "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "conventional-changelog-angular": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", @@ -643,6 +812,12 @@ "trim-off-newlines": "^1.0.0" }, "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, "meow": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", @@ -659,6 +834,12 @@ "redent": "^2.0.0", "trim-newlines": "^2.0.0" } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -684,6 +865,24 @@ "js-yaml": "^3.9.0", "parse-json": "^4.0.0", "require-from-string": "^2.0.1" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } } }, "coveralls": { @@ -772,14 +971,11 @@ "array-find-index": "^1.0.1" } }, - "d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } + "damerau-levenshtein": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", + "dev": true }, "dargs": { "version": "4.1.0", @@ -816,12 +1012,6 @@ "ms": "0.7.1" } }, - "debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -852,43 +1042,14 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "deglob": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz", - "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "find-root": "^1.0.0", - "glob": "^7.0.5", - "ignore": "^3.0.9", - "pkg-config": "^1.1.0", - "run-parallel": "^1.1.2", - "uniq": "^1.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - } + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "del": { @@ -919,27 +1080,12 @@ "dev": true }, "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } + "esutils": "^2.0.2" } }, "dot-prop": { @@ -961,6 +1107,12 @@ "jsbn": "~0.1.0" } }, + "emoji-regex": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", + "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==", + "dev": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -970,396 +1122,479 @@ "is-arrayish": "^0.2.1" } }, - "es5-ext": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.8.tgz", - "integrity": "sha1-9IxDQk+nx9lvkD4pSHBc+Cb2nDI=", + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", "dev": true, "requires": { - "es6-iterator": "2", - "es6-symbol": "3" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, - "es6-iterator": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz", - "integrity": "sha1-vZaFZ9YWNeM8C4BydhPJy0sJa6w=", + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "d": "^0.1.1", - "es5-ext": "^0.10.7", - "es6-symbol": "3" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, - "es6-map": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.4.tgz", - "integrity": "sha1-o0sUe+IkdzpNfagHJ5TO+jYyuJc=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.11", - "es6-iterator": "2", - "es6-set": "~0.1.3", - "es6-symbol": "~3.1.0", - "event-emitter": "~0.3.4" + "escape-string-regexp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz", + "integrity": "sha1-ni2LJbwlVcMzZyN1DgPwmcJzW7U=", + "dev": true + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" }, "dependencies": { - "es5-ext": { - "version": "0.10.12", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.12.tgz", - "integrity": "sha1-qoRkHU23a2Krul5F/YBey6sUAEc=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "es6-iterator": "2", - "es6-symbol": "~3.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "es6-symbol": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.0.tgz", - "integrity": "sha1-lEgcZV56fK2C66gy2X1UM0ltf/o=", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.11" + "has-flag": "^3.0.0" } } } }, - "es6-set": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.4.tgz", - "integrity": "sha1-lRa2dhwpZLkv9HlFYjOiR9xwfOg=", + "eslint-config-airbnb": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz", + "integrity": "sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==", "dev": true, "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.11", - "es6-iterator": "2", - "es6-symbol": "3", - "event-emitter": "~0.3.4" - }, - "dependencies": { - "es5-ext": { - "version": "0.10.12", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.12.tgz", - "integrity": "sha1-qoRkHU23a2Krul5F/YBey6sUAEc=", - "dev": true, - "requires": { - "es6-iterator": "2", - "es6-symbol": "~3.1" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.0.tgz", - "integrity": "sha1-lEgcZV56fK2C66gy2X1UM0ltf/o=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.11" - } - } - } - } + "eslint-config-airbnb-base": "^12.1.0" } }, - "es6-symbol": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.0.0.tgz", - "integrity": "sha1-PsMQg0pQqiRBqTVaRjYNmSQlzrg=", + "eslint-config-airbnb-base": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz", + "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", "dev": true, "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.7" + "eslint-restricted-globals": "^0.1.1" } }, - "es6-weak-map": { + "eslint-config-lddubeau-base": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.1.tgz", - "integrity": "sha1-DSu9iCfrX7S6j5f7/qUNQ9sh6oE=", + "resolved": "https://registry.npmjs.org/eslint-config-lddubeau-base/-/eslint-config-lddubeau-base-2.0.1.tgz", + "integrity": "sha512-/p4EIanl1IJG75PLXyClAcFCJCBisTPEPQwy3hbSCmqvRFJTPxOANcc/0fBIRJ0dZ3VuCn6sfmzV3e0bwV5sVw==", "dev": true, "requires": { - "d": "^0.1.1", - "es5-ext": "^0.10.8", - "es6-iterator": "2", - "es6-symbol": "3" + "eslint-config-airbnb": "^16.1.0", + "eslint-plugin-import": "^2.12.0", + "eslint-plugin-jsx-a11y": "^6.0.3", + "eslint-plugin-react": "^7.8.2" } }, - "escape-string-regexp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz", - "integrity": "sha1-ni2LJbwlVcMzZyN1DgPwmcJzW7U=", - "dev": true - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "dev": true, "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "debug": "^2.6.9", + "resolve": "^1.5.0" }, "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "eslint": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.10.2.tgz", - "integrity": "sha1-yaEOi/bp1lZRIEd4xQM0Hx6sPOc=", + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "dev": true, "requires": { - "babel-code-frame": "^6.16.0", - "chalk": "^1.1.3", - "concat-stream": "^1.4.6", - "debug": "^2.1.1", - "doctrine": "^1.2.2", - "escope": "^3.6.0", - "espree": "^3.3.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.2.0", - "ignore": "^3.2.0", - "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", - "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.7.5", - "strip-bom": "^3.0.0", - "strip-json-comments": "~1.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ms": "2.0.0" } }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + } + } + }, + "eslint-plugin-import": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.13.0.tgz", + "integrity": "sha512-t6hGKQDMIt9N8R7vLepsYXgDfeuhp6ZJSgtrLEDxonpSubyxUZHjhm6LsAaZX8q6GYVxkbT3kTsV9G5mBCFR6A==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ms": "2.0.0" } }, - "js-yaml": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.1.tgz", - "integrity": "sha1-eCulAgC+e55ahTcAG3gE2zrQJig=", + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^3.1.1" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "brace-expansion": "^1.0.0" + "error-ex": "^1.2.0" } }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "pify": "^2.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } } } }, - "eslint-config-standard": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-6.2.1.tgz", - "integrity": "sha1-06aKr8cZFjnn7kQec0hzkCY1QpI=", - "dev": true + "eslint-plugin-jsx-a11y": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz", + "integrity": "sha1-VFg9GuRCSDFi4EDhPMMYZUZRAOU=", + "dev": true, + "requires": { + "aria-query": "^0.7.0", + "array-includes": "^3.0.3", + "ast-types-flow": "0.0.7", + "axobject-query": "^0.1.0", + "damerau-levenshtein": "^1.0.0", + "emoji-regex": "^6.1.0", + "jsx-ast-utils": "^2.0.0" + } }, - "eslint-config-standard-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.2.0.tgz", - "integrity": "sha1-wkDibtkZoRpCqk3oBZRys4Jo1iA=", - "dev": true + "eslint-plugin-react": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.10.0.tgz", + "integrity": "sha512-18rzWn4AtbSUxFKKM7aCVcj5LXOhOKdwBino3KKWy4psxfPW0YtIbE8WNRDUdyHFL50BeLb6qFd4vpvNYyp7hw==", + "dev": true, + "requires": { + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + } }, - "eslint-plugin-promise": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.4.1.tgz", - "integrity": "sha1-aRGpAQv4ThfYLhngqw+AqzrW20w=", + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", "dev": true }, - "eslint-plugin-react": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.7.1.tgz", - "integrity": "sha1-Gvlq6lRYVoJRV9l8G1DVqPtkpac=", + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "doctrine": "^1.2.2", - "jsx-ast-utils": "^1.3.3" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "eslint-plugin-standard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz", - "integrity": "sha1-NYlpn/nJF/LCX3apFmh/ZBw2n/M=", + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", "dev": true }, "espree": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.0.tgz", - "integrity": "sha1-QWVvpWKOBCh4Al70Z+ePEly4bh0=", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "acorn": "4.0.4", + "acorn": "^5.5.0", "acorn-jsx": "^3.0.0" } }, "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, - "esrecurse": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", - "integrity": "sha1-RxO2U2rffyrE8yfVWed1a/9kgiA=", + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { - "estraverse": "~4.1.0", - "object-assign": "^4.0.1" - }, - "dependencies": { - "estraverse": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", - "integrity": "sha1-9srKcokzqFDvkGYdDheYK6RxEaI=", - "dev": true - } + "estraverse": "^4.0.0" } }, - "event-emitter": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz", - "integrity": "sha1-jWPd+0z+H647MsomXExyAiIIC7U=", + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.7" + "estraverse": "^4.1.0" } }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, "events-to-array": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.0.2.tgz", "integrity": "sha1-s0hEZVNP5P9m+90ag7d3cTukBKo=", "dev": true }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } }, "extsprintf": { "version": "1.0.2", @@ -1367,14 +1602,31 @@ "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", "dev": true }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "^1.0.5" }, "dependencies": { "escape-string-regexp": { @@ -1395,12 +1647,6 @@ "object-assign": "^4.0.1" } }, - "find-root": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.0.0.tgz", - "integrity": "sha1-li/yEaqyXGUg/u641ih/j26VgHo=", - "dev": true - }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -1411,9 +1657,9 @@ } }, "flat-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { "circular-json": "^0.3.1", @@ -1422,6 +1668,12 @@ "write": "^0.2.1" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, "foreground-child": { "version": "1.5.6", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", @@ -1469,12 +1721,24 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "function-loop": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.1.tgz", "integrity": "sha1-gHa7MF6OajzO7ikgdl8zDRkPNAw=", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "generate-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", @@ -1542,6 +1806,12 @@ "redent": "^2.0.0", "trim-newlines": "^2.0.0" } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -1569,9 +1839,9 @@ } }, "globals": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.14.0.tgz", - "integrity": "sha1-iFmTavADh0EmMFOznQ52yiQeQDQ=", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", "dev": true }, "globby": { @@ -1586,31 +1856,6 @@ "object-assign": "^4.0.1", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - } } }, "graceful-fs": { @@ -1681,6 +1926,15 @@ } } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -1690,6 +1944,12 @@ "ansi-regex": "^2.0.0" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "hawk": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", @@ -1708,16 +1968,6 @@ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, "hosted-git-info": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz", @@ -1746,10 +1996,19 @@ "strip-indent": "^2.0.0" } }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ignore": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.2.tgz", - "integrity": "sha1-HFHh71O6tt3BXbTZrE7BOezrNBA=", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, "imurmurhash": { @@ -1787,40 +2046,85 @@ "dev": true }, "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "figures": "^1.3.5", + "external-editor": "^2.0.4", + "figures": "^2.0.0", "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", "through": "^2.3.6" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "interpret": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz", - "integrity": "sha1-1Xn7f2k7hYAElHrzn6DbSfeVYCw=", - "dev": true - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -1836,6 +2140,12 @@ "builtin-modules": "^1.0.0" } }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, "is-ci": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", @@ -1845,6 +2155,12 @@ "ci-info": "^1.0.0" } }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -1852,25 +2168,10 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-my-json-valid": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz", - "integrity": "sha1-k27do8o8IR/ZjzstPgjaQ/eykVs=", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-obj": { "version": "1.0.1", @@ -1885,18 +2186,18 @@ "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { "is-path-inside": "^1.0.0" } }, "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { "path-is-inside": "^1.0.1" @@ -1908,21 +2209,39 @@ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", "dev": true }, - "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "^1.0.1" - } - }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, "is-text-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", @@ -1967,9 +2286,9 @@ } }, "js-tokens": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", - "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, "js-yaml": { @@ -2019,14 +2338,17 @@ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, - "json-stable-stringify": { + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -2034,24 +2356,12 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, "jsprim": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", @@ -2064,12 +2374,12 @@ } }, "jsx-ast-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.0.tgz", - "integrity": "sha1-Wv44ho9WvIzHrq7wEAuox1vRJZE=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", "dev": true, "requires": { - "object-assign": "^4.1.0" + "array-includes": "^3.0.3" } }, "lcov-parse": { @@ -2078,6 +2388,16 @@ "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", "dev": true }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -2088,6 +2408,14 @@ "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "locate-path": { @@ -2197,6 +2525,15 @@ "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", "dev": true }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0" + } + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -2207,6 +2544,24 @@ "signal-exit": "^3.0.0" } }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + }, + "dependencies": { + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", @@ -2245,6 +2600,12 @@ "mime-db": "~1.26.0" } }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2304,9 +2665,9 @@ "dev": true }, "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "natural-compare": { @@ -2351,6 +2712,12 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, "once": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", @@ -2361,10 +2728,13 @@ } }, "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } }, "opener": { "version": "1.4.2", @@ -2372,6 +2742,20 @@ "integrity": "sha1-syWCCABCr4aAw4mkmRdbTFT/9SM=", "dev": true }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, "os-homedir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", @@ -2448,6 +2832,12 @@ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -2455,6 +2845,14 @@ "dev": true, "requires": { "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "pify": { @@ -2478,29 +2876,40 @@ "pinkie": "^2.0.0" } }, - "pkg-config": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", - "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "debug-log": "^1.0.0", - "find-root": "^1.0.0", - "xtend": "^4.0.1" + "find-up": "^1.0.0" }, "dependencies": { - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } } } }, "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, "prelude-ls": { @@ -2516,11 +2925,21 @@ "dev": true }, "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -2586,26 +3005,6 @@ "util-deprecate": "~1.0.1" } }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "mute-stream": "0.0.5" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, "redent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", @@ -2622,6 +3021,12 @@ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, "request": { "version": "2.79.0", "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", @@ -2675,10 +3080,13 @@ } }, "resolve": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.6.tgz", - "integrity": "sha1-00kq0FTKgA9b76YS5hvqwe7Jj48=", - "dev": true + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } }, "resolve-from": { "version": "1.0.1", @@ -2696,66 +3104,59 @@ } }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "rimraf": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz", - "integrity": "sha1-5bUclDekxYKtuVXp8oz42UXicq8=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "^5.0.14" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "glob": "^7.0.5" } }, "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "once": "^1.3.0" + "is-promise": "^2.1.0" } }, - "run-parallel": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.6.tgz", - "integrity": "sha1-KQA8miFj4B4tLfyQV18sbB1hoDk=", - "dev": true - }, "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "dev": true }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true, - "optional": true + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "semver": { "version": "5.5.0", @@ -2763,42 +3164,21 @@ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, - "shelljs": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.6.tgz", - "integrity": "sha1-N5zM+1a5HIYB5HkzVutTgpJN6a0=", + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "dependencies": { - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - } + "shebang-regex": "^1.0.0" } }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -2806,10 +3186,13 @@ "dev": true }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } }, "sntp": { "version": "1.0.9", @@ -2915,54 +3298,33 @@ "integrity": "sha1-I5LNjdvSIkku1sBHlg90FLRsD4M=", "dev": true }, - "standard": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/standard/-/standard-8.6.0.tgz", - "integrity": "sha1-Y1Eyvnv7VnwpIQBfMPnjUOR1Kq0=", - "dev": true, - "requires": { - "eslint": "~3.10.2", - "eslint-config-standard": "6.2.1", - "eslint-config-standard-jsx": "3.2.0", - "eslint-plugin-promise": "~3.4.0", - "eslint-plugin-react": "~6.7.1", - "eslint-plugin-standard": "~2.0.1", - "standard-engine": "~5.2.0" - } - }, - "standard-engine": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-5.2.0.tgz", - "integrity": "sha1-QAZgrlrM6K/U22D/IhSpGQrXkKM=", + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "deglob": "^2.0.0", - "find-root": "^1.0.0", - "get-stdin": "^5.0.1", - "home-or-tmp": "^2.0.0", - "minimist": "^1.1.0", - "pkg-config": "^1.0.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } } } }, - "string-width": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", - "integrity": "sha1-ySEptvHX9SrPmvQkom44ZKBc6wo=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -2997,9 +3359,9 @@ "dev": true }, "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { @@ -3009,39 +3371,58 @@ "dev": true }, "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", - "slice-ansi": "0.0.4", - "string-width": "^2.0.0" + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^3.0.0" + "has-flag": "^3.0.0" } } } @@ -4786,6 +5167,65 @@ "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" } }, "tough-cookie": { @@ -4815,12 +5255,6 @@ "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", "dev": true }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, "tsame": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/tsame/-/tsame-1.1.2.tgz", @@ -4840,6 +5274,15 @@ "dev": true, "optional": true }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -4867,21 +5310,6 @@ } } }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - } - }, "util-deprecate": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.1.tgz", @@ -4913,6 +5341,23 @@ "extsprintf": "1.0.2" } }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + }, + "dependencies": { + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + } + } + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 4681e230..f349233a 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "license": "ISC", "scripts": { "test": "tap test/*.js --cov -j4", - "posttest": "standard -F test/*.js lib/*.js", + "posttest": "eslint test/*.js lib/*.js", "preversion": "npm test", "postversion": "npm publish", "postpublish": "git push origin --all; git push origin --tags", @@ -22,8 +22,9 @@ "devDependencies": { "@commitlint/cli": "^7.0.0", "@commitlint/config-angular": "^7.0.1", + "eslint": "^4.19.1", + "eslint-config-lddubeau-base": "^2.0.1", "husky": "^0.14.3", - "standard": "^8.6.0", "tap": "^10.5.1" } } diff --git a/test/attribute-name.js b/test/attribute-name.js index ecb85b7e..1dbad00d 100644 --- a/test/attribute-name.js +++ b/test/attribute-name.js @@ -1,43 +1,45 @@ -require(__dirname).test({ +"use strict"; + +require(".").test({ xml: "", expect: [ - [ 'opentagstart', { name: 'root', attributes: {}, ns: {} } ], + ["opentagstart", { name: "root", attributes: {}, ns: {} }], [ - 'attribute', + "attribute", { - name: 'length', - value: '12345', - prefix: '', - local: 'length', - uri: '' - } + name: "length", + value: "12345", + prefix: "", + local: "length", + uri: "", + }, ], [ - 'opentag', + "opentag", { - name: 'root', - prefix: '', - local: 'root', - uri: '', + name: "root", + prefix: "", + local: "root", + uri: "", attributes: { length: { - name: 'length', - value: '12345', - prefix: '', - local: 'length', - uri: '' - } + name: "length", + value: "12345", + prefix: "", + local: "length", + uri: "", + }, }, ns: {}, - isSelfClosing: false - } + isSelfClosing: false, + }, ], [ - 'closetag', - 'root' - ] + "closetag", + "root", + ], ], opt: { - xmlns: true - } -}) + xmlns: true, + }, +}); diff --git a/test/attribute-no-space.js b/test/attribute-no-space.js index 9a2441e5..2217c455 100644 --- a/test/attribute-no-space.js +++ b/test/attribute-no-space.js @@ -1,52 +1,54 @@ +"use strict"; + // should give an error, but still parse -require(__dirname).test({ - xml: '', +require(".").test({ + xml: "", expect: [ - [ 'opentagstart', { name: 'root', attributes: {} } ], - [ 'attribute', { name: 'attr1', value: 'first' } ], - [ 'error', 'No whitespace between attributes\nLine: 0\nColumn: 20\nChar: a' ], - [ 'attribute', { name: 'attr2', value: 'second' } ], - [ 'opentag', { name: 'root', attributes: { attr1: 'first', attr2: 'second' }, isSelfClosing: true } ], - [ 'closetag', 'root' ] + ["opentagstart", { name: "root", attributes: {} }], + ["attribute", { name: "attr1", value: "first" }], + ["error", "No whitespace between attributes\nLine: 0\nColumn: 20\nChar: a"], + ["attribute", { name: "attr2", value: "second" }], + ["opentag", { name: "root", attributes: { attr1: "first", attr2: "second" }, isSelfClosing: true }], + ["closetag", "root"], ], - opt: { } -}) + opt: { }, +}); // other cases should still pass -require(__dirname).test({ - xml: '', +require(".").test({ + xml: "", expect: [ - [ 'opentagstart', { name: 'root', attributes: {} } ], - [ 'attribute', { name: 'attr1', value: 'first' } ], - [ 'attribute', { name: 'attr2', value: 'second' } ], - [ 'opentag', { name: 'root', attributes: { attr1: 'first', attr2: 'second' }, isSelfClosing: true } ], - [ 'closetag', 'root' ] + ["opentagstart", { name: "root", attributes: {} }], + ["attribute", { name: "attr1", value: "first" }], + ["attribute", { name: "attr2", value: "second" }], + ["opentag", { name: "root", attributes: { attr1: "first", attr2: "second" }, isSelfClosing: true }], + ["closetag", "root"], ], - opt: { } -}) + opt: { }, +}); // other cases should still pass -require(__dirname).test({ - xml: '', +require(".").test({ + xml: "", expect: [ - [ 'opentagstart', { name: 'root', attributes: {} } ], - [ 'attribute', { name: 'attr1', value: 'first' } ], - [ 'attribute', { name: 'attr2', value: 'second' } ], - [ 'opentag', { name: 'root', attributes: { attr1: 'first', attr2: 'second' }, isSelfClosing: true } ], - [ 'closetag', 'root' ] + ["opentagstart", { name: "root", attributes: {} }], + ["attribute", { name: "attr1", value: "first" }], + ["attribute", { name: "attr2", value: "second" }], + ["opentag", { name: "root", attributes: { attr1: "first", attr2: "second" }, isSelfClosing: true }], + ["closetag", "root"], ], - opt: { } -}) + opt: { }, +}); // other cases should still pass -require(__dirname).test({ - xml: '', +require(".").test({ + xml: "", expect: [ - [ 'opentagstart', { name: 'root', attributes: {} } ], - [ 'attribute', { name: 'attr1', value: 'first' } ], - [ 'attribute', { name: 'attr2', value: 'second' } ], - [ 'opentag', { name: 'root', attributes: { attr1: 'first', attr2: 'second' }, isSelfClosing: true } ], - [ 'closetag', 'root' ] + ["opentagstart", { name: "root", attributes: {} }], + ["attribute", { name: "attr1", value: "first" }], + ["attribute", { name: "attr2", value: "second" }], + ["opentag", { name: "root", attributes: { attr1: "first", attr2: "second" }, isSelfClosing: true }], + ["closetag", "root"], ], - opt: { } -}) + opt: { }, +}); diff --git a/test/attribute-unquoted.js b/test/attribute-unquoted.js index ace9a667..cb0663e9 100644 --- a/test/attribute-unquoted.js +++ b/test/attribute-unquoted.js @@ -1,39 +1,42 @@ -require(__dirname).test({ +"use strict"; + +require(".").test({ expect: [ - [ 'opentagstart', { name: 'root', attributes: {}, ns: {} } ], - [ 'error', "Unquoted attribute value\n\ + ["opentagstart", { name: "root", attributes: {}, ns: {} }], + ["error", "Unquoted attribute value\n\ Line: 0\n\ Column: 14\n\ -Char: 1" ], - [ 'attribute', { - name: 'length', - value: '12345', - prefix: '', - local: 'length', - uri: '' +Char: 1"], + ["attribute", { + name: "length", + value: "12345", + prefix: "", + local: "length", + uri: "", }], - [ 'opentag', { - name: 'root', + ["opentag", { + name: "root", attributes: { length: { - name: 'length', - value: '12345', - prefix: '', - local: 'length', - uri: '' - } + name: "length", + value: "12345", + prefix: "", + local: "length", + uri: "", + }, }, ns: {}, - prefix: '', - local: 'root', - uri: '', - isSelfClosing: false - } ], - [ 'closetag', 'root' ], - [ 'end' ], - [ 'ready' ] + prefix: "", + local: "root", + uri: "", + isSelfClosing: false, + }], + ["closetag", "root"], + ["end"], + ["ready"], ], opt: { - xmlns: true - } -}).write('').close() + xmlns: true, + }, +}).write("") +.close(); diff --git a/test/bom.js b/test/bom.js index 9fb6de7f..ae36cc9d 100644 --- a/test/bom.js +++ b/test/bom.js @@ -1,45 +1,47 @@ +"use strict"; + // BOM at the very begining of the stream should be ignored -require(__dirname).test({ - xml: '\uFEFF

', +require(".").test({ + xml: "\uFEFF

", expect: [ - ['opentagstart', {'name': 'P', attributes: {}}], - ['opentag', {'name': 'P', attributes: {}, isSelfClosing: false}], - ['closetag', 'P'] - ] -}) + ["opentagstart", { name: "P", attributes: {} }], + ["opentag", { name: "P", attributes: {}, isSelfClosing: false }], + ["closetag", "P"], + ], +}); // In all other places it should be consumed -require(__dirname).test({ - xml: '\uFEFF

\uFEFFStarts and ends with BOM\uFEFF

', +require(".").test({ + xml: "\uFEFF

\uFEFFStarts and ends with BOM\uFEFF

", expect: [ - ['opentagstart', {'name': 'P', attributes: {}}], - ['attribute', {'name': 'BOM', 'value': '\uFEFF'}], - ['opentag', {'name': 'P', attributes: {'BOM': '\uFEFF'}, isSelfClosing: false}], - ['text', '\uFEFFStarts and ends with BOM\uFEFF'], - ['closetag', 'P'] - ] -}) + ["opentagstart", { name: "P", attributes: {} }], + ["attribute", { name: "BOM", value: "\uFEFF" }], + ["opentag", { name: "P", attributes: { BOM: "\uFEFF" }, isSelfClosing: false }], + ["text", "\uFEFFStarts and ends with BOM\uFEFF"], + ["closetag", "P"], + ], +}); // BOM after a whitespace is an error -require(__dirname).test({ - xml: ' \uFEFF

', +require(".").test({ + xml: " \uFEFF

", expect: [ - ['error', 'Non-whitespace before first tag.\nLine: 0\nColumn: 2\nChar: \uFEFF'], - ['text', '\uFEFF'], - ['opentagstart', {'name': 'P', attributes: {}}], - ['opentag', {'name': 'P', attributes: {}, isSelfClosing: false}], - ['closetag', 'P'] + ["error", "Non-whitespace before first tag.\nLine: 0\nColumn: 2\nChar: \uFEFF"], + ["text", "\uFEFF"], + ["opentagstart", { name: "P", attributes: {} }], + ["opentag", { name: "P", attributes: {}, isSelfClosing: false }], + ["closetag", "P"], ], -}) +}); // There is only one BOM allowed at the start -require(__dirname).test({ - xml: '\uFEFF\uFEFF

', +require(".").test({ + xml: "\uFEFF\uFEFF

", expect: [ - ['error', 'Non-whitespace before first tag.\nLine: 0\nColumn: 2\nChar: \uFEFF'], - ['text', '\uFEFF'], - ['opentagstart', {'name': 'P', attributes: {}}], - ['opentag', {'name': 'P', attributes: {}, isSelfClosing: false}], - ['closetag', 'P'] + ["error", "Non-whitespace before first tag.\nLine: 0\nColumn: 2\nChar: \uFEFF"], + ["text", "\uFEFF"], + ["opentagstart", { name: "P", attributes: {} }], + ["opentag", { name: "P", attributes: {}, isSelfClosing: false }], + ["closetag", "P"], ], -}) +}); diff --git a/test/buffer-overrun.js b/test/buffer-overrun.js index 0847772c..b579c01b 100644 --- a/test/buffer-overrun.js +++ b/test/buffer-overrun.js @@ -1,30 +1,34 @@ +"use strict"; + // set this really low so that I don't have to put 64 MB of xml in here. -var saxes = require('../lib/saxes') -var bl = saxes.MAX_BUFFER_LENGTH -saxes.MAX_BUFFER_LENGTH = 5 +const saxes = require("../lib/saxes"); + +const bl = saxes.MAX_BUFFER_LENGTH; +saxes.MAX_BUFFER_LENGTH = 5; -require(__dirname).test({ +require(".").test({ expect: [ - ['error', 'Max buffer length exceeded: tagName\nLine: 0\nColumn: 15\nChar: '], - ['error', 'Max buffer length exceeded: tagName\nLine: 0\nColumn: 30\nChar: '], - ['error', 'Max buffer length exceeded: tagName\nLine: 0\nColumn: 45\nChar: '], - ['opentagstart', { - 'name': 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', - 'attributes': {} + ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 15\nChar: "], + ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 30\nChar: "], + ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 45\nChar: "], + ["opentagstart", { + name: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + attributes: {}, }], - ['opentag', { - 'name': 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', - 'attributes': {}, - 'isSelfClosing': false + ["opentag", { + name: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + attributes: {}, + isSelfClosing: false, }], - ['text', 'yo'], - ['closetag', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'] - ] -}).write('') - .write('yo') - .write('') - .close() -saxes.MAX_BUFFER_LENGTH = bl + ["text", "yo"], + ["closetag", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"], + ], +}).write("") + .write("yo") + .write("") + .close(); + +saxes.MAX_BUFFER_LENGTH = bl; diff --git a/test/cdata-chunked.js b/test/cdata-chunked.js index 1fba7a68..dfa1c347 100644 --- a/test/cdata-chunked.js +++ b/test/cdata-chunked.js @@ -1,10 +1,14 @@ -require(__dirname).test({ +"use strict"; + +require(".").test({ expect: [ - ['opentagstart', {'name': 'r', 'attributes': {}}], - ['opentag', {'name': 'r', 'attributes': {}, 'isSelfClosing': false}], - ['opencdata', undefined], - ['cdata', ' this is character data  '], - ['closecdata', undefined], - ['closetag', 'r'] - ] -}).write('').close() + ["opentagstart", { name: "r", attributes: {} }], + ["opentag", { name: "r", attributes: {}, isSelfClosing: false }], + ["opencdata", undefined], + ["cdata", " this is character data  "], + ["closecdata", undefined], + ["closetag", "r"], + ], +}).write("") +.close(); diff --git a/test/cdata-end-split.js b/test/cdata-end-split.js index 65e5a9cf..bcd57a4f 100644 --- a/test/cdata-end-split.js +++ b/test/cdata-end-split.js @@ -1,14 +1,16 @@ -require(__dirname).test({ +"use strict"; + +require(".").test({ expect: [ - ['opentagstart', {'name': 'r', 'attributes': {}}], - ['opentag', {'name': 'r', 'attributes': {}, 'isSelfClosing': false}], - ['opencdata', undefined], - ['cdata', ' this is '], - ['closecdata', undefined], - ['closetag', 'r'] - ] + ["opentagstart", { name: "r", attributes: {} }], + ["opentag", { name: "r", attributes: {}, isSelfClosing: false }], + ["opencdata", undefined], + ["cdata", " this is "], + ["closecdata", undefined], + ["closetag", "r"], + ], }) - .write('') - .write('') - .close() + .write("") + .write("") + .close(); diff --git a/test/cdata-fake-end.js b/test/cdata-fake-end.js index e9713b5e..aa81b6ae 100644 --- a/test/cdata-fake-end.js +++ b/test/cdata-fake-end.js @@ -1,28 +1,32 @@ -var p = require(__dirname).test({ +"use strict"; + +const p = require(".").test({ expect: [ - ['opentagstart', {'name': 'r', 'attributes': {}}], - ['opentag', {'name': 'r', 'attributes': {}, 'isSelfClosing': false}], - ['opencdata', undefined], - ['cdata', '[[[[[[[[]]]]]]]]'], - ['closecdata', undefined], - ['closetag', 'r'] - ] -}) -var x = '' -for (var i = 0; i < x.length; i++) { - p.write(x.charAt(i)) + ["opentagstart", { name: "r", attributes: {} }], + ["opentag", { name: "r", attributes: {}, isSelfClosing: false }], + ["opencdata", undefined], + ["cdata", "[[[[[[[[]]]]]]]]"], + ["closecdata", undefined], + ["closetag", "r"], + ], +}); + +let x = ""; +for (let i = 0; i < x.length; i++) { + p.write(x.charAt(i)); } -p.close() +p.close(); -var p2 = require(__dirname).test({ +const p2 = require(".").test({ expect: [ - ['opentagstart', {'name': 'r', 'attributes': {}}], - ['opentag', {'name': 'r', 'attributes': {}, 'isSelfClosing': false}], - ['opencdata', undefined], - ['cdata', '[[[[[[[[]]]]]]]]'], - ['closecdata', undefined], - ['closetag', 'r'] - ] -}) -x = '' -p2.write(x).close() + ["opentagstart", { name: "r", attributes: {} }], + ["opentag", { name: "r", attributes: {}, isSelfClosing: false }], + ["opencdata", undefined], + ["cdata", "[[[[[[[[]]]]]]]]"], + ["closecdata", undefined], + ["closetag", "r"], + ], +}); + +x = ""; +p2.write(x).close(); diff --git a/test/cdata-multiple.js b/test/cdata-multiple.js index 9ef2452b..8e0f349a 100644 --- a/test/cdata-multiple.js +++ b/test/cdata-multiple.js @@ -1,14 +1,20 @@ -require(__dirname).test({ +"use strict"; + +require(".").test({ expect: [ - ['opentagstart', {'name': 'r', 'attributes': {}}], - ['opentag', {'name': 'r', 'attributes': {}, 'isSelfClosing': false}], - ['opencdata', undefined], - ['cdata', ' this is '], - ['closecdata', undefined], - ['opencdata', undefined], - ['cdata', 'character data  '], - ['closecdata', undefined], - ['closetag', 'r'] - ] -}).write('').write('').close() + ["opentagstart", { name: "r", attributes: {} }], + ["opentag", { name: "r", attributes: {}, isSelfClosing: false }], + ["opencdata", undefined], + ["cdata", " this is "], + ["closecdata", undefined], + ["opencdata", undefined], + ["cdata", "character data  "], + ["closecdata", undefined], + ["closetag", "r"], + ], +}).write("").write("") +.close(); diff --git a/test/cdata.js b/test/cdata.js index 0b34b0e2..4034cff8 100644 --- a/test/cdata.js +++ b/test/cdata.js @@ -1,11 +1,13 @@ -require(__dirname).test({ - xml: '', +"use strict"; + +require(".").test({ + xml: "", expect: [ - ['opentagstart', {'name': 'r', 'attributes': {}}], - ['opentag', {'name': 'r', 'attributes': {}, 'isSelfClosing': false}], - ['opencdata', undefined], - ['cdata', ' this is character data  '], - ['closecdata', undefined], - ['closetag', 'r'] - ] -}) + ["opentagstart", { name: "r", attributes: {} }], + ["opentag", { name: "r", attributes: {}, isSelfClosing: false }], + ["opencdata", undefined], + ["cdata", " this is character data  "], + ["closecdata", undefined], + ["closetag", "r"], + ], +}); diff --git a/test/cyrillic.js b/test/cyrillic.js index 2740f069..65af3be9 100644 --- a/test/cyrillic.js +++ b/test/cyrillic.js @@ -1,9 +1,11 @@ -require(__dirname).test({ - xml: '<Р>тест', +"use strict"; + +require(".").test({ + xml: "<Р>тест", expect: [ - ['opentagstart', {'name': 'Р', attributes: {}}], - ['opentag', {'name': 'Р', attributes: {}, isSelfClosing: false}], - ['text', 'тест'], - ['closetag', 'Р'] - ] -}) + ["opentagstart", { name: "Р", attributes: {} }], + ["opentag", { name: "Р", attributes: {}, isSelfClosing: false }], + ["text", "тест"], + ["closetag", "Р"], + ], +}); diff --git a/test/duplicate-attribute.js b/test/duplicate-attribute.js index ca0e191f..1a321430 100644 --- a/test/duplicate-attribute.js +++ b/test/duplicate-attribute.js @@ -1,17 +1,19 @@ -require(__dirname).test({ - xml: '', +"use strict"; + +require(".").test({ + xml: "", expect: [ - [ 'opentagstart', { - name: 'span', - attributes: {} - } ], - [ 'attribute', { name: 'id', value: 'hello' } ], - [ 'opentag', { - name: 'span', - attributes: { id: 'hello' }, - isSelfClosing: false - } ], - [ 'closetag', 'span' ] + ["opentagstart", { + name: "span", + attributes: {}, + }], + ["attribute", { name: "id", value: "hello" }], + ["opentag", { + name: "span", + attributes: { id: "hello" }, + isSelfClosing: false, + }], + ["closetag", "span"], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/emoji.js b/test/emoji.js index ea86bf84..934de97d 100644 --- a/test/emoji.js +++ b/test/emoji.js @@ -1,11 +1,13 @@ +"use strict"; + // split high-order numeric attributes into surrogate pairs -require(__dirname).test({ - xml: '🔥', +require(".").test({ + xml: "🔥", expect: [ - [ 'opentagstart', { name: 'a', attributes: {} } ], - [ 'opentag', { name: 'a', attributes: {}, isSelfClosing: false } ], - [ 'text', '\ud83d\udd25' ], - [ 'closetag', 'a' ] + ["opentagstart", { name: "a", attributes: {} }], + ["opentag", { name: "a", attributes: {}, isSelfClosing: false }], + ["text", "\ud83d\udd25"], + ["closetag", "a"], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/end_empty_stream.js b/test/end_empty_stream.js index bb8d5e0a..5ccaaefa 100644 --- a/test/end_empty_stream.js +++ b/test/end_empty_stream.js @@ -1,5 +1,8 @@ -var tap = require('tap') -var saxesStream = require('../lib/saxes').createStream() -tap.doesNotThrow(function () { - saxesStream.end() -}) +"use strict"; + +const tap = require("tap"); +const saxesStream = require("../lib/saxes").createStream(); + +tap.doesNotThrow(() => { + saxesStream.end(); +}); diff --git a/test/entities.js b/test/entities.js index 6e062e55..61ae2b1d 100644 --- a/test/entities.js +++ b/test/entities.js @@ -1,9 +1,11 @@ -require(__dirname).test({ - xml: '& < > >', +"use strict"; + +require(".").test({ + xml: "& < > >", expect: [ - ['opentagstart', {'name': 'r', attributes: {}}], - ['opentag', {'name': 'r', attributes: {}, isSelfClosing: false}], - ['text', '& < > >'], - ['closetag', 'r'] - ] -}) + ["opentagstart", { name: "r", attributes: {} }], + ["opentag", { name: "r", attributes: {}, isSelfClosing: false }], + ["text", "& < > >"], + ["closetag", "r"], + ], +}); diff --git a/test/entity-nan.js b/test/entity-nan.js index 4565b43f..72e3beae 100644 --- a/test/entity-nan.js +++ b/test/entity-nan.js @@ -1,13 +1,15 @@ -require(__dirname).test({ - xml: '&#NaN;', +"use strict"; + +require(".").test({ + xml: "&#NaN;", expect: [ - ['opentagstart', {'name': 'r', attributes: {}}], - ['opentag', {'name': 'r', attributes: {}, isSelfClosing: false}], - ['error', 'Invalid character entity\n\ + ["opentagstart", { name: "r", attributes: {} }], + ["opentag", { name: "r", attributes: {}, isSelfClosing: false }], + ["error", "Invalid character entity\n\ Line: 0\n\ Column: 9\n\ -Char: ;'], - ['text', '&#NaN;'], - ['closetag', 'r'] - ] -}) +Char: ;"], + ["text", "&#NaN;"], + ["closetag", "r"], + ], +}); diff --git a/test/flush.js b/test/flush.js index b8b21e97..9898e657 100644 --- a/test/flush.js +++ b/test/flush.js @@ -1,14 +1,16 @@ -var parser = require(__dirname).test({ +"use strict"; + +const parser = require(".").test({ expect: [ - ['opentagstart', {'name': 'T', attributes: {}}], - ['opentag', {'name': 'T', attributes: {}, isSelfClosing: false}], - ['text', 'flush'], - ['text', 'rest'], - ['closetag', 'T'] - ] -}) + ["opentagstart", { name: "T", attributes: {} }], + ["opentag", { name: "T", attributes: {}, isSelfClosing: false }], + ["text", "flush"], + ["text", "rest"], + ["closetag", "T"], + ], +}); -parser.write('flush') -parser.flush() -parser.write('rest') -parser.close() +parser.write("flush"); +parser.flush(); +parser.write("rest"); +parser.close(); diff --git a/test/index.js b/test/index.js index 3e6681cc..9ef51ee5 100644 --- a/test/index.js +++ b/test/index.js @@ -1,57 +1,60 @@ -var saxes = require('../lib/saxes') +"use strict"; -var t = require('tap') +const saxes = require("../lib/saxes"); -exports.saxes = saxes +const t = require("tap"); + +exports.saxes = saxes; // handy way to do simple unit tests // if the options contains an xml string, it'll be written and the parser closed. // otherwise, it's assumed that the test will write and close. -exports.test = function test (options) { - var xml = options.xml - var parser = saxes.parser(options.opt) - var expect = options.expect - var e = 0 - saxes.EVENTS.forEach(function (ev) { - parser['on' + ev] = function (n) { +exports.test = function test(options) { + const { xml, expect } = options; + const parser = saxes.parser(options.opt); + let e = 0; + saxes.EVENTS.forEach((ev) => { + parser[`on${ev}`] = function handler(n) { if (process.env.DEBUG) { + // eslint-disable-next-line no-console console.error({ expect: expect[e], - actual: [ev, n] - }) + actual: [ev, n], + }); } - if (e >= expect.length && (ev === 'end' || ev === 'ready')) { - return + if (e >= expect.length && (ev === "end" || ev === "ready")) { + return; } - t.ok(e < expect.length, 'no unexpected events') + t.ok(e < expect.length, "no unexpected events"); if (!expect[e]) { - t.fail('did not expect this event', { + t.fail("did not expect this event", { event: ev, - expect: expect, - data: n - }) - return + expect, + data: n, + }); + return; } - t.equal(ev, expect[e][0]) - if (ev === 'error') { - t.equal(n.message, expect[e][1]) - } else { - t.deepEqual(n, expect[e][1]) + t.equal(ev, expect[e][0]); + if (ev === "error") { + t.equal(n.message, expect[e][1]); + } + else { + t.deepEqual(n, expect[e][1]); } - e++ - if (ev === 'error') { - parser.resume() + e++; + if (ev === "error") { + parser.resume(); } - } - }) + }; + }); if (xml) { - parser.write(xml).close() + parser.write(xml).close(); } - return parser -} + return parser; +}; if (module === require.main) { - t.pass('common test file') + t.pass("common test file"); } diff --git a/test/issue-23.js b/test/issue-23.js index fcd0436a..80216a02 100644 --- a/test/issue-23.js +++ b/test/issue-23.js @@ -1,45 +1,47 @@ -require(__dirname).test({ - xml: '' + - '' + - '653724009' + - '-1' + - '01pG0000002KoSUIA0' + - '-1' + - 'CalendarController' + - 'true' + - '' + - '', +"use strict"; + +require(".").test({ + xml: "" + + "" + + "653724009" + + "-1" + + "01pG0000002KoSUIA0" + + "-1" + + "CalendarController" + + "true" + + "" + + "", expect: [ - [ 'opentagstart', { name: 'compileClassesResponse', attributes: {} } ], - [ 'opentag', { name: 'compileClassesResponse', attributes: {}, isSelfClosing: false } ], - [ 'opentagstart', { name: 'result', attributes: {} } ], - [ 'opentag', { name: 'result', attributes: {}, isSelfClosing: false } ], - [ 'opentagstart', { name: 'bodyCrc', attributes: {} } ], - [ 'opentag', { name: 'bodyCrc', attributes: {}, isSelfClosing: false } ], - [ 'text', '653724009' ], - [ 'closetag', 'bodyCrc' ], - [ 'opentagstart', { name: 'column', attributes: {} } ], - [ 'opentag', { name: 'column', attributes: {}, isSelfClosing: false } ], - [ 'text', '-1' ], - [ 'closetag', 'column' ], - [ 'opentagstart', { name: 'id', attributes: {} } ], - [ 'opentag', { name: 'id', attributes: {}, isSelfClosing: false } ], - [ 'text', '01pG0000002KoSUIA0' ], - [ 'closetag', 'id' ], - [ 'opentagstart', { name: 'line', attributes: {} } ], - [ 'opentag', { name: 'line', attributes: {}, isSelfClosing: false } ], - [ 'text', '-1' ], - [ 'closetag', 'line' ], - [ 'opentagstart', { name: 'name', attributes: {} } ], - [ 'opentag', { name: 'name', attributes: {}, isSelfClosing: false } ], - [ 'text', 'CalendarController' ], - [ 'closetag', 'name' ], - [ 'opentagstart', { name: 'success', attributes: {} } ], - [ 'opentag', { name: 'success', attributes: {}, isSelfClosing: false } ], - [ 'text', 'true' ], - [ 'closetag', 'success' ], - [ 'closetag', 'result' ], - [ 'closetag', 'compileClassesResponse' ] + ["opentagstart", { name: "compileClassesResponse", attributes: {} }], + ["opentag", { name: "compileClassesResponse", attributes: {}, isSelfClosing: false }], + ["opentagstart", { name: "result", attributes: {} }], + ["opentag", { name: "result", attributes: {}, isSelfClosing: false }], + ["opentagstart", { name: "bodyCrc", attributes: {} }], + ["opentag", { name: "bodyCrc", attributes: {}, isSelfClosing: false }], + ["text", "653724009"], + ["closetag", "bodyCrc"], + ["opentagstart", { name: "column", attributes: {} }], + ["opentag", { name: "column", attributes: {}, isSelfClosing: false }], + ["text", "-1"], + ["closetag", "column"], + ["opentagstart", { name: "id", attributes: {} }], + ["opentag", { name: "id", attributes: {}, isSelfClosing: false }], + ["text", "01pG0000002KoSUIA0"], + ["closetag", "id"], + ["opentagstart", { name: "line", attributes: {} }], + ["opentag", { name: "line", attributes: {}, isSelfClosing: false }], + ["text", "-1"], + ["closetag", "line"], + ["opentagstart", { name: "name", attributes: {} }], + ["opentag", { name: "name", attributes: {}, isSelfClosing: false }], + ["text", "CalendarController"], + ["closetag", "name"], + ["opentagstart", { name: "success", attributes: {} }], + ["opentag", { name: "success", attributes: {}, isSelfClosing: false }], + ["text", "true"], + ["closetag", "success"], + ["closetag", "result"], + ["closetag", "compileClassesResponse"], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/issue-30.js b/test/issue-30.js index 6549c4f4..8e30aae2 100644 --- a/test/issue-30.js +++ b/test/issue-30.js @@ -1,22 +1,24 @@ +"use strict"; + // https://github.com/isaacs/sax-js/issues/33 -require(__dirname).test({ - xml: '\n' + - '\n' + - '\n' + - '', +require(".").test({ + xml: "\n" + + "\n" + + "\n" + + "", expect: [ - [ 'opentagstart', { name: 'xml', attributes: {} } ], - [ 'opentag', { name: 'xml', attributes: {}, isSelfClosing: false } ], - [ 'text', '\n' ], - [ 'comment', ' \n comment with a single dash- in it\n' ], - [ 'text', '\n' ], - [ 'opentagstart', { name: 'data', attributes: {} } ], - [ 'opentag', { name: 'data', attributes: {}, isSelfClosing: true } ], - [ 'closetag', 'data' ], - [ 'text', '\n' ], - [ 'closetag', 'xml' ] + ["opentagstart", { name: "xml", attributes: {} }], + ["opentag", { name: "xml", attributes: {}, isSelfClosing: false }], + ["text", "\n"], + ["comment", " \n comment with a single dash- in it\n"], + ["text", "\n"], + ["opentagstart", { name: "data", attributes: {} }], + ["opentag", { name: "data", attributes: {}, isSelfClosing: true }], + ["closetag", "data"], + ["text", "\n"], + ["closetag", "xml"], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/issue-35.js b/test/issue-35.js index 2db4d170..f1d41bea 100644 --- a/test/issue-35.js +++ b/test/issue-35.js @@ -1,11 +1,13 @@ +"use strict"; + // https://github.com/isaacs/sax-js/issues/35 -require(__dirname).test({ - xml: ' \n', +require(".").test({ + xml: " \n", expect: [ - [ 'opentagstart', { name: 'xml', attributes: {} } ], - [ 'opentag', { name: 'xml', attributes: {}, isSelfClosing: false } ], - [ 'text', '\r\r\n' ], - [ 'closetag', 'xml' ] + ["opentagstart", { name: "xml", attributes: {} }], + ["opentag", { name: "xml", attributes: {}, isSelfClosing: false }], + ["text", "\r\r\n"], + ["closetag", "xml"], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/issue-47.js b/test/issue-47.js index d88a1e9d..9897667e 100644 --- a/test/issue-47.js +++ b/test/issue-47.js @@ -1,11 +1,13 @@ +"use strict"; + // https://github.com/isaacs/sax-js/issues/47 -require(__dirname).test({ - xml: '', +require(".").test({ + xml: "", expect: [ - [ 'opentagstart', { name: 'a', attributes: {} } ], - [ 'attribute', { name: 'href', value: 'query.svc?x=1&y=2&z=3' } ], - [ 'opentag', { name: 'a', attributes: { href: 'query.svc?x=1&y=2&z=3' }, isSelfClosing: true } ], - [ 'closetag', 'a' ] + ["opentagstart", { name: "a", attributes: {} }], + ["attribute", { name: "href", value: "query.svc?x=1&y=2&z=3" }], + ["opentag", { name: "a", attributes: { href: "query.svc?x=1&y=2&z=3" }, isSelfClosing: true }], + ["closetag", "a"], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/issue-49.js b/test/issue-49.js index 7ba4f117..bba19ce9 100644 --- a/test/issue-49.js +++ b/test/issue-49.js @@ -1,30 +1,32 @@ +"use strict"; + // https://github.com/isaacs/sax-js/issues/49 -require(__dirname).test({ - xml: '', +require(".").test({ + xml: "", expect: [ - [ 'opentagstart', { name: 'xml', attributes: {} } ], - [ 'opentag', { name: 'xml', attributes: {}, isSelfClosing: false } ], - [ 'opentagstart', { name: 'script', attributes: {} } ], - [ 'opentag', { name: 'script', attributes: {}, isSelfClosing: false } ], - [ 'text', 'hello world' ], - [ 'closetag', 'script' ], - [ 'closetag', 'xml' ] + ["opentagstart", { name: "xml", attributes: {} }], + ["opentag", { name: "xml", attributes: {}, isSelfClosing: false }], + ["opentagstart", { name: "script", attributes: {} }], + ["opentag", { name: "script", attributes: {}, isSelfClosing: false }], + ["text", "hello world"], + ["closetag", "script"], + ["closetag", "xml"], ], - opt: { lowercasetags: true, noscript: true } -}) + opt: { lowercasetags: true, noscript: true }, +}); -require(__dirname).test({ - xml: '', +require(".").test({ + xml: "", expect: [ - [ 'opentagstart', { name: 'xml', attributes: {} } ], - [ 'opentag', { name: 'xml', attributes: {}, isSelfClosing: false } ], - [ 'opentagstart', { name: 'script', attributes: {} } ], - [ 'opentag', { name: 'script', attributes: {}, isSelfClosing: false } ], - [ 'opencdata', undefined ], - [ 'cdata', 'hello world' ], - [ 'closecdata', undefined ], - [ 'closetag', 'script' ], - [ 'closetag', 'xml' ] + ["opentagstart", { name: "xml", attributes: {} }], + ["opentag", { name: "xml", attributes: {}, isSelfClosing: false }], + ["opentagstart", { name: "script", attributes: {} }], + ["opentag", { name: "script", attributes: {}, isSelfClosing: false }], + ["opencdata", undefined], + ["cdata", "hello world"], + ["closecdata", undefined], + ["closetag", "script"], + ["closetag", "xml"], ], - opt: { lowercasetags: true, noscript: true } -}) + opt: { lowercasetags: true, noscript: true }, +}); diff --git a/test/issue-84.js b/test/issue-84.js index f68918c8..9532e0f7 100644 --- a/test/issue-84.js +++ b/test/issue-84.js @@ -1,12 +1,14 @@ +"use strict"; + // https://github.com/isaacs/sax-js/issues/49 -require(__dirname).test({ - xml: 'body', +require(".").test({ + xml: "body", expect: [ - [ 'processinginstruction', { name: 'has', body: 'unbalanced "quotes' } ], - [ 'opentagstart', { name: 'xml', attributes: {} } ], - [ 'opentag', { name: 'xml', attributes: {}, isSelfClosing: false } ], - [ 'text', 'body' ], - [ 'closetag', 'xml' ] + ["processinginstruction", { name: "has", body: "unbalanced \"quotes" }], + ["opentagstart", { name: "xml", attributes: {} }], + ["opentag", { name: "xml", attributes: {}, isSelfClosing: false }], + ["text", "body"], + ["closetag", "xml"], ], - opt: { lowercasetags: true, noscript: true } -}) + opt: { lowercasetags: true, noscript: true }, +}); diff --git a/test/issue-86.js b/test/issue-86.js index 37dd9483..baf9f04b 100644 --- a/test/issue-86.js +++ b/test/issue-86.js @@ -1,41 +1,43 @@ -require(__dirname).test({ - xml: 'abcdeabc
dey
') -parser.write(xml).close() +"use strict"; + +const parser = require("../").parser(true); +const t = require("tap"); + +t.plan(1); +parser.onopentag = function onopentag(node) { + t.same(node, { name: "x", attributes: {}, isSelfClosing: false }); +}; +const xml = Buffer.from("y"); +parser.write(xml).close(); diff --git a/test/opentagstart.js b/test/opentagstart.js index f8397245..21ea9990 100644 --- a/test/opentagstart.js +++ b/test/opentagstart.js @@ -1,84 +1,86 @@ -require(__dirname).test({ +"use strict"; + +require(".").test({ xml: "", expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'root', + name: "root", ns: {}, - attributes: {} - } + attributes: {}, + }, ], [ - 'attribute', + "attribute", { - name: 'length', - value: '12345', - prefix: '', - local: 'length', - uri: '' - } + name: "length", + value: "12345", + prefix: "", + local: "length", + uri: "", + }, ], [ - 'opentag', + "opentag", { - name: 'root', - prefix: '', - local: 'root', - uri: '', + name: "root", + prefix: "", + local: "root", + uri: "", attributes: { length: { - name: 'length', - value: '12345', - prefix: '', - local: 'length', - uri: '' - } + name: "length", + value: "12345", + prefix: "", + local: "length", + uri: "", + }, }, ns: {}, - isSelfClosing: false - } + isSelfClosing: false, + }, ], [ - 'closetag', - 'root' - ] + "closetag", + "root", + ], ], opt: { - xmlns: true - } -}) + xmlns: true, + }, +}); -require(__dirname).test({ +require(".").test({ xml: "", expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'root', - attributes: {} - } + name: "root", + attributes: {}, + }, ], [ - 'attribute', + "attribute", { - name: 'length', - value: '12345' - } + name: "length", + value: "12345", + }, ], [ - 'opentag', + "opentag", { - name: 'root', + name: "root", attributes: { - length: '12345' + length: "12345", }, - isSelfClosing: false - } + isSelfClosing: false, + }, ], [ - 'closetag', - 'root' - ] + "closetag", + "root", + ], ], -}) +}); diff --git a/test/parser-position.js b/test/parser-position.js index 9f87d1f5..8a21db16 100644 --- a/test/parser-position.js +++ b/test/parser-position.js @@ -1,30 +1,33 @@ -var saxes = require('../lib/saxes') -var tap = require('tap') +"use strict"; -function testPosition (chunks, expectedEvents) { - var parser = saxes.parser() - expectedEvents.forEach(function (expectation) { - parser['on' + expectation[0]] = function () { - for (var prop in expectation[1]) { - tap.equal(parser[prop], expectation[1][prop]) +const saxes = require("../lib/saxes"); +const tap = require("tap"); + +function testPosition(chunks, expectedEvents) { + const parser = saxes.parser(); + expectedEvents.forEach((expectation) => { + parser[`on${expectation[0]}`] = function handler() { + // eslint-disable-next-line guard-for-in + for (const prop in expectation[1]) { + tap.equal(parser[prop], expectation[1][prop]); } - } - }) - chunks.forEach(function (chunk) { - parser.write(chunk) - }) + }; + }); + chunks.forEach((chunk) => { + parser.write(chunk); + }); } -testPosition(['
abcdefgh
'], [ - [ 'opentagstart', { position: 5, startTagPosition: 1 } ], - [ 'opentag', { position: 5, startTagPosition: 1 } ], - [ 'text', { position: 19, startTagPosition: 14 } ], - [ 'closetag', { position: 19, startTagPosition: 14 } ] -]) +testPosition(["
abcdefgh
"], [ + ["opentagstart", { position: 5, startTagPosition: 1 }], + ["opentag", { position: 5, startTagPosition: 1 }], + ["text", { position: 19, startTagPosition: 14 }], + ["closetag", { position: 19, startTagPosition: 14 }], +]); -testPosition(['
abcde', 'fgh
'], [ - ['opentagstart', { position: 5, startTagPosition: 1 }], - ['opentag', { position: 5, startTagPosition: 1 }], - ['text', { position: 19, startTagPosition: 14 }], - ['closetag', { position: 19, startTagPosition: 14 }] -]) +testPosition(["
abcde", "fgh
"], [ + ["opentagstart", { position: 5, startTagPosition: 1 }], + ["opentag", { position: 5, startTagPosition: 1 }], + ["text", { position: 19, startTagPosition: 14 }], + ["closetag", { position: 19, startTagPosition: 14 }], +]); diff --git a/test/self-closing-child.js b/test/self-closing-child.js index e6e34cfd..67908559 100644 --- a/test/self-closing-child.js +++ b/test/self-closing-child.js @@ -1,56 +1,58 @@ -require(__dirname).test({ - xml: '' + - '' + - '' + - '' + - '' + - '=(|)' + - '' + - '', +"use strict"; + +require(".").test({ + xml: "" + + "" + + "" + + "" + + "" + + "=(|)" + + "" + + "", expect: [ - ['opentagstart', { - 'name': 'root', - 'attributes': {} - }], - ['opentag', { - 'name': 'root', - 'attributes': {}, - 'isSelfClosing': false - }], - ['opentagstart', { - 'name': 'child', - 'attributes': {} - }], - ['opentag', { - 'name': 'child', - 'attributes': {}, - 'isSelfClosing': false - }], - ['opentagstart', { - 'name': 'haha', - 'attributes': {} - }], - ['opentag', { - 'name': 'haha', - 'attributes': {}, - 'isSelfClosing': true - }], - ['closetag', 'haha'], - ['closetag', 'child'], - ['opentagstart', { - 'name': 'monkey', - 'attributes': {} - }], - ['opentag', { - 'name': 'monkey', - 'attributes': {}, - 'isSelfClosing': false - }], - ['text', '=(|)'], - ['closetag', 'monkey'], - ['closetag', 'root'], - ['end'], - ['ready'] + ["opentagstart", { + name: "root", + attributes: {}, + }], + ["opentag", { + name: "root", + attributes: {}, + isSelfClosing: false, + }], + ["opentagstart", { + name: "child", + attributes: {}, + }], + ["opentag", { + name: "child", + attributes: {}, + isSelfClosing: false, + }], + ["opentagstart", { + name: "haha", + attributes: {}, + }], + ["opentag", { + name: "haha", + attributes: {}, + isSelfClosing: true, + }], + ["closetag", "haha"], + ["closetag", "child"], + ["opentagstart", { + name: "monkey", + attributes: {}, + }], + ["opentag", { + name: "monkey", + attributes: {}, + isSelfClosing: false, + }], + ["text", "=(|)"], + ["closetag", "monkey"], + ["closetag", "root"], + ["end"], + ["ready"], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/self-closing-tag.js b/test/self-closing-tag.js index f450dea1..c1c3626a 100644 --- a/test/self-closing-tag.js +++ b/test/self-closing-tag.js @@ -1,31 +1,33 @@ -require(__dirname).test({ - xml: ' ' + - ' ' + - ' ' + - ' ' + - '=(|) ' + - '' + - ' ', +"use strict"; + +require(".").test({ + xml: " " + + " " + + " " + + " " + + "=(|) " + + "" + + " ", expect: [ - ['opentagstart', {name: 'root', attributes: {}}], - ['opentag', {name: 'root', attributes: {}, isSelfClosing: false}], - ['text', ' '], - ['opentagstart', {name: 'haha', attributes: {}}], - ['opentag', {name: 'haha', attributes: {}, isSelfClosing: true}], - ['closetag', 'haha'], - ['text', ' '], - ['opentagstart', {name: 'haha', attributes: {}}], - ['opentag', {name: 'haha', attributes: {}, isSelfClosing: true}], - ['closetag', 'haha'], - ['text', ' '], + ["opentagstart", { name: "root", attributes: {} }], + ["opentag", { name: "root", attributes: {}, isSelfClosing: false }], + ["text", " "], + ["opentagstart", { name: "haha", attributes: {} }], + ["opentag", { name: "haha", attributes: {}, isSelfClosing: true }], + ["closetag", "haha"], + ["text", " "], + ["opentagstart", { name: "haha", attributes: {} }], + ["opentag", { name: "haha", attributes: {}, isSelfClosing: true }], + ["closetag", "haha"], + ["text", " "], // ["opentag", {name:"haha", attributes:{}}], // ["closetag", "haha"], - ['opentagstart', {name: 'monkey', attributes: {}}], - ['opentag', {name: 'monkey', attributes: {}, isSelfClosing: false}], - ['text', ' =(|) '], - ['closetag', 'monkey'], - ['closetag', 'root'], - ['text', ' '], + ["opentagstart", { name: "monkey", attributes: {} }], + ["opentag", { name: "monkey", attributes: {}, isSelfClosing: false }], + ["text", " =(|) "], + ["closetag", "monkey"], + ["closetag", "root"], + ["text", " "], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/stand-alone-comment.js b/test/stand-alone-comment.js index 207b4f63..c27cc4c1 100644 --- a/test/stand-alone-comment.js +++ b/test/stand-alone-comment.js @@ -1,11 +1,13 @@ +"use strict"; + // https://github.com/isaacs/sax-js/issues/124 -require(__dirname).test({ - xml: '', +require(".").test({ + xml: "", expect: [ [ - 'comment', - ' stand alone comment ' - ] + "comment", + " stand alone comment ", + ], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/trailing-attribute-no-value.js b/test/trailing-attribute-no-value.js index b2c09dd0..dfd2d38f 100644 --- a/test/trailing-attribute-no-value.js +++ b/test/trailing-attribute-no-value.js @@ -1,14 +1,16 @@ -require(__dirname).test({ - xml: '', +"use strict"; + +require(".").test({ + xml: "", expect: [ - ['opentagstart', {name: 'root', attributes: {}}], - ['error', 'Attribute without value\n\ + ["opentagstart", { name: "root", attributes: {} }], + ["error", "Attribute without value\n\ Line: 0\n\ Column: 13\n\ -Char: >'], - ['attribute', {name: 'attrib', value: 'attrib'}], - ['opentag', {name: 'root', attributes: {'attrib': 'attrib'}, isSelfClosing: false}], - ['closetag', 'root'], +Char: >"], + ["attribute", { name: "attrib", value: "attrib" }], + ["opentag", { name: "root", attributes: { attrib: "attrib" }, isSelfClosing: false }], + ["closetag", "root"], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/trailing-non-whitespace.js b/test/trailing-non-whitespace.js index 652bbbc2..9097aedf 100644 --- a/test/trailing-non-whitespace.js +++ b/test/trailing-non-whitespace.js @@ -1,25 +1,27 @@ -require(__dirname).test({ - xml: 'Welcome, to monkey land', +"use strict"; + +require(".").test({ + xml: "Welcome, to monkey land", expect: [ - ['opentagstart', { - 'name': 'span', - 'attributes': {} + ["opentagstart", { + name: "span", + attributes: {}, }], - ['opentag', { - 'name': 'span', - 'attributes': {}, - isSelfClosing: false + ["opentag", { + name: "span", + attributes: {}, + isSelfClosing: false, }], - ['text', 'Welcome,'], - ['closetag', 'span'], - ['text', ' '], - ['error', 'Text data outside of root node.\n\ + ["text", "Welcome,"], + ["closetag", "span"], + ["text", " "], + ["error", "Text data outside of root node.\n\ Line: 0\n\ Column: 23\n\ -Char: t'], - ['text', 'to monkey land'], - ['end'], - ['ready'] +Char: t"], + ["text", "to monkey land"], + ["end"], + ["ready"], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/unclosed-root.js b/test/unclosed-root.js index 58951f9a..b898925b 100644 --- a/test/unclosed-root.js +++ b/test/unclosed-root.js @@ -1,25 +1,27 @@ -require(__dirname).test({ - xml: '', +"use strict"; + +require(".").test({ + xml: "", expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'root', - attributes: {} - } + name: "root", + attributes: {}, + }, ], [ - 'opentag', + "opentag", { - name: 'root', + name: "root", attributes: {}, - isSelfClosing: false - } + isSelfClosing: false, + }, ], [ - 'error', - 'Unclosed root tag\nLine: 0\nColumn: 6\nChar: ' - ] + "error", + "Unclosed root tag\nLine: 0\nColumn: 6\nChar: ", + ], ], - opt: {} -}) + opt: {}, +}); diff --git a/test/utf8-split.js b/test/utf8-split.js index f917800f..24ea06d8 100644 --- a/test/utf8-split.js +++ b/test/utf8-split.js @@ -1,34 +1,36 @@ -var tap = require('tap') -var saxesStream = require('../lib/saxes').createStream() +"use strict"; -var b = new Buffer('误') +const tap = require("tap"); +const saxesStream = require("../lib/saxes").createStream(); -saxesStream.on('text', function (text) { - tap.equal(text, b.toString()) -}) +const b = Buffer.from("误"); -saxesStream.write(new Buffer('
')) -saxesStream.write(b.slice(0, 1)) -saxesStream.write(b.slice(1)) -saxesStream.write(new Buffer('')) -saxesStream.write(b.slice(0, 2)) -saxesStream.write(b.slice(2)) -saxesStream.write(new Buffer('')) -saxesStream.write(b) -saxesStream.write(new Buffer('')) -saxesStream.write(Buffer.concat([new Buffer(''), b.slice(0, 1)])) -saxesStream.end(Buffer.concat([b.slice(1), new Buffer('')])) +saxesStream.on("text", (text) => { + tap.equal(text, b.toString()); +}); -var saxesStream2 = require('../lib/saxes').createStream() +saxesStream.write(Buffer.from("")); +saxesStream.write(b.slice(0, 1)); +saxesStream.write(b.slice(1)); +saxesStream.write(Buffer.from("")); +saxesStream.write(b.slice(0, 2)); +saxesStream.write(b.slice(2)); +saxesStream.write(Buffer.from("")); +saxesStream.write(b); +saxesStream.write(Buffer.from("")); +saxesStream.write(Buffer.concat([Buffer.from(""), b.slice(0, 1)])); +saxesStream.end(Buffer.concat([b.slice(1), Buffer.from("")])); -saxesStream2.on('text', function (text) { - tap.equal(text, '�') -}) +const saxesStream2 = require("../lib/saxes").createStream(); -saxesStream2.write(new Buffer('')) -saxesStream2.write(new Buffer('')) -saxesStream2.write(new Buffer([0xC0])) -saxesStream2.write(new Buffer('')) -saxesStream2.write(Buffer.concat([new Buffer(''), b.slice(0, 1)])) -saxesStream2.write(new Buffer('')) -saxesStream2.end() +saxesStream2.on("text", (text) => { + tap.equal(text, "�"); +}); + +saxesStream2.write(Buffer.from("")); +saxesStream2.write(Buffer.from("")); +saxesStream2.write(Buffer.from([0xC0])); +saxesStream2.write(Buffer.from("")); +saxesStream2.write(Buffer.concat([Buffer.from(""), b.slice(0, 1)])); +saxesStream2.write(Buffer.from("")); +saxesStream2.end(); diff --git a/test/xml-internal-entities.js b/test/xml-internal-entities.js index 6d444e1c..ad4c82f5 100644 --- a/test/xml-internal-entities.js +++ b/test/xml-internal-entities.js @@ -1,91 +1,96 @@ -var iExpect = [] -var myAttributes = {} -var ENTITIES = {} +"use strict"; + +const iExpect = []; +const myAttributes = {}; +const ENTITIES = {}; // generates xml like test0="&control;" -var entitiesToTest = { +const entitiesToTest = { // 'ENTITY_NAME': IS_VALID || [invalidCharPos, invalidChar], - 'control0': true, // This is a vanilla control. + control0: true, // This is a vanilla control. // entityStart - '_uscore': true, - '#hash': true, - ':colon': true, - '-bad': [0, '-'], - '.bad': [0, '.'], + _uscore: true, + "#hash": true, + ":colon": true, + "-bad": [0, "-"], + ".bad": [0, "."], // general entity - 'u_score': true, - 'd-ash': true, - 'd.ot': true, - 'all:_#-.': true -} + u_score: true, + "d-ash": true, + "d.ot": true, + "all:_#-.": true, +}; -var xmlStart = '', +"use strict"; + +require(".").test({ + xml: "", expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'xmlns', + name: "xmlns", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'opentag', + "opentag", { - name: 'xmlns', - uri: '', - prefix: '', - local: 'xmlns', + name: "xmlns", + uri: "", + prefix: "", + local: "xmlns", attributes: {}, ns: {}, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'xmlns' - ] + "closetag", + "xmlns", + ], ], opt: { - xmlns: true - } -}) + xmlns: true, + }, +}); diff --git a/test/xmlns-issue-41.js b/test/xmlns-issue-41.js index e526c234..d8105996 100644 --- a/test/xmlns-issue-41.js +++ b/test/xmlns-issue-41.js @@ -1,92 +1,94 @@ -var t = require(__dirname) +"use strict"; + +const t = require("."); // should be the same both ways. -var xmls = [ - '', - '' -] +const xmls = [ + "", + "", +]; -var ex1 = [ - [ 'opentagstart', { name: 'parent', attributes: {}, ns: {} } ], +const ex1 = [ + ["opentagstart", { name: "parent", attributes: {}, ns: {} }], [ - 'opennamespace', + "opennamespace", { - prefix: 'a', - uri: 'http://ATTRIBUTE' - } + prefix: "a", + uri: "http://ATTRIBUTE", + }, ], [ - 'attribute', + "attribute", { - name: 'xmlns:a', - value: 'http://ATTRIBUTE', - prefix: 'xmlns', - local: 'a', - uri: 'http://www.w3.org/2000/xmlns/' - } + name: "xmlns:a", + value: "http://ATTRIBUTE", + prefix: "xmlns", + local: "a", + uri: "http://www.w3.org/2000/xmlns/", + }, ], [ - 'attribute', + "attribute", { - name: 'a:attr', - local: 'attr', - prefix: 'a', - uri: 'http://ATTRIBUTE', - value: 'value' - } + name: "a:attr", + local: "attr", + prefix: "a", + uri: "http://ATTRIBUTE", + value: "value", + }, ], [ - 'opentag', + "opentag", { - name: 'parent', - uri: '', - prefix: '', - local: 'parent', + name: "parent", + uri: "", + prefix: "", + local: "parent", attributes: { - 'a:attr': { - name: 'a:attr', - local: 'attr', - prefix: 'a', - uri: 'http://ATTRIBUTE', - value: 'value' + "a:attr": { + name: "a:attr", + local: "attr", + prefix: "a", + uri: "http://ATTRIBUTE", + value: "value", + }, + "xmlns:a": { + name: "xmlns:a", + local: "a", + prefix: "xmlns", + uri: "http://www.w3.org/2000/xmlns/", + value: "http://ATTRIBUTE", }, - 'xmlns:a': { - name: 'xmlns:a', - local: 'a', - prefix: 'xmlns', - uri: 'http://www.w3.org/2000/xmlns/', - value: 'http://ATTRIBUTE' - } }, ns: { - a: 'http://ATTRIBUTE' + a: "http://ATTRIBUTE", }, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'parent' + "closetag", + "parent", ], [ - 'closenamespace', + "closenamespace", { - prefix: 'a', - uri: 'http://ATTRIBUTE' - } - ] -] + prefix: "a", + uri: "http://ATTRIBUTE", + }, + ], +]; // swap the order of elements 2 and 3 -var ex2 = [ex1[0], ex1[1], ex1[3], ex1[2]].concat(ex1.slice(4)) -var expected = [ex1, ex2] +const ex2 = [ex1[0], ex1[1], ex1[3], ex1[2]].concat(ex1.slice(4)); +const expected = [ex1, ex2]; -xmls.forEach(function (x, i) { +xmls.forEach((x, i) => { t.test({ xml: x, expect: expected[i], opt: { - xmlns: true - } - }) -}) + xmlns: true, + }, + }); +}); diff --git a/test/xmlns-rebinding.js b/test/xmlns-rebinding.js index 78579c0c..a735c503 100644 --- a/test/xmlns-rebinding.js +++ b/test/xmlns-rebinding.js @@ -1,326 +1,328 @@ -require(__dirname).test({ - xml: '' + - '' + - '' + - '' + - '' + - '', +"use strict"; + +require(".").test({ + xml: "" + + "" + + "" + + "" + + "" + + "", expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'root', + name: "root", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'opennamespace', + "opennamespace", { - prefix: 'x', - uri: 'x1' - } + prefix: "x", + uri: "x1", + }, ], [ - 'opennamespace', + "opennamespace", { - prefix: 'y', - uri: 'y1' - } + prefix: "y", + uri: "y1", + }, ], [ - 'attribute', + "attribute", { - name: 'xmlns:x', - value: 'x1', - uri: 'http://www.w3.org/2000/xmlns/', - prefix: 'xmlns', - local: 'x' - } + name: "xmlns:x", + value: "x1", + uri: "http://www.w3.org/2000/xmlns/", + prefix: "xmlns", + local: "x", + }, ], [ - 'attribute', + "attribute", { - name: 'xmlns:y', - value: 'y1', - uri: 'http://www.w3.org/2000/xmlns/', - prefix: 'xmlns', - local: 'y' - } + name: "xmlns:y", + value: "y1", + uri: "http://www.w3.org/2000/xmlns/", + prefix: "xmlns", + local: "y", + }, ], [ - 'attribute', + "attribute", { - name: 'x:a', - value: 'x1', - uri: 'x1', - prefix: 'x', - local: 'a' - } + name: "x:a", + value: "x1", + uri: "x1", + prefix: "x", + local: "a", + }, ], [ - 'attribute', + "attribute", { - name: 'y:a', - value: 'y1', - uri: 'y1', - prefix: 'y', - local: 'a' - } + name: "y:a", + value: "y1", + uri: "y1", + prefix: "y", + local: "a", + }, ], [ - 'opentag', + "opentag", { - name: 'root', - uri: '', - prefix: '', - local: 'root', + name: "root", + uri: "", + prefix: "", + local: "root", attributes: { - 'xmlns:x': { - name: 'xmlns:x', - value: 'x1', - uri: 'http://www.w3.org/2000/xmlns/', - prefix: 'xmlns', - local: 'x' + "xmlns:x": { + name: "xmlns:x", + value: "x1", + uri: "http://www.w3.org/2000/xmlns/", + prefix: "xmlns", + local: "x", }, - 'xmlns:y': { - name: 'xmlns:y', - value: 'y1', - uri: 'http://www.w3.org/2000/xmlns/', - prefix: 'xmlns', - local: 'y' + "xmlns:y": { + name: "xmlns:y", + value: "y1", + uri: "http://www.w3.org/2000/xmlns/", + prefix: "xmlns", + local: "y", }, - 'x:a': { - name: 'x:a', - value: 'x1', - uri: 'x1', - prefix: 'x', - local: 'a' + "x:a": { + name: "x:a", + value: "x1", + uri: "x1", + prefix: "x", + local: "a", + }, + "y:a": { + name: "y:a", + value: "y1", + uri: "y1", + prefix: "y", + local: "a", }, - 'y:a': { - name: 'y:a', - value: 'y1', - uri: 'y1', - prefix: 'y', - local: 'a' - } }, ns: { - x: 'x1', - y: 'y1' + x: "x1", + y: "y1", }, - isSelfClosing: false - } + isSelfClosing: false, + }, ], [ - 'opentagstart', + "opentagstart", { - name: 'rebind', + name: "rebind", attributes: {}, ns: { - x: 'x1', - y: 'y1' - } - } + x: "x1", + y: "y1", + }, + }, ], [ - 'opennamespace', + "opennamespace", { - prefix: 'x', - uri: 'x2' - } + prefix: "x", + uri: "x2", + }, ], [ - 'attribute', + "attribute", { - name: 'xmlns:x', - value: 'x2', - uri: 'http://www.w3.org/2000/xmlns/', - prefix: 'xmlns', - local: 'x' - } + name: "xmlns:x", + value: "x2", + uri: "http://www.w3.org/2000/xmlns/", + prefix: "xmlns", + local: "x", + }, ], [ - 'opentag', + "opentag", { - name: 'rebind', - uri: '', - prefix: '', - local: 'rebind', + name: "rebind", + uri: "", + prefix: "", + local: "rebind", attributes: { - 'xmlns:x': { - name: 'xmlns:x', - value: 'x2', - uri: 'http://www.w3.org/2000/xmlns/', - prefix: 'xmlns', - local: 'x' - } + "xmlns:x": { + name: "xmlns:x", + value: "x2", + uri: "http://www.w3.org/2000/xmlns/", + prefix: "xmlns", + local: "x", + }, }, ns: { - x: 'x2' + x: "x2", }, - isSelfClosing: false - } + isSelfClosing: false, + }, ], [ - 'opentagstart', + "opentagstart", { - name: 'check', + name: "check", attributes: {}, ns: { - x: 'x2' - } - } + x: "x2", + }, + }, ], [ - 'attribute', + "attribute", { - name: 'x:a', - value: 'x2', - uri: 'x2', - prefix: 'x', - local: 'a' - } + name: "x:a", + value: "x2", + uri: "x2", + prefix: "x", + local: "a", + }, ], [ - 'attribute', + "attribute", { - name: 'y:a', - value: 'y1', - uri: 'y1', - prefix: 'y', - local: 'a' - } + name: "y:a", + value: "y1", + uri: "y1", + prefix: "y", + local: "a", + }, ], [ - 'opentag', + "opentag", { - name: 'check', - uri: '', - prefix: '', - local: 'check', + name: "check", + uri: "", + prefix: "", + local: "check", attributes: { - 'x:a': { - name: 'x:a', - value: 'x2', - uri: 'x2', - prefix: 'x', - local: 'a' + "x:a": { + name: "x:a", + value: "x2", + uri: "x2", + prefix: "x", + local: "a", + }, + "y:a": { + name: "y:a", + value: "y1", + uri: "y1", + prefix: "y", + local: "a", }, - 'y:a': { - name: 'y:a', - value: 'y1', - uri: 'y1', - prefix: 'y', - local: 'a' - } }, ns: { - x: 'x2' + x: "x2", }, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'check' + "closetag", + "check", ], [ - 'closetag', - 'rebind' + "closetag", + "rebind", ], [ - 'closenamespace', + "closenamespace", { - prefix: 'x', - uri: 'x2' - } + prefix: "x", + uri: "x2", + }, ], [ - 'opentagstart', + "opentagstart", { - name: 'check', + name: "check", attributes: {}, ns: { - x: 'x1', - y: 'y1' - } - } + x: "x1", + y: "y1", + }, + }, ], [ - 'attribute', + "attribute", { - name: 'x:a', - value: 'x1', - uri: 'x1', - prefix: 'x', - local: 'a' - } + name: "x:a", + value: "x1", + uri: "x1", + prefix: "x", + local: "a", + }, ], [ - 'attribute', + "attribute", { - name: 'y:a', - value: 'y1', - uri: 'y1', - prefix: 'y', - local: 'a' - } + name: "y:a", + value: "y1", + uri: "y1", + prefix: "y", + local: "a", + }, ], [ - 'opentag', + "opentag", { - name: 'check', - uri: '', - prefix: '', - local: 'check', + name: "check", + uri: "", + prefix: "", + local: "check", attributes: { - 'x:a': { - name: 'x:a', - value: 'x1', - uri: 'x1', - prefix: 'x', - local: 'a' + "x:a": { + name: "x:a", + value: "x1", + uri: "x1", + prefix: "x", + local: "a", + }, + "y:a": { + name: "y:a", + value: "y1", + uri: "y1", + prefix: "y", + local: "a", }, - 'y:a': { - name: 'y:a', - value: 'y1', - uri: 'y1', - prefix: 'y', - local: 'a' - } }, ns: { - x: 'x1', - y: 'y1' + x: "x1", + y: "y1", }, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'check' + "closetag", + "check", ], [ - 'closetag', - 'root' + "closetag", + "root", ], [ - 'closenamespace', + "closenamespace", { - prefix: 'x', - uri: 'x1' - } + prefix: "x", + uri: "x1", + }, ], [ - 'closenamespace', + "closenamespace", { - prefix: 'y', - uri: 'y1' - } - ] + prefix: "y", + uri: "y1", + }, + ], ], opt: { - xmlns: true - } -}) + xmlns: true, + }, +}); diff --git a/test/xmlns-strict.js b/test/xmlns-strict.js index 79f37079..387f32e4 100644 --- a/test/xmlns-strict.js +++ b/test/xmlns-strict.js @@ -1,333 +1,335 @@ -require(__dirname).test({ - xml: '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '', +"use strict"; + +require(".").test({ + xml: "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "", expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'root', + name: "root", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'opentag', + "opentag", { - name: 'root', - prefix: '', - local: 'root', - uri: '', + name: "root", + prefix: "", + local: "root", + uri: "", attributes: {}, ns: {}, - isSelfClosing: false - } + isSelfClosing: false, + }, ], [ - 'opentagstart', + "opentagstart", { - name: 'plain', + name: "plain", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'attribute', + "attribute", { - name: 'attr', - value: 'normal', - prefix: '', - local: 'attr', - uri: '' - } + name: "attr", + value: "normal", + prefix: "", + local: "attr", + uri: "", + }, ], [ - 'opentag', + "opentag", { - name: 'plain', - prefix: '', - local: 'plain', - uri: '', + name: "plain", + prefix: "", + local: "plain", + uri: "", attributes: { - 'attr': { - name: 'attr', - value: 'normal', - prefix: '', - local: 'attr', - uri: '' - } + attr: { + name: "attr", + value: "normal", + prefix: "", + local: "attr", + uri: "", + }, }, ns: {}, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'plain' + "closetag", + "plain", ], [ - 'opentagstart', + "opentagstart", { - name: 'ns1', + name: "ns1", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'opennamespace', + "opennamespace", { - prefix: '', - uri: 'uri:default' - } + prefix: "", + uri: "uri:default", + }, ], [ - 'attribute', + "attribute", { - name: 'xmlns', - value: 'uri:default', - prefix: 'xmlns', - local: '', - uri: 'http://www.w3.org/2000/xmlns/' - } + name: "xmlns", + value: "uri:default", + prefix: "xmlns", + local: "", + uri: "http://www.w3.org/2000/xmlns/", + }, ], [ - 'opentag', + "opentag", { - name: 'ns1', - prefix: '', - local: 'ns1', - uri: 'uri:default', + name: "ns1", + prefix: "", + local: "ns1", + uri: "uri:default", attributes: { - 'xmlns': { - name: 'xmlns', - value: 'uri:default', - prefix: 'xmlns', - local: '', - uri: 'http://www.w3.org/2000/xmlns/' - } + xmlns: { + name: "xmlns", + value: "uri:default", + prefix: "xmlns", + local: "", + uri: "http://www.w3.org/2000/xmlns/", + }, }, ns: { - '': 'uri:default' + "": "uri:default", }, - isSelfClosing: false - } + isSelfClosing: false, + }, ], [ - 'opentagstart', + "opentagstart", { - name: 'plain', + name: "plain", ns: { - '': 'uri:default' + "": "uri:default", }, - attributes: {} - } + attributes: {}, + }, ], [ - 'attribute', + "attribute", { - name: 'attr', - value: 'normal', - prefix: '', - local: 'attr', - uri: '' - } + name: "attr", + value: "normal", + prefix: "", + local: "attr", + uri: "", + }, ], [ - 'opentag', + "opentag", { - name: 'plain', - prefix: '', - local: 'plain', - uri: 'uri:default', + name: "plain", + prefix: "", + local: "plain", + uri: "uri:default", ns: { - '': 'uri:default' + "": "uri:default", }, attributes: { - 'attr': { - name: 'attr', - value: 'normal', - prefix: '', - local: 'attr', - uri: '' - } + attr: { + name: "attr", + value: "normal", + prefix: "", + local: "attr", + uri: "", + }, }, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'plain' + "closetag", + "plain", ], [ - 'closetag', - 'ns1' + "closetag", + "ns1", ], [ - 'closenamespace', + "closenamespace", { - prefix: '', - uri: 'uri:default' - } + prefix: "", + uri: "uri:default", + }, ], [ - 'opentagstart', + "opentagstart", { - name: 'ns2', + name: "ns2", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'opennamespace', + "opennamespace", { - prefix: 'a', - uri: 'uri:nsa' - } + prefix: "a", + uri: "uri:nsa", + }, ], [ - 'attribute', + "attribute", { - name: 'xmlns:a', - value: 'uri:nsa', - prefix: 'xmlns', - local: 'a', - uri: 'http://www.w3.org/2000/xmlns/' - } + name: "xmlns:a", + value: "uri:nsa", + prefix: "xmlns", + local: "a", + uri: "http://www.w3.org/2000/xmlns/", + }, ], [ - 'opentag', + "opentag", { - name: 'ns2', - prefix: '', - local: 'ns2', - uri: '', + name: "ns2", + prefix: "", + local: "ns2", + uri: "", attributes: { - 'xmlns:a': { - name: 'xmlns:a', - value: 'uri:nsa', - prefix: 'xmlns', - local: 'a', - uri: 'http://www.w3.org/2000/xmlns/' - } + "xmlns:a": { + name: "xmlns:a", + value: "uri:nsa", + prefix: "xmlns", + local: "a", + uri: "http://www.w3.org/2000/xmlns/", + }, }, ns: { - a: 'uri:nsa' + a: "uri:nsa", }, - isSelfClosing: false - } + isSelfClosing: false, + }, ], [ - 'opentagstart', + "opentagstart", { - name: 'plain', + name: "plain", attributes: {}, ns: { - a: 'uri:nsa' - } - } + a: "uri:nsa", + }, + }, ], [ - 'attribute', + "attribute", { - name: 'attr', - value: 'normal', - prefix: '', - local: 'attr', - uri: '' - } + name: "attr", + value: "normal", + prefix: "", + local: "attr", + uri: "", + }, ], [ - 'opentag', + "opentag", { - name: 'plain', - prefix: '', - local: 'plain', - uri: '', + name: "plain", + prefix: "", + local: "plain", + uri: "", attributes: { - 'attr': { - name: 'attr', - value: 'normal', - prefix: '', - local: 'attr', - uri: '' - } + attr: { + name: "attr", + value: "normal", + prefix: "", + local: "attr", + uri: "", + }, }, ns: { - a: 'uri:nsa' + a: "uri:nsa", }, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'plain' + "closetag", + "plain", ], [ - 'opentagstart', + "opentagstart", { - name: 'a:ns', + name: "a:ns", attributes: {}, - ns: { a: 'uri:nsa' } - } + ns: { a: "uri:nsa" }, + }, ], [ - 'attribute', + "attribute", { - name: 'a:attr', - value: 'namespaced', - prefix: 'a', - local: 'attr', - uri: 'uri:nsa' - } + name: "a:attr", + value: "namespaced", + prefix: "a", + local: "attr", + uri: "uri:nsa", + }, ], [ - 'opentag', + "opentag", { - name: 'a:ns', - prefix: 'a', - local: 'ns', - uri: 'uri:nsa', + name: "a:ns", + prefix: "a", + local: "ns", + uri: "uri:nsa", attributes: { - 'a:attr': { - name: 'a:attr', - value: 'namespaced', - prefix: 'a', - local: 'attr', - uri: 'uri:nsa' - } + "a:attr": { + name: "a:attr", + value: "namespaced", + prefix: "a", + local: "attr", + uri: "uri:nsa", + }, }, - ns: { a: 'uri:nsa' }, - isSelfClosing: true - } + ns: { a: "uri:nsa" }, + isSelfClosing: true, + }, ], [ - 'closetag', - 'a:ns' + "closetag", + "a:ns", ], [ - 'closetag', - 'ns2' + "closetag", + "ns2", ], [ - 'closenamespace', + "closenamespace", { - prefix: 'a', - uri: 'uri:nsa' - } + prefix: "a", + uri: "uri:nsa", + }, ], [ - 'closetag', - 'root' - ] + "closetag", + "root", + ], ], opt: { - xmlns: true - } -}) + xmlns: true, + }, +}); diff --git a/test/xmlns-unbound-element.js b/test/xmlns-unbound-element.js index 422763ad..d383b5d0 100644 --- a/test/xmlns-unbound-element.js +++ b/test/xmlns-unbound-element.js @@ -1,99 +1,101 @@ -require(__dirname).test({ +"use strict"; + +require(".").test({ opt: { xmlns: true }, expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'unbound:root', + name: "unbound:root", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'error', - 'Unbound namespace prefix: "unbound:root"\nLine: 0\nColumn: 15\nChar: >' + "error", + "Unbound namespace prefix: \"unbound:root\"\nLine: 0\nColumn: 15\nChar: >", ], [ - 'opentag', + "opentag", { - name: 'unbound:root', - uri: 'unbound', - prefix: 'unbound', - local: 'root', + name: "unbound:root", + uri: "unbound", + prefix: "unbound", + local: "root", attributes: {}, ns: {}, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'unbound:root' - ] - ] -}).write('') + "closetag", + "unbound:root", + ], + ], +}).write(""); -require(__dirname).test({ +require(".").test({ opt: { - xmlns: true + xmlns: true, }, expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'unbound:root', + name: "unbound:root", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'opennamespace', + "opennamespace", { - prefix: 'unbound', - uri: 'someuri' - } + prefix: "unbound", + uri: "someuri", + }, ], [ - 'attribute', + "attribute", { - name: 'xmlns:unbound', - value: 'someuri', - prefix: 'xmlns', - local: 'unbound', - uri: 'http://www.w3.org/2000/xmlns/' - } + name: "xmlns:unbound", + value: "someuri", + prefix: "xmlns", + local: "unbound", + uri: "http://www.w3.org/2000/xmlns/", + }, ], [ - 'opentag', + "opentag", { - name: 'unbound:root', - uri: 'someuri', - prefix: 'unbound', - local: 'root', + name: "unbound:root", + uri: "someuri", + prefix: "unbound", + local: "root", attributes: { - 'xmlns:unbound': { - name: 'xmlns:unbound', - value: 'someuri', - prefix: 'xmlns', - local: 'unbound', - uri: 'http://www.w3.org/2000/xmlns/' - } + "xmlns:unbound": { + name: "xmlns:unbound", + value: "someuri", + prefix: "xmlns", + local: "unbound", + uri: "http://www.w3.org/2000/xmlns/", + }, }, ns: { - 'unbound': 'someuri' + unbound: "someuri", }, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'unbound:root' + "closetag", + "unbound:root", ], [ - 'closenamespace', + "closenamespace", { - prefix: 'unbound', - uri: 'someuri' - } - ] - ] -}).write('') + prefix: "unbound", + uri: "someuri", + }, + ], + ], +}).write(""); diff --git a/test/xmlns-unbound.js b/test/xmlns-unbound.js index 76159fc8..7f502a50 100644 --- a/test/xmlns-unbound.js +++ b/test/xmlns-unbound.js @@ -1,51 +1,53 @@ -require(__dirname).test({ +"use strict"; + +require(".").test({ opt: { xmlns: true }, expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'root', + name: "root", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'error', - 'Unbound namespace prefix: "unbound"\nLine: 0\nColumn: 28\nChar: >' + "error", + "Unbound namespace prefix: \"unbound\"\nLine: 0\nColumn: 28\nChar: >", ], [ - 'attribute', + "attribute", { - name: 'unbound:attr', - value: 'value', - uri: 'unbound', - prefix: 'unbound', - local: 'attr' - } + name: "unbound:attr", + value: "value", + uri: "unbound", + prefix: "unbound", + local: "attr", + }, ], [ - 'opentag', + "opentag", { - name: 'root', - uri: '', - prefix: '', - local: 'root', + name: "root", + uri: "", + prefix: "", + local: "root", attributes: { - 'unbound:attr': { - name: 'unbound:attr', - value: 'value', - uri: 'unbound', - prefix: 'unbound', - local: 'attr' - } + "unbound:attr": { + name: "unbound:attr", + value: "value", + uri: "unbound", + prefix: "unbound", + local: "attr", + }, }, ns: {}, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'root' - ] - ] -}).write("") + "closetag", + "root", + ], + ], +}).write(""); diff --git a/test/xmlns-xml-default-ns.js b/test/xmlns-xml-default-ns.js index 321f0894..580b5244 100644 --- a/test/xmlns-xml-default-ns.js +++ b/test/xmlns-xml-default-ns.js @@ -1,70 +1,72 @@ -var xmlnsAttr = { - name: 'xmlns', - value: 'http://foo', - prefix: 'xmlns', - local: '', - uri: 'http://www.w3.org/2000/xmlns/' -} +"use strict"; -var attrAttr = { - name: 'attr', - value: 'bar', - prefix: '', - local: 'attr', - uri: '' -} +const xmlnsAttr = { + name: "xmlns", + value: "http://foo", + prefix: "xmlns", + local: "", + uri: "http://www.w3.org/2000/xmlns/", +}; -require(__dirname).test({ +const attrAttr = { + name: "attr", + value: "bar", + prefix: "", + local: "attr", + uri: "", +}; + +require(".").test({ xml: "", expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'elm', + name: "elm", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'opennamespace', - { prefix: '', uri: 'http://foo' } + "opennamespace", + { prefix: "", uri: "http://foo" }, ], [ - 'attribute', - xmlnsAttr + "attribute", + xmlnsAttr, ], [ - 'attribute', - attrAttr + "attribute", + attrAttr, ], [ - 'opentag', + "opentag", { - name: 'elm', - prefix: '', - local: 'elm', - uri: 'http://foo', - ns: { '': 'http://foo' }, + name: "elm", + prefix: "", + local: "elm", + uri: "http://foo", + ns: { "": "http://foo" }, attributes: { xmlns: xmlnsAttr, - attr: attrAttr + attr: attrAttr, }, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'elm' + "closetag", + "elm", ], [ - 'closenamespace', + "closenamespace", { - prefix: '', - uri: 'http://foo' - } - ] + prefix: "", + uri: "http://foo", + }, + ], ], opt: { - xmlns: true - } -}) + xmlns: true, + }, +}); diff --git a/test/xmlns-xml-default-prefix-attribute.js b/test/xmlns-xml-default-prefix-attribute.js index 6750b191..c5c996f4 100644 --- a/test/xmlns-xml-default-prefix-attribute.js +++ b/test/xmlns-xml-default-prefix-attribute.js @@ -1,48 +1,50 @@ -require(__dirname).test({ +"use strict"; + +require(".").test({ xml: "", expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'root', + name: "root", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'attribute', + "attribute", { - name: 'xml:lang', - local: 'lang', - prefix: 'xml', - uri: 'http://www.w3.org/XML/1998/namespace', - value: 'en' - } + name: "xml:lang", + local: "lang", + prefix: "xml", + uri: "http://www.w3.org/XML/1998/namespace", + value: "en", + }, ], [ - 'opentag', + "opentag", { - name: 'root', - uri: '', - prefix: '', - local: 'root', + name: "root", + uri: "", + prefix: "", + local: "root", attributes: { - 'xml:lang': { - name: 'xml:lang', - local: 'lang', - prefix: 'xml', - uri: 'http://www.w3.org/XML/1998/namespace', - value: 'en' - } + "xml:lang": { + name: "xml:lang", + local: "lang", + prefix: "xml", + uri: "http://www.w3.org/XML/1998/namespace", + value: "en", + }, }, ns: {}, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'root' - ] + "closetag", + "root", + ], ], - opt: { xmlns: true } -}) + opt: { xmlns: true }, +}); diff --git a/test/xmlns-xml-default-prefix.js b/test/xmlns-xml-default-prefix.js index dfd210a8..3445b670 100644 --- a/test/xmlns-xml-default-prefix.js +++ b/test/xmlns-xml-default-prefix.js @@ -1,30 +1,32 @@ -require(__dirname).test({ - xml: '', +"use strict"; + +require(".").test({ + xml: "", expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'xml:root', + name: "xml:root", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'opentag', + "opentag", { - name: 'xml:root', - uri: 'http://www.w3.org/XML/1998/namespace', - prefix: 'xml', - local: 'root', + name: "xml:root", + uri: "http://www.w3.org/XML/1998/namespace", + prefix: "xml", + local: "root", attributes: {}, ns: {}, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'xml:root' - ] + "closetag", + "xml:root", + ], ], - opt: { xmlns: true } -}) + opt: { xmlns: true }, +}); diff --git a/test/xmlns-xml-default-redefine.js b/test/xmlns-xml-default-redefine.js index da6c30e3..9c7ea507 100644 --- a/test/xmlns-xml-default-redefine.js +++ b/test/xmlns-xml-default-redefine.js @@ -1,54 +1,56 @@ -require(__dirname).test({ +"use strict"; + +require(".").test({ xml: "", expect: [ [ - 'opentagstart', + "opentagstart", { - name: 'xml:root', + name: "xml:root", attributes: {}, - ns: {} - } + ns: {}, + }, ], [ - 'error', - 'xml: prefix must be bound to http://www.w3.org/XML/1998/namespace\n' + - 'Actual: ERROR\n' + - "Line: 0\nColumn: 27\nChar: '" + "error", + "xml: prefix must be bound to http://www.w3.org/XML/1998/namespace\n" + + "Actual: ERROR\n" + + "Line: 0\nColumn: 27\nChar: '", ], [ - 'attribute', + "attribute", { - name: 'xmlns:xml', - local: 'xml', - prefix: 'xmlns', - uri: 'http://www.w3.org/2000/xmlns/', - value: 'ERROR' - } + name: "xmlns:xml", + local: "xml", + prefix: "xmlns", + uri: "http://www.w3.org/2000/xmlns/", + value: "ERROR", + }, ], [ - 'opentag', + "opentag", { - name: 'xml:root', - uri: 'http://www.w3.org/XML/1998/namespace', - prefix: 'xml', - local: 'root', + name: "xml:root", + uri: "http://www.w3.org/XML/1998/namespace", + prefix: "xml", + local: "root", attributes: { - 'xmlns:xml': { - name: 'xmlns:xml', - local: 'xml', - prefix: 'xmlns', - uri: 'http://www.w3.org/2000/xmlns/', - value: 'ERROR' - } + "xmlns:xml": { + name: "xmlns:xml", + local: "xml", + prefix: "xmlns", + uri: "http://www.w3.org/2000/xmlns/", + value: "ERROR", + }, }, ns: {}, - isSelfClosing: true - } + isSelfClosing: true, + }, ], [ - 'closetag', - 'xml:root' - ] + "closetag", + "xml:root", + ], ], - opt: { xmlns: true } -}) + opt: { xmlns: true }, +});