{"version":3,"file":"FlowRemoteElement.mjs","names":[],"sources":["../../../src/lib/FlowRemoteElement.ts"],"sourcesContent":["import { eventHandlerContext } from \"@mittwald/flow-react-components\";\nimport {\n  RemoteElement,\n  RemoteEvent,\n  type Version,\n} from \"@mittwald/flow-remote-core\";\nimport type { EmptyObject } from \"type-fest\";\n\n// eslint-disable-next-line\ntype ExplicitAny = any;\n\nexport class FlowRemoteElement<\n  Properties extends Record<string, ExplicitAny> = EmptyObject,\n  Methods extends Record<string, (...args: ExplicitAny[]) => void> =\n    EmptyObject,\n  Slots extends Record<string, ExplicitAny> = EmptyObject,\n  EventListeners extends Record<string, ExplicitAny> = EmptyObject,\n> extends RemoteElement<Properties, Methods, Slots, EventListeners> {\n  private eventListenerMap = new Map<\n    EventListenerOrEventListenerObject,\n    EventListenerOrEventListenerObject\n  >();\n\n  /**\n   * This property is used to check if the host component has received its\n   * remote props. If not, rendering the underlying component is skipped.\n   */\n  public static initializationPropertyName = \"data-flr-initialized\" as const;\n\n  public static versionPropertyName = \"data-flr-version\" as const;\n\n  static override get remoteProperties() {\n    return {\n      ...super.remoteAttributes,\n      \"data-testid\": {},\n      [FlowRemoteElement.initializationPropertyName]: {},\n      [FlowRemoteElement.versionPropertyName]: {},\n    };\n  }\n\n  public override addEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject,\n    options?: boolean | AddEventListenerOptions,\n  ): void {\n    const handleEvent: EventListener = listener\n      ? \"handleEvent\" in listener\n        ? listener.handleEvent\n        : listener\n      : () => undefined;\n\n    const handleRemoteEvent: EventListener = (event) =>\n      eventHandlerContext.run(\n        {\n          remoteEvent: {\n            type: event.type,\n          },\n        },\n        () => handleEvent(event instanceof RemoteEvent ? event.detail : event),\n      );\n\n    this.eventListenerMap.set(listener, handleRemoteEvent);\n    return super.addEventListener(type, handleRemoteEvent, options);\n  }\n\n  public override removeEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject,\n    options?: boolean | EventListenerOptions,\n  ) {\n    const wrappedEventListener = this.eventListenerMap.get(listener);\n    this.eventListenerMap.delete(listener);\n    super.removeEventListener(type, wrappedEventListener ?? listener, options);\n  }\n}\n\nexport interface FlowRemoteElementMetaData {\n  [FlowRemoteElement.initializationPropertyName]?: boolean;\n  [FlowRemoteElement.versionPropertyName]?: Version;\n}\n"],"mappings":";;;AAWA,IAAa,oBAAb,MAAa,0BAMH,cAA0D;CAClE,mCAA2B,IAAI,IAG7B;;;;;CAMF,OAAc,6BAA6B;CAE3C,OAAc,sBAAsB;CAEpC,WAAoB,mBAAmB;EACrC,OAAO;GACL,GAAG,MAAM;GACT,eAAe,CAAC;IACf,kBAAkB,6BAA6B,CAAC;IAChD,kBAAkB,sBAAsB,CAAC;EAC5C;CACF;CAEA,iBACE,MACA,UACA,SACM;EACN,MAAM,cAA6B,WAC/B,iBAAiB,WACf,SAAS,cACT,iBACI,KAAA;EAEV,MAAM,qBAAoC,UACxC,oBAAoB,IAClB,EACE,aAAa,EACX,MAAM,MAAM,KACd,EACF,SACM,YAAY,iBAAiB,cAAc,MAAM,SAAS,KAAK,CACvE;EAEF,KAAK,iBAAiB,IAAI,UAAU,iBAAiB;EACrD,OAAO,MAAM,iBAAiB,MAAM,mBAAmB,OAAO;CAChE;CAEA,oBACE,MACA,UACA,SACA;EACA,MAAM,uBAAuB,KAAK,iBAAiB,IAAI,QAAQ;EAC/D,KAAK,iBAAiB,OAAO,QAAQ;EACrC,MAAM,oBAAoB,MAAM,wBAAwB,UAAU,OAAO;CAC3E;AACF"}