@lvce-editor/virtual-dom 1.1.0 → 1.2.0
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/dist/index.d.ts +2 -0
- package/dist/index.js +67 -21
- package/package.json +1 -1
- package/src/parts/AttachEvent/AttachEvent.ts +6 -0
- package/src/parts/Main/Main.ts +1 -0
- package/src/parts/RegisterEventListeners/RegisterEventListeners.ts +40 -0
- package/src/parts/RememberFocus/RememberFocus.ts +3 -1
- package/src/parts/RenderInternal/RenderInternal.ts +2 -1
- package/src/parts/VirtualDom/VirtualDom.ts +2 -2
- package/src/parts/VirtualDomElement/VirtualDomElement.ts +4 -4
- package/src/parts/VirtualDomElementProp/VirtualDomElementProp.ts +2 -1
- package/src/parts/VirtualDomElementProps/VirtualDomElementProps.ts +8 -2
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -39,6 +39,47 @@ var setIpc = (value) => {
|
|
|
39
39
|
state.ipc = value;
|
|
40
40
|
};
|
|
41
41
|
|
|
42
|
+
// src/parts/NameAnonymousFunction/NameAnonymousFunction.ts
|
|
43
|
+
var nameAnonymousFunction = (fn, name) => {
|
|
44
|
+
Object.defineProperty(fn, "name", {
|
|
45
|
+
value: name
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// src/parts/RegisterEventListeners/RegisterEventListeners.ts
|
|
50
|
+
var listeners = /* @__PURE__ */ Object.create(null);
|
|
51
|
+
var getArgs = (params, event) => {
|
|
52
|
+
return [...params];
|
|
53
|
+
};
|
|
54
|
+
var createFn = (info) => {
|
|
55
|
+
const fn = (event) => {
|
|
56
|
+
if (info.preventDefault) {
|
|
57
|
+
event.preventDefault(event);
|
|
58
|
+
}
|
|
59
|
+
const uid = getComponentUidFromEvent(event);
|
|
60
|
+
const args = getArgs(info.params, event);
|
|
61
|
+
if (args.length === 0) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const ipc = getIpc();
|
|
65
|
+
ipc.send("Viewlet.executeViewletCommand", uid, ...args);
|
|
66
|
+
};
|
|
67
|
+
nameAnonymousFunction(fn, info.name);
|
|
68
|
+
return fn;
|
|
69
|
+
};
|
|
70
|
+
var registerEventListeners = (id, eventListeners) => {
|
|
71
|
+
const map = /* @__PURE__ */ Object.create(null);
|
|
72
|
+
for (const info of eventListeners) {
|
|
73
|
+
const fn = createFn(info);
|
|
74
|
+
map[info.name] = fn;
|
|
75
|
+
}
|
|
76
|
+
listeners[id] = map;
|
|
77
|
+
};
|
|
78
|
+
var getEventListenerMap = (id) => {
|
|
79
|
+
const map = listeners[id];
|
|
80
|
+
return map;
|
|
81
|
+
};
|
|
82
|
+
|
|
42
83
|
// src/parts/ClearNode/ClearNode.ts
|
|
43
84
|
var clearNode = ($Node) => {
|
|
44
85
|
$Node.textContent = "";
|
|
@@ -285,13 +326,6 @@ var get = (listener) => {
|
|
|
285
326
|
return cache.get(listener);
|
|
286
327
|
};
|
|
287
328
|
|
|
288
|
-
// src/parts/NameAnonymousFunction/NameAnonymousFunction.ts
|
|
289
|
-
var nameAnonymousFunction = (fn, name) => {
|
|
290
|
-
Object.defineProperty(fn, "name", {
|
|
291
|
-
value: name
|
|
292
|
-
});
|
|
293
|
-
};
|
|
294
|
-
|
|
295
329
|
// src/parts/GetWrappedListener/GetWrappedListener.ts
|
|
296
330
|
var getWrappedListener = (listener, returnValue) => {
|
|
297
331
|
if (!returnValue) {
|
|
@@ -314,7 +348,11 @@ var getWrappedListener = (listener, returnValue) => {
|
|
|
314
348
|
};
|
|
315
349
|
|
|
316
350
|
// src/parts/AttachEvent/AttachEvent.ts
|
|
317
|
-
var attachEvent = ($Node, eventMap, key, value) => {
|
|
351
|
+
var attachEvent = ($Node, eventMap, key, value, newEventMap) => {
|
|
352
|
+
if (newEventMap && newEventMap[value]) {
|
|
353
|
+
$Node.addEventListener(key, newEventMap[value]);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
318
356
|
const listener = eventMap[value];
|
|
319
357
|
if (!listener) {
|
|
320
358
|
console.warn("listener not found", value);
|
|
@@ -329,7 +367,7 @@ var attachEvent = ($Node, eventMap, key, value) => {
|
|
|
329
367
|
};
|
|
330
368
|
|
|
331
369
|
// src/parts/VirtualDomElementProp/VirtualDomElementProp.ts
|
|
332
|
-
var setProp = ($Element, key, value, eventMap) => {
|
|
370
|
+
var setProp = ($Element, key, value, eventMap, newEventMap) => {
|
|
333
371
|
switch (key) {
|
|
334
372
|
case "maskImage":
|
|
335
373
|
$Element.style.maskImage = `url('${value}')`;
|
|
@@ -393,7 +431,7 @@ var setProp = ($Element, key, value, eventMap) => {
|
|
|
393
431
|
if (!eventMap || !value) {
|
|
394
432
|
return;
|
|
395
433
|
}
|
|
396
|
-
attachEvent($Element, eventMap, eventName, value);
|
|
434
|
+
attachEvent($Element, eventMap, eventName, value, newEventMap);
|
|
397
435
|
break;
|
|
398
436
|
default:
|
|
399
437
|
if (key.startsWith("data-")) {
|
|
@@ -405,9 +443,15 @@ var setProp = ($Element, key, value, eventMap) => {
|
|
|
405
443
|
};
|
|
406
444
|
|
|
407
445
|
// src/parts/VirtualDomElementProps/VirtualDomElementProps.ts
|
|
408
|
-
var setProps = ($Element, props, eventMap) => {
|
|
446
|
+
var setProps = ($Element, props, eventMap, newEventMap) => {
|
|
409
447
|
for (const key in props) {
|
|
410
|
-
setProp(
|
|
448
|
+
setProp(
|
|
449
|
+
$Element,
|
|
450
|
+
key,
|
|
451
|
+
props[key],
|
|
452
|
+
eventMap,
|
|
453
|
+
newEventMap
|
|
454
|
+
);
|
|
411
455
|
}
|
|
412
456
|
};
|
|
413
457
|
|
|
@@ -415,28 +459,28 @@ var setProps = ($Element, props, eventMap) => {
|
|
|
415
459
|
var renderDomTextNode = (element) => {
|
|
416
460
|
return document.createTextNode(element.text);
|
|
417
461
|
};
|
|
418
|
-
var renderDomElement = (element, eventMap) => {
|
|
462
|
+
var renderDomElement = (element, eventMap, newEventMap) => {
|
|
419
463
|
const tag = getElementTag(element.type);
|
|
420
464
|
const $Element = document.createElement(tag);
|
|
421
|
-
setProps($Element, element, eventMap);
|
|
465
|
+
setProps($Element, element, eventMap, newEventMap);
|
|
422
466
|
return $Element;
|
|
423
467
|
};
|
|
424
|
-
var render = (element, eventMap) => {
|
|
468
|
+
var render = (element, eventMap, newEventMap) => {
|
|
425
469
|
switch (element.type) {
|
|
426
470
|
case Text:
|
|
427
471
|
return renderDomTextNode(element);
|
|
428
472
|
default:
|
|
429
|
-
return renderDomElement(element, eventMap);
|
|
473
|
+
return renderDomElement(element, eventMap, newEventMap);
|
|
430
474
|
}
|
|
431
475
|
};
|
|
432
476
|
|
|
433
477
|
// src/parts/RenderInternal/RenderInternal.ts
|
|
434
|
-
var renderInternal2 = ($Parent, elements, eventMap) => {
|
|
478
|
+
var renderInternal2 = ($Parent, elements, eventMap, newEventMap) => {
|
|
435
479
|
const max = elements.length - 1;
|
|
436
480
|
let stack = [];
|
|
437
481
|
for (let i = max; i >= 0; i--) {
|
|
438
482
|
const element = elements[i];
|
|
439
|
-
const $Element = render(element, eventMap);
|
|
483
|
+
const $Element = render(element, eventMap, newEventMap);
|
|
440
484
|
if (element.childCount > 0) {
|
|
441
485
|
$Element.append(...stack.slice(0, element.childCount));
|
|
442
486
|
stack = stack.slice(element.childCount);
|
|
@@ -451,9 +495,9 @@ var renderInto = ($Parent, dom, eventMap = {}) => {
|
|
|
451
495
|
clearNode($Parent);
|
|
452
496
|
renderInternal2($Parent, dom, eventMap);
|
|
453
497
|
};
|
|
454
|
-
var render2 = (elements, eventMap = {}) => {
|
|
498
|
+
var render2 = (elements, eventMap = {}, newEventMap = {}) => {
|
|
455
499
|
const $Root = document.createElement("div");
|
|
456
|
-
renderInternal2($Root, elements, eventMap);
|
|
500
|
+
renderInternal2($Root, elements, eventMap, newEventMap);
|
|
457
501
|
return $Root;
|
|
458
502
|
};
|
|
459
503
|
|
|
@@ -473,7 +517,8 @@ var rememberFocus = ($Viewlet, dom, eventMap, uid = 0) => {
|
|
|
473
517
|
inputMap[$Input.name] = $Input.value;
|
|
474
518
|
}
|
|
475
519
|
if (uid) {
|
|
476
|
-
const
|
|
520
|
+
const newEventMap = getEventListenerMap(uid);
|
|
521
|
+
const $New = render2(dom, eventMap, newEventMap).firstChild;
|
|
477
522
|
setComponentUid($New, uid);
|
|
478
523
|
$Viewlet.replaceWith($New);
|
|
479
524
|
$Viewlet = $New;
|
|
@@ -499,6 +544,7 @@ var rememberFocus = ($Viewlet, dom, eventMap, uid = 0) => {
|
|
|
499
544
|
export {
|
|
500
545
|
getComponentUid,
|
|
501
546
|
getComponentUidFromEvent,
|
|
547
|
+
registerEventListeners,
|
|
502
548
|
rememberFocus,
|
|
503
549
|
render2 as render,
|
|
504
550
|
renderInto,
|
package/package.json
CHANGED
|
@@ -6,7 +6,13 @@ export const attachEvent = (
|
|
|
6
6
|
eventMap: any,
|
|
7
7
|
key: string,
|
|
8
8
|
value: string,
|
|
9
|
+
newEventMap?: any,
|
|
9
10
|
) => {
|
|
11
|
+
if (newEventMap && newEventMap[value]) {
|
|
12
|
+
// TODO support event listener options
|
|
13
|
+
$Node.addEventListener(key, newEventMap[value])
|
|
14
|
+
return
|
|
15
|
+
}
|
|
10
16
|
const listener = eventMap[value]
|
|
11
17
|
if (!listener) {
|
|
12
18
|
console.warn('listener not found', value)
|
package/src/parts/Main/Main.ts
CHANGED
|
@@ -4,5 +4,6 @@ export {
|
|
|
4
4
|
setComponentUid,
|
|
5
5
|
} from '../ComponentUid/ComponentUid.ts'
|
|
6
6
|
export { setIpc } from '../IpcState/IpcState.ts'
|
|
7
|
+
export { registerEventListeners } from '../RegisterEventListeners/RegisterEventListeners.ts'
|
|
7
8
|
export { rememberFocus } from '../RememberFocus/RememberFocus.ts'
|
|
8
9
|
export { render, renderInto } from '../VirtualDom/VirtualDom.ts'
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as ComponentUid from '../ComponentUid/ComponentUid.ts'
|
|
2
|
+
import * as IpcState from '../IpcState/IpcState.ts'
|
|
3
|
+
import * as NameAnonymousFunction from '../NameAnonymousFunction/NameAnonymousFunction.ts'
|
|
4
|
+
|
|
5
|
+
const listeners = Object.create(null)
|
|
6
|
+
|
|
7
|
+
const getArgs = (params, event) => {
|
|
8
|
+
return [...params]
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const createFn = (info) => {
|
|
12
|
+
const fn = (event) => {
|
|
13
|
+
if (info.preventDefault) {
|
|
14
|
+
event.preventDefault(event)
|
|
15
|
+
}
|
|
16
|
+
const uid = ComponentUid.getComponentUidFromEvent(event)
|
|
17
|
+
const args = getArgs(info.params, event)
|
|
18
|
+
if (args.length === 0) {
|
|
19
|
+
return
|
|
20
|
+
}
|
|
21
|
+
const ipc = IpcState.getIpc()
|
|
22
|
+
ipc.send('Viewlet.executeViewletCommand', uid, ...args)
|
|
23
|
+
}
|
|
24
|
+
NameAnonymousFunction.nameAnonymousFunction(fn, info.name)
|
|
25
|
+
return fn
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const registerEventListeners = (id, eventListeners) => {
|
|
29
|
+
const map = Object.create(null)
|
|
30
|
+
for (const info of eventListeners) {
|
|
31
|
+
const fn = createFn(info)
|
|
32
|
+
map[info.name] = fn
|
|
33
|
+
}
|
|
34
|
+
listeners[id] = map
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const getEventListenerMap = (id) => {
|
|
38
|
+
const map = listeners[id]
|
|
39
|
+
return map
|
|
40
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as ComponentUid from '../ComponentUid/ComponentUid.ts'
|
|
2
2
|
import * as VirtualDom from '../VirtualDom/VirtualDom.ts'
|
|
3
|
+
import * as RegisterEventListeners from '../RegisterEventListeners/RegisterEventListeners.ts'
|
|
3
4
|
|
|
4
5
|
const queryInputs = ($Viewlet: HTMLElement) => {
|
|
5
6
|
return [...$Viewlet.querySelectorAll('input, textarea')]
|
|
@@ -26,7 +27,8 @@ export const rememberFocus = (
|
|
|
26
27
|
inputMap[$Input.name] = $Input.value
|
|
27
28
|
}
|
|
28
29
|
if (uid) {
|
|
29
|
-
const
|
|
30
|
+
const newEventMap = RegisterEventListeners.getEventListenerMap(uid)
|
|
31
|
+
const $New = VirtualDom.render(dom, eventMap, newEventMap).firstChild
|
|
30
32
|
ComponentUid.setComponentUid($New, uid)
|
|
31
33
|
// @ts-ignore
|
|
32
34
|
$Viewlet.replaceWith($New)
|
|
@@ -4,12 +4,13 @@ export const renderInternal = (
|
|
|
4
4
|
$Parent: HTMLElement,
|
|
5
5
|
elements: any[],
|
|
6
6
|
eventMap: any,
|
|
7
|
+
newEventMap?: any,
|
|
7
8
|
) => {
|
|
8
9
|
const max = elements.length - 1
|
|
9
10
|
let stack = []
|
|
10
11
|
for (let i = max; i >= 0; i--) {
|
|
11
12
|
const element = elements[i]
|
|
12
|
-
const $Element = VirtualDomElement.render(element, eventMap)
|
|
13
|
+
const $Element = VirtualDomElement.render(element, eventMap, newEventMap)
|
|
13
14
|
if (element.childCount > 0) {
|
|
14
15
|
// @ts-expect-error
|
|
15
16
|
$Element.append(...stack.slice(0, element.childCount))
|
|
@@ -39,8 +39,8 @@ export const renderIncremental = ($Parent, dom) => {
|
|
|
39
39
|
* @param {any[]} elements
|
|
40
40
|
* @returns
|
|
41
41
|
*/
|
|
42
|
-
export const render = (elements, eventMap = {}) => {
|
|
42
|
+
export const render = (elements, eventMap = {}, newEventMap = {}) => {
|
|
43
43
|
const $Root = document.createElement('div')
|
|
44
|
-
RenderInternal.renderInternal($Root, elements, eventMap)
|
|
44
|
+
RenderInternal.renderInternal($Root, elements, eventMap, newEventMap)
|
|
45
45
|
return $Root
|
|
46
46
|
}
|
|
@@ -6,18 +6,18 @@ const renderDomTextNode = (element) => {
|
|
|
6
6
|
return document.createTextNode(element.text)
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
const renderDomElement = (element, eventMap) => {
|
|
9
|
+
const renderDomElement = (element, eventMap, newEventMap) => {
|
|
10
10
|
const tag = ElementTagMap.getElementTag(element.type)
|
|
11
11
|
const $Element = document.createElement(tag)
|
|
12
|
-
VirtualDomElementProps.setProps($Element, element, eventMap)
|
|
12
|
+
VirtualDomElementProps.setProps($Element, element, eventMap, newEventMap)
|
|
13
13
|
return $Element
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export const render = (element, eventMap) => {
|
|
16
|
+
export const render = (element, eventMap, newEventMap?: any) => {
|
|
17
17
|
switch (element.type) {
|
|
18
18
|
case VirtualDomElements.Text:
|
|
19
19
|
return renderDomTextNode(element)
|
|
20
20
|
default:
|
|
21
|
-
return renderDomElement(element, eventMap)
|
|
21
|
+
return renderDomElement(element, eventMap, newEventMap)
|
|
22
22
|
}
|
|
23
23
|
}
|
|
@@ -5,6 +5,7 @@ export const setProp = (
|
|
|
5
5
|
key: string,
|
|
6
6
|
value: any,
|
|
7
7
|
eventMap: any,
|
|
8
|
+
newEventMap?: any,
|
|
8
9
|
) => {
|
|
9
10
|
switch (key) {
|
|
10
11
|
case 'maskImage':
|
|
@@ -70,7 +71,7 @@ export const setProp = (
|
|
|
70
71
|
if (!eventMap || !value) {
|
|
71
72
|
return
|
|
72
73
|
}
|
|
73
|
-
AttachEvent.attachEvent($Element, eventMap, eventName, value)
|
|
74
|
+
AttachEvent.attachEvent($Element, eventMap, eventName, value, newEventMap)
|
|
74
75
|
break
|
|
75
76
|
default:
|
|
76
77
|
if (key.startsWith('data-')) {
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import * as VirtualDomElementProp from '../VirtualDomElementProp/VirtualDomElementProp.ts'
|
|
2
2
|
|
|
3
|
-
export const setProps = ($Element, props, eventMap) => {
|
|
3
|
+
export const setProps = ($Element, props, eventMap, newEventMap) => {
|
|
4
4
|
for (const key in props) {
|
|
5
|
-
VirtualDomElementProp.setProp(
|
|
5
|
+
VirtualDomElementProp.setProp(
|
|
6
|
+
$Element,
|
|
7
|
+
key,
|
|
8
|
+
props[key],
|
|
9
|
+
eventMap,
|
|
10
|
+
newEventMap,
|
|
11
|
+
)
|
|
6
12
|
}
|
|
7
13
|
}
|