@lvce-editor/virtual-dom 1.0.3 → 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
@@ -1,8 +1,7 @@
1
- // src/parts/ComponentUid/ComponentUid.ts
1
+ // src/parts/UidSymbol/UidSymbol.ts
2
2
  var uidSymbol = Symbol("uid");
3
- var setComponentUid = ($Element, uid) => {
4
- $Element[uidSymbol] = uid;
5
- };
3
+
4
+ // src/parts/GetUidTarget/GetUidTarget.ts
6
5
  var getUidTarget = ($Element) => {
7
6
  while ($Element) {
8
7
  if ($Element[uidSymbol]) {
@@ -12,6 +11,11 @@ var getUidTarget = ($Element) => {
12
11
  }
13
12
  return void 0;
14
13
  };
14
+
15
+ // src/parts/ComponentUid/ComponentUid.ts
16
+ var setComponentUid = ($Element, uid) => {
17
+ $Element[uidSymbol] = uid;
18
+ };
15
19
  var getComponentUid = ($Element) => {
16
20
  const $Target = getUidTarget($Element);
17
21
  if (!$Target) {
@@ -35,6 +39,47 @@ var setIpc = (value) => {
35
39
  state.ipc = value;
36
40
  };
37
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
+
38
83
  // src/parts/ClearNode/ClearNode.ts
39
84
  var clearNode = ($Node) => {
40
85
  $Node.textContent = "";
@@ -269,20 +314,24 @@ var getEventListenerOptions = (eventName) => {
269
314
  }
270
315
  };
271
316
 
272
- // src/parts/NameAnonymousFunction/NameAnonymousFunction.ts
273
- var nameAnonymousFunction = (fn, name) => {
274
- Object.defineProperty(fn, "name", {
275
- value: name
276
- });
317
+ // src/parts/ListenerCache/ListenerCache.ts
318
+ var cache = /* @__PURE__ */ new Map();
319
+ var has = (listener) => {
320
+ return cache.has(listener);
321
+ };
322
+ var set = (listener, value) => {
323
+ cache.set(listener, value);
324
+ };
325
+ var get = (listener) => {
326
+ return cache.get(listener);
277
327
  };
278
328
 
279
329
  // src/parts/GetWrappedListener/GetWrappedListener.ts
280
- var cache = /* @__PURE__ */ new Map();
281
330
  var getWrappedListener = (listener, returnValue) => {
282
331
  if (!returnValue) {
283
332
  return listener;
284
333
  }
285
- if (!cache.has(listener)) {
334
+ if (!has(listener)) {
286
335
  const wrapped = (event) => {
287
336
  const uid = getComponentUidFromEvent(event);
288
337
  const result = listener(event);
@@ -293,13 +342,17 @@ var getWrappedListener = (listener, returnValue) => {
293
342
  ipc.send("Viewlet.executeViewletCommand", uid, ...result);
294
343
  };
295
344
  nameAnonymousFunction(wrapped, listener.name);
296
- cache.set(listener, wrapped);
345
+ set(listener, wrapped);
297
346
  }
298
- return cache.get(listener);
347
+ return get(listener);
299
348
  };
300
349
 
301
350
  // src/parts/AttachEvent/AttachEvent.ts
302
- 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
+ }
303
356
  const listener = eventMap[value];
304
357
  if (!listener) {
305
358
  console.warn("listener not found", value);
@@ -314,7 +367,7 @@ var attachEvent = ($Node, eventMap, key, value) => {
314
367
  };
315
368
 
316
369
  // src/parts/VirtualDomElementProp/VirtualDomElementProp.ts
317
- var setProp = ($Element, key, value, eventMap) => {
370
+ var setProp = ($Element, key, value, eventMap, newEventMap) => {
318
371
  switch (key) {
319
372
  case "maskImage":
320
373
  $Element.style.maskImage = `url('${value}')`;
@@ -378,7 +431,7 @@ var setProp = ($Element, key, value, eventMap) => {
378
431
  if (!eventMap || !value) {
379
432
  return;
380
433
  }
381
- attachEvent($Element, eventMap, eventName, value);
434
+ attachEvent($Element, eventMap, eventName, value, newEventMap);
382
435
  break;
383
436
  default:
384
437
  if (key.startsWith("data-")) {
@@ -390,9 +443,15 @@ var setProp = ($Element, key, value, eventMap) => {
390
443
  };
391
444
 
392
445
  // src/parts/VirtualDomElementProps/VirtualDomElementProps.ts
393
- var setProps = ($Element, props, eventMap) => {
446
+ var setProps = ($Element, props, eventMap, newEventMap) => {
394
447
  for (const key in props) {
395
- setProp($Element, key, props[key], eventMap);
448
+ setProp(
449
+ $Element,
450
+ key,
451
+ props[key],
452
+ eventMap,
453
+ newEventMap
454
+ );
396
455
  }
397
456
  };
398
457
 
@@ -400,28 +459,28 @@ var setProps = ($Element, props, eventMap) => {
400
459
  var renderDomTextNode = (element) => {
401
460
  return document.createTextNode(element.text);
402
461
  };
403
- var renderDomElement = (element, eventMap) => {
462
+ var renderDomElement = (element, eventMap, newEventMap) => {
404
463
  const tag = getElementTag(element.type);
405
464
  const $Element = document.createElement(tag);
406
- setProps($Element, element, eventMap);
465
+ setProps($Element, element, eventMap, newEventMap);
407
466
  return $Element;
408
467
  };
409
- var render = (element, eventMap) => {
468
+ var render = (element, eventMap, newEventMap) => {
410
469
  switch (element.type) {
411
470
  case Text:
412
471
  return renderDomTextNode(element);
413
472
  default:
414
- return renderDomElement(element, eventMap);
473
+ return renderDomElement(element, eventMap, newEventMap);
415
474
  }
416
475
  };
417
476
 
418
477
  // src/parts/RenderInternal/RenderInternal.ts
419
- var renderInternal2 = ($Parent, elements, eventMap) => {
478
+ var renderInternal2 = ($Parent, elements, eventMap, newEventMap) => {
420
479
  const max = elements.length - 1;
421
480
  let stack = [];
422
481
  for (let i = max; i >= 0; i--) {
423
482
  const element = elements[i];
424
- const $Element = render(element, eventMap);
483
+ const $Element = render(element, eventMap, newEventMap);
425
484
  if (element.childCount > 0) {
426
485
  $Element.append(...stack.slice(0, element.childCount));
427
486
  stack = stack.slice(element.childCount);
@@ -436,9 +495,9 @@ var renderInto = ($Parent, dom, eventMap = {}) => {
436
495
  clearNode($Parent);
437
496
  renderInternal2($Parent, dom, eventMap);
438
497
  };
439
- var render2 = (elements, eventMap = {}) => {
498
+ var render2 = (elements, eventMap = {}, newEventMap = {}) => {
440
499
  const $Root = document.createElement("div");
441
- renderInternal2($Root, elements, eventMap);
500
+ renderInternal2($Root, elements, eventMap, newEventMap);
442
501
  return $Root;
443
502
  };
444
503
 
@@ -458,7 +517,8 @@ var rememberFocus = ($Viewlet, dom, eventMap, uid = 0) => {
458
517
  inputMap[$Input.name] = $Input.value;
459
518
  }
460
519
  if (uid) {
461
- const $New = render2(dom, eventMap).firstChild;
520
+ const newEventMap = getEventListenerMap(uid);
521
+ const $New = render2(dom, eventMap, newEventMap).firstChild;
462
522
  setComponentUid($New, uid);
463
523
  $Viewlet.replaceWith($New);
464
524
  $Viewlet = $New;
@@ -484,6 +544,7 @@ var rememberFocus = ($Viewlet, dom, eventMap, uid = 0) => {
484
544
  export {
485
545
  getComponentUid,
486
546
  getComponentUidFromEvent,
547
+ registerEventListeners,
487
548
  rememberFocus,
488
549
  render2 as render,
489
550
  renderInto,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/virtual-dom",
3
- "version": "1.0.3",
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)
@@ -1,3 +1,3 @@
1
- export const clearNode = ($Node) => {
1
+ export const clearNode = ($Node: HTMLElement): void => {
2
2
  $Node.textContent = ''
3
3
  }
@@ -1,19 +1,10 @@
1
- const uidSymbol = Symbol('uid')
1
+ import { getUidTarget } from '../GetUidTarget/GetUidTarget.ts'
2
+ import { uidSymbol } from '../UidSymbol/UidSymbol.ts'
2
3
 
3
4
  export const setComponentUid = ($Element, uid) => {
4
5
  $Element[uidSymbol] = uid
5
6
  }
6
7
 
7
- const getUidTarget = ($Element) => {
8
- while ($Element) {
9
- if ($Element[uidSymbol]) {
10
- return $Element
11
- }
12
- $Element = $Element.parentNode
13
- }
14
- return undefined
15
- }
16
-
17
8
  export const getComponentUid = ($Element) => {
18
9
  const $Target = getUidTarget($Element)
19
10
  if (!$Target) {
@@ -0,0 +1,11 @@
1
+ import { uidSymbol } from '../UidSymbol/UidSymbol.ts'
2
+
3
+ export const getUidTarget = ($Element) => {
4
+ while ($Element) {
5
+ if ($Element[uidSymbol]) {
6
+ return $Element
7
+ }
8
+ $Element = $Element.parentNode
9
+ }
10
+ return undefined
11
+ }
@@ -1,14 +1,13 @@
1
1
  import * as ComponentUid from '../ComponentUid/ComponentUid.ts'
2
- import * as NameAnonymousFunction from '../NameAnonymousFunction/NameAnonymousFunction.ts'
3
2
  import * as IpcState from '../IpcState/IpcState.ts'
4
-
5
- const cache = new Map()
3
+ import * as ListenerCache from '../ListenerCache/ListenerCache.ts'
4
+ import * as NameAnonymousFunction from '../NameAnonymousFunction/NameAnonymousFunction.ts'
6
5
 
7
6
  export const getWrappedListener = (listener, returnValue) => {
8
7
  if (!returnValue) {
9
8
  return listener
10
9
  }
11
- if (!cache.has(listener)) {
10
+ if (!ListenerCache.has(listener)) {
12
11
  const wrapped = (event) => {
13
12
  const uid = ComponentUid.getComponentUidFromEvent(event)
14
13
  const result = listener(event)
@@ -20,7 +19,7 @@ export const getWrappedListener = (listener, returnValue) => {
20
19
  ipc.send('Viewlet.executeViewletCommand', uid, ...result)
21
20
  }
22
21
  NameAnonymousFunction.nameAnonymousFunction(wrapped, listener.name)
23
- cache.set(listener, wrapped)
22
+ ListenerCache.set(listener, wrapped)
24
23
  }
25
- return cache.get(listener)
24
+ return ListenerCache.get(listener)
26
25
  }
@@ -0,0 +1,13 @@
1
+ const cache = new Map()
2
+
3
+ export const has = (listener) => {
4
+ return cache.has(listener)
5
+ }
6
+
7
+ export const set = (listener, value) => {
8
+ cache.set(listener, value)
9
+ }
10
+
11
+ export const get = (listener) => {
12
+ return cache.get(listener)
13
+ }
@@ -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))
@@ -0,0 +1 @@
1
+ export const uidSymbol = Symbol('uid')
@@ -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
  }
@@ -1,6 +1,12 @@
1
1
  import * as AttachEvent from '../AttachEvent/AttachEvent.ts'
2
2
 
3
- export const setProp = ($Element: HTMLElement, key: string, value: any, eventMap: any) => {
3
+ export const setProp = (
4
+ $Element: HTMLElement,
5
+ key: string,
6
+ value: any,
7
+ eventMap: any,
8
+ newEventMap?: any,
9
+ ) => {
4
10
  switch (key) {
5
11
  case 'maskImage':
6
12
  $Element.style.maskImage = `url('${value}')`
@@ -65,7 +71,7 @@ export const setProp = ($Element: HTMLElement, key: string, value: any, eventMap
65
71
  if (!eventMap || !value) {
66
72
  return
67
73
  }
68
- AttachEvent.attachEvent($Element, eventMap, eventName, value)
74
+ AttachEvent.attachEvent($Element, eventMap, eventName, value, newEventMap)
69
75
  break
70
76
  default:
71
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
  }