@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 CHANGED
@@ -20,3 +20,5 @@ export const rememberFocus: (
20
20
  eventMap: any,
21
21
  uid: number,
22
22
  ) => void
23
+
24
+ export const registerEventListeners: any
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($Element, key, props[key], eventMap);
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 $New = render2(dom, eventMap).firstChild;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/virtual-dom",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "main": "dist/index.js",
5
5
  "type": "module",
6
6
  "keywords": [],
@@ -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)
@@ -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 $New = VirtualDom.render(dom, eventMap).firstChild
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($Element, key, props[key], eventMap)
5
+ VirtualDomElementProp.setProp(
6
+ $Element,
7
+ key,
8
+ props[key],
9
+ eventMap,
10
+ newEventMap,
11
+ )
6
12
  }
7
13
  }