@dooboostore/simple-web-component 1.0.49 → 1.0.51

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 (251) hide show
  1. package/README.md +790 -337
  2. package/dist/cjs/SwcAppEngine.js.map +2 -2
  3. package/dist/cjs/decorators/addEventListener.js +1925 -22
  4. package/dist/cjs/decorators/addEventListener.js.map +2 -2
  5. package/dist/cjs/decorators/applyAttribute.js +41 -47
  6. package/dist/cjs/decorators/applyAttribute.js.map +2 -2
  7. package/dist/cjs/decorators/applyClass.js +14 -11
  8. package/dist/cjs/decorators/applyClass.js.map +2 -2
  9. package/dist/cjs/decorators/applyNode.js +19 -21
  10. package/dist/cjs/decorators/applyNode.js.map +2 -2
  11. package/dist/cjs/decorators/applyProperty.js +24 -48
  12. package/dist/cjs/decorators/applyProperty.js.map +2 -2
  13. package/dist/cjs/decorators/applySlot.js +9 -8
  14. package/dist/cjs/decorators/applySlot.js.map +2 -2
  15. package/dist/cjs/decorators/applyStyle.js +14 -11
  16. package/dist/cjs/decorators/applyStyle.js.map +2 -2
  17. package/dist/cjs/decorators/around.js +124 -0
  18. package/dist/cjs/decorators/around.js.map +7 -0
  19. package/dist/cjs/decorators/changedAttribute.js +61 -24
  20. package/dist/cjs/decorators/changedAttribute.js.map +2 -2
  21. package/dist/cjs/decorators/elementDefine.js +240 -196
  22. package/dist/cjs/decorators/elementDefine.js.map +3 -3
  23. package/dist/cjs/decorators/emitCustomEvent.js +14 -12
  24. package/dist/cjs/decorators/emitCustomEvent.js.map +2 -2
  25. package/dist/cjs/decorators/eventMedia.js +112 -0
  26. package/dist/cjs/decorators/eventMedia.js.map +7 -0
  27. package/dist/cjs/decorators/fetch.js +278 -0
  28. package/dist/cjs/decorators/fetch.js.map +7 -0
  29. package/dist/cjs/decorators/index.js +8 -2
  30. package/dist/cjs/decorators/index.js.map +2 -2
  31. package/dist/cjs/decorators/intersectionObserver.js +76 -65
  32. package/dist/cjs/decorators/intersectionObserver.js.map +2 -2
  33. package/dist/cjs/decorators/lifecycles.js +11 -11
  34. package/dist/cjs/decorators/lifecycles.js.map +2 -2
  35. package/dist/cjs/decorators/mutationObserver.js +97 -90
  36. package/dist/cjs/decorators/mutationObserver.js.map +3 -3
  37. package/dist/cjs/decorators/parameter.js +156 -0
  38. package/dist/cjs/decorators/parameter.js.map +7 -0
  39. package/dist/cjs/decorators/publishSwcAppMessage.js +2 -2
  40. package/dist/cjs/decorators/publishSwcAppMessage.js.map +2 -2
  41. package/dist/cjs/decorators/query.js +11 -5
  42. package/dist/cjs/decorators/query.js.map +2 -2
  43. package/dist/cjs/decorators/requestAnimationFrame.js +115 -0
  44. package/dist/cjs/decorators/requestAnimationFrame.js.map +7 -0
  45. package/dist/cjs/decorators/resizeObserver.js +84 -69
  46. package/dist/cjs/decorators/resizeObserver.js.map +3 -3
  47. package/dist/cjs/decorators/setInterval.js +65 -22
  48. package/dist/cjs/decorators/setInterval.js.map +2 -2
  49. package/dist/cjs/decorators/setTimeout.js +68 -22
  50. package/dist/cjs/decorators/setTimeout.js.map +2 -2
  51. package/dist/cjs/decorators/state.js +13 -10
  52. package/dist/cjs/decorators/state.js.map +2 -2
  53. package/dist/cjs/decorators/{subscribeSwcAppMessageWhileConnected.js → subscribeSwcAppMessage.js} +20 -21
  54. package/dist/cjs/decorators/subscribeSwcAppMessage.js.map +7 -0
  55. package/dist/cjs/decorators/{subscribeSwcAppRouteChangeWhileConnected.js → subscribeSwcAppRouteChange.js} +23 -19
  56. package/dist/cjs/decorators/subscribeSwcAppRouteChange.js.map +7 -0
  57. package/dist/cjs/decorators/swcAppRoute.js +149 -0
  58. package/dist/cjs/decorators/swcAppRoute.js.map +7 -0
  59. package/dist/cjs/elements/SwcApp.js +70 -0
  60. package/dist/cjs/elements/SwcApp.js.map +2 -2
  61. package/dist/cjs/elements/SwcAppMixin.js +256 -67
  62. package/dist/cjs/elements/SwcAppMixin.js.map +3 -3
  63. package/dist/cjs/types/index.js +5 -1
  64. package/dist/cjs/types/index.js.map +2 -2
  65. package/dist/cjs/types/window.d.js.map +1 -1
  66. package/dist/cjs/utils/Utils.js +36 -15
  67. package/dist/cjs/utils/Utils.js.map +2 -2
  68. package/dist/esm/SwcAppEngine.js.map +2 -2
  69. package/dist/esm/decorators/addEventListener.js +1925 -22
  70. package/dist/esm/decorators/addEventListener.js.map +2 -2
  71. package/dist/esm/decorators/applyAttribute.js +41 -47
  72. package/dist/esm/decorators/applyAttribute.js.map +2 -2
  73. package/dist/esm/decorators/applyClass.js +14 -11
  74. package/dist/esm/decorators/applyClass.js.map +2 -2
  75. package/dist/esm/decorators/applyNode.js +20 -22
  76. package/dist/esm/decorators/applyNode.js.map +2 -2
  77. package/dist/esm/decorators/applyProperty.js +24 -48
  78. package/dist/esm/decorators/applyProperty.js.map +2 -2
  79. package/dist/esm/decorators/applySlot.js +9 -8
  80. package/dist/esm/decorators/applySlot.js.map +2 -2
  81. package/dist/esm/decorators/applyStyle.js +14 -11
  82. package/dist/esm/decorators/applyStyle.js.map +2 -2
  83. package/dist/esm/decorators/around.js +105 -0
  84. package/dist/esm/decorators/around.js.map +7 -0
  85. package/dist/esm/decorators/changedAttribute.js +61 -24
  86. package/dist/esm/decorators/changedAttribute.js.map +2 -2
  87. package/dist/esm/decorators/elementDefine.js +238 -194
  88. package/dist/esm/decorators/elementDefine.js.map +3 -3
  89. package/dist/esm/decorators/emitCustomEvent.js +15 -13
  90. package/dist/esm/decorators/emitCustomEvent.js.map +2 -2
  91. package/dist/esm/decorators/eventMedia.js +94 -0
  92. package/dist/esm/decorators/eventMedia.js.map +7 -0
  93. package/dist/esm/decorators/fetch.js +259 -0
  94. package/dist/esm/decorators/fetch.js.map +7 -0
  95. package/dist/esm/decorators/index.js +8 -2
  96. package/dist/esm/decorators/index.js.map +2 -2
  97. package/dist/esm/decorators/intersectionObserver.js +76 -65
  98. package/dist/esm/decorators/intersectionObserver.js.map +2 -2
  99. package/dist/esm/decorators/lifecycles.js +11 -11
  100. package/dist/esm/decorators/lifecycles.js.map +2 -2
  101. package/dist/esm/decorators/mutationObserver.js +97 -90
  102. package/dist/esm/decorators/mutationObserver.js.map +3 -3
  103. package/dist/esm/decorators/parameter.js +137 -0
  104. package/dist/esm/decorators/parameter.js.map +7 -0
  105. package/dist/esm/decorators/publishSwcAppMessage.js +2 -2
  106. package/dist/esm/decorators/publishSwcAppMessage.js.map +2 -2
  107. package/dist/esm/decorators/query.js +11 -5
  108. package/dist/esm/decorators/query.js.map +2 -2
  109. package/dist/esm/decorators/requestAnimationFrame.js +96 -0
  110. package/dist/esm/decorators/requestAnimationFrame.js.map +7 -0
  111. package/dist/esm/decorators/resizeObserver.js +84 -69
  112. package/dist/esm/decorators/resizeObserver.js.map +2 -2
  113. package/dist/esm/decorators/setInterval.js +65 -23
  114. package/dist/esm/decorators/setInterval.js.map +2 -2
  115. package/dist/esm/decorators/setTimeout.js +68 -23
  116. package/dist/esm/decorators/setTimeout.js.map +2 -2
  117. package/dist/esm/decorators/state.js +13 -10
  118. package/dist/esm/decorators/state.js.map +2 -2
  119. package/dist/esm/decorators/subscribeSwcAppMessage.js +53 -0
  120. package/dist/esm/decorators/subscribeSwcAppMessage.js.map +7 -0
  121. package/dist/esm/decorators/{subscribeSwcAppRouteChangeWhileConnected.js → subscribeSwcAppRouteChange.js} +20 -16
  122. package/dist/esm/decorators/subscribeSwcAppRouteChange.js.map +7 -0
  123. package/dist/esm/decorators/swcAppRoute.js +130 -0
  124. package/dist/esm/decorators/swcAppRoute.js.map +7 -0
  125. package/dist/esm/elements/SwcApp.js +70 -0
  126. package/dist/esm/elements/SwcApp.js.map +2 -2
  127. package/dist/esm/elements/SwcAppMixin.js +258 -69
  128. package/dist/esm/elements/SwcAppMixin.js.map +3 -3
  129. package/dist/esm/types/index.js +5 -1
  130. package/dist/esm/types/index.js.map +2 -2
  131. package/dist/esm/utils/Utils.js +36 -15
  132. package/dist/esm/utils/Utils.js.map +2 -2
  133. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +4395 -1266
  134. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  135. package/dist/types/SwcAppEngine.d.ts +1 -0
  136. package/dist/types/SwcAppEngine.d.ts.map +1 -1
  137. package/dist/types/decorators/addEventListener.d.ts +936 -11
  138. package/dist/types/decorators/addEventListener.d.ts.map +1 -1
  139. package/dist/types/decorators/applyAttribute.d.ts +27 -37
  140. package/dist/types/decorators/applyAttribute.d.ts.map +1 -1
  141. package/dist/types/decorators/applyClass.d.ts +2 -2
  142. package/dist/types/decorators/applyClass.d.ts.map +1 -1
  143. package/dist/types/decorators/applyNode.d.ts +16 -16
  144. package/dist/types/decorators/applyNode.d.ts.map +1 -1
  145. package/dist/types/decorators/applyProperty.d.ts +28 -44
  146. package/dist/types/decorators/applyProperty.d.ts.map +1 -1
  147. package/dist/types/decorators/applySlot.d.ts.map +1 -1
  148. package/dist/types/decorators/applyStyle.d.ts +2 -2
  149. package/dist/types/decorators/applyStyle.d.ts.map +1 -1
  150. package/dist/types/decorators/around.d.ts +87 -0
  151. package/dist/types/decorators/around.d.ts.map +1 -0
  152. package/dist/types/decorators/changedAttribute.d.ts +22 -4
  153. package/dist/types/decorators/changedAttribute.d.ts.map +1 -1
  154. package/dist/types/decorators/elementDefine.d.ts.map +1 -1
  155. package/dist/types/decorators/emitCustomEvent.d.ts +0 -1
  156. package/dist/types/decorators/emitCustomEvent.d.ts.map +1 -1
  157. package/dist/types/decorators/eventMedia.d.ts +48 -0
  158. package/dist/types/decorators/eventMedia.d.ts.map +1 -0
  159. package/dist/types/decorators/fetch.d.ts +139 -0
  160. package/dist/types/decorators/fetch.d.ts.map +1 -0
  161. package/dist/types/decorators/index.d.ts +8 -2
  162. package/dist/types/decorators/index.d.ts.map +1 -1
  163. package/dist/types/decorators/intersectionObserver.d.ts +32 -10
  164. package/dist/types/decorators/intersectionObserver.d.ts.map +1 -1
  165. package/dist/types/decorators/lifecycles.d.ts +8 -7
  166. package/dist/types/decorators/lifecycles.d.ts.map +1 -1
  167. package/dist/types/decorators/mutationObserver.d.ts +34 -12
  168. package/dist/types/decorators/mutationObserver.d.ts.map +1 -1
  169. package/dist/types/decorators/parameter.d.ts +113 -0
  170. package/dist/types/decorators/parameter.d.ts.map +1 -0
  171. package/dist/types/decorators/publishSwcAppMessage.d.ts +0 -1
  172. package/dist/types/decorators/publishSwcAppMessage.d.ts.map +1 -1
  173. package/dist/types/decorators/query.d.ts +7 -7
  174. package/dist/types/decorators/query.d.ts.map +1 -1
  175. package/dist/types/decorators/requestAnimationFrame.d.ts +47 -0
  176. package/dist/types/decorators/requestAnimationFrame.d.ts.map +1 -0
  177. package/dist/types/decorators/resizeObserver.d.ts +34 -12
  178. package/dist/types/decorators/resizeObserver.d.ts.map +1 -1
  179. package/dist/types/decorators/setInterval.d.ts +27 -5
  180. package/dist/types/decorators/setInterval.d.ts.map +1 -1
  181. package/dist/types/decorators/setTimeout.d.ts +27 -5
  182. package/dist/types/decorators/setTimeout.d.ts.map +1 -1
  183. package/dist/types/decorators/state.d.ts.map +1 -1
  184. package/dist/types/decorators/subscribeSwcAppMessage.d.ts +44 -0
  185. package/dist/types/decorators/subscribeSwcAppMessage.d.ts.map +1 -0
  186. package/dist/types/decorators/subscribeSwcAppRouteChange.d.ts +60 -0
  187. package/dist/types/decorators/subscribeSwcAppRouteChange.d.ts.map +1 -0
  188. package/dist/types/decorators/swcAppRoute.d.ts +94 -0
  189. package/dist/types/decorators/swcAppRoute.d.ts.map +1 -0
  190. package/dist/types/elements/SwcApp.d.ts.map +1 -1
  191. package/dist/types/elements/SwcAppMixin.d.ts +423 -388
  192. package/dist/types/elements/SwcAppMixin.d.ts.map +1 -1
  193. package/dist/types/types/index.d.ts +43 -4
  194. package/dist/types/types/index.d.ts.map +1 -1
  195. package/dist/types/utils/Utils.d.ts +15 -5
  196. package/dist/types/utils/Utils.d.ts.map +1 -1
  197. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +4395 -1266
  198. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  199. package/package.json +8 -6
  200. package/src/SwcAppEngine.ts +1 -0
  201. package/src/decorators/addEventListener.ts +1086 -28
  202. package/src/decorators/applyAttribute.ts +82 -134
  203. package/src/decorators/applyClass.ts +14 -10
  204. package/src/decorators/applyNode.ts +39 -37
  205. package/src/decorators/applyProperty.ts +72 -100
  206. package/src/decorators/applySlot.ts +9 -8
  207. package/src/decorators/applyStyle.ts +14 -10
  208. package/src/decorators/around.ts +196 -0
  209. package/src/decorators/changedAttribute.ts +65 -26
  210. package/src/decorators/elementDefine.ts +298 -220
  211. package/src/decorators/emitCustomEvent.ts +17 -13
  212. package/src/decorators/eventMedia.ts +119 -0
  213. package/src/decorators/fetch.ts +454 -0
  214. package/src/decorators/index.ts +8 -2
  215. package/src/decorators/intersectionObserver.ts +108 -78
  216. package/src/decorators/lifecycles.ts +24 -22
  217. package/src/decorators/mutationObserver.ts +140 -104
  218. package/src/decorators/parameter.ts +212 -0
  219. package/src/decorators/publishSwcAppMessage.ts +3 -4
  220. package/src/decorators/query.ts +22 -14
  221. package/src/decorators/requestAnimationFrame.ts +149 -0
  222. package/src/decorators/resizeObserver.ts +119 -82
  223. package/src/decorators/setInterval.ts +90 -23
  224. package/src/decorators/setTimeout.ts +93 -23
  225. package/src/decorators/state.ts +19 -13
  226. package/src/decorators/subscribeSwcAppMessage.ts +106 -0
  227. package/src/decorators/subscribeSwcAppRouteChange.ts +131 -0
  228. package/src/decorators/swcAppRoute.ts +231 -0
  229. package/src/elements/SwcApp.ts +40 -10
  230. package/src/elements/SwcAppMixin.ts +329 -85
  231. package/src/types/index.ts +38 -5
  232. package/src/types/window.d.ts +2 -18
  233. package/src/utils/Utils.ts +50 -18
  234. package/dist/cjs/decorators/subscribeSwcAppMessageWhileConnected.js.map +0 -7
  235. package/dist/cjs/decorators/subscribeSwcAppRouteChangeWhileConnected.js.map +0 -7
  236. package/dist/cjs/examples/RxJSOperatorsExample.js +0 -285
  237. package/dist/cjs/examples/RxJSOperatorsExample.js.map +0 -7
  238. package/dist/esm/decorators/subscribeSwcAppMessageWhileConnected.js +0 -54
  239. package/dist/esm/decorators/subscribeSwcAppMessageWhileConnected.js.map +0 -7
  240. package/dist/esm/decorators/subscribeSwcAppRouteChangeWhileConnected.js.map +0 -7
  241. package/dist/esm/examples/RxJSOperatorsExample.js +0 -266
  242. package/dist/esm/examples/RxJSOperatorsExample.js.map +0 -7
  243. package/dist/types/decorators/subscribeSwcAppMessageWhileConnected.d.ts +0 -23
  244. package/dist/types/decorators/subscribeSwcAppMessageWhileConnected.d.ts.map +0 -1
  245. package/dist/types/decorators/subscribeSwcAppRouteChangeWhileConnected.d.ts +0 -31
  246. package/dist/types/decorators/subscribeSwcAppRouteChangeWhileConnected.d.ts.map +0 -1
  247. package/dist/types/examples/RxJSOperatorsExample.d.ts +0 -94
  248. package/dist/types/examples/RxJSOperatorsExample.d.ts.map +0 -1
  249. package/src/decorators/subscribeSwcAppMessageWhileConnected.ts +0 -91
  250. package/src/decorators/subscribeSwcAppRouteChangeWhileConnected.ts +0 -107
  251. package/src/examples/RxJSOperatorsExample.ts +0 -279
@@ -1,5 +1,6 @@
1
1
  import { ReflectUtils } from '@dooboostore/core';
2
2
  import { SpecialSelector, SwcQueryOptions, SwcFnSelector, SwcSelector, HelperHostSet } from '../types';
3
+ import { buildSwcParameterArgs } from './parameter';
3
4
 
4
5
  // 공통 옵션 — IntersectionObserverInit + filter/removeObserver. root·delegate 제외.
5
6
  // 주의: 데코레이터의 root(light/shadow/all/auto) 는 셀렉터 스코프 선택용이다.
@@ -7,7 +8,12 @@ import { SpecialSelector, SwcQueryOptions, SwcFnSelector, SwcSelector, HelperHos
7
8
  export interface IntersectionObserverBaseOptions extends Omit<IntersectionObserverInit, 'root'> {
8
9
  /** IntersectionObserver 의 스크롤 컨테이너 (viewport 대신). 데코레이터 root 와 혼동 주의. */
9
10
  intersectionRoot?: Element | Document;
10
- filter?: (matchedEls: HTMLElement[], meta: { currentThis: any, helper: HelperHostSet }) => boolean;
11
+ /** 매칭 시 핸들러 실행 여부 게이트. Promise<boolean>도 되어 async 판정 가능. false면 스킵. */
12
+ filter?: (matchedEls: HTMLElement[], meta: { currentThis: any, helper: HelperHostSet }) => boolean | Promise<boolean>;
13
+ /** filter 통과 후 핸들러 직전 훅. await되고, 리턴값은 @intersectionObserverBeforeReturn 으로 핸들러에 주입된다. */
14
+ before?: (matchedEls: HTMLElement[], meta: { currentThis: any, helper: HelperHostSet }) => any | Promise<any>;
15
+ /** 핸들러가 성공/실패해도 항상 실행되는 정리 훅. ctx로 인자/결과/에러를 받는다. 에러는 로깅됨. */
16
+ finally?: (matchedEls: HTMLElement[], meta: { currentThis: any, helper: HelperHostSet }, ctx: { args: any[]; result?: any; error?: any }) => any | Promise<any>;
11
17
  removeObserver?: (target: Element, optionValue: IntersectionObserverQueryOptions) => void;
12
18
  }
13
19
 
@@ -29,115 +35,126 @@ export interface IntersectionObserverMetadata {
29
35
 
30
36
  export const INTERSECTION_OBSERVER_METADATA_KEY = Symbol.for('simple-web-component:intersection-observer');
31
37
 
38
+ const applyIntersectionObserver = (selector: SwcSelector, options: IntersectionObserverOptions, targetObj: Object, propertyKey: string | symbol): void => {
39
+ const constructor = targetObj.constructor;
40
+ let observers = ReflectUtils.getOwnMetadata(INTERSECTION_OBSERVER_METADATA_KEY, constructor) as IntersectionObserverMetadata[] | undefined;
41
+ if (!observers) {
42
+ observers = [];
43
+ ReflectUtils.defineMetadata(INTERSECTION_OBSERVER_METADATA_KEY, observers, constructor);
44
+ }
45
+ observers.push({ propertyKey, selector, options });
46
+ };
47
+
48
+ const resolveIntersectionObserverArgs = (
49
+ selectorOrOptions: SwcSelector | IntersectionObserverOptions | undefined,
50
+ maybeOptions: IntersectionObserverOptions | undefined,
51
+ extra: Partial<IntersectionObserverOptions>
52
+ ): { selector: SwcSelector; options: IntersectionObserverOptions } => {
53
+ if (typeof selectorOrOptions === 'string' || typeof selectorOrOptions === 'function') {
54
+ return { selector: selectorOrOptions, options: { ...(maybeOptions ?? {}), ...extra } };
55
+ }
56
+ return { selector: '$this', options: { ...(selectorOrOptions ?? {}), ...extra } };
57
+ };
58
+
59
+ /**
60
+ * bare(@decorator)와 factory(@decorator(...), 빈 괄호는 타입에서 막음) 호출을 모두 처리하는 공통 디스패처.
61
+ * extra는 Light/Shadow/All/Delegate 변형이 강제로 덧씌우는 옵션(root, delegate 등)이다.
62
+ */
63
+ const dispatchIntersectionObserver = (
64
+ selectorOrOptionsOrTarget: SwcSelector | IntersectionObserverOptions | Object | undefined,
65
+ maybeOptionsOrPropertyKey: IntersectionObserverOptions | string | symbol | undefined,
66
+ descriptor: PropertyDescriptor | undefined,
67
+ extra: Partial<IntersectionObserverOptions>
68
+ ): MethodDecorator | void => {
69
+ if ((typeof maybeOptionsOrPropertyKey === 'string' || typeof maybeOptionsOrPropertyKey === 'symbol') && descriptor !== undefined) {
70
+ // 옵션 없이: @decorator
71
+ applyIntersectionObserver('$this', { ...extra }, selectorOrOptionsOrTarget as Object, maybeOptionsOrPropertyKey);
72
+ return;
73
+ }
74
+ // 옵션과 함께: @decorator(selector, options) / @decorator(options)
75
+ const { selector, options } = resolveIntersectionObserverArgs(
76
+ selectorOrOptionsOrTarget as SwcSelector | IntersectionObserverOptions | undefined,
77
+ maybeOptionsOrPropertyKey as IntersectionObserverOptions | undefined,
78
+ extra
79
+ );
80
+ return (targetObj: Object, propertyKey: string | symbol) => {
81
+ applyIntersectionObserver(selector, options, targetObj, propertyKey);
82
+ };
83
+ };
84
+
32
85
  export function intersectionObserver(target: SpecialSelector, options?: IntersectionObserverQueryOptions): MethodDecorator;
33
86
  export function intersectionObserver(selector: string, options?: IntersectionObserverQueryOptions): MethodDecorator;
34
87
  export function intersectionObserver(selector: SwcFnSelector, options?: IntersectionObserverNonQueryOptions): MethodDecorator;
35
- export function intersectionObserver(options?: IntersectionObserverQueryOptions): MethodDecorator;
88
+ export function intersectionObserver(options: IntersectionObserverQueryOptions): MethodDecorator;
89
+ export function intersectionObserver(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
36
90
  /**
37
91
  * @intersectionObserver decorator to observe element intersection changes.
38
92
  *
39
93
  * IntersectionObserver 는 생성 시점에 옵션(threshold/rootMargin/root)이 고정되므로,
40
94
  * 옵션별로 그룹을 만들어 observer 를 생성한다. 같은 옵션 그룹 안에서 delegate 동적 추적이 가능하다.
95
+ * 옵션 없이 `@intersectionObserver` 그대로 붙여도 되고, `@intersectionObserver(...)`처럼 셀렉터/옵션을 줄 수도 있다.
41
96
  */
42
- export function intersectionObserver(selectorOrOptions?: SwcSelector | IntersectionObserverOptions, maybeOptions?: IntersectionObserverOptions): MethodDecorator {
43
- return (targetObj: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
44
- let selector: SwcSelector = '$this';
45
- let options: IntersectionObserverOptions = {};
46
-
47
- if (typeof selectorOrOptions === 'string' || typeof selectorOrOptions === 'function') {
48
- selector = selectorOrOptions;
49
- options = maybeOptions ?? {};
50
- } else {
51
- selector = '$this';
52
- options = selectorOrOptions ?? {};
53
- }
54
-
55
- const constructor = targetObj.constructor;
56
-
57
- let observers = ReflectUtils.getMetadata<IntersectionObserverMetadata[]>(INTERSECTION_OBSERVER_METADATA_KEY, constructor);
58
- if (!observers) {
59
- observers = [];
60
- ReflectUtils.defineMetadata(INTERSECTION_OBSERVER_METADATA_KEY, observers, constructor);
61
- }
62
-
63
- observers.push({ propertyKey, selector, options });
64
- };
97
+ export function intersectionObserver(selectorOrOptionsOrTarget?: SwcSelector | IntersectionObserverOptions | Object, maybeOptionsOrPropertyKey?: IntersectionObserverOptions | string | symbol, descriptor?: PropertyDescriptor): MethodDecorator | void {
98
+ return dispatchIntersectionObserver(selectorOrOptionsOrTarget, maybeOptionsOrPropertyKey, descriptor, {});
65
99
  }
66
100
 
67
- export function intersectionObserverThis(options?: IntersectionObserverQueryOptions): MethodDecorator {
68
- return intersectionObserver('$this', options);
69
- }
70
101
 
71
102
  // ─── root별 delegate 헬퍼 (root 주입 → 문자열 셀렉터 전용) ───
72
103
 
73
104
  export function intersectionObserverDelegateLight(selector: string, options?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
74
- export function intersectionObserverDelegateLight(options?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
75
- export function intersectionObserverDelegateLight(selectorOrOptions?: string | Omit<IntersectionObserverQueryOptions, 'delegate'>, maybeOptions?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator {
76
- if (typeof selectorOrOptions === 'string' || typeof selectorOrOptions === 'function') {
77
- return intersectionObserver(selectorOrOptions as any, {...maybeOptions ?? {}, root: 'light', delegate: true});
78
- }
79
- return intersectionObserver({...selectorOrOptions ?? {}, root: 'light', delegate: true});
105
+ export function intersectionObserverDelegateLight(options: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
106
+ export function intersectionObserverDelegateLight(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
107
+ export function intersectionObserverDelegateLight(selectorOrOptionsOrTarget?: string | Omit<IntersectionObserverQueryOptions, 'delegate'> | Object, maybeOptionsOrPropertyKey?: Omit<IntersectionObserverQueryOptions, 'delegate'> | string | symbol, descriptor?: PropertyDescriptor): MethodDecorator | void {
108
+ return dispatchIntersectionObserver(selectorOrOptionsOrTarget as any, maybeOptionsOrPropertyKey as any, descriptor, { root: 'light', delegate: true });
80
109
  }
81
110
 
82
111
  export function intersectionObserverDelegateShadow(selector: string, options?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
83
- export function intersectionObserverDelegateShadow(options?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
84
- export function intersectionObserverDelegateShadow(selectorOrOptions?: string | Omit<IntersectionObserverQueryOptions, 'delegate'>, maybeOptions?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator {
85
- if (typeof selectorOrOptions === 'string' || typeof selectorOrOptions === 'function') {
86
- return intersectionObserver(selectorOrOptions as any, {...maybeOptions ?? {}, root: 'shadow', delegate: true});
87
- }
88
- return intersectionObserver({...selectorOrOptions ?? {}, root: 'shadow', delegate: true});
112
+ export function intersectionObserverDelegateShadow(options: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
113
+ export function intersectionObserverDelegateShadow(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
114
+ export function intersectionObserverDelegateShadow(selectorOrOptionsOrTarget?: string | Omit<IntersectionObserverQueryOptions, 'delegate'> | Object, maybeOptionsOrPropertyKey?: Omit<IntersectionObserverQueryOptions, 'delegate'> | string | symbol, descriptor?: PropertyDescriptor): MethodDecorator | void {
115
+ return dispatchIntersectionObserver(selectorOrOptionsOrTarget as any, maybeOptionsOrPropertyKey as any, descriptor, { root: 'shadow', delegate: true });
89
116
  }
90
117
 
91
118
  export function intersectionObserverDelegateAll(selector: string, options?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
92
- export function intersectionObserverDelegateAll(options?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
93
- export function intersectionObserverDelegateAll(selectorOrOptions?: string | Omit<IntersectionObserverQueryOptions, 'delegate'>, maybeOptions?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator {
94
- if (typeof selectorOrOptions === 'string' || typeof selectorOrOptions === 'function') {
95
- return intersectionObserver(selectorOrOptions as any, {...maybeOptions ?? {}, root: 'all', delegate: true});
96
- }
97
- return intersectionObserver({...selectorOrOptions ?? {}, root: 'all', delegate: true});
119
+ export function intersectionObserverDelegateAll(options: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
120
+ export function intersectionObserverDelegateAll(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
121
+ export function intersectionObserverDelegateAll(selectorOrOptionsOrTarget?: string | Omit<IntersectionObserverQueryOptions, 'delegate'> | Object, maybeOptionsOrPropertyKey?: Omit<IntersectionObserverQueryOptions, 'delegate'> | string | symbol, descriptor?: PropertyDescriptor): MethodDecorator | void {
122
+ return dispatchIntersectionObserver(selectorOrOptionsOrTarget as any, maybeOptionsOrPropertyKey as any, descriptor, { root: 'all', delegate: true });
98
123
  }
99
124
 
100
125
  export function intersectionObserverDelegate(selector: string, options?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
101
- export function intersectionObserverDelegate(options?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
102
- export function intersectionObserverDelegate(selectorOrOptions?: string | Omit<IntersectionObserverQueryOptions, 'delegate'>, maybeOptions?: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator {
103
- if (typeof selectorOrOptions === 'string' || typeof selectorOrOptions === 'function') {
104
- return intersectionObserver(selectorOrOptions as any, {...maybeOptions ?? {}, root: 'auto', delegate: true});
105
- }
106
- return intersectionObserver({...selectorOrOptions ?? {}, root: 'auto', delegate: true});
126
+ export function intersectionObserverDelegate(options: Omit<IntersectionObserverQueryOptions, 'delegate'>): MethodDecorator;
127
+ export function intersectionObserverDelegate(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
128
+ export function intersectionObserverDelegate(selectorOrOptionsOrTarget?: string | Omit<IntersectionObserverQueryOptions, 'delegate'> | Object, maybeOptionsOrPropertyKey?: Omit<IntersectionObserverQueryOptions, 'delegate'> | string | symbol, descriptor?: PropertyDescriptor): MethodDecorator | void {
129
+ return dispatchIntersectionObserver(selectorOrOptionsOrTarget as any, maybeOptionsOrPropertyKey as any, descriptor, { root: 'auto', delegate: true });
107
130
  }
108
131
 
109
132
  // ─── root별 일반 헬퍼 (delegate 없이, 셀렉터 생략 시 $this) ───
110
133
 
111
134
  export function intersectionObserverLight(selector: string, options?: IntersectionObserverQueryOptions): MethodDecorator;
112
- export function intersectionObserverLight(options?: IntersectionObserverQueryOptions): MethodDecorator;
113
- export function intersectionObserverLight(selectorOrOptions?: string | IntersectionObserverQueryOptions, maybeOptions?: IntersectionObserverQueryOptions): MethodDecorator {
114
- if (typeof selectorOrOptions === 'string' || typeof selectorOrOptions === 'function') {
115
- return intersectionObserver(selectorOrOptions as any, {...maybeOptions ?? {}, root: 'light'});
116
- }
117
- return intersectionObserver({...selectorOrOptions ?? {}, root: 'light'});
135
+ export function intersectionObserverLight(options: IntersectionObserverQueryOptions): MethodDecorator;
136
+ export function intersectionObserverLight(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
137
+ export function intersectionObserverLight(selectorOrOptionsOrTarget?: string | IntersectionObserverQueryOptions | Object, maybeOptionsOrPropertyKey?: IntersectionObserverQueryOptions | string | symbol, descriptor?: PropertyDescriptor): MethodDecorator | void {
138
+ return dispatchIntersectionObserver(selectorOrOptionsOrTarget as any, maybeOptionsOrPropertyKey as any, descriptor, { root: 'light' });
118
139
  }
119
140
 
120
141
  export function intersectionObserverShadow(selector: string, options?: IntersectionObserverQueryOptions): MethodDecorator;
121
- export function intersectionObserverShadow(options?: IntersectionObserverQueryOptions): MethodDecorator;
122
- export function intersectionObserverShadow(selectorOrOptions?: string | IntersectionObserverQueryOptions, maybeOptions?: IntersectionObserverQueryOptions): MethodDecorator {
123
- if (typeof selectorOrOptions === 'string' || typeof selectorOrOptions === 'function') {
124
- return intersectionObserver(selectorOrOptions as any, {...maybeOptions ?? {}, root: 'shadow'});
125
- }
126
- return intersectionObserver({...selectorOrOptions ?? {}, root: 'shadow'});
142
+ export function intersectionObserverShadow(options: IntersectionObserverQueryOptions): MethodDecorator;
143
+ export function intersectionObserverShadow(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
144
+ export function intersectionObserverShadow(selectorOrOptionsOrTarget?: string | IntersectionObserverQueryOptions | Object, maybeOptionsOrPropertyKey?: IntersectionObserverQueryOptions | string | symbol, descriptor?: PropertyDescriptor): MethodDecorator | void {
145
+ return dispatchIntersectionObserver(selectorOrOptionsOrTarget as any, maybeOptionsOrPropertyKey as any, descriptor, { root: 'shadow' });
127
146
  }
128
147
 
129
148
  export function intersectionObserverAll(selector: string, options?: IntersectionObserverQueryOptions): MethodDecorator;
130
- export function intersectionObserverAll(options?: IntersectionObserverQueryOptions): MethodDecorator;
131
- export function intersectionObserverAll(selectorOrOptions?: string | IntersectionObserverQueryOptions, maybeOptions?: IntersectionObserverQueryOptions): MethodDecorator {
132
- if (typeof selectorOrOptions === 'string' || typeof selectorOrOptions === 'function') {
133
- return intersectionObserver(selectorOrOptions as any, {...maybeOptions ?? {}, root: 'all'});
134
- }
135
- return intersectionObserver({...selectorOrOptions ?? {}, root: 'all'});
149
+ export function intersectionObserverAll(options: IntersectionObserverQueryOptions): MethodDecorator;
150
+ export function intersectionObserverAll(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
151
+ export function intersectionObserverAll(selectorOrOptionsOrTarget?: string | IntersectionObserverQueryOptions | Object, maybeOptionsOrPropertyKey?: IntersectionObserverQueryOptions | string | symbol, descriptor?: PropertyDescriptor): MethodDecorator | void {
152
+ return dispatchIntersectionObserver(selectorOrOptionsOrTarget as any, maybeOptionsOrPropertyKey as any, descriptor, { root: 'all' });
136
153
  }
137
154
 
138
155
  export function getIntersectionObserverMetadata(target: any): IntersectionObserverMetadata[] | undefined {
139
- const constructor = target instanceof Function ? target : target.constructor;
140
- return ReflectUtils.getMetadata(INTERSECTION_OBSERVER_METADATA_KEY, constructor);
156
+ const constructor = typeof target === 'function' ? target : target.constructor;
157
+ return ReflectUtils.findAllMetadata<any[]>(INTERSECTION_OBSERVER_METADATA_KEY, constructor).flat();
141
158
  }
142
159
 
143
160
  // ─────────────────────────────────────────────────────────────────────────────
@@ -184,11 +201,24 @@ export class IntersectionObserverLifeCycler implements ElementDefineLifeCycler {
184
201
  matchedEls = entries.map(e => e.target as HTMLElement).filter(t => t && t.nodeType === 1);
185
202
  }
186
203
  if (matchedEls.length === 0) continue;
187
- if (m.options.filter) {
188
- if (!m.options.filter(matchedEls, { currentThis: inst, helper: helperHostSet })) continue;
189
- }
190
- const hostSet = SwcUtils.getHostSet(inst);
191
- inst[m.propertyKey](matchedEls, entries, obs, { ...hostSet, $root: root });
204
+ const opts = m.options;
205
+ void (async () => {
206
+ const helper = SwcUtils.getHelperAndHostSet(inst);
207
+ if (opts.filter && !(await opts.filter(matchedEls, { currentThis: inst, helper }))) return;
208
+ const hostSet = SwcUtils.getHostSet(inst);
209
+ const helperSet = SwcUtils.getHelperSet(helperHostSet.$w);
210
+ const legacyArgs = [matchedEls, entries, obs, { ...hostSet, $root: root }];
211
+ const buildArgs = (beforeReturn: any) => buildSwcParameterArgs(inst, m.propertyKey, {
212
+ hostSet, helperHostSet: helper, helperSet, intersectionObserverBeforeReturn: beforeReturn
213
+ }, [...legacyArgs, beforeReturn]);
214
+ let args = buildArgs(undefined);
215
+ if (opts.before) { const br = await opts.before(matchedEls, { currentThis: inst, helper }); args = buildArgs(br); }
216
+ let result: any, error: any;
217
+ try { result = await inst[m.propertyKey](...args); }
218
+ catch (e) { error = e; }
219
+ finally { if (opts.finally) await opts.finally(matchedEls, { currentThis: inst, helper }, { args, result, error }); }
220
+ if (error) throw error;
221
+ })().catch(e => console.error('[SWC] intersectionObserver handler error:', e));
192
222
  }
193
223
  };
194
224
  };
@@ -256,4 +286,4 @@ export class IntersectionObserverLifeCycler implements ElementDefineLifeCycler {
256
286
  }
257
287
  this.removeObserverCallbacksMap.delete(inst);
258
288
  }
259
- }
289
+ }
@@ -19,6 +19,8 @@ export interface OnConnectedAppendChildOptions {
19
19
  // replaceWrap?:{ start: string, end:string},
20
20
  useShadow?: boolean;
21
21
  order?: number;
22
+ // 비동기 렌더가 끝나기 전까지 먼저 보여줄 내용. resolve되면 제거되고 실제 결과가 들어감.
23
+ fallback?: string | ((helper: any) => string | Node | Node[] | DocumentFragment);
22
24
  }
23
25
  export interface OnConnectedAppendChildOptionsMetadata {
24
26
  propertyKey: string | symbol;
@@ -48,7 +50,7 @@ export function onConnectedBefore(target: Object, propertyKey: string | symbol,
48
50
  export function onConnectedBefore(arg1?: OnConnectedOptions | Object, arg2?: string | symbol, arg3?: PropertyDescriptor): MethodDecorator | void {
49
51
  const decorator = (options: OnConnectedOptions, target: Object, propertyKey: string | symbol) => {
50
52
  const constructor = target.constructor;
51
- let list = ReflectUtils.getMetadata<OnConnectedMetadata[]>(ON_BEFORE_CONNECTED_METADATA_KEY, constructor);
53
+ let list = ReflectUtils.getOwnMetadata(ON_BEFORE_CONNECTED_METADATA_KEY, constructor) as OnConnectedMetadata[] | undefined;
52
54
  if (!list) {
53
55
  list = [];
54
56
  ReflectUtils.defineMetadata(ON_BEFORE_CONNECTED_METADATA_KEY, list, constructor);
@@ -70,7 +72,7 @@ export function onConnectedAfter(target: Object, propertyKey: string | symbol, d
70
72
  export function onConnectedAfter(arg1?: OnConnectedOptions | Object, arg2?: string | symbol, arg3?: PropertyDescriptor): MethodDecorator | void {
71
73
  const decorator = (options: OnConnectedOptions, target: Object, propertyKey: string | symbol) => {
72
74
  const constructor = target.constructor;
73
- let list = ReflectUtils.getMetadata<OnConnectedMetadata[]>(ON_AFTER_CONNECTED_METADATA_KEY, constructor);
75
+ let list = ReflectUtils.getOwnMetadata(ON_AFTER_CONNECTED_METADATA_KEY, constructor) as OnConnectedMetadata[] | undefined;
74
76
  if (!list) {
75
77
  list = [];
76
78
  ReflectUtils.defineMetadata(ON_AFTER_CONNECTED_METADATA_KEY, list, constructor);
@@ -116,7 +118,7 @@ export function onConnectedAfter(arg1?: OnConnectedOptions | Object, arg2?: stri
116
118
  // ) as any;
117
119
  // }
118
120
 
119
- // Helper to handle both @decorator and @decorator() syntax
121
+ // Helper: bare @decorator 와 옵션 @decorator({...}) (빈 괄호 @decorator() 는 타입에서 막음)
120
122
  function createLifecycleDecoratorWithOptions(metadataKey: symbol) {
121
123
  return function(optionOrTarget?: LifecycleOptions | Object, propertyKey?: string | symbol): MethodDecorator | void {
122
124
  if (propertyKey) {
@@ -144,19 +146,19 @@ function createLifecycleDecoratorWithOptions(metadataKey: symbol) {
144
146
  };
145
147
  }
146
148
 
147
- export function onInitialize(options?: LifecycleOptions): MethodDecorator;
149
+ export function onInitialize(options: LifecycleOptions): MethodDecorator;
148
150
  export function onInitialize(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
149
151
  export function onInitialize(optionOrTarget?: LifecycleOptions | Object, propertyKey?: string | symbol): MethodDecorator | void {
150
152
  return createLifecycleDecoratorWithOptions(ON_INITIALIZE_METADATA_KEY)(optionOrTarget, propertyKey);
151
153
  }
152
154
 
153
- export function onDisconnectedBefore(options?: LifecycleOptions): MethodDecorator;
155
+ export function onDisconnectedBefore(options: LifecycleOptions): MethodDecorator;
154
156
  export function onDisconnectedBefore(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
155
157
  export function onDisconnectedBefore(optionOrTarget?: LifecycleOptions | Object, propertyKey?: string | symbol): MethodDecorator | void {
156
158
  return createLifecycleDecoratorWithOptions(ON_BEFORE_DISCONNECTED_METADATA_KEY)(optionOrTarget, propertyKey);
157
159
  }
158
160
 
159
- export function onDisconnectedAfter(options?: LifecycleOptions): MethodDecorator;
161
+ export function onDisconnectedAfter(options: LifecycleOptions): MethodDecorator;
160
162
  export function onDisconnectedAfter(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
161
163
  export function onDisconnectedAfter(optionOrTarget?: LifecycleOptions | Object, propertyKey?: string | symbol): MethodDecorator | void {
162
164
  return createLifecycleDecoratorWithOptions(ON_AFTER_DISCONNECTED_METADATA_KEY)(optionOrTarget, propertyKey);
@@ -164,13 +166,13 @@ export function onDisconnectedAfter(optionOrTarget?: LifecycleOptions | Object,
164
166
 
165
167
  export const onDisconnected = onDisconnectedAfter;
166
168
 
167
- export function onAdoptedBefore(options?: LifecycleOptions): MethodDecorator;
169
+ export function onAdoptedBefore(options: LifecycleOptions): MethodDecorator;
168
170
  export function onAdoptedBefore(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
169
171
  export function onAdoptedBefore(optionOrTarget?: LifecycleOptions | Object, propertyKey?: string | symbol): MethodDecorator | void {
170
172
  return createLifecycleDecoratorWithOptions(ON_BEFORE_ADOPTED_METADATA_KEY)(optionOrTarget, propertyKey);
171
173
  }
172
174
 
173
- export function onAdoptedAfter(options?: LifecycleOptions): MethodDecorator;
175
+ export function onAdoptedAfter(options: LifecycleOptions): MethodDecorator;
174
176
  export function onAdoptedAfter(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
175
177
  export function onAdoptedAfter(optionOrTarget?: LifecycleOptions | Object, propertyKey?: string | symbol): MethodDecorator | void {
176
178
  return createLifecycleDecoratorWithOptions(ON_AFTER_ADOPTED_METADATA_KEY)(optionOrTarget, propertyKey);
@@ -178,13 +180,13 @@ export function onAdoptedAfter(optionOrTarget?: LifecycleOptions | Object, prope
178
180
 
179
181
  export const onAdopted = onAdoptedAfter;
180
182
 
181
- export function onConnectedSwcApp(options?: LifecycleOptions): MethodDecorator;
183
+ export function onConnectedSwcApp(options: LifecycleOptions): MethodDecorator;
182
184
  export function onConnectedSwcApp(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
183
185
  export function onConnectedSwcApp(optionOrTarget?: LifecycleOptions | Object, propertyKey?: string | symbol): MethodDecorator | void {
184
186
  return createLifecycleDecoratorWithOptions(ON_CONNECTED_SWC_APP_METADATA_KEY)(optionOrTarget, propertyKey);
185
187
  }
186
188
 
187
- export function onConnectedCompleted(options?: LifecycleOptions): MethodDecorator;
189
+ export function onConnectedCompleted(options: LifecycleOptions): MethodDecorator;
188
190
  export function onConnectedCompleted(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;
189
191
  export function onConnectedCompleted(optionOrTarget?: LifecycleOptions | Object, propertyKey?: string | symbol): MethodDecorator | void {
190
192
  return createLifecycleDecoratorWithOptions(ON_CONNECTED_COMPLETED_METADATA_KEY)(optionOrTarget, propertyKey);
@@ -196,7 +198,7 @@ export function onConnectedCompleted(optionOrTarget?: LifecycleOptions | Object,
196
198
 
197
199
  const decorator = (options: OnConnectedAppendChildOptions, target: Object, propertyKey: string | symbol) => {
198
200
  const constructor = target.constructor;
199
- let list = ReflectUtils.getMetadata<OnConnectedAppendChildOptionsMetadata[]>(ON_CONNECTED_BODY_METADATA_KEY, constructor);
201
+ let list = ReflectUtils.getOwnMetadata(ON_CONNECTED_BODY_METADATA_KEY, constructor) as OnConnectedAppendChildOptionsMetadata[] | undefined;
200
202
  if (!list) {
201
203
  list = [];
202
204
  ReflectUtils.defineMetadata(ON_CONNECTED_BODY_METADATA_KEY, list, constructor);
@@ -210,7 +212,7 @@ export function onConnectedBodyShadow(optionOrTarget: Omit<OnConnectedAppendChil
210
212
  if (propertyKey) { // no parameter option @decorator
211
213
  return decorator({useShadow: true}, optionOrTarget!, propertyKey);
212
214
  }
213
- // parameter option @decorator()
215
+ // parameter option @decorator({...})
214
216
  return (target: Object, propertyKey: string | symbol) => {
215
217
  decorator({...optionOrTarget??{}, useShadow: true}, target, propertyKey);
216
218
  };
@@ -222,7 +224,7 @@ export function onConnectedBodyLight(optionOrTarget: Omit<OnConnectedAppendChild
222
224
  if (propertyKey) { // no parameter option @decorator
223
225
  return decorator({useShadow: false}, optionOrTarget!, propertyKey);
224
226
  }
225
- // parameter option @decorator()
227
+ // parameter option @decorator({...})
226
228
  return (target: Object, propertyKey: string | symbol) => {
227
229
  decorator({...optionOrTarget??{}, useShadow: false}, target, propertyKey);
228
230
  };
@@ -233,7 +235,7 @@ export function onConnectedBody(optionOrTarget: OnConnectedAppendChildOptions |
233
235
  if (propertyKey) { // no parameter option @decorator
234
236
  return decorator({}, optionOrTarget!, propertyKey);
235
237
  }
236
- // parameter option @decorator()
238
+ // parameter option @decorator({...})
237
239
  return (target: Object, propertyKey: string | symbol) => {
238
240
  decorator((optionOrTarget as OnConnectedAppendChildOptions) || {}, target, propertyKey);
239
241
  };
@@ -243,15 +245,15 @@ export function onConnectedBody(optionOrTarget: OnConnectedAppendChildOptions |
243
245
  * 프로토타입 체인을 순회하며 모든 라이프사이클 메서드를 수집합니다.
244
246
  */
245
247
  export const findAllLifecycleMetadata = (target: any, metadataKey: symbol): LifecycleMetadata[] => {
246
- const constructor = target instanceof Function ? target : target.constructor;
247
- const results = ReflectUtils.getOwnMetadata(metadataKey, constructor) as LifecycleMetadata[] ?? [];
248
+ const constructor = typeof target === 'function' ? target : target.constructor;
249
+ const results = ReflectUtils.findAllMetadata<LifecycleMetadata[]>(metadataKey, constructor).flat();
248
250
  // Sort by order (default 0 if not specified)
249
251
  return [...results].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
250
252
  };
251
253
 
252
254
  export const findAllOnConnectedMetadata = (target: any): OnConnectedAppendChildOptionsMetadata[] => {
253
- const constructor = target instanceof Function ? target : target.constructor;
254
- const results = ReflectUtils.getMetadata<OnConnectedAppendChildOptionsMetadata[]>(ON_CONNECTED_BODY_METADATA_KEY, constructor) ?? [];
255
+ const constructor = typeof target === 'function' ? target : target.constructor;
256
+ const results = ReflectUtils.findAllMetadata<OnConnectedAppendChildOptionsMetadata[]>(ON_CONNECTED_BODY_METADATA_KEY, constructor).flat();
255
257
  // Sort by order (default 0 if not specified)
256
258
  return [...results].sort((a, b) => {
257
259
  const orderA = a.options?.order ?? 0;
@@ -261,15 +263,15 @@ export const findAllOnConnectedMetadata = (target: any): OnConnectedAppendChildO
261
263
  };
262
264
 
263
265
  export const findAllOnConnectedBeforeMetadata = (target: any): OnConnectedMetadata[] => {
264
- const constructor = target instanceof Function ? target : target.constructor;
265
- const results = ReflectUtils.getMetadata<OnConnectedMetadata[]>(ON_BEFORE_CONNECTED_METADATA_KEY, constructor) ?? [];
266
+ const constructor = typeof target === 'function' ? target : target.constructor;
267
+ const results = ReflectUtils.findAllMetadata<OnConnectedMetadata[]>(ON_BEFORE_CONNECTED_METADATA_KEY, constructor).flat();
266
268
  // Sort by order
267
269
  return [...results].sort((a, b) => (a.options?.order ?? 0) - (b.options?.order ?? 0));
268
270
  };
269
271
 
270
272
  export const findAllOnConnectedAfterMetadata = (target: any): OnConnectedMetadata[] => {
271
- const constructor = target instanceof Function ? target : target.constructor;
272
- const results = ReflectUtils.getMetadata<OnConnectedMetadata[]>(ON_AFTER_CONNECTED_METADATA_KEY, constructor) ?? [];
273
+ const constructor = typeof target === 'function' ? target : target.constructor;
274
+ const results = ReflectUtils.findAllMetadata<OnConnectedMetadata[]>(ON_AFTER_CONNECTED_METADATA_KEY, constructor).flat();
273
275
  // Sort by order
274
276
  return [...results].sort((a, b) => (a.options?.order ?? 0) - (b.options?.order ?? 0));
275
277
  };