veles 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +304 -0
- package/dist/chunk-EVX3ZDYT.js +271 -0
- package/dist/chunk-EVX3ZDYT.js.map +1 -0
- package/dist/index.cjs +727 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +63 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.js +441 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx-runtime-vDysOz5d.d.cts +250 -0
- package/dist/jsx-runtime-vDysOz5d.d.ts +250 -0
- package/dist/jsx-runtime.cjs +276 -0
- package/dist/jsx-runtime.cjs.map +1 -0
- package/dist/jsx-runtime.d.cts +1 -0
- package/dist/jsx-runtime.d.ts +1 -0
- package/dist/jsx-runtime.js +9 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/package.json +53 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Fragment,
|
|
3
|
+
createElement,
|
|
4
|
+
getComponentVelesNode,
|
|
5
|
+
identity,
|
|
6
|
+
onMount,
|
|
7
|
+
onUnmount
|
|
8
|
+
} from "./chunk-EVX3ZDYT.js";
|
|
9
|
+
|
|
10
|
+
// src/attach-component.ts
|
|
11
|
+
function attachComponent({
|
|
12
|
+
htmlElement,
|
|
13
|
+
component
|
|
14
|
+
}) {
|
|
15
|
+
const wrappedApp = createElement("div", { children: [component] });
|
|
16
|
+
const { velesElementNode } = getComponentVelesNode(wrappedApp);
|
|
17
|
+
htmlElement.appendChild(velesElementNode.html);
|
|
18
|
+
return () => {
|
|
19
|
+
velesElementNode.html.remove();
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// src/create-element/create-text-element.ts
|
|
24
|
+
function createTextElement(text) {
|
|
25
|
+
const unmountHandlers = [];
|
|
26
|
+
return {
|
|
27
|
+
velesStringElement: true,
|
|
28
|
+
// in case there is no text, we create an empty Text node, so we still can
|
|
29
|
+
// have a reference to it, replace it, call lifecycle methods, etc
|
|
30
|
+
html: document.createTextNode(text || ""),
|
|
31
|
+
_privateMethods: {
|
|
32
|
+
_addUnmountHandler: (cb) => {
|
|
33
|
+
unmountHandlers.push(cb);
|
|
34
|
+
},
|
|
35
|
+
_callUnmountHandlers: () => {
|
|
36
|
+
unmountHandlers.forEach((cb) => cb());
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// src/hooks/create-state.ts
|
|
43
|
+
function createState(initialValue, subscribeCallback) {
|
|
44
|
+
let value = initialValue;
|
|
45
|
+
let previousValue = void 0;
|
|
46
|
+
let trackingEffects = [];
|
|
47
|
+
let trackingSelectorElements = [];
|
|
48
|
+
let trackingAttributes = [];
|
|
49
|
+
let trackingIterators = [];
|
|
50
|
+
const result = {
|
|
51
|
+
// supposed to be used at the component level
|
|
52
|
+
trackValue: (cb, options = {}) => {
|
|
53
|
+
result.trackValueSelector(void 0, cb, options);
|
|
54
|
+
},
|
|
55
|
+
trackValueSelector(selector, cb, options = {}) {
|
|
56
|
+
const trackedValue = selector ? selector(value) : value;
|
|
57
|
+
trackingEffects.push({
|
|
58
|
+
cb,
|
|
59
|
+
selector,
|
|
60
|
+
comparator: options.comparator,
|
|
61
|
+
selectedValue: trackedValue
|
|
62
|
+
});
|
|
63
|
+
if (!options.skipFirstCall) {
|
|
64
|
+
if (options.callOnMount) {
|
|
65
|
+
onMount(() => {
|
|
66
|
+
cb(trackedValue);
|
|
67
|
+
});
|
|
68
|
+
} else {
|
|
69
|
+
cb(trackedValue);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
onUnmount(() => {
|
|
73
|
+
trackingEffects = trackingEffects.filter(
|
|
74
|
+
(trackingCallback) => trackingCallback.cb !== cb
|
|
75
|
+
);
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
useValue: (cb, comparator) => {
|
|
79
|
+
return result.useValueSelector(void 0, cb, comparator);
|
|
80
|
+
},
|
|
81
|
+
useValueSelector(selector, cb, comparator = identity) {
|
|
82
|
+
const selectedValue = selector ? selector(value) : value;
|
|
83
|
+
const returnedNode = cb(selectedValue);
|
|
84
|
+
const node = !returnedNode || typeof returnedNode === "string" ? createTextElement(returnedNode) : returnedNode;
|
|
85
|
+
trackingSelectorElements.push({
|
|
86
|
+
selector,
|
|
87
|
+
selectedValue,
|
|
88
|
+
cb,
|
|
89
|
+
node,
|
|
90
|
+
comparator
|
|
91
|
+
});
|
|
92
|
+
node._privateMethods._addUnmountHandler(() => {
|
|
93
|
+
trackingSelectorElements = trackingSelectorElements.filter(
|
|
94
|
+
(trackingSelectorElement) => trackingSelectorElement.cb !== cb
|
|
95
|
+
);
|
|
96
|
+
});
|
|
97
|
+
return node;
|
|
98
|
+
},
|
|
99
|
+
useValueIterator(options, cb) {
|
|
100
|
+
const children = [];
|
|
101
|
+
const elementsByKey = {};
|
|
102
|
+
const elements = options.selector ? options.selector(value) : value;
|
|
103
|
+
if (!Array.isArray(elements)) {
|
|
104
|
+
console.error("useValueIterator received non-array value");
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
elements.forEach((element, index) => {
|
|
108
|
+
let calculatedKey = "";
|
|
109
|
+
if (typeof options.key === "string" && typeof element === "object" && element !== null && options.key in element) {
|
|
110
|
+
calculatedKey = element[options.key];
|
|
111
|
+
} else if (typeof options.key === "function") {
|
|
112
|
+
calculatedKey = options.key({ element, index });
|
|
113
|
+
} else {
|
|
114
|
+
}
|
|
115
|
+
const elementState = createState(element);
|
|
116
|
+
if (!calculatedKey) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
let node = cb({ elementState, index });
|
|
120
|
+
elementsByKey[calculatedKey] = {
|
|
121
|
+
node,
|
|
122
|
+
index,
|
|
123
|
+
elementState
|
|
124
|
+
};
|
|
125
|
+
children.push([node, calculatedKey, elementState]);
|
|
126
|
+
});
|
|
127
|
+
const trackingParams = {};
|
|
128
|
+
trackingIterators.push(trackingParams);
|
|
129
|
+
const wrapperComponent = createElement(() => {
|
|
130
|
+
onUnmount(() => {
|
|
131
|
+
trackingIterators = trackingIterators.filter(
|
|
132
|
+
(currentTrackingParams) => currentTrackingParams !== trackingParams
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
return createElement("div", {
|
|
136
|
+
phantom: true,
|
|
137
|
+
children: children.map((child) => child[0])
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
trackingParams.cb = cb;
|
|
141
|
+
trackingParams.key = options.key;
|
|
142
|
+
trackingParams.elementsByKey = elementsByKey;
|
|
143
|
+
trackingParams.renderedElements = children;
|
|
144
|
+
trackingParams.wrapperComponent = wrapperComponent;
|
|
145
|
+
if (options.selector) {
|
|
146
|
+
trackingParams.selector = options.selector;
|
|
147
|
+
}
|
|
148
|
+
return wrapperComponent;
|
|
149
|
+
},
|
|
150
|
+
useAttribute: (cb) => {
|
|
151
|
+
const attributeValue = cb(value);
|
|
152
|
+
const attributeHelper = (htmlElement, attributeName, node) => {
|
|
153
|
+
trackingAttributes.push({ cb, htmlElement, attributeName });
|
|
154
|
+
node._privateMethods._addUnmountHandler(() => {
|
|
155
|
+
trackingAttributes = trackingAttributes.filter(
|
|
156
|
+
(trackingAttribute) => trackingAttribute.cb !== cb
|
|
157
|
+
);
|
|
158
|
+
});
|
|
159
|
+
return attributeValue;
|
|
160
|
+
};
|
|
161
|
+
attributeHelper.velesAttribute = true;
|
|
162
|
+
return attributeHelper;
|
|
163
|
+
},
|
|
164
|
+
// useful for stuff like callbacks
|
|
165
|
+
getValue: () => {
|
|
166
|
+
return value;
|
|
167
|
+
},
|
|
168
|
+
getPreviousValue: () => {
|
|
169
|
+
return previousValue;
|
|
170
|
+
},
|
|
171
|
+
// set up new value only through the callback which
|
|
172
|
+
// gives the latest value to ensure no outdated data
|
|
173
|
+
// can be used for the state
|
|
174
|
+
setValue: (newValueCB) => {
|
|
175
|
+
const newValue = newValueCB(value);
|
|
176
|
+
if (newValue !== value) {
|
|
177
|
+
previousValue = value;
|
|
178
|
+
value = newValue;
|
|
179
|
+
result._triggerUpdates();
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
// TODO: remove it from this object completely
|
|
183
|
+
// and access it from closure
|
|
184
|
+
_triggerUpdates: () => {
|
|
185
|
+
trackingSelectorElements = trackingSelectorElements.map(
|
|
186
|
+
(selectorTrackingElement) => {
|
|
187
|
+
const { selectedValue, selector, cb, node, comparator } = selectorTrackingElement;
|
|
188
|
+
const newSelectedValue = selector ? selector(value) : value;
|
|
189
|
+
if (comparator(selectedValue, newSelectedValue)) {
|
|
190
|
+
return selectorTrackingElement;
|
|
191
|
+
}
|
|
192
|
+
const returnednewNode = cb(newSelectedValue);
|
|
193
|
+
const newNode = !returnednewNode || typeof returnednewNode === "string" ? createTextElement(returnednewNode) : returnednewNode;
|
|
194
|
+
const { velesElementNode: oldVelesElementNode } = getComponentVelesNode(node);
|
|
195
|
+
const { velesElementNode: newVelesElementNode } = getComponentVelesNode(newNode);
|
|
196
|
+
const parentVelesElement = oldVelesElementNode.parentVelesElement;
|
|
197
|
+
if (parentVelesElement) {
|
|
198
|
+
newVelesElementNode.parentVelesElement = parentVelesElement;
|
|
199
|
+
parentVelesElement.html.replaceChild(
|
|
200
|
+
newVelesElementNode.html,
|
|
201
|
+
oldVelesElementNode.html
|
|
202
|
+
);
|
|
203
|
+
parentVelesElement.childComponents = parentVelesElement.childComponents.map(
|
|
204
|
+
(childComponent) => childComponent === node ? newNode : node
|
|
205
|
+
);
|
|
206
|
+
node._privateMethods._callUnmountHandlers();
|
|
207
|
+
trackingSelectorElements.push({
|
|
208
|
+
selector,
|
|
209
|
+
selectedValue: newSelectedValue,
|
|
210
|
+
cb,
|
|
211
|
+
node: newNode,
|
|
212
|
+
comparator
|
|
213
|
+
});
|
|
214
|
+
newNode._privateMethods._addUnmountHandler(() => {
|
|
215
|
+
trackingSelectorElements = trackingSelectorElements.filter(
|
|
216
|
+
(trackingSelectorElement) => trackingSelectorElement.cb !== cb
|
|
217
|
+
);
|
|
218
|
+
});
|
|
219
|
+
} else {
|
|
220
|
+
console.log("parent node was not found");
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
selectedValue: newSelectedValue,
|
|
224
|
+
selector,
|
|
225
|
+
cb,
|
|
226
|
+
node: newNode,
|
|
227
|
+
comparator
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
);
|
|
231
|
+
trackingAttributes.forEach(({ cb, htmlElement, attributeName }) => {
|
|
232
|
+
const newAttributeValue = cb(value);
|
|
233
|
+
htmlElement.setAttribute(attributeName, newAttributeValue);
|
|
234
|
+
});
|
|
235
|
+
trackingEffects.forEach((trackingEffect) => {
|
|
236
|
+
const { cb, selectedValue, selector, comparator } = trackingEffect;
|
|
237
|
+
const newSelectedValue = selector ? selector(value) : value;
|
|
238
|
+
if (comparator ? comparator(selectedValue, newSelectedValue) : selectedValue === newSelectedValue) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
cb(newSelectedValue);
|
|
242
|
+
});
|
|
243
|
+
trackingIterators.forEach((trackingIterator) => {
|
|
244
|
+
const {
|
|
245
|
+
cb,
|
|
246
|
+
key,
|
|
247
|
+
renderedElements,
|
|
248
|
+
elementsByKey,
|
|
249
|
+
wrapperComponent,
|
|
250
|
+
selector
|
|
251
|
+
} = trackingIterator;
|
|
252
|
+
if (!wrapperComponent) {
|
|
253
|
+
console.error("there is no wrapper component for the iterator");
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const { velesElementNode: wrapperVelesElementNode } = getComponentVelesNode(wrapperComponent);
|
|
257
|
+
const parentVelesElement = wrapperVelesElementNode.parentVelesElement;
|
|
258
|
+
if (!parentVelesElement) {
|
|
259
|
+
console.error(
|
|
260
|
+
"there is no parent Veles node for the iterator wrapper"
|
|
261
|
+
);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const elements = selector ? selector(value) : value;
|
|
265
|
+
if (Array.isArray(elements)) {
|
|
266
|
+
const newRenderedElements = [];
|
|
267
|
+
const newElementsByKey = {};
|
|
268
|
+
const renderedExistingElements = {};
|
|
269
|
+
elements.forEach((element, index) => {
|
|
270
|
+
let calculatedKey = "";
|
|
271
|
+
if (typeof key === "string" && typeof element === "object" && element !== null && key in element) {
|
|
272
|
+
calculatedKey = element[key];
|
|
273
|
+
} else if (typeof key === "function") {
|
|
274
|
+
calculatedKey = key({ element, index });
|
|
275
|
+
} else {
|
|
276
|
+
}
|
|
277
|
+
if (!calculatedKey) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const existingElement = elementsByKey[calculatedKey];
|
|
281
|
+
if (existingElement) {
|
|
282
|
+
renderedExistingElements[calculatedKey] = true;
|
|
283
|
+
const currentValue = existingElement.elementState.getValue();
|
|
284
|
+
if (currentValue !== element) {
|
|
285
|
+
existingElement.elementState.setValue(() => element);
|
|
286
|
+
}
|
|
287
|
+
newRenderedElements.push([
|
|
288
|
+
existingElement.node,
|
|
289
|
+
calculatedKey,
|
|
290
|
+
existingElement.elementState
|
|
291
|
+
]);
|
|
292
|
+
newElementsByKey[calculatedKey] = {
|
|
293
|
+
elementState: existingElement.elementState,
|
|
294
|
+
index,
|
|
295
|
+
node: existingElement.node
|
|
296
|
+
};
|
|
297
|
+
} else {
|
|
298
|
+
const elementState = createState(element);
|
|
299
|
+
const node = cb({ elementState, index });
|
|
300
|
+
newRenderedElements.push([node, calculatedKey, elementState]);
|
|
301
|
+
newElementsByKey[calculatedKey] = {
|
|
302
|
+
elementState,
|
|
303
|
+
index,
|
|
304
|
+
node
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
const positioningOffset = {};
|
|
309
|
+
let newElementsCount = 0;
|
|
310
|
+
let offset = 0;
|
|
311
|
+
let currentElement = null;
|
|
312
|
+
newRenderedElements.forEach((newRenderedElement, index) => {
|
|
313
|
+
var _a, _b, _c;
|
|
314
|
+
if (positioningOffset[index]) {
|
|
315
|
+
offset = offset + positioningOffset[index];
|
|
316
|
+
}
|
|
317
|
+
const [newNode, calculatedKey, newState] = newRenderedElement;
|
|
318
|
+
const existingElement = elementsByKey[calculatedKey];
|
|
319
|
+
if (existingElement) {
|
|
320
|
+
const { velesElementNode: existingElementNode } = getComponentVelesNode(existingElement.node);
|
|
321
|
+
if (existingElement.index + offset === index) {
|
|
322
|
+
currentElement = existingElementNode.html;
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
if (existingElement.index + offset > index) {
|
|
326
|
+
if (currentElement) {
|
|
327
|
+
currentElement.after(existingElementNode.html);
|
|
328
|
+
positioningOffset[existingElement.index + 1] = -1;
|
|
329
|
+
} else {
|
|
330
|
+
const firstRenderedElement = (_a = renderedElements[0]) == null ? void 0 : _a[0];
|
|
331
|
+
if (firstRenderedElement) {
|
|
332
|
+
const { velesElementNode: firstRenderedVelesNode } = getComponentVelesNode(firstRenderedElement);
|
|
333
|
+
firstRenderedVelesNode.html.before(
|
|
334
|
+
existingElementNode.html
|
|
335
|
+
);
|
|
336
|
+
} else {
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
currentElement = existingElementNode.html;
|
|
340
|
+
offset = offset + 1;
|
|
341
|
+
} else {
|
|
342
|
+
if (currentElement) {
|
|
343
|
+
currentElement.after(existingElementNode.html);
|
|
344
|
+
positioningOffset[existingElement.index + 1] = 1;
|
|
345
|
+
} else {
|
|
346
|
+
const firstRenderedElement = (_b = renderedElements[0]) == null ? void 0 : _b[0];
|
|
347
|
+
if (firstRenderedElement) {
|
|
348
|
+
const { velesElementNode: firstRenderedVelesNode } = getComponentVelesNode(firstRenderedElement);
|
|
349
|
+
firstRenderedVelesNode.html.before(
|
|
350
|
+
existingElementNode.html
|
|
351
|
+
);
|
|
352
|
+
} else {
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
currentElement = existingElementNode.html;
|
|
356
|
+
offset = offset - 1;
|
|
357
|
+
}
|
|
358
|
+
} else {
|
|
359
|
+
const { velesElementNode: newNodeVelesElement } = getComponentVelesNode(newNode);
|
|
360
|
+
newNodeVelesElement.parentVelesElement = parentVelesElement;
|
|
361
|
+
if (currentElement) {
|
|
362
|
+
currentElement.after(newNodeVelesElement.html);
|
|
363
|
+
} else {
|
|
364
|
+
const firstRenderedElement = (_c = renderedElements[0]) == null ? void 0 : _c[0];
|
|
365
|
+
if (firstRenderedElement) {
|
|
366
|
+
const { velesElementNode: firstRenderedVelesNode } = getComponentVelesNode(firstRenderedElement);
|
|
367
|
+
firstRenderedVelesNode.html.before(newNodeVelesElement.html);
|
|
368
|
+
} else {
|
|
369
|
+
parentVelesElement.html.prepend(newNodeVelesElement.html);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
offset = offset + 1;
|
|
373
|
+
currentElement = newNodeVelesElement.html;
|
|
374
|
+
newElementsCount = newElementsCount + 1;
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
if (renderedElements.length === newRenderedElements.length + newElementsCount) {
|
|
378
|
+
} else {
|
|
379
|
+
renderedElements.forEach(([oldNode, calculatedKey]) => {
|
|
380
|
+
if (renderedExistingElements[calculatedKey] === true) {
|
|
381
|
+
return;
|
|
382
|
+
} else {
|
|
383
|
+
const { velesElementNode: oldRenderedVelesNode } = getComponentVelesNode(oldNode);
|
|
384
|
+
oldRenderedVelesNode.html.remove();
|
|
385
|
+
oldNode._privateMethods._callUnmountHandlers();
|
|
386
|
+
if ("velesNode" in wrapperVelesElementNode) {
|
|
387
|
+
wrapperVelesElementNode.childComponents = wrapperVelesElementNode.childComponents.filter(
|
|
388
|
+
(childComponent) => childComponent !== oldNode
|
|
389
|
+
);
|
|
390
|
+
} else {
|
|
391
|
+
throw new Error("Wrapper iterator element is a string");
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
trackingIterator.renderedElements = newRenderedElements;
|
|
397
|
+
trackingIterator.elementsByKey = newElementsByKey;
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
};
|
|
402
|
+
if (subscribeCallback) {
|
|
403
|
+
const unsubscribe = subscribeCallback(result.setValue);
|
|
404
|
+
if (unsubscribe) {
|
|
405
|
+
onUnmount(unsubscribe);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return result;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// src/hooks/combine-state.ts
|
|
412
|
+
function combineState(...states) {
|
|
413
|
+
const initialValue = states.map((state) => state.getValue());
|
|
414
|
+
const combinedState = createState(initialValue);
|
|
415
|
+
states.forEach((state) => {
|
|
416
|
+
state.trackValue(() => {
|
|
417
|
+
const updatedValue = states.map((state2) => state2.getValue());
|
|
418
|
+
combinedState.setValue(() => updatedValue);
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
return combinedState;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// src/create-ref.ts
|
|
425
|
+
function createRef(initialRefValue = null) {
|
|
426
|
+
return {
|
|
427
|
+
velesRef: true,
|
|
428
|
+
current: initialRefValue
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
export {
|
|
432
|
+
Fragment,
|
|
433
|
+
attachComponent,
|
|
434
|
+
combineState,
|
|
435
|
+
createElement,
|
|
436
|
+
createRef,
|
|
437
|
+
createState,
|
|
438
|
+
onMount,
|
|
439
|
+
onUnmount
|
|
440
|
+
};
|
|
441
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/attach-component.ts","../src/create-element/create-text-element.ts","../src/hooks/create-state.ts","../src/hooks/combine-state.ts","../src/create-ref.ts"],"sourcesContent":["import { getComponentVelesNode } from \"./utils\";\nimport { createElement } from \"./create-element\";\n\nimport type { VelesElement, VelesComponent } from \"./types\";\n\nfunction attachComponent({\n htmlElement,\n component,\n}: {\n htmlElement: HTMLElement;\n component: VelesElement | VelesComponent;\n}) {\n // we wrap the whole app into an additional <div>. While it is not ideal\n // for the consumers, it greatly simplifies some things, namely, mount callbacks\n // for components or supporting conditional rendering at the top level\n const wrappedApp = createElement(\"div\", { children: [component] });\n const { velesElementNode } = getComponentVelesNode(wrappedApp);\n htmlElement.appendChild(velesElementNode.html);\n\n // TODO: iterate over every child and call their `onUnmout` method\n // and add tests for that\n return () => {\n velesElementNode.html.remove();\n };\n}\n\nexport { attachComponent };\n","/**\n * This is an internal helper function to create Text Nodes\n * which we need to maintain in the component tree\n */\n\nimport type { VelesStringElement } from \"../types\";\n\nexport function createTextElement(\n text: string | undefined | null\n): VelesStringElement {\n const unmountHandlers: Function[] = [];\n return {\n velesStringElement: true,\n // in case there is no text, we create an empty Text node, so we still can\n // have a reference to it, replace it, call lifecycle methods, etc\n html: document.createTextNode(text || \"\"),\n\n _privateMethods: {\n _addUnmountHandler: (cb: Function) => {\n unmountHandlers.push(cb);\n },\n _callUnmountHandlers: () => {\n unmountHandlers.forEach((cb) => cb());\n },\n },\n };\n}\n","import { getComponentVelesNode, identity } from \"../utils\";\nimport { onUnmount, onMount } from \"./lifecycle\";\nimport { createElement } from \"../create-element/create-element\";\nimport { createTextElement } from \"../create-element/create-text-element\";\n\nimport type {\n VelesElement,\n VelesComponent,\n VelesStringElement,\n} from \"../types\";\n\ntype AttributeHelper = {\n (htmlElement: HTMLElement, attributeName: string, node: VelesElement): string;\n velesAttribute: boolean;\n};\n\nexport type State<ValueType> = {\n trackValue(\n cb: (value: ValueType) => void | Function,\n options?: {\n callOnMount?: boolean;\n skipFirstCall?: boolean;\n comparator?: (value1: ValueType, value2: ValueType) => boolean;\n }\n ): void;\n trackValueSelector<SelectorValueType>(\n selector: (value: ValueType) => SelectorValueType,\n cb: (value: SelectorValueType) => void | Function,\n options?: {\n callOnMount?: boolean;\n skipFirstCall?: boolean;\n comparator?: (\n value1: SelectorValueType,\n value2: SelectorValueType\n ) => boolean;\n }\n ): void;\n useValue(\n cb: (\n value: ValueType\n ) => VelesElement | VelesComponent | string | undefined | null,\n comparator?: (value1: ValueType, value2: ValueType) => boolean\n ): VelesElement | VelesComponent | VelesStringElement;\n useValueSelector<SelectorValueType>(\n selector: (value: ValueType) => SelectorValueType,\n cb: (\n value: SelectorValueType\n ) => VelesElement | VelesComponent | string | undefined | null,\n comparator?: (\n value1: SelectorValueType,\n value2: SelectorValueType\n ) => boolean\n ): VelesElement | VelesComponent | VelesStringElement;\n useAttribute(cb: (value: ValueType) => string): AttributeHelper;\n useValueIterator<Element>(\n options: {\n key: string | ((options: { element: Element; index: number }) => string);\n selector?: (value: ValueType) => Element[];\n },\n cb: (props: {\n elementState: State<Element>;\n index: number;\n }) => VelesElement | VelesComponent\n ): VelesComponent | VelesElement | null;\n getValue(): ValueType;\n getPreviousValue(): undefined | ValueType;\n setValue(newValueCB: (currentValue: ValueType) => ValueType): void;\n\n // private method, don't use directly\n // TODO: hide completely in a closure\n _triggerUpdates(): void;\n};\n\ntype TrackingParams = {\n cb: (props: {\n elementState: State<any>;\n index: number;\n }) => VelesElement | VelesComponent;\n selector?: (value: unknown) => any[];\n renderedElements: [VelesElement | VelesComponent, string, State<unknown>][];\n key: string | ((options: { element: unknown; index: number }) => string);\n elementsByKey: {\n [key: string]: {\n elementState: State<unknown>;\n index: number;\n node: VelesElement | VelesComponent;\n };\n };\n wrapperComponent: VelesElement | VelesComponent;\n};\n\nfunction createState<T>(\n initialValue: T,\n subscribeCallback?: (\n setValue: ReturnType<typeof createState<T>>[\"setValue\"]\n ) => Function\n): State<T> {\n let value = initialValue;\n let previousValue: undefined | T = undefined;\n let trackingEffects: {\n cb: (value: any) => void;\n selector?: Function;\n comparator?: (value1: any, value2: any) => boolean;\n selectedValue: any;\n }[] = [];\n\n let trackingSelectorElements: {\n cb: (\n value: any\n ) => VelesElement | VelesComponent | string | undefined | null;\n selector?: Function;\n selectedValue: any;\n comparator: (value1: any, value2: any) => boolean;\n node: VelesElement | VelesComponent | VelesStringElement;\n }[] = [];\n\n let trackingAttributes: {\n cb: Function;\n htmlElement: HTMLElement;\n attributeName: string;\n }[] = [];\n\n let trackingIterators: TrackingParams[] = [];\n\n const result: State<T> = {\n // supposed to be used at the component level\n trackValue: (cb, options = {}) => {\n result.trackValueSelector<T>(undefined, cb, options);\n },\n trackValueSelector<F>(\n selector: ((value: T) => F) | undefined,\n cb: (value: F) => void | Function,\n options: {\n callOnMount?: boolean;\n skipFirstCall?: boolean;\n comparator?: (value1: F, value2: F) => boolean;\n } = {}\n ) {\n // @ts-expect-error\n const trackedValue = selector ? selector(value) : (value as F);\n trackingEffects.push({\n cb,\n selector,\n comparator: options.comparator,\n selectedValue: trackedValue,\n });\n if (!options.skipFirstCall) {\n // trigger the callback first time\n // execute the first callback when the component is mounted\n if (options.callOnMount) {\n onMount(() => {\n cb(trackedValue);\n });\n } else {\n cb(trackedValue);\n }\n }\n // track value is attached at the component level\n onUnmount(() => {\n trackingEffects = trackingEffects.filter(\n (trackingCallback) => trackingCallback.cb !== cb\n );\n });\n },\n useValue: (cb, comparator) => {\n return result.useValueSelector<T>(undefined, cb, comparator);\n },\n useValueSelector<F>(\n selector: ((value: T) => F) | undefined,\n cb: (\n value: F\n ) => VelesElement | VelesComponent | string | undefined | null,\n comparator: (value1: F, value2: F) => boolean = identity\n ): VelesElement | VelesComponent | VelesStringElement {\n // @ts-expect-error\n const selectedValue = selector ? selector(value) : (value as F);\n const returnedNode = cb(selectedValue);\n const node =\n !returnedNode || typeof returnedNode === \"string\"\n ? createTextElement(returnedNode as string)\n : returnedNode;\n\n trackingSelectorElements.push({\n selector,\n selectedValue,\n cb,\n node,\n comparator,\n });\n\n node._privateMethods._addUnmountHandler(() => {\n trackingSelectorElements = trackingSelectorElements.filter(\n (trackingSelectorElement) => trackingSelectorElement.cb !== cb\n );\n });\n return node;\n },\n useValueIterator<Element>(\n options: {\n key: string | ((options: { element: any; index: number }) => string);\n selector?: (value: T) => Element[];\n },\n cb: (props: {\n elementState: State<Element>;\n index: number;\n }) => VelesElement | VelesComponent\n ) {\n const children: [\n VelesElement | VelesComponent,\n string,\n State<Element>\n ][] = [];\n const elementsByKey: {\n [key: string]: {\n elementState: State<Element>;\n index: number;\n node: VelesElement | VelesComponent;\n };\n } = {};\n\n const elements = options.selector ? options.selector(value) : value;\n\n if (!Array.isArray(elements)) {\n console.error(\"useValueIterator received non-array value\");\n return null;\n }\n\n (elements as Element[]).forEach((element, index) => {\n // we calculate a key for each element. This key determines whether we render the element from scratch, or do nothing\n // when the element updates\n let calculatedKey: string = \"\";\n if (\n typeof options.key === \"string\" &&\n typeof element === \"object\" &&\n element !== null &&\n options.key in element\n ) {\n calculatedKey = element[options.key];\n } else if (typeof options.key === \"function\") {\n calculatedKey = options.key({ element, index });\n } else {\n // ignore for now\n }\n\n const elementState = createState(element);\n\n if (!calculatedKey) {\n return;\n }\n\n let node = cb({ elementState, index });\n\n elementsByKey[calculatedKey] = {\n node,\n index,\n elementState,\n };\n\n children.push([node, calculatedKey, elementState]);\n });\n\n const trackingParams = {} as TrackingParams;\n trackingIterators.push(trackingParams);\n\n const wrapperComponent = createElement(() => {\n onUnmount(() => {\n trackingIterators = trackingIterators.filter(\n (currentTrackingParams) => currentTrackingParams !== trackingParams\n );\n });\n return createElement(\"div\", {\n phantom: true,\n children: children.map((child) => child[0]),\n });\n });\n\n trackingParams.cb = cb;\n trackingParams.key = options.key;\n trackingParams.elementsByKey = elementsByKey;\n trackingParams.renderedElements = children;\n trackingParams.wrapperComponent = wrapperComponent;\n\n if (options.selector) {\n trackingParams.selector = options.selector;\n }\n\n return wrapperComponent;\n\n // 1. build a lookup table with existing values\n // 2. build a lookup table with positions\n // 3. if there is a new value, update lookup tables\n // and insert the new component in the right place\n // 4. provide a way to listen to position value.\n // It should be a separate subscription.\n },\n useAttribute: (cb: (value: T) => string) => {\n const attributeValue = cb(value);\n\n const attributeHelper = (\n htmlElement: HTMLElement,\n attributeName: string,\n node: VelesElement\n ) => {\n // save it to the attribute array\n // read that array on `_triggerUpdates`\n // and change inline\n // we need to save the HTML element and the name of the attribute\n\n trackingAttributes.push({ cb, htmlElement, attributeName });\n\n node._privateMethods._addUnmountHandler(() => {\n trackingAttributes = trackingAttributes.filter(\n (trackingAttribute) => trackingAttribute.cb !== cb\n );\n });\n\n return attributeValue;\n };\n attributeHelper.velesAttribute = true;\n\n return attributeHelper;\n },\n // useful for stuff like callbacks\n getValue: () => {\n return value;\n },\n getPreviousValue: () => {\n return previousValue;\n },\n // set up new value only through the callback which\n // gives the latest value to ensure no outdated data\n // can be used for the state\n setValue: (newValueCB: (currentValue: T) => T): void => {\n const newValue = newValueCB(value);\n\n if (newValue !== value) {\n previousValue = value;\n value = newValue;\n result._triggerUpdates();\n }\n },\n // TODO: remove it from this object completely\n // and access it from closure\n _triggerUpdates: () => {\n trackingSelectorElements = trackingSelectorElements.map(\n (selectorTrackingElement) => {\n const { selectedValue, selector, cb, node, comparator } =\n selectorTrackingElement;\n const newSelectedValue = selector ? selector(value) : value;\n\n if (comparator(selectedValue, newSelectedValue)) {\n return selectorTrackingElement;\n }\n\n const returnednewNode = cb(newSelectedValue);\n const newNode =\n !returnednewNode || typeof returnednewNode === \"string\"\n ? createTextElement(returnednewNode as string)\n : returnednewNode;\n\n const { velesElementNode: oldVelesElementNode } =\n getComponentVelesNode(node);\n const { velesElementNode: newVelesElementNode } =\n getComponentVelesNode(newNode);\n\n const parentVelesElement = oldVelesElementNode.parentVelesElement;\n\n if (parentVelesElement) {\n newVelesElementNode.parentVelesElement = parentVelesElement;\n parentVelesElement.html.replaceChild(\n newVelesElementNode.html,\n oldVelesElementNode.html\n );\n // we need to update `childComponents` so that after the update\n // if the parent node is removed from DOM, it calls correct unmount\n // callbacks\n parentVelesElement.childComponents =\n parentVelesElement.childComponents.map((childComponent) =>\n childComponent === node ? newNode : node\n );\n // we call unmount handlers right after we replace it\n node._privateMethods._callUnmountHandlers();\n\n // right after that, we add the callback back\n // the top level node is guaranteed to be rendered again (at least right now)\n // if there were children listening, they should be cleared\n // and added back into their respective unmount listeners if it is still viable\n trackingSelectorElements.push({\n selector,\n selectedValue: newSelectedValue,\n cb,\n node: newNode,\n comparator,\n });\n newNode._privateMethods._addUnmountHandler(() => {\n trackingSelectorElements = trackingSelectorElements.filter(\n (trackingSelectorElement) => trackingSelectorElement.cb !== cb\n );\n });\n } else {\n console.log(\"parent node was not found\");\n }\n\n return {\n selectedValue: newSelectedValue,\n selector,\n cb,\n node: newNode,\n comparator,\n };\n }\n );\n\n // attributes\n // the HTML node does not change, so we don't need to modify the array\n trackingAttributes.forEach(({ cb, htmlElement, attributeName }) => {\n const newAttributeValue = cb(value);\n\n htmlElement.setAttribute(attributeName, newAttributeValue);\n });\n\n // tracked values\n trackingEffects.forEach((trackingEffect) => {\n const { cb, selectedValue, selector, comparator } = trackingEffect;\n\n const newSelectedValue = selector ? selector(value) : value;\n\n if (\n comparator\n ? comparator(selectedValue, newSelectedValue)\n : selectedValue === newSelectedValue\n ) {\n return;\n }\n\n cb(newSelectedValue);\n });\n\n trackingIterators.forEach((trackingIterator) => {\n const {\n cb,\n key,\n renderedElements,\n elementsByKey,\n wrapperComponent,\n selector,\n } = trackingIterator;\n if (!wrapperComponent) {\n console.error(\"there is no wrapper component for the iterator\");\n return;\n }\n\n const { velesElementNode: wrapperVelesElementNode } =\n getComponentVelesNode(wrapperComponent);\n const parentVelesElement = wrapperVelesElementNode.parentVelesElement;\n\n if (!parentVelesElement) {\n console.error(\n \"there is no parent Veles node for the iterator wrapper\"\n );\n return;\n }\n\n const elements = selector ? selector(value) : value;\n\n // if we have any tracking iterators, it means the value is an array\n // but I don't know how to have correct type inferring here\n // so we check manually\n if (Array.isArray(elements)) {\n const newRenderedElements: [\n VelesElement | VelesComponent,\n string,\n State<unknown>\n ][] = [];\n const newElementsByKey: {\n [key: string]: {\n elementState: State<unknown>;\n index: number;\n node: VelesElement | VelesComponent;\n };\n } = {};\n\n const renderedExistingElements: {\n [calculatedKey: string]: boolean;\n } = {};\n\n elements.forEach((element, index) => {\n let calculatedKey: string = \"\";\n if (\n typeof key === \"string\" &&\n typeof element === \"object\" &&\n element !== null &&\n key in element\n ) {\n calculatedKey = element[key];\n } else if (typeof key === \"function\") {\n calculatedKey = key({ element, index });\n } else {\n // ignore for now\n }\n\n if (!calculatedKey) {\n return;\n }\n\n const existingElement = elementsByKey[calculatedKey];\n\n if (existingElement) {\n renderedExistingElements[calculatedKey] = true;\n const currentValue = existingElement.elementState.getValue();\n if (currentValue !== element) {\n existingElement.elementState.setValue(() => element);\n }\n\n newRenderedElements.push([\n existingElement.node,\n calculatedKey,\n existingElement.elementState,\n ]);\n newElementsByKey[calculatedKey] = {\n elementState: existingElement.elementState,\n index,\n node: existingElement.node,\n };\n } else {\n const elementState = createState(element);\n const node = cb({ elementState, index });\n\n newRenderedElements.push([node, calculatedKey, elementState]);\n newElementsByKey[calculatedKey] = {\n elementState,\n index,\n node,\n };\n }\n\n // first, we check if there is a node by this key\n // if there is, we do `getValue()` and compare whether the\n // item is the same.\n // if it is not, we need to do `elementState.setValue()`\n // with the new value\n // if the value is the same, nothing to do.\n //\n // after that, we need to put the new position down\n // (we'll reshuffle items at the end)\n //\n // if there is no node by this key, we need to:\n // 1. create a state for it\n // 2. create a node for it\n // 3. mark the new index for that node\n //\n // at the end, we need to find elements which were rendered, but are\n // not rendered anymore, and remove them from DOM and trigger `onUnmount`\n // for them.\n });\n\n const positioningOffset: { [key: number]: number } = {};\n\n // to avoid iterating over arrays to determine whether there are removed nodes\n let newElementsCount: number = 0;\n // to avoid unnecessary shuffling of the DOM elements\n let offset: number = 0;\n let currentElement: HTMLElement | Text | null = null;\n newRenderedElements.forEach((newRenderedElement, index) => {\n // if we needed to adjust offset until we reach the original position of the item\n // we need to return it back once we reach the position after it\n if (positioningOffset[index]) {\n offset = offset + positioningOffset[index];\n }\n\n const [newNode, calculatedKey, newState] = newRenderedElement;\n\n const existingElement = elementsByKey[calculatedKey];\n if (existingElement) {\n const { velesElementNode: existingElementNode } =\n getComponentVelesNode(existingElement.node);\n // the element is in the same relative position\n if (existingElement.index + offset === index) {\n currentElement = existingElementNode.html;\n return;\n }\n\n if (existingElement.index + offset > index) {\n if (currentElement) {\n currentElement.after(existingElementNode.html);\n // we adjust the offset of the item right after the one\n // we repositioned\n positioningOffset[existingElement.index + 1] = -1;\n } else {\n // this means we at position 0\n const firstRenderedElement = renderedElements[0]?.[0];\n if (firstRenderedElement) {\n const { velesElementNode: firstRenderedVelesNode } =\n getComponentVelesNode(firstRenderedElement);\n firstRenderedVelesNode.html.before(\n existingElementNode.html\n );\n } else {\n // TODO: handle this properly\n }\n }\n\n currentElement = existingElementNode.html;\n offset = offset + 1;\n } else {\n if (currentElement) {\n currentElement.after(existingElementNode.html);\n positioningOffset[existingElement.index + 1] = 1;\n } else {\n // this means we at position 0\n const firstRenderedElement = renderedElements[0]?.[0];\n if (firstRenderedElement) {\n const { velesElementNode: firstRenderedVelesNode } =\n getComponentVelesNode(firstRenderedElement);\n firstRenderedVelesNode.html.before(\n existingElementNode.html\n );\n } else {\n // TODO: handle this properly\n }\n }\n\n currentElement = existingElementNode.html;\n offset = offset - 1;\n }\n } else {\n // we need to insert new element\n const { velesElementNode: newNodeVelesElement } =\n getComponentVelesNode(newNode);\n newNodeVelesElement.parentVelesElement = parentVelesElement;\n\n if (currentElement) {\n currentElement.after(newNodeVelesElement.html);\n } else {\n // this basically means we at the position 0\n const firstRenderedElement = renderedElements[0]?.[0];\n if (firstRenderedElement) {\n const { velesElementNode: firstRenderedVelesNode } =\n getComponentVelesNode(firstRenderedElement);\n firstRenderedVelesNode.html.before(newNodeVelesElement.html);\n } else {\n // TODO: handle the case when there were 0 rendered elements\n // right now this thing assumes there were no\n parentVelesElement.html.prepend(newNodeVelesElement.html);\n }\n }\n\n offset = offset + 1;\n currentElement = newNodeVelesElement.html;\n newElementsCount = newElementsCount + 1;\n }\n });\n\n if (\n renderedElements.length ===\n newRenderedElements.length + newElementsCount\n ) {\n // it means no existing nodes were removed, so we don't need to do anything\n } else {\n // it means something was removed, and we need to remove it from\n // `childComponents` of our `wrapperComponent`, and also from the DOM\n renderedElements.forEach(([oldNode, calculatedKey]) => {\n // the element is still in DOM\n if (renderedExistingElements[calculatedKey] === true) {\n return;\n } else {\n const { velesElementNode: oldRenderedVelesNode } =\n getComponentVelesNode(oldNode);\n\n oldRenderedVelesNode.html.remove();\n oldNode._privateMethods._callUnmountHandlers();\n\n if (\"velesNode\" in wrapperVelesElementNode) {\n wrapperVelesElementNode.childComponents =\n wrapperVelesElementNode.childComponents.filter(\n (childComponent) => childComponent !== oldNode\n );\n } else {\n throw new Error(\"Wrapper iterator element is a string\");\n }\n }\n });\n }\n\n // update the tracking info with new data\n trackingIterator.renderedElements = newRenderedElements;\n trackingIterator.elementsByKey = newElementsByKey;\n }\n });\n },\n };\n\n if (subscribeCallback) {\n const unsubscribe = subscribeCallback(result.setValue);\n\n if (unsubscribe) {\n onUnmount(unsubscribe);\n }\n }\n\n return result;\n}\n\nexport { createState };\n","import { createState } from \"./create-state\";\n\ntype createdState<StateType> = ReturnType<typeof createState<StateType>>;\n\nexport function combineState<A, B>(\n state1: createdState<A>,\n state2: createdState<B>\n): createdState<[A, B]>;\nexport function combineState<A, B, C>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>\n): createdState<[A, B, C]>;\nexport function combineState<A, B, C, D>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>\n): createdState<[A, B, C, D]>;\nexport function combineState<A, B, C, D, E>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>\n): createdState<[A, B, C, D, E]>;\nexport function combineState<A, B, C, D, E, F>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>,\n state6: createdState<F>\n): createdState<[A, B, C, D, E, F]>;\nexport function combineState<A, B, C, D, E, F, G>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>,\n state6: createdState<F>,\n state7: createdState<G>\n): createdState<[A, B, C, D, E, F, G]>;\nexport function combineState<A, B, C, D, E, F, G, H>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>,\n state6: createdState<F>,\n state7: createdState<G>,\n state8: createdState<H>\n): createdState<[A, B, C, D, E, F, G, H]>;\nexport function combineState<A, B, C, D, E, F, G, H, I>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>,\n state6: createdState<F>,\n state7: createdState<G>,\n state8: createdState<H>,\n state9: createdState<I>\n): createdState<[A, B, C, D, E, F, G, H, I]>;\nexport function combineState<A, B, C, D, E, F, G, H, I, J>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>,\n state6: createdState<F>,\n state7: createdState<G>,\n state8: createdState<H>,\n state9: createdState<I>,\n state10: createdState<J>\n): createdState<[A, B, C, D, E, F, G, H, I, J]>;\nexport function combineState(...states) {\n const initialValue = states.map((state) => state.getValue());\n const combinedState = createState(initialValue);\n\n states.forEach((state) => {\n state.trackValue(() => {\n // by the time trackValue callback is called\n // it is guaranteed that reading `state.getValue` will\n // return the updated value\n const updatedValue = states.map((state) => state.getValue());\n combinedState.setValue(() => updatedValue);\n });\n });\n\n return combinedState;\n}\n","function createRef<T>(initialRefValue: T | null = null): {\n velesRef: true;\n current: T | null;\n} {\n return {\n velesRef: true,\n current: initialRefValue,\n };\n}\n\nexport { createRef };\n"],"mappings":"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","names":["state"]}
|