@graffy/common
Version:
Common libraries that used by various Graffy modules.
68 lines (55 loc) • 2.08 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
import { encodeArgs } from '../index.js';
export var ROOT_KEY = Symbol(); // We freeze constructed queries to guard against bugs that might mutate them.
// TODO: Don't freeze in production builds, as a perf optimization.
var freeze = function freeze(obj) {
return Object.freeze(obj);
};
function makeNode(object, key, ver) {
var _node$children;
if (!object) return;
var $key = object.$key,
$opt = object.$opt,
rest = _objectWithoutPropertiesLoose(object, ["$key", "$opt"]);
if (!key && !$key) {
throw Error("makeNode.no_key " + key + " " + JSON.stringify($key));
}
key = key || $key;
var node = key === ROOT_KEY ? {} : encodeArgs(Array.isArray(key) ? {
$cursor: key
} : key);
node.version = ver;
if (Array.isArray(object)) {
var children = object.map(function (obj) {
return makeNode(obj, undefined, ver);
}).filter(Boolean).sort(function (a, b) {
return a.key <= b.key ? -1 : 1;
});
if (children.length) node.children = children;
} else if (typeof object === 'object') {
if ($key && key !== $key) {
node.children = [makeNode(object, undefined, ver)];
} else {
var _children = Object.keys(rest).sort().map(function (key) {
return freeze(_extends({
key: key
}, makeNode(object[key], key, ver)));
}).filter(Boolean);
if (_children.length) node.children = _children;
}
} else {
node.value = typeof object === 'number' ? object : 1;
}
if (typeof node.end !== 'undefined' && !node.children) node.value = 1;
if ((_node$children = node.children) != null && _node$children.length || typeof node.value !== 'undefined') {
return freeze(node);
}
}
export default function query(obj, version) {
var _makeNode;
if (version === void 0) {
version = 0;
}
return ((_makeNode = makeNode(obj, ROOT_KEY, version)) == null ? void 0 : _makeNode.children) || [];
}