{"version":3,"file":"event.cjs","sources":["../packages/event/listen/interface.js","../packages/event/event.js","../packages/event/listen/listen.js"],"sourcesContent":["export const controller = Symbol(\"controller\");\n","import listen from \"./listen\";\n\n/**\n * Decorator que adiciona um event listener a um elemento dentro do Shadow DOM.\n *\n * @param {string} type - Tipo do evento (ex: 'click').\n * @param {string} selector - Seletor CSS para identificar o alvo do evento.\n * @param {...Function} filters - Funções aplicadas ao evento antes da execução do método.\n * @returns {Function} Um decorator que associa o método ao evento.\n *\n * @description\n * O decorator `event` permite ouvir eventos DOM disparados em elementos\n * do Shadow DOM do Custom Element. Ele permite aplicar filtros no evento\n * antes de chamar o método decorado, e realiza o gerenciamento automático\n * com `AbortController` para remoção do listener no `disconnectedCallback`.\n *\n * @example\n * class MyElement extends HTMLElement {\n *   @event.click('button')\n *   handleClick(event) {\n *     console.log('Botão clicado', event);\n *   }\n * }\n */\nconst event = new Proxy(\n  {},\n  {\n    get(_, type) {\n      return (selector, ...filters) =>\n        (target, method) => {\n          listen(type)\n            .on(selector)\n            .with(...filters)\n            .in(target)\n            .call(method);\n        };\n    },\n  },\n);\n\nexport default event;\n","import { controller } from \"./interface\";\n\n/**\n * Registra um listener para eventos delegados no Shadow DOM de um Custom Element.\n *\n * @param {string} type - Tipo do evento a ser escutado (ex: 'click', 'input').\n * @returns {{ on: (selector: string) => { with: (...filters: Function[]) => { in: (target: Object) => { call: (method: string|symbol) => void } } } }}\n *\n * @description\n * A função `listen` permite registrar ouvintes de eventos delegados no `shadowRoot`\n * de um Custom Element, de forma fluente e segura. É ideal para escutar eventos em\n * elementos internos sem necessidade de binds manuais ou remoções explícitas.\n *\n * Internamente, a função conecta-se ao `connectedCallback` para registrar o listener,\n * e ao `disconnectedCallback` para removê-lo automaticamente, utilizando `AbortController`.\n *\n * O evento pode ser filtrado por um seletor CSS (`on`) e transformado por uma cadeia de filtros (`with`).\n * O método (`call`) será invocado com o resultado final do filtro aplicado ao evento original.\n *\n * @example\n * listen('click')\n *   .on('button')\n *   .with(e => e) // filtros opcionais\n *   .in(MyElement.prototype)\n *   .call('handleClick');\n */\nconst listen = (type) => ({\n  /**\n   * Define o seletor CSS do elemento alvo dentro do Shadow DOM.\n   *\n   * @param {string} selector - Seletor do elemento a ser escutado.\n   * @returns {{ with: (...filters: Function[]) => { in: (target: Object) => { call: (method: string|symbol) => void } } }}\n   */\n  on: (selector) => ({\n    /**\n     * Define os filtros a serem aplicados ao evento capturado.\n     *\n     * @param {...Function} filters - Funções que recebem o evento e retornam uma transformação.\n     * @returns {{ in: (target: Object) => { call: (method: string|symbol) => void } }}\n     */\n    with: (...filters) => ({\n      /**\n       * Define o protótipo do Custom Element onde os callbacks serão interceptados.\n       *\n       * @param {Object} target - O alvo que terá o connected/disconnected interceptado.\n       * @returns {{ call: (method: string|symbol) => void }}\n       */\n      in: (target) => ({\n        /**\n         * Define o método a ser chamado com o resultado dos filtros aplicados ao evento.\n         *\n         * @param {string|symbol} method - Nome do método que será chamado.\n         * @returns {void}\n         */\n        call: (method) => {\n          target.connectedCallback = new Proxy(\n            target.connectedCallback ?? (() => {}),\n            {\n              apply(original, context, args) {\n                context[controller] = new AbortController();\n\n                const options = { signal: context[controller].signal };\n                const listener = (event) => {\n                  if (event.target.matches(selector)) {\n                    context[method](\n                      filters.reduce((target, filter) => filter(target), event),\n                    );\n                  }\n                };\n\n                context.shadowRoot?.addEventListener(type, listener, options);\n\n                return original.apply(context, args);\n              },\n            },\n          );\n\n          target.disconnectedCallback = new Proxy(\n            target.disconnectedCallback ?? (() => {}),\n            {\n              apply(original, context, args) {\n                context[controller].abort();\n                return original.apply(context, args);\n              },\n            },\n          );\n        },\n      }),\n    }),\n  }),\n});\n\nexport default listen;\n"],"names":["controller","Symbol","event","Proxy","get","_","type","selector","filters","target","method","on","with","in","call","connectedCallback","original","context","args","AbortController","options","signal","shadowRoot","addEventListener","matches","reduce","filter","apply","disconnectedCallback","abort"],"mappings":";wGAAO,EAAA,CAAA;AAAA,MAAMA,IAAaC,OAAO,YCwB3BC,GAAAA,IAAQ,IAAIC,MAChB,CAAE,GACF,EACEC,KAAG,CAACC,IAAGC,MACE,CAACC,OAAaC,MACnB,CAACC,GAAQC,MAAAA;ACHF,GAACJ,kBAAAA,QAAU,EAOxBK,IAAKJ,CAAAA,QAAc,EAOjBK,MAAM,IAAIJ,QAAa,EAOrBK,IAAKJ,CAAAA,QAAY,EAOfK,MAAOJ,CAAAA,OAAAA;AACLD,IAAAA,GAAOM,oBAAoB,IAAIZ,MAC7BM,GAAOM;IAA8B,IACrC,EACE,MAAMC,IAAUC,GAASC,GACvBD;;AAAAA,QAAQjB,KAAc,IAAImB;AAE1B,YAAMC,IAAU,EAAEC,QAAQJ,EAAQjB,CAAAA,EAAYqB,OAW9C;AAAA,cAFAJ,OAAQK,eAARL,mBAAoBM,iBAAiBjB,IARnBJ,CAAAA,OACZA;AAAAA,QAAAA,GAAMO,OAAOe,QAAQjB,EAAAA,KACvBU,EAAQP,EAAAA,EACNF,GAAQiB,OAAO,CAAChB,IAAQiB,OAAWA,GAAOjB,EAAAA,GAASP,EAEzE,CAAA;AAAA,MAAA,GAGqEkB,IAE9CJ,GAASW,MAAMV,GAASC;IAChC,EAILT,CAAAA,GAAAA,GAAOmB,uBAAuB,IAAIzB,MAChCM,GAAOmB,yBAAyB,MAAA;AAAA,IAAQ,IACxC,EACED,OAAK,CAACX,IAAUC,IAASC,QACvBD,GAAQjB,GAAY6B,MACbb,GAAAA,GAASW,MAAMV,IAASC,EAGpC,GAAA,CAAA;AAAA,EAAA,EAAA,GAAA,GAAA,GAAA,IDvDMZ,CAAAA,GACJK,GAAGJ,EACHK,EAAAA,KAAAA,GAAQJ,CACRK,EAAAA,GAAGJ,CACHK,EAAAA,KAAKJ,CAAO;AAAA,EAAA,CAAA;;"}