emailjs-imap-handler
Version:
Parse and compile IMAP commands
856 lines (719 loc) • 97.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
exports.default = function (buffers) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var parser = new ParserInstance(buffers, options);
var response = {};
response.tag = parser.getTag();
parser.getSpace();
response.command = parser.getCommand();
if (['UID', 'AUTHENTICATE'].indexOf((response.command || '').toUpperCase()) >= 0) {
parser.getSpace();
response.command += ' ' + parser.getElement(_formalSyntax.IS_COMMAND);
}
if (!isEmpty(parser.remainder)) {
parser.getSpace();
response.attributes = parser.getAttributes();
}
if (parser.humanReadable) {
response.attributes = (response.attributes || []).concat({
type: 'TEXT',
value: parser.humanReadable
});
}
return response;
};
var _formalSyntax = require('./formal-syntax');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function fromCharCode(uint8Array) {
var batchSize = 10240;
var strings = [];
for (var i = 0; i < uint8Array.length; i += batchSize) {
var begin = i;
var end = Math.min(i + batchSize, uint8Array.length);
strings.push(String.fromCharCode.apply(null, uint8Array.subarray(begin, end)));
}
return strings.join('');
}
function fromCharCodeTrimmed(uint8Array) {
var begin = 0;
var end = uint8Array.length;
while (uint8Array[begin] === _formalSyntax.ASCII_SPACE) {
begin++;
}
while (uint8Array[end - 1] === _formalSyntax.ASCII_SPACE) {
end--;
}
if (begin !== 0 || end !== uint8Array.length) {
uint8Array = uint8Array.subarray(begin, end);
}
return fromCharCode(uint8Array);
}
function isEmpty(uint8Array) {
for (var i = 0; i < uint8Array.length; i++) {
if (uint8Array[i] !== _formalSyntax.ASCII_SPACE) {
return false;
}
}
return true;
}
var ParserInstance = function () {
function ParserInstance(input, options) {
_classCallCheck(this, ParserInstance);
this.remainder = new Uint8Array(input || 0);
this.options = options || {};
this.pos = 0;
}
_createClass(ParserInstance, [{
key: 'getTag',
value: function getTag() {
if (!this.tag) {
var syntaxChecker = function syntaxChecker(chr) {
return (0, _formalSyntax.IS_TAG)(chr) || chr === _formalSyntax.ASCII_ASTERISK || chr === _formalSyntax.ASCII_PLUS;
};
this.tag = this.getElement(syntaxChecker);
}
return this.tag;
}
}, {
key: 'getCommand',
value: function getCommand() {
if (!this.command) {
this.command = this.getElement(_formalSyntax.IS_COMMAND);
}
switch ((this.command || '').toString().toUpperCase()) {
case 'OK':
case 'NO':
case 'BAD':
case 'PREAUTH':
case 'BYE':
var lastRightBracket = this.remainder.lastIndexOf(_formalSyntax.ASCII_RIGHT_BRACKET);
if (this.remainder[1] === _formalSyntax.ASCII_LEFT_BRACKET && lastRightBracket > 1) {
this.humanReadable = fromCharCodeTrimmed(this.remainder.subarray(lastRightBracket + 1));
this.remainder = this.remainder.subarray(0, lastRightBracket + 1);
} else {
this.humanReadable = fromCharCodeTrimmed(this.remainder);
this.remainder = new Uint8Array(0);
}
break;
}
return this.command;
}
}, {
key: 'getElement',
value: function getElement(syntaxChecker) {
var element = void 0;
if (this.remainder[0] === _formalSyntax.ASCII_SPACE) {
throw new Error('Unexpected whitespace at position ' + this.pos);
}
var firstSpace = this.remainder.indexOf(_formalSyntax.ASCII_SPACE);
if (this.remainder.length > 0 && firstSpace !== 0) {
if (firstSpace === -1) {
element = this.remainder;
} else {
element = this.remainder.subarray(0, firstSpace);
}
for (var i = 0; i < element.length; i++) {
if (!syntaxChecker(element[i])) {
throw new Error('Unexpected char at position ' + (this.pos + i));
}
}
} else {
throw new Error('Unexpected end of input at position ' + this.pos);
}
this.pos += element.length;
this.remainder = this.remainder.subarray(element.length);
return fromCharCode(element);
}
}, {
key: 'getSpace',
value: function getSpace() {
if (!this.remainder.length) {
throw new Error('Unexpected end of input at position ' + this.pos);
}
if (this.remainder[0] !== _formalSyntax.ASCII_SPACE) {
throw new Error('Unexpected char at position ' + this.pos);
}
this.pos++;
this.remainder = this.remainder.subarray(1);
}
}, {
key: 'getAttributes',
value: function getAttributes() {
if (!this.remainder.length) {
throw new Error('Unexpected end of input at position ' + this.pos);
}
if (this.remainder[0] === _formalSyntax.ASCII_SPACE) {
throw new Error('Unexpected whitespace at position ' + this.pos);
}
return new TokenParser(this, this.pos, this.remainder.subarray(), this.options).getAttributes();
}
}]);
return ParserInstance;
}();
var Node = function () {
function Node(uint8Array, parentNode, startPos) {
_classCallCheck(this, Node);
this.uint8Array = uint8Array;
this.childNodes = [];
this.type = false;
this.closed = true;
this.valueSkip = [];
this.startPos = startPos;
this.valueStart = this.valueEnd = typeof startPos === 'number' ? startPos + 1 : 0;
if (parentNode) {
this.parentNode = parentNode;
parentNode.childNodes.push(this);
}
}
_createClass(Node, [{
key: 'getValue',
value: function getValue() {
var value = fromCharCode(this.getValueArray());
return this.valueToUpperCase ? value.toUpperCase() : value;
}
}, {
key: 'getValueLength',
value: function getValueLength() {
return this.valueEnd - this.valueStart - this.valueSkip.length;
}
}, {
key: 'getValueArray',
value: function getValueArray() {
var valueArray = this.uint8Array.subarray(this.valueStart, this.valueEnd);
if (this.valueSkip.length === 0) {
return valueArray;
}
var filteredArray = new Uint8Array(valueArray.length - this.valueSkip.length);
var begin = 0;
var offset = 0;
var skip = this.valueSkip.slice();
skip.push(valueArray.length);
skip.forEach(function (end) {
if (end > begin) {
var subArray = valueArray.subarray(begin, end);
filteredArray.set(subArray, offset);
offset += subArray.length;
}
begin = end + 1;
});
return filteredArray;
}
}, {
key: 'equals',
value: function equals(value, caseSensitive) {
if (this.getValueLength() !== value.length) {
return false;
}
return this.equalsAt(value, 0, caseSensitive);
}
}, {
key: 'equalsAt',
value: function equalsAt(value, index, caseSensitive) {
caseSensitive = typeof caseSensitive === 'boolean' ? caseSensitive : true;
if (index < 0) {
index = this.valueEnd + index;
while (this.valueSkip.indexOf(this.valueStart + index) >= 0) {
index--;
}
} else {
index = this.valueStart + index;
}
for (var i = 0; i < value.length; i++) {
while (this.valueSkip.indexOf(index - this.valueStart) >= 0) {
index++;
}
if (index >= this.valueEnd) {
return false;
}
var uint8Char = String.fromCharCode(this.uint8Array[index]);
var char = value[i];
if (!caseSensitive) {
uint8Char = uint8Char.toUpperCase();
char = char.toUpperCase();
}
if (uint8Char !== char) {
return false;
}
index++;
}
return true;
}
}, {
key: 'isNumber',
value: function isNumber() {
for (var i = 0; i < this.valueEnd - this.valueStart; i++) {
if (this.valueSkip.indexOf(i) >= 0) {
continue;
}
if (!this.isDigit(i)) {
return false;
}
}
return true;
}
}, {
key: 'isDigit',
value: function isDigit(index) {
if (index < 0) {
index = this.valueEnd + index;
while (this.valueSkip.indexOf(this.valueStart + index) >= 0) {
index--;
}
} else {
index = this.valueStart + index;
while (this.valueSkip.indexOf(this.valueStart + index) >= 0) {
index++;
}
}
return (0, _formalSyntax.IS_DIGIT)(this.uint8Array[index]);
}
}, {
key: 'containsChar',
value: function containsChar(char) {
var ascii = char.charCodeAt(0);
for (var i = this.valueStart; i < this.valueEnd; i++) {
if (this.valueSkip.indexOf(i - this.valueStart) >= 0) {
continue;
}
if (this.uint8Array[i] === ascii) {
return true;
}
}
return false;
}
}]);
return Node;
}();
var TokenParser = function () {
function TokenParser(parent, startPos, uint8Array) {
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
_classCallCheck(this, TokenParser);
this.uint8Array = uint8Array;
this.options = options;
this.parent = parent;
this.tree = this.currentNode = this.createNode();
this.pos = startPos || 0;
this.currentNode.type = 'TREE';
this.state = 'NORMAL';
if (this.options.valueAsString === undefined) {
this.options.valueAsString = true;
}
this.processString();
}
_createClass(TokenParser, [{
key: 'getAttributes',
value: function getAttributes() {
var _this = this;
var attributes = [];
var branch = attributes;
var walk = function walk(node) {
var elm = void 0;
var curBranch = branch;
var partial = void 0;
if (!node.closed && node.type === 'SEQUENCE' && node.equals('*')) {
node.closed = true;
node.type = 'ATOM';
}
// If the node was never closed, throw it
if (!node.closed) {
throw new Error('Unexpected end of input at position ' + (_this.pos + _this.uint8Array.length - 1));
}
switch (node.type.toUpperCase()) {
case 'LITERAL':
case 'STRING':
elm = {
type: node.type.toUpperCase(),
value: _this.options.valueAsString ? node.getValue() : node.getValueArray()
};
branch.push(elm);
break;
case 'SEQUENCE':
elm = {
type: node.type.toUpperCase(),
value: node.getValue()
};
branch.push(elm);
break;
case 'ATOM':
if (node.equals('NIL', true)) {
branch.push(null);
break;
}
elm = {
type: node.type.toUpperCase(),
value: node.getValue()
};
branch.push(elm);
break;
case 'SECTION':
branch = branch[branch.length - 1].section = [];
break;
case 'LIST':
elm = [];
branch.push(elm);
branch = elm;
break;
case 'PARTIAL':
partial = node.getValue().split('.').map(Number);
branch[branch.length - 1].partial = partial;
break;
}
node.childNodes.forEach(function (childNode) {
walk(childNode);
});
branch = curBranch;
};
walk(this.tree);
return attributes;
}
}, {
key: 'createNode',
value: function createNode(parentNode, startPos) {
return new Node(this.uint8Array, parentNode, startPos);
}
}, {
key: 'processString',
value: function processString() {
var _this2 = this;
var i = void 0;
var len = void 0;
var checkSP = function checkSP(pos) {
// jump to the next non whitespace pos
while (_this2.uint8Array[i + 1] === _formalSyntax.ASCII_SPACE) {
i++;
}
};
for (i = 0, len = this.uint8Array.length; i < len; i++) {
var chr = this.uint8Array[i];
switch (this.state) {
case 'NORMAL':
switch (chr) {
// DQUOTE starts a new string
case _formalSyntax.ASCII_DQUOTE:
this.currentNode = this.createNode(this.currentNode, i);
this.currentNode.type = 'string';
this.state = 'STRING';
this.currentNode.closed = false;
break;
// ( starts a new list
case _formalSyntax.ASCII_LEFT_PARENTHESIS:
this.currentNode = this.createNode(this.currentNode, i);
this.currentNode.type = 'LIST';
this.currentNode.closed = false;
break;
// ) closes a list
case _formalSyntax.ASCII_RIGHT_PARENTHESIS:
if (this.currentNode.type !== 'LIST') {
throw new Error('Unexpected list terminator ) at position ' + (this.pos + i));
}
this.currentNode.closed = true;
this.currentNode.endPos = this.pos + i;
this.currentNode = this.currentNode.parentNode;
checkSP();
break;
// ] closes section group
case _formalSyntax.ASCII_RIGHT_BRACKET:
if (this.currentNode.type !== 'SECTION') {
throw new Error('Unexpected section terminator ] at position ' + (this.pos + i));
}
this.currentNode.closed = true;
this.currentNode.endPos = this.pos + i;
this.currentNode = this.currentNode.parentNode;
checkSP();
break;
// < starts a new partial
case _formalSyntax.ASCII_LESS_THAN_SIGN:
if (this.uint8Array[i - 1] !== _formalSyntax.ASCII_RIGHT_BRACKET) {
this.currentNode = this.createNode(this.currentNode, i);
this.currentNode.type = 'ATOM';
this.currentNode.valueStart = i;
this.currentNode.valueEnd = i + 1;
this.state = 'ATOM';
} else {
this.currentNode = this.createNode(this.currentNode, i);
this.currentNode.type = 'PARTIAL';
this.state = 'PARTIAL';
this.currentNode.closed = false;
}
break;
// { starts a new literal
case _formalSyntax.ASCII_LEFT_CURLY_BRACKET:
this.currentNode = this.createNode(this.currentNode, i);
this.currentNode.type = 'LITERAL';
this.state = 'LITERAL';
this.currentNode.closed = false;
break;
// ( starts a new sequence
case _formalSyntax.ASCII_ASTERISK:
this.currentNode = this.createNode(this.currentNode, i);
this.currentNode.type = 'SEQUENCE';
this.currentNode.valueStart = i;
this.currentNode.valueEnd = i + 1;
this.currentNode.closed = false;
this.state = 'SEQUENCE';
break;
// normally a space should never occur
case _formalSyntax.ASCII_SPACE:
// just ignore
break;
// start of a literal8, handle in case ASCII_LEFT_CURLY_BRACKET
case _formalSyntax.ASCII_TILDE:
break;
// [ starts section
case _formalSyntax.ASCII_LEFT_BRACKET:
// If it is the *first* element after response command, then process as a response argument list
if (['OK', 'NO', 'BAD', 'BYE', 'PREAUTH'].indexOf(this.parent.command.toUpperCase()) >= 0 && this.currentNode === this.tree) {
this.currentNode.endPos = this.pos + i;
this.currentNode = this.createNode(this.currentNode, i);
this.currentNode.type = 'ATOM';
this.currentNode = this.createNode(this.currentNode, i);
this.currentNode.type = 'SECTION';
this.currentNode.closed = false;
this.state = 'NORMAL';
// RFC2221 defines a response code REFERRAL whose payload is an
// RFC2192/RFC5092 imapurl that we will try to parse as an ATOM but
// fail quite badly at parsing. Since the imapurl is such a unique
// (and crazy) term, we just specialize that case here.
if (fromCharCode(this.uint8Array.subarray(i + 1, i + 10)).toUpperCase() === 'REFERRAL ') {
// create the REFERRAL atom
this.currentNode = this.createNode(this.currentNode, this.pos + i + 1);
this.currentNode.type = 'ATOM';
this.currentNode.endPos = this.pos + i + 8;
this.currentNode.valueStart = i + 1;
this.currentNode.valueEnd = i + 9;
this.currentNode.valueToUpperCase = true;
this.currentNode = this.currentNode.parentNode;
// eat all the way through the ] to be the IMAPURL token.
this.currentNode = this.createNode(this.currentNode, this.pos + i + 10);
// just call this an ATOM, even though IMAPURL might be more correct
this.currentNode.type = 'ATOM';
// jump i to the ']'
i = this.uint8Array.indexOf(_formalSyntax.ASCII_RIGHT_BRACKET, i + 10);
this.currentNode.endPos = this.pos + i - 1;
this.currentNode.valueStart = this.currentNode.startPos - this.pos;
this.currentNode.valueEnd = this.currentNode.endPos - this.pos + 1;
this.currentNode = this.currentNode.parentNode;
// close out the SECTION
this.currentNode.closed = true;
this.currentNode = this.currentNode.parentNode;
checkSP();
}
break;
}
/* falls through */
default:
// Any ATOM supported char starts a new Atom sequence, otherwise throw an error
// Allow \ as the first char for atom to support system flags
// Allow % to support LIST '' %
if (!(0, _formalSyntax.IS_ATOM_CHAR)(chr) && chr !== _formalSyntax.ASCII_BACKSLASH && chr !== _formalSyntax.ASCII_PERCENT_SIGN) {
throw new Error('Unexpected char at position ' + (this.pos + i));
}
this.currentNode = this.createNode(this.currentNode, i);
this.currentNode.type = 'ATOM';
this.currentNode.valueStart = i;
this.currentNode.valueEnd = i + 1;
this.state = 'ATOM';
break;
}
break;
case 'ATOM':
// space finishes an atom
if (chr === _formalSyntax.ASCII_SPACE) {
this.currentNode.endPos = this.pos + i - 1;
this.currentNode = this.currentNode.parentNode;
this.state = 'NORMAL';
break;
}
//
if (this.currentNode.parentNode && (chr === _formalSyntax.ASCII_RIGHT_PARENTHESIS && this.currentNode.parentNode.type === 'LIST' || chr === _formalSyntax.ASCII_RIGHT_BRACKET && this.currentNode.parentNode.type === 'SECTION')) {
this.currentNode.endPos = this.pos + i - 1;
this.currentNode = this.currentNode.parentNode;
this.currentNode.closed = true;
this.currentNode.endPos = this.pos + i;
this.currentNode = this.currentNode.parentNode;
this.state = 'NORMAL';
checkSP();
break;
}
if ((chr === _formalSyntax.ASCII_COMMA || chr === _formalSyntax.ASCII_COLON) && this.currentNode.isNumber()) {
this.currentNode.type = 'SEQUENCE';
this.currentNode.closed = true;
this.state = 'SEQUENCE';
}
// [ starts a section group for this element
if (chr === _formalSyntax.ASCII_LEFT_BRACKET && (this.currentNode.equals('BODY', false) || this.currentNode.equals('BODY.PEEK', false))) {
this.currentNode.endPos = this.pos + i;
this.currentNode = this.createNode(this.currentNode.parentNode, this.pos + i);
this.currentNode.type = 'SECTION';
this.currentNode.closed = false;
this.state = 'NORMAL';
break;
}
if (chr === _formalSyntax.ASCII_LESS_THAN_SIGN) {
throw new Error('Unexpected start of partial at position ' + this.pos);
}
// if the char is not ATOM compatible, throw. Allow \* as an exception
if (!(0, _formalSyntax.IS_ATOM_CHAR)(chr) && chr !== _formalSyntax.ASCII_RIGHT_BRACKET && !(chr === _formalSyntax.ASCII_ASTERISK && this.currentNode.equals('\\'))) {
throw new Error('Unexpected char at position ' + (this.pos + i));
} else if (this.currentNode.equals('\\*')) {
throw new Error('Unexpected char at position ' + (this.pos + i));
}
this.currentNode.valueEnd = i + 1;
break;
case 'STRING':
// DQUOTE ends the string sequence
if (chr === _formalSyntax.ASCII_DQUOTE) {
this.currentNode.endPos = this.pos + i;
this.currentNode.closed = true;
this.currentNode = this.currentNode.parentNode;
this.state = 'NORMAL';
checkSP();
break;
}
// \ Escapes the following char
if (chr === _formalSyntax.ASCII_BACKSLASH) {
this.currentNode.valueSkip.push(i - this.currentNode.valueStart);
i++;
if (i >= len) {
throw new Error('Unexpected end of input at position ' + (this.pos + i));
}
chr = this.uint8Array[i];
}
/* // skip this check, otherwise the parser might explode on binary input
if (TEXT_CHAR().indexOf(chr) < 0) {
throw new Error('Unexpected char at position ' + (this.pos + i));
}
*/
this.currentNode.valueEnd = i + 1;
break;
case 'PARTIAL':
if (chr === _formalSyntax.ASCII_GREATER_THAN_SIGN) {
if (this.currentNode.equalsAt('.', -1)) {
throw new Error('Unexpected end of partial at position ' + this.pos);
}
this.currentNode.endPos = this.pos + i;
this.currentNode.closed = true;
this.currentNode = this.currentNode.parentNode;
this.state = 'NORMAL';
checkSP();
break;
}
if (chr === _formalSyntax.ASCII_FULL_STOP && (!this.currentNode.getValueLength() || this.currentNode.containsChar('.'))) {
throw new Error('Unexpected partial separator . at position ' + this.pos);
}
if (!(0, _formalSyntax.IS_DIGIT)(chr) && chr !== _formalSyntax.ASCII_FULL_STOP) {
throw new Error('Unexpected char at position ' + (this.pos + i));
}
if (chr !== _formalSyntax.ASCII_FULL_STOP && (this.currentNode.equals('0') || this.currentNode.equalsAt('.0', -2))) {
throw new Error('Invalid partial at position ' + (this.pos + i));
}
this.currentNode.valueEnd = i + 1;
break;
case 'LITERAL':
if (this.currentNode.started) {
this.currentNode.valueEnd = i + 1;
if (this.currentNode.getValueLength() >= this.currentNode.literalLength) {
this.currentNode.endPos = this.pos + i;
this.currentNode.closed = true;
this.currentNode = this.currentNode.parentNode;
this.state = 'NORMAL';
checkSP();
}
break;
}
if (chr === _formalSyntax.ASCII_PLUS) {
// assuming capability LITERAL+ or LITERAL-
this.currentNode.literalPlus = true;
break;
}
if (chr === _formalSyntax.ASCII_RIGHT_CURLY_BRACKET) {
if (!('literalLength' in this.currentNode)) {
throw new Error('Unexpected literal prefix end char } at position ' + (this.pos + i));
}
if (this.uint8Array[i + 1] === _formalSyntax.ASCII_NL) {
i++;
} else if (this.uint8Array[i + 1] === _formalSyntax.ASCII_CR && this.uint8Array[i + 2] === _formalSyntax.ASCII_NL) {
i += 2;
} else {
throw new Error('Unexpected char at position ' + (this.pos + i));
}
this.currentNode.valueStart = i + 1;
this.currentNode.literalLength = Number(this.currentNode.literalLength);
this.currentNode.started = true;
if (!this.currentNode.literalLength) {
// special case where literal content length is 0
// close the node right away, do not wait for additional input
this.currentNode.endPos = this.pos + i;
this.currentNode.closed = true;
this.currentNode = this.currentNode.parentNode;
this.state = 'NORMAL';
checkSP();
}
break;
}
if (!(0, _formalSyntax.IS_DIGIT)(chr)) {
throw new Error('Unexpected char at position ' + (this.pos + i));
}
if (this.currentNode.literalLength === '0') {
throw new Error('Invalid literal at position ' + (this.pos + i));
}
this.currentNode.literalLength = (this.currentNode.literalLength || '') + String.fromCharCode(chr);
break;
case 'SEQUENCE':
// space finishes the sequence set
if (chr === _formalSyntax.ASCII_SPACE) {
if (!this.currentNode.isDigit(-1) && !this.currentNode.equalsAt('*', -1)) {
throw new Error('Unexpected whitespace at position ' + (this.pos + i));
}
if (this.currentNode.equalsAt('*', -1) && !this.currentNode.equalsAt(':', -2)) {
throw new Error('Unexpected whitespace at position ' + (this.pos + i));
}
this.currentNode.closed = true;
this.currentNode.endPos = this.pos + i - 1;
this.currentNode = this.currentNode.parentNode;
this.state = 'NORMAL';
break;
} else if (this.currentNode.parentNode && chr === _formalSyntax.ASCII_RIGHT_BRACKET && this.currentNode.parentNode.type === 'SECTION') {
this.currentNode.endPos = this.pos + i - 1;
this.currentNode = this.currentNode.parentNode;
this.currentNode.closed = true;
this.currentNode.endPos = this.pos + i;
this.currentNode = this.currentNode.parentNode;
this.state = 'NORMAL';
checkSP();
break;
}
if (chr === _formalSyntax.ASCII_COLON) {
if (!this.currentNode.isDigit(-1) && !this.currentNode.equalsAt('*', -1)) {
throw new Error('Unexpected range separator : at position ' + (this.pos + i));
}
} else if (chr === _formalSyntax.ASCII_ASTERISK) {
if (!this.currentNode.equalsAt(',', -1) && !this.currentNode.equalsAt(':', -1)) {
throw new Error('Unexpected range wildcard at position ' + (this.pos + i));
}
} else if (chr === _formalSyntax.ASCII_COMMA) {
if (!this.currentNode.isDigit(-1) && !this.currentNode.equalsAt('*', -1)) {
throw new Error('Unexpected sequence separator , at position ' + (this.pos + i));
}
if (this.currentNode.equalsAt('*', -1) && !this.currentNode.equalsAt(':', -2)) {
throw new Error('Unexpected sequence separator , at position ' + (this.pos + i));
}
} else if (!(0, _formalSyntax.IS_DIGIT)(chr)) {
throw new Error('Unexpected char at position ' + (this.pos + i));
}
if ((0, _formalSyntax.IS_DIGIT)(chr) && this.currentNode.equalsAt('*', -1)) {
throw new Error('Unexpected number at position ' + (this.pos + i));
}
this.currentNode.valueEnd = i + 1;
break;
}
}
}
}]);
return TokenParser;
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZXIuanMiXSwibmFtZXMiOlsiYnVmZmVycyIsIm9wdGlvbnMiLCJwYXJzZXIiLCJQYXJzZXJJbnN0YW5jZSIsInJlc3BvbnNlIiwidGFnIiwiZ2V0VGFnIiwiZ2V0U3BhY2UiLCJjb21tYW5kIiwiZ2V0Q29tbWFuZCIsImluZGV4T2YiLCJ0b1VwcGVyQ2FzZSIsImdldEVsZW1lbnQiLCJJU19DT01NQU5EIiwiaXNFbXB0eSIsInJlbWFpbmRlciIsImF0dHJpYnV0ZXMiLCJnZXRBdHRyaWJ1dGVzIiwiaHVtYW5SZWFkYWJsZSIsImNvbmNhdCIsInR5cGUiLCJ2YWx1ZSIsImZyb21DaGFyQ29kZSIsInVpbnQ4QXJyYXkiLCJiYXRjaFNpemUiLCJzdHJpbmdzIiwiaSIsImxlbmd0aCIsImJlZ2luIiwiZW5kIiwiTWF0aCIsIm1pbiIsInB1c2giLCJTdHJpbmciLCJhcHBseSIsInN1YmFycmF5Iiwiam9pbiIsImZyb21DaGFyQ29kZVRyaW1tZWQiLCJBU0NJSV9TUEFDRSIsImlucHV0IiwiVWludDhBcnJheSIsInBvcyIsInN5bnRheENoZWNrZXIiLCJjaHIiLCJBU0NJSV9BU1RFUklTSyIsIkFTQ0lJX1BMVVMiLCJ0b1N0cmluZyIsImxhc3RSaWdodEJyYWNrZXQiLCJsYXN0SW5kZXhPZiIsIkFTQ0lJX1JJR0hUX0JSQUNLRVQiLCJBU0NJSV9MRUZUX0JSQUNLRVQiLCJlbGVtZW50IiwiRXJyb3IiLCJmaXJzdFNwYWNlIiwiVG9rZW5QYXJzZXIiLCJOb2RlIiwicGFyZW50Tm9kZSIsInN0YXJ0UG9zIiwiY2hpbGROb2RlcyIsImNsb3NlZCIsInZhbHVlU2tpcCIsInZhbHVlU3RhcnQiLCJ2YWx1ZUVuZCIsImdldFZhbHVlQXJyYXkiLCJ2YWx1ZVRvVXBwZXJDYXNlIiwidmFsdWVBcnJheSIsImZpbHRlcmVkQXJyYXkiLCJvZmZzZXQiLCJza2lwIiwic2xpY2UiLCJmb3JFYWNoIiwic3ViQXJyYXkiLCJzZXQiLCJjYXNlU2Vuc2l0aXZlIiwiZ2V0VmFsdWVMZW5ndGgiLCJlcXVhbHNBdCIsImluZGV4IiwidWludDhDaGFyIiwiY2hhciIsImlzRGlnaXQiLCJhc2NpaSIsImNoYXJDb2RlQXQiLCJwYXJlbnQiLCJ0cmVlIiwiY3VycmVudE5vZGUiLCJjcmVhdGVOb2RlIiwic3RhdGUiLCJ2YWx1ZUFzU3RyaW5nIiwidW5kZWZpbmVkIiwicHJvY2Vzc1N0cmluZyIsImJyYW5jaCIsIndhbGsiLCJlbG0iLCJjdXJCcmFuY2giLCJwYXJ0aWFsIiwibm9kZSIsImVxdWFscyIsImdldFZhbHVlIiwic2VjdGlvbiIsInNwbGl0IiwibWFwIiwiTnVtYmVyIiwiY2hpbGROb2RlIiwibGVuIiwiY2hlY2tTUCIsIkFTQ0lJX0RRVU9URSIsIkFTQ0lJX0xFRlRfUEFSRU5USEVTSVMiLCJBU0NJSV9SSUdIVF9QQVJFTlRIRVNJUyIsImVuZFBvcyIsIkFTQ0lJX0xFU1NfVEhBTl9TSUdOIiwiQVNDSUlfTEVGVF9DVVJMWV9CUkFDS0VUIiwiQVNDSUlfVElMREUiLCJBU0NJSV9CQUNLU0xBU0giLCJBU0NJSV9QRVJDRU5UX1NJR04iLCJBU0NJSV9DT01NQSIsIkFTQ0lJX0NPTE9OIiwiaXNOdW1iZXIiLCJBU0NJSV9HUkVBVEVSX1RIQU5fU0lHTiIsIkFTQ0lJX0ZVTExfU1RPUCIsImNvbnRhaW5zQ2hhciIsInN0YXJ0ZWQiLCJsaXRlcmFsTGVuZ3RoIiwibGl0ZXJhbFBsdXMiLCJBU0NJSV9SSUdIVF9DVVJMWV9CUkFDS0VUIiwiQVNDSUlfTkwiLCJBU0NJSV9DUiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7a0JBc3lCZSxVQUFVQSxPQUFWLEVBQWlDO0FBQUEsTUFBZEMsT0FBYyx1RUFBSixFQUFJOztBQUM5QyxNQUFJQyxTQUFTLElBQUlDLGNBQUosQ0FBbUJILE9BQW5CLEVBQTRCQyxPQUE1QixDQUFiO0FBQ0EsTUFBSUcsV0FBVyxFQUFmOztBQUVBQSxXQUFTQyxHQUFULEdBQWVILE9BQU9JLE1BQVAsRUFBZjtBQUNBSixTQUFPSyxRQUFQO0FBQ0FILFdBQVNJ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