@onesy/utils
Version:
45 lines (34 loc) • 1.4 kB
JavaScript
import is from './is';
const resolve = value => {
if (value === undefined) return 'undefined';
if (value instanceof Function || value instanceof Object) return value.toString();
return value;
};
const clean = value => {
if (is('string', value)) return value.replace(/(\s|\r|\n)+/, ' ');
return value;
};
const serializeValue = (value_, method) => {
let value = method(value_); // Ref circular value
if (value === undefined) return ''; // Is object-like make into an object
try {
if (is('object-like', value) && is('not-array-object', value) && value !== null) value = { ...value
};
} catch (error) {}
if (is('object', value)) return "{".concat(Object.keys(value).sort().map(key => "\"".concat(key, "\":").concat(serializeValue(value[key], method))).filter(item => item.slice(-1) !== ':').join(','), "}");
if (is('array', value)) return "[".concat(value.map(value__ => serializeValue(value__, method)).filter(Boolean).join(','), "]");
if (is('string', value)) return "\"".concat(value, "\"");
return clean(JSON.stringify(resolve(value)));
};
const serialize = value => {
const values = new WeakSet();
const getValue = value_ => {
if (typeof value_ === 'object' && value_ !== null) {
if (values.has(value_)) return;
values.add(value_);
}
return value_;
};
return serializeValue(value, getValue);
};
export default serialize;