| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | /*	MIT License http://www.opensource.org/licenses/mit-license.php*/"use strict";const cache = new WeakMap();class ObjectStructure {	constructor() {		this.keys = undefined;		this.children = undefined;	}	getKeys(keys) {		if (this.keys === undefined) this.keys = keys;		return this.keys;	}	key(key) {		if (this.children === undefined) this.children = new Map();		const child = this.children.get(key);		if (child !== undefined) return child;		const newChild = new ObjectStructure();		this.children.set(key, newChild);		return newChild;	}}const getCachedKeys = (keys, cacheAssoc) => {	let root = cache.get(cacheAssoc);	if (root === undefined) {		root = new ObjectStructure();		cache.set(cacheAssoc, root);	}	let current = root;	for (const key of keys) {		current = current.key(key);	}	return current.getKeys(keys);};class PlainObjectSerializer {	serialize(obj, { write }) {		const keys = Object.keys(obj);		if (keys.length > 128) {			// Objects with so many keys are unlikely to share structure			// with other objects			write(keys);			for (const key of keys) {				write(obj[key]);			}		} else if (keys.length > 1) {			write(getCachedKeys(keys, write));			for (const key of keys) {				write(obj[key]);			}		} else if (keys.length === 1) {			const key = keys[0];			write(key);			write(obj[key]);		} else {			write(null);		}	}	deserialize({ read }) {		const keys = read();		const obj = {};		if (Array.isArray(keys)) {			for (const key of keys) {				obj[key] = read();			}		} else if (keys !== null) {			obj[keys] = read();		}		return obj;	}}module.exports = PlainObjectSerializer;
 |