UNPKG

@swordev/php-unserialize

Version:
136 lines (135 loc) 4.27 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.unserialize = void 0; function readUntil(array, keywords) { var value = ""; while (array.offset < array.length && keywords.indexOf(array[array.offset]) === -1) { value += array[array.offset]; array.offset += 1; } if (array.offset < array.length) array.offset += 1; return value; } function readString(array) { readUntil(array, ":"); readUntil(array, '"'); var string = readUntil(array, '"'); readUntil(array, ";"); return string; } function readNumber(array, keyword) { if (keyword === void 0) { keyword = ";"; } var numberString = readUntil(array, keyword); var number = Number(numberString); if (Number.isNaN(number)) throw new Error("Parse error: \"" + numberString + "\" is not a number."); return number; } function readBoolean(array) { var booleanString = readUntil(array, ";"); if (booleanString !== "0" && booleanString !== "1") throw new Error("Parse error: \"" + booleanString + "\" is not a boolean number."); var boolean = !!+booleanString; return boolean; } // eslint-disable-next-line @typescript-eslint/no-unused-vars function readNull(array) { return null; } function readArray(array) { var length = readNumber(array, ":"); var resultArray = []; // Shift out first bracket. readUntil(array, "{"); for (var i = 0; i < length; i++) { var key = readValue(array); var value = readValue(array); resultArray[key] = value; } readUntil(array, "}"); return resultArray; } function readName(array) { readUntil(array, ":"); readUntil(array, '"'); var name = readUntil(array, '"'); readUntil(array, ":"); return name; } function readObject(array) { var resultObjectName = readName(array); var resultObject = {}; var insideResultObject = (resultObject[resultObjectName] = {}); var length = readNumber(array, ":"); readUntil(array, "{"); for (var i = 0; i < length; i++) { var key = readValue(array); var value = readValue(array); insideResultObject[key] = value; } readUntil(array, "}"); return resultObject; } function readClass(array) { var resultClassName = readName(array); var resultClass = {}; var insideResultClass = (resultClass[resultClassName] = []); var length = readNumber(array, ":"); readUntil(array, "{"); for (var i = 0; i < length; i++) { var value = readValue(array); insideResultClass.push(value); } readUntil(array, "}"); return resultClass; } function readValue(array) { var type = readUntil(array, ":;"); switch (type.toLowerCase()) { case "s": // s:len<string>:"<string>"; return readString(array); case "i": // i:<integer>; case "d": // d:<float>; case "r": // r:<integer>; return readNumber(array); case "a": // a:len<array>:{<key>;<val>.....} return readArray(array); case "o": // o:len<object_class_name>:<object_class_name>:len<object>:{<key>;<val>....} return readObject(array); case "c": // c:len<class_name>:"<class_name>":len<val>:{<val>} return readClass(array); case "b": // b:<digit>; digit is either 1 or 0 return readBoolean(array); case "n": // n; null return readNull(array); default: throw new Error("Unknown type: \"" + type + "\" at offset " + array.offset); } } function read(array) { var key = readUntil(array, "|"); var value = readValue(array); var result = {}; result[key] = value; return result; } // eslint-disable-next-line @typescript-eslint/no-explicit-any function unserialize(text) { var result = {}; var array = Array.from(text); array.offset = 0; do { try { Object.assign(result, read(array)); } catch (err) { err.message += ', Left text: "' + array.slice(array.offset).join("") + '"'; throw err; } } while (array.offset < array.length); return result; } exports.unserialize = unserialize;