{"version":3,"file":"directive.cjs","sources":["../packages/directive/execute/execute.js","../packages/directive/adopted/adopted.js","../packages/directive/attributeChanged/attributeChanged.js","../packages/directive/attributeChanged/execute/execute.js","../packages/directive/connected/connected.js","../packages/directive/define/define.js","../packages/directive/disconnected/disconnected.js","../packages/directive/formAssociated/formAssociated.js","../packages/directive/formDisabled/formDisabled.js","../packages/directive/formReset/formReset.js","../packages/directive/formStateRestore/formStateRestore.js"],"sourcesContent":["/**\n * Registra a execução de um método após um evento do ciclo de vida de um Custom Element.\n *\n * @param {string|Symbol} method - Nome do método a ser executado.\n * @returns {{ on: (target: Object) => { after: (event: string) => void } }}\n *\n * @description\n * A função `execute` permite registrar de forma fluente a execução de um método de instância\n * logo após a invocação de um evento de ciclo de vida padrão do Web Component,\n * como `connectedCallback`, `disconnectedCallback` ou `adoptedCallback`.\n *\n * Internamente, a função substitui o callback nativo com um Proxy que mantém o comportamento\n * original e executa o método decorado após a conclusão do callback.\n *\n * @example\n * import execute from '@directive/execute';\n *\n * execute('onConnect').on(MyElement.prototype).after('connectedCallback');\n *\n * // Equivalente a:\n * // MyElement.prototype.connectedCallback = new Proxy(...);\n */\nconst execute = (method) => ({\n  /**\n   * Define o alvo (normalmente o prototype do Custom Element).\n   *\n   * @param {Object} target - O protótipo onde o método de ciclo de vida será interceptado.\n   * @returns {{ after: (event: string) => void }}\n   */\n  on: (target) => ({\n    /**\n     * Registra o método para execução após o evento especificado.\n     *\n     * @param {string} event - Nome do evento de ciclo de vida (ex: 'connectedCallback').\n     * @returns {void}\n     */\n    after: (event) => {\n      target[event] = new Proxy(target[event] || (() => {}), {\n        apply(original, context, args) {\n          original.apply(context, args);\n          context[method](...args);\n        },\n      });\n    },\n  }),\n});\n\nexport default execute;\n","import execute from \"@directive/execute\";\n\n/**\n * Decorator que executa um método ao mover o Custom Element para outro Document.\n *\n * @param {Object} target - Protótipo do Custom Element decorado.\n * @param {string|Symbol} method - Nome do método a ser executado.\n * @returns {void}\n *\n * @description\n * O decorator `adopted` registra um método específico para ser executado\n * automaticamente sempre que o Custom Element for movido de um documento para outro,\n * utilizando a API `adoptedCallback` com Proxy para manter o fluxo original.\n *\n * @example\n * import { adopted } from '@nodusjs/std/directive';\n *\n * class MyElement extends HTMLElement {\n *   @adopted\n *   onAdopted() {\n *     console.log('Elemento movido para outro document.');\n *   }\n * }\n *\n * customElements.define('my-element', MyElement);\n */\nconst adopted = (target, method) =>\n  execute(method).on(target).after(\"adoptedCallback\");\n\nexport default adopted;\n","import execute from \"@directive/attributeChanged/execute\";\n\n/**\n * Decorator que executa um setter quando um atributo observado é alterado.\n *\n * @param {string} attribute - Nome do atributo a ser monitorado.\n * @param {...Function} filters - Funções que transformam o novo valor antes da atribuição.\n * @returns {void}\n *\n * @description\n * O decorator `attributeChanged` registra o atributo como observado e\n * executa o setter decorado sempre que ele for alterado, utilizando\n * a API `attributeChangedCallback`. O novo valor pode ser transformado por filtros.\n *\n * @example\n * import { attributeChanged } from '@nodusjs/std/directive';\n *\n * class MyElement extends HTMLElement {\n *   @attributeChanged('visible', value => value === 'true')\n *   set visible(value) {\n *     this.toggleAttribute('hidden', !value);\n *   }\n * }\n *\n * customElements.define('my-element', MyElement);\n */\nconst attributeChanged =\n  (attribute, ...filters) =>\n  (target, property) => {\n    execute(property)\n      .with(filters)\n      .from(target)\n      .whenAttributeChanges(attribute);\n  };\n\nexport default attributeChanged;\n","/**\n * Registra a execução de um setter ou método sempre que um atributo observado for alterado.\n *\n * @param {string|symbol} property - Nome do setter ou método a ser executado.\n * @returns {{ with: (filters: Function[]) => { from: (target: Object) => { whenAttributeChanges: (attribute: string) => void } } }}\n *\n * @description\n * A função `execute` permite registrar de forma fluente a execução de um setter ou método\n * sempre que um atributo observado for alterado, utilizando a API `attributeChangedCallback`.\n * O valor novo pode ser transformado por uma sequência de filtros definidos previamente.\n *\n * @example\n * execute('visible')\n *   .with([value => value === 'true'])\n *   .from(MyElement.prototype)\n *   .whenAttributeChanges('visible');\n */\nconst execute = (property) => ({\n  /**\n   * Define os filtros que serão aplicados ao novo valor do atributo.\n   *\n   * @param {Function[]} filters - Lista de funções de transformação para o novo valor.\n   * @returns {{ from: (target: Object) => { whenAttributeChanges: (attribute: string) => void } }}\n   */\n  with: (filters) => ({\n    /**\n     * Define o alvo (geralmente o prototype do Custom Element) onde a lógica será aplicada.\n     *\n     * @param {Object} target - Protótipo da classe onde o atributo será observado.\n     * @returns {{ whenAttributeChanges: (attribute: string) => void }}\n     */\n    from: (target) => ({\n      /**\n       * Finaliza o encadeamento: registra o atributo como observado e aplica o setter ao ser alterado.\n       *\n       * @param {string} attribute - Nome do atributo a ser monitorado.\n       * @returns {void}\n       */\n      whenAttributeChanges: (attribute) => {\n        target.constructor.observedAttributes = [\n          ...new Set([\n            ...(target.constructor.observedAttributes || []),\n            attribute,\n          ]),\n        ];\n\n        target.attributeChangedCallback = new Proxy(\n          target.attributeChangedCallback || (() => {}),\n          {\n            apply(original, context, [name, oldValue, newValue]) {\n              original.apply(context, [name, oldValue, newValue]);\n              if (name === attribute) {\n                context[property] = filters.reduce((v, fn) => fn(v), newValue);\n              }\n            },\n          },\n        );\n      },\n    }),\n  }),\n});\n\nexport default execute;\n","import execute from \"@directive/execute\";\n\n/**\n * Decorator que executa um método ao inserir o Custom Element no DOM.\n *\n * @param {Object} target - Protótipo do Custom Element decorado.\n * @param {string|Symbol} method - Nome do método a ser executado.\n * @returns {void}\n *\n * @description\n * O decorator `connected` registra um método específico para ser executado\n * automaticamente sempre que o Custom Element for conectado ao DOM.\n * Internamente, o registro é realizado utilizando um interceptor para garantir\n * a execução organizada e previsível do método decorado.\n *\n * @example\n * import { connected } from '@nodusjs/std/directive';\n *\n * class MyElement extends HTMLElement {\n *   @connected\n *   initializeComponent() {\n *     console.log('Componente conectado ao DOM.');\n *   }\n * }\n *\n * customElements.define('my-element', MyElement);\n */\nconst connected = (target, method) =>\n  execute(method).on(target).after(\"connectedCallback\");\n\nexport default connected;\n","/**\n * Define e registra um Custom Element usando decorator.\n *\n * @param {string} name - Nome do Custom Element a ser registrado.\n * @param {ElementDefinitionOptions} [options] - Configurações opcionais do Custom Element.\n * @returns {(target: CustomElementConstructor) => void} - Decorator que define o Custom Element.\n *\n * @description\n * Utiliza a API `customElements.define` para registrar uma classe como um Custom Element.\n * Caso o Custom Element já esteja definido, não realiza nenhuma ação.\n *\n * @example\n * import { define } from '@nodusjs/std/directive';\n *\n * @define('my-element', { extends: 'div' })\n * class MyElement extends HTMLDivElement {\n *   constructor() {\n *     super();\n *     this.textContent = 'Hello, world!';\n *   }\n * }\n */\nconst define = (name, options) => (target) =>\n  customElements.get(name) ?? customElements.define(name, target, options);\n\nexport default define;\n","import execute from \"@directive/execute\";\n\n/**\n * Decorator que executa um método ao remover o Custom Element do DOM.\n *\n * @param {Object} target - Protótipo do Custom Element decorado.\n * @param {string|Symbol} method - Nome do método a ser executado.\n * @returns {void}\n *\n * @description\n * O decorator `disconnected` registra um método específico para ser executado\n * automaticamente sempre que o Custom Element for desconectado do DOM,\n * utilizando a API `disconnectedCallback` com Proxy para manter o fluxo original.\n *\n * @example\n * import { disconnected } from '@nodusjs/std/directive';\n *\n * class MyElement extends HTMLElement {\n *   @disconnected\n *   cleanup() {\n *     console.log('Elemento removido do DOM.');\n *   }\n * }\n *\n * customElements.define('my-element', MyElement);\n */\nconst disconnected = (target, method) =>\n  execute(method).on(target).after(\"disconnectedCallback\");\n\nexport default disconnected;\n","import execute from \"@directive/execute\";\n\n/**\n * Decorator que executa um método ao associar o Custom Element a um formulário.\n *\n * @param {Object} target - Protótipo do Custom Element decorado.\n * @param {string|Symbol} method - Nome do método a ser executado.\n * @returns {void}\n *\n * @description\n * O decorator `formAssociated` registra um método específico para ser executado\n * automaticamente quando o Custom Element for associado a um `<form>`, utilizando\n * a API `formAssociatedCallback` com Proxy para manter o fluxo original.\n *\n * @example\n * import { formAssociated } from '@nodusjs/std/directive';\n *\n * class MyElement extends HTMLElement {\n *   static formAssociated = true;\n *\n *   @formAssociated\n *   onFormAssociated() {\n *     console.log('Elemento associado ao formulário.');\n *   }\n * }\n *\n * customElements.define('my-element', MyElement);\n */\nconst formAssociated = (target, method) =>\n  execute(method).on(target).after(\"formAssociatedCallback\");\n\nexport default formAssociated;\n","import execute from \"@directive/execute\";\n\n/**\n * Decorator que executa um método ao desabilitar o Custom Element via formulário.\n *\n * @param {Object} target - Protótipo do Custom Element decorado.\n * @param {string|Symbol} method - Nome do método a ser executado.\n * @returns {void}\n *\n * @description\n * O decorator `formDisabled` registra um método específico para ser executado\n * automaticamente quando o Custom Element for desabilitado via formulário,\n * utilizando a API `formDisabledCallback` com Proxy para manter o fluxo original.\n *\n * @example\n * import { formDisabled } from '@nodusjs/std/directive';\n *\n * class MyElement extends HTMLElement {\n *   static formAssociated = true;\n *\n *   @formDisabled\n *   onFormDisabled() {\n *     console.log('Elemento desabilitado pelo formulário.');\n *   }\n * }\n *\n * customElements.define('my-element', MyElement);\n */\nconst formDisabled = (target, method) =>\n  execute(method).on(target).after(\"formDisabledCallback\");\n\nexport default formDisabled;\n","import execute from \"@directive/execute\";\n\n/**\n * Decorator que executa um método ao resetar o formulário associado ao Custom Element.\n *\n * @param {Object} target - Protótipo do Custom Element decorado.\n * @param {string|Symbol} method - Nome do método a ser executado.\n * @returns {void}\n *\n * @description\n * O decorator `formReset` registra um método específico para ser executado\n * automaticamente quando o formulário associado ao Custom Element for resetado,\n * utilizando a API `formResetCallback` com Proxy para manter o fluxo original.\n *\n * @example\n * import { formReset } from '@nodusjs/std/directive';\n *\n * class MyElement extends HTMLElement {\n *   static formAssociated = true;\n *\n *   @formReset\n *   onFormReset() {\n *     console.log('Formulário resetado.');\n *   }\n * }\n *\n * customElements.define('my-element', MyElement);\n */\nconst formReset = (target, method) =>\n  execute(method).on(target).after(\"formResetCallback\");\n\nexport default formReset;\n","import execute from \"@directive/execute\";\n\n/**\n * Decorator que executa um método ao restaurar o estado do formulário associado.\n *\n * @param {Object} target - Protótipo do Custom Element decorado.\n * @param {string|Symbol} method - Nome do método a ser executado.\n * @returns {void}\n *\n * @description\n * O decorator `formStateRestore` registra um método específico para ser executado\n * automaticamente quando o formulário associado ao Custom Element tiver seu estado restaurado,\n * utilizando a API `formStateRestoreCallback` com Proxy para manter o fluxo original.\n *\n * @example\n * import { formStateRestore } from '@nodusjs/std/directive';\n *\n * class MyElement extends HTMLElement {\n *   static formAssociated = true;\n *\n *   @formStateRestore\n *   onFormStateRestore() {\n *     console.log('Estado do formulário restaurado.');\n *   }\n * }\n *\n * customElements.define('my-element', MyElement);\n */\nconst formStateRestore = (target, method) =>\n  execute(method).on(target).after(\"formStateRestoreCallback\");\n\nexport default formStateRestore;\n"],"names":["execute","method","on","target","after","event","Proxy","original","context","args","apply","attribute","filters","property","with","from","whenAttributeChanges","constructor","observedAttributes","Set","attributeChangedCallback","name","oldValue","newValue","reduce","v","fn","options","customElements","get","define"],"mappings":";qEAsBA,CAAA;AAAA,MAAMA,IAAWC,CAAAA,QAAY,EAO3BC,IAAKC,QAAY,EAOfC,OAAQC,OAAAA;AACNF,IAAOE,CAAS,IAAA,IAAIC,MAAMH,EAAOE,CAAM,MAAA,MAAA;AAAA,EAAa,IAAG,EACrD,MAAME,IAAUC,IAASC;AACvBF,IAAAA,GAASG,MAAMF,IAASC,CAAAA,GACxBD,GAAQP,EAAAA,EAAAA,GAAWQ;EACpB,EACD,CAAA;AAAA,EAAA,GAAA;kBChBQ,CAACN,GAAQF,MACvBD,EAAQC,CAAQC,EAAAA,GAAGC,CAAQC,EAAAA,MAAM,+CCAjC,CAACO,OAAcC,MACf,CAACT,GAAQU,MAAAA;ACXK,GAACA,kBAAAA,QAAc,EAO7BC,MAAOF,CAAAA,QAAa,EAOlBG,MAAOZ,CAAAA,QAAY,EAOjBa,sBAAuBL,CAAAA;AACrBR,IAAAA,GAAOc,YAAYC,qBAAqB,CAAA,GACnC,oBAAIC,IAAI,IACLhB,GAAOc,YAAYC,sBAAsB,CAC7CP,GAAAA,EAAAA,CAAAA,CAAAA,GAIJR,GAAOiB,2BAA2B,IAAId,MACpCH,GAAOiB,6BAA6B,MAAA;AAAA,IAAQ,IAC5C,EACE,MAAMb,IAAUC,GAAUa,CAAAA,GAAMC,GAAUC,CACxChB,GAAAA;AAAAA,MAAAA,GAASG,MAAMF,GAAS,CAACa,GAAMC,GAAUC,CACrCF,CAAAA,GAAAA,MAASV,OACXH,EAAQK,EAAAA,IAAYD,GAAQY,OAAO,CAACC,IAAGC,OAAOA,GAAGD,EAAAA,GAAIF;IAExD,EAEJ,CAAA;AAAA,EAAA,EAAA,GAAA,GAAA,ID3BGV,CACLC,GAAAA,KAAKF,GACLG,KAAKZ,CAAAA,EACLa,qBAAqBL,EAAAA;AAAU,uBELpB,CAACR,GAAQF,MACzBD,EAAQC,CAAAA,EAAQC,GAAGC,CAAQC,EAAAA,MAAM,uCCNpB,CAACiB,IAAMM,MAAaxB,OACjCyB,eAAeC,IAAIR,EAAAA,KAASO,eAAeE,OAAOT,IAAMlB,GAAQwB,CAAAA,0BCG7C,CAACxB,GAAQF,MAC5BD,EAAQC,CAAQC,EAAAA,GAAGC,GAAQC,MAAM,sBAAA,4BCCZ,CAACD,GAAQF,MAC9BD,EAAQC,CAAAA,EAAQC,GAAGC,CAAQC,EAAAA,MAAM,kDCDd,CAACD,GAAQF,MAC5BD,EAAQC,GAAQC,GAAGC,CAAAA,EAAQC,MAAM,6CCDjB,CAACD,GAAQF,MACzBD,EAAQC,CAAQC,EAAAA,GAAGC,GAAQC,MAAM,mBAAA,8BCDV,CAACD,GAAQF,MAChCD,EAAQC,CAAAA,EAAQC,GAAGC,CAAAA,EAAQC,MAAM,0BAAA;"}