@dooboostore/simple-web-component 1.0.1 → 1.0.2

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 (41) hide show
  1. package/README.md +26 -31
  2. package/dist/cjs/elements/SwcForOf.js +6 -76
  3. package/dist/cjs/elements/SwcForOf.js.map +2 -2
  4. package/dist/cjs/elements/SwcHTMLElementBase.js +102 -0
  5. package/dist/cjs/elements/SwcHTMLElementBase.js.map +7 -0
  6. package/dist/cjs/elements/SwcIf.js +5 -13
  7. package/dist/cjs/elements/SwcIf.js.map +2 -2
  8. package/dist/cjs/elements/SwcObject.js +115 -0
  9. package/dist/cjs/elements/SwcObject.js.map +7 -0
  10. package/dist/cjs/index.js +2 -0
  11. package/dist/cjs/index.js.map +2 -2
  12. package/dist/esm/elements/SwcForOf.js +6 -76
  13. package/dist/esm/elements/SwcForOf.js.map +2 -2
  14. package/dist/esm/elements/SwcHTMLElementBase.js +83 -0
  15. package/dist/esm/elements/SwcHTMLElementBase.js.map +7 -0
  16. package/dist/esm/elements/SwcIf.js +5 -13
  17. package/dist/esm/elements/SwcIf.js.map +2 -2
  18. package/dist/esm/elements/SwcObject.js +96 -0
  19. package/dist/esm/elements/SwcObject.js.map +7 -0
  20. package/dist/esm/index.js +2 -0
  21. package/dist/esm/index.js.map +2 -2
  22. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +184 -89
  23. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  24. package/dist/types/elements/SwcForOf.d.ts +2 -4
  25. package/dist/types/elements/SwcForOf.d.ts.map +1 -1
  26. package/dist/types/elements/SwcHTMLElementBase.d.ts +14 -0
  27. package/dist/types/elements/SwcHTMLElementBase.d.ts.map +1 -0
  28. package/dist/types/elements/SwcIf.d.ts +2 -2
  29. package/dist/types/elements/SwcIf.d.ts.map +1 -1
  30. package/dist/types/elements/SwcObject.d.ts +14 -0
  31. package/dist/types/elements/SwcObject.d.ts.map +1 -0
  32. package/dist/types/index.d.ts +2 -0
  33. package/dist/types/index.d.ts.map +1 -1
  34. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +184 -89
  35. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  36. package/package.json +1 -1
  37. package/src/elements/SwcForOf.ts +10 -85
  38. package/src/elements/SwcHTMLElementBase.ts +93 -0
  39. package/src/elements/SwcIf.ts +6 -25
  40. package/src/elements/SwcObject.ts +78 -0
  41. package/src/index.ts +2 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/bundle-entry.ts", "../../../core/src/reflect/ReflectUtils.ts", "../../src/decorators/attributeChanged.ts", "../../src/decorators/template.ts", "../../src/decorators/style.ts", "../../src/decorators/query.ts", "../../src/decorators/queryAll.ts", "../../src/decorators/addEventListener.ts", "../../src/decorators/elementDefind.ts", "../../src/elements/SwcForOf.ts", "../../src/elements/SwcIf.ts", "../../src/elements/SwcChoose.ts", "../../src/elements/SwcWhen.ts", "../../src/elements/SwcOther.ts"],
4
- "sourcesContent": ["export * from './index';\n", "import { ConstructorType } from '../types';\nexport namespace ReflectUtils {\n export const getParameterTypes = (target: any, propertyKey?: string | symbol): ConstructorType<any>[] => {\n // console.log('---------param')\n if (propertyKey) {\n return Reflect.getMetadata('design:paramtypes', target, propertyKey) || [];\n } else {\n return Reflect.getMetadata('design:paramtypes', target) || [];\n }\n }\n\n\n export const getReturnType = (target: any, propertyKey: string | symbol): any => {\n return Reflect.getMetadata('design:returntype', target, propertyKey);\n }\n\n // @Reflect.metadata(\"design:type\", Point)\n export const getType = (target: any, propertyKey?: string | symbol): any => {\n if (propertyKey) {\n return Reflect.getMetadata('design:type', target, propertyKey);\n } else {\n return Reflect.getMetadata('design:type', target);\n }\n }\n\n export const getMetadata = <T = any>(metadataKey: any, target: any, propertyKey?: string | symbol): T | undefined => {\n if (propertyKey) {\n return Reflect.getMetadata(metadataKey, target, propertyKey);\n } else {\n return Reflect.getMetadata(metadataKey, target);\n }\n\n\n //\n // let tt = target;\n // // proxy \uAC78\uB9B0\uAC70\uB294 \uC624\uB9AC\uC9C0\uB110 constructor\uC5D0 \uB4E4\uC5B4\uAC00\uC788\uC744\uACBD\uC6B0\uB3C4\uC788\uC5B4\uC11C reflect\uAC00 proxy\uC758 constructor\uC5D0\uC11C \uCC3E\uB294\uACBD\uC6B0\uB3C4\uC788\uB2E4,\n // // \uC11C\uBC84\uB791 \uD504\uB860\uD2B8\uB791 \uB2E4\uB978\uB4EF.. \uADF8\uB798\uC11C \uC704\uB85C \uCC3E\uC544\uAC00\uBA74\uC11C\n // while (tt) {\n // let meta: any = undefined;\n // if (propertyKey) {\n // meta = Reflect.getMetadata(metadataKey, tt, propertyKey);\n // } else {\n // meta = Reflect.getMetadata(metadataKey, tt);\n // }\n // if (meta) {\n // return meta;\n // }\n // tt = Reflect.getPrototypeOf(tt);\n // }\n }\n\n export const getMetadataKeys = (target: any) => {\n return Reflect.getMetadataKeys(target);\n }\n\n export const getOwnMetadata = (metadataKey: any, target: any, propertyKey?: string): number[] | any => {\n if (propertyKey) {\n return Reflect.getOwnMetadata(metadataKey, target, propertyKey);\n } else {\n return Reflect.getOwnMetadata(metadataKey, target);\n }\n }\n\n export const getMetadatas = (target: any) => {\n return ReflectUtils.getMetadataKeys(target).map(it => ReflectUtils.getMetadata(it, target));\n }\n\n export const metadata = (metadataKey: any, data: any) => {\n return Reflect.metadata(metadataKey, data);\n }\n\n export const defineMetadata = (metadataKey: any, value: any, target: any, propertyKey?: string | symbol) => {\n // console.log(\"Reflect:\",Reflect)\n if (propertyKey && Reflect.defineMetadata) {\n Reflect.defineMetadata(metadataKey, value, target, propertyKey);\n } else if (Reflect.defineMetadata) {\n Reflect.defineMetadata(metadataKey, value, target);\n // Reflect.defineMetadata(\"design:paramtypes\", value, target);\n }\n // console.log(\"Reflect:\",Reflect.getMetadata(metadataKey, target))\n // console.log(\"Reflect:\",Reflect.getMetadata('design:paramtypes', target))\n }\n}\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport const ATTRIBUTE_CHANGED_METADATA_KEY = Symbol('simple-web-component:attribute-changed');\nexport const ATTRIBUTE_CHANGED_WILDCARD = '*';\n\nexport function attributeChanged(attributeName: string | string[]): MethodDecorator;\nexport function attributeChanged(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function attributeChanged(arg1: string | string[] | Object, arg2?: string | symbol, arg3?: PropertyDescriptor): MethodDecorator | void {\n const decorator = (attributeName: string, target: Object, propertyKey: string | symbol) => {\n const constructor = target.constructor;\n let meta = ReflectUtils.getMetadata<Map<string, (string | symbol)[]>>(ATTRIBUTE_CHANGED_METADATA_KEY, constructor);\n if (!meta) {\n meta = new Map<string, (string | symbol)[]>();\n ReflectUtils.defineMetadata(ATTRIBUTE_CHANGED_METADATA_KEY, meta, constructor);\n }\n\n let methods = meta.get(attributeName);\n if (!methods) {\n methods = [];\n meta.set(attributeName, methods);\n }\n if (!methods.includes(propertyKey)) {\n methods.push(propertyKey);\n }\n };\n\n if (typeof arg1 === 'string') {\n return (target: Object, propertyKey: string | symbol) => {\n decorator(arg1, target, propertyKey);\n };\n } else if (Array.isArray(arg1)) {\n return (target: Object, propertyKey: string | symbol) => {\n arg1.forEach(name => decorator(name, target, propertyKey));\n };\n } else if (arg1 && arg2) {\n decorator(ATTRIBUTE_CHANGED_WILDCARD, arg1, arg2);\n }\n}\n\nexport const getAttributeChangedMap = (target: any): Map<string, string | symbol> | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ATTRIBUTE_CHANGED_METADATA_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport const TEMPLATE_METHOD_KEY = Symbol('simple-web-component:template-method');\n\nexport const template: MethodDecorator = (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n // console.log('setTemplateMethod target.constructor', target.constructor)\n ReflectUtils.defineMetadata(TEMPLATE_METHOD_KEY, propertyKey, target.constructor);\n};\n\nexport const getTemplateMethod = (target: any): string | symbol | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n // console.log('getTemplateMethod constructor', constructor)\n return ReflectUtils.getMetadata(TEMPLATE_METHOD_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport const STYLE_METHOD_KEY = Symbol('simple-web-component:style-method');\n\nexport const style: MethodDecorator = (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n ReflectUtils.defineMetadata(STYLE_METHOD_KEY, propertyKey, target.constructor);\n};\n\nexport const getStyleMethod = (target: any): string | symbol | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(STYLE_METHOD_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport interface QueryOptions {\n useShadow?: boolean;\n}\n\nexport interface QueryMetadata {\n selector: string;\n options: QueryOptions;\n propertyKey: string | symbol;\n isMethod: boolean;\n}\n\nexport const QUERY_METADATA_KEY = Symbol('simple-web-component:query');\n\nexport const query = (selector: string, options: QueryOptions = { useShadow: true }): any => {\n return (target: Object, propertyKey: string | symbol, descriptor?: PropertyDescriptor) => {\n const isMethod = !!descriptor;\n const constructor = target.constructor;\n\n // \uBA54\uD0C0\uB370\uC774\uD130 \uC800\uC7A5 (\uB098\uC911\uC5D0 elementDefind\uC5D0\uC11C \uC0AC\uC6A9)\n let queries = ReflectUtils.getMetadata<QueryMetadata[]>(QUERY_METADATA_KEY, constructor);\n if (!queries) {\n queries = [];\n ReflectUtils.defineMetadata(QUERY_METADATA_KEY, queries, constructor);\n }\n queries.push({ selector, options, propertyKey, isMethod });\n\n if (!isMethod) {\n // \uC18D\uC131 \uB370\uCF54\uB808\uC774\uD130\uC778 \uACBD\uC6B0: \uAE30\uC874\uCC98\uB7FC Lazy Getter \uC124\uC815\n Object.defineProperty(target, propertyKey, {\n get(this: HTMLElement) {\n const root = options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;\n return root.querySelector(selector);\n },\n enumerable: true,\n configurable: true\n });\n }\n };\n};\n\nexport const getQueryMetadata = (target: any): QueryMetadata[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(QUERY_METADATA_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport interface QueryAllOptions {\n useShadow?: boolean;\n}\n\nexport interface QueryAllMetadata {\n selector: string;\n options: QueryAllOptions;\n propertyKey: string | symbol;\n isMethod: boolean;\n}\n\nexport const QUERY_ALL_METADATA_KEY = Symbol('simple-web-component:query-all');\n\nexport const queryAll = (selector: string, options: QueryAllOptions = { useShadow: true }): any => {\n return (target: Object, propertyKey: string | symbol, descriptor?: PropertyDescriptor) => {\n const isMethod = !!descriptor;\n const constructor = target.constructor;\n\n // \uBA54\uD0C0\uB370\uC774\uD130 \uC800\uC7A5 (\uB098\uC911\uC5D0 elementDefind\uC5D0\uC11C \uC0AC\uC6A9)\n let queries = ReflectUtils.getMetadata<QueryAllMetadata[]>(QUERY_ALL_METADATA_KEY, constructor);\n if (!queries) {\n queries = [];\n ReflectUtils.defineMetadata(QUERY_ALL_METADATA_KEY, queries, constructor);\n }\n queries.push({ selector, options, propertyKey, isMethod });\n\n if (!isMethod) {\n // \uC18D\uC131 \uB370\uCF54\uB808\uC774\uD130\uC778 \uACBD\uC6B0: \uAE30\uC874\uCC98\uB7FC Lazy Getter \uC124\uC815\n Object.defineProperty(target, propertyKey, {\n get(this: HTMLElement) {\n const root = options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;\n return root.querySelectorAll(selector);\n },\n enumerable: true,\n configurable: true\n });\n }\n };\n};\n\nexport const getQueryAllMetadata = (target: any): QueryAllMetadata[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(QUERY_ALL_METADATA_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport interface AddEventListenerOptions extends EventListenerOptions {\n selector?: string;\n eventName: string;\n useShadow?: boolean;\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n}\n\nexport interface AddEventListenerMetadata {\n options: AddEventListenerOptions;\n propertyKey: string | symbol;\n}\n\nexport const ADD_EVENT_LISTENER_METADATA_KEY = Symbol('simple-web-component:add-event-listener');\n\nexport const addEventListener = (options: AddEventListenerOptions): MethodDecorator => {\n return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n let listeners = ReflectUtils.getMetadata<AddEventListenerMetadata[]>(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n if (!listeners) {\n listeners = [];\n ReflectUtils.defineMetadata(ADD_EVENT_LISTENER_METADATA_KEY, listeners, constructor);\n }\n listeners.push({ options, propertyKey });\n };\n};\n\nexport const getAddEventListenerMetadata = (target: any): AddEventListenerMetadata[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\nimport { getAttributeChangedMap, ATTRIBUTE_CHANGED_WILDCARD } from './attributeChanged';\nimport { getTemplateMethod } from './template';\nimport { getStyleMethod } from './style';\nimport { getQueryMetadata } from './query';\nimport { getQueryAllMetadata } from './queryAll';\nimport { getAddEventListenerMetadata } from './addEventListener';\n\nexport interface ElementConfig {\n tagName: string;\n useShadow?: boolean;\n extends?: string;\n observedAttributes?: string[];\n customElementRegistry?: CustomElementRegistry;\n}\n\nexport const ELEMENT_CONFIG_KEY = Symbol('simple-web-component:element-config');\n\nconst BUILT_IN_TAG_MAP = new Map<any, string>();\n\nconst registerTag = (className: string, tagName: string) => {\n if (typeof globalThis !== 'undefined' && (globalThis as any)[className]) {\n BUILT_IN_TAG_MAP.set((globalThis as any)[className], tagName);\n }\n};\n\n// Register comprehensive list of supported tags for automatic extends inference\n[\n ['HTMLAnchorElement', 'a'],\n ['HTMLAreaElement', 'area'],\n ['HTMLAudioElement', 'audio'],\n ['HTMLBaseElement', 'base'],\n ['HTMLButtonElement', 'button'],\n ['HTMLCanvasElement', 'canvas'],\n ['HTMLDataElement', 'data'],\n ['HTMLDataListElement', 'datalist'],\n ['HTMLDetailsElement', 'details'],\n ['HTMLDialogElement', 'dialog'],\n ['HTMLDivElement', 'div'],\n ['HTMLDListElement', 'dl'],\n ['HTMLEmbedElement', 'embed'],\n ['HTMLFieldSetElement', 'fieldset'],\n ['HTMLFormElement', 'form'],\n ['HTMLHRElement', 'hr'],\n ['HTMLIFrameElement', 'iframe'],\n ['HTMLImageElement', 'img'],\n ['HTMLInputElement', 'input'],\n ['HTMLLabelElement', 'label'],\n ['HTMLLegendElement', 'legend'],\n ['HTMLLIElement', 'li'],\n ['HTMLLinkElement', 'link'],\n ['HTMLMapElement', 'map'],\n ['HTMLMetaElement', 'meta'],\n ['HTMLMeterElement', 'meter'],\n ['HTMLModElement', 'del'],\n ['HTMLObjectElement', 'object'],\n ['HTMLOListElement', 'ol'],\n ['HTMLOptGroupElement', 'optgroup'],\n ['HTMLOptionElement', 'option'],\n ['HTMLOutputElement', 'output'],\n ['HTMLParagraphElement', 'p'],\n ['HTMLParamElement', 'param'],\n ['HTMLPictureElement', 'picture'],\n ['HTMLPreElement', 'pre'],\n ['HTMLProgressElement', 'progress'],\n ['HTMLQuoteElement', 'blockquote'],\n ['HTMLScriptElement', 'script'],\n ['HTMLSelectElement', 'select'],\n ['HTMLSlotElement', 'slot'],\n ['HTMLSourceElement', 'source'],\n ['HTMLSpanElement', 'span'],\n ['HTMLStyleElement', 'style'],\n ['HTMLTableElement', 'table'],\n ['HTMLTableSectionElement', 'tbody'],\n ['HTMLTableCellElement', 'td'],\n ['HTMLTemplateElement', 'template'],\n ['HTMLTextAreaElement', 'textarea'],\n ['HTMLTimeElement', 'time'],\n ['HTMLTitleElement', 'title'],\n ['HTMLTableRowElement', 'tr'],\n ['HTMLTrackElement', 'track'],\n ['HTMLUListElement', 'ul'],\n ['HTMLVideoElement', 'video'],\n ['HTMLHeadingElement', 'h1']\n].forEach(([cls, tag]) => registerTag(cls, tag));\n\nexport const elementDefind =\n (inConfig: ElementConfig | string): ClassDecorator =>\n (constructor: any) => {\n const config: ElementConfig = typeof inConfig === 'string' ? { tagName: inConfig } : inConfig;\n\n // 1. Automatically derive extendsTagName from prototype chain if not provided\n let extendsTagName = config.extends;\n if (!extendsTagName) {\n let proto = Object.getPrototypeOf(constructor);\n while (proto && proto !== HTMLElement && proto !== Function.prototype) {\n extendsTagName = BUILT_IN_TAG_MAP.get(proto);\n if (extendsTagName) break;\n proto = Object.getPrototypeOf(proto);\n }\n }\n\n // 2. Automatically collect observed attributes from @attributeChanged decorators\n const attributeChangedMap = getAttributeChangedMap(constructor);\n const observedFromDecorators = attributeChangedMap ? Array.from(attributeChangedMap.keys()).filter(it => it !== ATTRIBUTE_CHANGED_WILDCARD) : [];\n const mergedObservedAttributes = [...new Set([...(config.observedAttributes ?? []), ...observedFromDecorators])];\n\n // 3. Create a new anonymous class that extends the original constructor\n const NewClass = class extends (constructor as any) {\n private _observer: MutationObserver | null = null;\n private _boundElements = new WeakMap<Element, Set<string | symbol>>();\n\n static get observedAttributes() {\n return mergedObservedAttributes;\n }\n\n constructor(...args: any[]) {\n super(...args);\n if (config.useShadow === true && !this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n }\n\n private _syncDecorators() {\n // 5. Execute @query and @queryAll methods\n const queryMetadata = getQueryMetadata(this);\n if (queryMetadata) {\n queryMetadata\n .filter(it => it.isMethod)\n .forEach(it => {\n const root = it.options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;\n const element = root.querySelector(it.selector);\n\n // 중복 호출 방지: 해당 selector로 찾은 요소가 이전과 다를 때만 호출하거나,\n // 또는 매번 호출할지 결정해야 함. 여기서는 새로운 요소가 발견되면 호출하는 방식으로 처리.\n if (element) {\n let bound = this._boundElements.get(element);\n if (!bound) {\n bound = new Set();\n this._boundElements.set(element, bound);\n }\n if (!bound.has(it.propertyKey)) {\n (this as any)[it.propertyKey](element);\n bound.add(it.propertyKey);\n }\n }\n });\n }\n\n const queryAllMetadata = getQueryAllMetadata(this);\n if (queryAllMetadata) {\n queryAllMetadata\n .filter(it => it.isMethod)\n .forEach(it => {\n const root = it.options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;\n const elements = root.querySelectorAll(it.selector);\n\n // queryAll은 목록이 바뀔 수 있으므로 일단 호출하되,\n // 내부 로직은 사용자에게 맡기거나 좀 더 정교한 비교가 필요할 수 있음.\n // 여기서는 단순하게 호출만 다시 함. (사용자가 요청한 '다시 호출' 반영)\n (this as any)[it.propertyKey](elements);\n });\n }\n\n // 6. Register @addEventListener methods\n const eventListeners = getAddEventListenerMetadata(this);\n if (eventListeners) {\n eventListeners.forEach(it => {\n const { selector, eventName, useShadow, ...options } = it.options;\n const root = useShadow !== false && this.shadowRoot ? this.shadowRoot : this;\n const targetElements = selector ? root.querySelectorAll(selector) : [this as any as Element];\n\n targetElements.forEach(targetElement => {\n if (targetElement) {\n let bound = this._boundElements.get(targetElement);\n if (!bound) {\n bound = new Set();\n this._boundElements.set(targetElement, bound);\n }\n\n // 중복 바인딩 방지: (요소, 이벤트, 메서드) 조합 확인\n const eventKey = `event:${String(it.propertyKey)}:${eventName}`;\n if (!bound.has(eventKey)) {\n targetElement.addEventListener(\n eventName,\n event => {\n (this as any)[it.propertyKey](event);\n },\n options\n );\n bound.add(eventKey);\n }\n }\n });\n });\n }\n }\n\n disconnectedCallback() {\n if (this._observer) {\n this._observer.disconnect();\n }\n if (super.disconnectedCallback) {\n super.disconnectedCallback();\n }\n }\n\n connectedMoveCallback() {\n //default logic...\n if (super.connectedMoveCallback) {\n super.connectedMoveCallback();\n }\n }\n\n adoptedCallback() {\n //default logic...\n if (super.adoptedCallback) {\n super.adoptedCallback();\n }\n }\n\n async connectedCallback() {\n const templateMethod = getTemplateMethod(this);\n const styleMethod = getStyleMethod(this);\n\n const template = templateMethod ? await (this as any)[templateMethod]() : undefined;\n const style = styleMethod ? await (this as any)[styleMethod]() : undefined;\n\n // If not using shadow DOM and no decorators are present, do nothing\n if (!this.shadowRoot && template === undefined && style === undefined) {\n return;\n }\n\n let content = '';\n if (style !== undefined && style.trim().length > 0) {\n content += `<style>${style}</style>`;\n }\n\n if (template !== undefined) {\n content += template;\n } else if (!this.shadowRoot) {\n content += this.innerHTML;\n }\n\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = content;\n } else {\n this.innerHTML = content;\n }\n\n // 초기 동기화\n (this as any)._syncDecorators();\n\n // 7. Watch for DOM changes (MutationObserver)\n this._observer = new MutationObserver(() => {\n (this as any)._syncDecorators();\n });\n const target = this.shadowRoot || this;\n this._observer.observe(target, { childList: true, subtree: true });\n\n if (super.connectedCallback) {\n await super.connectedCallback();\n }\n }\n\n // 4. Handle attribute changes and route to decorated methods\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n // Call the original callback if it exists\n if (super.attributeChangedCallback) {\n super.attributeChangedCallback(name, oldValue, newValue);\n }\n\n // Call all methods associated with @attributeChanged\n const methodKeys = attributeChangedMap?.get(name);\n if (methodKeys && Array.isArray(methodKeys)) {\n methodKeys.forEach(key => {\n if (typeof (this as any)[key] === 'function') {\n (this as any)[key](newValue, oldValue, name);\n }\n });\n }\n\n // Call the wildcard methods if they exist\n const wildcardMethodKeys = attributeChangedMap?.get(ATTRIBUTE_CHANGED_WILDCARD);\n if (wildcardMethodKeys && Array.isArray(wildcardMethodKeys)) {\n wildcardMethodKeys.forEach(key => {\n if (typeof (this as any)[key] === 'function') {\n (this as any)[key](newValue, oldValue, name);\n }\n });\n }\n }\n };\n\n // 5. Register Custom Element using specified or default registry\n const registry = config.customElementRegistry || (typeof customElements !== 'undefined' ? customElements : undefined);\n if (registry && !registry.get(config.tagName)) {\n const options = extendsTagName ? { extends: extendsTagName } : undefined;\n registry.define(config.tagName, NewClass as any, options);\n }\n\n // 6. Save metadata\n ReflectUtils.defineMetadata(ELEMENT_CONFIG_KEY, config, NewClass);\n\n return NewClass as any;\n };\n\nexport const getElementConfig = (target: any): ElementConfig | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ELEMENT_CONFIG_KEY, constructor);\n};\n", "import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-for-of', useShadow: true })\nexport class SwcForOf extends HTMLElement {\n private _value: any[] = [];\n private _masterTplNodes: Node[] = [];\n\n constructor() {\n super();\n }\n\n set value(val: any[]) {\n if (!Array.isArray(val)) val = [];\n this._value = this.createProxy(val);\n this.renderAll();\n }\n\n get value(): any[] {\n return this._value;\n }\n\n private createProxy(arr: any[]) {\n return new Proxy(arr, {\n set: (target, prop, val) => {\n const isIndex = !isNaN(Number(prop));\n target[prop as any] = val;\n\n if (isIndex) {\n this.updateSingleRow(Number(prop), val);\n } else if (prop === 'length' && val < target.length) {\n this.renderAll();\n }\n return true;\n },\n deleteProperty: (target, prop) => {\n const res = delete target[prop as any];\n this.renderAll();\n return res;\n }\n });\n }\n\n @style\n styles() {\n // display: contents를 통해 swc-for-of 태그 자체를 레이아웃에서 투명하게 만듭니다.\n return `\n :host { display: contents; }\n `;\n }\n\n @template\n renderTemplate() {\n // 감싸는 div 없이 tpl-slot만 둡니다.\n return `\n <slot id=\"tpl-slot\" style=\"display:none;\"></slot>\n `;\n }\n\n connectedCallback() {\n const tplSlot = this.shadowRoot?.getElementById('tpl-slot') as HTMLSlotElement;\n if (tplSlot) {\n this._masterTplNodes = tplSlot.assignedNodes().map(n => n.cloneNode(true));\n }\n this.renderAll();\n }\n\n public updateSingleRow(index: number, newValue: any) {\n const targets = this.querySelectorAll(`[slot=\"row-${index}\"]`);\n if (targets.length > 0) {\n targets.forEach(target => this.applyData(target, newValue, index));\n } else {\n this.renderRow(newValue, index);\n }\n }\n\n private applyData(node: Node, data: any, index: number) {\n const getValueByPath = (obj: any, path: string) => {\n if (path === 'value') return obj;\n if (path.startsWith('value.')) {\n return path\n .split('.')\n .slice(1)\n .reduce((acc, part) => acc && acc[part], obj);\n }\n return undefined;\n };\n\n const walk = (n: Node) => {\n if (n.nodeType === Node.TEXT_NODE) {\n if (!(n as any)._original) (n as any)._original = n.textContent;\n let text = (n as any)._original;\n\n text = text.replace(/{{(.*?)}}/g, (match: string, path: string) => {\n path = path.trim();\n if (path === 'index') return index.toString();\n const val = getValueByPath(data, path);\n return val !== undefined ? val : match;\n });\n if (n.textContent !== text) n.textContent = text;\n } else if (n.nodeType === Node.ELEMENT_NODE) {\n const el = n as Element;\n Array.from(el.attributes).forEach(a => {\n if (!(a as any)._original) (a as any)._original = a.value;\n let val = (a as any)._original;\n\n val = val.replace(/{{(.*?)}}/g, (match: string, path: string) => {\n path = path.trim();\n if (path === 'index') return index.toString();\n const v = getValueByPath(data, path);\n return v !== undefined ? v : match;\n });\n if (a.value !== val) a.value = val;\n });\n\n // 중요: swc-choose 같은 커스텀 엘리먼트 내부의 자식들도 템플릿 치환이 필요함\n el.childNodes.forEach(walk);\n }\n };\n walk(node);\n }\n\n private renderRow(item: any, index: number) {\n if (!this.shadowRoot || this._masterTplNodes.length === 0) return;\n\n const slotName = `row-${index}`;\n // Shadow Root에 직접 슬롯 추가\n if (!this.shadowRoot.querySelector(`slot[name=\"${slotName}\"]`)) {\n const slot = document.createElement('slot');\n slot.name = slotName;\n this.shadowRoot.appendChild(slot);\n }\n\n this._masterTplNodes.forEach(tplNode => {\n const clone = tplNode.cloneNode(true);\n if (clone.nodeType === Node.ELEMENT_NODE) {\n (clone as HTMLElement).setAttribute('slot', slotName);\n (clone as HTMLElement).style.display = '';\n } else if (clone.nodeType === Node.TEXT_NODE) {\n if (clone.textContent?.trim().length === 0) return;\n const span = document.createElement('span');\n span.setAttribute('slot', slotName);\n span.appendChild(clone);\n this.appendChild(span);\n this.applyData(span, item, index);\n return;\n }\n this.appendChild(clone);\n this.applyData(clone, item, index);\n });\n }\n\n private renderAll() {\n if (this._masterTplNodes.length === 0 || !this.shadowRoot) return;\n\n // 기존 데이터 노드 삭제\n Array.from(this.children).forEach(c => {\n const slot = c.getAttribute('slot');\n if (slot && slot.startsWith('row-')) {\n c.remove();\n }\n });\n\n // Shadow Root의 기존 슬롯들 삭제 (tpl-slot 제외)\n Array.from(this.shadowRoot.querySelectorAll('slot')).forEach(s => {\n if (s.id !== 'tpl-slot') s.remove();\n });\n\n this._value.forEach((item, index) => this.renderRow(item, index));\n }\n}\n", "import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-if', useShadow: true })\nexport class SwcIf extends HTMLElement {\n private _value: any = false;\n private _masterTplNodes: Node[] = [];\n private _observer: MutationObserver | null = null;\n\n constructor() {\n super();\n }\n\n set value(val: any) {\n this._value = val;\n this.render();\n }\n\n get value(): any {\n return this._value;\n }\n\n @style\n styles() {\n return `\n :host { display: contents; }\n `;\n }\n\n @template\n renderTemplate() {\n return `\n <slot id=\"tpl-slot\" style=\"display:none;\"></slot>\n `;\n }\n\n connectedCallback() {\n const tplSlot = this.shadowRoot?.getElementById('tpl-slot') as HTMLSlotElement;\n if (tplSlot) {\n // 초기 자식들을 템플릿으로 보관\n this._masterTplNodes = tplSlot.assignedNodes().map(n => n.cloneNode(true));\n }\n\n this._observer = new MutationObserver(() => this.render());\n this._observer.observe(this, { attributes: true });\n\n this.render();\n }\n\n disconnectedCallback() {\n this._observer?.disconnect();\n }\n\n private render() {\n if (!this.shadowRoot) return;\n\n const attrValue = this.getAttribute('value');\n if (attrValue !== null && attrValue.includes('{{')) return; // 치환 전이면 대기\n\n // 로직 결정: attribute가 있으면 우선, 없으면 property 사용\n let displayValue = attrValue !== null ? attrValue : this._value;\n\n // \"false\", \"null\", \"undefined\" 문자열 처리 및 기본 truthy 체크\n let isTruthy = !!displayValue;\n if (typeof displayValue === 'string') {\n if (displayValue === 'false' || displayValue === '0' || displayValue === '') isTruthy = false;\n else {\n // 식인 경우 평가 시도 (예: \"10 > 5\")\n try {\n isTruthy = !!new Function(`return ${displayValue}`)();\n } catch (e) {\n // 단순 문자열이면 true로 간주\n isTruthy = true;\n }\n }\n }\n\n // 1. 기존에 렌더링된 노드들 삭제\n Array.from(this.children).forEach(c => {\n if (c.getAttribute('slot') === 'if-content') {\n c.remove();\n }\n });\n\n // 2. Shadow DOM의 컨텐츠 슬롯 삭제\n const existingSlot = this.shadowRoot.querySelector('slot[name=\"if-content\"]');\n if (existingSlot) existingSlot.remove();\n\n // 3. 조건이 참일 때만 노드들을 복제해서 삽입\n if (isTruthy && this._masterTplNodes.length > 0) {\n const contentSlot = document.createElement('slot');\n contentSlot.name = 'if-content';\n this.shadowRoot.appendChild(contentSlot);\n\n this._masterTplNodes.forEach(tplNode => {\n const clone = tplNode.cloneNode(true);\n if (clone.nodeType === Node.ELEMENT_NODE) {\n (clone as HTMLElement).setAttribute('slot', 'if-content');\n (clone as HTMLElement).style.display = '';\n } else if (clone.nodeType === Node.TEXT_NODE) {\n if (clone.textContent?.trim().length === 0) return;\n const span = document.createElement('span');\n span.setAttribute('slot', 'if-content');\n span.appendChild(clone);\n this.appendChild(span);\n return;\n }\n this.appendChild(clone);\n });\n }\n }\n}\n", "import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-choose', useShadow: true })\nexport class SwcChoose extends HTMLElement {\n private _observer: MutationObserver | null = null;\n private _value: any = undefined;\n\n set value(val: any) {\n this._value = val;\n this.evaluate();\n }\n\n get value() {\n return this._value;\n }\n\n @style\n styles() {\n return `:host { display: contents; }`;\n }\n\n @template\n render() {\n return `<slot id=\"choose-slot\"></slot>`;\n }\n\n connectedCallback() {\n this._observer = new MutationObserver(() => this.evaluate());\n this._observer.observe(this, { attributes: true, subtree: true, childList: true });\n this.evaluate();\n }\n\n disconnectedCallback() {\n this._observer?.disconnect();\n }\n\n private evaluate() {\n const whens = Array.from(this.querySelectorAll('swc-when'));\n const other = this.querySelector('swc-other');\n let matched = false;\n\n // 현재 choose에 설정된 value (문자열인 경우 \"null\", \"undefined\" 등 처리)\n const chooseValue = this.getAttribute('value') ?? this._value;\n\n whens.forEach(when => {\n if (matched) {\n (when as HTMLElement).style.display = 'none';\n return;\n }\n\n const testAttr = when.getAttribute('test');\n if (testAttr === null) return;\n if (testAttr.includes('{{')) return; // 아직 치환 전이면 스킵\n\n let isConditionMet = false;\n\n if (chooseValue !== undefined && chooseValue !== null) {\n // 1. 매칭 모드: choose의 value와 when의 test값이 같은지 비교\n isConditionMet = String(chooseValue) === String(testAttr);\n } else {\n // 2. 표현식 모드: testAttr 자체가 실행 가능한 코드인 경우\n try {\n if (testAttr === 'true') isConditionMet = true;\n else if (testAttr === 'false') isConditionMet = false;\n else isConditionMet = !!new Function(`return ${testAttr}`)();\n } catch (e) {\n isConditionMet = false;\n }\n }\n\n if (isConditionMet) {\n (when as HTMLElement).style.display = '';\n matched = true;\n } else {\n (when as HTMLElement).style.display = 'none';\n }\n });\n\n if (other) {\n (other as HTMLElement).style.display = matched ? 'none' : '';\n }\n }\n}\n", "import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-when', useShadow: true })\nexport class SwcWhen extends HTMLElement {\n @style\n styles() {\n return `:host { display: contents; }`;\n }\n\n @template\n render() {\n return `<slot></slot>`;\n }\n}\n", "import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-other', useShadow: true })\nexport class SwcOther extends HTMLElement {\n @style\n styles() {\n return `:host { display: contents; }`;\n }\n\n @template\n render() {\n return `<slot></slot>`;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["ReflectUtils", "template", "style", "SwcForOf", "SwcIf", "__decorate", "SwcChoose", "__decorate", "SwcWhen", "__decorate", "SwcOther", "__decorate"]
3
+ "sources": ["../../src/bundle-entry.ts", "../../../core/src/reflect/ReflectUtils.ts", "../../src/decorators/attributeChanged.ts", "../../src/decorators/template.ts", "../../src/decorators/style.ts", "../../src/decorators/query.ts", "../../src/decorators/queryAll.ts", "../../src/decorators/addEventListener.ts", "../../src/decorators/elementDefind.ts", "../../src/elements/SwcHTMLElementBase.ts", "../../src/elements/SwcForOf.ts", "../../src/elements/SwcIf.ts", "../../src/elements/SwcChoose.ts", "../../src/elements/SwcWhen.ts", "../../src/elements/SwcOther.ts", "../../src/elements/SwcObject.ts"],
4
+ "sourcesContent": ["export * from './index';\n", "import { ConstructorType } from '../types';\nexport namespace ReflectUtils {\n export const getParameterTypes = (target: any, propertyKey?: string | symbol): ConstructorType<any>[] => {\n // console.log('---------param')\n if (propertyKey) {\n return Reflect.getMetadata('design:paramtypes', target, propertyKey) || [];\n } else {\n return Reflect.getMetadata('design:paramtypes', target) || [];\n }\n }\n\n\n export const getReturnType = (target: any, propertyKey: string | symbol): any => {\n return Reflect.getMetadata('design:returntype', target, propertyKey);\n }\n\n // @Reflect.metadata(\"design:type\", Point)\n export const getType = (target: any, propertyKey?: string | symbol): any => {\n if (propertyKey) {\n return Reflect.getMetadata('design:type', target, propertyKey);\n } else {\n return Reflect.getMetadata('design:type', target);\n }\n }\n\n export const getMetadata = <T = any>(metadataKey: any, target: any, propertyKey?: string | symbol): T | undefined => {\n if (propertyKey) {\n return Reflect.getMetadata(metadataKey, target, propertyKey);\n } else {\n return Reflect.getMetadata(metadataKey, target);\n }\n\n\n //\n // let tt = target;\n // // proxy \uAC78\uB9B0\uAC70\uB294 \uC624\uB9AC\uC9C0\uB110 constructor\uC5D0 \uB4E4\uC5B4\uAC00\uC788\uC744\uACBD\uC6B0\uB3C4\uC788\uC5B4\uC11C reflect\uAC00 proxy\uC758 constructor\uC5D0\uC11C \uCC3E\uB294\uACBD\uC6B0\uB3C4\uC788\uB2E4,\n // // \uC11C\uBC84\uB791 \uD504\uB860\uD2B8\uB791 \uB2E4\uB978\uB4EF.. \uADF8\uB798\uC11C \uC704\uB85C \uCC3E\uC544\uAC00\uBA74\uC11C\n // while (tt) {\n // let meta: any = undefined;\n // if (propertyKey) {\n // meta = Reflect.getMetadata(metadataKey, tt, propertyKey);\n // } else {\n // meta = Reflect.getMetadata(metadataKey, tt);\n // }\n // if (meta) {\n // return meta;\n // }\n // tt = Reflect.getPrototypeOf(tt);\n // }\n }\n\n export const getMetadataKeys = (target: any) => {\n return Reflect.getMetadataKeys(target);\n }\n\n export const getOwnMetadata = (metadataKey: any, target: any, propertyKey?: string): number[] | any => {\n if (propertyKey) {\n return Reflect.getOwnMetadata(metadataKey, target, propertyKey);\n } else {\n return Reflect.getOwnMetadata(metadataKey, target);\n }\n }\n\n export const getMetadatas = (target: any) => {\n return ReflectUtils.getMetadataKeys(target).map(it => ReflectUtils.getMetadata(it, target));\n }\n\n export const metadata = (metadataKey: any, data: any) => {\n return Reflect.metadata(metadataKey, data);\n }\n\n export const defineMetadata = (metadataKey: any, value: any, target: any, propertyKey?: string | symbol) => {\n // console.log(\"Reflect:\",Reflect)\n if (propertyKey && Reflect.defineMetadata) {\n Reflect.defineMetadata(metadataKey, value, target, propertyKey);\n } else if (Reflect.defineMetadata) {\n Reflect.defineMetadata(metadataKey, value, target);\n // Reflect.defineMetadata(\"design:paramtypes\", value, target);\n }\n // console.log(\"Reflect:\",Reflect.getMetadata(metadataKey, target))\n // console.log(\"Reflect:\",Reflect.getMetadata('design:paramtypes', target))\n }\n}\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport const ATTRIBUTE_CHANGED_METADATA_KEY = Symbol('simple-web-component:attribute-changed');\nexport const ATTRIBUTE_CHANGED_WILDCARD = '*';\n\nexport function attributeChanged(attributeName: string | string[]): MethodDecorator;\nexport function attributeChanged(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function attributeChanged(arg1: string | string[] | Object, arg2?: string | symbol, arg3?: PropertyDescriptor): MethodDecorator | void {\n const decorator = (attributeName: string, target: Object, propertyKey: string | symbol) => {\n const constructor = target.constructor;\n let meta = ReflectUtils.getMetadata<Map<string, (string | symbol)[]>>(ATTRIBUTE_CHANGED_METADATA_KEY, constructor);\n if (!meta) {\n meta = new Map<string, (string | symbol)[]>();\n ReflectUtils.defineMetadata(ATTRIBUTE_CHANGED_METADATA_KEY, meta, constructor);\n }\n\n let methods = meta.get(attributeName);\n if (!methods) {\n methods = [];\n meta.set(attributeName, methods);\n }\n if (!methods.includes(propertyKey)) {\n methods.push(propertyKey);\n }\n };\n\n if (typeof arg1 === 'string') {\n return (target: Object, propertyKey: string | symbol) => {\n decorator(arg1, target, propertyKey);\n };\n } else if (Array.isArray(arg1)) {\n return (target: Object, propertyKey: string | symbol) => {\n arg1.forEach(name => decorator(name, target, propertyKey));\n };\n } else if (arg1 && arg2) {\n decorator(ATTRIBUTE_CHANGED_WILDCARD, arg1, arg2);\n }\n}\n\nexport const getAttributeChangedMap = (target: any): Map<string, string | symbol> | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ATTRIBUTE_CHANGED_METADATA_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport const TEMPLATE_METHOD_KEY = Symbol('simple-web-component:template-method');\n\nexport const template: MethodDecorator = (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n // console.log('setTemplateMethod target.constructor', target.constructor)\n ReflectUtils.defineMetadata(TEMPLATE_METHOD_KEY, propertyKey, target.constructor);\n};\n\nexport const getTemplateMethod = (target: any): string | symbol | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n // console.log('getTemplateMethod constructor', constructor)\n return ReflectUtils.getMetadata(TEMPLATE_METHOD_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport const STYLE_METHOD_KEY = Symbol('simple-web-component:style-method');\n\nexport const style: MethodDecorator = (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n ReflectUtils.defineMetadata(STYLE_METHOD_KEY, propertyKey, target.constructor);\n};\n\nexport const getStyleMethod = (target: any): string | symbol | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(STYLE_METHOD_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport interface QueryOptions {\n useShadow?: boolean;\n}\n\nexport interface QueryMetadata {\n selector: string;\n options: QueryOptions;\n propertyKey: string | symbol;\n isMethod: boolean;\n}\n\nexport const QUERY_METADATA_KEY = Symbol('simple-web-component:query');\n\nexport const query = (selector: string, options: QueryOptions = { useShadow: true }): any => {\n return (target: Object, propertyKey: string | symbol, descriptor?: PropertyDescriptor) => {\n const isMethod = !!descriptor;\n const constructor = target.constructor;\n\n // \uBA54\uD0C0\uB370\uC774\uD130 \uC800\uC7A5 (\uB098\uC911\uC5D0 elementDefind\uC5D0\uC11C \uC0AC\uC6A9)\n let queries = ReflectUtils.getMetadata<QueryMetadata[]>(QUERY_METADATA_KEY, constructor);\n if (!queries) {\n queries = [];\n ReflectUtils.defineMetadata(QUERY_METADATA_KEY, queries, constructor);\n }\n queries.push({ selector, options, propertyKey, isMethod });\n\n if (!isMethod) {\n // \uC18D\uC131 \uB370\uCF54\uB808\uC774\uD130\uC778 \uACBD\uC6B0: \uAE30\uC874\uCC98\uB7FC Lazy Getter \uC124\uC815\n Object.defineProperty(target, propertyKey, {\n get(this: HTMLElement) {\n const root = options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;\n return root.querySelector(selector);\n },\n enumerable: true,\n configurable: true\n });\n }\n };\n};\n\nexport const getQueryMetadata = (target: any): QueryMetadata[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(QUERY_METADATA_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport interface QueryAllOptions {\n useShadow?: boolean;\n}\n\nexport interface QueryAllMetadata {\n selector: string;\n options: QueryAllOptions;\n propertyKey: string | symbol;\n isMethod: boolean;\n}\n\nexport const QUERY_ALL_METADATA_KEY = Symbol('simple-web-component:query-all');\n\nexport const queryAll = (selector: string, options: QueryAllOptions = { useShadow: true }): any => {\n return (target: Object, propertyKey: string | symbol, descriptor?: PropertyDescriptor) => {\n const isMethod = !!descriptor;\n const constructor = target.constructor;\n\n // \uBA54\uD0C0\uB370\uC774\uD130 \uC800\uC7A5 (\uB098\uC911\uC5D0 elementDefind\uC5D0\uC11C \uC0AC\uC6A9)\n let queries = ReflectUtils.getMetadata<QueryAllMetadata[]>(QUERY_ALL_METADATA_KEY, constructor);\n if (!queries) {\n queries = [];\n ReflectUtils.defineMetadata(QUERY_ALL_METADATA_KEY, queries, constructor);\n }\n queries.push({ selector, options, propertyKey, isMethod });\n\n if (!isMethod) {\n // \uC18D\uC131 \uB370\uCF54\uB808\uC774\uD130\uC778 \uACBD\uC6B0: \uAE30\uC874\uCC98\uB7FC Lazy Getter \uC124\uC815\n Object.defineProperty(target, propertyKey, {\n get(this: HTMLElement) {\n const root = options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;\n return root.querySelectorAll(selector);\n },\n enumerable: true,\n configurable: true\n });\n }\n };\n};\n\nexport const getQueryAllMetadata = (target: any): QueryAllMetadata[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(QUERY_ALL_METADATA_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport interface AddEventListenerOptions extends EventListenerOptions {\n selector?: string;\n eventName: string;\n useShadow?: boolean;\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n}\n\nexport interface AddEventListenerMetadata {\n options: AddEventListenerOptions;\n propertyKey: string | symbol;\n}\n\nexport const ADD_EVENT_LISTENER_METADATA_KEY = Symbol('simple-web-component:add-event-listener');\n\nexport const addEventListener = (options: AddEventListenerOptions): MethodDecorator => {\n return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n let listeners = ReflectUtils.getMetadata<AddEventListenerMetadata[]>(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n if (!listeners) {\n listeners = [];\n ReflectUtils.defineMetadata(ADD_EVENT_LISTENER_METADATA_KEY, listeners, constructor);\n }\n listeners.push({ options, propertyKey });\n };\n};\n\nexport const getAddEventListenerMetadata = (target: any): AddEventListenerMetadata[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n};\n", "import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\nimport { getAttributeChangedMap, ATTRIBUTE_CHANGED_WILDCARD } from './attributeChanged';\nimport { getTemplateMethod } from './template';\nimport { getStyleMethod } from './style';\nimport { getQueryMetadata } from './query';\nimport { getQueryAllMetadata } from './queryAll';\nimport { getAddEventListenerMetadata } from './addEventListener';\n\nexport interface ElementConfig {\n tagName: string;\n useShadow?: boolean;\n extends?: string;\n observedAttributes?: string[];\n customElementRegistry?: CustomElementRegistry;\n}\n\nexport const ELEMENT_CONFIG_KEY = Symbol('simple-web-component:element-config');\n\nconst BUILT_IN_TAG_MAP = new Map<any, string>();\n\nconst registerTag = (className: string, tagName: string) => {\n if (typeof globalThis !== 'undefined' && (globalThis as any)[className]) {\n BUILT_IN_TAG_MAP.set((globalThis as any)[className], tagName);\n }\n};\n\n// Register comprehensive list of supported tags for automatic extends inference\n[\n ['HTMLAnchorElement', 'a'],\n ['HTMLAreaElement', 'area'],\n ['HTMLAudioElement', 'audio'],\n ['HTMLBaseElement', 'base'],\n ['HTMLButtonElement', 'button'],\n ['HTMLCanvasElement', 'canvas'],\n ['HTMLDataElement', 'data'],\n ['HTMLDataListElement', 'datalist'],\n ['HTMLDetailsElement', 'details'],\n ['HTMLDialogElement', 'dialog'],\n ['HTMLDivElement', 'div'],\n ['HTMLDListElement', 'dl'],\n ['HTMLEmbedElement', 'embed'],\n ['HTMLFieldSetElement', 'fieldset'],\n ['HTMLFormElement', 'form'],\n ['HTMLHRElement', 'hr'],\n ['HTMLIFrameElement', 'iframe'],\n ['HTMLImageElement', 'img'],\n ['HTMLInputElement', 'input'],\n ['HTMLLabelElement', 'label'],\n ['HTMLLegendElement', 'legend'],\n ['HTMLLIElement', 'li'],\n ['HTMLLinkElement', 'link'],\n ['HTMLMapElement', 'map'],\n ['HTMLMetaElement', 'meta'],\n ['HTMLMeterElement', 'meter'],\n ['HTMLModElement', 'del'],\n ['HTMLObjectElement', 'object'],\n ['HTMLOListElement', 'ol'],\n ['HTMLOptGroupElement', 'optgroup'],\n ['HTMLOptionElement', 'option'],\n ['HTMLOutputElement', 'output'],\n ['HTMLParagraphElement', 'p'],\n ['HTMLParamElement', 'param'],\n ['HTMLPictureElement', 'picture'],\n ['HTMLPreElement', 'pre'],\n ['HTMLProgressElement', 'progress'],\n ['HTMLQuoteElement', 'blockquote'],\n ['HTMLScriptElement', 'script'],\n ['HTMLSelectElement', 'select'],\n ['HTMLSlotElement', 'slot'],\n ['HTMLSourceElement', 'source'],\n ['HTMLSpanElement', 'span'],\n ['HTMLStyleElement', 'style'],\n ['HTMLTableElement', 'table'],\n ['HTMLTableSectionElement', 'tbody'],\n ['HTMLTableCellElement', 'td'],\n ['HTMLTemplateElement', 'template'],\n ['HTMLTextAreaElement', 'textarea'],\n ['HTMLTimeElement', 'time'],\n ['HTMLTitleElement', 'title'],\n ['HTMLTableRowElement', 'tr'],\n ['HTMLTrackElement', 'track'],\n ['HTMLUListElement', 'ul'],\n ['HTMLVideoElement', 'video'],\n ['HTMLHeadingElement', 'h1']\n].forEach(([cls, tag]) => registerTag(cls, tag));\n\nexport const elementDefind =\n (inConfig: ElementConfig | string): ClassDecorator =>\n (constructor: any) => {\n const config: ElementConfig = typeof inConfig === 'string' ? { tagName: inConfig } : inConfig;\n\n // 1. Automatically derive extendsTagName from prototype chain if not provided\n let extendsTagName = config.extends;\n if (!extendsTagName) {\n let proto = Object.getPrototypeOf(constructor);\n while (proto && proto !== HTMLElement && proto !== Function.prototype) {\n extendsTagName = BUILT_IN_TAG_MAP.get(proto);\n if (extendsTagName) break;\n proto = Object.getPrototypeOf(proto);\n }\n }\n\n // 2. Automatically collect observed attributes from @attributeChanged decorators\n const attributeChangedMap = getAttributeChangedMap(constructor);\n const observedFromDecorators = attributeChangedMap ? Array.from(attributeChangedMap.keys()).filter(it => it !== ATTRIBUTE_CHANGED_WILDCARD) : [];\n const mergedObservedAttributes = [...new Set([...(config.observedAttributes ?? []), ...observedFromDecorators])];\n\n // 3. Create a new anonymous class that extends the original constructor\n const NewClass = class extends (constructor as any) {\n private _observer: MutationObserver | null = null;\n private _boundElements = new WeakMap<Element, Set<string | symbol>>();\n\n static get observedAttributes() {\n return mergedObservedAttributes;\n }\n\n constructor(...args: any[]) {\n super(...args);\n if (config.useShadow === true && !this.shadowRoot) {\n this.attachShadow({ mode: 'open' });\n }\n }\n\n private _syncDecorators() {\n // 5. Execute @query and @queryAll methods\n const queryMetadata = getQueryMetadata(this);\n if (queryMetadata) {\n queryMetadata\n .filter(it => it.isMethod)\n .forEach(it => {\n const root = it.options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;\n const element = root.querySelector(it.selector);\n\n // 중복 호출 방지: 해당 selector로 찾은 요소가 이전과 다를 때만 호출하거나,\n // 또는 매번 호출할지 결정해야 함. 여기서는 새로운 요소가 발견되면 호출하는 방식으로 처리.\n if (element) {\n let bound = this._boundElements.get(element);\n if (!bound) {\n bound = new Set();\n this._boundElements.set(element, bound);\n }\n if (!bound.has(it.propertyKey)) {\n (this as any)[it.propertyKey](element);\n bound.add(it.propertyKey);\n }\n }\n });\n }\n\n const queryAllMetadata = getQueryAllMetadata(this);\n if (queryAllMetadata) {\n queryAllMetadata\n .filter(it => it.isMethod)\n .forEach(it => {\n const root = it.options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;\n const elements = root.querySelectorAll(it.selector);\n\n // queryAll은 목록이 바뀔 수 있으므로 일단 호출하되,\n // 내부 로직은 사용자에게 맡기거나 좀 더 정교한 비교가 필요할 수 있음.\n // 여기서는 단순하게 호출만 다시 함. (사용자가 요청한 '다시 호출' 반영)\n (this as any)[it.propertyKey](elements);\n });\n }\n\n // 6. Register @addEventListener methods\n const eventListeners = getAddEventListenerMetadata(this);\n if (eventListeners) {\n eventListeners.forEach(it => {\n const { selector, eventName, useShadow, ...options } = it.options;\n const root = useShadow !== false && this.shadowRoot ? this.shadowRoot : this;\n const targetElements = selector ? root.querySelectorAll(selector) : [this as any as Element];\n\n targetElements.forEach(targetElement => {\n if (targetElement) {\n let bound = this._boundElements.get(targetElement);\n if (!bound) {\n bound = new Set();\n this._boundElements.set(targetElement, bound);\n }\n\n // 중복 바인딩 방지: (요소, 이벤트, 메서드) 조합 확인\n const eventKey = `event:${String(it.propertyKey)}:${eventName}`;\n if (!bound.has(eventKey)) {\n targetElement.addEventListener(\n eventName,\n event => {\n (this as any)[it.propertyKey](event);\n },\n options\n );\n bound.add(eventKey);\n }\n }\n });\n });\n }\n }\n\n disconnectedCallback() {\n if (this._observer) {\n this._observer.disconnect();\n }\n if (super.disconnectedCallback) {\n super.disconnectedCallback();\n }\n }\n\n connectedMoveCallback() {\n //default logic...\n if (super.connectedMoveCallback) {\n super.connectedMoveCallback();\n }\n }\n\n adoptedCallback() {\n //default logic...\n if (super.adoptedCallback) {\n super.adoptedCallback();\n }\n }\n\n async connectedCallback() {\n const templateMethod = getTemplateMethod(this);\n const styleMethod = getStyleMethod(this);\n\n const template = templateMethod ? await (this as any)[templateMethod]() : undefined;\n const style = styleMethod ? await (this as any)[styleMethod]() : undefined;\n\n // If not using shadow DOM and no decorators are present, do nothing\n if (!this.shadowRoot && template === undefined && style === undefined) {\n return;\n }\n\n let content = '';\n if (style !== undefined && style.trim().length > 0) {\n content += `<style>${style}</style>`;\n }\n\n if (template !== undefined) {\n content += template;\n } else if (!this.shadowRoot) {\n content += this.innerHTML;\n }\n\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = content;\n } else {\n this.innerHTML = content;\n }\n\n // 초기 동기화\n (this as any)._syncDecorators();\n\n // 7. Watch for DOM changes (MutationObserver)\n this._observer = new MutationObserver(() => {\n (this as any)._syncDecorators();\n });\n const target = this.shadowRoot || this;\n this._observer.observe(target, { childList: true, subtree: true });\n\n if (super.connectedCallback) {\n await super.connectedCallback();\n }\n }\n\n // 4. Handle attribute changes and route to decorated methods\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n // Call the original callback if it exists\n if (super.attributeChangedCallback) {\n super.attributeChangedCallback(name, oldValue, newValue);\n }\n\n // Call all methods associated with @attributeChanged\n const methodKeys = attributeChangedMap?.get(name);\n if (methodKeys && Array.isArray(methodKeys)) {\n methodKeys.forEach(key => {\n if (typeof (this as any)[key] === 'function') {\n (this as any)[key](newValue, oldValue, name);\n }\n });\n }\n\n // Call the wildcard methods if they exist\n const wildcardMethodKeys = attributeChangedMap?.get(ATTRIBUTE_CHANGED_WILDCARD);\n if (wildcardMethodKeys && Array.isArray(wildcardMethodKeys)) {\n wildcardMethodKeys.forEach(key => {\n if (typeof (this as any)[key] === 'function') {\n (this as any)[key](newValue, oldValue, name);\n }\n });\n }\n }\n };\n\n // 5. Register Custom Element using specified or default registry\n const registry = config.customElementRegistry || (typeof customElements !== 'undefined' ? customElements : undefined);\n if (registry && !registry.get(config.tagName)) {\n const options = extendsTagName ? { extends: extendsTagName } : undefined;\n registry.define(config.tagName, NewClass as any, options);\n }\n\n // 6. Save metadata\n ReflectUtils.defineMetadata(ELEMENT_CONFIG_KEY, config, NewClass);\n\n return NewClass as any;\n };\n\nexport const getElementConfig = (target: any): ElementConfig | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ELEMENT_CONFIG_KEY, constructor);\n};\n", "import { getTemplateMethod } from '../decorators/template';\nimport { getStyleMethod } from '../decorators/style';\n\nexport abstract class SwcHTMLElementBase extends HTMLElement {\n protected _masterTplNodes: Node[] = [];\n protected _asKey: string = 'value';\n protected _asIndexKey: string = 'index';\n\n constructor() {\n super();\n }\n\n protected initCore() {\n this._asKey = this.getAttribute('as') || 'value';\n this._asIndexKey = this.getAttribute('as-index') || 'index';\n const tplSlot = this.shadowRoot?.getElementById('tpl-slot') as HTMLSlotElement;\n if (tplSlot) {\n this._masterTplNodes = tplSlot.assignedNodes().map(n => n.cloneNode(true));\n }\n }\n\n protected getValueByPath(obj: any, path: string) {\n if (path === this._asKey) return obj;\n if (path.startsWith(`${this._asKey}.`)) {\n return path\n .split('.')\n .slice(1)\n .reduce((acc, part) => acc && acc[part], obj);\n }\n return undefined;\n }\n\n protected applyData(node: Node, data: any, index?: number) {\n const context: Record<string, any> = {};\n if (index !== undefined) {\n context[this._asIndexKey] = index.toString();\n }\n\n const walk = (n: Node) => {\n if (n.nodeType === Node.TEXT_NODE) {\n if (!(n as any)._original) (n as any)._original = n.textContent;\n let text = (n as any)._original;\n\n text = text.replace(/{{(.*?)}}/g, (match: string, path: string) => {\n path = path.trim();\n if (context[path] !== undefined) return context[path];\n const val = this.getValueByPath(data, path);\n return val !== undefined ? val : match;\n });\n if (n.textContent !== text) n.textContent = text;\n } else if (n.nodeType === Node.ELEMENT_NODE) {\n const el = n as Element;\n Array.from(el.attributes).forEach(a => {\n if (!(a as any)._original) (a as any)._original = a.value;\n let val = (a as any)._original;\n\n val = val.replace(/{{(.*?)}}/g, (match: string, path: string) => {\n path = path.trim();\n if (context[path] !== undefined) return context[path];\n const v = this.getValueByPath(data, path);\n return v !== undefined ? v : match;\n });\n if (a.value !== val) a.value = val;\n });\n el.childNodes.forEach(walk);\n }\n };\n walk(node);\n }\n\n /**\n * \uAC1D\uCCB4/\uBC30\uC5F4\uC758 \uBCC0\uACBD\uC744 \uAC10\uC9C0\uD558\uB294 Proxy \uC0DD\uC131 \uC720\uD2F8\uB9AC\uD2F0\n */\n protected createReactiveProxy(target: any, onChange: () => void, onIndexChange?: (index: number, val: any) => void) {\n return new Proxy(target, {\n set: (t, prop, val) => {\n const isIndex = !isNaN(Number(prop));\n t[prop] = val;\n if (isIndex && onIndexChange) {\n onIndexChange(Number(prop), val);\n } else {\n onChange();\n }\n return true;\n },\n deleteProperty: (t, prop) => {\n delete t[prop];\n onChange();\n return true;\n }\n });\n }\n}\n", "import { elementDefind, template, style } from '../index';\nimport { SwcHTMLElementBase } from './SwcHTMLElementBase';\n\n@elementDefind({ tagName: 'swc-for-of', useShadow: true })\nexport class SwcForOf extends SwcHTMLElementBase {\n private _value: any[] = [];\n\n constructor() {\n super();\n }\n\n set value(val: any[]) {\n if (!Array.isArray(val)) val = [];\n this._value = this.createReactiveProxy(\n val,\n () => this.renderAll(),\n (idx, v) => this.updateSingleRow(idx, v)\n );\n this.renderAll();\n }\n\n get value(): any[] {\n return this._value;\n }\n\n @style\n styles() {\n return `:host { display: contents; }`;\n }\n\n @template\n renderTemplate() {\n return `<slot id=\"tpl-slot\" style=\"display:none;\"></slot>`;\n }\n\n connectedCallback() {\n this.initCore();\n this.renderAll();\n }\n\n public updateSingleRow(index: number, newValue: any) {\n const targets = this.querySelectorAll(`[slot=\"row-${index}\"]`);\n if (targets.length > 0) {\n targets.forEach(target => this.applyData(target, newValue, index));\n } else {\n this.renderRow(newValue, index);\n }\n }\n\n private renderRow(item: any, index: number) {\n if (!this.shadowRoot || this._masterTplNodes.length === 0) return;\n\n const slotName = `row-${index}`;\n if (!this.shadowRoot.querySelector(`slot[name=\"${slotName}\"]`)) {\n const slot = document.createElement('slot');\n slot.name = slotName;\n this.shadowRoot.appendChild(slot);\n }\n\n this._masterTplNodes.forEach(tplNode => {\n const clone = tplNode.cloneNode(true);\n if (clone.nodeType === Node.ELEMENT_NODE) {\n (clone as HTMLElement).setAttribute('slot', slotName);\n (clone as HTMLElement).style.display = '';\n } else if (clone.nodeType === Node.TEXT_NODE) {\n if (clone.textContent?.trim().length === 0) return;\n const span = document.createElement('span');\n span.setAttribute('slot', slotName);\n span.appendChild(clone);\n this.appendChild(span);\n this.applyData(span, item, index);\n return;\n }\n this.appendChild(clone);\n this.applyData(clone, item, index);\n });\n }\n\n private renderAll() {\n if (this._masterTplNodes.length === 0 || !this.shadowRoot) return;\n\n Array.from(this.children).forEach(c => {\n const slot = c.getAttribute('slot');\n if (slot && slot.startsWith('row-')) {\n c.remove();\n }\n });\n\n Array.from(this.shadowRoot.querySelectorAll('slot')).forEach(s => {\n if (s.id !== 'tpl-slot') s.remove();\n });\n\n this._value.forEach((item, index) => this.renderRow(item, index));\n }\n}\n", "import { elementDefind, template, style } from '../index';\nimport { SwcHTMLElementBase } from './SwcHTMLElementBase';\n\n@elementDefind({ tagName: 'swc-if', useShadow: true })\nexport class SwcIf extends SwcHTMLElementBase {\n private _value: any = false;\n private _observer: MutationObserver | null = null;\n\n constructor() {\n super();\n }\n\n set value(val: any) {\n this._value = val;\n this.render();\n }\n\n get value(): any {\n return this._value;\n }\n\n @style\n styles() {\n return `:host { display: contents; }`;\n }\n\n @template\n renderTemplate() {\n return `<slot id=\"tpl-slot\" style=\"display:none;\"></slot>`;\n }\n\n connectedCallback() {\n this.initCore();\n this._observer = new MutationObserver(() => this.render());\n this._observer.observe(this, { attributes: true });\n this.render();\n }\n\n disconnectedCallback() {\n this._observer?.disconnect();\n }\n\n private render() {\n if (!this.shadowRoot) return;\n\n const attrValue = this.getAttribute('value');\n if (attrValue !== null && attrValue.includes('{{')) return;\n\n let displayValue = attrValue !== null ? attrValue : this._value;\n let isTruthy = !!displayValue;\n if (typeof displayValue === 'string') {\n if (displayValue === 'false' || displayValue === '0' || displayValue === '') isTruthy = false;\n else {\n try {\n isTruthy = !!new Function(`return ${displayValue}`)();\n } catch (e) {\n isTruthy = true;\n }\n }\n }\n\n Array.from(this.children).forEach(c => {\n if (c.getAttribute('slot') === 'if-content') {\n c.remove();\n }\n });\n\n const existingSlot = this.shadowRoot.querySelector('slot[name=\"if-content\"]');\n if (existingSlot) existingSlot.remove();\n\n if (isTruthy && this._masterTplNodes.length > 0) {\n const contentSlot = document.createElement('slot');\n contentSlot.name = 'if-content';\n this.shadowRoot.appendChild(contentSlot);\n\n this._masterTplNodes.forEach(tplNode => {\n const clone = tplNode.cloneNode(true);\n if (clone.nodeType === Node.ELEMENT_NODE) {\n (clone as HTMLElement).setAttribute('slot', 'if-content');\n } else if (clone.nodeType === Node.TEXT_NODE) {\n if (clone.textContent?.trim().length === 0) return;\n const span = document.createElement('span');\n span.setAttribute('slot', 'if-content');\n span.appendChild(clone);\n this.appendChild(span);\n return;\n }\n this.appendChild(clone);\n });\n }\n }\n}\n", "import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-choose', useShadow: true })\nexport class SwcChoose extends HTMLElement {\n private _observer: MutationObserver | null = null;\n private _value: any = undefined;\n\n set value(val: any) {\n this._value = val;\n this.evaluate();\n }\n\n get value() {\n return this._value;\n }\n\n @style\n styles() {\n return `:host { display: contents; }`;\n }\n\n @template\n render() {\n return `<slot id=\"choose-slot\"></slot>`;\n }\n\n connectedCallback() {\n this._observer = new MutationObserver(() => this.evaluate());\n this._observer.observe(this, { attributes: true, subtree: true, childList: true });\n this.evaluate();\n }\n\n disconnectedCallback() {\n this._observer?.disconnect();\n }\n\n private evaluate() {\n const whens = Array.from(this.querySelectorAll('swc-when'));\n const other = this.querySelector('swc-other');\n let matched = false;\n\n // 현재 choose에 설정된 value (문자열인 경우 \"null\", \"undefined\" 등 처리)\n const chooseValue = this.getAttribute('value') ?? this._value;\n\n whens.forEach(when => {\n if (matched) {\n (when as HTMLElement).style.display = 'none';\n return;\n }\n\n const testAttr = when.getAttribute('test');\n if (testAttr === null) return;\n if (testAttr.includes('{{')) return; // 아직 치환 전이면 스킵\n\n let isConditionMet = false;\n\n if (chooseValue !== undefined && chooseValue !== null) {\n // 1. 매칭 모드: choose의 value와 when의 test값이 같은지 비교\n isConditionMet = String(chooseValue) === String(testAttr);\n } else {\n // 2. 표현식 모드: testAttr 자체가 실행 가능한 코드인 경우\n try {\n if (testAttr === 'true') isConditionMet = true;\n else if (testAttr === 'false') isConditionMet = false;\n else isConditionMet = !!new Function(`return ${testAttr}`)();\n } catch (e) {\n isConditionMet = false;\n }\n }\n\n if (isConditionMet) {\n (when as HTMLElement).style.display = '';\n matched = true;\n } else {\n (when as HTMLElement).style.display = 'none';\n }\n });\n\n if (other) {\n (other as HTMLElement).style.display = matched ? 'none' : '';\n }\n }\n}\n", "import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-when', useShadow: true })\nexport class SwcWhen extends HTMLElement {\n @style\n styles() {\n return `:host { display: contents; }`;\n }\n\n @template\n render() {\n return `<slot></slot>`;\n }\n}\n", "import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-other', useShadow: true })\nexport class SwcOther extends HTMLElement {\n @style\n styles() {\n return `:host { display: contents; }`;\n }\n\n @template\n render() {\n return `<slot></slot>`;\n }\n}\n", "import { elementDefind, template, style } from '../index';\nimport { SwcHTMLElementBase } from './SwcHTMLElementBase';\n\n@elementDefind({ tagName: 'swc-object', useShadow: true })\nexport class SwcObject extends SwcHTMLElementBase {\n private _value: any = {};\n private _renderedNodes: Node[] = [];\n\n constructor() {\n super();\n }\n\n set value(val: any) {\n if (typeof val !== 'object' || val === null) val = {};\n this._value = this.createReactiveProxy(val, () => this.updateUI());\n this.render();\n }\n\n get value(): any {\n return this._value;\n }\n\n @style\n styles() {\n return `:host { display: contents; }`;\n }\n\n @template\n renderTemplate() {\n return `<slot id=\"tpl-slot\" style=\"display:none;\"></slot>`;\n }\n\n connectedCallback() {\n this.initCore();\n this.render();\n }\n\n private updateUI() {\n this._renderedNodes.forEach(node => {\n this.applyData(node, this._value);\n });\n }\n\n private render() {\n if (!this.shadowRoot || this._masterTplNodes.length === 0) return;\n\n this._renderedNodes.forEach(n => {\n if (n.parentElement === this) this.removeChild(n);\n });\n this._renderedNodes = [];\n\n let slot = this.shadowRoot.querySelector('slot[name=\"obj-content\"]');\n if (!slot) {\n slot = document.createElement('slot');\n (slot as HTMLSlotElement).name = 'obj-content';\n this.shadowRoot.appendChild(slot);\n }\n\n this._masterTplNodes.forEach(tplNode => {\n const clone = tplNode.cloneNode(true);\n if (clone.nodeType === Node.ELEMENT_NODE) {\n (clone as HTMLElement).setAttribute('slot', 'obj-content');\n } else if (clone.nodeType === Node.TEXT_NODE) {\n if (clone.textContent?.trim().length === 0) return;\n const span = document.createElement('span');\n span.setAttribute('slot', 'obj-content');\n span.appendChild(clone);\n this.appendChild(span);\n this._renderedNodes.push(span);\n this.applyData(span, this._value);\n return;\n }\n this.appendChild(clone);\n this._renderedNodes.push(clone);\n this.applyData(clone, this._value);\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ReflectUtils", "template", "style", "SwcForOf", "SwcIf", "__decorate", "SwcChoose", "__decorate", "SwcWhen", "__decorate", "SwcOther", "__decorate", "SwcObject", "__decorate"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dooboostore/simple-web-component",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -1,9 +1,9 @@
1
1
  import { elementDefind, template, style } from '../index';
2
+ import { SwcHTMLElementBase } from './SwcHTMLElementBase';
2
3
 
3
4
  @elementDefind({ tagName: 'swc-for-of', useShadow: true })
4
- export class SwcForOf extends HTMLElement {
5
+ export class SwcForOf extends SwcHTMLElementBase {
5
6
  private _value: any[] = [];
6
- private _masterTplNodes: Node[] = [];
7
7
 
8
8
  constructor() {
9
9
  super();
@@ -11,7 +11,11 @@ export class SwcForOf extends HTMLElement {
11
11
 
12
12
  set value(val: any[]) {
13
13
  if (!Array.isArray(val)) val = [];
14
- this._value = this.createProxy(val);
14
+ this._value = this.createReactiveProxy(
15
+ val,
16
+ () => this.renderAll(),
17
+ (idx, v) => this.updateSingleRow(idx, v)
18
+ );
15
19
  this.renderAll();
16
20
  }
17
21
 
@@ -19,48 +23,18 @@ export class SwcForOf extends HTMLElement {
19
23
  return this._value;
20
24
  }
21
25
 
22
- private createProxy(arr: any[]) {
23
- return new Proxy(arr, {
24
- set: (target, prop, val) => {
25
- const isIndex = !isNaN(Number(prop));
26
- target[prop as any] = val;
27
-
28
- if (isIndex) {
29
- this.updateSingleRow(Number(prop), val);
30
- } else if (prop === 'length' && val < target.length) {
31
- this.renderAll();
32
- }
33
- return true;
34
- },
35
- deleteProperty: (target, prop) => {
36
- const res = delete target[prop as any];
37
- this.renderAll();
38
- return res;
39
- }
40
- });
41
- }
42
-
43
26
  @style
44
27
  styles() {
45
- // display: contents 통해 swc-for-of 태그 자체를 레이아웃에서 투명하게 만듭니다.
46
- return `
47
- :host { display: contents; }
48
- `;
28
+ return `:host { display: contents; }`;
49
29
  }
50
30
 
51
31
  @template
52
32
  renderTemplate() {
53
- // 감싸는 div 없이 tpl-slot 둡니다.
54
- return `
55
- <slot id="tpl-slot" style="display:none;"></slot>
56
- `;
33
+ return `<slot id="tpl-slot" style="display:none;"></slot>`;
57
34
  }
58
35
 
59
36
  connectedCallback() {
60
- const tplSlot = this.shadowRoot?.getElementById('tpl-slot') as HTMLSlotElement;
61
- if (tplSlot) {
62
- this._masterTplNodes = tplSlot.assignedNodes().map(n => n.cloneNode(true));
63
- }
37
+ this.initCore();
64
38
  this.renderAll();
65
39
  }
66
40
 
@@ -73,57 +47,10 @@ export class SwcForOf extends HTMLElement {
73
47
  }
74
48
  }
75
49
 
76
- private applyData(node: Node, data: any, index: number) {
77
- const getValueByPath = (obj: any, path: string) => {
78
- if (path === 'value') return obj;
79
- if (path.startsWith('value.')) {
80
- return path
81
- .split('.')
82
- .slice(1)
83
- .reduce((acc, part) => acc && acc[part], obj);
84
- }
85
- return undefined;
86
- };
87
-
88
- const walk = (n: Node) => {
89
- if (n.nodeType === Node.TEXT_NODE) {
90
- if (!(n as any)._original) (n as any)._original = n.textContent;
91
- let text = (n as any)._original;
92
-
93
- text = text.replace(/{{(.*?)}}/g, (match: string, path: string) => {
94
- path = path.trim();
95
- if (path === 'index') return index.toString();
96
- const val = getValueByPath(data, path);
97
- return val !== undefined ? val : match;
98
- });
99
- if (n.textContent !== text) n.textContent = text;
100
- } else if (n.nodeType === Node.ELEMENT_NODE) {
101
- const el = n as Element;
102
- Array.from(el.attributes).forEach(a => {
103
- if (!(a as any)._original) (a as any)._original = a.value;
104
- let val = (a as any)._original;
105
-
106
- val = val.replace(/{{(.*?)}}/g, (match: string, path: string) => {
107
- path = path.trim();
108
- if (path === 'index') return index.toString();
109
- const v = getValueByPath(data, path);
110
- return v !== undefined ? v : match;
111
- });
112
- if (a.value !== val) a.value = val;
113
- });
114
-
115
- // 중요: swc-choose 같은 커스텀 엘리먼트 내부의 자식들도 템플릿 치환이 필요함
116
- el.childNodes.forEach(walk);
117
- }
118
- };
119
- walk(node);
120
- }
121
-
122
50
  private renderRow(item: any, index: number) {
123
51
  if (!this.shadowRoot || this._masterTplNodes.length === 0) return;
124
52
 
125
53
  const slotName = `row-${index}`;
126
- // Shadow Root에 직접 슬롯 추가
127
54
  if (!this.shadowRoot.querySelector(`slot[name="${slotName}"]`)) {
128
55
  const slot = document.createElement('slot');
129
56
  slot.name = slotName;
@@ -152,7 +79,6 @@ export class SwcForOf extends HTMLElement {
152
79
  private renderAll() {
153
80
  if (this._masterTplNodes.length === 0 || !this.shadowRoot) return;
154
81
 
155
- // 기존 데이터 노드 삭제
156
82
  Array.from(this.children).forEach(c => {
157
83
  const slot = c.getAttribute('slot');
158
84
  if (slot && slot.startsWith('row-')) {
@@ -160,7 +86,6 @@ export class SwcForOf extends HTMLElement {
160
86
  }
161
87
  });
162
88
 
163
- // Shadow Root의 기존 슬롯들 삭제 (tpl-slot 제외)
164
89
  Array.from(this.shadowRoot.querySelectorAll('slot')).forEach(s => {
165
90
  if (s.id !== 'tpl-slot') s.remove();
166
91
  });
@@ -0,0 +1,93 @@
1
+ import { getTemplateMethod } from '../decorators/template';
2
+ import { getStyleMethod } from '../decorators/style';
3
+
4
+ export abstract class SwcHTMLElementBase extends HTMLElement {
5
+ protected _masterTplNodes: Node[] = [];
6
+ protected _asKey: string = 'value';
7
+ protected _asIndexKey: string = 'index';
8
+
9
+ constructor() {
10
+ super();
11
+ }
12
+
13
+ protected initCore() {
14
+ this._asKey = this.getAttribute('as') || 'value';
15
+ this._asIndexKey = this.getAttribute('as-index') || 'index';
16
+ const tplSlot = this.shadowRoot?.getElementById('tpl-slot') as HTMLSlotElement;
17
+ if (tplSlot) {
18
+ this._masterTplNodes = tplSlot.assignedNodes().map(n => n.cloneNode(true));
19
+ }
20
+ }
21
+
22
+ protected getValueByPath(obj: any, path: string) {
23
+ if (path === this._asKey) return obj;
24
+ if (path.startsWith(`${this._asKey}.`)) {
25
+ return path
26
+ .split('.')
27
+ .slice(1)
28
+ .reduce((acc, part) => acc && acc[part], obj);
29
+ }
30
+ return undefined;
31
+ }
32
+
33
+ protected applyData(node: Node, data: any, index?: number) {
34
+ const context: Record<string, any> = {};
35
+ if (index !== undefined) {
36
+ context[this._asIndexKey] = index.toString();
37
+ }
38
+
39
+ const walk = (n: Node) => {
40
+ if (n.nodeType === Node.TEXT_NODE) {
41
+ if (!(n as any)._original) (n as any)._original = n.textContent;
42
+ let text = (n as any)._original;
43
+
44
+ text = text.replace(/{{(.*?)}}/g, (match: string, path: string) => {
45
+ path = path.trim();
46
+ if (context[path] !== undefined) return context[path];
47
+ const val = this.getValueByPath(data, path);
48
+ return val !== undefined ? val : match;
49
+ });
50
+ if (n.textContent !== text) n.textContent = text;
51
+ } else if (n.nodeType === Node.ELEMENT_NODE) {
52
+ const el = n as Element;
53
+ Array.from(el.attributes).forEach(a => {
54
+ if (!(a as any)._original) (a as any)._original = a.value;
55
+ let val = (a as any)._original;
56
+
57
+ val = val.replace(/{{(.*?)}}/g, (match: string, path: string) => {
58
+ path = path.trim();
59
+ if (context[path] !== undefined) return context[path];
60
+ const v = this.getValueByPath(data, path);
61
+ return v !== undefined ? v : match;
62
+ });
63
+ if (a.value !== val) a.value = val;
64
+ });
65
+ el.childNodes.forEach(walk);
66
+ }
67
+ };
68
+ walk(node);
69
+ }
70
+
71
+ /**
72
+ * 객체/배열의 변경을 감지하는 Proxy 생성 유틸리티
73
+ */
74
+ protected createReactiveProxy(target: any, onChange: () => void, onIndexChange?: (index: number, val: any) => void) {
75
+ return new Proxy(target, {
76
+ set: (t, prop, val) => {
77
+ const isIndex = !isNaN(Number(prop));
78
+ t[prop] = val;
79
+ if (isIndex && onIndexChange) {
80
+ onIndexChange(Number(prop), val);
81
+ } else {
82
+ onChange();
83
+ }
84
+ return true;
85
+ },
86
+ deleteProperty: (t, prop) => {
87
+ delete t[prop];
88
+ onChange();
89
+ return true;
90
+ }
91
+ });
92
+ }
93
+ }
@@ -1,9 +1,9 @@
1
1
  import { elementDefind, template, style } from '../index';
2
+ import { SwcHTMLElementBase } from './SwcHTMLElementBase';
2
3
 
3
4
  @elementDefind({ tagName: 'swc-if', useShadow: true })
4
- export class SwcIf extends HTMLElement {
5
+ export class SwcIf extends SwcHTMLElementBase {
5
6
  private _value: any = false;
6
- private _masterTplNodes: Node[] = [];
7
7
  private _observer: MutationObserver | null = null;
8
8
 
9
9
  constructor() {
@@ -21,28 +21,18 @@ export class SwcIf extends HTMLElement {
21
21
 
22
22
  @style
23
23
  styles() {
24
- return `
25
- :host { display: contents; }
26
- `;
24
+ return `:host { display: contents; }`;
27
25
  }
28
26
 
29
27
  @template
30
28
  renderTemplate() {
31
- return `
32
- <slot id="tpl-slot" style="display:none;"></slot>
33
- `;
29
+ return `<slot id="tpl-slot" style="display:none;"></slot>`;
34
30
  }
35
31
 
36
32
  connectedCallback() {
37
- const tplSlot = this.shadowRoot?.getElementById('tpl-slot') as HTMLSlotElement;
38
- if (tplSlot) {
39
- // 초기 자식들을 템플릿으로 보관
40
- this._masterTplNodes = tplSlot.assignedNodes().map(n => n.cloneNode(true));
41
- }
42
-
33
+ this.initCore();
43
34
  this._observer = new MutationObserver(() => this.render());
44
35
  this._observer.observe(this, { attributes: true });
45
-
46
36
  this.render();
47
37
  }
48
38
 
@@ -54,38 +44,30 @@ export class SwcIf extends HTMLElement {
54
44
  if (!this.shadowRoot) return;
55
45
 
56
46
  const attrValue = this.getAttribute('value');
57
- if (attrValue !== null && attrValue.includes('{{')) return; // 치환 전이면 대기
47
+ if (attrValue !== null && attrValue.includes('{{')) return;
58
48
 
59
- // 로직 결정: attribute가 있으면 우선, 없으면 property 사용
60
49
  let displayValue = attrValue !== null ? attrValue : this._value;
61
-
62
- // "false", "null", "undefined" 문자열 처리 및 기본 truthy 체크
63
50
  let isTruthy = !!displayValue;
64
51
  if (typeof displayValue === 'string') {
65
52
  if (displayValue === 'false' || displayValue === '0' || displayValue === '') isTruthy = false;
66
53
  else {
67
- // 식인 경우 평가 시도 (예: "10 > 5")
68
54
  try {
69
55
  isTruthy = !!new Function(`return ${displayValue}`)();
70
56
  } catch (e) {
71
- // 단순 문자열이면 true로 간주
72
57
  isTruthy = true;
73
58
  }
74
59
  }
75
60
  }
76
61
 
77
- // 1. 기존에 렌더링된 노드들 삭제
78
62
  Array.from(this.children).forEach(c => {
79
63
  if (c.getAttribute('slot') === 'if-content') {
80
64
  c.remove();
81
65
  }
82
66
  });
83
67
 
84
- // 2. Shadow DOM의 컨텐츠 슬롯 삭제
85
68
  const existingSlot = this.shadowRoot.querySelector('slot[name="if-content"]');
86
69
  if (existingSlot) existingSlot.remove();
87
70
 
88
- // 3. 조건이 참일 때만 노드들을 복제해서 삽입
89
71
  if (isTruthy && this._masterTplNodes.length > 0) {
90
72
  const contentSlot = document.createElement('slot');
91
73
  contentSlot.name = 'if-content';
@@ -95,7 +77,6 @@ export class SwcIf extends HTMLElement {
95
77
  const clone = tplNode.cloneNode(true);
96
78
  if (clone.nodeType === Node.ELEMENT_NODE) {
97
79
  (clone as HTMLElement).setAttribute('slot', 'if-content');
98
- (clone as HTMLElement).style.display = '';
99
80
  } else if (clone.nodeType === Node.TEXT_NODE) {
100
81
  if (clone.textContent?.trim().length === 0) return;
101
82
  const span = document.createElement('span');