serverless-offline-msk
Version:
A serverless offline plugin that enables AWS MSK events
231 lines (211 loc) • 5.18 kB
JavaScript
'use strict';
var from = require('es5-ext/array/from')
, primitiveSet = require('es5-ext/object/primitive-set')
, value = require('es5-ext/object/valid-value')
, callable = require('es5-ext/object/valid-callable')
, d = require('d')
, eolSet = require('./lib/ws-eol')
, wsSet = require('./lib/ws')
, hasOwnProperty = Object.prototype.hasOwnProperty
, preRegExpSet = primitiveSet.apply(null, from(';{=([,<>+-*/%&|^!~?:}'))
, nonNameSet = primitiveSet.apply(null, from(';{=([,<>+-*/%&|^!~?:})].'))
, move, startCollect, endCollect, collectNest
, $ws, $common, $string, $comment, $multiComment, $regExp
, i, char, line, columnIndex, afterWs, previousChar
, nest, nestedTokens, results
, userCode, userTriggerChar, isUserTriggerOperatorChar, userCallback
, quote
, collectIndex, data, nestRelease;
move = function (j) {
if (!char) return;
if (i >= j) return;
while (i !== j) {
if (!char) return;
if (hasOwnProperty.call(wsSet, char)) {
if (hasOwnProperty.call(eolSet, char)) {
columnIndex = i;
++line;
}
} else {
previousChar = char;
}
char = userCode[++i];
}
};
startCollect = function (oldNestRelease) {
if (collectIndex != null) nestedTokens.push([data, collectIndex, oldNestRelease]);
data = { point: i + 1, line: line, column: i + 1 - columnIndex };
collectIndex = i;
};
endCollect = function () {
var previous;
data.raw = userCode.slice(collectIndex, i);
results.push(data);
if (nestedTokens.length) {
previous = nestedTokens.pop();
data = previous[0];
collectIndex = previous[1];
nestRelease = previous[2];
return;
}
data = null;
collectIndex = null;
nestRelease = null;
};
collectNest = function () {
var old = nestRelease;
nestRelease = nest;
++nest;
move(i + 1);
startCollect(old);
return $ws;
};
$common = function () {
if ((char === '\'') || (char === '"')) {
quote = char;
char = userCode[++i];
return $string;
}
if ((char === '(') || (char === '{') || (char === '[')) {
++nest;
} else if ((char === ')') || (char === '}') || (char === ']')) {
if (nestRelease === --nest) endCollect();
} else if (char === '/') {
if (hasOwnProperty.call(preRegExpSet, previousChar)) {
char = userCode[++i];
return $regExp;
}
}
if ((char !== userTriggerChar) || (!isUserTriggerOperatorChar && previousChar && !afterWs &&
!hasOwnProperty.call(nonNameSet, previousChar))) {
previousChar = char;
char = userCode[++i];
return $ws;
}
return userCallback(i, previousChar, nest);
};
$comment = function () {
while (true) {
if (!char) return;
if (hasOwnProperty.call(eolSet, char)) {
columnIndex = i + 1;
++line;
return;
}
char = userCode[++i];
}
};
$multiComment = function () {
while (true) {
if (!char) return;
if (char === '*') {
char = userCode[++i];
if (char === '/') return;
continue;
}
if (hasOwnProperty.call(eolSet, char)) {
columnIndex = i + 1;
++line;
}
char = userCode[++i];
}
};
$ws = function () {
var next;
afterWs = false;
while (true) {
if (!char) return;
if (hasOwnProperty.call(wsSet, char)) {
afterWs = true;
if (hasOwnProperty.call(eolSet, char)) {
columnIndex = i + 1;
++line;
}
} else if (char === '/') {
next = userCode[i + 1];
if (next === '/') {
char = userCode[i += 2];
afterWs = true;
$comment();
} else if (next === '*') {
char = userCode[i += 2];
afterWs = true;
$multiComment();
} else {
break;
}
} else {
break;
}
char = userCode[++i];
}
return $common;
};
$string = function () {
while (true) {
if (!char) return;
if (char === quote) {
char = userCode[++i];
previousChar = quote;
return $ws;
}
if (char === '\\') {
if (hasOwnProperty.call(eolSet, userCode[++i])) {
columnIndex = i + 1;
++line;
}
}
char = userCode[++i];
}
};
$regExp = function () {
while (true) {
if (!char) return;
if (char === '/') {
previousChar = '/';
char = userCode[++i];
return $ws;
}
if (char === '\\') ++i;
char = userCode[++i];
}
};
module.exports = exports = function (code, triggerChar, callback) {
var state;
userCode = String(value(code));
userTriggerChar = String(value(triggerChar));
if (userTriggerChar.length !== 1) {
throw new TypeError(userTriggerChar + " should be one character long string");
}
userCallback = callable(callback);
isUserTriggerOperatorChar = hasOwnProperty.call(nonNameSet, userTriggerChar);
i = 0;
char = userCode[i];
line = 1;
columnIndex = 0;
afterWs = false;
previousChar = null;
nest = 0;
nestedTokens = [];
results = [];
exports.forceStop = false;
state = $ws;
while (state) state = state();
return results;
};
Object.defineProperties(exports, {
$ws: d($ws),
$common: d($common),
collectNest: d(collectNest),
move: d(move),
index: d.gs(function () { return i; }),
line: d.gs(function () { return line; }),
nest: d.gs(function () { return nest; }),
columnIndex: d.gs(function () { return columnIndex; }),
next: d(function (step) {
if (!char) return;
move(i + (step || 1));
return $ws();
}),
resume: d(function () { return $common; })
});