From a6d3e0d0ad480e9e03dfb7c27b1c94adf8a157bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?La=C3=A9rcio=20Oliveira?= Date: Thu, 21 May 2026 19:07:33 -0300 Subject: [PATCH 1/8] Adiciona click-form no v3 fix: corrige o caminho da API para o click_form --- README.md | 29 +++ build/v3/click-form.js | 2 + build/v3/click-form.js.map | 7 + package.json | 3 +- packages/v3/click-form.js | 5 + packages/v3/src/click-form/embedded.js | 11 + packages/v3/src/click-form/embedded.spec.js | 94 +++++++++ pnpm-lock.yaml | 218 ++++++++++---------- 8 files changed, 259 insertions(+), 110 deletions(-) create mode 100644 build/v3/click-form.js create mode 100644 build/v3/click-form.js.map create mode 100644 packages/v3/click-form.js create mode 100644 packages/v3/src/click-form/embedded.js create mode 100644 packages/v3/src/click-form/embedded.spec.js diff --git a/README.md b/README.md index 303087c..e71c018 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,35 @@ Para desmontar o `iframe` da DOM: transaction.unmount(); ``` +### Click Forms (`v3-beta`) + +Para criar o componente de click-form: + +```javascript +import ClickForm from '@clicksign/embedded/v3/click-form'; + +const form = new ClickForm('d973213c-6411-11e8-8df5-7cd1c3e91b23'); + +form.on('loaded', ev => { console.log(ev); }) +form.on('submitted', ev => { console.log(ev); }) +form.on('completed', ev => { console.log(ev); }) +form.on('error', ev => { console.log(ev); }) + +form.mount('container-id'); +``` + +Para apontar para um endpoint local: + +```javascript +form.endpoint = 'http://localhost:3200'; +``` + +Para desmontar o `iframe` da DOM: + +```javascript +form.unmount(); +``` + ## Como contribuir Instale as dependencias com `pnpm install`. diff --git a/build/v3/click-form.js b/build/v3/click-form.js new file mode 100644 index 0000000..0029f00 --- /dev/null +++ b/build/v3/click-form.js @@ -0,0 +1,2 @@ +(()=>{var c=Object.defineProperty;var u=i=>{throw TypeError(i)};var n=(i,t)=>c(i,"name",{value:t,configurable:!0});var f=(i,t,e)=>t.has(i)||u("Cannot "+e);var h=(i,t,e)=>(f(i,t,"read from private field"),e?e.call(i):t.get(i)),l=(i,t,e)=>t.has(i)?u("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(i):t.set(i,e);var a,o,m=class m{constructor(t){l(this,a,"camera;geolocation;fullscreen;gyroscope;accelerometer;magnetometer");l(this,o,"width: 100%; height: 100%;");this.key=t,this.listen={},this.endpoint="https://app.clicksign.com",this.origin=`${window.location.protocol}//${window.location.host}`,this.target=null,this.iframe=null,this.boundEventHandler=e=>this.eventHandler(e)}eventsFor(t){let e=t.name||t.data?.name||t.data||t;return this.listen[e]||[]}eventHandler(t){this.eventsFor(t).forEach(e=>e(t.data))}mount(t){return this.target=document.getElementById(t),this.iframe=document.createElement("iframe"),this.iframe.setAttribute("src",this.source),this.iframe.setAttribute("style",h(this,o)),this.iframe.setAttribute("allow",h(this,a)),window.addEventListener("message",this.boundEventHandler),this.target.appendChild(this.iframe)}on(t,e){return this.listen[t]||(this.listen[t]=[]),this.listen[t].push(e)}unmount(){return this.iframe&&(this.target.removeChild(this.iframe),this.target=null,this.iframe=null,window.removeEventListener("message",this.boundEventHandler)),!0}get source(){return`${this.endpoint}${this.path}${this.params}`}};a=new WeakMap,o=new WeakMap,n(m,"BaseEmbed");var s=m;var d=class d extends s{get params(){return`?embedded=true&origin=${this.origin}`}get path(){return`/app/click-form/forms/${this.key}`}};n(d,"ClickForm");var r=d;globalThis.ClickForm=r;var y=r;})(); +//# sourceMappingURL=click-form.js.map diff --git a/build/v3/click-form.js.map b/build/v3/click-form.js.map new file mode 100644 index 0000000..388a890 --- /dev/null +++ b/build/v3/click-form.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../packages/v3/src/core/base-embed.js", "../../packages/v3/src/click-form/embedded.js", "../../packages/v3/click-form.js"], + "sourcesContent": ["export default class BaseEmbed {\n #allowed = 'camera;geolocation;fullscreen;gyroscope;accelerometer;magnetometer';\n\n #defaultStyles = 'width: 100%; height: 100%;';\n\n constructor(key) {\n this.key = key;\n this.listen = {};\n this.endpoint = 'https://app.clicksign.com';\n this.origin = `${window.location.protocol}//${window.location.host}`;\n this.target = null;\n this.iframe = null;\n this.boundEventHandler = (event) => this.eventHandler(event);\n }\n\n eventsFor(event) {\n const eventName = event.name || event.data?.name || event.data || event;\n return this.listen[eventName] || [];\n }\n\n eventHandler(event) {\n this.eventsFor(event).forEach((fn) => fn(event.data));\n }\n\n mount(id) {\n this.target = document.getElementById(id);\n\n this.iframe = document.createElement('iframe');\n this.iframe.setAttribute('src', this.source);\n this.iframe.setAttribute('style', this.#defaultStyles);\n this.iframe.setAttribute('allow', this.#allowed);\n\n window.addEventListener('message', this.boundEventHandler);\n\n return this.target.appendChild(this.iframe);\n }\n\n on(event, fn) {\n if (!this.listen[event]) { this.listen[event] = []; }\n\n return this.listen[event].push(fn);\n }\n\n unmount() {\n if (this.iframe) {\n this.target.removeChild(this.iframe);\n\n this.target = null;\n this.iframe = null;\n\n window.removeEventListener('message', this.boundEventHandler);\n }\n\n return true;\n }\n\n get source() {\n return `${this.endpoint}${this.path}${this.params}`;\n }\n}\n", "import BaseEmbed from '../core/base-embed';\n\nexport default class ClickForm extends BaseEmbed {\n get params() {\n return `?embedded=true&origin=${this.origin}`;\n }\n\n get path() {\n return `/app/click-form/forms/${this.key}`;\n }\n}\n", "import ClickForm from './src/click-form/embedded';\n\nglobalThis.ClickForm = ClickForm;\n\nexport default ClickForm;\n"], + "mappings": "sVAAA,IAAAA,EAAAC,EAAqBC,EAArB,MAAqBA,CAAU,CAK7B,YAAYC,EAAK,CAJjBC,EAAA,KAAAJ,EAAW,sEAEXI,EAAA,KAAAH,EAAiB,8BAGf,KAAK,IAAME,EACX,KAAK,OAAS,CAAC,EACf,KAAK,SAAW,4BAChB,KAAK,OAAS,GAAG,OAAO,SAAS,QAAQ,KAAK,OAAO,SAAS,IAAI,GAClE,KAAK,OAAS,KACd,KAAK,OAAS,KACd,KAAK,kBAAqBE,GAAU,KAAK,aAAaA,CAAK,CAC7D,CAEA,UAAUA,EAAO,CACf,IAAMC,EAAYD,EAAM,MAAQA,EAAM,MAAM,MAAQA,EAAM,MAAQA,EAClE,OAAO,KAAK,OAAOC,CAAS,GAAK,CAAC,CACpC,CAEA,aAAaD,EAAO,CAClB,KAAK,UAAUA,CAAK,EAAE,QAASE,GAAOA,EAAGF,EAAM,IAAI,CAAC,CACtD,CAEA,MAAMG,EAAI,CACR,YAAK,OAAS,SAAS,eAAeA,CAAE,EAExC,KAAK,OAAS,SAAS,cAAc,QAAQ,EAC7C,KAAK,OAAO,aAAa,MAAO,KAAK,MAAM,EAC3C,KAAK,OAAO,aAAa,QAASC,EAAA,KAAKR,EAAc,EACrD,KAAK,OAAO,aAAa,QAASQ,EAAA,KAAKT,EAAQ,EAE/C,OAAO,iBAAiB,UAAW,KAAK,iBAAiB,EAElD,KAAK,OAAO,YAAY,KAAK,MAAM,CAC5C,CAEA,GAAGK,EAAOE,EAAI,CACZ,OAAK,KAAK,OAAOF,CAAK,IAAK,KAAK,OAAOA,CAAK,EAAI,CAAC,GAE1C,KAAK,OAAOA,CAAK,EAAE,KAAKE,CAAE,CACnC,CAEA,SAAU,CACR,OAAI,KAAK,SACP,KAAK,OAAO,YAAY,KAAK,MAAM,EAEnC,KAAK,OAAS,KACd,KAAK,OAAS,KAEd,OAAO,oBAAoB,UAAW,KAAK,iBAAiB,GAGvD,EACT,CAEA,IAAI,QAAS,CACX,MAAO,GAAG,KAAK,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,EACnD,CACF,EA1DEP,EAAA,YAEAC,EAAA,YAH6BS,EAAAR,EAAA,aAA/B,IAAqBS,EAArBT,ECEA,IAAqBU,EAArB,MAAqBA,UAAkBC,CAAU,CAC/C,IAAI,QAAS,CACX,MAAO,yBAAyB,KAAK,MAAM,EAC7C,CAEA,IAAI,MAAO,CACT,MAAO,yBAAyB,KAAK,GAAG,EAC1C,CACF,EARiDC,EAAAF,EAAA,aAAjD,IAAqBG,EAArBH,ECAA,WAAW,UAAYI,EAEvB,IAAOC,EAAQD", + "names": ["_allowed", "_defaultStyles", "_BaseEmbed", "key", "__privateAdd", "event", "eventName", "fn", "id", "__privateGet", "__name", "BaseEmbed", "_ClickForm", "BaseEmbed", "__name", "ClickForm", "ClickForm", "click_form_default"] +} diff --git a/package.json b/package.json index 612e618..fd3d0c9 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "build:v2": "esbuild packages/v2/index.js --bundle --sourcemap --minify --keep-names --target=safari15 --outfile=build/v2/embedded.js", "build:v3:sign": "esbuild packages/v3/index.js --bundle --sourcemap --minify --keep-names --target=safari15 --outfile=build/v3/embedded.js", "build:v3:verify": "esbuild packages/v3/verify.js --bundle --sourcemap --minify --keep-names --target=safari15 --outfile=build/v3/verify.js", - "build:v3": "pnpm run build:v3:sign && pnpm run build:v3:verify" + "build:v3:click-form": "esbuild packages/v3/click-form.js --bundle --sourcemap --minify --keep-names --target=safari15 --outfile=build/v3/click-form.js", + "build:v3": "pnpm run build:v3:sign && pnpm run build:v3:verify && pnpm run build:v3:click-form" }, "repository": { "type": "git", diff --git a/packages/v3/click-form.js b/packages/v3/click-form.js new file mode 100644 index 0000000..6a210da --- /dev/null +++ b/packages/v3/click-form.js @@ -0,0 +1,5 @@ +import ClickForm from './src/click-form/embedded'; + +globalThis.ClickForm = ClickForm; + +export default ClickForm; diff --git a/packages/v3/src/click-form/embedded.js b/packages/v3/src/click-form/embedded.js new file mode 100644 index 0000000..b9d8859 --- /dev/null +++ b/packages/v3/src/click-form/embedded.js @@ -0,0 +1,11 @@ +import BaseEmbed from '../core/base-embed'; + +export default class ClickForm extends BaseEmbed { + get params() { + return `?embedded=true&origin=${this.origin}`; + } + + get path() { + return `/app/click_form/${this.key}`; + } +} diff --git a/packages/v3/src/click-form/embedded.spec.js b/packages/v3/src/click-form/embedded.spec.js new file mode 100644 index 0000000..608b645 --- /dev/null +++ b/packages/v3/src/click-form/embedded.spec.js @@ -0,0 +1,94 @@ +import ClickForm from './embedded'; + +const containerElementId = 'clicksign-embedded-click-form'; +const formKey = 'foobar123'; +const endpoint = 'https://app.clicksign.com'; +const originUrl = `${window.location.protocol}://${window.location.host}`; +const sourceUrl = `${endpoint}/app/click-form/forms/${formKey}?embedded=true&origin=${originUrl}`; + +function createContainerElement() { + const element = document.createElement('div'); + + element.setAttribute('id', containerElementId); + document.body.appendChild(element); +} + +describe('ClickForm', () => { + const instance = new ClickForm(formKey); + + beforeEach(() => { + vi.restoreAllMocks(); + + createContainerElement(); + instance.unmount(); + }); + + afterEach(() => { + instance.unmount(); + }); + + it('should initialize properly', () => { + expect(instance.key).toBe(formKey); + expect(instance.origin).toBe(originUrl); + expect(instance.endpoint).toBe(endpoint); + expect(instance.source).toBe(sourceUrl); + }); + + describe('Mount', () => { + it('should throw when target container does not exist', () => { + expect(() => instance.mount('unknown-container')).toThrow(); + + instance.iframe = null; + instance.target = null; + }); + + it('should mount widget on the specified element', () => { + instance.mount(containerElementId); + + const iframeElement = document.getElementById(containerElementId).children[0]; + + expect(iframeElement).toBe(instance.iframe); + expect(iframeElement.tagName).toBe('IFRAME'); + expect(iframeElement).toHaveProperty('src', sourceUrl); + }); + }); + + describe('Events', () => { + const events = ['loaded', 'submitted', 'completed', 'error']; + + it.each(events)('should register event "%s" listening successfully', (event) => { + const eventMock = vi.fn(); + instance.on(event, eventMock); + + expect(instance.listen).toHaveProperty(event); + }); + + it.each(events)('should emit "%s" event with payload', (eventName) => { + const eventMock = vi.fn(); + const payload = { name: eventName, metadata: 'sample' }; + + instance.on(eventName, eventMock); + instance.eventHandler({ data: payload }); + + expect(eventMock).toHaveBeenCalledWith(payload); + }); + }); + + describe('Unmount', () => { + it('should unmount widget on the specified element', () => { + instance.mount(containerElementId); + + const containerElement = document.getElementById(containerElementId); + + expect(containerElement.children.length).toEqual(1); + expect(instance.iframe).not.toBeNull(); + expect(instance.target).not.toBeNull(); + + instance.unmount(); + + expect(containerElement.children.length).toEqual(0); + expect(instance.iframe).toBeNull(); + expect(instance.target).toBeNull(); + }); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b73b47a..9ae7d90 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,277 +9,277 @@ importers: .: devDependencies: esbuild: - specifier: ^0.25.5 - version: 0.25.12 + specifier: ^0.27.3 + version: 0.27.7 packages: - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} hasBin: true snapshots: - '@esbuild/aix-ppc64@0.25.12': + '@esbuild/aix-ppc64@0.27.7': optional: true - '@esbuild/android-arm64@0.25.12': + '@esbuild/android-arm64@0.27.7': optional: true - '@esbuild/android-arm@0.25.12': + '@esbuild/android-arm@0.27.7': optional: true - '@esbuild/android-x64@0.25.12': + '@esbuild/android-x64@0.27.7': optional: true - '@esbuild/darwin-arm64@0.25.12': + '@esbuild/darwin-arm64@0.27.7': optional: true - '@esbuild/darwin-x64@0.25.12': + '@esbuild/darwin-x64@0.27.7': optional: true - '@esbuild/freebsd-arm64@0.25.12': + '@esbuild/freebsd-arm64@0.27.7': optional: true - '@esbuild/freebsd-x64@0.25.12': + '@esbuild/freebsd-x64@0.27.7': optional: true - '@esbuild/linux-arm64@0.25.12': + '@esbuild/linux-arm64@0.27.7': optional: true - '@esbuild/linux-arm@0.25.12': + '@esbuild/linux-arm@0.27.7': optional: true - '@esbuild/linux-ia32@0.25.12': + '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/linux-loong64@0.25.12': + '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/linux-mips64el@0.25.12': + '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/linux-ppc64@0.25.12': + '@esbuild/linux-ppc64@0.27.7': optional: true - '@esbuild/linux-riscv64@0.25.12': + '@esbuild/linux-riscv64@0.27.7': optional: true - '@esbuild/linux-s390x@0.25.12': + '@esbuild/linux-s390x@0.27.7': optional: true - '@esbuild/linux-x64@0.25.12': + '@esbuild/linux-x64@0.27.7': optional: true - '@esbuild/netbsd-arm64@0.25.12': + '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.25.12': + '@esbuild/netbsd-x64@0.27.7': optional: true - '@esbuild/openbsd-arm64@0.25.12': + '@esbuild/openbsd-arm64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.25.12': + '@esbuild/openbsd-x64@0.27.7': optional: true - '@esbuild/openharmony-arm64@0.25.12': + '@esbuild/openharmony-arm64@0.27.7': optional: true - '@esbuild/sunos-x64@0.25.12': + '@esbuild/sunos-x64@0.27.7': optional: true - '@esbuild/win32-arm64@0.25.12': + '@esbuild/win32-arm64@0.27.7': optional: true - '@esbuild/win32-ia32@0.25.12': + '@esbuild/win32-ia32@0.27.7': optional: true - '@esbuild/win32-x64@0.25.12': + '@esbuild/win32-x64@0.27.7': optional: true - esbuild@0.25.12: + esbuild@0.27.7: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 From 413f0986ea3eddd5c79df1ed2ea35c5fd0883e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?La=C3=A9rcio=20Oliveira?= Date: Fri, 22 May 2026 14:06:45 -0300 Subject: [PATCH 2/8] Remove build artifacts from PR --- build/v3/click-form.js | 2 -- build/v3/click-form.js.map | 7 ------- 2 files changed, 9 deletions(-) delete mode 100644 build/v3/click-form.js delete mode 100644 build/v3/click-form.js.map diff --git a/build/v3/click-form.js b/build/v3/click-form.js deleted file mode 100644 index 0029f00..0000000 --- a/build/v3/click-form.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{var c=Object.defineProperty;var u=i=>{throw TypeError(i)};var n=(i,t)=>c(i,"name",{value:t,configurable:!0});var f=(i,t,e)=>t.has(i)||u("Cannot "+e);var h=(i,t,e)=>(f(i,t,"read from private field"),e?e.call(i):t.get(i)),l=(i,t,e)=>t.has(i)?u("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(i):t.set(i,e);var a,o,m=class m{constructor(t){l(this,a,"camera;geolocation;fullscreen;gyroscope;accelerometer;magnetometer");l(this,o,"width: 100%; height: 100%;");this.key=t,this.listen={},this.endpoint="https://app.clicksign.com",this.origin=`${window.location.protocol}//${window.location.host}`,this.target=null,this.iframe=null,this.boundEventHandler=e=>this.eventHandler(e)}eventsFor(t){let e=t.name||t.data?.name||t.data||t;return this.listen[e]||[]}eventHandler(t){this.eventsFor(t).forEach(e=>e(t.data))}mount(t){return this.target=document.getElementById(t),this.iframe=document.createElement("iframe"),this.iframe.setAttribute("src",this.source),this.iframe.setAttribute("style",h(this,o)),this.iframe.setAttribute("allow",h(this,a)),window.addEventListener("message",this.boundEventHandler),this.target.appendChild(this.iframe)}on(t,e){return this.listen[t]||(this.listen[t]=[]),this.listen[t].push(e)}unmount(){return this.iframe&&(this.target.removeChild(this.iframe),this.target=null,this.iframe=null,window.removeEventListener("message",this.boundEventHandler)),!0}get source(){return`${this.endpoint}${this.path}${this.params}`}};a=new WeakMap,o=new WeakMap,n(m,"BaseEmbed");var s=m;var d=class d extends s{get params(){return`?embedded=true&origin=${this.origin}`}get path(){return`/app/click-form/forms/${this.key}`}};n(d,"ClickForm");var r=d;globalThis.ClickForm=r;var y=r;})(); -//# sourceMappingURL=click-form.js.map diff --git a/build/v3/click-form.js.map b/build/v3/click-form.js.map deleted file mode 100644 index 388a890..0000000 --- a/build/v3/click-form.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../packages/v3/src/core/base-embed.js", "../../packages/v3/src/click-form/embedded.js", "../../packages/v3/click-form.js"], - "sourcesContent": ["export default class BaseEmbed {\n #allowed = 'camera;geolocation;fullscreen;gyroscope;accelerometer;magnetometer';\n\n #defaultStyles = 'width: 100%; height: 100%;';\n\n constructor(key) {\n this.key = key;\n this.listen = {};\n this.endpoint = 'https://app.clicksign.com';\n this.origin = `${window.location.protocol}//${window.location.host}`;\n this.target = null;\n this.iframe = null;\n this.boundEventHandler = (event) => this.eventHandler(event);\n }\n\n eventsFor(event) {\n const eventName = event.name || event.data?.name || event.data || event;\n return this.listen[eventName] || [];\n }\n\n eventHandler(event) {\n this.eventsFor(event).forEach((fn) => fn(event.data));\n }\n\n mount(id) {\n this.target = document.getElementById(id);\n\n this.iframe = document.createElement('iframe');\n this.iframe.setAttribute('src', this.source);\n this.iframe.setAttribute('style', this.#defaultStyles);\n this.iframe.setAttribute('allow', this.#allowed);\n\n window.addEventListener('message', this.boundEventHandler);\n\n return this.target.appendChild(this.iframe);\n }\n\n on(event, fn) {\n if (!this.listen[event]) { this.listen[event] = []; }\n\n return this.listen[event].push(fn);\n }\n\n unmount() {\n if (this.iframe) {\n this.target.removeChild(this.iframe);\n\n this.target = null;\n this.iframe = null;\n\n window.removeEventListener('message', this.boundEventHandler);\n }\n\n return true;\n }\n\n get source() {\n return `${this.endpoint}${this.path}${this.params}`;\n }\n}\n", "import BaseEmbed from '../core/base-embed';\n\nexport default class ClickForm extends BaseEmbed {\n get params() {\n return `?embedded=true&origin=${this.origin}`;\n }\n\n get path() {\n return `/app/click-form/forms/${this.key}`;\n }\n}\n", "import ClickForm from './src/click-form/embedded';\n\nglobalThis.ClickForm = ClickForm;\n\nexport default ClickForm;\n"], - "mappings": "sVAAA,IAAAA,EAAAC,EAAqBC,EAArB,MAAqBA,CAAU,CAK7B,YAAYC,EAAK,CAJjBC,EAAA,KAAAJ,EAAW,sEAEXI,EAAA,KAAAH,EAAiB,8BAGf,KAAK,IAAME,EACX,KAAK,OAAS,CAAC,EACf,KAAK,SAAW,4BAChB,KAAK,OAAS,GAAG,OAAO,SAAS,QAAQ,KAAK,OAAO,SAAS,IAAI,GAClE,KAAK,OAAS,KACd,KAAK,OAAS,KACd,KAAK,kBAAqBE,GAAU,KAAK,aAAaA,CAAK,CAC7D,CAEA,UAAUA,EAAO,CACf,IAAMC,EAAYD,EAAM,MAAQA,EAAM,MAAM,MAAQA,EAAM,MAAQA,EAClE,OAAO,KAAK,OAAOC,CAAS,GAAK,CAAC,CACpC,CAEA,aAAaD,EAAO,CAClB,KAAK,UAAUA,CAAK,EAAE,QAASE,GAAOA,EAAGF,EAAM,IAAI,CAAC,CACtD,CAEA,MAAMG,EAAI,CACR,YAAK,OAAS,SAAS,eAAeA,CAAE,EAExC,KAAK,OAAS,SAAS,cAAc,QAAQ,EAC7C,KAAK,OAAO,aAAa,MAAO,KAAK,MAAM,EAC3C,KAAK,OAAO,aAAa,QAASC,EAAA,KAAKR,EAAc,EACrD,KAAK,OAAO,aAAa,QAASQ,EAAA,KAAKT,EAAQ,EAE/C,OAAO,iBAAiB,UAAW,KAAK,iBAAiB,EAElD,KAAK,OAAO,YAAY,KAAK,MAAM,CAC5C,CAEA,GAAGK,EAAOE,EAAI,CACZ,OAAK,KAAK,OAAOF,CAAK,IAAK,KAAK,OAAOA,CAAK,EAAI,CAAC,GAE1C,KAAK,OAAOA,CAAK,EAAE,KAAKE,CAAE,CACnC,CAEA,SAAU,CACR,OAAI,KAAK,SACP,KAAK,OAAO,YAAY,KAAK,MAAM,EAEnC,KAAK,OAAS,KACd,KAAK,OAAS,KAEd,OAAO,oBAAoB,UAAW,KAAK,iBAAiB,GAGvD,EACT,CAEA,IAAI,QAAS,CACX,MAAO,GAAG,KAAK,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,EACnD,CACF,EA1DEP,EAAA,YAEAC,EAAA,YAH6BS,EAAAR,EAAA,aAA/B,IAAqBS,EAArBT,ECEA,IAAqBU,EAArB,MAAqBA,UAAkBC,CAAU,CAC/C,IAAI,QAAS,CACX,MAAO,yBAAyB,KAAK,MAAM,EAC7C,CAEA,IAAI,MAAO,CACT,MAAO,yBAAyB,KAAK,GAAG,EAC1C,CACF,EARiDC,EAAAF,EAAA,aAAjD,IAAqBG,EAArBH,ECAA,WAAW,UAAYI,EAEvB,IAAOC,EAAQD", - "names": ["_allowed", "_defaultStyles", "_BaseEmbed", "key", "__privateAdd", "event", "eventName", "fn", "id", "__privateGet", "__name", "BaseEmbed", "_ClickForm", "BaseEmbed", "__name", "ClickForm", "ClickForm", "click_form_default"] -} From acb1cd691dd0d20f8e6f51fb085b66ccb1a22fc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?La=C3=A9rcio=20Oliveira?= Date: Fri, 22 May 2026 14:16:11 -0300 Subject: [PATCH 3/8] =?UTF-8?q?teste:=20Corrige=20teste=20unit=C3=A1rio=20?= =?UTF-8?q?embedded.spec.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/v3/src/click-form/embedded.spec.js | 25 ++++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/v3/src/click-form/embedded.spec.js b/packages/v3/src/click-form/embedded.spec.js index 608b645..a010a28 100644 --- a/packages/v3/src/click-form/embedded.spec.js +++ b/packages/v3/src/click-form/embedded.spec.js @@ -3,10 +3,10 @@ import ClickForm from './embedded'; const containerElementId = 'clicksign-embedded-click-form'; const formKey = 'foobar123'; const endpoint = 'https://app.clicksign.com'; -const originUrl = `${window.location.protocol}://${window.location.host}`; -const sourceUrl = `${endpoint}/app/click-form/forms/${formKey}?embedded=true&origin=${originUrl}`; function createContainerElement() { + document.body.innerHTML = ''; + const element = document.createElement('div'); element.setAttribute('id', containerElementId); @@ -14,13 +14,13 @@ function createContainerElement() { } describe('ClickForm', () => { - const instance = new ClickForm(formKey); + let instance; beforeEach(() => { vi.restoreAllMocks(); createContainerElement(); - instance.unmount(); + instance = new ClickForm(formKey); }); afterEach(() => { @@ -28,10 +28,17 @@ describe('ClickForm', () => { }); it('should initialize properly', () => { + const originUrl = `${window.location.protocol}://${window.location.host}`; + expect(instance.key).toBe(formKey); expect(instance.origin).toBe(originUrl); expect(instance.endpoint).toBe(endpoint); - expect(instance.source).toBe(sourceUrl); + + const source = new URL(instance.source); + expect(source.origin).toBe(endpoint); + expect(source.pathname).toBe(`/app/click-form/forms/${formKey}`); + expect(source.searchParams.get('embedded')).toBe('true'); + expect(source.searchParams.get('origin')).toBe(originUrl); }); describe('Mount', () => { @@ -43,13 +50,19 @@ describe('ClickForm', () => { }); it('should mount widget on the specified element', () => { + const originUrl = `${window.location.protocol}://${window.location.host}`; + instance.mount(containerElementId); const iframeElement = document.getElementById(containerElementId).children[0]; + const iframeSrc = new URL(iframeElement.src); expect(iframeElement).toBe(instance.iframe); expect(iframeElement.tagName).toBe('IFRAME'); - expect(iframeElement).toHaveProperty('src', sourceUrl); + expect(iframeSrc.origin).toBe(endpoint); + expect(iframeSrc.pathname).toBe(`/app/click-form/forms/${formKey}`); + expect(iframeSrc.searchParams.get('embedded')).toBe('true'); + expect(iframeSrc.searchParams.get('origin')).toBe(originUrl); }); }); From 37b0465fdebe33fb0eaf06f5f48422a81c1f904f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?La=C3=A9rcio=20Oliveira?= Date: Fri, 22 May 2026 14:24:29 -0300 Subject: [PATCH 4/8] =?UTF-8?q?test:=20Ajusta=20teste=20unit=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/v3/src/click-form/embedded.spec.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/v3/src/click-form/embedded.spec.js b/packages/v3/src/click-form/embedded.spec.js index a010a28..331ed31 100644 --- a/packages/v3/src/click-form/embedded.spec.js +++ b/packages/v3/src/click-form/embedded.spec.js @@ -28,17 +28,17 @@ describe('ClickForm', () => { }); it('should initialize properly', () => { - const originUrl = `${window.location.protocol}://${window.location.host}`; + const originUrl = window.location.origin; expect(instance.key).toBe(formKey); - expect(instance.origin).toBe(originUrl); + expect(new URL(instance.origin).origin).toBe(originUrl); expect(instance.endpoint).toBe(endpoint); const source = new URL(instance.source); expect(source.origin).toBe(endpoint); - expect(source.pathname).toBe(`/app/click-form/forms/${formKey}`); + expect(source.pathname).toBe(`/app/click_form/${formKey}`); expect(source.searchParams.get('embedded')).toBe('true'); - expect(source.searchParams.get('origin')).toBe(originUrl); + expect(new URL(source.searchParams.get('origin')).origin).toBe(originUrl); }); describe('Mount', () => { @@ -50,7 +50,7 @@ describe('ClickForm', () => { }); it('should mount widget on the specified element', () => { - const originUrl = `${window.location.protocol}://${window.location.host}`; + const originUrl = window.location.origin; instance.mount(containerElementId); @@ -60,9 +60,9 @@ describe('ClickForm', () => { expect(iframeElement).toBe(instance.iframe); expect(iframeElement.tagName).toBe('IFRAME'); expect(iframeSrc.origin).toBe(endpoint); - expect(iframeSrc.pathname).toBe(`/app/click-form/forms/${formKey}`); + expect(iframeSrc.pathname).toBe(`/app/click_form/${formKey}`); expect(iframeSrc.searchParams.get('embedded')).toBe('true'); - expect(iframeSrc.searchParams.get('origin')).toBe(originUrl); + expect(new URL(iframeSrc.searchParams.get('origin')).origin).toBe(originUrl); }); }); From 73b35630fab20f5b39b3fe893cbf53d38eef9f41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?La=C3=A9rcio=20Oliveira?= Date: Fri, 22 May 2026 14:39:38 -0300 Subject: [PATCH 5/8] =?UTF-8?q?docs:=20Atualiza=20documenta=C3=A7=C3=A3o?= =?UTF-8?q?=20do=20click-form=20no=20READ.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index e71c018..ab8adb3 100644 --- a/README.md +++ b/README.md @@ -152,12 +152,9 @@ Para criar o componente de click-form: ```javascript import ClickForm from '@clicksign/embedded/v3/click-form'; -const form = new ClickForm('d973213c-6411-11e8-8df5-7cd1c3e91b23'); +const form = new ClickForm('CHAVE_DO_FORMULARIO'); -form.on('loaded', ev => { console.log(ev); }) -form.on('submitted', ev => { console.log(ev); }) form.on('completed', ev => { console.log(ev); }) -form.on('error', ev => { console.log(ev); }) form.mount('container-id'); ``` From 9512e373c39b0f366bdda271dc31165bd1f02aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?La=C3=A9rcio=20Oliveira?= Date: Fri, 22 May 2026 16:20:28 -0300 Subject: [PATCH 6/8] refactor: renomeia ClickForm para Form --- README.md | 4 ++-- packages/v3/click-form.js | 5 ----- packages/v3/form.js | 5 +++++ packages/v3/src/{click-form => form}/embedded.js | 2 +- packages/v3/src/{click-form => form}/embedded.spec.js | 8 ++++---- 5 files changed, 12 insertions(+), 12 deletions(-) delete mode 100644 packages/v3/click-form.js create mode 100644 packages/v3/form.js rename packages/v3/src/{click-form => form}/embedded.js (78%) rename packages/v3/src/{click-form => form}/embedded.spec.js (94%) diff --git a/README.md b/README.md index ab8adb3..6dd0040 100644 --- a/README.md +++ b/README.md @@ -150,9 +150,9 @@ transaction.unmount(); Para criar o componente de click-form: ```javascript -import ClickForm from '@clicksign/embedded/v3/click-form'; +import Form from '@clicksign/embedded/v3/click-form'; -const form = new ClickForm('CHAVE_DO_FORMULARIO'); +const form = new Form('CHAVE_DO_FORMULARIO'); form.on('completed', ev => { console.log(ev); }) diff --git a/packages/v3/click-form.js b/packages/v3/click-form.js deleted file mode 100644 index 6a210da..0000000 --- a/packages/v3/click-form.js +++ /dev/null @@ -1,5 +0,0 @@ -import ClickForm from './src/click-form/embedded'; - -globalThis.ClickForm = ClickForm; - -export default ClickForm; diff --git a/packages/v3/form.js b/packages/v3/form.js new file mode 100644 index 0000000..a92a149 --- /dev/null +++ b/packages/v3/form.js @@ -0,0 +1,5 @@ +import Form from './src/form/embedded'; + +globalThis.Form = Form; + +export default Form; diff --git a/packages/v3/src/click-form/embedded.js b/packages/v3/src/form/embedded.js similarity index 78% rename from packages/v3/src/click-form/embedded.js rename to packages/v3/src/form/embedded.js index b9d8859..06aee76 100644 --- a/packages/v3/src/click-form/embedded.js +++ b/packages/v3/src/form/embedded.js @@ -1,6 +1,6 @@ import BaseEmbed from '../core/base-embed'; -export default class ClickForm extends BaseEmbed { +export default class Form extends BaseEmbed { get params() { return `?embedded=true&origin=${this.origin}`; } diff --git a/packages/v3/src/click-form/embedded.spec.js b/packages/v3/src/form/embedded.spec.js similarity index 94% rename from packages/v3/src/click-form/embedded.spec.js rename to packages/v3/src/form/embedded.spec.js index 331ed31..24e069f 100644 --- a/packages/v3/src/click-form/embedded.spec.js +++ b/packages/v3/src/form/embedded.spec.js @@ -1,6 +1,6 @@ -import ClickForm from './embedded'; +import Form from './embedded'; -const containerElementId = 'clicksign-embedded-click-form'; +const containerElementId = 'clicksign-embedded-form'; const formKey = 'foobar123'; const endpoint = 'https://app.clicksign.com'; @@ -13,14 +13,14 @@ function createContainerElement() { document.body.appendChild(element); } -describe('ClickForm', () => { +describe('Form', () => { let instance; beforeEach(() => { vi.restoreAllMocks(); createContainerElement(); - instance = new ClickForm(formKey); + instance = new Form(formKey); }); afterEach(() => { From 5ae53b671e45b6303c21b19da1912dd375ea58da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?La=C3=A9rcio=20Oliveira?= Date: Fri, 22 May 2026 16:37:11 -0300 Subject: [PATCH 7/8] =?UTF-8?q?Atualiza=20a=20documenta=C3=A7=C3=A3o=20do?= =?UTF-8?q?=20form=20embedded?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6dd0040..ff08770 100644 --- a/README.md +++ b/README.md @@ -147,10 +147,10 @@ transaction.unmount(); ### Click Forms (`v3-beta`) -Para criar o componente de click-form: +Para criar o componente de form: ```javascript -import Form from '@clicksign/embedded/v3/click-form'; +import Form from '@clicksign/embedded/v3/form'; const form = new Form('CHAVE_DO_FORMULARIO'); From 795828e119ce7d63842d5b61ebfac97dc79f972e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?La=C3=A9rcio=20Oliveira?= Date: Fri, 22 May 2026 16:37:39 -0300 Subject: [PATCH 8/8] =?UTF-8?q?chore:=20Atualiza=20script=20de=20gera?= =?UTF-8?q?=C3=A7=C3=A3o=20do=20form=20embedded?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fd3d0c9..2f1c9f4 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "build:v2": "esbuild packages/v2/index.js --bundle --sourcemap --minify --keep-names --target=safari15 --outfile=build/v2/embedded.js", "build:v3:sign": "esbuild packages/v3/index.js --bundle --sourcemap --minify --keep-names --target=safari15 --outfile=build/v3/embedded.js", "build:v3:verify": "esbuild packages/v3/verify.js --bundle --sourcemap --minify --keep-names --target=safari15 --outfile=build/v3/verify.js", - "build:v3:click-form": "esbuild packages/v3/click-form.js --bundle --sourcemap --minify --keep-names --target=safari15 --outfile=build/v3/click-form.js", - "build:v3": "pnpm run build:v3:sign && pnpm run build:v3:verify && pnpm run build:v3:click-form" + "build:v3:form": "esbuild packages/v3/form.js --bundle --sourcemap --minify --keep-names --target=safari15 --outfile=build/v3/form.js", + "build:v3": "pnpm run build:v3:sign && pnpm run build:v3:verify && pnpm run build:v3:form" }, "repository": { "type": "git",