@dooboostore/simple-web-component 1.0.44 → 1.0.45

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 (75) hide show
  1. package/README.md +25 -25
  2. package/dist/cjs/decorators/addEventListener.js.map +2 -2
  3. package/dist/cjs/decorators/applyAttribute.js +36 -15
  4. package/dist/cjs/decorators/applyAttribute.js.map +2 -2
  5. package/dist/cjs/decorators/applyClass.js +53 -22
  6. package/dist/cjs/decorators/applyClass.js.map +2 -2
  7. package/dist/cjs/decorators/applyNode.js +51 -23
  8. package/dist/cjs/decorators/applyNode.js.map +2 -2
  9. package/dist/cjs/decorators/applyProperty.js +38 -17
  10. package/dist/cjs/decorators/applyProperty.js.map +2 -2
  11. package/dist/cjs/decorators/applyStyle.js +53 -22
  12. package/dist/cjs/decorators/applyStyle.js.map +2 -2
  13. package/dist/cjs/decorators/elementDefine.js +44 -25
  14. package/dist/cjs/decorators/elementDefine.js.map +2 -2
  15. package/dist/cjs/decorators/emitCustomEvent.js +61 -47
  16. package/dist/cjs/decorators/emitCustomEvent.js.map +2 -2
  17. package/dist/cjs/decorators/query.js +91 -56
  18. package/dist/cjs/decorators/query.js.map +2 -2
  19. package/dist/cjs/decorators/queryAll.js +104 -66
  20. package/dist/cjs/decorators/queryAll.js.map +2 -2
  21. package/dist/cjs/types/window.d.js.map +1 -1
  22. package/dist/esm/decorators/addEventListener.js.map +2 -2
  23. package/dist/esm/decorators/applyAttribute.js +36 -15
  24. package/dist/esm/decorators/applyAttribute.js.map +2 -2
  25. package/dist/esm/decorators/applyClass.js +53 -22
  26. package/dist/esm/decorators/applyClass.js.map +2 -2
  27. package/dist/esm/decorators/applyNode.js +51 -23
  28. package/dist/esm/decorators/applyNode.js.map +2 -2
  29. package/dist/esm/decorators/applyProperty.js +38 -17
  30. package/dist/esm/decorators/applyProperty.js.map +2 -2
  31. package/dist/esm/decorators/applyStyle.js +53 -22
  32. package/dist/esm/decorators/applyStyle.js.map +2 -2
  33. package/dist/esm/decorators/elementDefine.js +44 -25
  34. package/dist/esm/decorators/elementDefine.js.map +2 -2
  35. package/dist/esm/decorators/emitCustomEvent.js +61 -47
  36. package/dist/esm/decorators/emitCustomEvent.js.map +2 -2
  37. package/dist/esm/decorators/query.js +91 -56
  38. package/dist/esm/decorators/query.js.map +2 -2
  39. package/dist/esm/decorators/queryAll.js +104 -66
  40. package/dist/esm/decorators/queryAll.js.map +2 -2
  41. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +531 -293
  42. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +3 -3
  43. package/dist/types/decorators/addEventListener.d.ts +7 -6
  44. package/dist/types/decorators/addEventListener.d.ts.map +1 -1
  45. package/dist/types/decorators/applyAttribute.d.ts +12 -8
  46. package/dist/types/decorators/applyAttribute.d.ts.map +1 -1
  47. package/dist/types/decorators/applyClass.d.ts +8 -7
  48. package/dist/types/decorators/applyClass.d.ts.map +1 -1
  49. package/dist/types/decorators/applyNode.d.ts +18 -17
  50. package/dist/types/decorators/applyNode.d.ts.map +1 -1
  51. package/dist/types/decorators/applyProperty.d.ts +13 -9
  52. package/dist/types/decorators/applyProperty.d.ts.map +1 -1
  53. package/dist/types/decorators/applyStyle.d.ts +6 -5
  54. package/dist/types/decorators/applyStyle.d.ts.map +1 -1
  55. package/dist/types/decorators/elementDefine.d.ts.map +1 -1
  56. package/dist/types/decorators/emitCustomEvent.d.ts +3 -2
  57. package/dist/types/decorators/emitCustomEvent.d.ts.map +1 -1
  58. package/dist/types/decorators/query.d.ts +15 -5
  59. package/dist/types/decorators/query.d.ts.map +1 -1
  60. package/dist/types/decorators/queryAll.d.ts +15 -5
  61. package/dist/types/decorators/queryAll.d.ts.map +1 -1
  62. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +531 -293
  63. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +3 -3
  64. package/package.json +3 -3
  65. package/src/decorators/addEventListener.ts +9 -7
  66. package/src/decorators/applyAttribute.ts +59 -27
  67. package/src/decorators/applyClass.ts +78 -32
  68. package/src/decorators/applyNode.ts +115 -72
  69. package/src/decorators/applyProperty.ts +62 -30
  70. package/src/decorators/applyStyle.ts +76 -30
  71. package/src/decorators/elementDefine.ts +49 -26
  72. package/src/decorators/emitCustomEvent.ts +63 -39
  73. package/src/decorators/query.ts +111 -49
  74. package/src/decorators/queryAll.ts +121 -61
  75. package/src/types/window.d.ts +3 -0
package/README.md CHANGED
@@ -49,21 +49,21 @@ render() {
49
49
  }
50
50
  ```
51
51
 
52
- #### @innerHtmlLightNodeThis
52
+ #### @innerHtmlLight
53
53
  Apply HTML to specific host element.
54
54
 
55
55
  ```typescript
56
- @innerHtmlLightNodeThis
56
+ @innerHtmlLight
57
57
  updateContent() {
58
58
  return `<p>Updated content</p>`;
59
59
  }
60
60
  ```
61
61
 
62
- #### @replaceChildrenLightNodeThis
62
+ #### @replaceChildrenLight
63
63
  Replace child nodes with new content.
64
64
 
65
65
  ```typescript
66
- @replaceChildrenLightNodeThis
66
+ @replaceChildrenLight
67
67
  replaceChildren(node: Node) {
68
68
  return node;
69
69
  }
@@ -621,7 +621,7 @@ Surgically add, replace, or remove nodes in the DOM with fine-grained control.
621
621
  @elementDefine('content-updater')
622
622
  class ContentUpdater extends HTMLElement {
623
623
  @addEventListener('button', 'click')
624
- @replaceChildrenNode()
624
+ @replaceChildren()
625
625
  updateContent() {
626
626
  return `<div>New content</div>`;
627
627
  }
@@ -633,7 +633,7 @@ class ContentUpdater extends HTMLElement {
633
633
  }
634
634
 
635
635
  @addEventListener('.prepend-btn', 'click')
636
- @afterBeginNode()
636
+ @afterBegin()
637
637
  prependContent() {
638
638
  return `<p>Prepended content</p>`;
639
639
  }
@@ -652,15 +652,15 @@ class ContentUpdater extends HTMLElement {
652
652
  ```
653
653
 
654
654
  **@applyNode Decorator Variants:**
655
- - `replaceChildrenNode()` - Replace all children
656
- - `replaceChildrenLightNode()` - Replace children in light DOM
657
- - `beforeEndNode()` - Append to end
658
- - `beforeEndLightNode()` - Append to light DOM end
659
- - `afterBeginNode()` - Prepend to beginning
660
- - `afterBeginLightNode()` - Prepend to light DOM beginning
661
- - `innerHtmlNode()` - Set innerHTML
662
- - `innerHtmlLightNode()` - Set innerHTML in light DOM
663
- - `innerTextNode()` - Set innerText
655
+ - `replaceChildren()` - Replace all children
656
+ - `replaceChildrenLight()` - Replace children in light DOM
657
+ - `beforeEnd()` - Append to end
658
+ - `beforeEndLight()` - Append to light DOM end
659
+ - `afterBegin()` - Prepend to beginning
660
+ - `afterBeginLight()` - Prepend to light DOM beginning
661
+ - `innerHtml()` - Set innerHTML
662
+ - `innerHtmlLight()` - Set innerHTML in light DOM
663
+ - `innerText()` - Set innerText
664
664
 
665
665
  **Position Options:**
666
666
  ```typescript
@@ -1082,26 +1082,26 @@ SWC provides declarative routing with automatic path matching, order-based execu
1082
1082
  @elementDefine('root-router')
1083
1083
  class RootRouter extends HTMLElement {
1084
1084
  @subscribeSwcAppRouteChangeWhileConnected(['', '/'], { order: 0 })
1085
- @innerHtmlLightNodeThis
1085
+ @innerHtmlLight
1086
1086
  handleHome(routerPathSet: RouterEventType) {
1087
1087
  return `<landing-page/>`;
1088
1088
  }
1089
1089
 
1090
1090
  @subscribeSwcAppRouteChangeWhileConnected(['/products'], { order: 1 })
1091
- @innerHtmlLightNodeThis
1091
+ @innerHtmlLight
1092
1092
  handleProducts(routerPathSet: RouterEventType) {
1093
1093
  return `<products-list/>`;
1094
1094
  }
1095
1095
 
1096
1096
  @subscribeSwcAppRouteChangeWhileConnected(['/product/{id}'], { order: 2 })
1097
- @innerHtmlLightNodeThis
1097
+ @innerHtmlLight
1098
1098
  handleProductDetail(routerPathSet: RouterEventType) {
1099
1099
  const { id } = routerPathSet.pathData;
1100
1100
  return `<product-detail product-id="${id}"/>`;
1101
1101
  }
1102
1102
 
1103
1103
  @subscribeSwcAppRouteChangeWhileConnected(['/{tail:.*}'], { order: 999 })
1104
- @innerHtmlLightNodeThis
1104
+ @innerHtmlLight
1105
1105
  handle404(routerPathSet: RouterEventType) {
1106
1106
  return `<not-found-page/>`;
1107
1107
  }
@@ -1133,7 +1133,7 @@ Routes are executed in order of `order` value (lowest first). First matching rou
1133
1133
  ```typescript
1134
1134
  // This handler stops propagation (returns HTML)
1135
1135
  @subscribeSwcAppRouteChangeWhileConnected(['/admin'], { order: 1 })
1136
- @innerHtmlLightNodeThis
1136
+ @innerHtmlLight
1137
1137
  handleAdmin(routerPathSet: RouterEventType) {
1138
1138
  return `<admin-panel/>`; // ✅ Stops here
1139
1139
  }
@@ -1164,7 +1164,7 @@ class AccommodationRouter extends HTMLElement {
1164
1164
 
1165
1165
  // Home route
1166
1166
  @subscribeSwcAppRouteChangeWhileConnected(['', '/'], { order: 0 })
1167
- @innerHtmlLightNodeThis
1167
+ @innerHtmlLight
1168
1168
  handleHome(routerPathSet: RouterEventType) {
1169
1169
  console.log('[Route Handler] Home');
1170
1170
  return `<landing-page/>`;
@@ -1172,7 +1172,7 @@ class AccommodationRouter extends HTMLElement {
1172
1172
 
1173
1173
  // List route
1174
1174
  @subscribeSwcAppRouteChangeWhileConnected(['/list'], { order: 1 })
1175
- @innerHtmlLightNodeThis
1175
+ @innerHtmlLight
1176
1176
  handleList(routerPathSet: RouterEventType) {
1177
1177
  console.log('[Route Handler] List');
1178
1178
  return `<list-page/>`;
@@ -1180,7 +1180,7 @@ class AccommodationRouter extends HTMLElement {
1180
1180
 
1181
1181
  // Detail route with dynamic parameter
1182
1182
  @subscribeSwcAppRouteChangeWhileConnected(['/detail/{productId}'], { order: 2 })
1183
- @innerHtmlLightNodeThis
1183
+ @innerHtmlLight
1184
1184
  handleDetail(routerPathSet: RouterEventType) {
1185
1185
  const { productId } = routerPathSet.pathData;
1186
1186
  console.log('[Route Handler] Detail', { productId });
@@ -1189,7 +1189,7 @@ class AccommodationRouter extends HTMLElement {
1189
1189
 
1190
1190
  // 404 fallback (order: 999 runs last)
1191
1191
  @subscribeSwcAppRouteChangeWhileConnected(['/{tail:.*}'], { order: 999 })
1192
- @innerHtmlLightNodeThis
1192
+ @innerHtmlLight
1193
1193
  handle404(routerPathSet: RouterEventType) {
1194
1194
  console.log('[Route Handler] 404 Not Found', routerPathSet.path);
1195
1195
  return `<not-found-page/>`;
@@ -1216,7 +1216,7 @@ interface SwcAppRouteChangeOptions {
1216
1216
  filter: (router, meta) => meta.currentThis.isAdmin === true
1217
1217
  }
1218
1218
  )
1219
- @innerHtmlLightNodeThis
1219
+ @innerHtmlLight
1220
1220
  handleAdminSection(routerPathSet: RouterEventType) {
1221
1221
  const { section } = routerPathSet.pathData;
1222
1222
  return `<admin-${section}/>`;
@@ -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 interface AddEventListenerMetadata<TEvent extends Event = Event> {\n propertyKey: string | symbol;\n selector: string;\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: string, 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: string, 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: string, 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: string, 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: string, 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: string, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'auto', delegate: true});\n}\n\n/**\n * @addEventListenerThis decorator - simplified version of @addEventListener for $this selector\n */\n\n// --- Aliases: event... ---\nexport const event = addEventListener;\nexport const eventDelegateLightDom = addEventListenerDelegateLightDom;\nexport const eventDelegateShadowDom = addEventListenerDelegateShadowDom;\nexport const eventDelegateAllDom = addEventListenerDelegateAllDom;\nexport const eventDelegate = addEventListenerDelegate;\nexport function addEventListenerThis<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$this', type, options);\n}\n\n/**\n * @addEventListenerAppHost decorator - simplified version of @addEventListener for $appHost selector\n */\nexport function addEventListenerAppHost<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$appHost', type, options);\n}\n\nexport function addEventListenerWindow<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$window', type, options);\n}\nexport function addEventListenerDocument<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$document', type, options);\n}\n\nexport const getAddEventListenerMetadata = (target: any): AddEventListenerMetadata<Event>[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA6B;AA0BtB,MAAM,kCAAkC,OAAO,IAAI,yCAAyC;AAO5F,SAAS,iBAA+C,kBAA0B,MAAc,UAAe,CAAC,GAAoB;AACzI,SAAO,CAAC,WAAmB,aAA8B,eAAmC;AAC1F,UAAM,cAAc,UAAU;AAE9B,QAAI,YAAY,yBAAa,YAAgD,iCAAiC,WAAW;AACzH,QAAI,CAAC,WAAW;AACd,kBAAY,CAAC;AACb,+BAAa,eAAe,iCAAiC,WAAW,WAAW;AAAA,IACrF;AAEA,cAAU,KAAK,EAAE,aAAa,UAAU,kBAAkB,MAAM,QAAQ,CAAC;AAAA,EAC3E;AACF;AAGO,SAAS,iCAA+D,UAAkB,MAAc,SAAkF;AAC/L,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,SAAS,UAAU,KAAI,CAAC;AAChG;AAEO,SAAS,kCAAgE,UAAkB,MAAc,SAAkF;AAChM,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,UAAU,UAAU,KAAI,CAAC;AACjG;AACO,SAAS,+BAA6D,UAAkB,MAAc,SAAkF;AAC7L,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,OAAO,UAAU,KAAI,CAAC;AAC9F;AACO,SAAS,yBAAuD,UAAkB,MAAc,SAAkF;AACvL,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,QAAQ,UAAU,KAAI,CAAC;AAC/F;AAOO,MAAM,QAAQ;AACd,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,sBAAsB;AAC5B,MAAM,gBAAgB;AACtB,SAAS,qBAAmD,MAAc,SAAkF;AACjK,SAAO,iBAAyB,SAAS,MAAM,OAAO;AACxD;AAKO,SAAS,wBAAsD,MAAc,SAAkF;AACpK,SAAO,iBAAyB,YAAY,MAAM,OAAO;AAC3D;AAEO,SAAS,uBAAqD,MAAc,SAAkF;AACnK,SAAO,iBAAyB,WAAW,MAAM,OAAO;AAC1D;AACO,SAAS,yBAAuD,MAAc,SAAkF;AACrK,SAAO,iBAAyB,aAAa,MAAM,OAAO;AAC5D;AAEO,MAAM,8BAA8B,CAAC,WAA+D;AACzG,QAAM,cAAc,kBAAkB,WAAW,SAAS,OAAO;AACjE,SAAO,yBAAa,YAAY,iCAAiC,WAAW;AAC9E;",
4
+ "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core';\nimport { SpecialSelector, SwcQueryOptions, HelperHostSet } from '../types';\n\nexport interface AddEventListenerBaseOptions<TEvent extends Event = Event> extends EventListenerOptions {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n stopPropagation?: boolean;\n stopImmediatePropagation?: boolean;\n preventDefault?: boolean;\n // removeOnDisconnected?: boolean;\n delegate?: boolean;\n filter?: (target: Event | CustomEvent, meta:{currentThis: any, helper: HelperHostSet}) => boolean;\n // RxJS operator options\n debounceTime?: number;\n throttleTime?: number;\n distinctUntilChanged?: boolean | ((prev: TEvent, curr: TEvent) => boolean);\n}\n\nexport type EventListenerSelector = string | ((currentThis: any, helper: HelperHostSet) => NodeList | Element | Element[] | null);\n\nexport interface AddEventListenerMetadata<TEvent extends Event = Event> {\n propertyKey: string | symbol;\n selector: EventListenerSelector;\n type: string;\n options: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean };\n}\n\nexport const ADD_EVENT_LISTENER_METADATA_KEY = Symbol.for('simple-web-component:add-event-listener');\n\nexport function addEventListener<TEvent extends Event = Event>(target: SpecialSelector, type: string, options?: AddEventListenerBaseOptions<TEvent>): MethodDecorator;\nexport function addEventListener<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions & { delegate?: boolean }): MethodDecorator;\n/**\n * @addEventListener decorator to bind events to elements.\n */\nexport function addEventListener<TEvent extends Event = Event>(selectorOrTarget: EventListenerSelector, type: string, options: any = {}): MethodDecorator {\n return (targetObj: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const constructor = targetObj.constructor;\n\n let listeners = ReflectUtils.getMetadata<AddEventListenerMetadata<TEvent>[]>(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n if (!listeners) {\n listeners = [];\n ReflectUtils.defineMetadata(ADD_EVENT_LISTENER_METADATA_KEY, listeners, constructor);\n }\n\n listeners.push({ propertyKey, selector: selectorOrTarget, type, options });\n };\n}\n\n\nexport function addEventListenerDelegateLightDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'light', delegate: true});\n}\n\nexport function addEventListenerDelegateShadowDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'shadow', delegate: true});\n}\nexport function addEventListenerDelegateAllDom<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'all', delegate: true});\n}\nexport function addEventListenerDelegate<TEvent extends Event = Event>(selector: EventListenerSelector, type: string, options?: Omit<AddEventListenerBaseOptions<TEvent>, 'delegate'>): MethodDecorator {\n return addEventListener<TEvent>(selector, type, {...options??{}, root:'auto', delegate: true});\n}\n\n/**\n * @addEventListenerThis decorator - simplified version of @addEventListener for $this selector\n */\n\n// --- Aliases: event... ---\nexport const event = addEventListener;\nexport const eventDelegateLightDom = addEventListenerDelegateLightDom;\nexport const eventDelegateShadowDom = addEventListenerDelegateShadowDom;\nexport const eventDelegateAllDom = addEventListenerDelegateAllDom;\nexport const eventDelegate = addEventListenerDelegate;\nexport function addEventListenerThis<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$this', type, options);\n}\n\n/**\n * @addEventListenerAppHost decorator - simplified version of @addEventListener for $appHost selector\n */\nexport function addEventListenerAppHost<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$appHost', type, options);\n}\n\nexport function addEventListenerWindow<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$window', type, options);\n}\nexport function addEventListenerDocument<TEvent extends Event = Event>(type: string, options?: AddEventListenerBaseOptions<TEvent> & SwcQueryOptions): MethodDecorator {\n return addEventListener<TEvent>('$document', type, options);\n}\n\nexport const getAddEventListenerMetadata = (target: any): AddEventListenerMetadata<Event>[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA6B;AA4BtB,MAAM,kCAAkC,OAAO,IAAI,yCAAyC;AAO5F,SAAS,iBAA+C,kBAAyC,MAAc,UAAe,CAAC,GAAoB;AACxJ,SAAO,CAAC,WAAmB,aAA8B,eAAmC;AAC1F,UAAM,cAAc,UAAU;AAE9B,QAAI,YAAY,yBAAa,YAAgD,iCAAiC,WAAW;AACzH,QAAI,CAAC,WAAW;AACd,kBAAY,CAAC;AACb,+BAAa,eAAe,iCAAiC,WAAW,WAAW;AAAA,IACrF;AAEA,cAAU,KAAK,EAAE,aAAa,UAAU,kBAAkB,MAAM,QAAQ,CAAC;AAAA,EAC3E;AACF;AAGO,SAAS,iCAA+D,UAAiC,MAAc,SAAkF;AAC9M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,SAAS,UAAU,KAAI,CAAC;AAChG;AAEO,SAAS,kCAAgE,UAAiC,MAAc,SAAkF;AAC/M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,UAAU,UAAU,KAAI,CAAC;AACjG;AACO,SAAS,+BAA6D,UAAiC,MAAc,SAAkF;AAC5M,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,OAAO,UAAU,KAAI,CAAC;AAC9F;AACO,SAAS,yBAAuD,UAAiC,MAAc,SAAkF;AACtM,SAAO,iBAAyB,UAAU,MAAM,EAAC,GAAG,WAAS,CAAC,GAAG,MAAK,QAAQ,UAAU,KAAI,CAAC;AAC/F;AAOO,MAAM,QAAQ;AACd,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,sBAAsB;AAC5B,MAAM,gBAAgB;AACtB,SAAS,qBAAmD,MAAc,SAAkF;AACjK,SAAO,iBAAyB,SAAS,MAAM,OAAO;AACxD;AAKO,SAAS,wBAAsD,MAAc,SAAkF;AACpK,SAAO,iBAAyB,YAAY,MAAM,OAAO;AAC3D;AAEO,SAAS,uBAAqD,MAAc,SAAkF;AACnK,SAAO,iBAAyB,WAAW,MAAM,OAAO;AAC1D;AACO,SAAS,yBAAuD,MAAc,SAAkF;AACrK,SAAO,iBAAyB,aAAa,MAAM,OAAO;AAC5D;AAEO,MAAM,8BAA8B,CAAC,WAA+D;AACzG,QAAM,cAAc,kBAAkB,WAAW,SAAS,OAAO;AACjE,SAAO,yBAAa,YAAY,iCAAiC,WAAW;AAC9E;",
6
6
  "names": []
7
7
  }
@@ -78,6 +78,27 @@ const resolveAttributeTargets = (inst, selector, options) => {
78
78
  const currentWin = conf.window;
79
79
  const r = options.root || "auto";
80
80
  const results = [];
81
+ let resolvedSelector = selector;
82
+ if (typeof selector === "function") {
83
+ const hostSet = import_Utils.SwcUtils.getHelperAndHostSet(currentWin, inst);
84
+ resolvedSelector = selector(inst, hostSet);
85
+ }
86
+ if (resolvedSelector instanceof currentWin.Element) {
87
+ results.push(resolvedSelector);
88
+ return results;
89
+ }
90
+ if (resolvedSelector instanceof currentWin.NodeList) {
91
+ results.push(...Array.from(resolvedSelector));
92
+ return results;
93
+ }
94
+ if (Array.isArray(resolvedSelector)) {
95
+ results.push(...resolvedSelector);
96
+ return results;
97
+ }
98
+ if (resolvedSelector === null) {
99
+ return results;
100
+ }
101
+ const stringSelector = resolvedSelector;
81
102
  const applyRoot = (target) => {
82
103
  if (!target) return;
83
104
  if (r === "auto") {
@@ -87,33 +108,33 @@ const resolveAttributeTargets = (inst, selector, options) => {
87
108
  if ((r === "shadow" || r === "all") && target.shadowRoot) results.push(target.shadowRoot);
88
109
  }
89
110
  };
90
- if (selector === "$this" || !selector) {
111
+ if (stringSelector === "$this" || !stringSelector) {
91
112
  applyRoot(inst);
92
113
  } else {
93
114
  const hostSet = import_Utils.SwcUtils.getHostSet(inst);
94
- if (selector === "$host") applyRoot(hostSet.$host);
95
- else if (selector === "$parentHost") applyRoot(hostSet.$parentHost);
96
- else if (selector === "$appHost") applyRoot(hostSet.$appHost);
97
- else if (selector === "$firstHost") applyRoot(hostSet.$firstHost);
98
- else if (selector === "$lastHost") applyRoot(hostSet.$lastHost);
99
- else if (selector === "$firstAppHost") applyRoot(hostSet.$firstAppHost);
100
- else if (selector === "$lastAppHost") applyRoot(hostSet.$lastAppHost);
101
- else if (selector === "$hosts") hostSet.$hosts.forEach(applyRoot);
102
- else if (selector === "$appHosts") hostSet.$appHosts.forEach(applyRoot);
115
+ if (stringSelector === "$host") applyRoot(hostSet.$host);
116
+ else if (stringSelector === "$parentHost") applyRoot(hostSet.$parentHost);
117
+ else if (stringSelector === "$appHost") applyRoot(hostSet.$appHost);
118
+ else if (stringSelector === "$firstHost") applyRoot(hostSet.$firstHost);
119
+ else if (stringSelector === "$lastHost") applyRoot(hostSet.$lastHost);
120
+ else if (stringSelector === "$firstAppHost") applyRoot(hostSet.$firstAppHost);
121
+ else if (stringSelector === "$lastAppHost") applyRoot(hostSet.$lastAppHost);
122
+ else if (stringSelector === "$hosts") hostSet.$hosts.forEach(applyRoot);
123
+ else if (stringSelector === "$appHosts") hostSet.$appHosts.forEach(applyRoot);
103
124
  else {
104
125
  if (r === "shadow") {
105
- const found = inst.shadowRoot?.querySelectorAll(selector);
126
+ const found = inst.shadowRoot?.querySelectorAll(stringSelector);
106
127
  if (found) results.push(...found);
107
128
  } else if (r === "light") {
108
- const found = inst.querySelectorAll(selector);
129
+ const found = inst.querySelectorAll(stringSelector);
109
130
  if (found) results.push(...found);
110
131
  } else if (r === "all") {
111
- const sMatch = inst.shadowRoot?.querySelectorAll(selector);
112
- const lMatch = inst.querySelectorAll(selector);
132
+ const sMatch = inst.shadowRoot?.querySelectorAll(stringSelector);
133
+ const lMatch = inst.querySelectorAll(stringSelector);
113
134
  if (sMatch) results.push(...sMatch);
114
135
  if (lMatch) results.push(...lMatch);
115
136
  } else {
116
- const found = (inst.shadowRoot || inst).querySelectorAll(selector);
137
+ const found = (inst.shadowRoot || inst).querySelectorAll(stringSelector);
117
138
  if (found) results.push(...found);
118
139
  }
119
140
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/decorators/applyAttribute.ts"],
4
- "sourcesContent": ["import {ReflectUtils, FunctionUtils, ActionExpression} from '@dooboostore/core';\nimport {ensureInit, getElementConfig} from './elementDefine';\nimport {SwcUtils} from '../utils/Utils';\nimport {SwcQueryOptions, HelperHostSet} from '../types';\nimport {ConvertUtils} from '@dooboostore/core-web';\n\n// ============================================\n// Types & Interfaces\n// ============================================\n\nexport interface AttributeOptions extends SwcQueryOptions {\n name?: string;\n type?: typeof Number | typeof Boolean | typeof String;\n filter?: (target: HTMLElement, value: any, meta: { currentThis: any, helper: HelperHostSet }) => boolean;\n /**\n * Custom key to extract value from return object.\n * If not provided, uses ATTRIBUTE_METADATA_KEY by default.\n * Useful when multiple @setAttribute decorators are on the same method.\n * \n * Example:\n * @setAttribute('selector1', { valueKey: 'attr1' })\n * @setAttribute('selector2', { valueKey: 'attr2' })\n * myMethod() {\n * return {\n * attr1: 'value1',\n * attr2: 'value2'\n * };\n * }\n * \n * Or with symbols:\n * @setAttribute('selector1', { valueKey: Symbol.for('attr1') })\n * @setAttribute('selector2', { valueKey: Symbol.for('attr2') })\n * myMethod() {\n * return {\n * [Symbol.for('attr1')]: 'value1',\n * [Symbol.for('attr2')]: 'value2'\n * };\n * }\n */\n valueKey?: symbol | string;\n}\n\nexport interface AttributeMetadata {\n propertyKey: string | symbol;\n selector: string;\n targetAttributeName: string;\n options: AttributeOptions;\n type: 'property' | 'method';\n}\n\nexport const ATTRIBUTE_METADATA_KEY = Symbol.for('simple-web-component:attribute');\n\n// ============================================\n// Utilities\n// ============================================\n\n/**\n * Determine if a string is a CSS selector or an attribute name\n * \n * CSS selectors typically:\n * - Start with: #, ., [, :, >, +, ~\n * - Contain special chars: >, +, ~, :, [, ]\n * - Are special keywords: $this, $host, $parentHost, etc.\n * \n * Attribute names are typically:\n * - kebab-case (lowercase with hyphens)\n * - No special selector syntax\n * \n * @param str - String to check\n * @returns true if it's a CSS selector, false if it's an attribute name\n */\nconst isCssSelector = (str: string): boolean => {\n if (!str) return false;\n \n // Special keywords\n if (str.startsWith('$')) return true;\n \n // CSS selector syntax\n if (/^[#.\\[\\:>+~]/.test(str)) return true;\n \n // Contains CSS combinator or pseudo-selector syntax\n if (/[>+~:\\[\\]]/.test(str)) return true;\n \n return false;\n};\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\nexport {convertValue};\n\nexport const getAttributeValue = (inst: any, attrName: string, options?: AttributeOptions & { selector?: string }): any => {\n const conf = getElementConfig(inst);\n const currentWin = inst._resolveWindow?.(conf) || ((typeof window !== 'undefined' ? window : undefined) as any);\n\n // If selector is not provided, use inst itself\n const targets = options?.selector ? resolveAttributeTargets(inst, options.selector, options) : [inst];\n\n const primaryTarget = targets[0];\n\n if (primaryTarget && typeof (primaryTarget as any).hasAttribute === 'function' && (primaryTarget as any).hasAttribute(attrName)) {\n let domVal = (primaryTarget as any).getAttribute(attrName);\n\n // \uD45C\uD604\uC2DD \uCCB4\uD06C\n const ae = new ActionExpression(domVal);\n const expr = ae.getFirstExpression('callReturn');\n if (expr) {\n try {\n const result = FunctionUtils.executeReturn({\n script: ConvertUtils.decodeHtmlEntity(expr.script, currentWin.document),\n context: inst,\n args: SwcUtils.getHelperAndHostSet(currentWin, inst)\n });\n return convertValue(result, options?.type);\n } catch (err) {\n console.error(`[SWC] Failed to execute directive {{= ${expr.script} }}:`, err);\n return convertValue(domVal, options?.type);\n }\n }\n\n return convertValue(domVal, options?.type);\n }\n\n // If no target found, return null\n return null;\n};\n\n/**\n * Resolve target elements based on selector and options\n * Handles special selectors ($this, $host, etc.) and CSS selectors\n * Returns HTMLElement[] for attribute operations\n */\nexport const resolveAttributeTargets = (inst: any, selector: string, options: AttributeOptions): HTMLElement[] => {\n const conf = getElementConfig(inst);\n const currentWin = conf.window;\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 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 === '$this' || !selector) {\n applyRoot(inst);\n } else {\n const hostSet = SwcUtils.getHostSet(inst);\n if (selector === '$host') applyRoot(hostSet.$host);\n else 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 if (selector === '$hosts') hostSet.$hosts.forEach(applyRoot);\n else if (selector === '$appHosts') hostSet.$appHosts.forEach(applyRoot);\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 * @applyAttribute decorator - set/get element attributes\n *\n * Usage:\n * - @applyAttribute('selector', 'attrName') - Set attribute with explicit name\n * - @applyAttribute('selector') - Use property name as attribute name\n * - @applyAttribute('selector', { name: 'attrName' }) - Set attribute via options\n * - Return null to remove attribute\n */\nexport function applyAttribute(selector: string, targetAttributeName: string, options?: AttributeOptions): MethodDecorator & PropertyDecorator;\nexport function applyAttribute(selector: string, options?: AttributeOptions): MethodDecorator & PropertyDecorator;\nexport function applyAttribute(selector: string, targetAttributeNameOrOptions?: string | AttributeOptions, options?: AttributeOptions): MethodDecorator & PropertyDecorator {\n return (target: Object, propertyKey: string | symbol, descriptor?: PropertyDescriptor) => {\n // ensureInit(target as any);\n\n const constructor = target.constructor;\n const designType = (Reflect as any).getMetadata('design:type', target, propertyKey);\n const metaType: 'property' | 'method' = descriptor && typeof descriptor.value === 'function' ? 'method' : 'property';\n\n // Parse arguments\n let finalOptions: AttributeOptions = {};\n let targetAttributeName: string;\n\n if (typeof targetAttributeNameOrOptions === 'string') {\n // applyAttribute('selector', 'attrName', options?)\n targetAttributeName = targetAttributeNameOrOptions;\n finalOptions = options || {};\n } else if (targetAttributeNameOrOptions) {\n // applyAttribute('selector', options)\n finalOptions = targetAttributeNameOrOptions;\n targetAttributeName = finalOptions.name || String(propertyKey);\n } else {\n // applyAttribute('selector')\n targetAttributeName = String(propertyKey);\n }\n\n // Store metadata\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({\n propertyKey,\n selector,\n targetAttributeName,\n options: finalOptions,\n type: metaType\n });\n\n // Helper: Apply resolved value to targets\n const applyValueToTargets = (inst: any, resolvedValue: any) => {\n const conf = getElementConfig(inst);\n const currentWin = conf.window;\n const targetEls = resolveAttributeTargets(inst, selector, finalOptions);\n const hostSet = SwcUtils.getHelperAndHostSet(currentWin, inst);\n\n targetEls.forEach(targetEl => {\n // Apply filter if provided\n if (finalOptions.filter && !finalOptions.filter(targetEl, resolvedValue, {currentThis: inst, helper: hostSet})) {\n return;\n }\n\n if (resolvedValue === null) {\n // Remove attribute if value is null\n targetEl.removeAttribute(targetAttributeName);\n } else if (resolvedValue !== undefined) {\n // Set attribute\n targetEl.setAttribute(targetAttributeName, resolvedValue === true ? '' : String(resolvedValue));\n }\n });\n\n return resolvedValue;\n };\n\n // Method decorator: wrap method to apply its return value to attributes\n if (descriptor && typeof descriptor.value === 'function') {\n const original = descriptor.value;\n descriptor.value = function (...args: any[]) {\n ensureInit(this);\n const res = (original as any).apply(this, args);\n\n /**\n * Extract value for this decorator from method return value\n * \n * If return value is an object with this decorator's key,\n * use that value. Otherwise use the entire return value.\n * \n * Uses valueKey from options if provided, otherwise uses ATTRIBUTE_METADATA_KEY.\n * \n * Example:\n * @setAttribute('selector1', { valueKey: 'attr1' })\n * @setAttribute('selector2', { valueKey: 'attr2' })\n * myMethod() {\n * return {\n * attr1: 'attribute-value1',\n * attr2: 'attribute-value2'\n * };\n * }\n * \n * First decorator will use 'attribute-value1', second will use 'attribute-value2'\n */\n const extractValue = (v: any) => {\n const keyToUse = finalOptions.valueKey ?? ATTRIBUTE_METADATA_KEY;\n if (v && typeof v === 'object' && keyToUse in v) {\n return v[keyToUse];\n }\n return v;\n };\n\n if (res instanceof Promise) {\n return res.then((v: any) => {\n const extracted = extractValue(v);\n applyValueToTargets(this, extracted);\n return v;\n });\n } else {\n const extracted = extractValue(res);\n applyValueToTargets(this, extracted);\n return res;\n }\n };\n return;\n }\n\n // Property decorator: define getter/setter to proxy to element attributes\n Object.defineProperty(target, propertyKey, {\n configurable: true,\n enumerable: true,\n get(this: any) {\n ensureInit(this);\n const mergedOptions = {...finalOptions, selector, type: finalOptions.type || designType};\n return getAttributeValue(this, targetAttributeName, mergedOptions);\n },\n set(this: any, value: any) {\n ensureInit(this);\n\n if (value instanceof Promise) {\n value.then((v: any) => applyValueToTargets(this, v)).catch(() => { /* swallow */\n });\n } else {\n applyValueToTargets(this, value);\n }\n }\n });\n };\n}\n\n// ============================================\n// Convenience Aliases\n// ============================================\n\n/**\n * @attribute - Field decorator for binding element attributes (read/write)\n * \n * Intelligently distinguishes between attribute names and CSS selectors:\n * \n * Usage patterns:\n * - @attribute('product-id') - Attribute name on $this (auto-detected)\n * - @attribute('#user', 'product-id') - Attribute name on selector\n * - @attribute('product-id', options) - Attribute name on $this with options\n * - @attribute('#user', 'product-id', options) - Attribute name on selector with options\n * - @attribute - Bare decorator (uses property name as attribute on $this)\n * \n * Note: This decorator is for FIELDS ONLY. For methods, use @setAttribute.\n */\nexport function attribute(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function attribute(attributeName: string, options?: AttributeOptions): PropertyDecorator;\nexport function attribute(selector: string, attributeName: string, options?: AttributeOptions): PropertyDecorator;\nexport function attribute(selectorOrAttributeOrTarget?: string | Object, attributeNameOrOptions?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @attribute\n if (optionsOrDescriptor !== undefined && (typeof attributeNameOrOptions === 'string' || typeof attributeNameOrOptions === 'symbol')) {\n return applyAttribute('$this', undefined as any, {})(selectorOrAttributeOrTarget as Object, attributeNameOrOptions, optionsOrDescriptor as PropertyDescriptor);\n }\n \n // With string as first parameter\n if (typeof selectorOrAttributeOrTarget === 'string') {\n // Check if first parameter is a CSS selector or attribute name\n const isSelector = isCssSelector(selectorOrAttributeOrTarget);\n \n if (isSelector) {\n // First param is a selector: @attribute('#user', 'product-id', options?)\n return applyAttribute(selectorOrAttributeOrTarget, attributeNameOrOptions as any, optionsOrDescriptor as AttributeOptions);\n } else {\n // First param is an attribute name: @attribute('product-id', options?)\n // Treat as attribute name on $this\n const options = (typeof attributeNameOrOptions === 'object' && attributeNameOrOptions !== null) \n ? attributeNameOrOptions \n : {};\n return applyAttribute('$this', selectorOrAttributeOrTarget, options);\n }\n }\n \n // Without selector (defaults to $this with options)\n return applyAttribute('$this', undefined as any, selectorOrAttributeOrTarget as AttributeOptions);\n}\n\n/**\n * @setAttribute - Method decorator for setting element attributes from method return value\n * \n * Intelligently distinguishes between attribute names and CSS selectors:\n * \n * Usage patterns:\n * - @setAttribute('data-id') - Attribute name on $this (auto-detected)\n * - @setAttribute('#user', 'data-id') - Attribute name on selector\n * - @setAttribute('data-id', options) - Attribute name on $this with options\n * - @setAttribute('#user', 'data-id', options) - Attribute name on selector with options\n * - @setAttribute - Bare decorator (uses method name as attribute on $this)\n * \n * Note: This decorator is for METHODS ONLY. For fields, use @attribute.\n * \n * Example:\n * @setAttribute('data-status')\n * updateStatus() {\n * return 'active';\n * }\n */\nexport function setAttribute(selector: string, attributeName: string, options?: AttributeOptions): MethodDecorator;\nexport function setAttribute(attributeName: string, options?: AttributeOptions): MethodDecorator;\nexport function setAttribute(selectorOrAttributeOrOptions?: string | AttributeOptions, attributeNameOrOptions?: any, optionsOrUndefined?: AttributeOptions): MethodDecorator {\n // With string as first parameter\n if (typeof selectorOrAttributeOrOptions === 'string') {\n // Check if first parameter is a CSS selector or attribute name\n const isSelector = isCssSelector(selectorOrAttributeOrOptions);\n \n if (isSelector) {\n // First param is a selector: @setAttribute('#user', 'data-id', options?)\n return applyAttribute(selectorOrAttributeOrOptions, attributeNameOrOptions as any, optionsOrUndefined as AttributeOptions) as MethodDecorator;\n } else {\n // First param is an attribute name: @setAttribute('data-id', options?)\n // Treat as attribute name on $this\n const options = (typeof attributeNameOrOptions === 'object' && attributeNameOrOptions !== null) \n ? attributeNameOrOptions \n : {};\n return applyAttribute('$this', selectorOrAttributeOrOptions, options) as MethodDecorator;\n }\n }\n \n // Without selector (defaults to $this with options)\n return applyAttribute('$this', undefined as any, selectorOrAttributeOrOptions as AttributeOptions) as MethodDecorator;\n}\n\n// ============================================\n// Metadata Helpers\n// ============================================\n\nexport const findAllAttributeMetadata = (target: any): AttributeMetadata[] => {\n const actualTarget = target instanceof Function ? target : target.constructor;\n return ReflectUtils.findAllMetadata<AttributeMetadata[]>(ATTRIBUTE_METADATA_KEY, actualTarget).flat();\n};\n\n// Backward compatibility alias\nexport const findAllAttributeApplyMetadata = (target: any): Map<string | symbol, AttributeMetadata> => {\n const result = new Map<string | symbol, AttributeMetadata>();\n findAllAttributeMetadata(target).forEach(meta => {\n result.set(meta.propertyKey, meta);\n });\n return result;\n};\n\n\nexport default applyAttribute;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {ReflectUtils, FunctionUtils, ActionExpression} from '@dooboostore/core';\nimport {ensureInit, getElementConfig} from './elementDefine';\nimport {SwcUtils} from '../utils/Utils';\nimport {SwcQueryOptions, HelperHostSet} from '../types';\nimport {ConvertUtils} from '@dooboostore/core-web';\n\n// ============================================\n// Types & Interfaces\n// ============================================\n\nexport interface AttributeOptions extends SwcQueryOptions {\n name?: string;\n type?: typeof Number | typeof Boolean | typeof String;\n filter?: (target: HTMLElement, value: any, meta: { currentThis: any, helper: HelperHostSet }) => boolean;\n /**\n * Custom key to extract value from return object.\n * If not provided, uses ATTRIBUTE_METADATA_KEY by default.\n * Useful when multiple @setAttribute decorators are on the same method.\n * \n * Example:\n * @setAttribute('selector1', { valueKey: 'attr1' })\n * @setAttribute('selector2', { valueKey: 'attr2' })\n * myMethod() {\n * return {\n * attr1: 'value1',\n * attr2: 'value2'\n * };\n * }\n * \n * Or with symbols:\n * @setAttribute('selector1', { valueKey: Symbol.for('attr1') })\n * @setAttribute('selector2', { valueKey: Symbol.for('attr2') })\n * myMethod() {\n * return {\n * [Symbol.for('attr1')]: 'value1',\n * [Symbol.for('attr2')]: 'value2'\n * };\n * }\n */\n valueKey?: symbol | string;\n}\n\nexport type AttributeSelector = string | ((currentThis: any, helper: HelperHostSet) => NodeList | Element | Element[] | null);\n\nexport interface AttributeMetadata {\n propertyKey: string | symbol;\n selector: AttributeSelector;\n targetAttributeName: string;\n options: AttributeOptions;\n type: 'property' | 'method';\n}\n\nexport const ATTRIBUTE_METADATA_KEY = Symbol.for('simple-web-component:attribute');\n\n// ============================================\n// Utilities\n// ============================================\n\n/**\n * Determine if a string is a CSS selector or an attribute name\n * \n * CSS selectors typically:\n * - Start with: #, ., [, :, >, +, ~\n * - Contain special chars: >, +, ~, :, [, ]\n * - Are special keywords: $this, $host, $parentHost, etc.\n * \n * Attribute names are typically:\n * - kebab-case (lowercase with hyphens)\n * - No special selector syntax\n * \n * @param str - String to check\n * @returns true if it's a CSS selector, false if it's an attribute name\n */\nconst isCssSelector = (str: string): boolean => {\n if (!str) return false;\n \n // Special keywords\n if (str.startsWith('$')) return true;\n \n // CSS selector syntax\n if (/^[#.\\[\\:>+~]/.test(str)) return true;\n \n // Contains CSS combinator or pseudo-selector syntax\n if (/[>+~:\\[\\]]/.test(str)) return true;\n \n return false;\n};\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\nexport {convertValue};\n\nexport const getAttributeValue = (inst: any, attrName: string, options?: AttributeOptions & { selector?: AttributeSelector }): any => {\n const conf = getElementConfig(inst);\n const currentWin = inst._resolveWindow?.(conf) || ((typeof window !== 'undefined' ? window : undefined) as any);\n\n // If selector is not provided, use inst itself\n const targets = options?.selector ? resolveAttributeTargets(inst, options.selector, options) : [inst];\n\n const primaryTarget = targets[0];\n\n if (primaryTarget && typeof (primaryTarget as any).hasAttribute === 'function' && (primaryTarget as any).hasAttribute(attrName)) {\n let domVal = (primaryTarget as any).getAttribute(attrName);\n\n // \uD45C\uD604\uC2DD \uCCB4\uD06C\n const ae = new ActionExpression(domVal);\n const expr = ae.getFirstExpression('callReturn');\n if (expr) {\n try {\n const result = FunctionUtils.executeReturn({\n script: ConvertUtils.decodeHtmlEntity(expr.script, currentWin.document),\n context: inst,\n args: SwcUtils.getHelperAndHostSet(currentWin, inst)\n });\n return convertValue(result, options?.type);\n } catch (err) {\n console.error(`[SWC] Failed to execute directive {{= ${expr.script} }}:`, err);\n return convertValue(domVal, options?.type);\n }\n }\n\n return convertValue(domVal, options?.type);\n }\n\n // If no target found, return null\n return null;\n};\n\n/**\n * Resolve target elements based on selector and options\n * Handles special selectors ($this, $host, etc.), CSS selectors, and function-based selectors\n * Returns HTMLElement[] for attribute operations\n */\nexport const resolveAttributeTargets = (inst: any, selector: AttributeSelector, options: AttributeOptions): HTMLElement[] => {\n const conf = getElementConfig(inst);\n const currentWin = conf.window;\n const r = options.root || 'auto';\n const results: HTMLElement[] = [];\n\n // Resolve selector if it's a function\n let resolvedSelector: string | Element | NodeList | Element[] | null = selector as any;\n if (typeof selector === 'function') {\n const hostSet = SwcUtils.getHelperAndHostSet(currentWin, inst);\n resolvedSelector = selector(inst, hostSet);\n }\n\n // If selector function returned elements directly, use them\n if (resolvedSelector instanceof currentWin.Element) {\n results.push(resolvedSelector as HTMLElement);\n return results;\n }\n if (resolvedSelector instanceof currentWin.NodeList) {\n results.push(...(Array.from(resolvedSelector) as HTMLElement[]));\n return results;\n }\n if (Array.isArray(resolvedSelector)) {\n results.push(...(resolvedSelector as HTMLElement[]));\n return results;\n }\n if (resolvedSelector === null) {\n return results;\n }\n\n // Handle string selector\n const stringSelector = resolvedSelector as string;\n\n const applyRoot = (target: any) => {\n if (!target) return;\n if (r === 'auto') {\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 (stringSelector === '$this' || !stringSelector) {\n applyRoot(inst);\n } else {\n const hostSet = SwcUtils.getHostSet(inst);\n if (stringSelector === '$host') applyRoot(hostSet.$host);\n else if (stringSelector === '$parentHost') applyRoot(hostSet.$parentHost);\n else if (stringSelector === '$appHost') applyRoot(hostSet.$appHost as any);\n else if (stringSelector === '$firstHost') applyRoot(hostSet.$firstHost);\n else if (stringSelector === '$lastHost') applyRoot(hostSet.$lastHost);\n else if (stringSelector === '$firstAppHost') applyRoot(hostSet.$firstAppHost as any);\n else if (stringSelector === '$lastAppHost') applyRoot(hostSet.$lastAppHost as any);\n else if (stringSelector === '$hosts') hostSet.$hosts.forEach(applyRoot);\n else if (stringSelector === '$appHosts') hostSet.$appHosts.forEach(applyRoot);\n else {\n if (r === 'shadow') {\n const found = inst.shadowRoot?.querySelectorAll(stringSelector);\n if (found) results.push(...found);\n } else if (r === 'light') {\n const found = inst.querySelectorAll(stringSelector);\n if (found) results.push(...found);\n } else if (r === 'all') {\n const sMatch = inst.shadowRoot?.querySelectorAll(stringSelector);\n const lMatch = inst.querySelectorAll(stringSelector);\n if (sMatch) results.push(...sMatch);\n if (lMatch) results.push(...lMatch);\n } else {\n const found = (inst.shadowRoot || inst).querySelectorAll(stringSelector);\n if (found) results.push(...found);\n }\n }\n }\n return results;\n};\n\n/**\n * @applyAttribute decorator - set/get element attributes\n *\n * Usage:\n * - @applyAttribute('selector', 'attrName') - Set attribute with explicit name\n * - @applyAttribute('selector') - Use property name as attribute name\n * - @applyAttribute('selector', { name: 'attrName' }) - Set attribute via options\n * - @applyAttribute((this, helper) => 'selector', 'attrName') - Function-based selector\n * - Return null to remove attribute\n */\nexport function applyAttribute(selector: AttributeSelector, targetAttributeName: string, options?: AttributeOptions): MethodDecorator & PropertyDecorator;\nexport function applyAttribute(selector: AttributeSelector, options?: AttributeOptions): MethodDecorator & PropertyDecorator;\nexport function applyAttribute(selector: AttributeSelector, targetAttributeNameOrOptions?: string | AttributeOptions, options?: AttributeOptions): MethodDecorator & PropertyDecorator {\n return (target: Object, propertyKey: string | symbol, descriptor?: PropertyDescriptor) => {\n // ensureInit(target as any);\n\n const constructor = target.constructor;\n const designType = (Reflect as any).getMetadata('design:type', target, propertyKey);\n const metaType: 'property' | 'method' = descriptor && typeof descriptor.value === 'function' ? 'method' : 'property';\n\n // Parse arguments\n let finalOptions: AttributeOptions = {};\n let targetAttributeName: string;\n\n if (typeof targetAttributeNameOrOptions === 'string') {\n // applyAttribute('selector', 'attrName', options?)\n targetAttributeName = targetAttributeNameOrOptions;\n finalOptions = options || {};\n } else if (targetAttributeNameOrOptions) {\n // applyAttribute('selector', options)\n finalOptions = targetAttributeNameOrOptions;\n targetAttributeName = finalOptions.name || String(propertyKey);\n } else {\n // applyAttribute('selector')\n targetAttributeName = String(propertyKey);\n }\n\n // Store metadata\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({\n propertyKey,\n selector: selector as AttributeSelector,\n targetAttributeName,\n options: finalOptions,\n type: metaType\n });\n\n // Helper: Apply resolved value to targets\n const applyValueToTargets = (inst: any, resolvedValue: any) => {\n const conf = getElementConfig(inst);\n const currentWin = conf.window;\n const targetEls = resolveAttributeTargets(inst, selector, finalOptions);\n const hostSet = SwcUtils.getHelperAndHostSet(currentWin, inst);\n\n targetEls.forEach(targetEl => {\n // Apply filter if provided\n if (finalOptions.filter && !finalOptions.filter(targetEl, resolvedValue, {currentThis: inst, helper: hostSet})) {\n return;\n }\n\n if (resolvedValue === null) {\n // Remove attribute if value is null\n targetEl.removeAttribute(targetAttributeName);\n } else if (resolvedValue !== undefined) {\n // Set attribute\n targetEl.setAttribute(targetAttributeName, resolvedValue === true ? '' : String(resolvedValue));\n }\n });\n\n return resolvedValue;\n };\n\n // Method decorator: wrap method to apply its return value to attributes\n if (descriptor && typeof descriptor.value === 'function') {\n const original = descriptor.value;\n descriptor.value = function (...args: any[]) {\n ensureInit(this);\n const res = (original as any).apply(this, args);\n\n /**\n * Extract value for this decorator from method return value\n * \n * If return value is an object with this decorator's key,\n * use that value. Otherwise use the entire return value.\n * \n * Uses valueKey from options if provided, otherwise uses ATTRIBUTE_METADATA_KEY.\n * \n * Example:\n * @setAttribute('selector1', { valueKey: 'attr1' })\n * @setAttribute('selector2', { valueKey: 'attr2' })\n * myMethod() {\n * return {\n * attr1: 'attribute-value1',\n * attr2: 'attribute-value2'\n * };\n * }\n * \n * First decorator will use 'attribute-value1', second will use 'attribute-value2'\n */\n const extractValue = (v: any) => {\n const keyToUse = finalOptions.valueKey ?? ATTRIBUTE_METADATA_KEY;\n if (v && typeof v === 'object' && keyToUse in v) {\n return v[keyToUse];\n }\n return v;\n };\n\n if (res instanceof Promise) {\n return res.then((v: any) => {\n const extracted = extractValue(v);\n applyValueToTargets(this, extracted);\n return v;\n });\n } else {\n const extracted = extractValue(res);\n applyValueToTargets(this, extracted);\n return res;\n }\n };\n return;\n }\n\n // Property decorator: define getter/setter to proxy to element attributes\n Object.defineProperty(target, propertyKey, {\n configurable: true,\n enumerable: true,\n get(this: any) {\n ensureInit(this);\n const mergedOptions = {...finalOptions, selector, type: finalOptions.type || designType};\n return getAttributeValue(this, targetAttributeName, mergedOptions);\n },\n set(this: any, value: any) {\n ensureInit(this);\n\n if (value instanceof Promise) {\n value.then((v: any) => applyValueToTargets(this, v)).catch(() => { /* swallow */\n });\n } else {\n applyValueToTargets(this, value);\n }\n }\n });\n };\n}\n\n// ============================================\n// Convenience Aliases\n// ============================================\n\n/**\n * @attribute - Field decorator for binding element attributes (read/write)\n * \n * Intelligently distinguishes between attribute names and CSS selectors:\n * \n * Usage patterns:\n * - @attribute('product-id') - Attribute name on $this (auto-detected)\n * - @attribute('#user', 'product-id') - Attribute name on selector\n * - @attribute('product-id', options) - Attribute name on $this with options\n * - @attribute('#user', 'product-id', options) - Attribute name on selector with options\n * - @attribute((this, helper) => 'selector', 'product-id') - Function-based selector\n * - @attribute - Bare decorator (uses property name as attribute on $this)\n * \n * Note: This decorator is for FIELDS ONLY. For methods, use @setAttribute.\n */\nexport function attribute(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function attribute(attributeName: string, options?: AttributeOptions): PropertyDecorator;\nexport function attribute(selector: AttributeSelector, attributeName: string, options?: AttributeOptions): PropertyDecorator;\nexport function attribute(selectorOrAttributeOrTarget?: AttributeSelector | Object, attributeNameOrOptions?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @attribute\n if (optionsOrDescriptor !== undefined && (typeof attributeNameOrOptions === 'string' || typeof attributeNameOrOptions === 'symbol')) {\n return applyAttribute('$this', undefined as any, {})(selectorOrAttributeOrTarget as Object, attributeNameOrOptions, optionsOrDescriptor as PropertyDescriptor);\n }\n \n // With string as first parameter\n if (typeof selectorOrAttributeOrTarget === 'string') {\n // Check if first parameter is a CSS selector or attribute name\n const isSelector = isCssSelector(selectorOrAttributeOrTarget);\n \n if (isSelector) {\n // First param is a selector: @attribute('#user', 'product-id', options?)\n return applyAttribute(selectorOrAttributeOrTarget, attributeNameOrOptions as any, optionsOrDescriptor as AttributeOptions);\n } else {\n // First param is an attribute name: @attribute('product-id', options?)\n // Treat as attribute name on $this\n const options = (typeof attributeNameOrOptions === 'object' && attributeNameOrOptions !== null) \n ? attributeNameOrOptions \n : {};\n return applyAttribute('$this', selectorOrAttributeOrTarget, options);\n }\n }\n \n // Without selector (defaults to $this with options)\n return applyAttribute('$this', undefined as any, selectorOrAttributeOrTarget as AttributeOptions);\n}\n\n/**\n * @setAttribute - Method decorator for setting element attributes from method return value\n * \n * Intelligently distinguishes between attribute names and CSS selectors:\n * \n * Usage patterns:\n * - @setAttribute('data-id') - Attribute name on $this (auto-detected)\n * - @setAttribute('#user', 'data-id') - Attribute name on selector\n * - @setAttribute('data-id', options) - Attribute name on $this with options\n * - @setAttribute('#user', 'data-id', options) - Attribute name on selector with options\n * - @setAttribute((this, helper) => 'selector', 'data-id') - Function-based selector\n * - @setAttribute - Bare decorator (uses method name as attribute on $this)\n * \n * Note: This decorator is for METHODS ONLY. For fields, use @attribute.\n * \n * Example:\n * @setAttribute('data-status')\n * updateStatus() {\n * return 'active';\n * }\n */\nexport function setAttribute(selector: AttributeSelector, attributeName: string, options?: AttributeOptions): MethodDecorator;\nexport function setAttribute(attributeName: string, options?: AttributeOptions): MethodDecorator;\nexport function setAttribute(selectorOrAttributeOrOptions?: AttributeSelector | AttributeOptions, attributeNameOrOptions?: any, optionsOrUndefined?: AttributeOptions): MethodDecorator {\n // With string as first parameter\n if (typeof selectorOrAttributeOrOptions === 'string') {\n // Check if first parameter is a CSS selector or attribute name\n const isSelector = isCssSelector(selectorOrAttributeOrOptions);\n \n if (isSelector) {\n // First param is a selector: @setAttribute('#user', 'data-id', options?)\n return applyAttribute(selectorOrAttributeOrOptions, attributeNameOrOptions as any, optionsOrUndefined as AttributeOptions) as MethodDecorator;\n } else {\n // First param is an attribute name: @setAttribute('data-id', options?)\n // Treat as attribute name on $this\n const options = (typeof attributeNameOrOptions === 'object' && attributeNameOrOptions !== null) \n ? attributeNameOrOptions \n : {};\n return applyAttribute('$this', selectorOrAttributeOrOptions, options) as MethodDecorator;\n }\n }\n \n // Without selector (defaults to $this with options)\n return applyAttribute('$this', undefined as any, selectorOrAttributeOrOptions as AttributeOptions) as MethodDecorator;\n}\n\n// ============================================\n// Metadata Helpers\n// ============================================\n\nexport const findAllAttributeMetadata = (target: any): AttributeMetadata[] => {\n const actualTarget = target instanceof Function ? target : target.constructor;\n return ReflectUtils.findAllMetadata<AttributeMetadata[]>(ATTRIBUTE_METADATA_KEY, actualTarget).flat();\n};\n\n// Backward compatibility alias\nexport const findAllAttributeApplyMetadata = (target: any): Map<string | symbol, AttributeMetadata> => {\n const result = new Map<string | symbol, AttributeMetadata>();\n findAllAttributeMetadata(target).forEach(meta => {\n result.set(meta.propertyKey, meta);\n });\n return result;\n};\n\n\nexport default applyAttribute;\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -31,6 +31,58 @@ var import_core = require("@dooboostore/core");
31
31
  var import_elementDefine = require("./elementDefine");
32
32
  var import_Utils = require("../utils/Utils");
33
33
  const CLASS_METADATA_KEY = Symbol.for("simple-web-component:class");
34
+ const resolveSelector = (selector, inst, win) => {
35
+ if (typeof selector === "function") {
36
+ const hostSet = import_Utils.SwcUtils.getHelperAndHostSet(win, inst);
37
+ const result = selector(inst, hostSet);
38
+ if (result instanceof win.Element) {
39
+ return [result];
40
+ }
41
+ if (result instanceof win.NodeList) {
42
+ return Array.from(result);
43
+ }
44
+ if (Array.isArray(result)) {
45
+ return result;
46
+ }
47
+ if (result === null) {
48
+ return [];
49
+ }
50
+ return result;
51
+ }
52
+ return selector;
53
+ };
54
+ const getTargetElements = (selector, inst, win, root) => {
55
+ const resolved = resolveSelector(selector, inst, win);
56
+ if (Array.isArray(resolved)) {
57
+ return resolved;
58
+ }
59
+ const stringSelector = resolved;
60
+ const targetEls = [];
61
+ const host = inst;
62
+ const hostSet = import_Utils.SwcUtils.getHelperAndHostSet(win, inst);
63
+ const applyRoot = (t) => {
64
+ if (!t || !(t instanceof win.HTMLElement)) return;
65
+ targetEls.push(t);
66
+ };
67
+ if (stringSelector === "$this" || !stringSelector) applyRoot(host);
68
+ else if (stringSelector === "$host") applyRoot(hostSet.$host);
69
+ else if (stringSelector === "$parentHost") applyRoot(hostSet.$parentHost);
70
+ else if (stringSelector === "$appHost") applyRoot(hostSet.$appHost);
71
+ else if (stringSelector === "$firstHost") applyRoot(hostSet.$firstHost);
72
+ else if (stringSelector === "$lastHost") applyRoot(hostSet.$lastHost);
73
+ else if (stringSelector === "$firstAppHost") applyRoot(hostSet.$firstAppHost);
74
+ else if (stringSelector === "$lastAppHost") applyRoot(hostSet.$lastAppHost);
75
+ else if (stringSelector === "$hosts") hostSet.$hosts.forEach(applyRoot);
76
+ else if (stringSelector === "$appHosts") hostSet.$appHosts.forEach(applyRoot);
77
+ else {
78
+ const targetRoot = root === "auto" ? host.shadowRoot || host : root === "shadow" ? host.shadowRoot : host;
79
+ if (targetRoot) {
80
+ const found = targetRoot.querySelectorAll(stringSelector);
81
+ if (found) targetEls.push(...Array.from(found));
82
+ }
83
+ }
84
+ return targetEls;
85
+ };
34
86
  function createClassDecorator(action) {
35
87
  return (selector, classMapOrOptions, options = {}) => {
36
88
  return (target, propertyKey, descriptor) => {
@@ -65,28 +117,7 @@ function createClassDecorator(action) {
65
117
  const host = this;
66
118
  const hostSet = { ...import_Utils.SwcUtils.getHelperAndHostSet(win, host), $this: this };
67
119
  const r = finalOptions.root || "auto";
68
- const targetEls = [];
69
- const applyRoot = (t) => {
70
- if (!t || !(t instanceof win.HTMLElement)) return;
71
- targetEls.push(t);
72
- };
73
- if (selector === "$this" || !selector) applyRoot(host);
74
- else if (selector === "$host") applyRoot(hostSet.$host);
75
- else if (selector === "$parentHost") applyRoot(hostSet.$parentHost);
76
- else if (selector === "$appHost") applyRoot(hostSet.$appHost);
77
- else if (selector === "$firstHost") applyRoot(hostSet.$firstHost);
78
- else if (selector === "$lastHost") applyRoot(hostSet.$lastHost);
79
- else if (selector === "$firstAppHost") applyRoot(hostSet.$firstAppHost);
80
- else if (selector === "$lastAppHost") applyRoot(hostSet.$lastAppHost);
81
- else if (selector === "$hosts") hostSet.$hosts.forEach(applyRoot);
82
- else if (selector === "$appHosts") hostSet.$appHosts.forEach(applyRoot);
83
- else {
84
- const targetRoot = r === "auto" ? host.shadowRoot || host : r === "shadow" ? host.shadowRoot : host;
85
- if (targetRoot) {
86
- const found = targetRoot.querySelectorAll(selector);
87
- if (found) targetEls.push(...Array.from(found));
88
- }
89
- }
120
+ const targetEls = getTargetElements(selector, this, win, r);
90
121
  targetEls.forEach((targetEl) => {
91
122
  if (finalOptions.filter && !finalOptions.filter(targetEl, resolvedValue, { currentThis: this, helper: hostSet })) {
92
123
  return;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/decorators/applyClass.ts"],
4
- "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core';\nimport { ensureInit } from './elementDefine';\nimport { SwcUtils } from '../utils/Utils';\nimport { SpecialSelector, SwcQueryOptions, HelperHostSet } from '../types';\n\nexport const CLASS_METADATA_KEY = Symbol.for('simple-web-component:class');\n\nexport type ClassAction = 'set' | 'update' | 'add' | 'remove' | 'toggle';\n\nexport interface ClassApplyOptions extends SwcQueryOptions {\n filter?: (target: HTMLElement, value: any, meta: {currentThis: any, helper: HelperHostSet}) => boolean;\n /**\n * Custom key to extract value from return object.\n * If not provided, uses CLASS_METADATA_KEY by default.\n * Useful when multiple @applyClass decorators are on the same method.\n */\n valueKey?: symbol | string;\n}\n\nexport interface ClassApplyMetadata {\n propertyKey: string | symbol;\n selector: string;\n action: ClassAction;\n options: ClassApplyOptions;\n}\n\nfunction createClassDecorator(action: ClassAction) {\n return (selector: string, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options: ClassApplyOptions = {}): MethodDecorator => {\n return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n let metaList = ReflectUtils.getOwnMetadata(CLASS_METADATA_KEY, constructor) as Map<string | symbol, ClassApplyMetadata>;\n if (!metaList) {\n metaList = new Map<string | symbol, ClassApplyMetadata>();\n ReflectUtils.defineMetadata(CLASS_METADATA_KEY, metaList, constructor);\n }\n\n let classMap: any = undefined;\n let finalOptions = options;\n\n if (typeof classMapOrOptions === 'string' || (typeof classMapOrOptions === 'object' && classMapOrOptions !== null && !('root' in classMapOrOptions))) {\n classMap = classMapOrOptions;\n } else if (typeof classMapOrOptions === 'object' && classMapOrOptions !== null && 'root' in classMapOrOptions) {\n finalOptions = classMapOrOptions as ClassApplyOptions;\n }\n\n metaList.set(propertyKey, { propertyKey, selector, action, options: finalOptions });\n\n const original = descriptor.value;\n descriptor.value = function (...args: any[]) {\n ensureInit(this);\n const res = (original as any).apply(this, args);\n\n /**\n * Extract value for this decorator from method return value\n * \n * If return value is an object with this decorator's key,\n * use that value. Otherwise use the entire return value.\n * \n * Uses valueKey from options if provided, otherwise uses CLASS_METADATA_KEY.\n */\n const extractValue = (v: any) => {\n const keyToUse = finalOptions.valueKey ?? CLASS_METADATA_KEY;\n if (v && typeof v === 'object' && keyToUse in v) {\n return v[keyToUse];\n }\n return v;\n };\n\n const handleResult = (resolvedValue: any) => {\n if (resolvedValue !== undefined) {\n const win = (this as any).ownerDocument?.defaultView || window;\n const host = this as unknown as HTMLElement;\n const hostSet = { ...SwcUtils.getHelperAndHostSet(win, host), $this: this };\n const r = finalOptions.root || 'auto';\n const targetEls: HTMLElement[] = [];\n\n const applyRoot = (t: any) => {\n if (!t || !(t instanceof win.HTMLElement)) return;\n targetEls.push(t);\n };\n\n if (selector === '$this' || !selector) applyRoot(host);\n else if (selector === '$host') applyRoot(hostSet.$host);\n else if (selector === '$parentHost') applyRoot(hostSet.$parentHost);\n else if (selector === '$appHost') applyRoot(hostSet.$appHost);\n else if (selector === '$firstHost') applyRoot(hostSet.$firstHost);\n else if (selector === '$lastHost') applyRoot(hostSet.$lastHost);\n else if (selector === '$firstAppHost') applyRoot(hostSet.$firstAppHost);\n else if (selector === '$lastAppHost') applyRoot(hostSet.$lastAppHost);\n else if (selector === '$hosts') hostSet.$hosts.forEach(applyRoot);\n else if (selector === '$appHosts') hostSet.$appHosts.forEach(applyRoot);\n else {\n const targetRoot = r === 'auto' ? (host.shadowRoot || host) : (r === 'shadow' ? host.shadowRoot : host);\n if (targetRoot) {\n const found = targetRoot.querySelectorAll(selector);\n if (found) targetEls.push(...(Array.from(found) as HTMLElement[]));\n }\n }\n\n targetEls.forEach(targetEl => {\n if (finalOptions.filter && !finalOptions.filter(targetEl, resolvedValue, {currentThis: this, helper: hostSet})) {\n return;\n }\n const resolvedRes = typeof resolvedValue === 'function' ? (resolvedValue as any)(targetEl, hostSet) : resolvedValue;\n\n if (action === 'set') {\n let classes = '';\n if (classMap && typeof classMap === 'string') {\n classes = resolvedRes ? classMap : '';\n } else if (typeof resolvedRes === 'object' && resolvedRes !== null && !Array.isArray(resolvedRes)) {\n classes = Object.entries(resolvedRes as any)\n .filter(([_, force]) => typeof force === 'function' ? force(targetEl, hostSet) : !!force)\n .map(([cls]) => cls)\n .join(' ');\n } else {\n classes = Array.isArray(resolvedRes) ? (resolvedRes as any[]).join(' ') : String(resolvedRes);\n }\n targetEl.className = classes;\n } else if (action === 'update' || action === 'toggle') {\n if (classMap && typeof classMap === 'string') {\n targetEl.classList.toggle(classMap, !!resolvedRes);\n } else if (typeof resolvedRes === 'object' && resolvedRes !== null && !Array.isArray(resolvedRes)) {\n Object.entries(resolvedRes as any).forEach(([cls, force]) => {\n const isActive = typeof force === 'function' ? force(targetEl, hostSet) : !!force;\n targetEl.classList.toggle(cls, isActive);\n });\n } else {\n const classes = Array.isArray(resolvedRes) ? (resolvedRes as any[]).map(String) : [String(resolvedRes)];\n if (action === 'update') targetEl.classList.add(...classes);\n else classes.forEach(c => targetEl.classList.toggle(c));\n }\n } else if (action === 'add' || action === 'remove') {\n if (classMap && typeof classMap === 'string' && !!resolvedRes) {\n if (action === 'add') targetEl.classList.add(classMap);\n else targetEl.classList.remove(classMap);\n } else if (typeof resolvedRes === 'object' && resolvedRes !== null && !Array.isArray(resolvedRes)) {\n Object.entries(resolvedRes as any).forEach(([cls, force]) => {\n const shouldExecute = typeof force === 'function' ? force(targetEl, hostSet) : !!force;\n if (shouldExecute) {\n if (action === 'add') targetEl.classList.add(cls);\n else targetEl.classList.remove(cls);\n }\n });\n } else {\n const classes = Array.isArray(resolvedRes) ? (resolvedRes as any[]).map(String) : [String(resolvedRes)];\n if (action === 'add') targetEl.classList.add(...classes);\n else targetEl.classList.remove(...classes);\n }\n }\n });\n }\n return resolvedValue;\n };\n\n if (res instanceof Promise) {\n return res.then((v: any) => handleResult(extractValue(v)));\n } else {\n return handleResult(extractValue(res));\n }\n };\n return descriptor;\n };\n };\n}\n\nexport function applyClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function applyClass(selector: string, action?: ClassAction, options?: ClassApplyOptions): MethodDecorator;\nexport function applyClass(selectorOrTarget?: any, actionOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @applyClass\n if (optionsOrDescriptor !== undefined && (typeof actionOrPropertyKey === 'string' || typeof actionOrPropertyKey === 'symbol')) {\n return createClassDecorator('update')('$this', {})(selectorOrTarget as Object, actionOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n const action = (typeof actionOrPropertyKey === 'string' ? actionOrPropertyKey : 'update') as ClassAction;\n const options = (typeof actionOrPropertyKey === 'object' ? actionOrPropertyKey : optionsOrDescriptor) as ClassApplyOptions | undefined;\n return createClassDecorator(action)(selectorOrTarget, options);\n }\n // Without selector (defaults to $this)\n const action = (typeof selectorOrTarget === 'string' ? selectorOrTarget : 'update') as ClassAction;\n const options = (typeof selectorOrTarget === 'object' ? selectorOrTarget : actionOrPropertyKey) as ClassApplyOptions | undefined;\n return createClassDecorator(action)('$this', options);\n}\n\nexport function setClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function setClass(selector: string, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options?: ClassApplyOptions): MethodDecorator;\nexport function setClass(selectorOrTarget?: any, classMapOrOptionsOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @setClass\n if (optionsOrDescriptor !== undefined && (typeof classMapOrOptionsOrPropertyKey === 'string' || typeof classMapOrOptionsOrPropertyKey === 'symbol')) {\n return createClassDecorator('set')('$this', {})(selectorOrTarget as Object, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n return createClassDecorator('set')(selectorOrTarget, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as ClassApplyOptions);\n }\n // Without selector (defaults to $this)\n return createClassDecorator('set')('$this', selectorOrTarget as ClassApplyOptions);\n}\n\nexport function updateClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function updateClass(selector: string, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options?: ClassApplyOptions): MethodDecorator;\nexport function updateClass(selectorOrTarget?: any, classMapOrOptionsOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @updateClass\n if (optionsOrDescriptor !== undefined && (typeof classMapOrOptionsOrPropertyKey === 'string' || typeof classMapOrOptionsOrPropertyKey === 'symbol')) {\n return createClassDecorator('update')('$this', {})(selectorOrTarget as Object, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n return createClassDecorator('update')(selectorOrTarget, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as ClassApplyOptions);\n }\n // Without selector (defaults to $this)\n return createClassDecorator('update')('$this', selectorOrTarget as ClassApplyOptions);\n}\n\nexport function addClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function addClass(selector: string, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options?: ClassApplyOptions): MethodDecorator;\nexport function addClass(selectorOrTarget?: any, classMapOrOptionsOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @addClass\n if (optionsOrDescriptor !== undefined && (typeof classMapOrOptionsOrPropertyKey === 'string' || typeof classMapOrOptionsOrPropertyKey === 'symbol')) {\n return createClassDecorator('add')('$this', {})(selectorOrTarget as Object, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n return createClassDecorator('add')(selectorOrTarget, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as ClassApplyOptions);\n }\n // Without selector (defaults to $this)\n return createClassDecorator('add')('$this', selectorOrTarget as ClassApplyOptions);\n}\n\nexport function removeClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function removeClass(selector: string, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options?: ClassApplyOptions): MethodDecorator;\nexport function removeClass(selectorOrTarget?: any, classMapOrOptionsOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @removeClass\n if (optionsOrDescriptor !== undefined && (typeof classMapOrOptionsOrPropertyKey === 'string' || typeof classMapOrOptionsOrPropertyKey === 'symbol')) {\n return createClassDecorator('remove')('$this', {})(selectorOrTarget as Object, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n return createClassDecorator('remove')(selectorOrTarget, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as ClassApplyOptions);\n }\n // Without selector (defaults to $this)\n return createClassDecorator('remove')('$this', selectorOrTarget as ClassApplyOptions);\n}\n\nexport function toggleClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function toggleClass(selector: string, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options?: ClassApplyOptions): MethodDecorator;\nexport function toggleClass(selectorOrTarget?: any, classMapOrOptionsOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @toggleClass\n if (optionsOrDescriptor !== undefined && (typeof classMapOrOptionsOrPropertyKey === 'string' || typeof classMapOrOptionsOrPropertyKey === 'symbol')) {\n return createClassDecorator('toggle')('$this', {})(selectorOrTarget as Object, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n return createClassDecorator('toggle')(selectorOrTarget, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as ClassApplyOptions);\n }\n // Without selector (defaults to $this)\n return createClassDecorator('toggle')('$this', selectorOrTarget as ClassApplyOptions);\n}\n\nexport const findAllClassMetadata = (target: any): Map<string | symbol, ClassApplyMetadata> => {\n const result = new Map<string | symbol, ClassApplyMetadata>();\n const maps = ReflectUtils.findAllMetadata<Map<string | symbol, ClassApplyMetadata>>(CLASS_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';\nimport { SpecialSelector, SwcQueryOptions, HelperHostSet } from '../types';\n\nexport const CLASS_METADATA_KEY = Symbol.for('simple-web-component:class');\n\nexport type ClassAction = 'set' | 'update' | 'add' | 'remove' | 'toggle';\n\n/**\n * Resolve selector to string or elements\n * Handles function-based selectors and returns elements if applicable\n */\nconst resolveSelector = (selector: ClassSelector, inst: any, win: Window): string | HTMLElement[] => {\n if (typeof selector === 'function') {\n const hostSet = SwcUtils.getHelperAndHostSet(win, inst);\n const result = selector(inst, hostSet);\n \n if (result instanceof win.Element) {\n return [result as HTMLElement];\n }\n if (result instanceof win.NodeList) {\n return Array.from(result) as HTMLElement[];\n }\n if (Array.isArray(result)) {\n return result as HTMLElement[];\n }\n if (result === null) {\n return [];\n }\n return result as string;\n }\n return selector as string;\n};\n\n/**\n * Get target elements from selector\n */\nconst getTargetElements = (selector: ClassSelector, inst: any, win: Window, root: string): HTMLElement[] => {\n const resolved = resolveSelector(selector, inst, win);\n \n if (Array.isArray(resolved)) {\n return resolved;\n }\n\n const stringSelector = resolved as string;\n const targetEls: HTMLElement[] = [];\n const host = inst as unknown as HTMLElement;\n const hostSet = SwcUtils.getHelperAndHostSet(win, inst);\n\n const applyRoot = (t: any) => {\n if (!t || !(t instanceof win.HTMLElement)) return;\n targetEls.push(t);\n };\n\n if (stringSelector === '$this' || !stringSelector) applyRoot(host);\n else if (stringSelector === '$host') applyRoot(hostSet.$host);\n else if (stringSelector === '$parentHost') applyRoot(hostSet.$parentHost);\n else if (stringSelector === '$appHost') applyRoot(hostSet.$appHost);\n else if (stringSelector === '$firstHost') applyRoot(hostSet.$firstHost);\n else if (stringSelector === '$lastHost') applyRoot(hostSet.$lastHost);\n else if (stringSelector === '$firstAppHost') applyRoot(hostSet.$firstAppHost);\n else if (stringSelector === '$lastAppHost') applyRoot(hostSet.$lastAppHost);\n else if (stringSelector === '$hosts') hostSet.$hosts.forEach(applyRoot);\n else if (stringSelector === '$appHosts') hostSet.$appHosts.forEach(applyRoot);\n else {\n const targetRoot = root === 'auto' ? (host.shadowRoot || host) : (root === 'shadow' ? host.shadowRoot : host);\n if (targetRoot) {\n const found = targetRoot.querySelectorAll(stringSelector);\n if (found) targetEls.push(...(Array.from(found) as HTMLElement[]));\n }\n }\n\n return targetEls;\n};\n\nexport interface ClassApplyOptions extends SwcQueryOptions {\n filter?: (target: HTMLElement, value: any, meta: {currentThis: any, helper: HelperHostSet}) => boolean;\n /**\n * Custom key to extract value from return object.\n * If not provided, uses CLASS_METADATA_KEY by default.\n * Useful when multiple @applyClass decorators are on the same method.\n */\n valueKey?: symbol | string;\n}\n\nexport type ClassSelector = string | ((currentThis: any, helper: HelperHostSet) => NodeList | Element | Element[] | null);\n\nexport interface ClassApplyMetadata {\n propertyKey: string | symbol;\n selector: ClassSelector;\n action: ClassAction;\n options: ClassApplyOptions;\n}\n\nfunction createClassDecorator(action: ClassAction) {\n return (selector: ClassSelector, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options: ClassApplyOptions = {}): MethodDecorator => {\n return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n let metaList = ReflectUtils.getOwnMetadata(CLASS_METADATA_KEY, constructor) as Map<string | symbol, ClassApplyMetadata>;\n if (!metaList) {\n metaList = new Map<string | symbol, ClassApplyMetadata>();\n ReflectUtils.defineMetadata(CLASS_METADATA_KEY, metaList, constructor);\n }\n\n let classMap: any = undefined;\n let finalOptions = options;\n\n if (typeof classMapOrOptions === 'string' || (typeof classMapOrOptions === 'object' && classMapOrOptions !== null && !('root' in classMapOrOptions))) {\n classMap = classMapOrOptions;\n } else if (typeof classMapOrOptions === 'object' && classMapOrOptions !== null && 'root' in classMapOrOptions) {\n finalOptions = classMapOrOptions as ClassApplyOptions;\n }\n\n metaList.set(propertyKey, { propertyKey, selector, action, options: finalOptions });\n\n const original = descriptor.value;\n descriptor.value = function (...args: any[]) {\n ensureInit(this);\n const res = (original as any).apply(this, args);\n\n /**\n * Extract value for this decorator from method return value\n * \n * If return value is an object with this decorator's key,\n * use that value. Otherwise use the entire return value.\n * \n * Uses valueKey from options if provided, otherwise uses CLASS_METADATA_KEY.\n */\n const extractValue = (v: any) => {\n const keyToUse = finalOptions.valueKey ?? CLASS_METADATA_KEY;\n if (v && typeof v === 'object' && keyToUse in v) {\n return v[keyToUse];\n }\n return v;\n };\n\n const handleResult = (resolvedValue: any) => {\n if (resolvedValue !== undefined) {\n const win = (this as any).ownerDocument?.defaultView || window;\n const host = this as unknown as HTMLElement;\n const hostSet = { ...SwcUtils.getHelperAndHostSet(win, host), $this: this };\n const r = finalOptions.root || 'auto';\n const targetEls = getTargetElements(selector, this, win, r);\n\n targetEls.forEach(targetEl => {\n if (finalOptions.filter && !finalOptions.filter(targetEl, resolvedValue, {currentThis: this, helper: hostSet})) {\n return;\n }\n const resolvedRes = typeof resolvedValue === 'function' ? (resolvedValue as any)(targetEl, hostSet) : resolvedValue;\n\n if (action === 'set') {\n let classes = '';\n if (classMap && typeof classMap === 'string') {\n classes = resolvedRes ? classMap : '';\n } else if (typeof resolvedRes === 'object' && resolvedRes !== null && !Array.isArray(resolvedRes)) {\n classes = Object.entries(resolvedRes as any)\n .filter(([_, force]) => typeof force === 'function' ? force(targetEl, hostSet) : !!force)\n .map(([cls]) => cls)\n .join(' ');\n } else {\n classes = Array.isArray(resolvedRes) ? (resolvedRes as any[]).join(' ') : String(resolvedRes);\n }\n targetEl.className = classes;\n } else if (action === 'update' || action === 'toggle') {\n if (classMap && typeof classMap === 'string') {\n targetEl.classList.toggle(classMap, !!resolvedRes);\n } else if (typeof resolvedRes === 'object' && resolvedRes !== null && !Array.isArray(resolvedRes)) {\n Object.entries(resolvedRes as any).forEach(([cls, force]) => {\n const isActive = typeof force === 'function' ? force(targetEl, hostSet) : !!force;\n targetEl.classList.toggle(cls, isActive);\n });\n } else {\n const classes = Array.isArray(resolvedRes) ? (resolvedRes as any[]).map(String) : [String(resolvedRes)];\n if (action === 'update') targetEl.classList.add(...classes);\n else classes.forEach(c => targetEl.classList.toggle(c));\n }\n } else if (action === 'add' || action === 'remove') {\n if (classMap && typeof classMap === 'string' && !!resolvedRes) {\n if (action === 'add') targetEl.classList.add(classMap);\n else targetEl.classList.remove(classMap);\n } else if (typeof resolvedRes === 'object' && resolvedRes !== null && !Array.isArray(resolvedRes)) {\n Object.entries(resolvedRes as any).forEach(([cls, force]) => {\n const shouldExecute = typeof force === 'function' ? force(targetEl, hostSet) : !!force;\n if (shouldExecute) {\n if (action === 'add') targetEl.classList.add(cls);\n else targetEl.classList.remove(cls);\n }\n });\n } else {\n const classes = Array.isArray(resolvedRes) ? (resolvedRes as any[]).map(String) : [String(resolvedRes)];\n if (action === 'add') targetEl.classList.add(...classes);\n else targetEl.classList.remove(...classes);\n }\n }\n });\n }\n return resolvedValue;\n };\n\n if (res instanceof Promise) {\n return res.then((v: any) => handleResult(extractValue(v)));\n } else {\n return handleResult(extractValue(res));\n }\n };\n return descriptor;\n };\n };\n}\n\nexport function applyClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function applyClass(selector: ClassSelector, action?: ClassAction, options?: ClassApplyOptions): MethodDecorator;\nexport function applyClass(selectorOrTarget?: any, actionOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @applyClass\n if (optionsOrDescriptor !== undefined && (typeof actionOrPropertyKey === 'string' || typeof actionOrPropertyKey === 'symbol')) {\n return createClassDecorator('update')('$this', {})(selectorOrTarget as Object, actionOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n const action = (typeof actionOrPropertyKey === 'string' ? actionOrPropertyKey : 'update') as ClassAction;\n const options = (typeof actionOrPropertyKey === 'object' ? actionOrPropertyKey : optionsOrDescriptor) as ClassApplyOptions | undefined;\n return createClassDecorator(action)(selectorOrTarget, options);\n }\n // Without selector (defaults to $this)\n const action = (typeof selectorOrTarget === 'string' ? selectorOrTarget : 'update') as ClassAction;\n const options = (typeof selectorOrTarget === 'object' ? selectorOrTarget : actionOrPropertyKey) as ClassApplyOptions | undefined;\n return createClassDecorator(action)('$this', options);\n}\n\nexport function setClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function setClass(selector: ClassSelector, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options?: ClassApplyOptions): MethodDecorator;\nexport function setClass(selectorOrTarget?: any, classMapOrOptionsOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @setClass\n if (optionsOrDescriptor !== undefined && (typeof classMapOrOptionsOrPropertyKey === 'string' || typeof classMapOrOptionsOrPropertyKey === 'symbol')) {\n return createClassDecorator('set')('$this', {})(selectorOrTarget as Object, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n return createClassDecorator('set')(selectorOrTarget, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as ClassApplyOptions);\n }\n // Without selector (defaults to $this)\n return createClassDecorator('set')('$this', selectorOrTarget as ClassApplyOptions);\n}\n\nexport function updateClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function updateClass(selector: ClassSelector, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options?: ClassApplyOptions): MethodDecorator;\nexport function updateClass(selectorOrTarget?: any, classMapOrOptionsOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @updateClass\n if (optionsOrDescriptor !== undefined && (typeof classMapOrOptionsOrPropertyKey === 'string' || typeof classMapOrOptionsOrPropertyKey === 'symbol')) {\n return createClassDecorator('update')('$this', {})(selectorOrTarget as Object, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n return createClassDecorator('update')(selectorOrTarget, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as ClassApplyOptions);\n }\n // Without selector (defaults to $this)\n return createClassDecorator('update')('$this', selectorOrTarget as ClassApplyOptions);\n}\n\nexport function addClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function addClass(selector: ClassSelector, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options?: ClassApplyOptions): MethodDecorator;\nexport function addClass(selectorOrTarget?: any, classMapOrOptionsOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @addClass\n if (optionsOrDescriptor !== undefined && (typeof classMapOrOptionsOrPropertyKey === 'string' || typeof classMapOrOptionsOrPropertyKey === 'symbol')) {\n return createClassDecorator('add')('$this', {})(selectorOrTarget as Object, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n return createClassDecorator('add')(selectorOrTarget, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as ClassApplyOptions);\n }\n // Without selector (defaults to $this)\n return createClassDecorator('add')('$this', selectorOrTarget as ClassApplyOptions);\n}\n\nexport function removeClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function removeClass(selector: ClassSelector, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options?: ClassApplyOptions): MethodDecorator;\nexport function removeClass(selectorOrTarget?: any, classMapOrOptionsOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @removeClass\n if (optionsOrDescriptor !== undefined && (typeof classMapOrOptionsOrPropertyKey === 'string' || typeof classMapOrOptionsOrPropertyKey === 'symbol')) {\n return createClassDecorator('remove')('$this', {})(selectorOrTarget as Object, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n return createClassDecorator('remove')(selectorOrTarget, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as ClassApplyOptions);\n }\n // Without selector (defaults to $this)\n return createClassDecorator('remove')('$this', selectorOrTarget as ClassApplyOptions);\n}\n\nexport function toggleClass(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor | void;\nexport function toggleClass(selector: ClassSelector, classMapOrOptions?: string | { [className: string]: (el: HTMLElement, value: any, helper: HelperHostSet & { $this: any }) => boolean } | ClassApplyOptions, options?: ClassApplyOptions): MethodDecorator;\nexport function toggleClass(selectorOrTarget?: any, classMapOrOptionsOrPropertyKey?: any, optionsOrDescriptor?: any): any {\n // Bare decorator: @toggleClass\n if (optionsOrDescriptor !== undefined && (typeof classMapOrOptionsOrPropertyKey === 'string' || typeof classMapOrOptionsOrPropertyKey === 'symbol')) {\n return createClassDecorator('toggle')('$this', {})(selectorOrTarget as Object, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as PropertyDescriptor);\n }\n // With selector\n if (typeof selectorOrTarget === 'string') {\n return createClassDecorator('toggle')(selectorOrTarget, classMapOrOptionsOrPropertyKey, optionsOrDescriptor as ClassApplyOptions);\n }\n // Without selector (defaults to $this)\n return createClassDecorator('toggle')('$this', selectorOrTarget as ClassApplyOptions);\n}\n\nexport const findAllClassMetadata = (target: any): Map<string | symbol, ClassApplyMetadata> => {\n const result = new Map<string | symbol, ClassApplyMetadata>();\n const maps = ReflectUtils.findAllMetadata<Map<string | symbol, ClassApplyMetadata>>(CLASS_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": ["action", "options"]
7
7
  }