@dooboostore/simple-web-component 1.0.19 → 1.0.22

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 (174) hide show
  1. package/README.md +2759 -201
  2. package/dist/cjs/decorators/addEventListener.js +8 -4
  3. package/dist/cjs/decorators/addEventListener.js.map +2 -2
  4. package/dist/cjs/decorators/{appendChild.js → applyNode.js} +26 -18
  5. package/dist/cjs/decorators/applyNode.js.map +7 -0
  6. package/dist/cjs/decorators/attribute.js +162 -0
  7. package/dist/cjs/decorators/attribute.js.map +7 -0
  8. package/dist/cjs/decorators/{changedAttribute.js → changedAttributeHost.js} +11 -11
  9. package/dist/cjs/decorators/changedAttributeHost.js.map +7 -0
  10. package/dist/cjs/decorators/classList.js +15 -5
  11. package/dist/cjs/decorators/classList.js.map +2 -2
  12. package/dist/cjs/decorators/elementDefine.js +124 -46
  13. package/dist/cjs/decorators/elementDefine.js.map +3 -3
  14. package/dist/cjs/decorators/emitCustomEvent.js +8 -7
  15. package/dist/cjs/decorators/emitCustomEvent.js.map +2 -2
  16. package/dist/cjs/decorators/index.js +3 -3
  17. package/dist/cjs/decorators/index.js.map +2 -2
  18. package/dist/cjs/decorators/lifecycles.js +8 -4
  19. package/dist/cjs/decorators/lifecycles.js.map +2 -2
  20. package/dist/cjs/decorators/onConnectedInnerHtml.js +4 -4
  21. package/dist/cjs/decorators/onConnectedInnerHtml.js.map +2 -2
  22. package/dist/cjs/decorators/query.js +9 -5
  23. package/dist/cjs/decorators/query.js.map +2 -2
  24. package/dist/cjs/decorators/queryAll.js +9 -5
  25. package/dist/cjs/decorators/queryAll.js.map +2 -2
  26. package/dist/cjs/decorators/setAttribute.js +51 -21
  27. package/dist/cjs/decorators/setAttribute.js.map +2 -2
  28. package/dist/cjs/decorators/style.js +4 -4
  29. package/dist/cjs/decorators/style.js.map +2 -2
  30. package/dist/cjs/elements/SwcAppEngine.js +8 -8
  31. package/dist/cjs/elements/SwcAppEngine.js.map +3 -3
  32. package/dist/cjs/elements/SwcAppMixin.js +28 -1
  33. package/dist/cjs/elements/SwcAppMixin.js.map +2 -2
  34. package/dist/cjs/elements/SwcAsync.js +6 -6
  35. package/dist/cjs/elements/SwcAsync.js.map +2 -2
  36. package/dist/cjs/elements/SwcChoose.js +6 -6
  37. package/dist/cjs/elements/SwcChoose.js.map +2 -2
  38. package/dist/cjs/elements/SwcIf.js +6 -6
  39. package/dist/cjs/elements/SwcIf.js.map +2 -2
  40. package/dist/cjs/elements/SwcLoop.js +6 -6
  41. package/dist/cjs/elements/SwcLoop.js.map +2 -2
  42. package/dist/cjs/elements/register.js +19 -18
  43. package/dist/cjs/elements/register.js.map +2 -2
  44. package/dist/cjs/index.js +6 -17
  45. package/dist/cjs/index.js.map +2 -2
  46. package/dist/cjs/router/ElementRouter.js +7 -7
  47. package/dist/cjs/router/ElementRouter.js.map +2 -2
  48. package/dist/cjs/types.js.map +2 -2
  49. package/dist/esm/decorators/addEventListener.js +5 -1
  50. package/dist/esm/decorators/addEventListener.js.map +2 -2
  51. package/dist/esm/decorators/{appendChild.js → applyNode.js} +23 -15
  52. package/dist/esm/decorators/applyNode.js.map +7 -0
  53. package/dist/esm/decorators/attribute.js +143 -0
  54. package/dist/esm/decorators/attribute.js.map +7 -0
  55. package/dist/esm/decorators/{changedAttribute.js → changedAttributeHost.js} +4 -4
  56. package/dist/esm/decorators/changedAttributeHost.js.map +7 -0
  57. package/dist/esm/decorators/classList.js +12 -2
  58. package/dist/esm/decorators/classList.js.map +2 -2
  59. package/dist/esm/decorators/elementDefine.js +119 -41
  60. package/dist/esm/decorators/elementDefine.js.map +2 -2
  61. package/dist/esm/decorators/emitCustomEvent.js +5 -4
  62. package/dist/esm/decorators/emitCustomEvent.js.map +2 -2
  63. package/dist/esm/decorators/index.js +3 -3
  64. package/dist/esm/decorators/index.js.map +1 -1
  65. package/dist/esm/decorators/lifecycles.js +5 -1
  66. package/dist/esm/decorators/lifecycles.js.map +2 -2
  67. package/dist/esm/decorators/onConnectedInnerHtml.js +1 -1
  68. package/dist/esm/decorators/onConnectedInnerHtml.js.map +1 -1
  69. package/dist/esm/decorators/query.js +6 -2
  70. package/dist/esm/decorators/query.js.map +2 -2
  71. package/dist/esm/decorators/queryAll.js +6 -2
  72. package/dist/esm/decorators/queryAll.js.map +2 -2
  73. package/dist/esm/decorators/setAttribute.js +47 -17
  74. package/dist/esm/decorators/setAttribute.js.map +2 -2
  75. package/dist/esm/decorators/style.js +1 -1
  76. package/dist/esm/decorators/style.js.map +1 -1
  77. package/dist/esm/elements/SwcAppEngine.js +4 -4
  78. package/dist/esm/elements/SwcAppEngine.js.map +2 -2
  79. package/dist/esm/elements/SwcAppMixin.js +28 -1
  80. package/dist/esm/elements/SwcAppMixin.js.map +2 -2
  81. package/dist/esm/elements/SwcAsync.js +3 -3
  82. package/dist/esm/elements/SwcAsync.js.map +2 -2
  83. package/dist/esm/elements/SwcChoose.js +3 -3
  84. package/dist/esm/elements/SwcChoose.js.map +2 -2
  85. package/dist/esm/elements/SwcIf.js +3 -3
  86. package/dist/esm/elements/SwcIf.js.map +2 -2
  87. package/dist/esm/elements/SwcLoop.js +3 -3
  88. package/dist/esm/elements/SwcLoop.js.map +2 -2
  89. package/dist/esm/elements/register.js +7 -6
  90. package/dist/esm/elements/register.js.map +2 -2
  91. package/dist/esm/index.js +6 -17
  92. package/dist/esm/index.js.map +2 -2
  93. package/dist/esm/router/ElementRouter.js +2 -2
  94. package/dist/esm/router/ElementRouter.js.map +1 -1
  95. package/dist/esm/types.js.map +2 -2
  96. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +5444 -3317
  97. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  98. package/dist/types/decorators/addEventListener.d.ts +6 -0
  99. package/dist/types/decorators/addEventListener.d.ts.map +1 -1
  100. package/dist/types/decorators/applyNode.d.ts +38 -0
  101. package/dist/types/decorators/applyNode.d.ts.map +1 -0
  102. package/dist/types/decorators/attribute.d.ts +29 -0
  103. package/dist/types/decorators/attribute.d.ts.map +1 -0
  104. package/dist/types/decorators/{changedAttribute.d.ts → changedAttributeHost.d.ts} +6 -2
  105. package/dist/types/decorators/changedAttributeHost.d.ts.map +1 -0
  106. package/dist/types/decorators/classList.d.ts +25 -0
  107. package/dist/types/decorators/classList.d.ts.map +1 -1
  108. package/dist/types/decorators/elementDefine.d.ts.map +1 -1
  109. package/dist/types/decorators/emitCustomEvent.d.ts +14 -2
  110. package/dist/types/decorators/emitCustomEvent.d.ts.map +1 -1
  111. package/dist/types/decorators/index.d.ts +3 -3
  112. package/dist/types/decorators/index.d.ts.map +1 -1
  113. package/dist/types/decorators/lifecycles.d.ts +2 -0
  114. package/dist/types/decorators/lifecycles.d.ts.map +1 -1
  115. package/dist/types/decorators/query.d.ts +6 -0
  116. package/dist/types/decorators/query.d.ts.map +1 -1
  117. package/dist/types/decorators/queryAll.d.ts +6 -0
  118. package/dist/types/decorators/queryAll.d.ts.map +1 -1
  119. package/dist/types/decorators/setAttribute.d.ts +8 -0
  120. package/dist/types/decorators/setAttribute.d.ts.map +1 -1
  121. package/dist/types/elements/SwcAppEngine.d.ts +5 -4
  122. package/dist/types/elements/SwcAppEngine.d.ts.map +1 -1
  123. package/dist/types/elements/SwcAppMixin.d.ts +1 -1
  124. package/dist/types/elements/SwcAppMixin.d.ts.map +1 -1
  125. package/dist/types/elements/register.d.ts +1 -1
  126. package/dist/types/elements/register.d.ts.map +1 -1
  127. package/dist/types/index.d.ts +3 -14
  128. package/dist/types/index.d.ts.map +1 -1
  129. package/dist/types/router/ElementRouter.d.ts +1 -1
  130. package/dist/types/router/ElementRouter.d.ts.map +1 -1
  131. package/dist/types/types.d.ts +3 -1
  132. package/dist/types/types.d.ts.map +1 -1
  133. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +5444 -3317
  134. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  135. package/package.json +10 -5
  136. package/src/decorators/addEventListener.ts +10 -1
  137. package/src/decorators/applyNode.ts +127 -0
  138. package/src/decorators/attribute.ts +192 -0
  139. package/src/decorators/{changedAttribute.ts → changedAttributeHost.ts} +6 -2
  140. package/src/decorators/classList.ts +33 -1
  141. package/src/decorators/elementDefine.ts +148 -47
  142. package/src/decorators/emitCustomEvent.ts +14 -6
  143. package/src/decorators/index.ts +3 -3
  144. package/src/decorators/lifecycles.ts +4 -2
  145. package/src/decorators/onConnectedInnerHtml.ts +1 -1
  146. package/src/decorators/query.ts +10 -1
  147. package/src/decorators/queryAll.ts +10 -1
  148. package/src/decorators/setAttribute.ts +57 -17
  149. package/src/decorators/style.ts +1 -1
  150. package/src/elements/SwcAppEngine.ts +10 -8
  151. package/src/elements/SwcAppMixin.ts +34 -2
  152. package/src/elements/SwcAsync.ts +3 -3
  153. package/src/elements/SwcChoose.ts +3 -3
  154. package/src/elements/SwcIf.ts +3 -3
  155. package/src/elements/SwcLoop.ts +3 -3
  156. package/src/elements/register.ts +8 -6
  157. package/src/index.ts +8 -16
  158. package/src/router/ElementRouter.ts +2 -2
  159. package/src/types.ts +3 -1
  160. package/dist/cjs/decorators/appendChild.js.map +0 -7
  161. package/dist/cjs/decorators/changedAttribute.js.map +0 -7
  162. package/dist/cjs/decorators/replaceChildren.js +0 -79
  163. package/dist/cjs/decorators/replaceChildren.js.map +0 -7
  164. package/dist/esm/decorators/appendChild.js.map +0 -7
  165. package/dist/esm/decorators/changedAttribute.js.map +0 -7
  166. package/dist/esm/decorators/replaceChildren.js +0 -60
  167. package/dist/esm/decorators/replaceChildren.js.map +0 -7
  168. package/dist/types/decorators/appendChild.d.ts +0 -17
  169. package/dist/types/decorators/appendChild.d.ts.map +0 -1
  170. package/dist/types/decorators/changedAttribute.d.ts.map +0 -1
  171. package/dist/types/decorators/replaceChildren.d.ts +0 -9
  172. package/dist/types/decorators/replaceChildren.d.ts.map +0 -1
  173. package/src/decorators/appendChild.ts +0 -86
  174. package/src/decorators/replaceChildren.ts +0 -64
@@ -0,0 +1,143 @@
1
+ import { ReflectUtils } from "@dooboostore/core";
2
+ import { getElementConfig } from "./elementDefine.js";
3
+ import { SwcUtils } from "../utils/Utils.js";
4
+ const ATTRIBUTE_METADATA_KEY = Symbol("simple-web-component:attribute");
5
+ const convertValue = (val, type) => {
6
+ if (val === null || val === void 0) return val;
7
+ if (type === Number) return Number(val);
8
+ if (type === Boolean) return val === "false" || val === "0" ? false : true;
9
+ return val;
10
+ };
11
+ const resolveTargetEls = (inst, selector, options, currentWin) => {
12
+ const r = options.root || "auto";
13
+ const results = [];
14
+ const applyRoot = (target) => {
15
+ if (!target) return;
16
+ if (r === "auto") {
17
+ results.push(target);
18
+ } else {
19
+ if (r === "light" || r === "all") results.push(target);
20
+ if ((r === "shadow" || r === "all") && target.shadowRoot) results.push(target.shadowRoot);
21
+ }
22
+ };
23
+ if (selector === ":host" || !selector) {
24
+ applyRoot(inst);
25
+ } else if (selector === ":window") {
26
+ results.push(currentWin);
27
+ } else if (selector === ":document") {
28
+ results.push(currentWin.document);
29
+ } else {
30
+ const hostSet = SwcUtils.getHostSet(inst);
31
+ if (selector === ":parentHost") applyRoot(hostSet.$parentHost);
32
+ else if (selector === ":appHost") applyRoot(hostSet.$appHost);
33
+ else if (selector === ":firstHost") applyRoot(hostSet.$firstHost);
34
+ else if (selector === ":lastHost") applyRoot(hostSet.$lastHost);
35
+ else if (selector === ":firstAppHost") applyRoot(hostSet.$firstAppHost);
36
+ else if (selector === ":lastAppHost") applyRoot(hostSet.$lastAppHost);
37
+ else {
38
+ if (r === "shadow") {
39
+ const found = inst.shadowRoot?.querySelectorAll(selector);
40
+ if (found) results.push(...found);
41
+ } else if (r === "light") {
42
+ const found = inst.querySelectorAll(selector);
43
+ if (found) results.push(...found);
44
+ } else if (r === "all") {
45
+ const sMatch = inst.shadowRoot?.querySelectorAll(selector);
46
+ const lMatch = inst.querySelectorAll(selector);
47
+ if (sMatch) results.push(...sMatch);
48
+ if (lMatch) results.push(...lMatch);
49
+ } else {
50
+ const found = (inst.shadowRoot || inst).querySelectorAll(selector);
51
+ if (found) results.push(...found);
52
+ }
53
+ }
54
+ }
55
+ return results;
56
+ };
57
+ function attribute(selector, options = {}) {
58
+ return (target, propertyKey) => {
59
+ const constructor = target.constructor;
60
+ const privateKey = Symbol(String(propertyKey));
61
+ const designType = Reflect.getMetadata("design:type", target, propertyKey);
62
+ let metaList = ReflectUtils.getOwnMetadata(ATTRIBUTE_METADATA_KEY, constructor);
63
+ if (!metaList) {
64
+ metaList = [];
65
+ ReflectUtils.defineMetadata(ATTRIBUTE_METADATA_KEY, metaList, constructor);
66
+ }
67
+ metaList.push({ propertyKey, selector, options, privateKey });
68
+ const applySetAttribute = (inst, targets, attrName, nv) => {
69
+ targets.forEach((it) => {
70
+ console.log("----->", it);
71
+ if (it && typeof it.setAttribute === "function") {
72
+ if (nv === null) {
73
+ it.removeAttribute(attrName);
74
+ } else {
75
+ it.setAttribute(attrName, String(nv));
76
+ }
77
+ } else {
78
+ inst[privateKey] = nv;
79
+ }
80
+ });
81
+ };
82
+ Object.defineProperty(target, propertyKey, {
83
+ get() {
84
+ const attrName = options.name || String(propertyKey);
85
+ const conf = getElementConfig(this);
86
+ const currentWin = this._resolveWindow?.(conf) || (typeof window !== "undefined" ? window : void 0);
87
+ const targetType = options.type || designType;
88
+ console.log("type-->", propertyKey, targetType);
89
+ if (this.__swc_syncing_init || options.connectedInitialize && !this.__swc_connected) {
90
+ return convertValue(this[privateKey], targetType);
91
+ }
92
+ const targets = resolveTargetEls(this, selector, options, currentWin);
93
+ const primaryTarget = targets[0];
94
+ if (primaryTarget && typeof primaryTarget.hasAttribute === "function") {
95
+ if (primaryTarget.hasAttribute(attrName)) {
96
+ const domVal = primaryTarget.getAttribute(attrName);
97
+ return convertValue(domVal, targetType);
98
+ }
99
+ return null;
100
+ }
101
+ return convertValue(this[privateKey], targetType);
102
+ },
103
+ set(nv) {
104
+ const targetType = options.type || designType;
105
+ console.log("---set", propertyKey, targetType, nv, this, this.__swc_syncing_init);
106
+ const attrName = options.name || String(propertyKey);
107
+ const conf = getElementConfig(this);
108
+ const currentWin = this._resolveWindow?.(conf) || (typeof window !== "undefined" ? window : void 0);
109
+ if (this.__swc_syncing_init) {
110
+ if (options.connectedInitialize === true) {
111
+ const targets2 = resolveTargetEls(this, selector, options, currentWin);
112
+ applySetAttribute(this, targets2, attrName, nv);
113
+ } else {
114
+ this[privateKey] = nv;
115
+ }
116
+ return;
117
+ }
118
+ if (!this.__swc_connected) {
119
+ this[privateKey] = nv;
120
+ return;
121
+ }
122
+ const targets = resolveTargetEls(this, selector, options, currentWin);
123
+ applySetAttribute(this, targets, attrName, nv);
124
+ },
125
+ enumerable: true,
126
+ configurable: true
127
+ });
128
+ };
129
+ }
130
+ const findAllAttributeMetadata = (target) => {
131
+ return ReflectUtils.findAllMetadata(ATTRIBUTE_METADATA_KEY, target).flat();
132
+ };
133
+ function attributeHost(attrName, options = {}) {
134
+ return attribute(":host", { ...options, name: attrName });
135
+ }
136
+ export {
137
+ ATTRIBUTE_METADATA_KEY,
138
+ attribute,
139
+ attributeHost,
140
+ findAllAttributeMetadata,
141
+ resolveTargetEls
142
+ };
143
+ //# sourceMappingURL=attribute.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/decorators/attribute.ts"],
4
+ "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core';\nimport { ensureInit, getElementConfig } from './elementDefine';\nimport { SwcUtils } from '../utils/Utils';\nimport { SpecialSelector, SwcQueryOptions } from '../types';\n\nexport interface AttributeOptions extends SwcQueryOptions {\n name?: string;\n connectedInitialize?: boolean;\n type?: typeof Number | typeof Boolean | typeof String;\n}\n\nexport interface AttributeMetadata {\n propertyKey: string | symbol;\n selector: string;\n options: AttributeOptions;\n privateKey: symbol; // Added to bypass getter during initialization\n}\n\nexport const ATTRIBUTE_METADATA_KEY = Symbol('simple-web-component:attribute');\n\n/**\n * Helper to perform type conversion from string to target type\n */\nconst convertValue = (val: string | null, type: any): any => {\n if (val === null || val === undefined) return val;\n if (type === Number) return Number(val);\n if (type === Boolean) return val === 'false' || val === '0' ? false : true;\n return val;\n};\n\n/**\n * Helper to resolve target elements based on selector and root options\n */\nexport const resolveTargetEls = (inst: any, selector: string, options: AttributeOptions, currentWin: any): HTMLElement[] => {\n const r = options.root || 'auto';\n const results: HTMLElement[] = [];\n\n const applyRoot = (target: any) => {\n if (!target) return;\n if (r === 'auto') {\n // Attributes belong to the ELEMENT, not the ShadowRoot.\n // So for :host and direct attribute sync, we mostly want the element itself.\n results.push(target);\n } else {\n if (r === 'light' || r === 'all') results.push(target);\n if ((r === 'shadow' || r === 'all') && target.shadowRoot) results.push(target.shadowRoot);\n }\n };\n\n if (selector === ':host' || !selector) {\n applyRoot(inst);\n } else if (selector === ':window') {\n results.push(currentWin);\n } else if (selector === ':document') {\n results.push(currentWin.document);\n } else {\n const hostSet = SwcUtils.getHostSet(inst);\n if (selector === ':parentHost') applyRoot(hostSet.$parentHost);\n else if (selector === ':appHost') applyRoot(hostSet.$appHost as any);\n else if (selector === ':firstHost') applyRoot(hostSet.$firstHost);\n else if (selector === ':lastHost') applyRoot(hostSet.$lastHost);\n else if (selector === ':firstAppHost') applyRoot(hostSet.$firstAppHost as any);\n else if (selector === ':lastAppHost') applyRoot(hostSet.$lastAppHost as any);\n else {\n if (r === 'shadow') {\n const found = inst.shadowRoot?.querySelectorAll(selector);\n if (found) results.push(...found);\n } else if (r === 'light') {\n const found = inst.querySelectorAll(selector);\n if (found) results.push(...found);\n } else if (r === 'all') {\n const sMatch = inst.shadowRoot?.querySelectorAll(selector);\n const lMatch = inst.querySelectorAll(selector);\n if (sMatch) results.push(...sMatch);\n if (lMatch) results.push(...lMatch);\n } else {\n const found = (inst.shadowRoot || inst).querySelectorAll(selector);\n if (found) results.push(...found);\n }\n }\n }\n return results;\n};\n\n/**\n * @attribute decorator to sync a field value with an element's attribute.\n */\nexport function attribute(selector: string, options: AttributeOptions = {}): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n const constructor = target.constructor;\n const privateKey = Symbol(String(propertyKey));\n\n const designType = (Reflect as any).getMetadata('design:type', target, propertyKey);\n\n let metaList = ReflectUtils.getOwnMetadata(ATTRIBUTE_METADATA_KEY, constructor) as AttributeMetadata[];\n if (!metaList) {\n metaList = [];\n ReflectUtils.defineMetadata(ATTRIBUTE_METADATA_KEY, metaList, constructor);\n }\n metaList.push({ propertyKey, selector, options, privateKey });\n\n // Helper function to apply setAttribute to targets\n const applySetAttribute = (inst: any, targets: HTMLElement[], attrName: string, nv: any) => {\n targets.forEach(it => {\n console.log('----->', it)\n if (it && typeof (it as any).setAttribute === 'function') {\n if (nv === null) {\n (it as any).removeAttribute(attrName);\n } else {\n (it as any).setAttribute(attrName, String(nv));\n }\n } else {\n inst[privateKey] = nv;\n }\n });\n };\n\n Object.defineProperty(target, propertyKey, {\n get(this: any) {\n const attrName = options.name || String(propertyKey);\n const conf = getElementConfig(this);\n const currentWin = this._resolveWindow?.(conf) || ((typeof window !== 'undefined' ? window : undefined) as any);\n const targetType = options.type || designType;\n\n console.log('type-->', propertyKey, targetType);\n // During early init phase, if syncing memory to DOM, return memory.\n if (this.__swc_syncing_init || (options.connectedInitialize && !this.__swc_connected)) {\n return convertValue(this[privateKey], targetType);\n }\n\n const targets = resolveTargetEls(this, selector, options, currentWin);\n const primaryTarget = targets[0];\n\n if (primaryTarget && typeof (primaryTarget as any).hasAttribute === 'function') {\n if ((primaryTarget as any).hasAttribute(attrName)) {\n const domVal = (primaryTarget as any).getAttribute(attrName);\n return convertValue(domVal, targetType);\n }\n return null;\n }\n\n return convertValue(this[privateKey], targetType);\n },\n set(this: any, nv: any) {\n const targetType = options.type || designType;\n console.log('---set', propertyKey, targetType, nv, this, this.__swc_syncing_init);\n\n const attrName = options.name || String(propertyKey);\n const conf = getElementConfig(this);\n const currentWin = this._resolveWindow?.(conf) || ((typeof window !== 'undefined' ? window : undefined) as any);\n\n // During initialization/syncing phase\n if (this.__swc_syncing_init) {\n // If connectedInitialize is enabled, force setAttribute (JS -> DOM)\n if (options.connectedInitialize === true) {\n const targets = resolveTargetEls(this, selector, options, currentWin);\n applySetAttribute(this, targets, attrName, nv);\n } else {\n // Otherwise just update memory\n this[privateKey] = nv;\n }\n return;\n }\n\n // Before connected, save to memory only\n if (!this.__swc_connected) {\n this[privateKey] = nv;\n return;\n }\n\n // After connected, normal setAttribute\n const targets = resolveTargetEls(this, selector, options, currentWin);\n applySetAttribute(this, targets, attrName, nv);\n },\n enumerable: true,\n configurable: true\n });\n };\n}\n\nexport const findAllAttributeMetadata = (target: any): AttributeMetadata[] => {\n return ReflectUtils.findAllMetadata<AttributeMetadata[]>(ATTRIBUTE_METADATA_KEY, target).flat();\n};\n\n/**\n * @hostAttribute decorator - simplified version of @attribute for :host selector\n * Usage: @hostAttribute('data-product-id')\n * Usage: @hostAttribute('disabled', { type: Boolean })\n */\nexport function attributeHost(attrName: string, options: AttributeOptions = {}): PropertyDecorator {\n return attribute(':host', { ...options, name: attrName });\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["targets"]
7
+ }
@@ -1,6 +1,6 @@
1
- import { ReflectUtils } from "@dooboostore/core/reflect/ReflectUtils";
1
+ import { ReflectUtils } from "@dooboostore/core";
2
2
  const ON_ATTRIBUTE_CHANGED_METADATA_KEY = Symbol("simple-web-component:on-attribute-changed");
3
- function changedAttribute(attributeName) {
3
+ function changedAttributeHost(attributeName) {
4
4
  return (target, propertyKey) => {
5
5
  const constructor = target.constructor;
6
6
  let meta = ReflectUtils.getOwnMetadata(ON_ATTRIBUTE_CHANGED_METADATA_KEY, constructor);
@@ -26,8 +26,8 @@ const findAllAttributeChangedMetadata = (target) => {
26
26
  };
27
27
  export {
28
28
  ON_ATTRIBUTE_CHANGED_METADATA_KEY,
29
- changedAttribute,
29
+ changedAttributeHost,
30
30
  findAllAttributeChangedMetadata,
31
31
  getChangedAttributeMetadata
32
32
  };
33
- //# sourceMappingURL=changedAttribute.js.map
33
+ //# sourceMappingURL=changedAttributeHost.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/decorators/changedAttributeHost.ts"],
4
+ "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core';\n\nexport const ON_ATTRIBUTE_CHANGED_METADATA_KEY = Symbol('simple-web-component:on-attribute-changed');\n\n/**\n * @changedAttributeHost decorator - fires when any attribute on :host changes\n * Usage: @changedAttributeHost('data-product-id')\n */\nexport function changedAttributeHost(attributeName?: string): MethodDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n const constructor = target.constructor;\n let meta = ReflectUtils.getOwnMetadata(ON_ATTRIBUTE_CHANGED_METADATA_KEY, constructor) as Map<string, (string | symbol)[]>;\n if (!meta) {\n meta = new Map<string, (string | symbol)[]>();\n ReflectUtils.defineMetadata(ON_ATTRIBUTE_CHANGED_METADATA_KEY, meta, constructor);\n }\n\n const name = attributeName || String(propertyKey);\n let methods = meta.get(name);\n if (!methods) {\n methods = [];\n meta.set(name, methods);\n }\n if (!methods.includes(propertyKey)) methods.push(propertyKey);\n };\n}\n\nexport const getChangedAttributeMetadata = (target: any): Map<string, (string | symbol)[]> | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ON_ATTRIBUTE_CHANGED_METADATA_KEY, constructor);\n};\n\nexport const findAllAttributeChangedMetadata = (target: any): Map<string, (string | symbol)[]> => {\n return ReflectUtils.findAllMapMetadata<string, string | symbol>(ON_ATTRIBUTE_CHANGED_METADATA_KEY, target);\n};\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAEtB,MAAM,oCAAoC,OAAO,2CAA2C;AAM5F,SAAS,qBAAqB,eAAyC;AAC5E,SAAO,CAAC,QAAgB,gBAAiC;AACvD,UAAM,cAAc,OAAO;AAC3B,QAAI,OAAO,aAAa,eAAe,mCAAmC,WAAW;AACrF,QAAI,CAAC,MAAM;AACT,aAAO,oBAAI,IAAiC;AAC5C,mBAAa,eAAe,mCAAmC,MAAM,WAAW;AAAA,IAClF;AAEA,UAAM,OAAO,iBAAiB,OAAO,WAAW;AAChD,QAAI,UAAU,KAAK,IAAI,IAAI;AAC3B,QAAI,CAAC,SAAS;AACZ,gBAAU,CAAC;AACX,WAAK,IAAI,MAAM,OAAO;AAAA,IACxB;AACA,QAAI,CAAC,QAAQ,SAAS,WAAW,EAAG,SAAQ,KAAK,WAAW;AAAA,EAC9D;AACF;AAEO,MAAM,8BAA8B,CAAC,WAA8D;AACxG,QAAM,cAAc,kBAAkB,WAAW,SAAS,OAAO;AACjE,SAAO,aAAa,YAAY,mCAAmC,WAAW;AAChF;AAEO,MAAM,kCAAkC,CAAC,WAAkD;AAChG,SAAO,aAAa,mBAA4C,mCAAmC,MAAM;AAC3G;",
6
+ "names": []
7
+ }
@@ -1,4 +1,4 @@
1
- import { ReflectUtils } from "@dooboostore/core/reflect/ReflectUtils";
1
+ import { ReflectUtils } from "@dooboostore/core";
2
2
  import { ensureInit } from "./elementDefine.js";
3
3
  import { SwcUtils } from "../utils/Utils.js";
4
4
  const CLASS_LIST_METADATA_KEY = Symbol("simple-web-component:class-list");
@@ -63,6 +63,11 @@ const updateClassList = createClassListDecorator("update");
63
63
  const addClassList = createClassListDecorator("add");
64
64
  const removeClassList = createClassListDecorator("remove");
65
65
  const toggleClassList = createClassListDecorator("toggle");
66
+ const setClassListHost = createClassListDecorator("set").bind(null, ":host");
67
+ const updateClassListHost = createClassListDecorator("update").bind(null, ":host");
68
+ const addClassListHost = createClassListDecorator("add").bind(null, ":host");
69
+ const removeClassListHost = createClassListDecorator("remove").bind(null, ":host");
70
+ const toggleClassListHost = createClassListDecorator("toggle").bind(null, ":host");
66
71
  const findAllClassListMetadata = (target) => {
67
72
  const result = /* @__PURE__ */ new Map();
68
73
  const maps = ReflectUtils.findAllMetadata(CLASS_LIST_METADATA_KEY, target);
@@ -76,10 +81,15 @@ const findAllClassListMetadata = (target) => {
76
81
  export {
77
82
  CLASS_LIST_METADATA_KEY,
78
83
  addClassList,
84
+ addClassListHost,
79
85
  findAllClassListMetadata,
80
86
  removeClassList,
87
+ removeClassListHost,
81
88
  setClassList,
89
+ setClassListHost,
82
90
  toggleClassList,
83
- updateClassList
91
+ toggleClassListHost,
92
+ updateClassList,
93
+ updateClassListHost
84
94
  };
85
95
  //# sourceMappingURL=classList.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/decorators/classList.ts"],
4
- "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\nimport { ensureInit } from './elementDefine';\nimport { SwcUtils } from '../utils/Utils';\n\nexport const CLASS_LIST_METADATA_KEY = Symbol('simple-web-component:class-list');\n\nexport type ClassListAction = 'set' | 'update' | 'add' | 'remove' | 'toggle';\n\nexport interface ClassListMetadata {\n propertyKey: string | symbol;\n selector: string;\n action: ClassListAction;\n}\n\nfunction createClassListDecorator(action: ClassListAction) {\n return (selector: string): MethodDecorator => {\n return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n let metaList = ReflectUtils.getOwnMetadata(CLASS_LIST_METADATA_KEY, constructor) as Map<string | symbol, ClassListMetadata>;\n if (!metaList) {\n metaList = new Map<string | symbol, ClassListMetadata>();\n ReflectUtils.defineMetadata(CLASS_LIST_METADATA_KEY, metaList, constructor);\n }\n metaList.set(propertyKey, { propertyKey, selector, action });\n\n const original = descriptor.value;\n descriptor.value = async function (...args: any[]) {\n ensureInit(this);\n const res = await original.apply(this, args);\n if (res !== undefined) {\n const hostSet = SwcUtils.getHostSet(this as any);\n\n let targetEl: HTMLElement | null = null;\n if (selector === ':host' || !selector) targetEl = this as any;\n else if (selector === ':parentHost') targetEl = hostSet.$parentHost;\n else if (selector === ':appHost') targetEl = hostSet.$appHost;\n else targetEl = (this.shadowRoot || (this as any)).querySelector(selector);\n\n if (targetEl) {\n if (action === 'set') {\n let classes = '';\n if (typeof res === 'object' && res !== null && !Array.isArray(res)) {\n classes = Object.entries(res)\n .filter(([_, force]) => !!force)\n .map(([cls]) => cls)\n .join(' ');\n } else {\n classes = Array.isArray(res) ? res.join(' ') : String(res);\n }\n targetEl.className = classes;\n } else if (action === 'update') {\n if (typeof res === 'object' && res !== null && !Array.isArray(res)) {\n Object.entries(res).forEach(([cls, force]) => {\n targetEl!.classList.toggle(cls, !!force);\n });\n } else if (res !== undefined && res !== null) {\n const classes = Array.isArray(res) ? res.map(String) : [String(res)];\n targetEl.classList.add(...classes);\n }\n } else if (action === 'add') {\n const classes = Array.isArray(res) ? res.map(String) : [String(res)];\n targetEl.classList.add(...classes);\n } else if (action === 'remove') {\n const classes = Array.isArray(res) ? res.map(String) : [String(res)];\n targetEl.classList.remove(...classes);\n } else if (action === 'toggle') {\n const classes = Array.isArray(res) ? res.map(String) : [String(res)];\n classes.forEach(c => targetEl!.classList.toggle(c));\n }\n }\n }\n return res;\n };\n };\n };\n}\n\n/**\n * @setClassList decorator to surgically replace all classes on a target element.\n * Returns: string | string[]\n */\nexport const setClassList = createClassListDecorator('set');\n\n/**\n * @updateClassList decorator to surgically update specific classes.\n * Returns: Record<string, boolean> (toggle with force) | string | string[] (add)\n */\nexport const updateClassList = createClassListDecorator('update');\n\n/**\n * @addClassList decorator to surgically add classes to a target element.\n * Returns: string | string[]\n */\nexport const addClassList = createClassListDecorator('add');\n\n/**\n * @removeClassList decorator to surgically remove classes from a target element.\n * Returns: string | string[]\n */\nexport const removeClassList = createClassListDecorator('remove');\n\n/**\n * @toggleClassList decorator to surgically toggle classes on a target element.\n * Returns: string | string[]\n */\nexport const toggleClassList = createClassListDecorator('toggle');\n\nexport const findAllClassListMetadata = (target: any): Map<string | symbol, ClassListMetadata> => {\n const result = new Map<string | symbol, ClassListMetadata>();\n const maps = ReflectUtils.findAllMetadata<Map<string | symbol, ClassListMetadata>>(CLASS_LIST_METADATA_KEY, target);\n maps.forEach(map => {\n if (map instanceof Map) {\n map.forEach((v, k) => result.set(k, v));\n }\n });\n return result;\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core';\nimport { ensureInit } from './elementDefine';\nimport { SwcUtils } from '../utils/Utils';\n\nexport const CLASS_LIST_METADATA_KEY = Symbol('simple-web-component:class-list');\n\nexport type ClassListAction = 'set' | 'update' | 'add' | 'remove' | 'toggle';\n\nexport interface ClassListMetadata {\n propertyKey: string | symbol;\n selector: string;\n action: ClassListAction;\n}\n\nfunction createClassListDecorator(action: ClassListAction) {\n return (selector: string): MethodDecorator => {\n return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n let metaList = ReflectUtils.getOwnMetadata(CLASS_LIST_METADATA_KEY, constructor) as Map<string | symbol, ClassListMetadata>;\n if (!metaList) {\n metaList = new Map<string | symbol, ClassListMetadata>();\n ReflectUtils.defineMetadata(CLASS_LIST_METADATA_KEY, metaList, constructor);\n }\n metaList.set(propertyKey, { propertyKey, selector, action });\n\n const original = descriptor.value;\n descriptor.value = async function (...args: any[]) {\n ensureInit(this);\n const res = await original.apply(this, args);\n if (res !== undefined) {\n const hostSet = SwcUtils.getHostSet(this as any);\n\n let targetEl: HTMLElement | null = null;\n if (selector === ':host' || !selector) targetEl = this as any;\n else if (selector === ':parentHost') targetEl = hostSet.$parentHost;\n else if (selector === ':appHost') targetEl = hostSet.$appHost;\n else targetEl = (this.shadowRoot || (this as any)).querySelector(selector);\n\n if (targetEl) {\n if (action === 'set') {\n let classes = '';\n if (typeof res === 'object' && res !== null && !Array.isArray(res)) {\n classes = Object.entries(res)\n .filter(([_, force]) => !!force)\n .map(([cls]) => cls)\n .join(' ');\n } else {\n classes = Array.isArray(res) ? res.join(' ') : String(res);\n }\n targetEl.className = classes;\n } else if (action === 'update') {\n if (typeof res === 'object' && res !== null && !Array.isArray(res)) {\n Object.entries(res).forEach(([cls, force]) => {\n targetEl!.classList.toggle(cls, !!force);\n });\n } else if (res !== undefined && res !== null) {\n const classes = Array.isArray(res) ? res.map(String) : [String(res)];\n targetEl.classList.add(...classes);\n }\n } else if (action === 'add') {\n const classes = Array.isArray(res) ? res.map(String) : [String(res)];\n targetEl.classList.add(...classes);\n } else if (action === 'remove') {\n const classes = Array.isArray(res) ? res.map(String) : [String(res)];\n targetEl.classList.remove(...classes);\n } else if (action === 'toggle') {\n const classes = Array.isArray(res) ? res.map(String) : [String(res)];\n classes.forEach(c => targetEl!.classList.toggle(c));\n }\n }\n }\n return res;\n };\n };\n };\n}\n\n/**\n * @setClassList decorator to surgically replace all classes on a target element.\n * Returns: string | string[]\n */\nexport const setClassList = createClassListDecorator('set');\n\n/**\n * @updateClassList decorator to surgically update specific classes.\n * Returns: Record<string, boolean> (toggle with force) | string | string[] (add)\n */\nexport const updateClassList = createClassListDecorator('update');\n\n/**\n * @addClassList decorator to surgically add classes to a target element.\n * Returns: string | string[]\n */\nexport const addClassList = createClassListDecorator('add');\n\n/**\n * @removeClassList decorator to surgically remove classes from a target element.\n * Returns: string | string[]\n */\nexport const removeClassList = createClassListDecorator('remove');\n\n/**\n * @toggleClassList decorator to surgically toggle classes on a target element.\n * Returns: string | string[]\n */\nexport const toggleClassList = createClassListDecorator('toggle');\n\n// Host-specific versions (for :host selector)\n\n/**\n * @setClassListHost decorator to set classes on :host element.\n * Returns: string | string[]\n */\nexport const setClassListHost = createClassListDecorator('set').bind(null, ':host');\n\n/**\n * @updateClassListHost decorator to update specific classes on :host.\n * Returns: Record<string, boolean> (toggle with force) | string | string[] (add)\n */\nexport const updateClassListHost = createClassListDecorator('update').bind(null, ':host');\n\n/**\n * @addClassListHost decorator to add classes to :host element.\n * Returns: string | string[]\n */\nexport const addClassListHost = createClassListDecorator('add').bind(null, ':host');\n\n/**\n * @removeClassListHost decorator to remove classes from :host element.\n * Returns: string | string[]\n */\nexport const removeClassListHost = createClassListDecorator('remove').bind(null, ':host');\n\n/**\n * @toggleClassListHost decorator to toggle classes on :host element.\n * Returns: string | string[]\n */\nexport const toggleClassListHost = createClassListDecorator('toggle').bind(null, ':host');\n\nexport const findAllClassListMetadata = (target: any): Map<string | symbol, ClassListMetadata> => {\n const result = new Map<string | symbol, ClassListMetadata>();\n const maps = ReflectUtils.findAllMetadata<Map<string | symbol, ClassListMetadata>>(CLASS_LIST_METADATA_KEY, target);\n maps.forEach(map => {\n if (map instanceof Map) {\n map.forEach((v, k) => result.set(k, v));\n }\n });\n return result;\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,11 +1,12 @@
1
- import { ReflectUtils } from "@dooboostore/core/reflect/ReflectUtils";
2
- import { FunctionUtils } from "@dooboostore/core/function/FunctionUtils";
1
+ import { ReflectUtils } from "@dooboostore/core";
2
+ import { FunctionUtils } from "@dooboostore/core";
3
3
  import { getOnConnectedInnerHtmlMetadata } from "./onConnectedInnerHtml.js";
4
4
  import { getAddEventListenerMetadata } from "./addEventListener.js";
5
- import { ON_BEFORE_CONNECTED_METADATA_KEY, ON_AFTER_CONNECTED_METADATA_KEY, ON_BEFORE_DISCONNECTED_METADATA_KEY, ON_AFTER_DISCONNECTED_METADATA_KEY, ON_BEFORE_ADOPTED_METADATA_KEY, ON_AFTER_ADOPTED_METADATA_KEY, findAllLifecycleMetadata } from "./lifecycles.js";
5
+ import { ON_CONSTRUCTOR_METADATA_KEY, ON_BEFORE_CONNECTED_METADATA_KEY, ON_AFTER_CONNECTED_METADATA_KEY, ON_BEFORE_DISCONNECTED_METADATA_KEY, ON_AFTER_DISCONNECTED_METADATA_KEY, ON_BEFORE_ADOPTED_METADATA_KEY, ON_AFTER_ADOPTED_METADATA_KEY, findAllLifecycleMetadata } from "./lifecycles.js";
6
6
  import { getEmitCustomEventMetadataList } from "./emitCustomEvent.js";
7
- import { findAllAttributeChangedMetadata } from "./changedAttribute.js";
7
+ import { findAllAttributeChangedMetadata } from "./changedAttributeHost.js";
8
8
  import { findAllSetAttributeMetadata } from "./setAttribute.js";
9
+ import { findAllAttributeMetadata } from "./attribute.js";
9
10
  import { SwcUtils } from "../utils/Utils.js";
10
11
  import { HTML_TAG_ENTRIES, DOM_EVENT_NAMES } from "../config/config.js";
11
12
  import { SituationTypeContainer, SituationTypeContainers } from "@dooboostore/simple-boot/decorators/inject/Inject";
@@ -23,6 +24,10 @@ const ensureInit = (inst) => {
23
24
  inst.__swc_initialized = true;
24
25
  const hostSet = SwcUtils.getHostSet(inst);
25
26
  inst._executeSwcScript?.("swc-on-constructor", hostSet);
27
+ const cMethods = findAllLifecycleMetadata(inst, ON_CONSTRUCTOR_METADATA_KEY);
28
+ if (cMethods) {
29
+ for (const m of cMethods) inst._invokeLifecycleMethod(m, hostSet);
30
+ }
26
31
  }
27
32
  };
28
33
  const globalDelegatedRoots = /* @__PURE__ */ new WeakSet();
@@ -121,7 +126,9 @@ const setupPrototype = (proto) => {
121
126
  const oldHandler = handlers.get(attrName);
122
127
  if (oldHandler) el.removeEventListener(eventName, oldHandler);
123
128
  const handler = async (event) => {
124
- const hostSet = SwcUtils.getHostSet(el);
129
+ console.log("execute handler", event);
130
+ const parent = SwcUtils.findNearestSwcHost(el);
131
+ const hostSet = SwcUtils.getHostSet(parent || el);
125
132
  const conf = getElementConfig(this);
126
133
  const currentWin = this._resolveWindow(conf);
127
134
  const helpers = SwcUtils.getHelperSet(currentWin);
@@ -140,13 +147,18 @@ const setupPrototype = (proto) => {
140
147
  };
141
148
  proto.__swc_executeAttributeEvent = async function(el, attrName, script, event) {
142
149
  ensureInit(this);
143
- const hostSet = SwcUtils.getHostSet(el);
150
+ console.log("execute handler2", event);
151
+ const parent = SwcUtils.findNearestSwcHost(el);
152
+ const hostSet = SwcUtils.getHostSet(parent || el);
144
153
  const conf = getElementConfig(this);
145
154
  const currentWin = this._resolveWindow(conf);
146
155
  const currentHelpers = SwcUtils.getHelperSet(currentWin);
156
+ const detail = event.detail;
147
157
  const args = {
148
158
  event,
149
- $data: event.detail,
159
+ $event: event,
160
+ $data: detail,
161
+ $detail: detail,
150
162
  ...hostSet,
151
163
  ...currentHelpers,
152
164
  $el: el,
@@ -173,11 +185,14 @@ const elementDefine = (name, config = {}) => (constructor) => {
173
185
  metadata.extends = extendsTagName;
174
186
  }
175
187
  const emitCustomEventList = getEmitCustomEventMetadataList(constructor) || [];
188
+ const emitHostCustomEventList = emitCustomEventList.filter((meta) => meta.selector === ":host" || meta.selector === "");
176
189
  const addEventListenerList = getAddEventListenerMetadata(constructor) || [];
190
+ const addHostEventListenerList = addEventListenerList.filter((meta) => meta.selector === ":host" || meta.selector === "");
177
191
  const attrChangeMap = findAllAttributeChangedMetadata(constructor);
192
+ const attributeList = findAllAttributeMetadata(constructor);
178
193
  const swcLifecycleAttributes = ["swc-on-constructor", "swc-on-connected", "swc-on-disconnected", "swc-on-before-connected", "swc-on-after-connected", "swc-on-before-disconnected", "swc-on-after-disconnected", "swc-on-before-adopted", "swc-on-after-adopted", "swc-on-attribute-changed"];
179
194
  const swcOnEvents = DOM_EVENT_NAMES.map((e) => `swc-on-${e}`);
180
- const mergedObservedAttributes = [.../* @__PURE__ */ new Set([...metadata.observedAttributes ?? [], ...attrChangeMap.keys(), ...Array.from(findAllSetAttributeMetadata(constructor).values()).map((it) => it.name), ...emitCustomEventList.map((it) => it.options.attributeName), ...swcLifecycleAttributes, ...swcOnEvents])];
195
+ const mergedObservedAttributes = [.../* @__PURE__ */ new Set([...metadata.observedAttributes ?? [], ...attrChangeMap.keys(), ...Array.from(findAllSetAttributeMetadata(constructor).values()).map((it) => it.name), ...attributeList.map((it) => it.options.name || String(it.propertyKey)), ...emitHostCustomEventList.map((it) => it.options.attributeName).filter(Boolean), ...swcLifecycleAttributes, ...swcOnEvents])];
181
196
  const connectedInnerHtmlList = getOnConnectedInnerHtmlMetadata(constructor) || [];
182
197
  const proto = constructor.prototype;
183
198
  setupPrototype(proto);
@@ -195,7 +210,20 @@ const elementDefine = (name, config = {}) => (constructor) => {
195
210
  if (bMethods) {
196
211
  for (const m of bMethods) this._invokeLifecycleMethod(m, hostSet);
197
212
  }
198
- if (typeof this.initCore === "function") this.initCore();
213
+ attributeList.forEach((meta) => {
214
+ const attrName = meta.options.name || String(meta.propertyKey);
215
+ if (meta.options.connectedInitialize === true) {
216
+ this.__swc_syncing_init = true;
217
+ try {
218
+ const memoryVal = this[meta.privateKey];
219
+ if (memoryVal !== void 0) {
220
+ this[meta.propertyKey] = memoryVal;
221
+ }
222
+ } finally {
223
+ this.__swc_syncing_init = false;
224
+ }
225
+ }
226
+ });
199
227
  if (connectedInnerHtmlList.length > 0) {
200
228
  let sContent = "", lContent = "";
201
229
  for (const meta of connectedInnerHtmlList) {
@@ -215,7 +243,62 @@ const elementDefine = (name, config = {}) => (constructor) => {
215
243
  });
216
244
  globalDelegatedRoots.add(root);
217
245
  }
246
+ const delegateListeners = [];
247
+ const nonDelegateListeners = [];
218
248
  addEventListenerList.forEach((meta) => {
249
+ if (meta.options.delegate && meta.selector !== ":window" && meta.selector !== ":document" && meta.selector !== ":parentHost" && meta.selector !== ":appHost" && meta.selector !== ":firstHost" && meta.selector !== ":lastHost" && meta.selector !== ":firstAppHost" && meta.selector !== ":lastAppHost" && meta.selector !== ":hosts" && meta.selector !== ":appHosts" && meta.selector !== ":host" && meta.selector !== "") {
250
+ delegateListeners.push(meta);
251
+ } else {
252
+ nonDelegateListeners.push(meta);
253
+ }
254
+ });
255
+ const delegatesByTypeAndRoot = /* @__PURE__ */ new Map();
256
+ delegateListeners.forEach((meta) => {
257
+ const r = meta.options.root || "auto";
258
+ const rootKey = `${meta.type}:${r}`;
259
+ if (!delegatesByTypeAndRoot.has(rootKey)) {
260
+ delegatesByTypeAndRoot.set(rootKey, []);
261
+ }
262
+ delegatesByTypeAndRoot.get(rootKey).push(meta);
263
+ });
264
+ delegatesByTypeAndRoot.forEach((metaList, typeRootKey) => {
265
+ const [type, rStr] = typeRootKey.split(":");
266
+ const r = rStr === "auto" ? "auto" : rStr;
267
+ const opts = { capture: metaList[0].options.capture, once: metaList[0].options.once, passive: metaList[0].options.passive };
268
+ const bindRoots = [];
269
+ if (r === "auto") bindRoots.push(this.shadowRoot || this);
270
+ else if (r === "light") bindRoots.push(this);
271
+ else if (r === "shadow" && this.shadowRoot) bindRoots.push(this.shadowRoot);
272
+ else if (r === "all") {
273
+ bindRoots.push(this);
274
+ if (this.shadowRoot) bindRoots.push(this.shadowRoot);
275
+ }
276
+ bindRoots.forEach((br) => {
277
+ const sortedMetaList = [...metaList].sort((a, b) => {
278
+ const aStop = a.options.stopPropagation ? 1 : 0;
279
+ const bStop = b.options.stopPropagation ? 1 : 0;
280
+ return bStop - aStop;
281
+ });
282
+ const unifiedHandler = async (event) => {
283
+ for (const meta of sortedMetaList) {
284
+ const { selector, options } = meta;
285
+ const matchedEl = event.target.closest(selector);
286
+ if (matchedEl && br.contains(matchedEl)) {
287
+ if (options.stopPropagation) event.stopPropagation();
288
+ if (options.stopImmediatePropagation) event.stopImmediatePropagation();
289
+ if (options.preventDefault) event.preventDefault();
290
+ const currentHostSet = SwcUtils.getHostSet(this);
291
+ const args = { event, ...currentHostSet, $el: matchedEl, $root: br };
292
+ await this[meta.propertyKey](event, currentHostSet, matchedEl, args);
293
+ if (event.cancelBubble) break;
294
+ }
295
+ }
296
+ };
297
+ br.addEventListener(type, unifiedHandler, opts);
298
+ this._boundListeners.push({ target: br, type, handler: unifiedHandler, options: opts });
299
+ });
300
+ });
301
+ nonDelegateListeners.forEach((meta) => {
219
302
  const { selector, type, options } = meta;
220
303
  const opts = { capture: options.capture, once: options.once, passive: options.passive };
221
304
  const bindTargets = [];
@@ -240,33 +323,7 @@ const elementDefine = (name, config = {}) => (constructor) => {
240
323
  else if (selector === ":hosts") hostSet.$hosts.forEach(applyRootOption);
241
324
  else if (selector === ":appHosts") hostSet.$appHosts.forEach(applyRootOption);
242
325
  else if (selector === ":host" || !selector) applyRootOption(this);
243
- else if (options.delegate) {
244
- const bindRoots = [];
245
- if (r === "auto") bindRoots.push(this.shadowRoot || this);
246
- else if (r === "light") bindRoots.push(this);
247
- else if (r === "shadow" && this.shadowRoot) bindRoots.push(this.shadowRoot);
248
- else if (r === "all") {
249
- bindRoots.push(this);
250
- if (this.shadowRoot) bindRoots.push(this.shadowRoot);
251
- }
252
- bindRoots.forEach((br) => {
253
- const handler = async (event) => {
254
- const matchedEl = event.target.closest(selector);
255
- if (matchedEl && br.contains(matchedEl)) {
256
- if (options.stopPropagation) event.stopPropagation();
257
- if (options.stopImmediatePropagation) event.stopImmediatePropagation();
258
- if (options.preventDefault) event.preventDefault();
259
- const currentHostSet = SwcUtils.getHostSet(this);
260
- const args = { event, ...currentHostSet, $el: matchedEl, $root: br };
261
- await this._invokeLifecycleMethod(meta.propertyKey, currentHostSet, [event, currentHostSet, matchedEl, args]);
262
- }
263
- };
264
- br.addEventListener(type, handler, opts);
265
- if (options.removeOnDisconnected === true || br !== this && br !== this.shadowRoot) {
266
- this._boundListeners.push({ target: br, type, handler, options: opts });
267
- }
268
- });
269
- } else {
326
+ else {
270
327
  const searchRoots = [];
271
328
  if (r === "auto") searchRoots.push(this.shadowRoot || this);
272
329
  else if (r === "light") searchRoots.push(this);
@@ -286,7 +343,7 @@ const elementDefine = (name, config = {}) => (constructor) => {
286
343
  if (options.preventDefault) event.preventDefault();
287
344
  const currentHostSet = SwcUtils.getHostSet(this);
288
345
  const args = { event, ...currentHostSet, $el: t, $root: t };
289
- await this._invokeLifecycleMethod(meta.propertyKey, currentHostSet, [event, currentHostSet, args]);
346
+ await this[meta.propertyKey](event, currentHostSet, args);
290
347
  };
291
348
  t.addEventListener(type, handler, opts);
292
349
  if (options.removeOnDisconnected === true || t === currentWin || t === currentWin.document) {
@@ -294,6 +351,22 @@ const elementDefine = (name, config = {}) => (constructor) => {
294
351
  }
295
352
  });
296
353
  });
354
+ addHostEventListenerList.forEach((meta) => {
355
+ const { type, options } = meta;
356
+ const opts = { capture: options.capture, once: options.once, passive: options.passive };
357
+ const handler = async (event) => {
358
+ if (options.stopPropagation) event.stopPropagation();
359
+ if (options.stopImmediatePropagation) event.stopImmediatePropagation();
360
+ if (options.preventDefault) event.preventDefault();
361
+ const currentHostSet = SwcUtils.getHostSet(this);
362
+ const args = { event, ...currentHostSet, $el: this, $root: this.getRootNode() };
363
+ await this[meta.propertyKey](event, currentHostSet, args);
364
+ };
365
+ this.addEventListener(type, handler, opts);
366
+ if (options.removeOnDisconnected === true) {
367
+ this._boundListeners.push({ target: this, type, handler, options: opts });
368
+ }
369
+ });
297
370
  if (originalConnected) originalConnected.apply(this);
298
371
  const aMethods = findAllLifecycleMetadata(this, ON_AFTER_CONNECTED_METADATA_KEY);
299
372
  if (aMethods) {
@@ -301,6 +374,7 @@ const elementDefine = (name, config = {}) => (constructor) => {
301
374
  }
302
375
  this._executeSwcScript("swc-on-connected", hostSet);
303
376
  this._executeSwcScript("swc-on-after-connected", hostSet);
377
+ this.__swc_connected = true;
304
378
  };
305
379
  const originalDisconnected = proto.disconnectedCallback;
306
380
  proto.disconnectedCallback = function() {
@@ -321,6 +395,7 @@ const elementDefine = (name, config = {}) => (constructor) => {
321
395
  }
322
396
  this._executeSwcScript("swc-on-disconnected", hostSet);
323
397
  this._executeSwcScript("swc-on-after-disconnected", hostSet);
398
+ this.__swc_connected = false;
324
399
  };
325
400
  const originalAdopted = proto.adoptedCallback;
326
401
  proto.adoptedCallback = function() {
@@ -341,17 +416,20 @@ const elementDefine = (name, config = {}) => (constructor) => {
341
416
  const originalAttributeChanged = proto.attributeChangedCallback;
342
417
  proto.attributeChangedCallback = function(name2, old, newVal) {
343
418
  if (originalAttributeChanged) originalAttributeChanged.apply(this, [name2, old, newVal]);
419
+ const hSet = SwcUtils.getHostSet(this);
344
420
  if (name2.startsWith("swc-on-") && !swcLifecycleAttributes.includes(name2)) {
345
421
  if (newVal !== null) {
346
- const customEventMeta = emitCustomEventList.find((it) => it.options.attributeName === name2);
347
- const eventName = customEventMeta ? customEventMeta.type : name2.substring(7);
422
+ const eventName = name2.substring(7);
348
423
  this._bindAttributeEvent(this, name2, newVal, eventName);
349
424
  }
350
425
  }
426
+ const hostCustomEventMeta = emitHostCustomEventList.find((it) => it.options.attributeName === name2);
427
+ if (hostCustomEventMeta && newVal !== null) {
428
+ this._bindAttributeEvent(this, name2, newVal, hostCustomEventMeta.type);
429
+ }
351
430
  const mKeys = attrChangeMap.get(name2);
352
431
  if (mKeys && Array.isArray(mKeys)) {
353
- const hSet = SwcUtils.getHostSet(this);
354
- for (const key of mKeys) this._invokeLifecycleMethod(key, hSet, [newVal, old, name2]);
432
+ for (const key of mKeys) this[key](newVal, old, name2, hSet);
355
433
  }
356
434
  };
357
435
  Object.defineProperty(constructor, "observedAttributes", {