@dooboostore/simple-web-component 1.0.46 → 1.0.48

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.
Files changed (139) hide show
  1. package/README.md +109 -11
  2. package/dist/cjs/bundle-entry.js +22 -0
  3. package/dist/cjs/bundle-entry.js.map +2 -2
  4. package/dist/cjs/decorators/addEventListener.js +45 -7
  5. package/dist/cjs/decorators/addEventListener.js.map +2 -2
  6. package/dist/cjs/decorators/elementDefine.js +225 -6
  7. package/dist/cjs/decorators/elementDefine.js.map +3 -3
  8. package/dist/cjs/decorators/index.js +2 -0
  9. package/dist/cjs/decorators/index.js.map +2 -2
  10. package/dist/cjs/decorators/mutationObserver.js +104 -0
  11. package/dist/cjs/decorators/mutationObserver.js.map +7 -0
  12. package/dist/cjs/decorators/query.js +13 -1
  13. package/dist/cjs/decorators/query.js.map +2 -2
  14. package/dist/cjs/decorators/resizeObserver.js +104 -0
  15. package/dist/cjs/decorators/resizeObserver.js.map +7 -0
  16. package/dist/cjs/examples/RxJSOperatorsExample.js +285 -0
  17. package/dist/cjs/examples/RxJSOperatorsExample.js.map +7 -0
  18. package/dist/esm/bundle-entry.js +8 -0
  19. package/dist/esm/bundle-entry.js.map +2 -2
  20. package/dist/esm/decorators/addEventListener.js +45 -7
  21. package/dist/esm/decorators/addEventListener.js.map +2 -2
  22. package/dist/esm/decorators/elementDefine.js +225 -6
  23. package/dist/esm/decorators/elementDefine.js.map +3 -3
  24. package/dist/esm/decorators/index.js +2 -0
  25. package/dist/esm/decorators/index.js.map +2 -2
  26. package/dist/esm/decorators/mutationObserver.js +85 -0
  27. package/dist/esm/decorators/mutationObserver.js.map +7 -0
  28. package/dist/esm/decorators/query.js +13 -1
  29. package/dist/esm/decorators/query.js.map +2 -2
  30. package/dist/esm/decorators/resizeObserver.js +85 -0
  31. package/dist/esm/decorators/resizeObserver.js.map +7 -0
  32. package/dist/esm/examples/RxJSOperatorsExample.js +266 -0
  33. package/dist/esm/examples/RxJSOperatorsExample.js.map +7 -0
  34. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +5869 -157
  35. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  36. package/dist/types/bundle-entry.d.ts +3 -0
  37. package/dist/types/bundle-entry.d.ts.map +1 -1
  38. package/dist/types/decorators/addEventListener.d.ts +24 -5
  39. package/dist/types/decorators/addEventListener.d.ts.map +1 -1
  40. package/dist/types/decorators/elementDefine.d.ts +14 -0
  41. package/dist/types/decorators/elementDefine.d.ts.map +1 -1
  42. package/dist/types/decorators/index.d.ts +2 -0
  43. package/dist/types/decorators/index.d.ts.map +1 -1
  44. package/dist/types/decorators/mutationObserver.d.ts +36 -0
  45. package/dist/types/decorators/mutationObserver.d.ts.map +1 -0
  46. package/dist/types/decorators/query.d.ts +12 -0
  47. package/dist/types/decorators/query.d.ts.map +1 -1
  48. package/dist/types/decorators/resizeObserver.d.ts +37 -0
  49. package/dist/types/decorators/resizeObserver.d.ts.map +1 -0
  50. package/dist/types/examples/RxJSOperatorsExample.d.ts +94 -0
  51. package/dist/types/examples/RxJSOperatorsExample.d.ts.map +1 -0
  52. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +5886 -178
  53. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  54. package/package.json +7 -8
  55. package/src/bundle-entry.ts +8 -0
  56. package/src/decorators/addEventListener.ts +52 -9
  57. package/src/decorators/elementDefine.ts +330 -47
  58. package/src/decorators/index.ts +2 -0
  59. package/src/decorators/mutationObserver.ts +128 -0
  60. package/src/decorators/query.ts +23 -0
  61. package/src/decorators/resizeObserver.ts +129 -0
  62. package/src/examples/RxJSOperatorsExample.ts +279 -0
  63. package/dist/cjs/elements/tt/SwcAppMixin.js +0 -1
  64. package/dist/cjs/elements/tt/SwcAppMixin.js.map +0 -7
  65. package/dist/cjs/elements/tt/SwcAsync.js +0 -1
  66. package/dist/cjs/elements/tt/SwcAsync.js.map +0 -7
  67. package/dist/cjs/elements/tt/SwcAsyncTemplate.js +0 -1
  68. package/dist/cjs/elements/tt/SwcAsyncTemplate.js.map +0 -7
  69. package/dist/cjs/elements/tt/SwcChoose.js +0 -1
  70. package/dist/cjs/elements/tt/SwcChoose.js.map +0 -7
  71. package/dist/cjs/elements/tt/SwcChooseTemplate.js +0 -1
  72. package/dist/cjs/elements/tt/SwcChooseTemplate.js.map +0 -7
  73. package/dist/cjs/elements/tt/SwcIf.js +0 -1
  74. package/dist/cjs/elements/tt/SwcIf.js.map +0 -7
  75. package/dist/cjs/elements/tt/SwcIfTemplate.js +0 -1
  76. package/dist/cjs/elements/tt/SwcIfTemplate.js.map +0 -7
  77. package/dist/cjs/elements/tt/SwcLoop.js +0 -1
  78. package/dist/cjs/elements/tt/SwcLoop.js.map +0 -7
  79. package/dist/cjs/elements/tt/SwcLoopTemplate.js +0 -1
  80. package/dist/cjs/elements/tt/SwcLoopTemplate.js.map +0 -7
  81. package/dist/cjs/elements/tt/SwcSubTemplates.js +0 -1
  82. package/dist/cjs/elements/tt/SwcSubTemplates.js.map +0 -7
  83. package/dist/cjs/elements/tt/register.js +0 -1
  84. package/dist/cjs/elements/tt/register.js.map +0 -7
  85. package/dist/esm/elements/tt/SwcAppMixin.js +0 -1
  86. package/dist/esm/elements/tt/SwcAppMixin.js.map +0 -7
  87. package/dist/esm/elements/tt/SwcAsync.js +0 -1
  88. package/dist/esm/elements/tt/SwcAsync.js.map +0 -7
  89. package/dist/esm/elements/tt/SwcAsyncTemplate.js +0 -1
  90. package/dist/esm/elements/tt/SwcAsyncTemplate.js.map +0 -7
  91. package/dist/esm/elements/tt/SwcChoose.js +0 -1
  92. package/dist/esm/elements/tt/SwcChoose.js.map +0 -7
  93. package/dist/esm/elements/tt/SwcChooseTemplate.js +0 -1
  94. package/dist/esm/elements/tt/SwcChooseTemplate.js.map +0 -7
  95. package/dist/esm/elements/tt/SwcIf.js +0 -1
  96. package/dist/esm/elements/tt/SwcIf.js.map +0 -7
  97. package/dist/esm/elements/tt/SwcIfTemplate.js +0 -1
  98. package/dist/esm/elements/tt/SwcIfTemplate.js.map +0 -7
  99. package/dist/esm/elements/tt/SwcLoop.js +0 -1
  100. package/dist/esm/elements/tt/SwcLoop.js.map +0 -7
  101. package/dist/esm/elements/tt/SwcLoopTemplate.js +0 -1
  102. package/dist/esm/elements/tt/SwcLoopTemplate.js.map +0 -7
  103. package/dist/esm/elements/tt/SwcSubTemplates.js +0 -1
  104. package/dist/esm/elements/tt/SwcSubTemplates.js.map +0 -7
  105. package/dist/esm/elements/tt/register.js +0 -1
  106. package/dist/esm/elements/tt/register.js.map +0 -7
  107. package/dist/types/elements/tt/SwcAppMixin.d.ts +0 -1
  108. package/dist/types/elements/tt/SwcAppMixin.d.ts.map +0 -1
  109. package/dist/types/elements/tt/SwcAsync.d.ts +0 -1
  110. package/dist/types/elements/tt/SwcAsync.d.ts.map +0 -1
  111. package/dist/types/elements/tt/SwcAsyncTemplate.d.ts +0 -1
  112. package/dist/types/elements/tt/SwcAsyncTemplate.d.ts.map +0 -1
  113. package/dist/types/elements/tt/SwcChoose.d.ts +0 -1
  114. package/dist/types/elements/tt/SwcChoose.d.ts.map +0 -1
  115. package/dist/types/elements/tt/SwcChooseTemplate.d.ts +0 -1
  116. package/dist/types/elements/tt/SwcChooseTemplate.d.ts.map +0 -1
  117. package/dist/types/elements/tt/SwcIf.d.ts +0 -1
  118. package/dist/types/elements/tt/SwcIf.d.ts.map +0 -1
  119. package/dist/types/elements/tt/SwcIfTemplate.d.ts +0 -1
  120. package/dist/types/elements/tt/SwcIfTemplate.d.ts.map +0 -1
  121. package/dist/types/elements/tt/SwcLoop.d.ts +0 -1
  122. package/dist/types/elements/tt/SwcLoop.d.ts.map +0 -1
  123. package/dist/types/elements/tt/SwcLoopTemplate.d.ts +0 -1
  124. package/dist/types/elements/tt/SwcLoopTemplate.d.ts.map +0 -1
  125. package/dist/types/elements/tt/SwcSubTemplates.d.ts +0 -1
  126. package/dist/types/elements/tt/SwcSubTemplates.d.ts.map +0 -1
  127. package/dist/types/elements/tt/register.d.ts +0 -1
  128. package/dist/types/elements/tt/register.d.ts.map +0 -1
  129. package/src/elements/tt/SwcAppMixin.ts +0 -13
  130. package/src/elements/tt/SwcAsync.ts +0 -139
  131. package/src/elements/tt/SwcAsyncTemplate.ts +0 -126
  132. package/src/elements/tt/SwcChoose.ts +0 -182
  133. package/src/elements/tt/SwcChooseTemplate.ts +0 -229
  134. package/src/elements/tt/SwcIf.ts +0 -145
  135. package/src/elements/tt/SwcIfTemplate.ts +0 -158
  136. package/src/elements/tt/SwcLoop.ts +0 -222
  137. package/src/elements/tt/SwcLoopTemplate.ts +0 -255
  138. package/src/elements/tt/SwcSubTemplates.ts +0 -6
  139. package/src/elements/tt/register.ts +0 -720
package/README.md CHANGED
@@ -181,14 +181,14 @@ class CounterApp extends HTMLElement {
181
181
  <!-- Text directive: render as text -->
182
182
  <!--[text Count: @count@ ]-->
183
183
 
184
- <!-- Attribute binding with a: prefix -->
185
- <div a:title="'Count is'+@count@"></div>
184
+ <!-- Attribute binding with a:: prefix -->
185
+ <div a::title="'Count is'+@count@"></div>
186
186
 
187
- <!-- Event binding with e: prefix -->
188
- <button e:click="@increment@()">Increment (@count@)</button>
187
+ <!-- Event binding with e:: prefix -->
188
+ <button e::click="@increment@()">Increment (@count@)</button>
189
189
 
190
190
  <!-- Conditional rendering -->
191
- <div a:style="@isActive@ ? 'color: green' : 'color: red'">
191
+ <div a::style="@isActive@ ? 'color: green' : 'color: red'">
192
192
  </div>
193
193
  </div>
194
194
  `;
@@ -206,8 +206,8 @@ class CounterApp extends HTMLElement {
206
206
  **Template Directives:**
207
207
  - `<!--[html @state@ ]-->` - Render state value as HTML
208
208
  - `<!--[text @state@ ]-->` - Render state value as text
209
- - `a:attributeName="@state@"` - Bind state to HTML attributes
210
- - `e:eventName="@methodName@()"` - Bind events to methods
209
+ - `a::attributeName="@state@"` - Bind state to HTML attributes
210
+ - `e::eventName="@methodName@()"` - Bind events to methods
211
211
 
212
212
  **How @state Works:**
213
213
  1. Declare property with `@state('stateName')`
@@ -236,7 +236,7 @@ increment() {
236
236
  <!--[text @count = 5@ ]--> // This won't work - read-only in templates
237
237
 
238
238
  // ✅ CORRECT - Call method from template
239
- <button e:click="@increment@()">Increment</button>
239
+ <button e::click="@increment@()">Increment</button>
240
240
  ```
241
241
 
242
242
  **Advanced Example:**
@@ -260,14 +260,14 @@ class UserProfile extends HTMLElement {
260
260
  <div>
261
261
  <!-- Display user info -->
262
262
  <h2><!--[text @user.name@ ]--></h2>
263
- <p a:title="Email: @user.email@">Age: @user.age@</p>
263
+ <p a::title="Email: @user.email@">Age: @user.age@</p>
264
264
 
265
265
  <!-- Conditional rendering based on state -->
266
- <div a:style="@isEditing@ ? 'border: 1px solid blue' : 'border: none'">
266
+ <div a::style="@isEditing@ ? 'border: 1px solid blue' : 'border: none'">
267
267
  <!--[html @isEditing@ ? '<input type="text" />' : '<span>View Mode</span>' ]-->
268
268
  </div>
269
269
 
270
- <button e:click="toggleEdit"> toggleEdit </button>
270
+ <button e::click="toggleEdit"> toggleEdit </button>
271
271
  </div>
272
272
  `;
273
273
  }
@@ -613,6 +613,104 @@ class FormHandler extends HTMLElement {
613
613
  - `@setProperty('#selector', 'propertyName', options)` - Set property on selector with options
614
614
  - `@setProperty` - Bare decorator (uses method name as property on $this)
615
615
 
616
+ ### 6.6 **DOM Observers (@mutationObserver, @resizeObserver)**
617
+
618
+ Observe DOM mutations and element size changes declaratively. Both decorators share the same pattern as `@event` — they support optional selector (defaults to `$this`), root-based helpers, and `delegate` mode.
619
+
620
+ #### @mutationObserver
621
+ Detect DOM changes (child add/remove, attribute changes, text changes) and react automatically.
622
+
623
+ ```typescript
624
+ @elementDefine('list-observer')
625
+ class ListObserver extends HTMLElement {
626
+ // Observe all changes under this component (light DOM)
627
+ @mutationObserverLight({ childList: true, attributes: true, subtree: true })
628
+ onDomChanged(matchedEls: HTMLElement[], mutations: MutationRecord[], observer: MutationObserver) {
629
+ console.log('DOM changed:', matchedEls.length, mutations);
630
+ }
631
+
632
+ // Observe a specific selector (delegate mode - catches dynamically added nodes too)
633
+ @mutationObserverDelegateShadow('.item', { childList: true })
634
+ onItemChanged(matchedEls: HTMLElement[], mutations: MutationRecord[], observer: MutationObserver) {
635
+ console.log('Item changed:', matchedEls);
636
+ }
637
+ }
638
+ ```
639
+
640
+ **Callback signature:**
641
+ - `matchedEls: HTMLElement[]` - Elements matching the selector (1st arg)
642
+ - `mutations: MutationRecord[]` - Original mutation records (2nd arg)
643
+ - `observer: MutationObserver` - The observer instance (3rd arg)
644
+
645
+ **How delegate works:**
646
+ - **delegate=true** - Observes the root with `subtree: true`; dynamically added/removed elements matching the selector are detected in the callback
647
+ - **delegate=false** (default) - Observes only the elements matching the selector at connect time
648
+
649
+ **@mutationObserver Options:**
650
+ - Standard `MutationObserverInit` options: `childList`, `attributes`, `characterData`, `subtree`, `attributeFilter`, `attributeOldValue`, `characterDataOldValue`
651
+ - `delegate` - Observe root and filter by selector in callback
652
+ - `root` - `'light' | 'shadow' | 'all' | 'auto'`
653
+ - `filter` - Additional callback filter
654
+ - `removeObserver` - Cleanup callback called on disconnect `(target, options)`
655
+
656
+ **@mutationObserver Decorator Variants:**
657
+ - `mutationObserver(selector?, options?)` - Full form (selector defaults to `$this`)
658
+ - `mutationObserverLight(selector?, options?)` - Observe light DOM
659
+ - `mutationObserverShadow(selector?, options?)` - Observe shadow DOM
660
+ - `mutationObserverAll(selector?, options?)` - Observe both light & shadow
661
+ - `mutationObserverDelegate(selector?, options?)` - Delegate mode (root observe)
662
+ - `mutationObserverDelegateLight(selector?, options?)` - Delegate in light DOM
663
+ - `mutationObserverDelegateShadow(selector?, options?)` - Delegate in shadow DOM
664
+ - `mutationObserverDelegateAll(selector?, options?)` - Delegate in all DOM
665
+
666
+ #### @resizeObserver
667
+ Detect element size changes and react automatically.
668
+
669
+ ```typescript
670
+ @elementDefine('chart-widget')
671
+ class ChartWidget extends HTMLElement {
672
+ // Re-render when component size changes (selector defaults to $this)
673
+ @resizeObserverLight()
674
+ onResize(matchedEls: HTMLElement[], entries: ResizeObserverEntry[], observer: ResizeObserver) {
675
+ this.redraw(entries[0]?.contentRect);
676
+ }
677
+
678
+ // Watch specific elements (delegate mode tracks dynamically added ones)
679
+ @resizeObserverDelegateShadow('.card')
680
+ onCardResize(matchedEls: HTMLElement[], entries: ResizeObserverEntry[], observer: ResizeObserver) {
681
+ console.log('Card resized:', matchedEls[0]?.clientWidth);
682
+ }
683
+ }
684
+ ```
685
+
686
+ **Callback signature:**
687
+ - `matchedEls: HTMLElement[]` - Elements that were resized (1st arg)
688
+ - `entries: ResizeObserverEntry[]` - Original observer entries (2nd arg)
689
+ - `observer: ResizeObserver` - The observer instance (3rd arg)
690
+
691
+ **@resizeObserver Options:**
692
+ - `box` - `'content-box' | 'border-box' | 'device-pixel-content-box'`
693
+ - `delegate` - Track dynamically added/removed matching elements
694
+ - `root` - `'light' | 'shadow' | 'all' | 'auto'`
695
+ - `filter` - Additional callback filter
696
+ - `removeObserver` - Cleanup callback called on disconnect `(target, options)`
697
+
698
+ **@resizeObserver Decorator Variants:**
699
+ - `resizeObserver(selector?, options?)` - Full form (selector defaults to `$this`)
700
+ - `resizeObserverLight(selector?, options?)` - Observe light DOM
701
+ - `resizeObserverShadow(selector?, options?)` - Observe shadow DOM
702
+ - `resizeObserverAll(selector?, options?)` - Observe both light & shadow
703
+ - `resizeObserverDelegate(selector?, options?)` - Delegate mode (root observe)
704
+ - `resizeObserverDelegateLight(selector?, options?)` - Delegate in light DOM
705
+ - `resizeObserverDelegateShadow(selector?, options?)` - Delegate in shadow DOM
706
+ - `resizeObserverDelegateAll(selector?, options?)` - Delegate in all DOM
707
+
708
+ **Combining with @resizeObserver delegate (dynamic tracking):**
709
+ When `delegate: true`, an internal `MutationObserver` automatically observes the root so that elements matching the selector are tracked even after being dynamically added/removed from the DOM.
710
+
711
+ **Cleanup:**
712
+ Both observers are automatically disconnected when the component is removed from the DOM. `removeObserver` callbacks (if provided) are invoked during cleanup.
713
+
616
714
  ### 7. **DOM Manipulation with applyNode**
617
715
 
618
716
  Surgically add, replace, or remove nodes in the DOM with fine-grained control.
@@ -1,7 +1,13 @@
1
+ var __create = Object.create;
1
2
  var __defProp = Object.defineProperty;
2
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
4
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
5
11
  var __copyProps = (to, from, except, desc) => {
6
12
  if (from && typeof from === "object" || typeof from === "function") {
7
13
  for (let key of __getOwnPropNames(from))
@@ -11,9 +17,25 @@ var __copyProps = (to, from, except, desc) => {
11
17
  return to;
12
18
  };
13
19
  var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
14
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
29
  var bundle_entry_exports = {};
30
+ __export(bundle_entry_exports, {
31
+ Core: () => Core,
32
+ CoreWeb: () => CoreWeb,
33
+ SimpleBoot: () => SimpleBoot
34
+ });
16
35
  module.exports = __toCommonJS(bundle_entry_exports);
17
36
  var import_reflect_metadata = require("reflect-metadata");
18
37
  __reExport(bundle_entry_exports, require("./index"), module.exports);
38
+ var Core = __toESM(require("@dooboostore/core"), 1);
39
+ var CoreWeb = __toESM(require("@dooboostore/core-web"), 1);
40
+ var SimpleBoot = __toESM(require("@dooboostore/simple-boot"), 1);
19
41
  //# sourceMappingURL=bundle-entry.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/bundle-entry.ts"],
4
- "sourcesContent": ["import 'reflect-metadata';\nexport * from './index';\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA;AAAA;AAAA,8BAAO;AACP,iCAAc,oBADd;",
4
+ "sourcesContent": ["import 'reflect-metadata';\n\n// simple-web-component itself\nexport * from './index';\n\n// Re-export peer dependencies so bundle consumers can access them\n// without separately importing each package\nexport * as Core from '@dooboostore/core';\nexport * as CoreWeb from '@dooboostore/core-web';\nexport * as SimpleBoot from '@dooboostore/simple-boot';\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAO;AAGP,iCAAc,oBAHd;AAOA,WAAsB;AACtB,cAAyB;AACzB,iBAA4B;",
6
6
  "names": []
7
7
  }
@@ -19,33 +19,55 @@ var addEventListener_exports = {};
19
19
  __export(addEventListener_exports, {
20
20
  ADD_EVENT_LISTENER_METADATA_KEY: () => ADD_EVENT_LISTENER_METADATA_KEY,
21
21
  addEventListener: () => addEventListener,
22
+ addEventListenerAllDom: () => addEventListenerAllDom,
22
23
  addEventListenerAppHost: () => addEventListenerAppHost,
23
24
  addEventListenerDelegate: () => addEventListenerDelegate,
24
25
  addEventListenerDelegateAllDom: () => addEventListenerDelegateAllDom,
25
26
  addEventListenerDelegateLightDom: () => addEventListenerDelegateLightDom,
26
27
  addEventListenerDelegateShadowDom: () => addEventListenerDelegateShadowDom,
27
28
  addEventListenerDocument: () => addEventListenerDocument,
29
+ addEventListenerLightDom: () => addEventListenerLightDom,
30
+ addEventListenerShadowDom: () => addEventListenerShadowDom,
28
31
  addEventListenerThis: () => addEventListenerThis,
29
32
  addEventListenerWindow: () => addEventListenerWindow,
30
33
  event: () => event,
34
+ eventAllDom: () => eventAllDom,
35
+ eventAppHost: () => eventAppHost,
31
36
  eventDelegate: () => eventDelegate,
32
37
  eventDelegateAllDom: () => eventDelegateAllDom,
33
38
  eventDelegateLightDom: () => eventDelegateLightDom,
34
39
  eventDelegateShadowDom: () => eventDelegateShadowDom,
40
+ eventDocument: () => eventDocument,
41
+ eventLightDom: () => eventLightDom,
42
+ eventShadowDom: () => eventShadowDom,
43
+ eventThis: () => eventThis,
44
+ eventWindow: () => eventWindow,
35
45
  getAddEventListenerMetadata: () => getAddEventListenerMetadata
36
46
  });
37
47
  module.exports = __toCommonJS(addEventListener_exports);
38
48
  var import_core = require("@dooboostore/core");
39
49
  const ADD_EVENT_LISTENER_METADATA_KEY = Symbol.for("simple-web-component:add-event-listener");
40
- function addEventListener(selectorOrTarget, type, options = {}) {
50
+ function addEventListener(selectorOrType, typeOrOptions, maybeOptions) {
41
51
  return (targetObj, propertyKey, descriptor) => {
52
+ let selector;
53
+ let type;
54
+ let opts = {};
55
+ if (typeof typeOrOptions === "string") {
56
+ selector = selectorOrType;
57
+ type = typeOrOptions;
58
+ opts = maybeOptions ?? {};
59
+ } else {
60
+ selector = "$this";
61
+ type = selectorOrType;
62
+ opts = typeOrOptions ?? {};
63
+ }
42
64
  const constructor = targetObj.constructor;
43
65
  let listeners = import_core.ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);
44
66
  if (!listeners) {
45
67
  listeners = [];
46
68
  import_core.ReflectUtils.defineMetadata(ADD_EVENT_LISTENER_METADATA_KEY, listeners, constructor);
47
69
  }
48
- listeners.push({ propertyKey, selector: selectorOrTarget, type, options });
70
+ listeners.push({ propertyKey, selector, type, options: opts });
49
71
  };
50
72
  }
51
73
  function addEventListenerDelegateLightDom(selector, type, options) {
@@ -60,11 +82,15 @@ function addEventListenerDelegateAllDom(selector, type, options) {
60
82
  function addEventListenerDelegate(selector, type, options) {
61
83
  return addEventListener(selector, type, { ...options ?? {}, root: "auto", delegate: true });
62
84
  }
63
- const event = addEventListener;
64
- const eventDelegateLightDom = addEventListenerDelegateLightDom;
65
- const eventDelegateShadowDom = addEventListenerDelegateShadowDom;
66
- const eventDelegateAllDom = addEventListenerDelegateAllDom;
67
- const eventDelegate = addEventListenerDelegate;
85
+ function addEventListenerLightDom(selector, type, options) {
86
+ return addEventListener(selector, type, { ...options ?? {}, root: "light" });
87
+ }
88
+ function addEventListenerShadowDom(selector, type, options) {
89
+ return addEventListener(selector, type, { ...options ?? {}, root: "shadow" });
90
+ }
91
+ function addEventListenerAllDom(selector, type, options) {
92
+ return addEventListener(selector, type, { ...options ?? {}, root: "all" });
93
+ }
68
94
  function addEventListenerThis(type, options) {
69
95
  return addEventListener("$this", type, options);
70
96
  }
@@ -77,6 +103,18 @@ function addEventListenerWindow(type, options) {
77
103
  function addEventListenerDocument(type, options) {
78
104
  return addEventListener("$document", type, options);
79
105
  }
106
+ const event = addEventListener;
107
+ const eventDelegateLightDom = addEventListenerDelegateLightDom;
108
+ const eventDelegateShadowDom = addEventListenerDelegateShadowDom;
109
+ const eventDelegateAllDom = addEventListenerDelegateAllDom;
110
+ const eventDelegate = addEventListenerDelegate;
111
+ const eventLightDom = addEventListenerLightDom;
112
+ const eventShadowDom = addEventListenerShadowDom;
113
+ const eventAllDom = addEventListenerAllDom;
114
+ const eventAppHost = addEventListenerAppHost;
115
+ const eventWindow = addEventListenerWindow;
116
+ const eventDocument = addEventListenerDocument;
117
+ const eventThis = addEventListenerThis;
80
118
  const getAddEventListenerMetadata = (target) => {
81
119
  const constructor = target instanceof Function ? target : target.constructor;
82
120
  return import_core.ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/decorators/addEventListener.ts"],
4
- "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core';\nimport { SpecialSelector, SwcQueryOptions, HelperHostSet } from '../types';\n\nexport interface AddEventListenerBaseOptions<TEvent extends Event = Event> extends EventListenerOptions {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n stopPropagation?: boolean;\n stopImmediatePropagation?: boolean;\n preventDefault?: boolean;\n // removeOnDisconnected?: boolean;\n delegate?: boolean;\n filter?: (target: Event | CustomEvent, meta:{currentThis: any, helper: HelperHostSet}) => boolean;\n // RxJS operator options\n debounceTime?: number;\n throttleTime?: number;\n distinctUntilChanged?: boolean | ((prev: TEvent, curr: TEvent) => boolean);\n}\n\nexport type EventListenerSelector = string | ((currentThis: any, helper: HelperHostSet) => NodeList | Element | Element[] | null);\n\nexport interface AddEventListenerMetadata<TEvent extends Event = Event> {\n propertyKey: string | symbol;\n selector: EventListenerSelector;\n type: string;\n options: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean };\n}\n\nexport const ADD_EVENT_LISTENER_METADATA_KEY = Symbol.for('simple-web-component:add-event-listener');\n\nexport function addEventListener<TEvent extends Event = Event>(target: SpecialSelector, type: string, options?: AddEventListenerBaseOptions<TEvent>): MethodDecorator;\nexport function addEventListener<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }): MethodDecorator;\n/**\n * @addEventListener decorator to bind events to elements.\n */\nexport function addEventListener<TEvent extends Event = Event>(selectorOrTarget: EventListenerSelector, type: string, options: any = {}): MethodDecorator {\n return (targetObj: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const constructor = targetObj.constructor;\n\n let listeners = ReflectUtils.getMetadata<AddEventListenerMetadata<TEvent>[]>(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n if (!listeners) {\n listeners = [];\n ReflectUtils.defineMetadata(ADD_EVENT_LISTENER_METADATA_KEY, listeners, constructor);\n }\n\n listeners.push({ propertyKey, selector: selectorOrTarget, type, options });\n };\n}\n\n\nexport function addEventListenerDelegateLightDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'light', delegate: true});\n}\n\nexport function addEventListenerDelegateShadowDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'shadow', delegate: true});\n}\nexport function addEventListenerDelegateAllDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'all', delegate: true});\n}\nexport function addEventListenerDelegate<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'auto', delegate: true});\n}\n\n/**\n * @addEventListenerThis decorator - simplified version of @addEventListener for $this selector\n */\n\n// --- Aliases: event... ---\nexport const event = addEventListener;\nexport const eventDelegateLightDom = addEventListenerDelegateLightDom;\nexport const eventDelegateShadowDom = addEventListenerDelegateShadowDom;\nexport const eventDelegateAllDom = addEventListenerDelegateAllDom;\nexport const eventDelegate = addEventListenerDelegate;\nexport function addEventListenerThis<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$this', type, options);\n}\n\n/**\n * @addEventListenerAppHost decorator - simplified version of @addEventListener for $appHost selector\n */\nexport function addEventListenerAppHost<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$appHost', type, options);\n}\n\nexport function addEventListenerWindow<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$window', type, options);\n}\nexport function addEventListenerDocument<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$document', type, options);\n}\n\nexport const getAddEventListenerMetadata = (target: any): AddEventListenerMetadata<Event>[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA6B;AA4BtB,MAAM,kCAAkC,OAAO,IAAI,yCAAyC;AAO5F,SAAS,iBAA+C,kBAAyC,MAAc,UAAe,CAAC,GAAoB;AACxJ,SAAO,CAAC,WAAmB,aAA8B,eAAmC;AAC1F,UAAM,cAAc,UAAU;AAE9B,QAAI,YAAY,yBAAa,YAAgD,iCAAiC,WAAW;AACzH,QAAI,CAAC,WAAW;AACd,kBAAY,CAAC;AACb,+BAAa,eAAe,iCAAiC,WAAW,WAAW;AAAA,IACrF;AAEA,cAAU,KAAK,EAAE,aAAa,UAAU,kBAAkB,MAAM,QAAQ,CAAC;AAAA,EAC3E;AACF;AAGO,SAAS,iCAA+D,UAAiC,MAAc,SAAkF;AAC9M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,SAAS,UAAU,KAAI,CAAC;AAChG;AAEO,SAAS,kCAAgE,UAAiC,MAAc,SAAkF;AAC/M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,UAAU,UAAU,KAAI,CAAC;AACjG;AACO,SAAS,+BAA6D,UAAiC,MAAc,SAAkF;AAC5M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,OAAO,UAAU,KAAI,CAAC;AAC9F;AACO,SAAS,yBAAuD,UAAiC,MAAc,SAAkF;AACtM,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,QAAQ,UAAU,KAAI,CAAC;AAC/F;AAOO,MAAM,QAAQ;AACd,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,sBAAsB;AAC5B,MAAM,gBAAgB;AACtB,SAAS,qBAAmD,MAAc,SAAkF;AACjK,SAAO,iBAAyB,SAAS,MAAM,OAAO;AACxD;AAKO,SAAS,wBAAsD,MAAc,SAAkF;AACpK,SAAO,iBAAyB,YAAY,MAAM,OAAO;AAC3D;AAEO,SAAS,uBAAqD,MAAc,SAAkF;AACnK,SAAO,iBAAyB,WAAW,MAAM,OAAO;AAC1D;AACO,SAAS,yBAAuD,MAAc,SAAkF;AACrK,SAAO,iBAAyB,aAAa,MAAM,OAAO;AAC5D;AAEO,MAAM,8BAA8B,CAAC,WAA+D;AACzG,QAAM,cAAc,kBAAkB,WAAW,SAAS,OAAO;AACjE,SAAO,yBAAa,YAAY,iCAAiC,WAAW;AAC9E;",
4
+ "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core';\nimport { SpecialSelector, SwcQueryOptions, HelperHostSet } from '../types';\n\nexport interface AddEventListenerBaseOptions<TEvent extends Event = Event> extends EventListenerOptions {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n stopPropagation?: boolean;\n stopImmediatePropagation?: boolean;\n preventDefault?: boolean;\n // removeOnDisconnected?: boolean;\n delegate?: boolean;\n filter?: (target: Event | CustomEvent, meta:{currentThis: any, helper: HelperHostSet}) => boolean;\n // \uB9AC\uC2A4\uB108 \uC81C\uAC70(disconnected \uB610\uB294 unmount) \uC2DC \uD638\uCD9C\uB418\uB294 \uCF5C\uBC31. \uCCAB \uBC88\uC9F8 \uC778\uC790\uB294 \uBC14\uC778\uB529\uB41C \uD0C0\uAC9F element, \uB450 \uBC88\uC9F8\uB294 \uC774 \uC635\uC158\uC774 \uC18D\uD55C \uC804\uCCB4 \uC635\uC158 \uAC1D\uCCB4(Base + SwcQuery + delegate).\n removeListener?: (target: Element, optionValue: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }) => void;\n // RxJS operator options\n debounceTime?: number;\n throttleTime?: number;\n distinctUntilChanged?: boolean | ((prev: TEvent, curr: TEvent) => boolean);\n}\n\nexport type EventListenerSelector = string | ((currentThis: any, helper: HelperHostSet) => NodeList | Element | Element[] | null);\n\nexport interface AddEventListenerMetadata<TEvent extends Event = Event> {\n propertyKey: string | symbol;\n selector: EventListenerSelector;\n type: string;\n options: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean };\n}\n\nexport const ADD_EVENT_LISTENER_METADATA_KEY = Symbol.for('simple-web-component:add-event-listener');\n\nexport function addEventListener<TEvent extends Event = Event>(target: SpecialSelector, type: string, options?: AddEventListenerBaseOptions<TEvent>): MethodDecorator;\nexport function addEventListener<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }): MethodDecorator;\n/**\n * @addEventListener(type, options?) \u2014 \uC140\uB809\uD130 \uC0DD\uB7B5 \uC2DC $this(\uCEF4\uD3EC\uB10C\uD2B8 \uC790\uC2E0)\uB85C \uBC14\uC778\uB529\n */\nexport function addEventListener<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }): MethodDecorator;\n/**\n * @addEventListener decorator to bind events to elements.\n */\nexport function addEventListener<TEvent extends Event = Event>(selectorOrType: EventListenerSelector | string, typeOrOptions?: string | (AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }), maybeOptions?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }): MethodDecorator {\n return (targetObj: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n let selector: EventListenerSelector;\n let type: string;\n let opts: any = {};\n\n if (typeof typeOrOptions === 'string') {\n // (selector, type[, options]) form \u2014 \uAE30\uC874 \uD638\uD658\n selector = selectorOrType as EventListenerSelector;\n type = typeOrOptions;\n opts = maybeOptions ?? {};\n } else {\n // (type[, options]) form \u2014 selector \uAE30\uBCF8\uAC12 $this\n selector = '$this';\n type = selectorOrType as string;\n opts = typeOrOptions ?? {};\n }\n\n const constructor = targetObj.constructor;\n\n let listeners = ReflectUtils.getMetadata<AddEventListenerMetadata<TEvent>[]>(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n if (!listeners) {\n listeners = [];\n ReflectUtils.defineMetadata(ADD_EVENT_LISTENER_METADATA_KEY, listeners, constructor);\n }\n\n listeners.push({ propertyKey, selector, type, options: opts });\n };\n}\n\n\nexport function addEventListenerDelegateLightDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'light', delegate: true});\n}\n\nexport function addEventListenerDelegateShadowDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'shadow', delegate: true});\n}\nexport function addEventListenerDelegateAllDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'all', delegate: true});\n}\nexport function addEventListenerDelegate<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'auto', delegate: true});\n}\n\n// \u2500\u2500\u2500 root\uBCC4 \uC77C\uBC18 \uD5EC\uD37C (delegate \uC5C6\uC74C) \u2500\u2500\u2500\n\nexport function addEventListenerLightDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: AddEventListenerBaseOptions<TEvent>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'light'});\n}\n\nexport function addEventListenerShadowDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: AddEventListenerBaseOptions<TEvent>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'shadow'});\n}\n\nexport function addEventListenerAllDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: AddEventListenerBaseOptions<TEvent>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'all'});\n}\n\n/**\n * @addEventListenerThis decorator - simplified version of @addEventListener for $this selector\n */\nexport function addEventListenerThis<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$this', type, options);\n}\n\n/**\n * @addEventListenerAppHost decorator - simplified version of @addEventListener for $appHost selector\n */\nexport function addEventListenerAppHost<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$appHost', type, options);\n}\n\nexport function addEventListenerWindow<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$window', type, options);\n}\nexport function addEventListenerDocument<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$document', type, options);\n}\n\n// --- Aliases: event... ---\nexport const event = addEventListener;\nexport const eventDelegateLightDom = addEventListenerDelegateLightDom;\nexport const eventDelegateShadowDom = addEventListenerDelegateShadowDom;\nexport const eventDelegateAllDom = addEventListenerDelegateAllDom;\nexport const eventDelegate = addEventListenerDelegate;\nexport const eventLightDom = addEventListenerLightDom;\nexport const eventShadowDom = addEventListenerShadowDom;\nexport const eventAllDom = addEventListenerAllDom;\nexport const eventAppHost = addEventListenerAppHost;\nexport const eventWindow = addEventListenerWindow;\nexport const eventDocument = addEventListenerDocument;\nexport const eventThis = addEventListenerThis;\n\nexport const getAddEventListenerMetadata = (target: any): AddEventListenerMetadata<Event>[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA6B;AA8BtB,MAAM,kCAAkC,OAAO,IAAI,yCAAyC;AAW5F,SAAS,iBAA+C,gBAAgD,eAA2G,cAAgH;AACxU,SAAO,CAAC,WAAmB,aAA8B,eAAmC;AAC1F,QAAI;AACJ,QAAI;AACJ,QAAI,OAAY,CAAC;AAEjB,QAAI,OAAO,kBAAkB,UAAU;AAErC,iBAAW;AACX,aAAO;AACP,aAAO,gBAAgB,CAAC;AAAA,IAC1B,OAAO;AAEL,iBAAW;AACX,aAAO;AACP,aAAO,iBAAiB,CAAC;AAAA,IAC3B;AAEA,UAAM,cAAc,UAAU;AAE9B,QAAI,YAAY,yBAAa,YAAgD,iCAAiC,WAAW;AACzH,QAAI,CAAC,WAAW;AACd,kBAAY,CAAC;AACb,+BAAa,eAAe,iCAAiC,WAAW,WAAW;AAAA,IACrF;AAEA,cAAU,KAAK,EAAE,aAAa,UAAU,MAAM,SAAS,KAAK,CAAC;AAAA,EAC/D;AACF;AAGO,SAAS,iCAA+D,UAAiC,MAAc,SAAkF;AAC9M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,SAAS,UAAU,KAAI,CAAC;AAChG;AAEO,SAAS,kCAAgE,UAAiC,MAAc,SAAkF;AAC/M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,UAAU,UAAU,KAAI,CAAC;AACjG;AACO,SAAS,+BAA6D,UAAiC,MAAc,SAAkF;AAC5M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,OAAO,UAAU,KAAI,CAAC;AAC9F;AACO,SAAS,yBAAuD,UAAiC,MAAc,SAAkF;AACtM,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,QAAQ,UAAU,KAAI,CAAC;AAC/F;AAIO,SAAS,yBAAuD,UAAiC,MAAc,SAAgE;AACpL,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,QAAO,CAAC;AAChF;AAEO,SAAS,0BAAwD,UAAiC,MAAc,SAAgE;AACrL,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,SAAQ,CAAC;AACjF;AAEO,SAAS,uBAAqD,UAAiC,MAAc,SAAgE;AAClL,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,MAAK,CAAC;AAC9E;AAKO,SAAS,qBAAmD,MAAc,SAAkF;AACjK,SAAO,iBAAyB,SAAS,MAAM,OAAO;AACxD;AAKO,SAAS,wBAAsD,MAAc,SAAkF;AACpK,SAAO,iBAAyB,YAAY,MAAM,OAAO;AAC3D;AAEO,SAAS,uBAAqD,MAAc,SAAkF;AACnK,SAAO,iBAAyB,WAAW,MAAM,OAAO;AAC1D;AACO,SAAS,yBAAuD,MAAc,SAAkF;AACrK,SAAO,iBAAyB,aAAa,MAAM,OAAO;AAC5D;AAGO,MAAM,QAAQ;AACd,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,sBAAsB;AAC5B,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AACvB,MAAM,cAAc;AACpB,MAAM,eAAe;AACrB,MAAM,cAAc;AACpB,MAAM,gBAAgB;AACtB,MAAM,YAAY;AAElB,MAAM,8BAA8B,CAAC,WAA+D;AACzG,QAAM,cAAc,kBAAkB,WAAW,SAAS,OAAO;AACjE,SAAO,yBAAa,YAAY,iCAAiC,WAAW;AAC9E;",
6
6
  "names": []
7
7
  }
@@ -26,6 +26,8 @@ module.exports = __toCommonJS(elementDefine_exports);
26
26
  var import_core = require("@dooboostore/core");
27
27
  var import_operators = require("@dooboostore/core/message/operators");
28
28
  var import_addEventListener = require("./addEventListener");
29
+ var import_mutationObserver = require("./mutationObserver");
30
+ var import_resizeObserver = require("./resizeObserver");
29
31
  var import_lifecycles = require("./lifecycles");
30
32
  var import_emitCustomEvent = require("./emitCustomEvent");
31
33
  var import_changedAttribute = require("./changedAttribute");
@@ -49,7 +51,6 @@ const ensureInit = (inst) => {
49
51
  if (!inst.__swc_initialized) {
50
52
  inst._swcId = inst?.getAttribute?.("swc-use-ssr") ?? "s" + Math.random().toString(36).substring(2, 11).toLowerCase();
51
53
  inst._emitHandlers = /* @__PURE__ */ new Map();
52
- inst._boundListeners = [];
53
54
  inst.__swc_initialized = true;
54
55
  const target = inst instanceof Function ? inst : inst.constructor;
55
56
  const attributeAllList = (0, import_applyAttribute.findAllAttributeMetadata)(target).filter((it) => it.type === "property");
@@ -251,6 +252,8 @@ const elementDefine = (name, config = {}) => (constructor) => {
251
252
  const emitCustomEventList = (0, import_emitCustomEvent.getEmitCustomEventMetadataList)(constructor) || [];
252
253
  const emitHostCustomEventList = emitCustomEventList.filter((meta) => meta.selector === "$this" || meta.selector === "");
253
254
  const addEventListenerList = (0, import_addEventListener.getAddEventListenerMetadata)(constructor) || [];
255
+ const mutationObserverList = (0, import_mutationObserver.getMutationObserverMetadata)(constructor) || [];
256
+ const resizeObserverList = (0, import_resizeObserver.getResizeObserverMetadata)(constructor) || [];
254
257
  const attrChangeMap = (0, import_changedAttribute.findAllAttributeChangedMetadata)(constructor);
255
258
  const attributeList = (0, import_applyAttribute.findAllAttributeMetadata)(constructor);
256
259
  const applyAttributeMap = (0, import_applyAttribute.findAllAttributeApplyMetadata)(constructor);
@@ -263,9 +266,18 @@ const elementDefine = (name, config = {}) => (constructor) => {
263
266
  const proto = constructor.prototype;
264
267
  setupPrototype(proto, win);
265
268
  let helperHostSet = null;
269
+ let boundListeners = [];
270
+ let shadowMutationObserver = null;
271
+ let lightMutationObserver = null;
272
+ let resizeObserver = null;
273
+ let resizeObservers = [];
274
+ let removeObserverCallbacks = [];
266
275
  const originalConnected = proto.connectedCallback;
267
276
  proto.connectedCallback = async function() {
268
277
  ensureInit(this);
278
+ boundListeners = [];
279
+ resizeObservers = [];
280
+ removeObserverCallbacks = [];
269
281
  helperHostSet = import_Utils.SwcUtils.getHelperAndHostSet(win, this);
270
282
  const appHost = helperHostSet.$appHost;
271
283
  const useSsr = (0, import_SwcAppMixin.isSSR)(this);
@@ -394,7 +406,13 @@ const elementDefine = (name, config = {}) => (constructor) => {
394
406
  }
395
407
  };
396
408
  br.addEventListener(type, unifiedHandler, opts);
397
- this._boundListeners.push({ target: br, type, handler: unifiedHandler, options: opts });
409
+ const onRemoves = [];
410
+ for (const m of sortedMetaList) {
411
+ if (m.options.removeListener) {
412
+ onRemoves.push({ fn: m.options.removeListener, opts: m.options });
413
+ }
414
+ }
415
+ boundListeners.push({ target: br, type, handler: unifiedHandler, options: opts, onRemoves });
398
416
  });
399
417
  });
400
418
  nonDelegateListeners.forEach((meta) => {
@@ -494,9 +512,181 @@ const elementDefine = (name, config = {}) => (constructor) => {
494
512
  eventSubject.next(event);
495
513
  };
496
514
  t.addEventListener(type, wrappedHandler, opts);
497
- this._boundListeners.push({ target: t, type, handler: wrappedHandler, options: opts, subscription });
515
+ const onRemoves = options.removeListener ? [{ fn: options.removeListener, opts }] : [];
516
+ boundListeners.push({ target: t, type, handler: wrappedHandler, options: opts, subscription, onRemoves });
517
+ });
518
+ });
519
+ shadowMutationObserver = null;
520
+ lightMutationObserver = null;
521
+ resizeObserver = null;
522
+ if (resizeObserverList.length > 0) {
523
+ const root2 = this.shadowRoot || this;
524
+ resizeObserver = new ResizeObserver((entries, obs) => {
525
+ for (const m of resizeObserverList) {
526
+ let matchedEls = [];
527
+ if (m.options.delegate && typeof m.selector === "string") {
528
+ const isThis = m.selector === "$this" || m.selector === "";
529
+ const matchesSel = (node) => {
530
+ if (!node || node.nodeType !== 1) return false;
531
+ if (isThis) return true;
532
+ const el = node;
533
+ return el.matches?.(m.selector) || !!el.closest?.(m.selector);
534
+ };
535
+ matchedEls = entries.map((e) => e.target).filter(matchesSel);
536
+ } else {
537
+ matchedEls = entries.map((e) => e.target).filter((t) => t && t.nodeType === 1);
538
+ }
539
+ if (matchedEls.length === 0) continue;
540
+ if (m.options.filter) {
541
+ const helper = import_Utils.SwcUtils.getHelperAndHostSet(currentWin, this);
542
+ if (!m.options.filter(matchedEls, { currentThis: this, helper })) continue;
543
+ }
544
+ const hostSet = import_Utils.SwcUtils.getHostSet(this);
545
+ this[m.propertyKey](matchedEls, entries, obs, { ...hostSet, $root: root2 });
546
+ }
498
547
  });
548
+ resizeObservers.push(resizeObserver);
549
+ for (const m of resizeObserverList) {
550
+ if (m.options.removeObserver) {
551
+ removeObserverCallbacks.push({ fn: m.options.removeObserver, target: root2, opts: m.options });
552
+ }
553
+ }
554
+ }
555
+ const shadowMetas = mutationObserverList.filter((m) => {
556
+ const r = m.options.root || "auto";
557
+ return this.shadowRoot && (r === "shadow" || r === "all" || r === "auto");
558
+ });
559
+ const lightMetas = mutationObserverList.filter((m) => {
560
+ const r = m.options.root || "auto";
561
+ return r === "light" || r === "all" || !this.shadowRoot && r === "auto";
499
562
  });
563
+ const setupMutationObserver = (root2, metas, resizeDelegates = []) => {
564
+ if (metas.length === 0) return null;
565
+ const initFrom = (o) => {
566
+ const init = {
567
+ childList: o.childList,
568
+ attributes: o.attributes,
569
+ characterData: o.characterData,
570
+ subtree: o.subtree,
571
+ attributeFilter: o.attributeFilter,
572
+ attributeOldValue: o.attributeOldValue,
573
+ characterDataOldValue: o.characterDataOldValue
574
+ };
575
+ if (!init.childList && !init.attributes && !init.characterData) init.childList = true;
576
+ return init;
577
+ };
578
+ const observer = new MutationObserver((mutations, obs) => {
579
+ for (const meta of metas) {
580
+ const { selector, options } = meta;
581
+ let matchedEls = [];
582
+ if (options.delegate && typeof selector === "string") {
583
+ const isThis = selector === "$this" || selector === "";
584
+ const matchesSel = (node) => {
585
+ if (!node || node.nodeType !== 1) return false;
586
+ if (isThis) return true;
587
+ const el = node;
588
+ return el.matches?.(selector) || !!el.closest?.(selector);
589
+ };
590
+ matchedEls = mutations.flatMap((m) => {
591
+ const els = [];
592
+ if (matchesSel(m.target)) els.push(m.target);
593
+ Array.from(m.addedNodes || []).filter(matchesSel).forEach((n) => els.push(n));
594
+ Array.from(m.removedNodes || []).filter(matchesSel).forEach((n) => els.push(n));
595
+ return els;
596
+ });
597
+ } else if (typeof selector === "string") {
598
+ const isThis = selector === "$this" || selector === "";
599
+ const matchesSel = (node) => {
600
+ if (!node || node.nodeType !== 1) return false;
601
+ if (isThis) return true;
602
+ return node.matches?.(selector);
603
+ };
604
+ matchedEls = mutations.flatMap((m) => {
605
+ const els = [];
606
+ if (matchesSel(m.target)) els.push(m.target);
607
+ Array.from(m.addedNodes || []).filter(matchesSel).forEach((n) => els.push(n));
608
+ Array.from(m.removedNodes || []).filter(matchesSel).forEach((n) => els.push(n));
609
+ return els;
610
+ });
611
+ } else {
612
+ matchedEls = mutations.map((m) => m.target).filter((t) => t && t.nodeType === 1);
613
+ }
614
+ if (matchedEls.length === 0) continue;
615
+ if (options.filter) {
616
+ const helper = import_Utils.SwcUtils.getHelperAndHostSet(currentWin, this);
617
+ if (!options.filter(matchedEls, { currentThis: this, helper })) continue;
618
+ }
619
+ const hostSet = import_Utils.SwcUtils.getHostSet(this);
620
+ this[meta.propertyKey](matchedEls, mutations, obs, { ...hostSet, $root: root2 });
621
+ }
622
+ if (resizeDelegates.length > 0 && resizeObserver) {
623
+ const handle = (n, observe) => {
624
+ if (n.nodeType !== 1) return;
625
+ const el = n;
626
+ for (const m of resizeDelegates) {
627
+ if (typeof m.selector !== "string") continue;
628
+ const isThis = m.selector === "$this" || m.selector === "";
629
+ const matchesSel = (node) => {
630
+ if (!node || node.nodeType !== 1) return false;
631
+ if (isThis) return true;
632
+ const e = node;
633
+ return e.matches?.(m.selector) || !!e.closest?.(m.selector);
634
+ };
635
+ if (matchesSel(el)) {
636
+ if (observe) resizeObserver.observe(el, m.options.box ? { box: m.options.box } : void 0);
637
+ else resizeObserver.unobserve(el);
638
+ } else if (!isThis) {
639
+ el.querySelectorAll(m.selector).forEach((sub) => {
640
+ if (observe) resizeObserver.observe(sub, m.options.box ? { box: m.options.box } : void 0);
641
+ else resizeObserver.unobserve(sub);
642
+ });
643
+ }
644
+ }
645
+ };
646
+ for (const m of mutations) {
647
+ Array.from(m.addedNodes || []).forEach((n) => handle(n, true));
648
+ Array.from(m.removedNodes || []).forEach((n) => handle(n, false));
649
+ }
650
+ }
651
+ });
652
+ const hasDelegate = metas.some((m) => m.options.delegate) || resizeDelegates.some((m) => m.options.delegate);
653
+ if (hasDelegate) {
654
+ observer.observe(root2, { childList: true, subtree: true });
655
+ }
656
+ const nonDelegateMetas = metas.filter((m) => !m.options.delegate);
657
+ for (const m of nonDelegateMetas) {
658
+ const { selector, options } = m;
659
+ const mInit = initFrom(options);
660
+ if (typeof selector === "string") {
661
+ if (selector === "$this" || selector === "") {
662
+ observer.observe(root2, mInit);
663
+ } else {
664
+ root2.querySelectorAll(selector).forEach((el) => observer.observe(el, mInit));
665
+ }
666
+ } else if (typeof selector === "function") {
667
+ observer.observe(root2, mInit);
668
+ }
669
+ }
670
+ return observer;
671
+ };
672
+ const shadowResizeDelegateMetas = resizeObserverList.filter((m) => {
673
+ if (!m.options.delegate) return false;
674
+ const r = m.options.root || "auto";
675
+ return this.shadowRoot && (r === "shadow" || r === "all" || r === "auto");
676
+ });
677
+ const lightResizeDelegateMetas = resizeObserverList.filter((m) => {
678
+ if (!m.options.delegate) return false;
679
+ const r = m.options.root || "auto";
680
+ return r === "light" || r === "all" || !this.shadowRoot && r === "auto";
681
+ });
682
+ if (this.shadowRoot) shadowMutationObserver = setupMutationObserver(this.shadowRoot, shadowMetas, shadowResizeDelegateMetas);
683
+ lightMutationObserver = setupMutationObserver(this, lightMetas, lightResizeDelegateMetas);
684
+ for (const m of mutationObserverList) {
685
+ if (m.options.removeObserver) {
686
+ const rootForM = this.shadowRoot && (m.options.root === "shadow" || m.options.root === "all" || m.options.root === "auto" && this.shadowRoot) ? this.shadowRoot : this;
687
+ removeObserverCallbacks.push({ fn: m.options.removeObserver, target: rootForM, opts: m.options });
688
+ }
689
+ }
500
690
  if (originalConnected) await originalConnected.apply(this);
501
691
  const aMethods = (0, import_lifecycles.findAllOnConnectedAfterMetadata)(this);
502
692
  for (const m of aMethods) await this._invokeLifecycleMethod(m.propertyKey, helperHostSet);
@@ -531,15 +721,44 @@ const elementDefine = (name, config = {}) => (constructor) => {
531
721
  this._executeSwcScript("swc-on-before-disconnected", helperHostSet);
532
722
  const bMethods = (0, import_lifecycles.findAllLifecycleMetadata)(this, import_lifecycles.ON_BEFORE_DISCONNECTED_METADATA_KEY);
533
723
  for (const m of bMethods) this._invokeLifecycleMethod(m.propertyKey, helperHostSet);
534
- if (this._boundListeners) {
535
- this._boundListeners.forEach((l) => {
724
+ if (boundListeners.length > 0) {
725
+ boundListeners.forEach((l) => {
536
726
  l.target.removeEventListener(l.type, l.handler, l.options);
537
727
  if (l.subscription && typeof l.subscription.unsubscribe === "function") {
538
728
  l.subscription.unsubscribe();
539
729
  }
730
+ if (Array.isArray(l.onRemoves)) {
731
+ for (const r of l.onRemoves) {
732
+ try {
733
+ r.fn(l.target, r.opts);
734
+ } catch (e) {
735
+ console.error("[SWC] removeListener error:", e);
736
+ }
737
+ }
738
+ }
540
739
  });
541
- this._boundListeners = [];
740
+ boundListeners = [];
741
+ }
742
+ const _obs = [shadowMutationObserver, lightMutationObserver, resizeObserver, ...resizeObservers];
743
+ for (const o of _obs) {
744
+ try {
745
+ o?.disconnect?.();
746
+ } catch (e) {
747
+ console.error("[SWC] observer disconnect error:", e);
748
+ }
749
+ }
750
+ shadowMutationObserver = null;
751
+ lightMutationObserver = null;
752
+ resizeObserver = null;
753
+ resizeObservers = [];
754
+ for (const cb of removeObserverCallbacks) {
755
+ try {
756
+ cb.fn(cb.target, cb.opts);
757
+ } catch (e) {
758
+ console.error("[SWC] removeObserver error:", e);
759
+ }
542
760
  }
761
+ removeObserverCallbacks = [];
543
762
  new import_core_web.ElementApply(this, { id: this._swcId }).removeAllEventListener();
544
763
  if (originalDisconnected) originalDisconnected.apply(this);
545
764
  const aMethods = (0, import_lifecycles.findAllLifecycleMetadata)(this, import_lifecycles.ON_AFTER_DISCONNECTED_METADATA_KEY);