UNPKG

@graffy/common

Version:

Common libraries that used by various Graffy modules.

155 lines (125 loc) 4.53 kB
"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; }