@graffy/common
Version:
Common libraries that used by various Graffy modules.
155 lines (125 loc) • 4.53 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
exports.__esModule = true;
exports.encode = encode;
exports.decode = decode;
var _slice2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutPropertiesLoose"));
var _struct = require("./struct.js");
var _step2 = require("../ops/step.js");
var _util = require("../util.js");
function joinEncode(value, prefix) {
if (!prefix && typeof value === 'string') {
return value;
} else {
return (prefix || '\0') + (0, _struct.encode)(value);
}
}
function encode(arg) {
if (!(0, _util.isArgObject)(arg)) return {
key: joinEncode(arg, '')
};
var $first = arg.$first,
$last = arg.$last,
$after = arg.$after,
$before = arg.$before,
$since = arg.$since,
$until = arg.$until,
$cursor = arg.$cursor,
filter = (0, _objectWithoutPropertiesLoose2.default)(arg, ["$first", "$last", "$after", "$before", "$since", "$until", "$cursor"]);
var hasRangeArg = $before || $after || $since || $until || $first || $last;
if (!hasRangeArg && !$cursor) return {
key: joinEncode(arg, '')
};
(0, _util.throwIf)('first_and_$last', $first && $last);
(0, _util.throwIf)('after_and_$since', $after && $since);
(0, _util.throwIf)('before_and_$until', $before && $until);
(0, _util.throwIf)('cursor_and_range_arg', $cursor && hasRangeArg);
var key, end;
var prefix = (0, _util.isEmpty)(filter) ? '' : '\0' + (0, _struct.encode)(filter) + '.';
if ($cursor) key = joinEncode($cursor, prefix);
if ($after) key = (0, _step2.keyAfter)(joinEncode($after, prefix));
if ($before) end = (0, _step2.keyBefore)(joinEncode($before, prefix));
if ($since) key = joinEncode($since, prefix);
if ($until) end = joinEncode($until, prefix);
if (hasRangeArg) {
key = key || prefix;
end = end || prefix + "\uFFFF";
}
if ($last) {
var _ref = [end, key];
key = _ref[0];
end = _ref[1];
}
var node = {
key: key
};
if (typeof end !== 'undefined') node.end = end;
if ($first || $last) node.limit = $first || $last;
return node;
}
/*
Key and End might take one of these forms:
filter.since .. filter.until
since .. until
filter.cursor
filter OR cursor (not distinguished)
*/
function splitEncoded(encodedKey) {
if (encodedKey[0] === '\0') {
var _context, _context2;
var parts = (0, _slice2.default)(encodedKey).call(encodedKey, 1).split('.');
var _slice = (0, _slice2.default)(_context = (0, _concat.default)(_context2 = [undefined]).call(_context2, parts)).call(_context, -2),
prefix = _slice[0],
cursor = _slice[1];
var _keyStep = (0, _step2.keyStep)(cursor),
key = _keyStep.key,
step = _keyStep.step;
var value = key === '' || key === "\uFFFF" ? key : (0, _struct.decode)(key);
return {
prefix: prefix,
cursor: cursor,
value: value,
step: step
};
} else {
var _keyStep2 = (0, _step2.keyStep)(encodedKey),
_key = _keyStep2.key,
_step = _keyStep2.step;
return {
cursor: encodedKey,
value: _key,
step: _step
};
}
}
function decode(node) {
if (typeof node === 'string') return node;
var key = node.key,
end = node.end,
limit = node.limit;
if (key[0] !== '\0' && typeof end === 'undefined') return key;
var args = {};
if (limit) args[key < end ? '$first' : '$last'] = limit;
var kParts = splitEncoded(key);
if (kParts.prefix) (0, _assign.default)(args, (0, _struct.decode)(kParts.prefix));
if (typeof end === 'undefined') {
if ((0, _util.isEmpty)(args)) return kParts.value;
args.$cursor = kParts.value;
return args;
}
var eParts = splitEncoded(end);
(0, _util.throwIf)('prefix_mismatch', eParts.prefix !== kParts.prefix);
var _ref2 = eParts.cursor > kParts.cursor ? [kParts, eParts] : [eParts, kParts],
lower = _ref2[0],
upper = _ref2[1];
if (lower.cursor !== '') {
args[lower.step === 1 ? '$after' : '$since'] = lower.value;
}
if (upper.cursor !== "\uFFFF") {
args[upper.step === -1 ? '$before' : '$until'] = upper.value;
}
return args;
}