|
1 | 1 | (() => {
|
2 | 2 | // van.js
|
3 |
| - var protoOf = Object.getPrototypeOf; |
| 3 | + var object = Object; |
| 4 | + var protoOf = object.getPrototypeOf; |
4 | 5 | var changedStates;
|
5 | 6 | var derivedStates;
|
6 | 7 | var curDeps;
|
|
12 | 13 | var objProto = protoOf(alwaysConnectedDom);
|
13 | 14 | var funcProto = protoOf(protoOf);
|
14 | 15 | var _undefined;
|
15 |
| - var addAndScheduleOnFirst = (set, s, f, waitMs) => (set ?? (setTimeout(f, waitMs), /* @__PURE__ */ new Set())).add(s); |
| 16 | + var remove = "remove"; |
| 17 | + var evl = "eventListener"; |
| 18 | + var st = Set; |
| 19 | + var dc = document; |
| 20 | + var addAndScheduleOnFirst = (set, s, f, waitMs) => (set ?? (setTimeout(f, waitMs), new st())).add(s); |
16 | 21 | var runAndCaptureDeps = (f, deps, arg) => {
|
17 | 22 | let prevDeps = curDeps;
|
18 | 23 | curDeps = deps;
|
|
55 | 60 | _bindings: [],
|
56 | 61 | _listeners: []
|
57 | 62 | });
|
58 |
| - var bind = (f, dom) => { |
59 |
| - let deps = { _getters: /* @__PURE__ */ new Set(), _setters: /* @__PURE__ */ new Set() }, binding = { f }, prevNewDerives = curNewDerives; |
| 63 | + var bind = (f, dom2) => { |
| 64 | + let deps = { _getters: new st(), _setters: new st() }, binding = { f }, prevNewDerives = curNewDerives; |
60 | 65 | curNewDerives = [];
|
61 |
| - let newDom = runAndCaptureDeps(f, deps, dom); |
62 |
| - newDom = (newDom ?? document).nodeType ? newDom : new Text(newDom); |
| 66 | + let newDom = runAndCaptureDeps(f, deps, dom2); |
| 67 | + newDom = (newDom ?? dc).nodeType ? newDom : new Text(newDom); |
63 | 68 | for (let d of deps._getters)
|
64 | 69 | deps._setters.has(d) || (addStatesToGc(d), d._bindings.push(binding));
|
65 | 70 | for (let l of curNewDerives)
|
66 | 71 | l._dom = newDom;
|
67 | 72 | curNewDerives = prevNewDerives;
|
68 | 73 | return binding._dom = newDom;
|
69 | 74 | };
|
70 |
| - var derive = (f, s = state(), dom) => { |
71 |
| - let deps = { _getters: /* @__PURE__ */ new Set(), _setters: /* @__PURE__ */ new Set() }, listener = { f, s }; |
72 |
| - listener._dom = dom ?? curNewDerives?.push(listener) ?? alwaysConnectedDom; |
| 75 | + var derive = (f, s = state(), dom2) => { |
| 76 | + let deps = { _getters: new st(), _setters: new st() }, listener = { f, s }; |
| 77 | + listener._dom = dom2 ?? curNewDerives?.push(listener) ?? alwaysConnectedDom; |
73 | 78 | s.val = runAndCaptureDeps(f, deps, s.rawVal);
|
74 | 79 | for (let d of deps._getters)
|
75 | 80 | deps._setters.has(d) || (addStatesToGc(d), d._listeners.push(listener));
|
76 | 81 | return s;
|
77 | 82 | };
|
78 |
| - var add = (dom, ...children) => { |
79 |
| - for (let c of children.flat(Infinity)) { |
| 83 | + var add = (dom2, ...children) => { |
| 84 | + for (let c of children.flat(1 / 0)) { |
80 | 85 | let protoOfC = protoOf(c ?? 0);
|
81 | 86 | let child = protoOfC === stateProto ? bind(() => c.val) : protoOfC === funcProto ? bind(c) : c;
|
82 |
| - child != _undefined && dom.append(child); |
| 87 | + child != _undefined && dom2.append(child); |
83 | 88 | }
|
84 |
| - return dom; |
| 89 | + return dom2; |
85 | 90 | };
|
86 | 91 | var tag = (ns, name, ...args) => {
|
87 | 92 | let [props, ...children] = protoOf(args[0] ?? 0) === objProto ? args : [{}, ...args];
|
88 |
| - let dom = ns ? document.createElementNS(ns, name) : document.createElement(name); |
89 |
| - for (let [k, v] of Object.entries(props)) { |
90 |
| - let getPropDescriptor = (proto) => proto ? Object.getOwnPropertyDescriptor(proto, k) ?? getPropDescriptor(protoOf(proto)) : _undefined; |
| 93 | + let n = ns && "NS", doc = dc["createElement" + n](ns || name, name); |
| 94 | + for (let [k, v] of object.entries(props)) { |
| 95 | + let getPropDescriptor = (proto) => proto ? object.getOwnPropertyDescriptor(proto, k) ?? getPropDescriptor(protoOf(proto)) : _undefined; |
91 | 96 | let cacheKey = name + "," + k;
|
92 | 97 | let propSetter = propSetterCache[cacheKey] ??= getPropDescriptor(protoOf(dom))?.set ?? 0;
|
93 |
| - let setter = k.startsWith("on") ? (v2, oldV) => { |
| 98 | + let on = k.startsWith("on"), setter = on ? (v2, oldV) => { |
94 | 99 | let event = k.slice(2);
|
95 |
| - dom.removeEventListener(event, oldV); |
96 |
| - dom.addEventListener(event, v2); |
| 100 | + dom[remove + evl](event, oldV); |
| 101 | + dom["add" + evl](event, v2); |
97 | 102 | } : propSetter ? propSetter.bind(dom) : dom.setAttribute.bind(dom, k);
|
98 | 103 | let protoOfV = protoOf(v ?? 0);
|
99 |
| - k.startsWith("on") || protoOfV === funcProto && (v = derive(v), protoOfV = stateProto); |
| 104 | + on || protoOfV === funcProto && (v = derive(v), protoOfV = stateProto); |
100 | 105 | protoOfV === stateProto ? bind(() => (setter(v.val, v._oldVal), dom)) : setter(v);
|
101 | 106 | }
|
102 | 107 | return add(dom, children);
|
103 | 108 | };
|
104 | 109 | var handler = (ns) => ({ get: (_, name) => tag.bind(_undefined, ns, name) });
|
105 |
| - var update = (dom, newDom) => newDom ? newDom !== dom && dom.replaceWith(newDom) : dom.remove(); |
| 110 | + var update = (dom2, newDom) => newDom === dom2 || dom2[newDom ? "replaceWith" : remove](newDom); |
106 | 111 | var updateDoms = () => {
|
107 | 112 | let iter = 0, derivedStatesArray = [...changedStates].filter((s) => s.rawVal !== s._oldVal);
|
108 | 113 | do {
|
109 |
| - derivedStates = /* @__PURE__ */ new Set(); |
110 |
| - for (let l of new Set(derivedStatesArray.flatMap((s) => s._listeners = keepConnected(s._listeners)))) |
| 114 | + derivedStates = new st(); |
| 115 | + for (let l of new st(derivedStatesArray.flatMap((s) => s._listeners = keepConnected(s._listeners)))) |
111 | 116 | derive(l.f, l.s, l._dom), l._dom = _undefined;
|
112 | 117 | } while (++iter < 100 && (derivedStatesArray = [...derivedStates]).length);
|
113 | 118 | let changedStatesArray = [...changedStates].filter((s) => s.rawVal !== s._oldVal);
|
114 | 119 | changedStates = _undefined;
|
115 |
| - for (let b of new Set(changedStatesArray.flatMap((s) => s._bindings = keepConnected(s._bindings)))) |
| 120 | + for (let b of new st(changedStatesArray.flatMap((s) => s._bindings = keepConnected(s._bindings)))) |
116 | 121 | update(b._dom, bind(b.f, b._dom)), b._dom = _undefined;
|
117 | 122 | for (let s of changedStatesArray)
|
118 | 123 | s._oldVal = s.rawVal;
|
119 | 124 | };
|
120 | 125 | var van_default = {
|
121 | 126 | tags: new Proxy((ns) => new Proxy(tag, handler(ns)), handler()),
|
122 |
| - hydrate: (dom, f) => update(dom, bind(f, dom)), |
| 127 | + hydrate: (dom2, f) => update(dom2, bind(f, dom2)), |
123 | 128 | add,
|
124 | 129 | state,
|
125 | 130 | derive
|
|
169 | 174 | );
|
170 | 175 | return child;
|
171 | 176 | };
|
172 |
| - var withResultValidation = (f) => (dom) => { |
173 |
| - const r = validateChild(f(dom)); |
174 |
| - if (r !== dom && r instanceof Node) |
| 177 | + var withResultValidation = (f) => (dom2) => { |
| 178 | + const r = validateChild(f(dom2)); |
| 179 | + if (r !== dom2 && r instanceof Node) |
175 | 180 | expect(
|
176 | 181 | !r.isConnected,
|
177 | 182 | "If the result of complex binding function is not the same as previous one, it shouldn't be already connected to document"
|
|
186 | 191 | expect(!c?.isConnected, "You can't add a DOM Node that is already connected to document");
|
187 | 192 | return validateChild(c);
|
188 | 193 | });
|
189 |
| - var add2 = (dom, ...children) => { |
190 |
| - expect(dom instanceof Element, "1st argument of `van.add` function must be a DOM Element object"); |
191 |
| - return van_default.add(dom, ...checkChildren(children)); |
| 194 | + var add2 = (dom2, ...children) => { |
| 195 | + expect(dom2 instanceof Element, "1st argument of `van.add` function must be a DOM Element object"); |
| 196 | + return van_default.add(dom2, ...checkChildren(children)); |
192 | 197 | };
|
193 | 198 | var debugHandler = {
|
194 | 199 | get: (vanTags, name) => {
|
|
225 | 230 | };
|
226 | 231 | var _tags = _tagsNS("");
|
227 | 232 | var tags = new Proxy(tagsNS, { get: (_, name) => _tags[name] });
|
228 |
| - var hydrate = (dom, f) => { |
229 |
| - expect(dom instanceof Node, "1st argument of `van.hydrate` function must be a DOM Node object"); |
| 233 | + var hydrate = (dom2, f) => { |
| 234 | + expect(dom2 instanceof Node, "1st argument of `van.hydrate` function must be a DOM Node object"); |
230 | 235 | expect(typeof f === "function", "2nd argument of `van.hydrate` function must be a function");
|
231 |
| - return van_default.hydrate(dom, withResultValidation(f)); |
| 236 | + return van_default.hydrate(dom2, withResultValidation(f)); |
232 | 237 | };
|
233 | 238 | var van_debug_default = { add: add2, tags, state: state2, derive: derive2, hydrate, startCapturingErrors, stopCapturingErrors, get capturedErrors() {
|
234 | 239 | return capturedErrors;
|
|
0 commit comments