UNPKG

3.13 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4exports.default = void 0;
5
6function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
7
8function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
9
10function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
12class ContextTree {
13 constructor(value) {
14 this.root = createNode(value || {});
15 }
16
17 set(path, value) {
18 const parent = this.getParent(path, true);
19
20 if (!parent) {
21 updateNode(this.root, value, null);
22 return;
23 }
24
25 const key = path[path.length - 1];
26 const {
27 children
28 } = parent;
29
30 if (children[key]) {
31 updateNode(children[key], value, parent);
32 return;
33 }
34
35 children[key] = createNode(value, parent);
36 } // Get the "best" node (node or nearest parent) and return its value.
37
38
39 get(path) {
40 path = path || [];
41
42 if (path.length < 1) {
43 return this.root.value;
44 }
45
46 let branch = this.root;
47 let child;
48 let token;
49
50 for (let i = 0; i < path.length; i += 1) {
51 token = path[i];
52 child = branch.children;
53
54 if (!child[token]) {
55 break;
56 }
57
58 branch = child[token];
59 }
60
61 return branch && branch.protoValue;
62 }
63
64 getParent(path, ensureExists) {
65 if (!path || path.length < 1) {
66 return null;
67 }
68
69 if (path.length < 2) {
70 return this.root;
71 }
72
73 return path.slice(0, -1).reduce((branch, token) => {
74 if (!branch) {
75 return branch;
76 }
77
78 const {
79 children
80 } = branch;
81
82 if (!children[token] && ensureExists) {
83 children[token] = createNode(null, branch);
84 }
85
86 return children[token];
87 }, this.root);
88 }
89
90} // =========================
91// Utilities
92// =========================
93
94
95exports.default = ContextTree;
96
97function createNode(value, parent) {
98 return updateNode({
99 children: {}
100 }, value, parent);
101}
102
103function updateNode(node, value, parent) {
104 node.value = value || {};
105 node.protoValue = parent ? _objectSpread(_objectSpread({}, parent.protoValue), node.value) : node.value;
106 Object.keys(node.children).forEach(prop => {
107 const child = node.children[prop];
108 node.children[prop] = updateNode(child, child.value, node);
109 });
110 return node;
111}
\No newline at end of file