@dooboostore/simple-web-component 1.0.46 → 1.0.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +109 -11
  2. package/dist/cjs/bundle-entry.js +22 -0
  3. package/dist/cjs/bundle-entry.js.map +2 -2
  4. package/dist/cjs/decorators/addEventListener.js +45 -7
  5. package/dist/cjs/decorators/addEventListener.js.map +2 -2
  6. package/dist/cjs/decorators/elementDefine.js +225 -6
  7. package/dist/cjs/decorators/elementDefine.js.map +3 -3
  8. package/dist/cjs/decorators/index.js +2 -0
  9. package/dist/cjs/decorators/index.js.map +2 -2
  10. package/dist/cjs/decorators/mutationObserver.js +104 -0
  11. package/dist/cjs/decorators/mutationObserver.js.map +7 -0
  12. package/dist/cjs/decorators/query.js +13 -1
  13. package/dist/cjs/decorators/query.js.map +2 -2
  14. package/dist/cjs/decorators/resizeObserver.js +104 -0
  15. package/dist/cjs/decorators/resizeObserver.js.map +7 -0
  16. package/dist/cjs/examples/RxJSOperatorsExample.js +285 -0
  17. package/dist/cjs/examples/RxJSOperatorsExample.js.map +7 -0
  18. package/dist/esm/bundle-entry.js +8 -0
  19. package/dist/esm/bundle-entry.js.map +2 -2
  20. package/dist/esm/decorators/addEventListener.js +45 -7
  21. package/dist/esm/decorators/addEventListener.js.map +2 -2
  22. package/dist/esm/decorators/elementDefine.js +225 -6
  23. package/dist/esm/decorators/elementDefine.js.map +3 -3
  24. package/dist/esm/decorators/index.js +2 -0
  25. package/dist/esm/decorators/index.js.map +2 -2
  26. package/dist/esm/decorators/mutationObserver.js +85 -0
  27. package/dist/esm/decorators/mutationObserver.js.map +7 -0
  28. package/dist/esm/decorators/query.js +13 -1
  29. package/dist/esm/decorators/query.js.map +2 -2
  30. package/dist/esm/decorators/resizeObserver.js +85 -0
  31. package/dist/esm/decorators/resizeObserver.js.map +7 -0
  32. package/dist/esm/examples/RxJSOperatorsExample.js +266 -0
  33. package/dist/esm/examples/RxJSOperatorsExample.js.map +7 -0
  34. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +5869 -157
  35. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  36. package/dist/types/bundle-entry.d.ts +3 -0
  37. package/dist/types/bundle-entry.d.ts.map +1 -1
  38. package/dist/types/decorators/addEventListener.d.ts +24 -5
  39. package/dist/types/decorators/addEventListener.d.ts.map +1 -1
  40. package/dist/types/decorators/elementDefine.d.ts +14 -0
  41. package/dist/types/decorators/elementDefine.d.ts.map +1 -1
  42. package/dist/types/decorators/index.d.ts +2 -0
  43. package/dist/types/decorators/index.d.ts.map +1 -1
  44. package/dist/types/decorators/mutationObserver.d.ts +36 -0
  45. package/dist/types/decorators/mutationObserver.d.ts.map +1 -0
  46. package/dist/types/decorators/query.d.ts +12 -0
  47. package/dist/types/decorators/query.d.ts.map +1 -1
  48. package/dist/types/decorators/resizeObserver.d.ts +37 -0
  49. package/dist/types/decorators/resizeObserver.d.ts.map +1 -0
  50. package/dist/types/examples/RxJSOperatorsExample.d.ts +94 -0
  51. package/dist/types/examples/RxJSOperatorsExample.d.ts.map +1 -0
  52. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +5886 -178
  53. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  54. package/package.json +7 -8
  55. package/src/bundle-entry.ts +8 -0
  56. package/src/decorators/addEventListener.ts +52 -9
  57. package/src/decorators/elementDefine.ts +330 -47
  58. package/src/decorators/index.ts +2 -0
  59. package/src/decorators/mutationObserver.ts +128 -0
  60. package/src/decorators/query.ts +23 -0
  61. package/src/decorators/resizeObserver.ts +129 -0
  62. package/src/examples/RxJSOperatorsExample.ts +279 -0
  63. package/dist/cjs/elements/tt/SwcAppMixin.js +0 -1
  64. package/dist/cjs/elements/tt/SwcAppMixin.js.map +0 -7
  65. package/dist/cjs/elements/tt/SwcAsync.js +0 -1
  66. package/dist/cjs/elements/tt/SwcAsync.js.map +0 -7
  67. package/dist/cjs/elements/tt/SwcAsyncTemplate.js +0 -1
  68. package/dist/cjs/elements/tt/SwcAsyncTemplate.js.map +0 -7
  69. package/dist/cjs/elements/tt/SwcChoose.js +0 -1
  70. package/dist/cjs/elements/tt/SwcChoose.js.map +0 -7
  71. package/dist/cjs/elements/tt/SwcChooseTemplate.js +0 -1
  72. package/dist/cjs/elements/tt/SwcChooseTemplate.js.map +0 -7
  73. package/dist/cjs/elements/tt/SwcIf.js +0 -1
  74. package/dist/cjs/elements/tt/SwcIf.js.map +0 -7
  75. package/dist/cjs/elements/tt/SwcIfTemplate.js +0 -1
  76. package/dist/cjs/elements/tt/SwcIfTemplate.js.map +0 -7
  77. package/dist/cjs/elements/tt/SwcLoop.js +0 -1
  78. package/dist/cjs/elements/tt/SwcLoop.js.map +0 -7
  79. package/dist/cjs/elements/tt/SwcLoopTemplate.js +0 -1
  80. package/dist/cjs/elements/tt/SwcLoopTemplate.js.map +0 -7
  81. package/dist/cjs/elements/tt/SwcSubTemplates.js +0 -1
  82. package/dist/cjs/elements/tt/SwcSubTemplates.js.map +0 -7
  83. package/dist/cjs/elements/tt/register.js +0 -1
  84. package/dist/cjs/elements/tt/register.js.map +0 -7
  85. package/dist/esm/elements/tt/SwcAppMixin.js +0 -1
  86. package/dist/esm/elements/tt/SwcAppMixin.js.map +0 -7
  87. package/dist/esm/elements/tt/SwcAsync.js +0 -1
  88. package/dist/esm/elements/tt/SwcAsync.js.map +0 -7
  89. package/dist/esm/elements/tt/SwcAsyncTemplate.js +0 -1
  90. package/dist/esm/elements/tt/SwcAsyncTemplate.js.map +0 -7
  91. package/dist/esm/elements/tt/SwcChoose.js +0 -1
  92. package/dist/esm/elements/tt/SwcChoose.js.map +0 -7
  93. package/dist/esm/elements/tt/SwcChooseTemplate.js +0 -1
  94. package/dist/esm/elements/tt/SwcChooseTemplate.js.map +0 -7
  95. package/dist/esm/elements/tt/SwcIf.js +0 -1
  96. package/dist/esm/elements/tt/SwcIf.js.map +0 -7
  97. package/dist/esm/elements/tt/SwcIfTemplate.js +0 -1
  98. package/dist/esm/elements/tt/SwcIfTemplate.js.map +0 -7
  99. package/dist/esm/elements/tt/SwcLoop.js +0 -1
  100. package/dist/esm/elements/tt/SwcLoop.js.map +0 -7
  101. package/dist/esm/elements/tt/SwcLoopTemplate.js +0 -1
  102. package/dist/esm/elements/tt/SwcLoopTemplate.js.map +0 -7
  103. package/dist/esm/elements/tt/SwcSubTemplates.js +0 -1
  104. package/dist/esm/elements/tt/SwcSubTemplates.js.map +0 -7
  105. package/dist/esm/elements/tt/register.js +0 -1
  106. package/dist/esm/elements/tt/register.js.map +0 -7
  107. package/dist/types/elements/tt/SwcAppMixin.d.ts +0 -1
  108. package/dist/types/elements/tt/SwcAppMixin.d.ts.map +0 -1
  109. package/dist/types/elements/tt/SwcAsync.d.ts +0 -1
  110. package/dist/types/elements/tt/SwcAsync.d.ts.map +0 -1
  111. package/dist/types/elements/tt/SwcAsyncTemplate.d.ts +0 -1
  112. package/dist/types/elements/tt/SwcAsyncTemplate.d.ts.map +0 -1
  113. package/dist/types/elements/tt/SwcChoose.d.ts +0 -1
  114. package/dist/types/elements/tt/SwcChoose.d.ts.map +0 -1
  115. package/dist/types/elements/tt/SwcChooseTemplate.d.ts +0 -1
  116. package/dist/types/elements/tt/SwcChooseTemplate.d.ts.map +0 -1
  117. package/dist/types/elements/tt/SwcIf.d.ts +0 -1
  118. package/dist/types/elements/tt/SwcIf.d.ts.map +0 -1
  119. package/dist/types/elements/tt/SwcIfTemplate.d.ts +0 -1
  120. package/dist/types/elements/tt/SwcIfTemplate.d.ts.map +0 -1
  121. package/dist/types/elements/tt/SwcLoop.d.ts +0 -1
  122. package/dist/types/elements/tt/SwcLoop.d.ts.map +0 -1
  123. package/dist/types/elements/tt/SwcLoopTemplate.d.ts +0 -1
  124. package/dist/types/elements/tt/SwcLoopTemplate.d.ts.map +0 -1
  125. package/dist/types/elements/tt/SwcSubTemplates.d.ts +0 -1
  126. package/dist/types/elements/tt/SwcSubTemplates.d.ts.map +0 -1
  127. package/dist/types/elements/tt/register.d.ts +0 -1
  128. package/dist/types/elements/tt/register.d.ts.map +0 -1
  129. package/src/elements/tt/SwcAppMixin.ts +0 -13
  130. package/src/elements/tt/SwcAsync.ts +0 -139
  131. package/src/elements/tt/SwcAsyncTemplate.ts +0 -126
  132. package/src/elements/tt/SwcChoose.ts +0 -182
  133. package/src/elements/tt/SwcChooseTemplate.ts +0 -229
  134. package/src/elements/tt/SwcIf.ts +0 -145
  135. package/src/elements/tt/SwcIfTemplate.ts +0 -158
  136. package/src/elements/tt/SwcLoop.ts +0 -222
  137. package/src/elements/tt/SwcLoopTemplate.ts +0 -255
  138. package/src/elements/tt/SwcSubTemplates.ts +0 -6
  139. package/src/elements/tt/register.ts +0 -720
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/decorators/addEventListener.ts"],
4
- "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core';\nimport { SpecialSelector, SwcQueryOptions, HelperHostSet } from '../types';\n\nexport interface AddEventListenerBaseOptions<TEvent extends Event = Event> extends EventListenerOptions {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n stopPropagation?: boolean;\n stopImmediatePropagation?: boolean;\n preventDefault?: boolean;\n // removeOnDisconnected?: boolean;\n delegate?: boolean;\n filter?: (target: Event | CustomEvent, meta:{currentThis: any, helper: HelperHostSet}) => boolean;\n // RxJS operator options\n debounceTime?: number;\n throttleTime?: number;\n distinctUntilChanged?: boolean | ((prev: TEvent, curr: TEvent) => boolean);\n}\n\nexport type EventListenerSelector = string | ((currentThis: any, helper: HelperHostSet) => NodeList | Element | Element[] | null);\n\nexport interface AddEventListenerMetadata<TEvent extends Event = Event> {\n propertyKey: string | symbol;\n selector: EventListenerSelector;\n type: string;\n options: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean };\n}\n\nexport const ADD_EVENT_LISTENER_METADATA_KEY = Symbol.for('simple-web-component:add-event-listener');\n\nexport function addEventListener<TEvent extends Event = Event>(target: SpecialSelector, type: string, options?: AddEventListenerBaseOptions<TEvent>): MethodDecorator;\nexport function addEventListener<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }): MethodDecorator;\n/**\n * @addEventListener decorator to bind events to elements.\n */\nexport function addEventListener<TEvent extends Event = Event>(selectorOrTarget: EventListenerSelector, type: string, options: any = {}): MethodDecorator {\n return (targetObj: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const constructor = targetObj.constructor;\n\n let listeners = ReflectUtils.getMetadata<AddEventListenerMetadata<TEvent>[]>(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n if (!listeners) {\n listeners = [];\n ReflectUtils.defineMetadata(ADD_EVENT_LISTENER_METADATA_KEY, listeners, constructor);\n }\n\n listeners.push({ propertyKey, selector: selectorOrTarget, type, options });\n };\n}\n\n\nexport function addEventListenerDelegateLightDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'light', delegate: true});\n}\n\nexport function addEventListenerDelegateShadowDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'shadow', delegate: true});\n}\nexport function addEventListenerDelegateAllDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'all', delegate: true});\n}\nexport function addEventListenerDelegate<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'auto', delegate: true});\n}\n\n/**\n * @addEventListenerThis decorator - simplified version of @addEventListener for $this selector\n */\n\n// --- Aliases: event... ---\nexport const event = addEventListener;\nexport const eventDelegateLightDom = addEventListenerDelegateLightDom;\nexport const eventDelegateShadowDom = addEventListenerDelegateShadowDom;\nexport const eventDelegateAllDom = addEventListenerDelegateAllDom;\nexport const eventDelegate = addEventListenerDelegate;\nexport function addEventListenerThis<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$this', type, options);\n}\n\n/**\n * @addEventListenerAppHost decorator - simplified version of @addEventListener for $appHost selector\n */\nexport function addEventListenerAppHost<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$appHost', type, options);\n}\n\nexport function addEventListenerWindow<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$window', type, options);\n}\nexport function addEventListenerDocument<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$document', type, options);\n}\n\nexport const getAddEventListenerMetadata = (target: any): AddEventListenerMetadata<Event>[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n};\n"],
5
- "mappings": "AAAA,SAAS,oBAAoB;AA4BtB,MAAM,kCAAkC,OAAO,IAAI,yCAAyC;AAO5F,SAAS,iBAA+C,kBAAyC,MAAc,UAAe,CAAC,GAAoB;AACxJ,SAAO,CAAC,WAAmB,aAA8B,eAAmC;AAC1F,UAAM,cAAc,UAAU;AAE9B,QAAI,YAAY,aAAa,YAAgD,iCAAiC,WAAW;AACzH,QAAI,CAAC,WAAW;AACd,kBAAY,CAAC;AACb,mBAAa,eAAe,iCAAiC,WAAW,WAAW;AAAA,IACrF;AAEA,cAAU,KAAK,EAAE,aAAa,UAAU,kBAAkB,MAAM,QAAQ,CAAC;AAAA,EAC3E;AACF;AAGO,SAAS,iCAA+D,UAAiC,MAAc,SAAkF;AAC9M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,SAAS,UAAU,KAAI,CAAC;AAChG;AAEO,SAAS,kCAAgE,UAAiC,MAAc,SAAkF;AAC/M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,UAAU,UAAU,KAAI,CAAC;AACjG;AACO,SAAS,+BAA6D,UAAiC,MAAc,SAAkF;AAC5M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,OAAO,UAAU,KAAI,CAAC;AAC9F;AACO,SAAS,yBAAuD,UAAiC,MAAc,SAAkF;AACtM,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,QAAQ,UAAU,KAAI,CAAC;AAC/F;AAOO,MAAM,QAAQ;AACd,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,sBAAsB;AAC5B,MAAM,gBAAgB;AACtB,SAAS,qBAAmD,MAAc,SAAkF;AACjK,SAAO,iBAAyB,SAAS,MAAM,OAAO;AACxD;AAKO,SAAS,wBAAsD,MAAc,SAAkF;AACpK,SAAO,iBAAyB,YAAY,MAAM,OAAO;AAC3D;AAEO,SAAS,uBAAqD,MAAc,SAAkF;AACnK,SAAO,iBAAyB,WAAW,MAAM,OAAO;AAC1D;AACO,SAAS,yBAAuD,MAAc,SAAkF;AACrK,SAAO,iBAAyB,aAAa,MAAM,OAAO;AAC5D;AAEO,MAAM,8BAA8B,CAAC,WAA+D;AACzG,QAAM,cAAc,kBAAkB,WAAW,SAAS,OAAO;AACjE,SAAO,aAAa,YAAY,iCAAiC,WAAW;AAC9E;",
4
+ "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core';\nimport { SpecialSelector, SwcQueryOptions, HelperHostSet } from '../types';\n\nexport interface AddEventListenerBaseOptions<TEvent extends Event = Event> extends EventListenerOptions {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n stopPropagation?: boolean;\n stopImmediatePropagation?: boolean;\n preventDefault?: boolean;\n // removeOnDisconnected?: boolean;\n delegate?: boolean;\n filter?: (target: Event | CustomEvent, meta:{currentThis: any, helper: HelperHostSet}) => boolean;\n // \uB9AC\uC2A4\uB108 \uC81C\uAC70(disconnected \uB610\uB294 unmount) \uC2DC \uD638\uCD9C\uB418\uB294 \uCF5C\uBC31. \uCCAB \uBC88\uC9F8 \uC778\uC790\uB294 \uBC14\uC778\uB529\uB41C \uD0C0\uAC9F element, \uB450 \uBC88\uC9F8\uB294 \uC774 \uC635\uC158\uC774 \uC18D\uD55C \uC804\uCCB4 \uC635\uC158 \uAC1D\uCCB4(Base + SwcQuery + delegate).\n removeListener?: (target: Element, optionValue: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }) => void;\n // RxJS operator options\n debounceTime?: number;\n throttleTime?: number;\n distinctUntilChanged?: boolean | ((prev: TEvent, curr: TEvent) => boolean);\n}\n\nexport type EventListenerSelector = string | ((currentThis: any, helper: HelperHostSet) => NodeList | Element | Element[] | null);\n\nexport interface AddEventListenerMetadata<TEvent extends Event = Event> {\n propertyKey: string | symbol;\n selector: EventListenerSelector;\n type: string;\n options: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean };\n}\n\nexport const ADD_EVENT_LISTENER_METADATA_KEY = Symbol.for('simple-web-component:add-event-listener');\n\nexport function addEventListener<TEvent extends Event = Event>(target: SpecialSelector, type: string, options?: AddEventListenerBaseOptions<TEvent>): MethodDecorator;\nexport function addEventListener<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }): MethodDecorator;\n/**\n * @addEventListener(type, options?) \u2014 \uC140\uB809\uD130 \uC0DD\uB7B5 \uC2DC $this(\uCEF4\uD3EC\uB10C\uD2B8 \uC790\uC2E0)\uB85C \uBC14\uC778\uB529\n */\nexport function addEventListener<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }): MethodDecorator;\n/**\n * @addEventListener decorator to bind events to elements.\n */\nexport function addEventListener<TEvent extends Event = Event>(selectorOrType: EventListenerSelector | string, typeOrOptions?: string | (AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }), maybeOptions?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }): MethodDecorator {\n return (targetObj: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n let selector: EventListenerSelector;\n let type: string;\n let opts: any = {};\n\n if (typeof typeOrOptions === 'string') {\n // (selector, type[, options]) form \u2014 \uAE30\uC874 \uD638\uD658\n selector = selectorOrType as EventListenerSelector;\n type = typeOrOptions;\n opts = maybeOptions ?? {};\n } else {\n // (type[, options]) form \u2014 selector \uAE30\uBCF8\uAC12 $this\n selector = '$this';\n type = selectorOrType as string;\n opts = typeOrOptions ?? {};\n }\n\n const constructor = targetObj.constructor;\n\n let listeners = ReflectUtils.getMetadata<AddEventListenerMetadata<TEvent>[]>(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n if (!listeners) {\n listeners = [];\n ReflectUtils.defineMetadata(ADD_EVENT_LISTENER_METADATA_KEY, listeners, constructor);\n }\n\n listeners.push({ propertyKey, selector, type, options: opts });\n };\n}\n\n\nexport function addEventListenerDelegateLightDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'light', delegate: true});\n}\n\nexport function addEventListenerDelegateShadowDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'shadow', delegate: true});\n}\nexport function addEventListenerDelegateAllDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'all', delegate: true});\n}\nexport function addEventListenerDelegate<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'auto', delegate: true});\n}\n\n// \u2500\u2500\u2500 root\uBCC4 \uC77C\uBC18 \uD5EC\uD37C (delegate \uC5C6\uC74C) \u2500\u2500\u2500\n\nexport function addEventListenerLightDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: AddEventListenerBaseOptions<TEvent>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'light'});\n}\n\nexport function addEventListenerShadowDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: AddEventListenerBaseOptions<TEvent>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'shadow'});\n}\n\nexport function addEventListenerAllDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: AddEventListenerBaseOptions<TEvent>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'all'});\n}\n\n/**\n * @addEventListenerThis decorator - simplified version of @addEventListener for $this selector\n */\nexport function addEventListenerThis<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$this', type, options);\n}\n\n/**\n * @addEventListenerAppHost decorator - simplified version of @addEventListener for $appHost selector\n */\nexport function addEventListenerAppHost<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$appHost', type, options);\n}\n\nexport function addEventListenerWindow<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$window', type, options);\n}\nexport function addEventListenerDocument<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$document', type, options);\n}\n\n// --- Aliases: event... ---\nexport const event = addEventListener;\nexport const eventDelegateLightDom = addEventListenerDelegateLightDom;\nexport const eventDelegateShadowDom = addEventListenerDelegateShadowDom;\nexport const eventDelegateAllDom = addEventListenerDelegateAllDom;\nexport const eventDelegate = addEventListenerDelegate;\nexport const eventLightDom = addEventListenerLightDom;\nexport const eventShadowDom = addEventListenerShadowDom;\nexport const eventAllDom = addEventListenerAllDom;\nexport const eventAppHost = addEventListenerAppHost;\nexport const eventWindow = addEventListenerWindow;\nexport const eventDocument = addEventListenerDocument;\nexport const eventThis = addEventListenerThis;\n\nexport const getAddEventListenerMetadata = (target: any): AddEventListenerMetadata<Event>[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n};\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AA8BtB,MAAM,kCAAkC,OAAO,IAAI,yCAAyC;AAW5F,SAAS,iBAA+C,gBAAgD,eAA2G,cAAgH;AACxU,SAAO,CAAC,WAAmB,aAA8B,eAAmC;AAC1F,QAAI;AACJ,QAAI;AACJ,QAAI,OAAY,CAAC;AAEjB,QAAI,OAAO,kBAAkB,UAAU;AAErC,iBAAW;AACX,aAAO;AACP,aAAO,gBAAgB,CAAC;AAAA,IAC1B,OAAO;AAEL,iBAAW;AACX,aAAO;AACP,aAAO,iBAAiB,CAAC;AAAA,IAC3B;AAEA,UAAM,cAAc,UAAU;AAE9B,QAAI,YAAY,aAAa,YAAgD,iCAAiC,WAAW;AACzH,QAAI,CAAC,WAAW;AACd,kBAAY,CAAC;AACb,mBAAa,eAAe,iCAAiC,WAAW,WAAW;AAAA,IACrF;AAEA,cAAU,KAAK,EAAE,aAAa,UAAU,MAAM,SAAS,KAAK,CAAC;AAAA,EAC/D;AACF;AAGO,SAAS,iCAA+D,UAAiC,MAAc,SAAkF;AAC9M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,SAAS,UAAU,KAAI,CAAC;AAChG;AAEO,SAAS,kCAAgE,UAAiC,MAAc,SAAkF;AAC/M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,UAAU,UAAU,KAAI,CAAC;AACjG;AACO,SAAS,+BAA6D,UAAiC,MAAc,SAAkF;AAC5M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,OAAO,UAAU,KAAI,CAAC;AAC9F;AACO,SAAS,yBAAuD,UAAiC,MAAc,SAAkF;AACtM,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,QAAQ,UAAU,KAAI,CAAC;AAC/F;AAIO,SAAS,yBAAuD,UAAiC,MAAc,SAAgE;AACpL,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,QAAO,CAAC;AAChF;AAEO,SAAS,0BAAwD,UAAiC,MAAc,SAAgE;AACrL,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,SAAQ,CAAC;AACjF;AAEO,SAAS,uBAAqD,UAAiC,MAAc,SAAgE;AAClL,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,MAAK,CAAC;AAC9E;AAKO,SAAS,qBAAmD,MAAc,SAAkF;AACjK,SAAO,iBAAyB,SAAS,MAAM,OAAO;AACxD;AAKO,SAAS,wBAAsD,MAAc,SAAkF;AACpK,SAAO,iBAAyB,YAAY,MAAM,OAAO;AAC3D;AAEO,SAAS,uBAAqD,MAAc,SAAkF;AACnK,SAAO,iBAAyB,WAAW,MAAM,OAAO;AAC1D;AACO,SAAS,yBAAuD,MAAc,SAAkF;AACrK,SAAO,iBAAyB,aAAa,MAAM,OAAO;AAC5D;AAGO,MAAM,QAAQ;AACd,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,sBAAsB;AAC5B,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AACvB,MAAM,cAAc;AACpB,MAAM,eAAe;AACrB,MAAM,cAAc;AACpB,MAAM,gBAAgB;AACtB,MAAM,YAAY;AAElB,MAAM,8BAA8B,CAAC,WAA+D;AACzG,QAAM,cAAc,kBAAkB,WAAW,SAAS,OAAO;AACjE,SAAO,aAAa,YAAY,iCAAiC,WAAW;AAC9E;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,8 @@
1
1
  import { ActionExpression, FunctionUtils, ReflectUtils, Subject } from "@dooboostore/core";
2
2
  import { debounceTime, distinctUntilChanged, throttleTime } from "@dooboostore/core/message/operators";
3
3
  import { getAddEventListenerMetadata } from "./addEventListener.js";
4
+ import { getMutationObserverMetadata } from "./mutationObserver.js";
5
+ import { getResizeObserverMetadata } from "./resizeObserver.js";
4
6
  import { findAllLifecycleMetadata, findAllOnConnectedAfterMetadata, findAllOnConnectedBeforeMetadata, findAllOnConnectedMetadata, ON_AFTER_ADOPTED_METADATA_KEY, ON_AFTER_DISCONNECTED_METADATA_KEY, ON_BEFORE_ADOPTED_METADATA_KEY, ON_BEFORE_DISCONNECTED_METADATA_KEY, ON_CONNECTED_COMPLETED_METADATA_KEY, ON_INITIALIZE_METADATA_KEY } from "./lifecycles.js";
5
7
  import { getEmitCustomEventMetadataList } from "./emitCustomEvent.js";
6
8
  import { convertAttributeValue, findAllAttributeChangedMetadata } from "./changedAttribute.js";
@@ -24,7 +26,6 @@ const ensureInit = (inst) => {
24
26
  if (!inst.__swc_initialized) {
25
27
  inst._swcId = inst?.getAttribute?.("swc-use-ssr") ?? "s" + Math.random().toString(36).substring(2, 11).toLowerCase();
26
28
  inst._emitHandlers = /* @__PURE__ */ new Map();
27
- inst._boundListeners = [];
28
29
  inst.__swc_initialized = true;
29
30
  const target = inst instanceof Function ? inst : inst.constructor;
30
31
  const attributeAllList = findAllAttributeMetadata(target).filter((it) => it.type === "property");
@@ -226,6 +227,8 @@ const elementDefine = (name, config = {}) => (constructor) => {
226
227
  const emitCustomEventList = getEmitCustomEventMetadataList(constructor) || [];
227
228
  const emitHostCustomEventList = emitCustomEventList.filter((meta) => meta.selector === "$this" || meta.selector === "");
228
229
  const addEventListenerList = getAddEventListenerMetadata(constructor) || [];
230
+ const mutationObserverList = getMutationObserverMetadata(constructor) || [];
231
+ const resizeObserverList = getResizeObserverMetadata(constructor) || [];
229
232
  const attrChangeMap = findAllAttributeChangedMetadata(constructor);
230
233
  const attributeList = findAllAttributeMetadata(constructor);
231
234
  const applyAttributeMap = findAllAttributeApplyMetadata(constructor);
@@ -238,9 +241,18 @@ const elementDefine = (name, config = {}) => (constructor) => {
238
241
  const proto = constructor.prototype;
239
242
  setupPrototype(proto, win);
240
243
  let helperHostSet = null;
244
+ let boundListeners = [];
245
+ let shadowMutationObserver = null;
246
+ let lightMutationObserver = null;
247
+ let resizeObserver = null;
248
+ let resizeObservers = [];
249
+ let removeObserverCallbacks = [];
241
250
  const originalConnected = proto.connectedCallback;
242
251
  proto.connectedCallback = async function() {
243
252
  ensureInit(this);
253
+ boundListeners = [];
254
+ resizeObservers = [];
255
+ removeObserverCallbacks = [];
244
256
  helperHostSet = SwcUtils.getHelperAndHostSet(win, this);
245
257
  const appHost = helperHostSet.$appHost;
246
258
  const useSsr = isSSR(this);
@@ -369,7 +381,13 @@ const elementDefine = (name, config = {}) => (constructor) => {
369
381
  }
370
382
  };
371
383
  br.addEventListener(type, unifiedHandler, opts);
372
- this._boundListeners.push({ target: br, type, handler: unifiedHandler, options: opts });
384
+ const onRemoves = [];
385
+ for (const m of sortedMetaList) {
386
+ if (m.options.removeListener) {
387
+ onRemoves.push({ fn: m.options.removeListener, opts: m.options });
388
+ }
389
+ }
390
+ boundListeners.push({ target: br, type, handler: unifiedHandler, options: opts, onRemoves });
373
391
  });
374
392
  });
375
393
  nonDelegateListeners.forEach((meta) => {
@@ -469,9 +487,181 @@ const elementDefine = (name, config = {}) => (constructor) => {
469
487
  eventSubject.next(event);
470
488
  };
471
489
  t.addEventListener(type, wrappedHandler, opts);
472
- this._boundListeners.push({ target: t, type, handler: wrappedHandler, options: opts, subscription });
490
+ const onRemoves = options.removeListener ? [{ fn: options.removeListener, opts }] : [];
491
+ boundListeners.push({ target: t, type, handler: wrappedHandler, options: opts, subscription, onRemoves });
492
+ });
493
+ });
494
+ shadowMutationObserver = null;
495
+ lightMutationObserver = null;
496
+ resizeObserver = null;
497
+ if (resizeObserverList.length > 0) {
498
+ const root2 = this.shadowRoot || this;
499
+ resizeObserver = new ResizeObserver((entries, obs) => {
500
+ for (const m of resizeObserverList) {
501
+ let matchedEls = [];
502
+ if (m.options.delegate && typeof m.selector === "string") {
503
+ const isThis = m.selector === "$this" || m.selector === "";
504
+ const matchesSel = (node) => {
505
+ if (!node || node.nodeType !== 1) return false;
506
+ if (isThis) return true;
507
+ const el = node;
508
+ return el.matches?.(m.selector) || !!el.closest?.(m.selector);
509
+ };
510
+ matchedEls = entries.map((e) => e.target).filter(matchesSel);
511
+ } else {
512
+ matchedEls = entries.map((e) => e.target).filter((t) => t && t.nodeType === 1);
513
+ }
514
+ if (matchedEls.length === 0) continue;
515
+ if (m.options.filter) {
516
+ const helper = SwcUtils.getHelperAndHostSet(currentWin, this);
517
+ if (!m.options.filter(matchedEls, { currentThis: this, helper })) continue;
518
+ }
519
+ const hostSet = SwcUtils.getHostSet(this);
520
+ this[m.propertyKey](matchedEls, entries, obs, { ...hostSet, $root: root2 });
521
+ }
473
522
  });
523
+ resizeObservers.push(resizeObserver);
524
+ for (const m of resizeObserverList) {
525
+ if (m.options.removeObserver) {
526
+ removeObserverCallbacks.push({ fn: m.options.removeObserver, target: root2, opts: m.options });
527
+ }
528
+ }
529
+ }
530
+ const shadowMetas = mutationObserverList.filter((m) => {
531
+ const r = m.options.root || "auto";
532
+ return this.shadowRoot && (r === "shadow" || r === "all" || r === "auto");
533
+ });
534
+ const lightMetas = mutationObserverList.filter((m) => {
535
+ const r = m.options.root || "auto";
536
+ return r === "light" || r === "all" || !this.shadowRoot && r === "auto";
474
537
  });
538
+ const setupMutationObserver = (root2, metas, resizeDelegates = []) => {
539
+ if (metas.length === 0) return null;
540
+ const initFrom = (o) => {
541
+ const init = {
542
+ childList: o.childList,
543
+ attributes: o.attributes,
544
+ characterData: o.characterData,
545
+ subtree: o.subtree,
546
+ attributeFilter: o.attributeFilter,
547
+ attributeOldValue: o.attributeOldValue,
548
+ characterDataOldValue: o.characterDataOldValue
549
+ };
550
+ if (!init.childList && !init.attributes && !init.characterData) init.childList = true;
551
+ return init;
552
+ };
553
+ const observer = new MutationObserver((mutations, obs) => {
554
+ for (const meta of metas) {
555
+ const { selector, options } = meta;
556
+ let matchedEls = [];
557
+ if (options.delegate && typeof selector === "string") {
558
+ const isThis = selector === "$this" || selector === "";
559
+ const matchesSel = (node) => {
560
+ if (!node || node.nodeType !== 1) return false;
561
+ if (isThis) return true;
562
+ const el = node;
563
+ return el.matches?.(selector) || !!el.closest?.(selector);
564
+ };
565
+ matchedEls = mutations.flatMap((m) => {
566
+ const els = [];
567
+ if (matchesSel(m.target)) els.push(m.target);
568
+ Array.from(m.addedNodes || []).filter(matchesSel).forEach((n) => els.push(n));
569
+ Array.from(m.removedNodes || []).filter(matchesSel).forEach((n) => els.push(n));
570
+ return els;
571
+ });
572
+ } else if (typeof selector === "string") {
573
+ const isThis = selector === "$this" || selector === "";
574
+ const matchesSel = (node) => {
575
+ if (!node || node.nodeType !== 1) return false;
576
+ if (isThis) return true;
577
+ return node.matches?.(selector);
578
+ };
579
+ matchedEls = mutations.flatMap((m) => {
580
+ const els = [];
581
+ if (matchesSel(m.target)) els.push(m.target);
582
+ Array.from(m.addedNodes || []).filter(matchesSel).forEach((n) => els.push(n));
583
+ Array.from(m.removedNodes || []).filter(matchesSel).forEach((n) => els.push(n));
584
+ return els;
585
+ });
586
+ } else {
587
+ matchedEls = mutations.map((m) => m.target).filter((t) => t && t.nodeType === 1);
588
+ }
589
+ if (matchedEls.length === 0) continue;
590
+ if (options.filter) {
591
+ const helper = SwcUtils.getHelperAndHostSet(currentWin, this);
592
+ if (!options.filter(matchedEls, { currentThis: this, helper })) continue;
593
+ }
594
+ const hostSet = SwcUtils.getHostSet(this);
595
+ this[meta.propertyKey](matchedEls, mutations, obs, { ...hostSet, $root: root2 });
596
+ }
597
+ if (resizeDelegates.length > 0 && resizeObserver) {
598
+ const handle = (n, observe) => {
599
+ if (n.nodeType !== 1) return;
600
+ const el = n;
601
+ for (const m of resizeDelegates) {
602
+ if (typeof m.selector !== "string") continue;
603
+ const isThis = m.selector === "$this" || m.selector === "";
604
+ const matchesSel = (node) => {
605
+ if (!node || node.nodeType !== 1) return false;
606
+ if (isThis) return true;
607
+ const e = node;
608
+ return e.matches?.(m.selector) || !!e.closest?.(m.selector);
609
+ };
610
+ if (matchesSel(el)) {
611
+ if (observe) resizeObserver.observe(el, m.options.box ? { box: m.options.box } : void 0);
612
+ else resizeObserver.unobserve(el);
613
+ } else if (!isThis) {
614
+ el.querySelectorAll(m.selector).forEach((sub) => {
615
+ if (observe) resizeObserver.observe(sub, m.options.box ? { box: m.options.box } : void 0);
616
+ else resizeObserver.unobserve(sub);
617
+ });
618
+ }
619
+ }
620
+ };
621
+ for (const m of mutations) {
622
+ Array.from(m.addedNodes || []).forEach((n) => handle(n, true));
623
+ Array.from(m.removedNodes || []).forEach((n) => handle(n, false));
624
+ }
625
+ }
626
+ });
627
+ const hasDelegate = metas.some((m) => m.options.delegate) || resizeDelegates.some((m) => m.options.delegate);
628
+ if (hasDelegate) {
629
+ observer.observe(root2, { childList: true, subtree: true });
630
+ }
631
+ const nonDelegateMetas = metas.filter((m) => !m.options.delegate);
632
+ for (const m of nonDelegateMetas) {
633
+ const { selector, options } = m;
634
+ const mInit = initFrom(options);
635
+ if (typeof selector === "string") {
636
+ if (selector === "$this" || selector === "") {
637
+ observer.observe(root2, mInit);
638
+ } else {
639
+ root2.querySelectorAll(selector).forEach((el) => observer.observe(el, mInit));
640
+ }
641
+ } else if (typeof selector === "function") {
642
+ observer.observe(root2, mInit);
643
+ }
644
+ }
645
+ return observer;
646
+ };
647
+ const shadowResizeDelegateMetas = resizeObserverList.filter((m) => {
648
+ if (!m.options.delegate) return false;
649
+ const r = m.options.root || "auto";
650
+ return this.shadowRoot && (r === "shadow" || r === "all" || r === "auto");
651
+ });
652
+ const lightResizeDelegateMetas = resizeObserverList.filter((m) => {
653
+ if (!m.options.delegate) return false;
654
+ const r = m.options.root || "auto";
655
+ return r === "light" || r === "all" || !this.shadowRoot && r === "auto";
656
+ });
657
+ if (this.shadowRoot) shadowMutationObserver = setupMutationObserver(this.shadowRoot, shadowMetas, shadowResizeDelegateMetas);
658
+ lightMutationObserver = setupMutationObserver(this, lightMetas, lightResizeDelegateMetas);
659
+ for (const m of mutationObserverList) {
660
+ if (m.options.removeObserver) {
661
+ const rootForM = this.shadowRoot && (m.options.root === "shadow" || m.options.root === "all" || m.options.root === "auto" && this.shadowRoot) ? this.shadowRoot : this;
662
+ removeObserverCallbacks.push({ fn: m.options.removeObserver, target: rootForM, opts: m.options });
663
+ }
664
+ }
475
665
  if (originalConnected) await originalConnected.apply(this);
476
666
  const aMethods = findAllOnConnectedAfterMetadata(this);
477
667
  for (const m of aMethods) await this._invokeLifecycleMethod(m.propertyKey, helperHostSet);
@@ -506,15 +696,44 @@ const elementDefine = (name, config = {}) => (constructor) => {
506
696
  this._executeSwcScript("swc-on-before-disconnected", helperHostSet);
507
697
  const bMethods = findAllLifecycleMetadata(this, ON_BEFORE_DISCONNECTED_METADATA_KEY);
508
698
  for (const m of bMethods) this._invokeLifecycleMethod(m.propertyKey, helperHostSet);
509
- if (this._boundListeners) {
510
- this._boundListeners.forEach((l) => {
699
+ if (boundListeners.length > 0) {
700
+ boundListeners.forEach((l) => {
511
701
  l.target.removeEventListener(l.type, l.handler, l.options);
512
702
  if (l.subscription && typeof l.subscription.unsubscribe === "function") {
513
703
  l.subscription.unsubscribe();
514
704
  }
705
+ if (Array.isArray(l.onRemoves)) {
706
+ for (const r of l.onRemoves) {
707
+ try {
708
+ r.fn(l.target, r.opts);
709
+ } catch (e) {
710
+ console.error("[SWC] removeListener error:", e);
711
+ }
712
+ }
713
+ }
515
714
  });
516
- this._boundListeners = [];
715
+ boundListeners = [];
716
+ }
717
+ const _obs = [shadowMutationObserver, lightMutationObserver, resizeObserver, ...resizeObservers];
718
+ for (const o of _obs) {
719
+ try {
720
+ o?.disconnect?.();
721
+ } catch (e) {
722
+ console.error("[SWC] observer disconnect error:", e);
723
+ }
724
+ }
725
+ shadowMutationObserver = null;
726
+ lightMutationObserver = null;
727
+ resizeObserver = null;
728
+ resizeObservers = [];
729
+ for (const cb of removeObserverCallbacks) {
730
+ try {
731
+ cb.fn(cb.target, cb.opts);
732
+ } catch (e) {
733
+ console.error("[SWC] removeObserver error:", e);
734
+ }
517
735
  }
736
+ removeObserverCallbacks = [];
518
737
  new ElementApply(this, { id: this._swcId }).removeAllEventListener();
519
738
  if (originalDisconnected) originalDisconnected.apply(this);
520
739
  const aMethods = findAllLifecycleMetadata(this, ON_AFTER_DISCONNECTED_METADATA_KEY);