function isWhitespace(char) { return "\u0020\u000D\u000A\u0009".indexOf(char) >= 0; } export default 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(""); } //# sourceMappingURL=index.js.map