218 lines
8.0 KiB
JavaScript
218 lines
8.0 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
function isWhitespace(char) {
|
|
return "\u0020\u000D\u000A\u0009".indexOf(char) >= 0;
|
|
}
|
|
function untruncateJson(json) {
|
|
var contextStack = ["topLevel" /* TOP_LEVEL */];
|
|
var position = 0;
|
|
var respawnPosition;
|
|
var respawnStackLength;
|
|
var respawnReason;
|
|
var push = function (context) { return contextStack.push(context); };
|
|
var replace = function (context) {
|
|
return (contextStack[contextStack.length - 1] = context);
|
|
};
|
|
var setRespawn = function (reason) {
|
|
if (respawnPosition == null) {
|
|
respawnPosition = position;
|
|
respawnStackLength = contextStack.length;
|
|
respawnReason = reason;
|
|
}
|
|
};
|
|
var clearRespawn = function (reason) {
|
|
if (reason === respawnReason) {
|
|
respawnPosition = undefined;
|
|
respawnStackLength = undefined;
|
|
respawnReason = undefined;
|
|
}
|
|
};
|
|
var pop = function () { return contextStack.pop(); };
|
|
var dontConsumeCharacter = function () { return position--; };
|
|
var startAny = function (char) {
|
|
if ("0" <= char && char <= "9") {
|
|
push("number" /* NUMBER */);
|
|
return;
|
|
}
|
|
switch (char) {
|
|
case '"':
|
|
push("string" /* STRING */);
|
|
return;
|
|
case "-":
|
|
push("numberNeedsDigit" /* NUMBER_NEEDS_DIGIT */);
|
|
return;
|
|
case "t":
|
|
push("true" /* TRUE */);
|
|
return;
|
|
case "f":
|
|
push("false" /* FALSE */);
|
|
return;
|
|
case "n":
|
|
push("null" /* NULL */);
|
|
return;
|
|
case "[":
|
|
push("arrayNeedsValue" /* ARRAY_NEEDS_VALUE */);
|
|
return;
|
|
case "{":
|
|
push("objectNeedsKey" /* OBJECT_NEEDS_KEY */);
|
|
return;
|
|
}
|
|
};
|
|
for (var length = json.length; position < length; position++) {
|
|
var char = json[position];
|
|
switch (contextStack[contextStack.length - 1]) {
|
|
case "topLevel" /* TOP_LEVEL */:
|
|
startAny(char);
|
|
break;
|
|
case "string" /* STRING */:
|
|
switch (char) {
|
|
case '"':
|
|
pop();
|
|
break;
|
|
case "\\":
|
|
setRespawn("stringEscape" /* STRING_ESCAPE */);
|
|
push("stringEscaped" /* STRING_ESCAPED */);
|
|
break;
|
|
}
|
|
break;
|
|
case "stringEscaped" /* STRING_ESCAPED */:
|
|
if (char === "u") {
|
|
push("stringUnicode" /* STRING_UNICODE */);
|
|
}
|
|
else {
|
|
clearRespawn("stringEscape" /* STRING_ESCAPE */);
|
|
pop();
|
|
}
|
|
break;
|
|
case "stringUnicode" /* STRING_UNICODE */:
|
|
if (position - json.lastIndexOf("u", position) === 4) {
|
|
clearRespawn("stringEscape" /* STRING_ESCAPE */);
|
|
pop();
|
|
}
|
|
break;
|
|
case "number" /* NUMBER */:
|
|
if (char === ".") {
|
|
replace("numberNeedsDigit" /* NUMBER_NEEDS_DIGIT */);
|
|
}
|
|
else if (char === "e" || char === "E") {
|
|
replace("numberNeedsExponent" /* NUMBER_NEEDS_EXPONENT */);
|
|
}
|
|
else if (char < "0" || char > "9") {
|
|
dontConsumeCharacter();
|
|
pop();
|
|
}
|
|
break;
|
|
case "numberNeedsDigit" /* NUMBER_NEEDS_DIGIT */:
|
|
replace("number" /* NUMBER */);
|
|
break;
|
|
case "numberNeedsExponent" /* NUMBER_NEEDS_EXPONENT */:
|
|
if (char === "+" || char === "-") {
|
|
replace("numberNeedsDigit" /* NUMBER_NEEDS_DIGIT */);
|
|
}
|
|
else {
|
|
replace("number" /* NUMBER */);
|
|
}
|
|
break;
|
|
case "true" /* TRUE */:
|
|
case "false" /* FALSE */:
|
|
case "null" /* NULL */:
|
|
if (char < "a" || char > "z") {
|
|
dontConsumeCharacter();
|
|
pop();
|
|
}
|
|
break;
|
|
case "arrayNeedsValue" /* ARRAY_NEEDS_VALUE */:
|
|
if (char === "]") {
|
|
pop();
|
|
}
|
|
else if (!isWhitespace(char)) {
|
|
clearRespawn("collectionItem" /* COLLECTION_ITEM */);
|
|
replace("arrayNeedsComma" /* ARRAY_NEEDS_COMMA */);
|
|
startAny(char);
|
|
}
|
|
break;
|
|
case "arrayNeedsComma" /* ARRAY_NEEDS_COMMA */:
|
|
if (char === "]") {
|
|
pop();
|
|
}
|
|
else if (char === ",") {
|
|
setRespawn("collectionItem" /* COLLECTION_ITEM */);
|
|
replace("arrayNeedsValue" /* ARRAY_NEEDS_VALUE */);
|
|
}
|
|
break;
|
|
case "objectNeedsKey" /* OBJECT_NEEDS_KEY */:
|
|
if (char === "}") {
|
|
pop();
|
|
}
|
|
else if (char === '"') {
|
|
setRespawn("collectionItem" /* COLLECTION_ITEM */);
|
|
replace("objectNeedsColon" /* OBJECT_NEEDS_COLON */);
|
|
push("string" /* STRING */);
|
|
}
|
|
break;
|
|
case "objectNeedsColon" /* OBJECT_NEEDS_COLON */:
|
|
if (char === ":") {
|
|
replace("objectNeedsValue" /* OBJECT_NEEDS_VALUE */);
|
|
}
|
|
break;
|
|
case "objectNeedsValue" /* OBJECT_NEEDS_VALUE */:
|
|
if (!isWhitespace(char)) {
|
|
clearRespawn("collectionItem" /* COLLECTION_ITEM */);
|
|
replace("objectNeedsComma" /* OBJECT_NEEDS_COMMA */);
|
|
startAny(char);
|
|
}
|
|
break;
|
|
case "objectNeedsComma" /* OBJECT_NEEDS_COMMA */:
|
|
if (char === "}") {
|
|
pop();
|
|
}
|
|
else if (char === ",") {
|
|
setRespawn("collectionItem" /* COLLECTION_ITEM */);
|
|
replace("objectNeedsKey" /* OBJECT_NEEDS_KEY */);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (respawnStackLength != null) {
|
|
contextStack.length = respawnStackLength;
|
|
}
|
|
var result = [
|
|
respawnPosition != null ? json.slice(0, respawnPosition) : json,
|
|
];
|
|
var finishWord = function (word) {
|
|
return result.push(word.slice(json.length - json.lastIndexOf(word[0])));
|
|
};
|
|
for (var i = contextStack.length - 1; i >= 0; i--) {
|
|
switch (contextStack[i]) {
|
|
case "string" /* STRING */:
|
|
result.push('"');
|
|
break;
|
|
case "numberNeedsDigit" /* NUMBER_NEEDS_DIGIT */:
|
|
case "numberNeedsExponent" /* NUMBER_NEEDS_EXPONENT */:
|
|
result.push("0");
|
|
break;
|
|
case "true" /* TRUE */:
|
|
finishWord("true");
|
|
break;
|
|
case "false" /* FALSE */:
|
|
finishWord("false");
|
|
break;
|
|
case "null" /* NULL */:
|
|
finishWord("null");
|
|
break;
|
|
case "arrayNeedsValue" /* ARRAY_NEEDS_VALUE */:
|
|
case "arrayNeedsComma" /* ARRAY_NEEDS_COMMA */:
|
|
result.push("]");
|
|
break;
|
|
case "objectNeedsKey" /* OBJECT_NEEDS_KEY */:
|
|
case "objectNeedsColon" /* OBJECT_NEEDS_COLON */:
|
|
case "objectNeedsValue" /* OBJECT_NEEDS_VALUE */:
|
|
case "objectNeedsComma" /* OBJECT_NEEDS_COMMA */:
|
|
result.push("}");
|
|
break;
|
|
}
|
|
}
|
|
return result.join("");
|
|
}
|
|
exports.default = untruncateJson;
|
|
//# sourceMappingURL=index.js.map
|