UNPKG

restructer

Version:

The restructer library is a type-safe encoder/decoder up to one level for objects.

96 lines (95 loc) 3.62 kB
module.exports = { encode: function(obj) { let encoded_string = typeof string !== 'undefined' ? string : ''; for (var key in obj) { let k = key; let t = typeof obj[key]; let v = obj[key]; if (t === 'undefined') { encoded_string += '[' + k + ':undefined]=§'; } else if (v === null) { encoded_string += '[' + k + ':null]=§'; } else if (t === 'string') { let l = v.length; encoded_string += '[' + k + ':' + t + ':' + l + ']=' + v + '§'; } else if (t === 'object') { if (Array.isArray(obj[key])) { let l = obj[key].length; encoded_string += '[' + k + ':array:' + l + ']=§'; } else { let l = Object.keys(obj[key]); encoded_string += '[' + k + ':' + t + ':' + l + ']=§'; } let child = obj[key]; for (var ckey in child) { let ck = k + '<>' + ckey; let ct = typeof child[ckey]; let cv = child[ckey]; if (ct === 'undefined') { encoded_string += '[' + ck + ':undefined]=§'; } else if (cv === null) { encoded_string += '[' + ck + ':null]=§'; } else if (ct === 'string') { let cl = cv.length; encoded_string += '[' + ck + ':' + ct + ':' + cl + ']=' + cv + '§'; } else if (ct === 'object') { encoded_string += '[' + ck + ':base64]=' + btoa(JSON.stringify(cv)) + '§'; } else { encoded_string += '[' + ck + ':' + ct + ']=' + cv + '§'; } } } else { encoded_string += '[' + k + ':' + t + ']=' + v + '§'; } } return encoded_string; }, decode: function(encoded_string) { let decodedObject = {}; let objArray = encoded_string.split('§'); for (var i = 0; i < objArray.length; i++) { let lineArray = objArray[i].substring(1).split(']='); let keyParts = lineArray[0].split(':'); let value = lineArray[1]; let keyObjectParts = keyParts[0].split('<>'); if (keyObjectParts.length === 1) { if (keyParts[1] === 'string') { decodedObject[keyParts[0]] = String(value); } else if (keyParts[1] === 'number') { decodedObject[keyParts[0]] = parseInt(value); } else if (keyParts[1] === 'boolean') { decodedObject[keyParts[0]] = (value === 'true' ? true : false); } else if (keyParts[1] === 'array') { decodedObject[keyParts[0]] = new Array(); } else if (keyParts[1] === 'object') { decodedObject[keyParts[0]] = new Object(); } else if (keyParts[1] === 'base64') { decodedObject[keyParts[0]] = atob(value); } else if (keyParts[1] === 'null') { decodedObject[keyParts[0]] = null; } else if (keyParts[1] === 'undefined') { decodedObject[keyParts[0]] = undefined; } } else { if (keyParts[1] === 'string') { decodedObject[keyObjectParts[0]][keyObjectParts[1]] = String(value); } else if (keyParts[1] === 'number') { decodedObject[keyObjectParts[0]][keyObjectParts[1]] = parseInt(value); } else if (keyParts[1] === 'boolean') { decodedObject[keyObjectParts[0]][keyObjectParts[1]] = (value === 'true' ? true : false); } else if (keyParts[1] === 'null') { decodedObject[keyObjectParts[0]][keyObjectParts[1]] = null; } else if (keyParts[1] === 'array') { decodedObject[keyObjectParts[0]][keyObjectParts[1]] = new Array(); } else if (keyParts[1] === 'object') { decodedObject[keyObjectParts[0]][keyObjectParts[1]] = new Object(); } else if (keyParts[1] === 'base64') { decodedObject[keyObjectParts[0]][keyObjectParts[1]] = JSON.parse(atob(value)); } else if (keyParts[1] === 'undefined') { decodedObject[keyObjectParts[0]][keyObjectParts[1]] = undefined; } } } return decodedObject; }, }