@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.
- package/README.md +109 -11
- package/dist/cjs/bundle-entry.js +22 -0
- package/dist/cjs/bundle-entry.js.map +2 -2
- package/dist/cjs/decorators/addEventListener.js +45 -7
- package/dist/cjs/decorators/addEventListener.js.map +2 -2
- package/dist/cjs/decorators/elementDefine.js +225 -6
- package/dist/cjs/decorators/elementDefine.js.map +3 -3
- package/dist/cjs/decorators/index.js +2 -0
- package/dist/cjs/decorators/index.js.map +2 -2
- package/dist/cjs/decorators/mutationObserver.js +104 -0
- package/dist/cjs/decorators/mutationObserver.js.map +7 -0
- package/dist/cjs/decorators/query.js +13 -1
- package/dist/cjs/decorators/query.js.map +2 -2
- package/dist/cjs/decorators/resizeObserver.js +104 -0
- package/dist/cjs/decorators/resizeObserver.js.map +7 -0
- package/dist/cjs/examples/RxJSOperatorsExample.js +285 -0
- package/dist/cjs/examples/RxJSOperatorsExample.js.map +7 -0
- package/dist/esm/bundle-entry.js +8 -0
- package/dist/esm/bundle-entry.js.map +2 -2
- package/dist/esm/decorators/addEventListener.js +45 -7
- package/dist/esm/decorators/addEventListener.js.map +2 -2
- package/dist/esm/decorators/elementDefine.js +225 -6
- package/dist/esm/decorators/elementDefine.js.map +3 -3
- package/dist/esm/decorators/index.js +2 -0
- package/dist/esm/decorators/index.js.map +2 -2
- package/dist/esm/decorators/mutationObserver.js +85 -0
- package/dist/esm/decorators/mutationObserver.js.map +7 -0
- package/dist/esm/decorators/query.js +13 -1
- package/dist/esm/decorators/query.js.map +2 -2
- package/dist/esm/decorators/resizeObserver.js +85 -0
- package/dist/esm/decorators/resizeObserver.js.map +7 -0
- package/dist/esm/examples/RxJSOperatorsExample.js +266 -0
- package/dist/esm/examples/RxJSOperatorsExample.js.map +7 -0
- package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +5869 -157
- package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
- package/dist/types/bundle-entry.d.ts +3 -0
- package/dist/types/bundle-entry.d.ts.map +1 -1
- package/dist/types/decorators/addEventListener.d.ts +24 -5
- package/dist/types/decorators/addEventListener.d.ts.map +1 -1
- package/dist/types/decorators/elementDefine.d.ts +14 -0
- package/dist/types/decorators/elementDefine.d.ts.map +1 -1
- package/dist/types/decorators/index.d.ts +2 -0
- package/dist/types/decorators/index.d.ts.map +1 -1
- package/dist/types/decorators/mutationObserver.d.ts +36 -0
- package/dist/types/decorators/mutationObserver.d.ts.map +1 -0
- package/dist/types/decorators/query.d.ts +12 -0
- package/dist/types/decorators/query.d.ts.map +1 -1
- package/dist/types/decorators/resizeObserver.d.ts +37 -0
- package/dist/types/decorators/resizeObserver.d.ts.map +1 -0
- package/dist/types/examples/RxJSOperatorsExample.d.ts +94 -0
- package/dist/types/examples/RxJSOperatorsExample.d.ts.map +1 -0
- package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +5886 -178
- package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
- package/package.json +7 -8
- package/src/bundle-entry.ts +8 -0
- package/src/decorators/addEventListener.ts +52 -9
- package/src/decorators/elementDefine.ts +330 -47
- package/src/decorators/index.ts +2 -0
- package/src/decorators/mutationObserver.ts +128 -0
- package/src/decorators/query.ts +23 -0
- package/src/decorators/resizeObserver.ts +129 -0
- package/src/examples/RxJSOperatorsExample.ts +279 -0
- package/dist/cjs/elements/tt/SwcAppMixin.js +0 -1
- package/dist/cjs/elements/tt/SwcAppMixin.js.map +0 -7
- package/dist/cjs/elements/tt/SwcAsync.js +0 -1
- package/dist/cjs/elements/tt/SwcAsync.js.map +0 -7
- package/dist/cjs/elements/tt/SwcAsyncTemplate.js +0 -1
- package/dist/cjs/elements/tt/SwcAsyncTemplate.js.map +0 -7
- package/dist/cjs/elements/tt/SwcChoose.js +0 -1
- package/dist/cjs/elements/tt/SwcChoose.js.map +0 -7
- package/dist/cjs/elements/tt/SwcChooseTemplate.js +0 -1
- package/dist/cjs/elements/tt/SwcChooseTemplate.js.map +0 -7
- package/dist/cjs/elements/tt/SwcIf.js +0 -1
- package/dist/cjs/elements/tt/SwcIf.js.map +0 -7
- package/dist/cjs/elements/tt/SwcIfTemplate.js +0 -1
- package/dist/cjs/elements/tt/SwcIfTemplate.js.map +0 -7
- package/dist/cjs/elements/tt/SwcLoop.js +0 -1
- package/dist/cjs/elements/tt/SwcLoop.js.map +0 -7
- package/dist/cjs/elements/tt/SwcLoopTemplate.js +0 -1
- package/dist/cjs/elements/tt/SwcLoopTemplate.js.map +0 -7
- package/dist/cjs/elements/tt/SwcSubTemplates.js +0 -1
- package/dist/cjs/elements/tt/SwcSubTemplates.js.map +0 -7
- package/dist/cjs/elements/tt/register.js +0 -1
- package/dist/cjs/elements/tt/register.js.map +0 -7
- package/dist/esm/elements/tt/SwcAppMixin.js +0 -1
- package/dist/esm/elements/tt/SwcAppMixin.js.map +0 -7
- package/dist/esm/elements/tt/SwcAsync.js +0 -1
- package/dist/esm/elements/tt/SwcAsync.js.map +0 -7
- package/dist/esm/elements/tt/SwcAsyncTemplate.js +0 -1
- package/dist/esm/elements/tt/SwcAsyncTemplate.js.map +0 -7
- package/dist/esm/elements/tt/SwcChoose.js +0 -1
- package/dist/esm/elements/tt/SwcChoose.js.map +0 -7
- package/dist/esm/elements/tt/SwcChooseTemplate.js +0 -1
- package/dist/esm/elements/tt/SwcChooseTemplate.js.map +0 -7
- package/dist/esm/elements/tt/SwcIf.js +0 -1
- package/dist/esm/elements/tt/SwcIf.js.map +0 -7
- package/dist/esm/elements/tt/SwcIfTemplate.js +0 -1
- package/dist/esm/elements/tt/SwcIfTemplate.js.map +0 -7
- package/dist/esm/elements/tt/SwcLoop.js +0 -1
- package/dist/esm/elements/tt/SwcLoop.js.map +0 -7
- package/dist/esm/elements/tt/SwcLoopTemplate.js +0 -1
- package/dist/esm/elements/tt/SwcLoopTemplate.js.map +0 -7
- package/dist/esm/elements/tt/SwcSubTemplates.js +0 -1
- package/dist/esm/elements/tt/SwcSubTemplates.js.map +0 -7
- package/dist/esm/elements/tt/register.js +0 -1
- package/dist/esm/elements/tt/register.js.map +0 -7
- package/dist/types/elements/tt/SwcAppMixin.d.ts +0 -1
- package/dist/types/elements/tt/SwcAppMixin.d.ts.map +0 -1
- package/dist/types/elements/tt/SwcAsync.d.ts +0 -1
- package/dist/types/elements/tt/SwcAsync.d.ts.map +0 -1
- package/dist/types/elements/tt/SwcAsyncTemplate.d.ts +0 -1
- package/dist/types/elements/tt/SwcAsyncTemplate.d.ts.map +0 -1
- package/dist/types/elements/tt/SwcChoose.d.ts +0 -1
- package/dist/types/elements/tt/SwcChoose.d.ts.map +0 -1
- package/dist/types/elements/tt/SwcChooseTemplate.d.ts +0 -1
- package/dist/types/elements/tt/SwcChooseTemplate.d.ts.map +0 -1
- package/dist/types/elements/tt/SwcIf.d.ts +0 -1
- package/dist/types/elements/tt/SwcIf.d.ts.map +0 -1
- package/dist/types/elements/tt/SwcIfTemplate.d.ts +0 -1
- package/dist/types/elements/tt/SwcIfTemplate.d.ts.map +0 -1
- package/dist/types/elements/tt/SwcLoop.d.ts +0 -1
- package/dist/types/elements/tt/SwcLoop.d.ts.map +0 -1
- package/dist/types/elements/tt/SwcLoopTemplate.d.ts +0 -1
- package/dist/types/elements/tt/SwcLoopTemplate.d.ts.map +0 -1
- package/dist/types/elements/tt/SwcSubTemplates.d.ts +0 -1
- package/dist/types/elements/tt/SwcSubTemplates.d.ts.map +0 -1
- package/dist/types/elements/tt/register.d.ts +0 -1
- package/dist/types/elements/tt/register.d.ts.map +0 -1
- package/src/elements/tt/SwcAppMixin.ts +0 -13
- package/src/elements/tt/SwcAsync.ts +0 -139
- package/src/elements/tt/SwcAsyncTemplate.ts +0 -126
- package/src/elements/tt/SwcChoose.ts +0 -182
- package/src/elements/tt/SwcChooseTemplate.ts +0 -229
- package/src/elements/tt/SwcIf.ts +0 -145
- package/src/elements/tt/SwcIfTemplate.ts +0 -158
- package/src/elements/tt/SwcLoop.ts +0 -222
- package/src/elements/tt/SwcLoopTemplate.ts +0 -255
- package/src/elements/tt/SwcSubTemplates.ts +0 -6
- 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
|
|
185
|
-
<div a
|
|
184
|
+
<!-- Attribute binding with a:: prefix -->
|
|
185
|
+
<div a::title="'Count is'+@count@"></div>
|
|
186
186
|
|
|
187
|
-
<!-- Event binding with e
|
|
188
|
-
<button e
|
|
187
|
+
<!-- Event binding with e:: prefix -->
|
|
188
|
+
<button e::click="@increment@()">Increment (@count@)</button>
|
|
189
189
|
|
|
190
190
|
<!-- Conditional rendering -->
|
|
191
|
-
<div a
|
|
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
|
|
210
|
-
- `e
|
|
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
|
|
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
|
|
263
|
+
<p a::title="Email: @user.email@">Age: @user.age@</p>
|
|
264
264
|
|
|
265
265
|
<!-- Conditional rendering based on state -->
|
|
266
|
-
<div a
|
|
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
|
|
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.
|
package/dist/cjs/bundle-entry.js
CHANGED
|
@@ -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": "
|
|
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(
|
|
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
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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>(
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA6B;
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
535
|
-
|
|
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
|
-
|
|
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);
|