@graffy/common
Version:
Common libraries that used by various Graffy modules.
136 lines (113 loc) • 5.19 kB
JavaScript
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
import { encodeArgs } from '../index.js';
import { makePath, wrap } from '../../path/index.js';
import { isEmpty } from '../../util.js';
import { merge } from '../../ops/index.js';
import finalize from './finalize.js';
import { format } from '@graffy/testing';
export var ROOT_KEY = Symbol();
function makeNode(object, key, ver, linked) {
var _node$children;
if (linked === void 0) {
linked = [];
}
var _ref = object || {},
$key = _ref.$key,
$ref = _ref.$ref,
$ver = _ref.$ver,
$val = _ref.$val,
$put = _ref.$put,
$err = _ref.$err,
$opt = _ref.$opt,
rest = _objectWithoutPropertiesLoose(_ref, ["$key", "$ref", "$ver", "$val", "$put", "$err", "$opt"]);
if (!key && !$key) {
throw Error("makeNode.no_key " + key + " " + JSON.stringify($key));
} // if (key && $key) {
// throw Error(`makeNode.key_mismatch ${key} ${JSON.stringify($key)}`);
// }
key = key || $key;
var node = key === ROOT_KEY ? {} : encodeArgs(key);
node.version = ver;
if (typeof $ver !== 'undefined') node.version = $ver;
if (typeof $err !== 'undefined') node.error = $err;
if (typeof $opt !== 'undefined') node.options = $opt;
if (object === null || $val === null) {
node.end = node.key;
} else if ($val === true) {
node.value = rest;
} else if (typeof $val !== 'undefined') {
node.value = $val;
} else if ($ref) {
node.path = makePath($ref);
if (!isEmpty(rest)) {
linked.push(wrap(makeNode(rest, key, node.version, linked).children, node.path, node.version)[0]);
}
} else if (Array.isArray(object)) {
var children = object.map(function (obj) {
return makeNode(obj, undefined, node.version, linked);
}).filter(Boolean).reduce(function (acc, node) {
return merge(acc, [node]);
}, []);
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.entries(rest).map(function (_ref2) {
var key = _ref2[0],
obj = _ref2[1];
return makeNode(obj, key, node.version, linked);
}).filter(Boolean).sort(function (a, b) {
return a.key <= b.key ? -1 : 1;
});
if (_children.length) {
node.children = _children;
} else if (!node.end) {
node.end = node.key;
}
}
} else {
node.value = object;
}
if ($put) {
node.children = finalize(node.children, $put === true ? null : $put.map(function (arg) {
return encodeArgs(arg);
}), node.version);
} // TODO: Uncomment to introduce version invariant.
// if (typeof ver === 'undefined' && node.children?.length) {
// const cver = node.children[0].version;
// if (
// typeof cver !== undefined &&
// node.children.every(({ version }) => version === cver)
// ) {
// node.childen.forEach((child) => {
// delete child.version;
// });
// }
// }
if (key === ROOT_KEY) {
node.children = node.children || [];
for (var _iterator = _createForOfIteratorHelperLoose(linked), _step; !(_step = _iterator()).done;) {
var linkedNode = _step.value;
merge(node.children, [linkedNode]);
}
}
if ((_node$children = node.children) != null && _node$children.length || typeof node.end !== 'undefined' || typeof node.value !== 'undefined' || typeof node.path !== 'undefined' || typeof node.error !== 'undefined') {
return node;
}
}
export default function graph(rootObject, version) {
var _makeNode;
if (version === void 0) {
version = Date.now();
}
if (typeof rootObject === 'undefined' || rootObject === null) {
return rootObject;
}
return ((_makeNode = makeNode(rootObject, ROOT_KEY, version)) == null ? void 0 : _makeNode.children) || [];
}