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