tiny-json
Version:
This is a node module that takes an unique approach to packing JSON data. Perfect if you've got a lot of JSON objects with a similar structure!
125 lines (101 loc) • 2.71 kB
JavaScript
;
var lz = require('lz-string');
module.exports = (function () {
function pack (value, pattern) {
// todo: compress the packed stuff some more
return compress(value, pattern);
}
function unpack (value, pattern) {
// todo: decompress the unpacked stuff some more
return decompress(value, pattern);
}
function compress (value, pattern) {
return compress[pattern[0]](value, pattern[1]);
}
function decompress (value, pattern) {
return decompress[pattern[0]](value, pattern[1]);
}
compress.mismatch = function (value, pattern) {
return new Error('compress: value ' + value + ' did not match pattern ' + pattern);
}
decompress.mismatch = function (value, pattern) {
return new Error('decompress: value ' + value + ' did not match pattern ' + pattern);
}
compress.object = function (value, pattern) {
var obj = [], key;
for (key in value) {
obj.push(compress(value[key], pattern[key]));
}
return obj;
};
decompress.object = function (value, pattern) {
var obj = {}, i = 0, key;
for (key in pattern) {
obj[key] = decompress(value[i], pattern[key]);
i += 1;
}
return obj;
};
compress.array = function (value, pattern) {
var arr = [], i;
for (i = 0; i < value.length; i++) {
arr.push(compress(value[i], pattern));
}
return arr;
};
decompress.array = function (value, pattern) {
var arr = [], i;
for (i = 0; i < value.length; i++) {
arr.push(decompress(value[i], pattern));
}
return arr;
};
compress.any = function (value, pattern) {
return value;
};
decompress.any = function (value, pattern) {
return value;
};
compress.boolean = function (value, pattern) {
return value ? 1 : 0;
};
decompress.boolean = function (value, pattern) {
return value === 1;
};
compress.enum = function (value, pattern) {
var index = pattern.indexOf(value)
if (~index) {
return index;
} else {
throw compress.mismatch(value, pattern);
}
};
decompress.enum = function (value, pattern) {
var out = pattern[value];
if (out) {
return out;
} else {
throw decompress.mismatch(value, pattern);
}
}
compress.string = function (value, pattern) {
return lz.compress(value);
};
decompress.string = function (value, pattern) {
return lz.decompress(value);
}
compress.number = function (value, pattern) {
return value;
};
decompress.number = function (value, pattern) {
return value;
}
return {
// public
pack: pack,
unpack: unpack,
// testing
_compress: compress,
_decompress: decompress
};
})();