From bbf87e0804cd5e7baa6a3f29cf456b4eff13719e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Wed, 17 Jan 2024 22:19:54 -0300 Subject: [PATCH 01/41] feat: address to transfer base implementation --- packages/widget/package.json | 1 + .../components/address-input/address-input.ts | 57 +++++++++++++++++++ .../src/components/address-input/index.ts | 1 + .../src/components/address-input/styles.ts | 42 ++++++++++++++ packages/widget/src/connect.ts | 21 +++++++ yarn.lock | 24 +++++++- 6 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 packages/widget/src/components/address-input/address-input.ts create mode 100644 packages/widget/src/components/address-input/index.ts create mode 100644 packages/widget/src/components/address-input/styles.ts diff --git a/packages/widget/package.json b/packages/widget/package.json index 21ac213f..b7d75b76 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -22,6 +22,7 @@ "@buildwithsygma/sygmaprotocol-wallet-manager": "*", "@lit/context": "1.0.0", "@lit/reactive-element": "2.0.0", + "@material/web": "^1.1.1", "ethers": "5.7.2", "events": "^3.3.0", "lit": "3.0.0" diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts new file mode 100644 index 00000000..9a00266c --- /dev/null +++ b/packages/widget/src/components/address-input/address-input.ts @@ -0,0 +1,57 @@ +import { LitElement, html } from 'lit'; +import { customElement, property, state } from 'lit/decorators.js'; +import { styles } from './styles'; +import { when } from 'lit/directives/when.js'; +import { ifDefined } from 'lit/directives/if-defined.js'; +import '@material/web/switch/switch'; + +@customElement('address-input') +export default class AddressInput extends LitElement { + static styles = styles; + @property({ + type: String + }) + selectedAddress?: string; + + @property({ + type: Boolean + }) + selected: boolean = false; + + @property() + handleSwitch?: (e: Event) => void; + + @property() + handleAddress?: (e: Event) => void; + + renderInputAddress() { + return html` +
+ + +
+ `; + } + + render() { + return html`
+
+ + + + Transfer to the different address +
+ ${when(this.selected, () => this.renderInputAddress())} +
`; + } +} diff --git a/packages/widget/src/components/address-input/index.ts b/packages/widget/src/components/address-input/index.ts new file mode 100644 index 00000000..c59ec94c --- /dev/null +++ b/packages/widget/src/components/address-input/index.ts @@ -0,0 +1 @@ +export { default } from './address-input'; diff --git a/packages/widget/src/components/address-input/styles.ts b/packages/widget/src/components/address-input/styles.ts new file mode 100644 index 00000000..c5290f12 --- /dev/null +++ b/packages/widget/src/components/address-input/styles.ts @@ -0,0 +1,42 @@ +import { css } from 'lit'; + +export const styles = css` + .switcher { + --md-sys-color-primary: var(--primary-500-main, #6366f1); + --md-switch-track-color: #ffffff; + --md-switch-selected-handle-color: #ffffff; + --md-switch-track-height: 25px; + --md-switch-track-width: 45px; + --md-switch-selected-handle-height: 17px; + --md-switch-selected-handle-width: 17px; + } + + .switch-container { + display: flex; + flex-direction: column; + justify-content: center; + gap: 8px; + } + + .switch-toggle-container { + display: flex; + flex-direction: row; + align-items: center; + gap: 10px; + } + + .input-address-container { + display: flex; + flex-direction: column; + width: 309px; + height: 91px; + gap: 8px; + } + + .input-address { + border-radius: 24px; + border: 1px solid var(--zinc-200, #e4e4e7); + width: 277px; + height: 35px; + } +`; diff --git a/packages/widget/src/connect.ts b/packages/widget/src/connect.ts index 0bde0b6e..ccfeae3d 100644 --- a/packages/widget/src/connect.ts +++ b/packages/widget/src/connect.ts @@ -21,6 +21,7 @@ import { when } from 'lit/directives/when.js'; import { choose } from 'lit/directives/choose.js'; import './components/network-selector'; import './components/amount-selector'; +import './components/address-input'; @customElement('connect-dialog') class ConnectDialog extends LitElement { @@ -70,6 +71,20 @@ class ConnectDialog extends LitElement { }) selectedToken?: Pick; + @state() + selectedAddress?: string; + + @state() + selected: boolean = false; + + handleSwitchChange(e: Event): void { + this.selected = (e.target as unknown as { selected: boolean })?.selected; + } + + handleAddress(e: Event): void { + this.selectedAddress = (e.target as HTMLInputElement).value; + } + async connectedCallback(): Promise { super.connectedCallback(); this.chainId = ( @@ -209,6 +224,12 @@ class ConnectDialog extends LitElement { .resources=${this.resources} > + ${choose(this.sdkManager?.status, [ [ 'initialized', diff --git a/yarn.lock b/yarn.lock index 4fae09d0..53b78ecc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -426,6 +426,7 @@ __metadata: "@buildwithsygma/sygmaprotocol-wallet-manager": "npm:*" "@lit/context": "npm:1.0.0" "@lit/reactive-element": "npm:2.0.0" + "@material/web": "npm:^1.1.1" "@types/node": "npm:20.8.4" eslint: "npm:^8.48.0" eslint-config-prettier: "npm:^9.0.0" @@ -1759,6 +1760,16 @@ __metadata: languageName: node linkType: hard +"@material/web@npm:^1.1.1": + version: 1.1.1 + resolution: "@material/web@npm:1.1.1" + dependencies: + lit: "npm:^2.7.4 || ^3.0.0" + tslib: "npm:^2.4.0" + checksum: 82cf8495a43d542ed5daf7c42ebb8beb659cf25ebaa408d6bd1de24dc8bba71660e7c2fbc96cae6bc6d9a532c42cd877bc794a57d061cdf7ea8225cea5d667b8 + languageName: node + linkType: hard + "@metamask/eth-sig-util@npm:4.0.1": version: 4.0.1 resolution: "@metamask/eth-sig-util@npm:4.0.1" @@ -7502,6 +7513,17 @@ __metadata: languageName: node linkType: hard +"lit@npm:^2.7.4 || ^3.0.0": + version: 3.1.1 + resolution: "lit@npm:3.1.1" + dependencies: + "@lit/reactive-element": "npm:^2.0.0" + lit-element: "npm:^4.0.0" + lit-html: "npm:^3.1.0" + checksum: fea579d9e7e27bf984a9dfe2b617e4c21d3bd428a38de63719797b266b1548cc3a89155bbb630f46edf337641d9d02106f749b6ca4a439daba47a1e1045937b7 + languageName: node + linkType: hard + "lit@npm:^2.7.5 || ^3.0.0": version: 3.1.0 resolution: "lit@npm:3.1.0" @@ -10009,7 +10031,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.5.0, tslib@npm:^2.5.2, tslib@npm:^2.5.3, tslib@npm:^2.6.0, tslib@npm:^2.6.1, tslib@npm:^2.6.2": +"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.5.2, tslib@npm:^2.5.3, tslib@npm:^2.6.0, tslib@npm:^2.6.1, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb From c14b0d41c982a4aa2abd4a266ca503981e6354cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Thu, 18 Jan 2024 10:24:59 -0300 Subject: [PATCH 02/41] chore: fixing linter error --- packages/widget/src/components/address-input/address-input.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index 9a00266c..7fee57c3 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -1,5 +1,5 @@ import { LitElement, html } from 'lit'; -import { customElement, property, state } from 'lit/decorators.js'; +import { customElement, property } from 'lit/decorators.js'; import { styles } from './styles'; import { when } from 'lit/directives/when.js'; import { ifDefined } from 'lit/directives/if-defined.js'; From 3d5e06a6c59f44c00568695b74e5fe69dd732112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Thu, 18 Jan 2024 10:34:45 -0300 Subject: [PATCH 03/41] fix: small fix on message --- packages/widget/src/components/address-input/address-input.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index 7fee57c3..ad36972c 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -49,7 +49,7 @@ export default class AddressInput extends LitElement { @change=${this.handleSwitch} > - Transfer to the different address + Transfer to different address ${when(this.selected, () => this.renderInputAddress())} `; From f1de1783a0f45d429ee7633a94086dd83bb4113f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Thu, 18 Jan 2024 13:24:51 -0300 Subject: [PATCH 04/41] chore: removing switch and input prefilled with current connected address --- .../components/address-input/address-input.ts | 34 +++---------------- .../src/components/address-input/styles.ts | 4 ++- 2 files changed, 8 insertions(+), 30 deletions(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index ad36972c..f5acc18d 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -1,7 +1,6 @@ import { LitElement, html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { styles } from './styles'; -import { when } from 'lit/directives/when.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import '@material/web/switch/switch'; @@ -11,21 +10,14 @@ export default class AddressInput extends LitElement { @property({ type: String }) - selectedAddress?: string; - - @property({ - type: Boolean - }) - selected: boolean = false; - - @property() - handleSwitch?: (e: Event) => void; + addressToTransfer?: string; @property() handleAddress?: (e: Event) => void; - renderInputAddress() { - return html` + render() { + console.log('address to transfer', this.addressToTransfer); + return html`
- `; - } - - render() { - return html`
-
- - - - Transfer to different address -
- ${when(this.selected, () => this.renderInputAddress())}
`; } } diff --git a/packages/widget/src/components/address-input/styles.ts b/packages/widget/src/components/address-input/styles.ts index c5290f12..09939775 100644 --- a/packages/widget/src/components/address-input/styles.ts +++ b/packages/widget/src/components/address-input/styles.ts @@ -36,7 +36,9 @@ export const styles = css` .input-address { border-radius: 24px; border: 1px solid var(--zinc-200, #e4e4e7); - width: 277px; + width: 320px; height: 35px; + font-size: 13px; + text-align: center; } `; From 7eaca0935d1c4e08ac89e2d35e987575705a1f58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Thu, 18 Jan 2024 13:26:04 -0300 Subject: [PATCH 05/41] chore: modifying connect component --- packages/widget/src/connect.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/widget/src/connect.ts b/packages/widget/src/connect.ts index be724508..73e90eeb 100644 --- a/packages/widget/src/connect.ts +++ b/packages/widget/src/connect.ts @@ -90,17 +90,13 @@ class ConnectDialog extends LitElement { selectedTokenAddress?: string; @state() - selectedAddress?: string; + addressToTransfer?: string; @state() selected: boolean = false; - handleSwitchChange(e: Event): void { - this.selected = (e.target as unknown as { selected: boolean })?.selected; - } - handleAddress(e: Event): void { - this.selectedAddress = (e.target as HTMLInputElement).value; + this.addressToTransfer = (e.target as HTMLInputElement).value; } async connectedCallback(): Promise { @@ -170,6 +166,7 @@ class ConnectDialog extends LitElement { async connect() { await this.walletManager?.connectEvmWallet(); + this.addressToTransfer = this.walletManager?.accountData; this.requestUpdate(); } @@ -234,6 +231,7 @@ class ConnectDialog extends LitElement { } render() { + console.log('selectedAddress', this.addressToTransfer); if (!this.walletManager || !this.walletManager.accountData) { return html` `; } else { @@ -270,10 +268,9 @@ class ConnectDialog extends LitElement { > ${choose(this.sdkManager?.status, [ [ From 4b726cdf6440c7e1bf09b5592d5fb9abf6011e9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Thu, 18 Jan 2024 13:39:34 -0300 Subject: [PATCH 06/41] chore: changes to include address to transfer input to main view --- .../widget/src/components/widget-app/widget-app.ts | 8 ++++++++ .../src/components/widget-app/widget-mixin.ts | 3 +++ .../src/components/widget-app/widget-view.ts | 14 +++++++++++++- packages/widget/src/interfaces/index.ts | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/widget/src/components/widget-app/widget-app.ts b/packages/widget/src/components/widget-app/widget-app.ts index 469f3c1f..e7df6f79 100644 --- a/packages/widget/src/components/widget-app/widget-app.ts +++ b/packages/widget/src/components/widget-app/widget-app.ts @@ -19,6 +19,10 @@ export default class WidgetApp extends WidgetMixin(LitElement) { // eslint-disable-next-line class-methods-use-this async handleTransfer() {} + handleAddress(e: Event): void { + this.addressToTransfer = (e.target as HTMLInputElement).value; + } + async getChainId() { if (this.walletManager?.evmWallet?.web3Provider) { const chainId = ( @@ -115,6 +119,8 @@ export default class WidgetApp extends WidgetMixin(LitElement) { async connect() { await this.walletManager?.connectEvmWallet(); + this.addressToTransfer = this.walletManager?.accountData; + console.log('this.addressToTransfer', this.addressToTransfer); await this.initSdk(); this.requestUpdate(); } @@ -185,6 +191,8 @@ export default class WidgetApp extends WidgetMixin(LitElement) { .handleTransfer=${this.handleTransfer} .destinationDomains=${this.destinationDomains} .tokenBalance=${this.tokenBalance} + .addressToTransfer=${this.addressToTransfer} + .handleAddress=${this.handleAddress} > `; } diff --git a/packages/widget/src/components/widget-app/widget-mixin.ts b/packages/widget/src/components/widget-app/widget-mixin.ts index cf1f8249..9181e7a9 100644 --- a/packages/widget/src/components/widget-app/widget-mixin.ts +++ b/packages/widget/src/components/widget-app/widget-mixin.ts @@ -74,6 +74,9 @@ const WidgetMixin = >(superClass: T) => { @state() tokenName?: string; + @state() + addressToTransfer?: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any constructor(...rest: any[]) { super(rest); diff --git a/packages/widget/src/components/widget-app/widget-view.ts b/packages/widget/src/components/widget-app/widget-view.ts index 873816f8..0c6b8edd 100644 --- a/packages/widget/src/components/widget-app/widget-view.ts +++ b/packages/widget/src/components/widget-app/widget-view.ts @@ -10,6 +10,7 @@ import { WalletManagerController } from '@buildwithsygma/sygmaprotocol-wallet-ma import { when } from 'lit/directives/when.js'; import '../network-selector'; import '../amount-selector'; +import '../address-input'; import { styles } from './styles'; @customElement('widget-view') @@ -70,6 +71,14 @@ export class WidgetView extends LitElement { }) tokenBalance?: string; + @property({ + type: String + }) + addressToTransfer?: string; + + @property() + handleAddress?: (e: Event) => void; + @state() connectionInitiliazed: boolean = false; @@ -120,7 +129,10 @@ export class WidgetView extends LitElement {
- Transfer to the same address +
${when( diff --git a/packages/widget/src/interfaces/index.ts b/packages/widget/src/interfaces/index.ts index 3f599da8..72061671 100644 --- a/packages/widget/src/interfaces/index.ts +++ b/packages/widget/src/interfaces/index.ts @@ -20,4 +20,5 @@ export interface IWidgetMixin { selectedTokenAddress?: string; tokenBalance?: string; tokenName?: string; + addressToTransfer?: string; } From fc401eed003a0fd041f13cc79a0f1cfefb345994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Fri, 19 Jan 2024 01:20:40 -0300 Subject: [PATCH 07/41] chore: remove unused dependency --- packages/widget/package.json | 1 - .../components/address-input/address-input.ts | 2 -- yarn.lock | 24 +------------------ 3 files changed, 1 insertion(+), 26 deletions(-) diff --git a/packages/widget/package.json b/packages/widget/package.json index 3819c8c3..c7791763 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -22,7 +22,6 @@ "@buildwithsygma/sygmaprotocol-wallet-manager": "*", "@lit/context": "1.0.0", "@lit/reactive-element": "2.0.0", - "@material/web": "^1.1.1", "ethers": "5.7.2", "events": "^3.3.0", "lit": "3.0.0" diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index f5acc18d..c122354b 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -2,7 +2,6 @@ import { LitElement, html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { styles } from './styles'; import { ifDefined } from 'lit/directives/if-defined.js'; -import '@material/web/switch/switch'; @customElement('address-input') export default class AddressInput extends LitElement { @@ -16,7 +15,6 @@ export default class AddressInput extends LitElement { handleAddress?: (e: Event) => void; render() { - console.log('address to transfer', this.addressToTransfer); return html`
diff --git a/yarn.lock b/yarn.lock index a8a39b22..fa13ac07 100644 --- a/yarn.lock +++ b/yarn.lock @@ -426,7 +426,6 @@ __metadata: "@buildwithsygma/sygmaprotocol-wallet-manager": "npm:*" "@lit/context": "npm:1.0.0" "@lit/reactive-element": "npm:2.0.0" - "@material/web": "npm:^1.1.1" "@types/node": "npm:20.8.4" eslint: "npm:^8.48.0" eslint-config-prettier: "npm:^9.0.0" @@ -1760,16 +1759,6 @@ __metadata: languageName: node linkType: hard -"@material/web@npm:^1.1.1": - version: 1.1.1 - resolution: "@material/web@npm:1.1.1" - dependencies: - lit: "npm:^2.7.4 || ^3.0.0" - tslib: "npm:^2.4.0" - checksum: 82cf8495a43d542ed5daf7c42ebb8beb659cf25ebaa408d6bd1de24dc8bba71660e7c2fbc96cae6bc6d9a532c42cd877bc794a57d061cdf7ea8225cea5d667b8 - languageName: node - linkType: hard - "@metamask/eth-sig-util@npm:4.0.1": version: 4.0.1 resolution: "@metamask/eth-sig-util@npm:4.0.1" @@ -7513,17 +7502,6 @@ __metadata: languageName: node linkType: hard -"lit@npm:^2.7.4 || ^3.0.0": - version: 3.1.1 - resolution: "lit@npm:3.1.1" - dependencies: - "@lit/reactive-element": "npm:^2.0.0" - lit-element: "npm:^4.0.0" - lit-html: "npm:^3.1.0" - checksum: fea579d9e7e27bf984a9dfe2b617e4c21d3bd428a38de63719797b266b1548cc3a89155bbb630f46edf337641d9d02106f749b6ca4a439daba47a1e1045937b7 - languageName: node - linkType: hard - "lit@npm:^2.7.5 || ^3.0.0": version: 3.1.0 resolution: "lit@npm:3.1.0" @@ -10031,7 +10009,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.5.2, tslib@npm:^2.5.3, tslib@npm:^2.6.0, tslib@npm:^2.6.1, tslib@npm:^2.6.2": +"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.5.0, tslib@npm:^2.5.2, tslib@npm:^2.5.3, tslib@npm:^2.6.0, tslib@npm:^2.6.1, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb From e7a6879a32c710cf59a4d0d0cd00bda8c40b2759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Mon, 22 Jan 2024 00:08:05 -0300 Subject: [PATCH 08/41] chore: fixing linter issue --- .../widget/src/components/address-input/address-input.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index c122354b..27371302 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -1,7 +1,8 @@ import { LitElement, html } from 'lit'; +import type { HTMLTemplateResult } from 'lit'; import { customElement, property } from 'lit/decorators.js'; -import { styles } from './styles'; import { ifDefined } from 'lit/directives/if-defined.js'; +import { styles } from './styles'; @customElement('address-input') export default class AddressInput extends LitElement { @@ -14,7 +15,7 @@ export default class AddressInput extends LitElement { @property() handleAddress?: (e: Event) => void; - render() { + render(): HTMLTemplateResult { return html`
From 52d26af09749a9e0430c1a242790bb05cf01013f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Mon, 22 Jan 2024 00:11:56 -0300 Subject: [PATCH 09/41] chore: fixing linter issue for method --- packages/widget/src/components/widget-app/widget-app.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/widget/src/components/widget-app/widget-app.ts b/packages/widget/src/components/widget-app/widget-app.ts index 7790c959..be7486a8 100644 --- a/packages/widget/src/components/widget-app/widget-app.ts +++ b/packages/widget/src/components/widget-app/widget-app.ts @@ -19,9 +19,9 @@ import WidgetMixin from './widget-mixin'; export default class WidgetApp extends WidgetMixin(LitElement) { handleTransfer = async (): Promise => {}; - handleAddress(e: Event): void { + handleAddress = (e: Event): void => { this.addressToTransfer = (e.target as HTMLInputElement).value; - } + }; async getChainId(): Promise { if (this.walletManager?.evmWallet?.web3Provider) { From 8e428955a83934bb57fc9aef2614ec2a0a707fbb Mon Sep 17 00:00:00 2001 From: Marin Petrunic Date: Mon, 22 Jan 2024 16:25:10 +0100 Subject: [PATCH 10/41] remove extra code, add vite build, add tests Signed-off-by: Marin Petrunic --- packages/widget/package.json | 14 +- .../amount-selector/amount-selector.ts | 129 +- .../src/components/amount-selector/index.ts | 2 +- .../components/base-selector/base-selector.ts | 163 -- .../src/components/base-selector/index.ts | 1 - .../src/components/base-selector/styles.ts | 21 - packages/widget/src/components/index.ts | 3 +- .../src/components/network-selector/index.ts | 2 +- .../network-selector/network-selector.ts | 97 +- .../src/components/network-selector/styles.ts | 17 + .../widget/src/components/widget-app/index.ts | 1 - .../src/components/widget-app/styles.ts | 95 -- .../src/components/widget-app/widget-app.ts | 192 --- .../src/components/widget-app/widget-mixin.ts | 77 - .../src/components/widget-app/widget-view.ts | 151 -- packages/widget/src/controllers/index.ts | 1 - .../src/controllers/sdk-manager/SdkManager.ts | 128 -- .../sdk-manager/SdkManagerContextProvider.ts | 99 -- .../src/controllers/sdk-manager/index.ts | 8 - .../sdk-manager/types/SdkManagerState.ts | 33 - .../sdk-manager/types/SdkManagerStatus.ts | 8 - .../controllers/sdk-manager/types/index.ts | 2 - .../wallet-manager/WalletManagerContext.ts | 82 - .../wallet-manager/WalletManagerController.ts | 131 -- .../src/controllers/wallet-manager/index.ts | 8 +- packages/widget/src/controllers/widget.ts | 129 ++ packages/widget/src/interfaces/index.ts | 22 - packages/widget/src/styles.ts | 91 + packages/widget/src/widget.ts | 74 +- .../network-selector/network-selector.test.ts | 56 + .../wallet-manager/EvmWallet.test.ts | 4 +- .../WalletManagerController.test.ts | 81 - packages/widget/tsconfig.build.json | 4 - packages/widget/tsconfig.json | 3 +- packages/widget/vite.config.ts | 24 +- yarn.lock | 1484 ++++++++++++++++- 36 files changed, 1946 insertions(+), 1491 deletions(-) delete mode 100644 packages/widget/src/components/base-selector/base-selector.ts delete mode 100644 packages/widget/src/components/base-selector/index.ts delete mode 100644 packages/widget/src/components/base-selector/styles.ts delete mode 100644 packages/widget/src/components/widget-app/index.ts delete mode 100644 packages/widget/src/components/widget-app/styles.ts delete mode 100644 packages/widget/src/components/widget-app/widget-app.ts delete mode 100644 packages/widget/src/components/widget-app/widget-mixin.ts delete mode 100644 packages/widget/src/components/widget-app/widget-view.ts delete mode 100644 packages/widget/src/controllers/sdk-manager/SdkManager.ts delete mode 100644 packages/widget/src/controllers/sdk-manager/SdkManagerContextProvider.ts delete mode 100644 packages/widget/src/controllers/sdk-manager/index.ts delete mode 100644 packages/widget/src/controllers/sdk-manager/types/SdkManagerState.ts delete mode 100644 packages/widget/src/controllers/sdk-manager/types/SdkManagerStatus.ts delete mode 100644 packages/widget/src/controllers/sdk-manager/types/index.ts delete mode 100644 packages/widget/src/controllers/wallet-manager/WalletManagerContext.ts delete mode 100644 packages/widget/src/controllers/wallet-manager/WalletManagerController.ts create mode 100644 packages/widget/src/controllers/widget.ts delete mode 100644 packages/widget/src/interfaces/index.ts create mode 100644 packages/widget/tests/unit/components/network-selector/network-selector.test.ts delete mode 100644 packages/widget/tests/unit/controllers/wallet-manager/WalletManagerController.test.ts delete mode 100644 packages/widget/tsconfig.build.json diff --git a/packages/widget/package.json b/packages/widget/package.json index 250aa70a..2b3fdab5 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -2,10 +2,15 @@ "name": "@buildwithsygma/sygmaprotocol-widget", "description": "Sygma Protocol Widget", "version": "0.1.0", - "main": "build/index.js", - "module": "build/index.js", + "main": "build/sygmaprotocol-widget.js", + "module": "build/sygmaprotocol-widget.js", + "types": "build/index.d.ts", "license": "LGPL-3.0-or-later", "type": "module", + "files": [ + "build", + "src" + ], "scripts": { "start": "yarn run dev", "dev": "vite", @@ -13,7 +18,7 @@ "serve": "vite preview", "clean": "rm -rf ./build", "lint": "yarn run lint:types && yarn run lint:code && yarn run lint:lit", - "lint:types": "tsc -p ./tsconfig.build.json --noEmit", + "lint:types": "tsc -p ./tsconfig.json --noEmit", "lint:code": "eslint '{src,tests}/**/*.ts'", "lint:lit": "lit-analyzer", "test": "yarn run test:unit", @@ -35,6 +40,8 @@ "lit": "3.0.0" }, "devDependencies": { + "@open-wc/semantic-dom-diff": "^0.20.1", + "@open-wc/testing-helpers": "^3.0.0", "eslint": "^8.48.0", "eslint-plugin-lit": "^1.9.1", "jsdom": "^23.2.0", @@ -43,6 +50,7 @@ "typescript": "5.2.2", "vite": "4.4.11", "vite-plugin-clean": "^1.0.0", + "vite-plugin-dts": "^3.7.1", "vitest": "^1.2.1" } } diff --git a/packages/widget/src/components/amount-selector/amount-selector.ts b/packages/widget/src/components/amount-selector/amount-selector.ts index 5d80cb20..60413438 100644 --- a/packages/widget/src/components/amount-selector/amount-selector.ts +++ b/packages/widget/src/components/amount-selector/amount-selector.ts @@ -1,113 +1,124 @@ import type { Resource } from '@buildwithsygma/sygma-sdk-core'; import type { HTMLTemplateResult } from 'lit'; import { LitElement, html } from 'lit'; -import { customElement, property, state } from 'lit/decorators.js'; +import { customElement, property, query } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; -import type { Ref } from 'lit/directives/ref.js'; -import { createRef, ref } from 'lit/directives/ref.js'; +import { map } from 'lit/directives/map.js'; import { when } from 'lit/directives/when.js'; import { styles } from './styles'; -@customElement('amount-selector') -export default class AmountSelector extends LitElement { +@customElement('sygma-resource-selector') +export class AmountSelector extends LitElement { static styles = styles; @property({ type: Array, hasChanged: (n, o) => n !== o }) - resources?: Resource[]; + resources: Resource[] = []; @property({ type: Boolean }) disabled = false; - @property({ - type: Boolean, - hasChanged: (n, o) => n !== o - }) - isNativeToken?: boolean; - - @state({ - hasChanged: (n, o) => n !== o - }) - selectedNetworkChainId?: number; - @property({ type: String }) - tokenBalance?: string; + accountBalance?: string; @property({ type: String }) - tokenName?: string; + preselectedToken?: string; - @state({ + @property({ + type: Number, hasChanged: (n, o) => n !== o }) - selectedAmount?: number; - - inputRef: Ref = createRef(); + preselectedAmount?: number; - handleAmountChange = (event: Event): void => { - const { value } = event.target as HTMLInputElement; + @property({ + attribute: false + }) + onResourceSelected?: (resource: Resource) => void; - this.selectedAmount = Number.parseFloat(value); + @property({ + attribute: false + }) + onAmountChange?: (amount: number) => void; - dispatchEvent( - new CustomEvent('amount-selector-change', { - detail: value, - bubbles: true, - composed: true - }) - ); - }; + @query('.amountSelectorInput', true) + _input!: HTMLInputElement; useMaxBalance = (): void => { - this.selectedAmount = Number.parseFloat(this.tokenBalance!); - - (this.inputRef.value as HTMLInputElement).value = `${this.selectedAmount}`; - const event = new Event('input', { - bubbles: true - }); + this.preselectedAmount = Number.parseFloat(this.accountBalance!); + this._onInputAmountChange(); + }; - this.inputRef.value?.dispatchEvent(event); + _onInputAmountChange = (): void => { + const amount = Number.parseFloat(this._input.value); + this.onAmountChange?.(amount); + }; + _onResourceSelected = (event: Event): void => { + const { value } = event.target as HTMLOptionElement; + const resource = this.resources.find((n) => String(n.resourceId) == value); + if (resource) { + this.onResourceSelected?.(resource); + } }; renderBalance(): HTMLTemplateResult { return html`
- ${`${Number.parseFloat(this.tokenBalance!).toFixed(4)}`} + ${`${Number.parseFloat(this.accountBalance!).toFixed(4)}`}
`; } + renderEntries(): Generator | HTMLTemplateResult { + if (this.resources) { + return map(this.resources, (entry: Resource) => { + // TODO: render resource/token icon + return html``; + }); + } + return html``; + } + render(): HTMLTemplateResult { return html`
-
- - ${when(this.tokenBalance, () => this.renderBalance())} +
+ + ${when(this.accountBalance, () => this.renderBalance())}
- - + +
+
-
+
`; } } + +declare global { + interface HTMLElementTagNameMap { + 'sygma-resource-selector': AmountSelector; + } +} diff --git a/packages/widget/src/components/amount-selector/index.ts b/packages/widget/src/components/amount-selector/index.ts index 20ea1dc9..2c52c3a2 100644 --- a/packages/widget/src/components/amount-selector/index.ts +++ b/packages/widget/src/components/amount-selector/index.ts @@ -1 +1 @@ -export { default } from './amount-selector'; +export { AmountSelector } from './amount-selector'; diff --git a/packages/widget/src/components/base-selector/base-selector.ts b/packages/widget/src/components/base-selector/base-selector.ts deleted file mode 100644 index eb2e3010..00000000 --- a/packages/widget/src/components/base-selector/base-selector.ts +++ /dev/null @@ -1,163 +0,0 @@ -import type { Domain, Resource } from '@buildwithsygma/sygma-sdk-core'; -import type { HTMLTemplateResult } from 'lit'; -import { LitElement, html } from 'lit'; -import { customElement, property } from 'lit/decorators.js'; -import { ifDefined } from 'lit/directives/if-defined.js'; -import { map } from 'lit/directives/map.js'; -import { when } from 'lit/directives/when.js'; -import { - capitalize, - renderNetworkIcon, - renderNoNetworkIcon -} from '../../utils'; -import { styles } from './styles'; - -@customElement('base-selector') -export default class BaseSelector extends LitElement { - static styles = styles; - @property({ - type: Boolean - }) - disabled = false; - - @property({ - type: Array, - hasChanged: (n, o) => n !== o - }) - entries?: Domain[] | Resource[]; - - @property({ - type: String - }) - typeSelector: 'network' | 'token' = 'network'; - - @property({ - type: Boolean - }) - networkIcons = false; - - @property({ - type: Number - }) - selectedNetworkChainId?: number; - - @property({ - type: Boolean - }) - isHomechain = false; - - @property({ - type: Object - }) - homechain?: Domain; - - onChange = (event: Event): void => { - const { value } = event.target as HTMLInputElement; - if (this.typeSelector === 'network') { - dispatchEvent( - new CustomEvent('network-change', { - detail: value, - bubbles: true, - composed: true - }) - ); - } else { - dispatchEvent( - new CustomEvent('token-change', { - detail: value, - bubbles: true, - composed: true - }) - ); - } - }; - - renderEntries(): Generator | HTMLTemplateResult { - if (this.entries) { - return map(this.entries, (entry: Domain | Resource, index: number) => { - if (index === 0) { - return html` - `; - } - return html``; - }); - } - return html``; - } - - render(): HTMLTemplateResult { - return html` -
- ${when( - this.networkIcons, - () => { - if (this.typeSelector === 'network') { - console.log( - !!(this.selectedNetworkChainId && this.entries?.length) - ); - - return when( - !!( - this.selectedNetworkChainId && - (this.entries?.length || this.homechain) - ), - () => renderNetworkIcon(this.selectedNetworkChainId as number), - - () => renderNoNetworkIcon() - ); - } - return null; - }, - () => null // do not render network icon slot - )} - -
- `; - } -} diff --git a/packages/widget/src/components/base-selector/index.ts b/packages/widget/src/components/base-selector/index.ts deleted file mode 100644 index 303067ee..00000000 --- a/packages/widget/src/components/base-selector/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './base-selector'; diff --git a/packages/widget/src/components/base-selector/styles.ts b/packages/widget/src/components/base-selector/styles.ts deleted file mode 100644 index 70c1a677..00000000 --- a/packages/widget/src/components/base-selector/styles.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { css } from 'lit'; - -export const styles = css` - .selector { - width: 100%; - color: var(--neutral-600, #525252); - font-family: Inter; - font-size: 18px; - font-style: normal; - font-weight: 500; - line-height: 26px; - border: none; - } - .selectorSection { - display: flex; - align-items: center; - gap: 12px; - align-self: stretch; - width: inherit; - } -`; diff --git a/packages/widget/src/components/index.ts b/packages/widget/src/components/index.ts index 49157449..35b47082 100644 --- a/packages/widget/src/components/index.ts +++ b/packages/widget/src/components/index.ts @@ -1 +1,2 @@ -export { default } from './widget-app'; +export { AmountSelector } from './amount-selector'; +export { NetworkSelector } from './network-selector'; diff --git a/packages/widget/src/components/network-selector/index.ts b/packages/widget/src/components/network-selector/index.ts index 91a36760..0c892a6d 100644 --- a/packages/widget/src/components/network-selector/index.ts +++ b/packages/widget/src/components/network-selector/index.ts @@ -1 +1 @@ -export { default } from './network-selector'; +export { NetworkSelector } from './network-selector'; diff --git a/packages/widget/src/components/network-selector/network-selector.ts b/packages/widget/src/components/network-selector/network-selector.ts index ab86663c..2cdf442a 100644 --- a/packages/widget/src/components/network-selector/network-selector.ts +++ b/packages/widget/src/components/network-selector/network-selector.ts @@ -1,11 +1,8 @@ -import type { - EthereumConfig, - SubstrateConfig -} from '@buildwithsygma/sygma-sdk-core'; -import type { HTMLTemplateResult } from 'lit'; -import { LitElement, html } from 'lit'; +import type { Domain } from '@buildwithsygma/sygma-sdk-core'; +import { LitElement, html, type HTMLTemplateResult } from 'lit'; import { customElement, property } from 'lit/decorators.js'; -import '../base-selector'; +import { map } from 'lit/directives/map.js'; +import { capitalize } from '../../utils'; import { styles } from './styles'; const directions = { @@ -13,66 +10,80 @@ const directions = { to: 'To' }; -@customElement('network-selector') -export default class NetworkSelector extends LitElement { +@customElement('sygma-network-selector') +export class NetworkSelector extends LitElement { static styles = styles; - @property({ - type: Array, - hasChanged: (n, o) => n !== o - }) - domains?: EthereumConfig[] | SubstrateConfig[]; - @property({ type: Boolean }) - isHomechain = false; + disabled = false; @property({ - type: Object, - hasChanged: (n, o) => n !== o + type: Boolean }) - homechain?: EthereumConfig | SubstrateConfig; + icons = true; @property({ type: String }) - directionLabel?: 'from' | 'to'; + direction?: 'from' | 'to'; @property({ - type: Number, + type: Object, hasChanged: (n, o) => n !== o }) - selectedNetworkChainId?: number; + selected?: Domain; @property({ - type: Boolean + attribute: false }) - networkIcons = false; + onNetworkSelected?: (network: Domain | undefined) => void; @property({ - type: Boolean + type: Array, + hasChanged: (n, o) => n !== o }) - disabled = false; + networks: Domain[] = []; + + onChange(event: Event): void { + const { value } = event.target as HTMLOptionElement; + const network = this.networks.find((n) => String(n.chainId) == value); + this.onNetworkSelected?.(network); + } + + renderEntries(): Generator | HTMLTemplateResult { + if (this.networks) { + return map(this.networks, (entry: Domain) => { + // TODO: render network icon + return html``; + }); + } + return html``; + } render(): HTMLTemplateResult { - return html` -
- + +
+ +
+
`; + } +} +declare global { + interface HTMLElementTagNameMap { + 'sygma-network-selector': NetworkSelector; } } diff --git a/packages/widget/src/components/network-selector/styles.ts b/packages/widget/src/components/network-selector/styles.ts index 61cca17c..d79ac7ec 100644 --- a/packages/widget/src/components/network-selector/styles.ts +++ b/packages/widget/src/components/network-selector/styles.ts @@ -28,4 +28,21 @@ export const styles = css` .baseSelector { width: 100%; } + .selector { + width: 100%; + color: var(--neutral-600, #525252); + font-family: Inter; + font-size: 18px; + font-style: normal; + font-weight: 500; + line-height: 26px; + border: none; + } + .selectorSection { + display: flex; + align-items: center; + gap: 12px; + align-self: stretch; + width: inherit; + } `; diff --git a/packages/widget/src/components/widget-app/index.ts b/packages/widget/src/components/widget-app/index.ts deleted file mode 100644 index 49157449..00000000 --- a/packages/widget/src/components/widget-app/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './widget-app'; diff --git a/packages/widget/src/components/widget-app/styles.ts b/packages/widget/src/components/widget-app/styles.ts deleted file mode 100644 index ad441b4e..00000000 --- a/packages/widget/src/components/widget-app/styles.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { css } from 'lit'; - -export const styles = css` - .widgetContainer { - display: flex; - flex-direction: column; - align-items: center; - padding: 24px; - width: 350px; - height: 476px; - padding: 24px; - border-radius: 12px; - border: 1px solid var(--gray-100, #f3f4f6); - background: #fff; - - box-shadow: - 0px 4px 6px -1px rgba(0, 0, 0, 0.1), - 0px 2px 4px -1px rgba(0, 0, 0, 0.06); - - font-family: 'Bungee Spice'; - } - - .switchNetwork { - display: flex; - flex-direction: row; - justify-content: flex-end; - color: var(--neutral-600, #525252); - text-align: right; - font-family: Inter; - font-size: 14px; - font-style: normal; - font-weight: 500; - line-height: 18px; - } - - .switchNetwork > span:nth-child(2) { - margin-left: 4px; - } - - .actionButton { - display: flex; - width: 314px; - padding: 12px 20px; - justify-content: center; - align-items: center; - gap: 8px; - border-radius: 16px; - background: var(--primary-300, #a5b4fc); - color: #ffffff; - border: none; - font-family: Inter; - font-weight: 500; - font-size: 16px; - } - - .actionButton:hover { - cursor: pointer; - } - - .actionButton:active { - background: var(--primary-500-main, #6366f1); - } - - .actionButtonReady { - display: flex; - width: 314px; - padding: 12px 20px; - justify-content: center; - align-items: center; - gap: 8px; - border-radius: 16px; - background: var(--primary-500-main, #6366f1); - color: #ffffff; - border: none; - } - - .actionButtonReady:active { - background: var(--primary-300, #a5b4fc); - } - - .actionButtonReady:hover { - cursor: pointer; - } - - .poweredBy { - display: flex; - flex-direction: row; - justify-content: flex-start; - margin-top: 16px; - } - - .poweredBy > span:nth-child(2) { - margin-left: 6px; - } -`; diff --git a/packages/widget/src/components/widget-app/widget-app.ts b/packages/widget/src/components/widget-app/widget-app.ts deleted file mode 100644 index f4887edf..00000000 --- a/packages/widget/src/components/widget-app/widget-app.ts +++ /dev/null @@ -1,192 +0,0 @@ -import type { HTMLTemplateResult } from 'lit'; -import { LitElement, html } from 'lit'; -import { customElement } from 'lit/decorators.js'; - -import type { - EthereumConfig, - EvmResource, - SubstrateConfig -} from '@buildwithsygma/sygma-sdk-core'; -import { Environment, Network } from '@buildwithsygma/sygma-sdk-core'; - -import { getEvmErc20Balance } from '@buildwithsygma/sygma-sdk-core/evm'; - -import './widget-view'; -import { ethers } from 'ethers'; -import WidgetMixin from './widget-mixin'; - -@customElement('widget-app') -export default class WidgetApp extends WidgetMixin(LitElement) { - handleTransfer = async (): Promise => {}; - - async getChainId(): Promise { - if (this.walletManager?.evmWallet?.web3Provider) { - return (await this.walletManager?.evmWallet?.web3Provider?.getNetwork()) - ?.chainId; - } - } - - async connectedCallback(): Promise { - super.connectedCallback(); - this.chainId = await this.getChainId(); - - this.walletManager?.addAccountChangedEventListener(() => { - this.requestUpdate(); - }); - - this.walletManager?.addChainChangedEventListener(async () => { - this.chainId = ( - await this.walletManager?.evmWallet?.web3Provider?.getNetwork() - )?.chainId; - - void this.initSdk(); - - this.requestUpdate(); - }); - - // listen to the custom event for network change - addEventListener('network-change', (event: unknown) => { - const { detail } = event as CustomEvent; - this.selectedNetworkChainId = Number(detail); - this.requestUpdate(); - }); - - addEventListener('amount-selector-change', (event: unknown) => { - const { detail } = event as CustomEvent; - this.selectedAmount = Number(detail); - this.requestUpdate(); - }); - - addEventListener('token-change', (event: unknown) => { - const { detail } = event as CustomEvent; - - this.selectedToken = detail; - - const tokenInfo = this.resources?.find( - (resource) => resource.resourceId === this.selectedToken - ); - - this.tokenName = tokenInfo?.symbol; - - if (this.homechain?.type === Network.EVM) { - this.selectedTokenAddress = (tokenInfo as EvmResource).address; - - void this.fetchTokenBalance().then(() => this.requestUpdate()); - } else { - this.requestUpdate(); - } - }); - - addEventListener('connectionInitialized', (event: unknown) => { - const { detail } = event as CustomEvent<{ - connectionInitialized: boolean; - }>; - - if (detail.connectionInitialized) { - void this.connect(); - } - }); - } - - async initSdk(): Promise { - if (!this.walletManager?.evmWallet?.web3Provider) { - throw new Error('No provider'); - } - await this.sdkManager?.initializeSdk( - this.walletManager.evmWallet?.web3Provider, - Environment.TESTNET - ); - - const domains = this.sdkManager?.assetTransfer.config.getDomains(); - this.domains = domains as EthereumConfig[] | SubstrateConfig[]; - - this.homechain = - this.sdkManager?.assetTransfer.config.getSourceDomainConfig(); - - this.resources = this.homechain?.resources; - - this.destinationDomains = this.domains?.filter( - (domain) => domain.chainId !== this.chainId - ) as EthereumConfig[] | SubstrateConfig[]; - - if (!this.chainId) { - this.chainId = await this.getChainId(); - } - - this.requestUpdate(); - } - - connect = async (): Promise => { - await this.walletManager?.connectEvmWallet(); - await this.initSdk(); - this.requestUpdate(); - }; - - async createTransfer(): Promise { - if (!this.walletManager?.evmWallet?.address) { - throw new Error('No wallet connected'); - } - await this.sdkManager?.initializeTransfer( - this.walletManager.evmWallet.address, - this.chainId === 11155111 ? 5 : 11155111, - this.walletManager.evmWallet.address, - '0x0000000000000000000000000000000000000000000000000000000000000300', - '5000000000000000000' // 18 decimal places - ); - this.requestUpdate(); - } - - async approveTokens(): Promise { - if (!this.sdkManager) { - throw new Error('SDK Manager not initialized'); - } - if (!this.walletManager?.evmWallet?.signer) { - throw new Error('No wallet connected'); - } - await this.sdkManager.performApprovals(this.walletManager.evmWallet.signer); - this.requestUpdate(); - } - - async performDeposit(): Promise { - if (!this.sdkManager) { - throw new Error('SDK Manager not initialized'); - } - if (!this.walletManager?.evmWallet?.signer) { - throw new Error('No wallet connected'); - } - await this.sdkManager.performDeposit(this.walletManager.evmWallet.signer); - this.requestUpdate(); - } - - async fetchTokenBalance(): Promise { - if (this.homechain?.type === Network.EVM && this.selectedTokenAddress) { - const balance = await getEvmErc20Balance( - this.walletManager?.accountData as string, - this.selectedTokenAddress, - this.walletManager?.evmWallet - ?.web3Provider as ethers.providers.Web3Provider - ); - - this.tokenBalance = ethers.utils.formatUnits(balance, 18); - } - } - - render(): HTMLTemplateResult { - return html` - - `; - } -} diff --git a/packages/widget/src/components/widget-app/widget-mixin.ts b/packages/widget/src/components/widget-app/widget-mixin.ts deleted file mode 100644 index b7235eef..00000000 --- a/packages/widget/src/components/widget-app/widget-mixin.ts +++ /dev/null @@ -1,77 +0,0 @@ -import type { Constructor } from '@lit/reactive-element/decorators/base.js'; -import type { LitElement } from 'lit'; -import { state } from 'lit/decorators.js'; -import { consume } from '@lit/context'; -import type { - EthereumConfig, - Resource, - SubstrateConfig -} from '@buildwithsygma/sygma-sdk-core'; -import type { IWidgetMixin } from '../../interfaces'; -import type { SdkManager, WalletManagerController } from '../../controllers'; -import { SdkManagerContext, WalletManagerContext } from '../../controllers'; - -const WidgetMixin = >( - superClass: T -): Constructor & T => { - class Mixin extends superClass { - @consume({ context: WalletManagerContext, subscribe: true }) - @state() - walletManager?: WalletManagerController; - - @consume({ context: SdkManagerContext, subscribe: true }) - @state() - sdkManager?: SdkManager; - - @state() - chainId?: number; - - @state({ - hasChanged: (n, o) => n !== o - }) - domains?: EthereumConfig[] | SubstrateConfig[]; - - @state({ - hasChanged: (n, o) => n !== o - }) - homechain?: EthereumConfig | SubstrateConfig; - - @state({ - hasChanged: (n, o) => n !== o - }) - selectedNetworkChainId?: number; - - @state({ - hasChanged: (n, o) => n !== o - }) - destinationDomains?: EthereumConfig[] | SubstrateConfig[]; - - @state({ - hasChanged: (n, o) => n !== o - }) - resources?: Resource[]; - - @state({ - hasChanged: (n, o) => n !== o - }) - selectedAmount?: number; - - @state({ - hasChanged: (n, o) => n !== o - }) - selectedToken?: Pick; - - @state() - selectedTokenAddress?: string; - - @state() - tokenBalance?: string; - - @state() - tokenName?: string; - } - - return Mixin as Constructor & T; -}; - -export default WidgetMixin; diff --git a/packages/widget/src/components/widget-app/widget-view.ts b/packages/widget/src/components/widget-app/widget-view.ts deleted file mode 100644 index 5843dd58..00000000 --- a/packages/widget/src/components/widget-app/widget-view.ts +++ /dev/null @@ -1,151 +0,0 @@ -import type { - EthereumConfig, - Resource, - SubstrateConfig -} from '@buildwithsygma/sygma-sdk-core'; -import type { HTMLTemplateResult } from 'lit'; -import { LitElement, html } from 'lit'; -import { customElement, property, state } from 'lit/decorators.js'; -import { when } from 'lit/directives/when.js'; -import { switchNetworkIcon, sygmaLogo } from '../../assets'; -import '../network-selector'; -import '../amount-selector'; -import type { WalletManagerController } from '../../controllers'; -import { styles } from './styles'; - -@customElement('widget-view') -export class WidgetView extends LitElement { - static styles = styles; - @property({ - type: Number - }) - chainId?: number; - - @property({ - type: Object - }) - domains?: EthereumConfig[] | SubstrateConfig[]; - - @property({ - type: Object - }) - homechain?: EthereumConfig | SubstrateConfig; - - @property({ - type: Number - }) - selectedNetworkChainId?: number; - - @property({ - type: Object - }) - destinationDomains?: EthereumConfig[] | SubstrateConfig[]; - - @property({ - type: Object - }) - resources?: Resource[]; - - @property({ - type: Number - }) - selectedAmount?: number; - - @property({ - type: Object - }) - selectedToken?: Pick; - - @property({ - type: Object - }) - handleTransfer?: (e: Event) => void; - - @property({ - type: Object - }) - walletManager?: WalletManagerController; - - @property({ - type: Number - }) - tokenBalance?: string; - - @state() - connectionInitialized: boolean = false; - - initConnect = (): void => { - this.connectionInitialized = true; - dispatchEvent( - new CustomEvent('connectionInitialized', { - detail: { connectionInitialized: this.connectionInitialized }, - bubbles: true, - composed: true - }) - ); - }; - - render(): HTMLTemplateResult { - return html` -
-
-
- ${switchNetworkIcon} - Switch Network -
-
- -
-
- -
-
- - -
-
- Transfer to the same address -
-
- ${when( - !this.walletManager || !this.walletManager.accountData, - () => - html``, - () => - html` ` - )} -
-
- ${sygmaLogo} - Powered by Sygma -
-
- - `; - } -} diff --git a/packages/widget/src/controllers/index.ts b/packages/widget/src/controllers/index.ts index 0b2b6a63..392cfeb8 100644 --- a/packages/widget/src/controllers/index.ts +++ b/packages/widget/src/controllers/index.ts @@ -1,2 +1 @@ export * from './wallet-manager'; -export * from './sdk-manager'; diff --git a/packages/widget/src/controllers/sdk-manager/SdkManager.ts b/packages/widget/src/controllers/sdk-manager/SdkManager.ts deleted file mode 100644 index 433206a0..00000000 --- a/packages/widget/src/controllers/sdk-manager/SdkManager.ts +++ /dev/null @@ -1,128 +0,0 @@ -import type { - EvmFee, - Fungible, - Transfer -} from '@buildwithsygma/sygma-sdk-core'; -import { EVMAssetTransfer, Environment } from '@buildwithsygma/sygma-sdk-core'; -import type { - BaseProvider, - TransactionRequest -} from '@ethersproject/providers'; -import type { UnsignedTransaction } from '@ethersproject/transactions'; -import type { Signer } from 'ethers'; -import type { SdkManagerState, SdkManagerStatus } from './types'; - -export class SdkManager implements SdkManagerState { - assetTransfer: EVMAssetTransfer; - status: SdkManagerStatus; - transfer?: Transfer; - fee?: EvmFee; - approvalTxs?: UnsignedTransaction[]; - depositTx?: UnsignedTransaction; - - constructor() { - this.assetTransfer = new EVMAssetTransfer(); - this.status = 'idle'; - } - - async checkSourceNetwork(provider: BaseProvider): Promise { - const providerChainId = (await provider.getNetwork()).chainId; - const validEnvDomains = this.assetTransfer.config - .getDomains() - .map((domain) => domain.chainId); - - if (!validEnvDomains.includes(providerChainId)) { - this.status = 'invalidSourceNetwork'; - } else { - this.status = 'initialized'; - } - } - - async initializeSdk( - provider: BaseProvider, - env: Environment = Environment.MAINNET - ): Promise { - await this.assetTransfer.init(provider, env); - await this.checkSourceNetwork(provider); - } - - async initializeTransfer( - fromAddress: string, - destinationChainId: number, - destinationAddress: string, - resourceId: string, - amount: string - ): Promise { - const transfer = await this.assetTransfer.createFungibleTransfer( - fromAddress, - destinationChainId, - destinationAddress, - resourceId, - amount - ); - - const fee = await this.assetTransfer.getFee(transfer); - - const approvals = await this.assetTransfer.buildApprovals(transfer, fee); - - this.transfer = transfer; - this.fee = fee; - this.approvalTxs = approvals; - this.status = - approvals.length > 0 ? 'transferCreated' : 'approvalsCompleted'; - - this.depositTx = await this.assetTransfer.buildTransferTransaction( - transfer, - fee - ); - } - - async performApprovals(signer: Signer): Promise { - if (!this.transfer) { - throw new Error('No transfer'); - } - - if (!this.approvalTxs) { - throw new Error('No approvals'); - } - - if (!this.fee) { - throw new Error('No fee'); - } - - for (const approval of this.approvalTxs) { - await ( - await signer.sendTransaction(approval as TransactionRequest) - ).wait(); - } - - const approvals = await this.assetTransfer.buildApprovals( - this.transfer, - this.fee - ); - - this.approvalTxs = approvals; - if (!approvals?.length) { - this.status = 'approvalsCompleted'; - this.depositTx = await this.assetTransfer.buildTransferTransaction( - this.transfer, - this.fee - ); - } - } - - async performDeposit(signer: Signer): Promise { - if (!this.transfer) { - throw new Error('No transfer'); - } - - if (!this.depositTx) { - throw new Error('No deposit'); - } - - await ( - await signer.sendTransaction(this.depositTx as TransactionRequest) - ).wait(); - this.status = 'deposited'; - } -} diff --git a/packages/widget/src/controllers/sdk-manager/SdkManagerContextProvider.ts b/packages/widget/src/controllers/sdk-manager/SdkManagerContextProvider.ts deleted file mode 100644 index 7fa07e27..00000000 --- a/packages/widget/src/controllers/sdk-manager/SdkManagerContextProvider.ts +++ /dev/null @@ -1,99 +0,0 @@ -import type { Environment } from '@buildwithsygma/sygma-sdk-core'; -import { consume, createContext, provide } from '@lit/context'; -import type { HTMLTemplateResult } from 'lit'; -import { LitElement, html } from 'lit'; -import { customElement, state } from 'lit/decorators.js'; -import type { WalletManagerController } from '..'; -import { WalletManagerContext } from '..'; -import { SdkManager } from './SdkManager'; -import type { SdkManagerState } from './types'; - -export const SdkManagerContext = createContext( - 'sdk-context' -); - -/** - * @name SdkManagerContextProvider - * @description This component is responsible for providing the SdkManagerController as a context to all its children. - * - * @example - * For you to consume the context objects, you need to wrap up your component with the sdk-manager-context on your render method. - * - * - * - * - * - * - */ - -@customElement('sdk-manager-context-provider') -export class SdkManagerContextProvider extends LitElement { - @consume({ context: WalletManagerContext, subscribe: true }) - @state() - walletManager?: WalletManagerController; - - @provide({ context: SdkManagerContext }) - @state() - sdkManager?: SdkManager; - - constructor() { - super(); - this.sdkManager = new SdkManager(); - } - - async initializeSdk(env?: Environment): Promise { - if (!this.walletManager?.provider) { - throw new Error('No wallet connected'); - } - - await this.sdkManager?.initializeSdk(this.walletManager.provider, env); - } - - async initializeTransfer( - fromAddress: string, - destinationChainId: number, - destinationAddress: string, - resourceId: string, - amount: string - ): Promise { - if (!this.walletManager?.provider) { - throw new Error('No wallet connected'); - } - - if (!this.sdkManager) { - throw new Error('SdkManager not initialized'); - } - - if (this.sdkManager.status !== 'initialized') { - throw new Error('SdkManager not initialized'); - } - - await this.sdkManager.initializeTransfer( - fromAddress, - destinationChainId, - destinationAddress, - resourceId, - amount - ); - } - - connectedCallback(): void { - super.connectedCallback(); - - this.walletManager?.addAccountChangedEventListener(() => { - this.requestUpdate(); - }); - - this.walletManager?.addChainChangedEventListener(() => { - const provider = this.walletManager?.evmWallet?.web3Provider; - if (provider) { - void this.sdkManager?.checkSourceNetwork(provider); - } - this.requestUpdate(); - }); - } - - render(): HTMLTemplateResult { - return html``; - } -} diff --git a/packages/widget/src/controllers/sdk-manager/index.ts b/packages/widget/src/controllers/sdk-manager/index.ts deleted file mode 100644 index 97cf66a1..00000000 --- a/packages/widget/src/controllers/sdk-manager/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { - SdkManagerContext, - SdkManagerContextProvider -} from './SdkManagerContextProvider'; - -export { SdkManager } from './SdkManager'; - -export type { SdkManagerState, SdkManagerStatus } from './types/index'; diff --git a/packages/widget/src/controllers/sdk-manager/types/SdkManagerState.ts b/packages/widget/src/controllers/sdk-manager/types/SdkManagerState.ts deleted file mode 100644 index f00fade6..00000000 --- a/packages/widget/src/controllers/sdk-manager/types/SdkManagerState.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { - EVMAssetTransfer, - Environment, - EvmFee, - Fungible, - Transfer -} from '@buildwithsygma/sygma-sdk-core'; -import type { BaseProvider } from '@ethersproject/providers'; -import type { UnsignedTransaction } from '@ethersproject/transactions'; -import type { Signer } from 'ethers'; -import type { SdkManagerStatus } from './SdkManagerStatus'; - -export type SdkManagerState = { - assetTransfer: EVMAssetTransfer; - status: SdkManagerStatus; - transfer?: Transfer; - fee?: EvmFee; - approvalTxs?: UnsignedTransaction[]; - depositTx?: UnsignedTransaction; - - initializeSdk: (provider: BaseProvider, env?: Environment) => Promise; - initializeTransfer: ( - fromAddress: string, - destinationChainId: number, - destinationAddress: string, - resourceId: string, - amount: string - ) => Promise; - - performApprovals(signer: Signer): Promise; - performDeposit(signer: Signer): Promise; - checkSourceNetwork(provider: BaseProvider): Promise; -}; diff --git a/packages/widget/src/controllers/sdk-manager/types/SdkManagerStatus.ts b/packages/widget/src/controllers/sdk-manager/types/SdkManagerStatus.ts deleted file mode 100644 index ddbfe0af..00000000 --- a/packages/widget/src/controllers/sdk-manager/types/SdkManagerStatus.ts +++ /dev/null @@ -1,8 +0,0 @@ -export type SdkManagerStatus = - | 'idle' - | 'invalidSourceNetwork' - | 'initialized' - | 'transferCreated' - | 'approvalsCompleted' - | 'deposited' - | 'completed'; diff --git a/packages/widget/src/controllers/sdk-manager/types/index.ts b/packages/widget/src/controllers/sdk-manager/types/index.ts deleted file mode 100644 index 59ba173d..00000000 --- a/packages/widget/src/controllers/sdk-manager/types/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { SdkManagerState } from './SdkManagerState'; -export type { SdkManagerStatus } from './SdkManagerStatus'; diff --git a/packages/widget/src/controllers/wallet-manager/WalletManagerContext.ts b/packages/widget/src/controllers/wallet-manager/WalletManagerContext.ts deleted file mode 100644 index 39dda659..00000000 --- a/packages/widget/src/controllers/wallet-manager/WalletManagerContext.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { createContext, provide } from '@lit/context'; -import type { ApiPromise } from '@polkadot/api'; -import type { ethers } from 'ethers'; -import type { HTMLTemplateResult } from 'lit'; -import { LitElement, html } from 'lit'; -import { customElement, property, state } from 'lit/decorators.js'; -import { - WalletManagerController, - type WalletManagerController as TWalletManagerController -} from './WalletManagerController'; -import { Network } from './types'; - -export const WalletManagerContext = createContext< - TWalletManagerController | undefined ->('wallet-context'); - -export const AccountContext = createContext( - 'account-context' -); - -/** - * @name WalletManagerContextProvider - * @description This component is responsible for providing the WalletManagerController as a context to all its children. - * It also provides a synthetic event creator function that can be used to dispatch custom events. - * @example - * For you to consume the context objects, you need to wrap up your component with the wallet-manager-context on your render method. - * You can either pass a web3Provider, an apiPromise or a wssConnectionUrl to the component. - * - * Passing a web3Provider and an apiPromise - * - * - * - * - * Passing a wssConnectionUrl - * - * - * - */ -@customElement('wallet-manager-context-provider') -export class WalletManagerContextProvider extends LitElement { - @provide({ context: WalletManagerContext }) - @state() - walletManagerController?: WalletManagerController; - - @property({ type: Object }) - web3Provider?: ethers.providers.Web3Provider; - - @property({ type: Object }) - apiPromise?: ApiPromise; - - @property({ type: String }) - wssConnectionUrl?: string; - - @property({ type: String }) - network: Network; - - constructor() { - super(); - this.network = Network.EVM; - } - - connectedCallback(): void { - this.walletManagerController = new WalletManagerController( - this, - this.network, - { - web3Provider: this.web3Provider, - apiPromise: this.apiPromise, - wssConnectionUrl: this.wssConnectionUrl - } - ); - } - - render(): HTMLTemplateResult { - return html` `; - } -} diff --git a/packages/widget/src/controllers/wallet-manager/WalletManagerController.ts b/packages/widget/src/controllers/wallet-manager/WalletManagerController.ts deleted file mode 100644 index e7f356d5..00000000 --- a/packages/widget/src/controllers/wallet-manager/WalletManagerController.ts +++ /dev/null @@ -1,131 +0,0 @@ -import type { Signer } from '@ethersproject/abstract-signer'; -import type { Web3Provider } from '@ethersproject/providers'; -import type { ApiPromise } from '@polkadot/api'; -import type { ReactiveControllerHost } from 'lit'; -import type { IWalletManagerController } from './interfaces'; -import { customEVMEvents } from './interfaces'; -import type { AddChain } from './types'; -import { Network } from './types'; -import { EvmWallet, SubstrateWallet } from '.'; - -export class WalletManagerController implements IWalletManagerController { - private host: ReactiveControllerHost; - evmWallet?: EvmWallet; - substrateWallet?: SubstrateWallet; - account?: string; - substrateAccount?: string; - - constructor( - host: ReactiveControllerHost, - network: Network, - initArgument: { - web3Provider?: Web3Provider; - apiPromise?: ApiPromise; - wssConnectionUrl?: string; - } - ) { - (this.host = host).addController(this); - - if (network === Network.EVM) { - this.initWeb3Provider(initArgument.web3Provider); - } else if (network === Network.SUBSTRATE && initArgument.apiPromise) { - this.initFromApiPromise(initArgument.apiPromise); - } else if (network === Network.SUBSTRATE && initArgument.wssConnectionUrl) { - void this.initFromWssProvider(initArgument.wssConnectionUrl); - } - } - - hostDisconnected(): void { - if (this.evmWallet) { - this.evmWallet?.removeAllListeners(); - } - } - - public addAccountChangedEventListener( - callback: (account: string) => void - ): void { - this.evmWallet?.addListener( - customEVMEvents.ACCOUNT_CHANGE, - (account: string) => { - this.account = account; - callback(account); - } - ); - } - - public addChainChangedEventListener( - callback: () => void | Promise - ): void { - this.evmWallet?.addListener(customEVMEvents.CHAIN_CHANGE, () => { - this.account = this.evmWallet?.address; - void callback(); - }); - } - - public initWeb3Provider(web3Provider?: Web3Provider): void { - this.evmWallet = new EvmWallet(web3Provider); - } - - public initFromApiPromise(apiPromise: ApiPromise): void { - this.substrateWallet = SubstrateWallet.initFromApiPromise(apiPromise); - } - - public async initFromWssProvider(wssProvider: string): Promise { - this.substrateWallet = - await SubstrateWallet.initFromWssProvider(wssProvider); - } - - public async addChain({ - chainId, - chainName, - rpcUrl, - nativeCurrency - }: AddChain): Promise { - await this.evmWallet?.addChain({ - chainId, - chainName, - rpcUrl, - nativeCurrency - }); - } - - public async connectToSubstrate(): Promise { - await this.substrateWallet?.connect(); - this.substrateAccount = this.substrateWallet?.substrateAccount; - this.host.requestUpdate(); - } - - public async connectEvmWallet(): Promise { - await this.evmWallet?.connect(); - this.account = this.evmWallet?.address; - this.host.requestUpdate(); - } - - public getSigner(): Signer { - if (this.evmWallet?.signer) { - return this.evmWallet.signer; - } else { - throw new Error('EvmWallet not initialized'); - } - } - - get accountData(): string | undefined { - return this.account; - } - - get substrateAccountAddress(): string | undefined { - return this.substrateAccount; - } - - get provider(): Web3Provider | undefined { - return this.evmWallet?.web3Provider; - } - - get apiPromise(): ApiPromise | undefined { - if (this.substrateWallet) { - return this.substrateWallet.apiPromise; - } else { - throw new Error('SubstrateWallet not initialized'); - } - } -} diff --git a/packages/widget/src/controllers/wallet-manager/index.ts b/packages/widget/src/controllers/wallet-manager/index.ts index 98f7052f..aa790999 100644 --- a/packages/widget/src/controllers/wallet-manager/index.ts +++ b/packages/widget/src/controllers/wallet-manager/index.ts @@ -1,10 +1,4 @@ export { EvmWallet, SubstrateWallet } from './wallets'; -export { WalletManagerController } from './WalletManagerController'; -export { - WalletManagerContextProvider, - WalletManagerContext, - AccountContext -} from './WalletManagerContext'; -export { type SyntheticEventCreator, Network } from './types'; +export { Network, type SyntheticEventCreator } from './types'; export { syntheticEventCreator } from './utils'; diff --git a/packages/widget/src/controllers/widget.ts b/packages/widget/src/controllers/widget.ts new file mode 100644 index 00000000..90bf619a --- /dev/null +++ b/packages/widget/src/controllers/widget.ts @@ -0,0 +1,129 @@ +import type { Domain, Resource } from '@buildwithsygma/sygma-sdk-core'; +import { + Config, + EVMAssetTransfer, + Environment, + Network +} from '@buildwithsygma/sygma-sdk-core'; +import { SubstrateAssetTransfer } from '@buildwithsygma/sygma-sdk-core/substrate'; +import type { ReactiveController, ReactiveControllerHost } from 'lit'; + +export class WidgetController implements ReactiveController { + public isLoading: boolean = false; + public isReadyForTransfer: boolean = false; + public sourceNetwork?: Domain; + public destinationNetwork?: Domain; + public selectedResource?: Resource; + public resourceAmount = 0; + public supportedSourceNetworks: Domain[] = []; + public supportedDestinationNetworks: Domain[] = []; + public supportedResources: Resource[] = []; + + //@ts-expect-error it will be used + private assetTransfer?: EVMAssetTransfer | SubstrateAssetTransfer; + + private env: Environment; + private config: Config; + + host: ReactiveControllerHost; + + constructor(host: ReactiveControllerHost, options: { env?: Environment }) { + (this.host = host).addController(this); + this.env = options.env ?? Environment.MAINNET; + this.config = new Config(); + } + + hostConnected(): void { + void this.init(); + } + + hostDisconnected(): void { + this.assetTransfer = undefined; + this.sourceNetwork = undefined; + this.destinationNetwork = undefined; + this.supportedSourceNetworks = []; + this.supportedDestinationNetworks = []; + } + + private async init(): Promise { + this.isLoading = true; + this.host.requestUpdate(); + await this.config.init(1, this.env); + this.supportedSourceNetworks = this.config.getDomains(); + this.supportedDestinationNetworks = this.config.getDomains(); + this.isLoading = false; + this.host.requestUpdate(); + } + + async makeTranssaction(): Promise { + //TODO: trigger next tx from AssetTransfer class (approval or actual transfer) + } + + onConnectWallet = (): void => { + if (this.sourceNetwork) { + switch (this.sourceNetwork.type) { + case Network.EVM: + { + //init EvmWallet + } + break; + case Network.SUBSTRATE: + { + //init SubstrateWallet + } + break; + default: + throw new Error('Unsupported network type'); + } + } + }; + + onSourceNetworkSelected = (network: Domain | undefined): void => { + console.log('source', network); + //TODO: filter out supported destination networks + this.sourceNetwork = network; + if (!network) { + this.supportedResources = []; + //disconnect wallet + return; + } + switch (network.type) { + case Network.EVM: + { + this.sourceNetwork = network; + this.assetTransfer = new EVMAssetTransfer(); + } + break; + case Network.SUBSTRATE: + { + this.sourceNetwork = network; + this.assetTransfer = new SubstrateAssetTransfer(); + } + break; + default: + throw new Error('Unsupported network type'); + } + //TODO: reinit config + this.supportedResources = this.config.getDomainResources(); + this.host.requestUpdate(); + }; + + onDestinationNetworkSelected = (network: Domain | undefined): void => { + console.log('destination', network); + if (!this.sourceNetwork) { + //TODO: filter out supported source networks + } + this.destinationNetwork = network; + this.host.requestUpdate(); + }; + + onResourceSelected = (resource: Resource): void => { + console.log('resource', resource); + this.selectedResource = resource; + }; + + onResourceAmountChange = (amount: number): void => { + console.log('resource amount', amount); + this.resourceAmount = amount; + }; +} diff --git a/packages/widget/src/interfaces/index.ts b/packages/widget/src/interfaces/index.ts deleted file mode 100644 index 5b4998d1..00000000 --- a/packages/widget/src/interfaces/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { - EthereumConfig, - Resource, - SubstrateConfig -} from '@buildwithsygma/sygma-sdk-core'; -import type { SdkManager, WalletManagerController } from '../controllers'; - -export interface IWidgetMixin { - walletManager?: WalletManagerController; - sdkManager?: SdkManager; - chainId?: number; - domains?: EthereumConfig[] | SubstrateConfig[]; - homechain?: EthereumConfig | SubstrateConfig; - selectedNetworkChainId?: number; - destinationDomains?: EthereumConfig[] | SubstrateConfig[]; - resources?: Resource[]; - selectedAmount?: number; - selectedToken?: string; - selectedTokenAddress?: string; - tokenBalance?: string; - tokenName?: string; -} diff --git a/packages/widget/src/styles.ts b/packages/widget/src/styles.ts index 2e973df0..c01a006f 100644 --- a/packages/widget/src/styles.ts +++ b/packages/widget/src/styles.ts @@ -7,4 +7,95 @@ export const styles = css` font-weight: 500; src: url('https://fonts.googleapis.com/css2?family=Inter:wght@200..900'); } + .widgetContainer { + display: flex; + flex-direction: column; + align-items: center; + padding: 24px; + width: 350px; + height: 476px; + padding: 24px; + border-radius: 12px; + border: 1px solid var(--gray-100, #f3f4f6); + background: #fff; + + box-shadow: + 0px 4px 6px -1px rgba(0, 0, 0, 0.1), + 0px 2px 4px -1px rgba(0, 0, 0, 0.06); + + font-family: 'Bungee Spice'; + } + + .switchNetwork { + display: flex; + flex-direction: row; + justify-content: flex-end; + color: var(--neutral-600, #525252); + text-align: right; + font-family: Inter; + font-size: 14px; + font-style: normal; + font-weight: 500; + line-height: 18px; + } + + .switchNetwork > span:nth-child(2) { + margin-left: 4px; + } + + .actionButton { + display: flex; + width: 314px; + padding: 12px 20px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 16px; + background: var(--primary-300, #a5b4fc); + color: #ffffff; + border: none; + font-family: Inter; + font-weight: 500; + font-size: 16px; + } + + .actionButton:hover { + cursor: pointer; + } + + .actionButton:active { + background: var(--primary-500-main, #6366f1); + } + + .actionButtonReady { + display: flex; + width: 314px; + padding: 12px 20px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 16px; + background: var(--primary-500-main, #6366f1); + color: #ffffff; + border: none; + } + + .actionButtonReady:active { + background: var(--primary-300, #a5b4fc); + } + + .actionButtonReady:hover { + cursor: pointer; + } + + .poweredBy { + display: flex; + flex-direction: row; + justify-content: flex-start; + margin-top: 16px; + } + + .poweredBy > span:nth-child(2) { + margin-left: 6px; + } `; diff --git a/packages/widget/src/widget.ts b/packages/widget/src/widget.ts index 42ebf76c..c84325b0 100644 --- a/packages/widget/src/widget.ts +++ b/packages/widget/src/widget.ts @@ -1,23 +1,81 @@ import type { HTMLTemplateResult } from 'lit'; import { LitElement, html } from 'lit'; import { customElement } from 'lit/decorators.js'; -import './components/widget-app'; import { styles } from './styles'; -import { Network } from './controllers'; +import { switchNetworkIcon, sygmaLogo } from './assets'; +import { WidgetController } from './controllers/widget'; +import './components/network-selector'; +import './components/amount-selector'; @customElement('sygmaprotocol-widget') class SygmaProtocolWidget extends LitElement { static styles = styles; + private widgetController = new WidgetController(this, {}); + render(): HTMLTemplateResult { - return html` - -
- + return html` +

${this.widgetController.isLoading ? 'Loading' : ''}

+
+
{}}> +
+ ${switchNetworkIcon} + Connect Wallet +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ ${sygmaLogo} + Powered by Sygma
- - `; +
+ `; } } export { SygmaProtocolWidget }; + +declare global { + interface HTMLElementTagNameMap { + 'sygmaprotocol-widget': SygmaProtocolWidget; + } +} diff --git a/packages/widget/tests/unit/components/network-selector/network-selector.test.ts b/packages/widget/tests/unit/components/network-selector/network-selector.test.ts new file mode 100644 index 00000000..674d718c --- /dev/null +++ b/packages/widget/tests/unit/components/network-selector/network-selector.test.ts @@ -0,0 +1,56 @@ +import { getDiffableHTML } from '@open-wc/semantic-dom-diff'; +import { fixture, fixtureCleanup, oneEvent } from '@open-wc/testing-helpers'; +import { html } from 'lit'; +import { afterEach, assert, describe, it, vi } from 'vitest'; +import { NetworkSelector } from '../../../../src/components'; + +describe('network-selector component', function () { + afterEach(() => { + fixtureCleanup(); + }); + + it('is defined', () => { + const el = document.createElement('sygma-network-selector'); + assert.instanceOf(el, NetworkSelector); + }); + it('renders single default option if no network supplied', async () => { + const el = await fixture(html` + + `); + assert.equal(el.shadowRoot!.querySelectorAll('.network-option').length, 1); + assert.equal( + getDiffableHTML(el.shadowRoot!.querySelector('.selector')!), + getDiffableHTML( + `` + ) + ); + }); + it('triggers callback on network selected', async () => { + const mockNetworkSelectHandler = vi.fn(); + const network = { id: 0, chainId: 1, name: 'Test', type: 'evm' }; + const el = await fixture(html` + + `); + const networkOptions = el.shadowRoot!.querySelectorAll('.network-option'); + assert.equal(networkOptions.length, 2); + const listener = oneEvent( + el.shadowRoot!.querySelector('.selector')!, + 'change', + false + ); + (el.shadowRoot!.querySelector('.selector') as HTMLSelectElement).value = + '1'; + el.shadowRoot!.querySelector('.selector')!.dispatchEvent( + new Event('change') + ); + (networkOptions[1] as HTMLOptionElement).selected = true; + await listener; + assert.equal(mockNetworkSelectHandler.mock.calls.length, 1); + assert.deepEqual(mockNetworkSelectHandler.mock.lastCall, [network]); + }); +}); diff --git a/packages/widget/tests/unit/controllers/wallet-manager/EvmWallet.test.ts b/packages/widget/tests/unit/controllers/wallet-manager/EvmWallet.test.ts index f65b01c2..ad52ac5d 100644 --- a/packages/widget/tests/unit/controllers/wallet-manager/EvmWallet.test.ts +++ b/packages/widget/tests/unit/controllers/wallet-manager/EvmWallet.test.ts @@ -1,6 +1,6 @@ -import { ethers } from 'ethers'; import type { ExternalProvider } from '@ethersproject/providers'; -import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { ethers } from 'ethers'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { EvmWallet } from '../../../../src/controllers/wallet-manager'; describe('EvmWallet', () => { diff --git a/packages/widget/tests/unit/controllers/wallet-manager/WalletManagerController.test.ts b/packages/widget/tests/unit/controllers/wallet-manager/WalletManagerController.test.ts deleted file mode 100644 index 0b8e23ad..00000000 --- a/packages/widget/tests/unit/controllers/wallet-manager/WalletManagerController.test.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { LitElement } from 'lit'; -import type { ExternalProvider } from '@ethersproject/providers'; -import { ethers } from 'ethers'; -import { describe, it, beforeEach, vi, expect } from 'vitest'; -import { ApiPromise, WsProvider } from '@polkadot/api'; -import { - Network, - WalletManagerController -} from '../../../../src/controllers/wallet-manager'; - -class WidgetTestFixture extends LitElement { - constructor() { - super(); - } -} - -customElements.define('widget-test-fixture', WidgetTestFixture); - -describe('WalletManagerController', () => { - let walletController: WalletManagerController; - const walletTextFixture = new WidgetTestFixture(); - - beforeEach(() => { - window.ethereum = { - request: () => Promise.resolve(true), - on: vi.fn() - } as ExternalProvider & { on: () => void }; - - walletController = new WalletManagerController( - walletTextFixture, - Network.EVM, - { - web3Provider: new ethers.providers.Web3Provider(window.ethereum) - } - ); - }); - - it('should instantiate', () => { - expect(walletController).toBeInstanceOf(WalletManagerController); - }); - it('should initialize evm wallet from window', () => { - expect(walletController.evmWallet).toBeDefined(); - }); - it('should initialize evm wallet from web3 provider', () => { - const provider = new ethers.providers.Web3Provider(window.ethereum); - - walletController = new WalletManagerController( - walletTextFixture, - Network.EVM, - { - web3Provider: provider - } - ); - expect(walletController.evmWallet).toBeDefined(); - }); - //TODO: this should not connect to real network - it.skip('should initialize substrate wallet from wss provider', () => { - walletController = new WalletManagerController( - walletTextFixture, - Network.SUBSTRATE, - { - wssConnectionUrl: 'ws://someurl' - } - ); - expect(walletController.substrateWallet).toBeDefined(); - }); - - //TODO: this should not connect to real network - it.skip('should initialize substrate wallet from api promise', async () => { - const wsProvider = new WsProvider('wss://rpc.polkadot.io'); - const apiPromise = await ApiPromise.create({ provider: wsProvider }); - walletController = new WalletManagerController( - walletTextFixture, - Network.SUBSTRATE, - { - apiPromise - } - ); - expect(walletController.substrateWallet).toBeDefined(); - }); -}); diff --git a/packages/widget/tsconfig.build.json b/packages/widget/tsconfig.build.json deleted file mode 100644 index 398b6a50..00000000 --- a/packages/widget/tsconfig.build.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": ["./src/**/*"] -} diff --git a/packages/widget/tsconfig.json b/packages/widget/tsconfig.json index ca566679..d09bb43e 100644 --- a/packages/widget/tsconfig.json +++ b/packages/widget/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "rootDir": "./src", "outDir": "build", "declaration": true, "plugins": [ @@ -13,5 +12,5 @@ } ] }, - "include": ["./src/**/*", "tests"] + "include": ["./src", "./tests"] } diff --git a/packages/widget/vite.config.ts b/packages/widget/vite.config.ts index 45c4c611..bea954fd 100644 --- a/packages/widget/vite.config.ts +++ b/packages/widget/vite.config.ts @@ -1,32 +1,20 @@ /// -import { resolve } from 'path'; -import { visualizer } from 'rollup-plugin-visualizer'; -import { PluginOption, defineConfig } from 'vite'; +import { defineConfig } from 'vite'; +import dts from "vite-plugin-dts"; // https://vitejs.dev/config/ export default defineConfig({ + plugins: [ + dts({ rollupTypes: true }), + ], base: '/', build: { + sourcemap: true, outDir: 'build', lib: { entry: 'src/index.ts', formats: ['es'] }, - manifest: true, - rollupOptions: { - input: { - main: resolve(__dirname, 'index.html') - }, - plugins: [ - visualizer({ - template: 'sunburst', // or sunburst - open: false, - gzipSize: true, - brotliSize: true, - filename: 'bundle/analyse.html' // will be saved in project's root - }) as PluginOption - ] - } }, test: { environment: 'jsdom', diff --git a/yarn.lock b/yarn.lock index 98b73304..39e816f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,6 +23,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.12.11": + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" + dependencies: + "@babel/highlight": "npm:^7.23.4" + chalk: "npm:^2.4.2" + checksum: a10e843595ddd9f97faa99917414813c06214f4d9205294013e20c70fbdf4f943760da37dec1d998bf3e6fc20fa2918a47c0e987a7e458663feb7698063ad7c6 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9": version: 7.23.2 resolution: "@babel/compat-data@npm:7.23.2" @@ -81,6 +91,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: f348d5637ad70b6b54b026d6544bd9040f78d24e7ec245a0fc42293968181f6ae9879c22d89744730d246ce8ec53588f716f102addd4df8bbc79b73ea10004ac + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-validator-identifier@npm:7.22.20" @@ -95,6 +112,26 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.22.20" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + checksum: fbff9fcb2f5539289c3c097d130e852afd10d89a3a08ac0b5ebebbc055cc84a4bcc3dcfed463d488cde12dd0902ef1858279e31d7349b2e8cee43913744bda33 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/parser@npm:7.23.6" + bin: + parser: ./bin/babel-parser.js + checksum: 6f76cd5ccae1fa9bcab3525b0865c6222e9c1d22f87abc69f28c5c7b2c8816a13361f5bd06bddbd5faf903f7320a8feba02545c981468acec45d12a03db7755e + languageName: node + linkType: hard + "@babel/plugin-transform-runtime@npm:^7.5.5": version: 7.23.2 resolution: "@babel/plugin-transform-runtime@npm:7.23.2" @@ -140,6 +177,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.8.3": + version: 7.23.6 + resolution: "@babel/types@npm:7.23.6" + dependencies: + "@babel/helper-string-parser": "npm:^7.23.4" + "@babel/helper-validator-identifier": "npm:^7.22.20" + to-fast-properties: "npm:^2.0.0" + checksum: 42cefce8a68bd09bb5828b4764aa5586c53c60128ac2ac012e23858e1c179347a4aac9c66fc577994fbf57595227611c5ec8270bf0cfc94ff033bbfac0550b70 + languageName: node + linkType: hard + "@buildwithsygma/sygma-contracts@npm:2.4.1": version: 2.4.1 resolution: "@buildwithsygma/sygma-contracts@npm:2.4.1" @@ -198,6 +246,8 @@ __metadata: "@ethersproject/transactions": "npm:^5.7.0" "@lit/context": "npm:^1.1.0" "@lit/reactive-element": "npm:^2.0.3" + "@open-wc/semantic-dom-diff": "npm:^0.20.1" + "@open-wc/testing-helpers": "npm:^3.0.0" "@polkadot/api": "npm:^10.11.2" "@polkadot/extension-dapp": "npm:^0.46.6" eslint: "npm:^8.48.0" @@ -211,6 +261,7 @@ __metadata: typescript: "npm:5.2.2" vite: "npm:4.4.11" vite-plugin-clean: "npm:^1.0.0" + vite-plugin-dts: "npm:^3.7.1" vitest: "npm:^1.2.1" languageName: unknown linkType: soft @@ -1567,6 +1618,58 @@ __metadata: languageName: node linkType: hard +"@microsoft/api-extractor-model@npm:7.28.3": + version: 7.28.3 + resolution: "@microsoft/api-extractor-model@npm:7.28.3" + dependencies: + "@microsoft/tsdoc": "npm:0.14.2" + "@microsoft/tsdoc-config": "npm:~0.16.1" + "@rushstack/node-core-library": "npm:3.62.0" + checksum: 776ae84e8398358469c4d2d3798206f268e780ab03c9212f062506f149e8fa59047aefa7046334a5ef199b28c3ed5fca0c708bfa7da929f7ce86c0440ca78ce3 + languageName: node + linkType: hard + +"@microsoft/api-extractor@npm:7.39.0": + version: 7.39.0 + resolution: "@microsoft/api-extractor@npm:7.39.0" + dependencies: + "@microsoft/api-extractor-model": "npm:7.28.3" + "@microsoft/tsdoc": "npm:0.14.2" + "@microsoft/tsdoc-config": "npm:~0.16.1" + "@rushstack/node-core-library": "npm:3.62.0" + "@rushstack/rig-package": "npm:0.5.1" + "@rushstack/ts-command-line": "npm:4.17.1" + colors: "npm:~1.2.1" + lodash: "npm:~4.17.15" + resolve: "npm:~1.22.1" + semver: "npm:~7.5.4" + source-map: "npm:~0.6.1" + typescript: "npm:5.3.3" + bin: + api-extractor: bin/api-extractor + checksum: 6f1c0f770f2c26013fb1e4d382a77f923efef45fcde8e8ab951ac487697132c0548693d040fec24e257b6adcf6f607a4fcead0a15a328a7f0b8113debec8c993 + languageName: node + linkType: hard + +"@microsoft/tsdoc-config@npm:~0.16.1": + version: 0.16.2 + resolution: "@microsoft/tsdoc-config@npm:0.16.2" + dependencies: + "@microsoft/tsdoc": "npm:0.14.2" + ajv: "npm:~6.12.6" + jju: "npm:~1.4.0" + resolve: "npm:~1.19.0" + checksum: 9e8c176b68f01c8bb38e6365d5b543e471bba59fced6070d9bd35b32461fbd650c2e1a6f686e8dca0cf22bc5e7d796e4213e66bce4426c8cb9864c1f6ca6836c + languageName: node + linkType: hard + +"@microsoft/tsdoc@npm:0.14.2": + version: 0.14.2 + resolution: "@microsoft/tsdoc@npm:0.14.2" + checksum: c018857ad439144559ce34a397a29ace7cf5b24b999b8e3c1b88d878338088b3a453eaac4435beaf2c7eae13c4c0aac81e42f96f0f1d48e8d4eeb438eb3bb82f + languageName: node + linkType: hard + "@noble/curves@npm:^1.2.0": version: 1.2.0 resolution: "@noble/curves@npm:1.2.0" @@ -1653,6 +1756,44 @@ __metadata: languageName: node linkType: hard +"@open-wc/dedupe-mixin@npm:^1.4.0": + version: 1.4.0 + resolution: "@open-wc/dedupe-mixin@npm:1.4.0" + checksum: 22a1362c358b5f011e8f1b8923ad3f2287f493a7d016feeea82cae8df9357c7ebf06f7e7e2c70d9ec4bc214361335eead2ca27767d877c253544db2462fb73e5 + languageName: node + linkType: hard + +"@open-wc/scoped-elements@npm:^3.0.2": + version: 3.0.4 + resolution: "@open-wc/scoped-elements@npm:3.0.4" + dependencies: + "@open-wc/dedupe-mixin": "npm:^1.4.0" + lit: "npm:^3.0.0" + checksum: af6c4c0ea3941315c2784bcb74d5ef945b671fcc374c7870fde3992bb8acd5dfa2c670d0126284d729e1167f22ebb28fe4486ea7ec4fe7d3fdf5d460666ed085 + languageName: node + linkType: hard + +"@open-wc/semantic-dom-diff@npm:^0.20.1": + version: 0.20.1 + resolution: "@open-wc/semantic-dom-diff@npm:0.20.1" + dependencies: + "@types/chai": "npm:^4.3.1" + "@web/test-runner-commands": "npm:^0.9.0" + checksum: 7e08135d03cba5212dfc3f788fb0b66fb8f506ab5c400a02522ce9f15009116fee8679c4915669e7461065ebcb2039a34168fbdbdfdd875fbfa01abf0967b3d4 + languageName: node + linkType: hard + +"@open-wc/testing-helpers@npm:^3.0.0": + version: 3.0.0 + resolution: "@open-wc/testing-helpers@npm:3.0.0" + dependencies: + "@open-wc/scoped-elements": "npm:^3.0.2" + lit: "npm:^2.0.0 || ^3.0.0" + lit-html: "npm:^2.0.0 || ^3.0.0" + checksum: 351866397d7917228f1cc78337d55eade19a3b169194f94dd06c47adb0b0712a4c14ca67c2df55bb7303a8e02058bd8d8234fbde57b3980154597412f95cf1c3 + languageName: node + linkType: hard + "@openzeppelin/contracts@npm:^4.5.0": version: 4.9.5 resolution: "@openzeppelin/contracts@npm:4.9.5" @@ -2396,6 +2537,22 @@ __metadata: languageName: node linkType: hard +"@rollup/pluginutils@npm:^5.1.0": + version: 5.1.0 + resolution: "@rollup/pluginutils@npm:5.1.0" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^2.0.2" + picomatch: "npm:^2.3.1" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: c7bed15711f942d6fdd3470fef4105b73991f99a478605e13d41888963330a6f9e32be37e6ddb13f012bc7673ff5e54f06f59fd47109436c1c513986a8a7612d + languageName: node + linkType: hard + "@rollup/rollup-android-arm-eabi@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-android-arm-eabi@npm:4.9.5" @@ -2487,6 +2644,48 @@ __metadata: languageName: node linkType: hard +"@rushstack/node-core-library@npm:3.62.0": + version: 3.62.0 + resolution: "@rushstack/node-core-library@npm:3.62.0" + dependencies: + colors: "npm:~1.2.1" + fs-extra: "npm:~7.0.1" + import-lazy: "npm:~4.0.0" + jju: "npm:~1.4.0" + resolve: "npm:~1.22.1" + semver: "npm:~7.5.4" + z-schema: "npm:~5.0.2" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: ea75d5c3d8dc14f66300cfc66e26c57f39a9cf057321d3034889a4643a175e275c8d7a9a5524366879fc4608e5a36df7041895ae11c0e2267dc4b5a5e6e5d0b4 + languageName: node + linkType: hard + +"@rushstack/rig-package@npm:0.5.1": + version: 0.5.1 + resolution: "@rushstack/rig-package@npm:0.5.1" + dependencies: + resolve: "npm:~1.22.1" + strip-json-comments: "npm:~3.1.1" + checksum: a296125a5170dd11c37c3d679eb6e61db4d0c0741b3947902d9eab34e9ff34d5d8e94fbf6b45757141ea077029490198b7eb35d311ba46eaac5e1d4145e9780c + languageName: node + linkType: hard + +"@rushstack/ts-command-line@npm:4.17.1": + version: 4.17.1 + resolution: "@rushstack/ts-command-line@npm:4.17.1" + dependencies: + "@types/argparse": "npm:1.0.38" + argparse: "npm:~1.0.9" + colors: "npm:~1.2.1" + string-argv: "npm:~0.3.1" + checksum: 4fd27d2450a6e71139e67b33d5ecba7abbf3497e7479ab3a96666cf79f207c5a7d4ad4f8de17f43e09bed65a0f28115160a4c5486c8e64f8b472c7145a31c2d2 + languageName: node + linkType: hard + "@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.0": version: 1.1.3 resolution: "@scure/base@npm:1.1.3" @@ -2623,6 +2822,29 @@ __metadata: languageName: node linkType: hard +"@types/accepts@npm:*": + version: 1.3.7 + resolution: "@types/accepts@npm:1.3.7" + dependencies: + "@types/node": "npm:*" + checksum: 7b21efc78b98ed57063ac31588f871f11501c080cd1201ca3743cf02ee0aee74bdb5a634183bc0987dc8dc582b26316789fd203650319ccc89a66cf88311d64f + languageName: node + linkType: hard + +"@types/argparse@npm:1.0.38": + version: 1.0.38 + resolution: "@types/argparse@npm:1.0.38" + checksum: 4fc892da5df16923f48180da2d1f4562fa8b0507cf636b24780444fa0a1d7321d4dc0c0ecbee6152968823f5a2ae0d321b4f8c705a489bf1ae1245bdeb0868fd + languageName: node + linkType: hard + +"@types/babel__code-frame@npm:^7.0.2": + version: 7.0.6 + resolution: "@types/babel__code-frame@npm:7.0.6" + checksum: 6517ac6ac6b971fb0a8c6f394dc5fc5afbc90d52d85e260dcaba3abdfe97e79b783ac7c6cf05de6494520cafe3b09d934af95c8c6dbc24a62f7846110dd1f838 + languageName: node + linkType: hard + "@types/bn.js@npm:*, @types/bn.js@npm:^5.1.0, @types/bn.js@npm:^5.1.1": version: 5.1.3 resolution: "@types/bn.js@npm:5.1.3" @@ -2641,6 +2863,16 @@ __metadata: languageName: node linkType: hard +"@types/body-parser@npm:*": + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" + dependencies: + "@types/connect": "npm:*" + "@types/node": "npm:*" + checksum: aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df + languageName: node + linkType: hard + "@types/cacheable-request@npm:^6.0.1, @types/cacheable-request@npm:^6.0.2": version: 6.0.3 resolution: "@types/cacheable-request@npm:6.0.3" @@ -2653,6 +2885,65 @@ __metadata: languageName: node linkType: hard +"@types/chai@npm:^4.3.1": + version: 4.3.11 + resolution: "@types/chai@npm:4.3.11" + checksum: 0c216ac4a19bfbf8318bb104d32e50704ee2ffc4b538b976c4326e6638fee121462402caa570662227a2a218810388aadb14bdbd3d3d474ec300b00695db448a + languageName: node + linkType: hard + +"@types/co-body@npm:^6.1.0": + version: 6.1.3 + resolution: "@types/co-body@npm:6.1.3" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + checksum: 3a716829b7c8fa5b3d18bc47b98756d60b2ebc302ec90601e1ac1aed34bcc1f7ee88f379b2531837a42902d14362bfa29c9ddc2a39bbc8030afc26d66e671b0d + languageName: node + linkType: hard + +"@types/connect@npm:*": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" + dependencies: + "@types/node": "npm:*" + checksum: 2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c + languageName: node + linkType: hard + +"@types/content-disposition@npm:*": + version: 0.5.8 + resolution: "@types/content-disposition@npm:0.5.8" + checksum: f10baeab2ec44579012c1170763851687e740ea30531a80cd7a403475730ce7d7ead4f88927cea6970cc2d5e74fa7af38cdf4f039c5f115fba1bb98ec0014977 + languageName: node + linkType: hard + +"@types/convert-source-map@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/convert-source-map@npm:2.0.3" + checksum: 43dd8ccad61489c245342220db74c1baf3b75586074f99609943fe1bdecf7d5dcff0acd038cb0063dd7533a90cc980101d5899afa70a638883752ad8d66de20b + languageName: node + linkType: hard + +"@types/cookies@npm:*": + version: 0.7.10 + resolution: "@types/cookies@npm:0.7.10" + dependencies: + "@types/connect": "npm:*" + "@types/express": "npm:*" + "@types/keygrip": "npm:*" + "@types/node": "npm:*" + checksum: 09f245abbcd9e348ef8a5747a1a7210b21412124cf69add28313f0ac34ad73bc23c03ea8b83aa1708dd1a8e1bbc65bfc167eb9ae8324ecbedc3ec168e2fda2bf + languageName: node + linkType: hard + +"@types/debounce@npm:^1.2.0": + version: 1.2.4 + resolution: "@types/debounce@npm:1.2.4" + checksum: 89db97397312b1273be74b326133af4744e5f63b726016bb6eb5c31b94f07a2f3bd3fb5bc3a3667bce506f01ede46c9abbfb88a4745ee9f34641fb636ab51210 + languageName: node + linkType: hard + "@types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" @@ -2669,6 +2960,37 @@ __metadata: languageName: node linkType: hard +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.17.41 + resolution: "@types/express-serve-static-core@npm:4.17.41" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: dc166cbf4475c00a81fbcab120bf7477c527184be11ae149df7f26d9c1082114c68f8d387a2926fe80291b06477c8bbd9231ff4f5775de328e887695aefce269 + languageName: node + linkType: hard + +"@types/express@npm:*": + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^4.17.33" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 12e562c4571da50c7d239e117e688dc434db1bac8be55613294762f84fd77fbd0658ccd553c7d3ab02408f385bc93980992369dd30e2ecd2c68c358e6af8fabf + languageName: node + linkType: hard + +"@types/http-assert@npm:*": + version: 1.5.5 + resolution: "@types/http-assert@npm:1.5.5" + checksum: 02e7ba584d6d14bdb4dad05dd36ecbc4a2f4209472287e6d558e222c93182214445a0c6cd096f114bfc88446be03d82ef6db24ecda13922b0d697918c76b4067 + languageName: node + linkType: hard + "@types/http-cache-semantics@npm:*": version: 4.0.3 resolution: "@types/http-cache-semantics@npm:4.0.3" @@ -2676,6 +2998,38 @@ __metadata: languageName: node linkType: hard +"@types/http-errors@npm:*": + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.3": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "npm:*" + checksum: 247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "npm:*" + checksum: 1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.12": version: 7.0.14 resolution: "@types/json-schema@npm:7.0.14" @@ -2690,6 +3044,13 @@ __metadata: languageName: node linkType: hard +"@types/keygrip@npm:*": + version: 1.0.6 + resolution: "@types/keygrip@npm:1.0.6" + checksum: 1045a79913259f539ac1d04384ea8f61cf29f1d299040eb4b67d92304ec3bcea59b7e4b83cf95a73aa251ff62e55924e380d0c563a21fe8f6e91de20cc610386 + languageName: node + linkType: hard + "@types/keyv@npm:^3.1.4": version: 3.1.4 resolution: "@types/keyv@npm:3.1.4" @@ -2699,6 +3060,45 @@ __metadata: languageName: node linkType: hard +"@types/koa-compose@npm:*": + version: 3.2.8 + resolution: "@types/koa-compose@npm:3.2.8" + dependencies: + "@types/koa": "npm:*" + checksum: f2bfb7376c1e9075e8df7a46a5fce073159b01b94ec7dcca6e9f68627d48ea86a726bcfbd06491e1c99f68c0f27b8174b498081f9a3e4f976694452b5d0b5f01 + languageName: node + linkType: hard + +"@types/koa@npm:*, @types/koa@npm:^2.11.6": + version: 2.14.0 + resolution: "@types/koa@npm:2.14.0" + dependencies: + "@types/accepts": "npm:*" + "@types/content-disposition": "npm:*" + "@types/cookies": "npm:*" + "@types/http-assert": "npm:*" + "@types/http-errors": "npm:*" + "@types/keygrip": "npm:*" + "@types/koa-compose": "npm:*" + "@types/node": "npm:*" + checksum: 783536ea905244ec8edcda5f6063f34b3f4bfe16ff75f4d8faaa9b3ce58455ff140b20e63064a31491c1e7f34de4e869bce410fb116012887b9792c98591f744 + languageName: node + linkType: hard + +"@types/mime@npm:*": + version: 3.0.4 + resolution: "@types/mime@npm:3.0.4" + checksum: db478bc0f99e40f7b3e01d356a9bdf7817060808a294978111340317bcd80ca35382855578c5b60fbc84ae449674bd9bb38427b18417e1f8f19e4f72f8b242cd + languageName: node + linkType: hard + +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc + languageName: node + linkType: hard + "@types/node@npm:*": version: 20.8.8 resolution: "@types/node@npm:20.8.8" @@ -2715,6 +3115,13 @@ __metadata: languageName: node linkType: hard +"@types/parse5@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/parse5@npm:6.0.3" + checksum: a7c7ef6625974b74b93c1105953003a2291897e453369efcadc569b907de2784d61d4e6905de3ef959fa07f3278f41ed0c22ead0173776023fc43b6ed31042d0 + languageName: node + linkType: hard + "@types/pbkdf2@npm:^3.0.0": version: 3.1.1 resolution: "@types/pbkdf2@npm:3.1.1" @@ -2724,6 +3131,20 @@ __metadata: languageName: node linkType: hard +"@types/qs@npm:*": + version: 6.9.11 + resolution: "@types/qs@npm:6.9.11" + checksum: 657a50f05b694d6fd3916d24177cfa0f3b8b87d9deff4ffa4dddcb0b03583ebf7c47b424b8de400270fb9a5cc1e9cf790dd82c833c6935305851e7da8ede3ff5 + languageName: node + linkType: hard + +"@types/range-parser@npm:*": + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c + languageName: node + linkType: hard + "@types/responselike@npm:^1.0.0": version: 1.0.2 resolution: "@types/responselike@npm:1.0.2" @@ -2749,6 +3170,27 @@ __metadata: languageName: node linkType: hard +"@types/send@npm:*": + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" + dependencies: + "@types/mime": "npm:^1" + "@types/node": "npm:*" + checksum: 7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c + languageName: node + linkType: hard + +"@types/serve-static@npm:*": + version: 1.15.5 + resolution: "@types/serve-static@npm:1.15.5" + dependencies: + "@types/http-errors": "npm:*" + "@types/mime": "npm:*" + "@types/node": "npm:*" + checksum: 811d1a2f7e74a872195e7a013bcd87a2fb1edf07eaedcb9dcfd20c1eb4bc56ad4ea0d52141c13192c91ccda7c8aeb8a530d8a7e60b9c27f5990d7e62e0fecb03 + languageName: node + linkType: hard + "@types/trusted-types@npm:^2.0.2": version: 2.0.5 resolution: "@types/trusted-types@npm:2.0.5" @@ -2782,6 +3224,15 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^7.4.0": + version: 7.4.7 + resolution: "@types/ws@npm:7.4.7" + dependencies: + "@types/node": "npm:*" + checksum: f1f53febd8623a85cef2652949acd19d83967e350ea15a851593e3033501750a1e04f418552e487db90a3d48611a1cff3ffcf139b94190c10f2fd1e1dc95ff10 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^6.4.0": version: 6.19.0 resolution: "@typescript-eslint/eslint-plugin@npm:6.19.0" @@ -2966,6 +3417,34 @@ __metadata: languageName: node linkType: hard +"@volar/language-core@npm:1.11.1, @volar/language-core@npm:~1.11.1": + version: 1.11.1 + resolution: "@volar/language-core@npm:1.11.1" + dependencies: + "@volar/source-map": "npm:1.11.1" + checksum: 92c4439e3a9ccc534c970031388c318740f6fa032283d03e136c6c8c0228f549c68a7c363af1a28252617a0dca6069e14028329ac906d5acf1912931d0cdcb69 + languageName: node + linkType: hard + +"@volar/source-map@npm:1.11.1, @volar/source-map@npm:~1.11.1": + version: 1.11.1 + resolution: "@volar/source-map@npm:1.11.1" + dependencies: + muggle-string: "npm:^0.3.1" + checksum: 0bfc639889802705f8036ea8b2052a95a4d691a68bc2b6744ba8b9d312d887393dd3278101180a5ee5304972899d493972a483afafd41e097968746c77d724cb + languageName: node + linkType: hard + +"@volar/typescript@npm:~1.11.1": + version: 1.11.1 + resolution: "@volar/typescript@npm:1.11.1" + dependencies: + "@volar/language-core": "npm:1.11.1" + path-browserify: "npm:^1.0.1" + checksum: 86fe153db3a14d8eb3632784a1d7fcbfbfb51fa5517c3878bfdd49ee8d15a83b1a09f9c589454b7396454c104d3a8e2db3a987dc99b37c33816772fc3e292bf2 + languageName: node + linkType: hard + "@vscode/web-custom-data@npm:^0.4.2": version: 0.4.8 resolution: "@vscode/web-custom-data@npm:0.4.8" @@ -2973,6 +3452,147 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-core@npm:3.4.15": + version: 3.4.15 + resolution: "@vue/compiler-core@npm:3.4.15" + dependencies: + "@babel/parser": "npm:^7.23.6" + "@vue/shared": "npm:3.4.15" + entities: "npm:^4.5.0" + estree-walker: "npm:^2.0.2" + source-map-js: "npm:^1.0.2" + checksum: 151dd9c1a4fae826c53ec60536d14298266baf81f8ed1729b1cbcd082d06410234ee951336c5f43aeaf00febafc0fdd7f82934d747a052b7435be0c2e89b8f2e + languageName: node + linkType: hard + +"@vue/compiler-dom@npm:^3.3.0": + version: 3.4.15 + resolution: "@vue/compiler-dom@npm:3.4.15" + dependencies: + "@vue/compiler-core": "npm:3.4.15" + "@vue/shared": "npm:3.4.15" + checksum: d9339ca83f4e2e8fe21435c278e28b8551650d6ab09f0df1ba4afe983b4d692e07d753e70738dffee71e0d04af000eaafd7efebb8c4de5981b2e756ce03c3719 + languageName: node + linkType: hard + +"@vue/language-core@npm:1.8.27, @vue/language-core@npm:^1.8.26": + version: 1.8.27 + resolution: "@vue/language-core@npm:1.8.27" + dependencies: + "@volar/language-core": "npm:~1.11.1" + "@volar/source-map": "npm:~1.11.1" + "@vue/compiler-dom": "npm:^3.3.0" + "@vue/shared": "npm:^3.3.0" + computeds: "npm:^0.0.1" + minimatch: "npm:^9.0.3" + muggle-string: "npm:^0.3.1" + path-browserify: "npm:^1.0.1" + vue-template-compiler: "npm:^2.7.14" + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 2018214d8ce2643d19e8e84eddaeacddca28b2980984d7916d97f97556c3716be184cf9f8c4f506d072a11f265401e3bc0391117cf7cfcc1e4a25048f4432dc7 + languageName: node + linkType: hard + +"@vue/shared@npm:3.4.15, @vue/shared@npm:^3.3.0": + version: 3.4.15 + resolution: "@vue/shared@npm:3.4.15" + checksum: eddcc1c82e8e550d9f3d622e33fd841c0c3b5c6f04f21f1cb10d3415068daabac0746279c88031861183d75d7a082fb599eec9201757d457de177d86989a9bc7 + languageName: node + linkType: hard + +"@web/browser-logs@npm:^0.4.0": + version: 0.4.0 + resolution: "@web/browser-logs@npm:0.4.0" + dependencies: + errorstacks: "npm:^2.2.0" + checksum: 5e03c29ddca52060194e9973d1752575f3d9af15168e28f6c6aac97c64c9aec07df843fc643c011ea2183b4987160e241b7cee9f404b3753053ea3a6dc1cfaa6 + languageName: node + linkType: hard + +"@web/dev-server-core@npm:^0.7.0": + version: 0.7.0 + resolution: "@web/dev-server-core@npm:0.7.0" + dependencies: + "@types/koa": "npm:^2.11.6" + "@types/ws": "npm:^7.4.0" + "@web/parse5-utils": "npm:^2.1.0" + chokidar: "npm:^3.4.3" + clone: "npm:^2.1.2" + es-module-lexer: "npm:^1.0.0" + get-stream: "npm:^6.0.0" + is-stream: "npm:^2.0.0" + isbinaryfile: "npm:^5.0.0" + koa: "npm:^2.13.0" + koa-etag: "npm:^4.0.0" + koa-send: "npm:^5.0.1" + koa-static: "npm:^5.0.0" + lru-cache: "npm:^8.0.4" + mime-types: "npm:^2.1.27" + parse5: "npm:^6.0.1" + picomatch: "npm:^2.2.2" + ws: "npm:^7.4.2" + checksum: a546b1ebb5d0691ff6d68acdbf828d2b1aa5e35cdeb290bcecfd5004567cfcf9ee60a85781ef3dfd2f72e6168f4152c431a9109deddb251f30eb946dfc650588 + languageName: node + linkType: hard + +"@web/parse5-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "@web/parse5-utils@npm:2.1.0" + dependencies: + "@types/parse5": "npm:^6.0.1" + parse5: "npm:^6.0.1" + checksum: 9eedec69b38efd0d03640d55584e1ccc24de7818db077bd01420995014aa0bf994bd20616e4b728bc123eaca0c1572b629b29403da4c1a90c71dc91bada58667 + languageName: node + linkType: hard + +"@web/test-runner-commands@npm:^0.9.0": + version: 0.9.0 + resolution: "@web/test-runner-commands@npm:0.9.0" + dependencies: + "@web/test-runner-core": "npm:^0.13.0" + mkdirp: "npm:^1.0.4" + checksum: fa82dd1d5774228690127628d6a3edd485b55a991c80dfa957fd5825c61096a35045ed55fcf330989aee02aa43300ee534c50a02c1ef3ce3644a4e63efa821ce + languageName: node + linkType: hard + +"@web/test-runner-core@npm:^0.13.0": + version: 0.13.0 + resolution: "@web/test-runner-core@npm:0.13.0" + dependencies: + "@babel/code-frame": "npm:^7.12.11" + "@types/babel__code-frame": "npm:^7.0.2" + "@types/co-body": "npm:^6.1.0" + "@types/convert-source-map": "npm:^2.0.0" + "@types/debounce": "npm:^1.2.0" + "@types/istanbul-lib-coverage": "npm:^2.0.3" + "@types/istanbul-reports": "npm:^3.0.0" + "@web/browser-logs": "npm:^0.4.0" + "@web/dev-server-core": "npm:^0.7.0" + chokidar: "npm:^3.4.3" + cli-cursor: "npm:^3.1.0" + co-body: "npm:^6.1.0" + convert-source-map: "npm:^2.0.0" + debounce: "npm:^1.2.0" + dependency-graph: "npm:^0.11.0" + globby: "npm:^11.0.1" + ip: "npm:^1.1.5" + istanbul-lib-coverage: "npm:^3.0.0" + istanbul-lib-report: "npm:^3.0.1" + istanbul-reports: "npm:^3.0.2" + log-update: "npm:^4.0.0" + nanocolors: "npm:^0.2.1" + nanoid: "npm:^3.1.25" + open: "npm:^8.0.2" + picomatch: "npm:^2.2.2" + source-map: "npm:^0.7.3" + checksum: ec95b17c45ca28844835646fa542fb63b461cdc507cfcac1547d0e9ffa118f76874c6f9aa2b2dfb937a540b78b455491f14d1c6cf2512af6cafcd5fea710ef48 + languageName: node + linkType: hard + "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -3005,7 +3625,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:~1.3.8": +"accepts@npm:^1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -3075,7 +3695,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.3, ajv@npm:^6.12.4": +"ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:~6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -3087,6 +3707,15 @@ __metadata: languageName: node linkType: hard +"ansi-escapes@npm:^4.3.0": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" @@ -3133,6 +3762,16 @@ __metadata: languageName: node linkType: hard +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -3140,6 +3779,15 @@ __metadata: languageName: node linkType: hard +"argparse@npm:~1.0.9": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + "array-buffer-byte-length@npm:^1.0.0": version: 1.0.0 resolution: "array-buffer-byte-length@npm:1.0.0" @@ -3252,6 +3900,13 @@ __metadata: languageName: node linkType: hard +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + "async-eventemitter@npm:^0.2.2": version: 0.2.4 resolution: "async-eventemitter@npm:0.2.4" @@ -3446,6 +4101,13 @@ __metadata: languageName: node linkType: hard +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: d73d8b897238a2d3ffa5f59c0241870043aa7471335e89ea5e1ff48edb7c2d0bb471517a3e4c5c3f4c043615caa2717b5f80a5e61e07503d51dc85cb848e665d + languageName: node + linkType: hard + "blakejs@npm:^1.1.0": version: 1.2.1 resolution: "blakejs@npm:1.2.1" @@ -3549,7 +4211,7 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2": +"braces@npm:^3.0.2, braces@npm:~3.0.2": version: 3.0.2 resolution: "braces@npm:3.0.2" dependencies: @@ -3699,6 +4361,16 @@ __metadata: languageName: node linkType: hard +"cache-content-type@npm:^1.0.0": + version: 1.0.1 + resolution: "cache-content-type@npm:1.0.1" + dependencies: + mime-types: "npm:^2.1.18" + ylru: "npm:^1.2.0" + checksum: 59b50e29e64a24bb52a16e5d35b69ad27ef14313701acc5e462b0aeebf2f09ff87fb6538eb0c0f0de4de05c8a1eecaef47f455f5b4928079e68f607f816a0843 + languageName: node + linkType: hard + "cacheable-lookup@npm:^5.0.3": version: 5.0.4 resolution: "cacheable-lookup@npm:5.0.4" @@ -3814,6 +4486,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^3.4.3": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1 + languageName: node + linkType: hard + "chownr@npm:^1.1.4": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -3865,6 +4556,15 @@ __metadata: languageName: node linkType: hard +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 + languageName: node + linkType: hard + "cliui@npm:^8.0.1": version: 8.0.1 resolution: "cliui@npm:8.0.1" @@ -3885,13 +4585,32 @@ __metadata: languageName: node linkType: hard -"clone@npm:^2.0.0, clone@npm:^2.1.1": +"clone@npm:^2.0.0, clone@npm:^2.1.1, clone@npm:^2.1.2": version: 2.1.2 resolution: "clone@npm:2.1.2" checksum: ed0601cd0b1606bc7d82ee7175b97e68d1dd9b91fd1250a3617b38d34a095f8ee0431d40a1a611122dcccb4f93295b4fdb94942aa763392b5fe44effa50c2d5e languageName: node linkType: hard +"co-body@npm:^6.1.0": + version: 6.1.0 + resolution: "co-body@npm:6.1.0" + dependencies: + inflation: "npm:^2.0.0" + qs: "npm:^6.5.2" + raw-body: "npm:^2.3.3" + type-is: "npm:^1.6.16" + checksum: 54f5aa6e8dcc2961259a6e120807430d3ebe3d3f683e0e5b2747f547d142dfa045b7a0becbc46d13f0cb87b52e99b011090203b447cefc8587e4df1932aa9e2a + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 + languageName: node + linkType: hard + "color-convert@npm:^1.9.0": version: 1.9.3 resolution: "color-convert@npm:1.9.3" @@ -3924,6 +4643,13 @@ __metadata: languageName: node linkType: hard +"colors@npm:~1.2.1": + version: 1.2.5 + resolution: "colors@npm:1.2.5" + checksum: f4acebf2d2da9b4f8afb770361d14c01034bcb43add4cae493e7d186dcd7e0c5e2b440520fbfdf636e872606a0eb86b1f69fcf2f087df2876a4e222612539ee0 + languageName: node + linkType: hard + "combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -3933,6 +4659,20 @@ __metadata: languageName: node linkType: hard +"commander@npm:^9.4.1": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: 5f7784fbda2aaec39e89eb46f06a999e00224b3763dc65976e05929ec486e174fe9aac2655f03ba6a5e83875bd173be5283dc19309b7c65954701c02025b3c1d + languageName: node + linkType: hard + +"computeds@npm:^0.0.1": + version: 0.0.1 + resolution: "computeds@npm:0.0.1" + checksum: 8a8736f1f43e4a99286519785d71a10ece8f444a2fa1fc2fe1f03dedf63f3477b45094002c85a2826f7631759c9f5a00b4ace47456997f253073fc525e8983de + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -3940,7 +4680,7 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:0.5.4": +"content-disposition@npm:0.5.4, content-disposition@npm:~0.5.2": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: @@ -3960,13 +4700,20 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4, content-type@npm:~1.0.5": +"content-type@npm:^1.0.4, content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af languageName: node linkType: hard +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + "cookie-signature@npm:1.0.6": version: 1.0.6 resolution: "cookie-signature@npm:1.0.6" @@ -3981,6 +4728,16 @@ __metadata: languageName: node linkType: hard +"cookies@npm:~0.9.0": + version: 0.9.1 + resolution: "cookies@npm:0.9.1" + dependencies: + depd: "npm:~2.0.0" + keygrip: "npm:~1.1.0" + checksum: 3ffa1c0e992b62ee119adae4dd2ddd4a89166fa5434cd9bd9ff84ec4d2f14dfe2318a601280abfe32a4f64f884ec9345fb1912e488b002d188d2efa0d3919ba3 + languageName: node + linkType: hard + "core-js-compat@npm:^3.33.1": version: 3.33.1 resolution: "core-js-compat@npm:3.33.1" @@ -4135,6 +4892,20 @@ __metadata: languageName: node linkType: hard +"de-indent@npm:^1.0.2": + version: 1.0.2 + resolution: "de-indent@npm:1.0.2" + checksum: 7058ce58abd6dfc123dd204e36be3797abd419b59482a634605420f47ae97639d0c183ec5d1b904f308a01033f473673897afc2bd59bc620ebf1658763ef4291 + languageName: node + linkType: hard + +"debounce@npm:^1.2.0": + version: 1.2.1 + resolution: "debounce@npm:1.2.1" + checksum: 6c9320aa0973fc42050814621a7a8a78146c1975799b5b3cc1becf1f77ba9a5aa583987884230da0842a03f385def452fad5d60db97c3d1c8b824e38a8edf500 + languageName: node + linkType: hard + "debug@npm:2.6.9, debug@npm:^2.2.0": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -4156,7 +4927,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.2.7": +"debug@npm:^3.1.0, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -4206,6 +4977,13 @@ __metadata: languageName: node linkType: hard +"deep-equal@npm:~1.0.1": + version: 1.0.1 + resolution: "deep-equal@npm:1.0.1" + checksum: bef838ef9824e124d10335deb9c7540bfc9f2f0eab17ad1bb870d0eee83ee4e7e6f6f892e5eebc2bd82759a76676926ad5246180097e28e57752176ff7dae888 + languageName: node + linkType: hard + "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -4294,14 +5072,35 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0": +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5 + languageName: node + linkType: hard + +"depd@npm:2.0.0, depd@npm:^2.0.0, depd@npm:~2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: 58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c languageName: node linkType: hard -"destroy@npm:1.2.0": +"depd@npm:~1.1.2": + version: 1.1.2 + resolution: "depd@npm:1.1.2" + checksum: acb24aaf936ef9a227b6be6d495f0d2eb20108a9a6ad40585c5bda1a897031512fef6484e4fdbb80bd249fdaa82841fa1039f416ece03188e677ba11bcfda249 + languageName: node + linkType: hard + +"dependency-graph@npm:^0.11.0": + version: 0.11.0 + resolution: "dependency-graph@npm:0.11.0" + checksum: 9e6968d1534fdb502f7f3a25a3819b499f9d60f8389193950ed0b4d1618f1341b36b5d039f2cee256cfe10c9e8198ace16b271e370df06a93fac206e81602e7c + languageName: node + linkType: hard + +"destroy@npm:1.2.0, destroy@npm:^1.0.4": version: 1.2.0 resolution: "destroy@npm:1.2.0" checksum: bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 @@ -4420,7 +5219,7 @@ __metadata: languageName: node linkType: hard -"encodeurl@npm:~1.0.2": +"encodeurl@npm:^1.0.2, encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" checksum: f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec @@ -4445,7 +5244,7 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.4.0": +"entities@npm:^4.4.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" checksum: 5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 @@ -4477,6 +5276,13 @@ __metadata: languageName: node linkType: hard +"errorstacks@npm:^2.2.0": + version: 2.4.1 + resolution: "errorstacks@npm:2.4.1" + checksum: 5721d0fcc2f4b2f3bcedb71a767d19ea2dc04c7598ffcc547d5ad61187a36133b6b833922aadd449ebb12d7d1e68706eab0b9d1218409034e39bff48d8642df3 + languageName: node + linkType: hard + "es-abstract@npm:^1.22.1": version: 1.22.3 resolution: "es-abstract@npm:1.22.3" @@ -4524,6 +5330,13 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.0.0": + version: 1.4.1 + resolution: "es-module-lexer@npm:1.4.1" + checksum: b7260a138668554d3f0ddcc728cb4b60c2fa463f15545cf155ecbdd5450a1348952d58298a7f48642e900ee579f21d7f5304b6b3c61b3d9fc2d4b2109b5a9dff + languageName: node + linkType: hard + "es-set-tostringtag@npm:^2.0.1": version: 2.0.2 resolution: "es-set-tostringtag@npm:2.0.2" @@ -4972,7 +5785,7 @@ __metadata: languageName: node linkType: hard -"escape-html@npm:~1.0.3": +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" checksum: 524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 @@ -5238,7 +6051,7 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:^2.0.1": +"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": version: 2.0.2 resolution: "estree-walker@npm:2.0.2" checksum: 53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af @@ -5261,7 +6074,7 @@ __metadata: languageName: node linkType: hard -"etag@npm:~1.8.1": +"etag@npm:^1.8.1, etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" checksum: 12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 @@ -6104,7 +6917,7 @@ __metadata: languageName: node linkType: hard -"fresh@npm:0.5.2": +"fresh@npm:0.5.2, fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" checksum: c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a @@ -6122,6 +6935,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:~7.0.1": + version: 7.0.1 + resolution: "fs-extra@npm:7.0.1" + dependencies: + graceful-fs: "npm:^4.1.2" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 1943bb2150007e3739921b8d13d4109abdc3cc481e53b97b7ea7f77eda1c3c642e27ae49eac3af074e3496ea02fde30f411ef410c760c70a38b92e656e5da784 + languageName: node + linkType: hard + "fs-minipass@npm:^1.2.7": version: 1.2.7 resolution: "fs-minipass@npm:1.2.7" @@ -6276,7 +7100,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^5.1.2": +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -6351,7 +7175,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.1.0": +"globby@npm:^11.0.1, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -6528,6 +7352,15 @@ __metadata: languageName: node linkType: hard +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 + languageName: node + linkType: hard + "hmac-drbg@npm:^1.0.1": version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1" @@ -6548,6 +7381,23 @@ __metadata: languageName: node linkType: hard +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 + languageName: node + linkType: hard + +"http-assert@npm:^1.3.0": + version: 1.5.0 + resolution: "http-assert@npm:1.5.0" + dependencies: + deep-equal: "npm:~1.0.1" + http-errors: "npm:~1.8.0" + checksum: 7b4e631114a1a77654f9ba3feb96da305ddbdeb42112fe384b7b3249c7141e460d7177970155bea6e54e655a04850415b744b452c1fe5052eba6f4186d16b095 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -6568,6 +7418,31 @@ __metadata: languageName: node linkType: hard +"http-errors@npm:^1.6.3, http-errors@npm:^1.7.3, http-errors@npm:~1.8.0": + version: 1.8.1 + resolution: "http-errors@npm:1.8.1" + dependencies: + depd: "npm:~1.1.2" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:>= 1.5.0 < 2" + toidentifier: "npm:1.0.1" + checksum: f01aeecd76260a6fe7f08e192fcbe9b2f39ed20fc717b852669a69930167053b01790998275c6297d44f435cf0e30edd50c05223d1bec9bc484e6cf35b2d6f43 + languageName: node + linkType: hard + +"http-errors@npm:~1.6.2": + version: 1.6.3 + resolution: "http-errors@npm:1.6.3" + dependencies: + depd: "npm:~1.1.2" + inherits: "npm:2.0.3" + setprototypeof: "npm:1.1.0" + statuses: "npm:>= 1.4.0 < 2" + checksum: 17ec4046ee974477778bfdd525936c254b872054703ec2caa4d6f099566b8adade636ae6aeeacb39302c5cd6e28fb407ebd937f500f5010d0b6850750414ff78 + languageName: node + linkType: hard + "http-https@npm:^1.0.0": version: 1.0.0 resolution: "http-https@npm:1.0.0" @@ -6712,6 +7587,13 @@ __metadata: languageName: node linkType: hard +"import-lazy@npm:~4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: a3520313e2c31f25c0b06aa66d167f329832b68a4f957d7c9daf6e0fa41822b6e84948191648b9b9d8ca82f94740cdf15eecf2401a5b42cd1c33fd84f2225cca + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -6726,6 +7608,13 @@ __metadata: languageName: node linkType: hard +"inflation@npm:^2.0.0": + version: 2.1.0 + resolution: "inflation@npm:2.1.0" + checksum: aadfcb8047a7e00d644e2e195f901dd9d7266c2be2326b7f8f6a99298f14916f1e322d00108a7e2778d6e76a8dc2174ddb9ac14bcdfe4f4866dfd612b695ab5d + languageName: node + linkType: hard + "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -6743,6 +7632,13 @@ __metadata: languageName: node linkType: hard +"inherits@npm:2.0.3": + version: 2.0.3 + resolution: "inherits@npm:2.0.3" + checksum: 6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 + languageName: node + linkType: hard + "internal-slot@npm:^1.0.5": version: 1.0.6 resolution: "internal-slot@npm:1.0.6" @@ -6754,6 +7650,13 @@ __metadata: languageName: node linkType: hard +"ip@npm:^1.1.5": + version: 1.1.8 + resolution: "ip@npm:1.1.8" + checksum: ab32a5ecfa678d4c158c1381c4c6744fce89a1d793e1b6635ba79d0753c069030b672d765887b6fff55670c711dfa47475895e5d6013efbbcf04687c51cb8db9 + languageName: node + linkType: hard + "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" @@ -6798,6 +7701,15 @@ __metadata: languageName: node linkType: hard +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + languageName: node + linkType: hard + "is-boolean-object@npm:^1.1.0": version: 1.1.2 resolution: "is-boolean-object@npm:1.1.2" @@ -6815,7 +7727,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": +"is-core-module@npm:^2.1.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -6888,7 +7800,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -7065,6 +7977,13 @@ __metadata: languageName: node linkType: hard +"isbinaryfile@npm:^5.0.0": + version: 5.0.0 + resolution: "isbinaryfile@npm:5.0.0" + checksum: f8d4d863ae857eb07538cd1a81ba8c0a86ba8773e46c05a19a84d7dd10673551dd5b4c24ff3444b658cb1267df54f388a4beea54f416d69a1c9ef7addedd4cf9 + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -7086,6 +8005,34 @@ __metadata: languageName: node linkType: hard +"istanbul-lib-coverage@npm:^3.0.0": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.0.2": + version: 3.1.6 + resolution: "istanbul-reports@npm:3.1.6" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: ec3f1bdbc51b3e0b325a5b9f4ad31a247697f31001df4e81075f7980413f14da1b5adfec574fd156efd3b0464023f61320f6718efc66ee72b32d89611cef99dd + languageName: node + linkType: hard + "jackspeak@npm:^2.3.5": version: 2.3.6 resolution: "jackspeak@npm:2.3.6" @@ -7099,6 +8046,13 @@ __metadata: languageName: node linkType: hard +"jju@npm:~1.4.0": + version: 1.4.0 + resolution: "jju@npm:1.4.0" + checksum: f3f444557e4364cfc06b1abf8331bf3778b26c0c8552ca54429bc0092652172fdea26cbffe33e1017b303d5aa506f7ede8571857400efe459cb7439180e2acad + languageName: node + linkType: hard + "js-sha3@npm:0.8.0, js-sha3@npm:^0.8.0": version: 0.8.0 resolution: "js-sha3@npm:0.8.0" @@ -7113,6 +8067,13 @@ __metadata: languageName: node linkType: hard +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + "js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -7309,6 +8270,15 @@ __metadata: languageName: node linkType: hard +"keygrip@npm:~1.1.0": + version: 1.1.0 + resolution: "keygrip@npm:1.1.0" + dependencies: + tsscmp: "npm:1.0.6" + checksum: 2aceec1a1e642a0caf938044056ed67b1909cfe67a93a59b32aae2863e0f35a1a53782ecc8f9cd0e3bdb60863fa0f401ccbd257cd7dfae61915f78445139edea + languageName: node + linkType: hard + "keyv@npm:^4.0.0, keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -7318,6 +8288,91 @@ __metadata: languageName: node linkType: hard +"koa-compose@npm:^4.1.0": + version: 4.1.0 + resolution: "koa-compose@npm:4.1.0" + checksum: f1f786f994a691931148e7f38f443865bf2702af4a61610d1eea04dab79c04b1232285b59d82a0cf61c830516dd92f10ab0d009b024fcecd4098e7d296ab771a + languageName: node + linkType: hard + +"koa-convert@npm:^2.0.0": + version: 2.0.0 + resolution: "koa-convert@npm:2.0.0" + dependencies: + co: "npm:^4.6.0" + koa-compose: "npm:^4.1.0" + checksum: d3e243ceccd11524d5f4942f6ccd828a9b18a1a967c4375192aa9eedf844f790563632839f006732ce8ca720275737c65a3bab344e13b25f41fb2be451ea102c + languageName: node + linkType: hard + +"koa-etag@npm:^4.0.0": + version: 4.0.0 + resolution: "koa-etag@npm:4.0.0" + dependencies: + etag: "npm:^1.8.1" + checksum: 97515858353b3c64837b5e76d0c733623d29b9abace777eea33b124a4d6b0639ab198723bc93160d76a5cc91d59395b9914614d53719c5a7699fd5e19b015ec1 + languageName: node + linkType: hard + +"koa-send@npm:^5.0.0, koa-send@npm:^5.0.1": + version: 5.0.1 + resolution: "koa-send@npm:5.0.1" + dependencies: + debug: "npm:^4.1.1" + http-errors: "npm:^1.7.3" + resolve-path: "npm:^1.4.0" + checksum: 787a8abaf3690a86cf2e6021f1d870daba5f8393f4b4da4da74c26e7d1f7a89636fa2f251a0ec1ea75364fc81a9ef20d3c52e8e2dc7ad9f1d5053357a0db204f + languageName: node + linkType: hard + +"koa-static@npm:^5.0.0": + version: 5.0.0 + resolution: "koa-static@npm:5.0.0" + dependencies: + debug: "npm:^3.1.0" + koa-send: "npm:^5.0.0" + checksum: 4cb7a4e98506d54274658eb3565b24fcbe606bbb6916cb5ef226b2613d3ffd417dec3404000baa171f2206f2a6d29117bbe881fd26b27d54ef746d9de6de3e91 + languageName: node + linkType: hard + +"koa@npm:^2.13.0": + version: 2.15.0 + resolution: "koa@npm:2.15.0" + dependencies: + accepts: "npm:^1.3.5" + cache-content-type: "npm:^1.0.0" + content-disposition: "npm:~0.5.2" + content-type: "npm:^1.0.4" + cookies: "npm:~0.9.0" + debug: "npm:^4.3.2" + delegates: "npm:^1.0.0" + depd: "npm:^2.0.0" + destroy: "npm:^1.0.4" + encodeurl: "npm:^1.0.2" + escape-html: "npm:^1.0.3" + fresh: "npm:~0.5.2" + http-assert: "npm:^1.3.0" + http-errors: "npm:^1.6.3" + is-generator-function: "npm:^1.0.7" + koa-compose: "npm:^4.1.0" + koa-convert: "npm:^2.0.0" + on-finished: "npm:^2.3.0" + only: "npm:~0.0.2" + parseurl: "npm:^1.3.2" + statuses: "npm:^1.5.0" + type-is: "npm:^1.6.16" + vary: "npm:^1.1.2" + checksum: 018daa5d3521621699e4228de9191849083c0356e1e4abda6d96aa44fa3ee1f6a67849040c2a0b681697d1431a8232cca1e532a7246fc785257bfdf1e6ccf43a + languageName: node + linkType: hard + +"kolorist@npm:^1.8.0": + version: 1.8.0 + resolution: "kolorist@npm:1.8.0" + checksum: 73075db44a692bf6c34a649f3b4b3aea4993b84f6b754cbf7a8577e7c7db44c0bad87752bd23b0ce533f49de2244ce2ce03b7b1b667a85ae170a94782cc50f9b + languageName: node + linkType: hard + "level-codec@npm:~7.0.0": version: 7.0.1 resolution: "level-codec@npm:7.0.1" @@ -7427,6 +8482,15 @@ __metadata: languageName: node linkType: hard +"lit-html@npm:^2.0.0 || ^3.0.0, lit-html@npm:^3.1.0": + version: 3.1.1 + resolution: "lit-html@npm:3.1.1" + dependencies: + "@types/trusted-types": "npm:^2.0.2" + checksum: c4f12b0b49739b1dd83e172b20e5b8f2ad5b92a72c25aa19e3cc169823164b7aeb12fb098ef6ab1031e6ed15b4119659190832e0b066df785d903bebe6734b87 + languageName: node + linkType: hard + "lit-html@npm:^3.0.0": version: 3.0.0 resolution: "lit-html@npm:3.0.0" @@ -7447,6 +8511,17 @@ __metadata: languageName: node linkType: hard +"lit@npm:^2.0.0 || ^3.0.0, lit@npm:^3.0.0": + version: 3.1.1 + resolution: "lit@npm:3.1.1" + dependencies: + "@lit/reactive-element": "npm:^2.0.0" + lit-element: "npm:^4.0.0" + lit-html: "npm:^3.1.0" + checksum: fea579d9e7e27bf984a9dfe2b617e4c21d3bd428a38de63719797b266b1548cc3a89155bbb630f46edf337641d9d02106f749b6ca4a439daba47a1e1045937b7 + languageName: node + linkType: hard + "local-pkg@npm:^0.5.0": version: 0.5.0 resolution: "local-pkg@npm:0.5.0" @@ -7480,6 +8555,20 @@ __metadata: languageName: node linkType: hard +"lodash.get@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.get@npm:4.4.2" + checksum: 48f40d471a1654397ed41685495acb31498d5ed696185ac8973daef424a749ca0c7871bf7b665d5c14f5cc479394479e0307e781f61d5573831769593411be6e + languageName: node + linkType: hard + +"lodash.isequal@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.isequal@npm:4.5.0" + checksum: dfdb2356db19631a4b445d5f37868a095e2402292d59539a987f134a8778c62a2810c2452d11ae9e6dcac71fc9de40a6fedcb20e2952a15b431ad8b29e50e28f + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -7487,13 +8576,25 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.14": +"lodash@npm:^4.17.14, lodash@npm:~4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c languageName: node linkType: hard +"log-update@npm:^4.0.0": + version: 4.0.0 + resolution: "log-update@npm:4.0.0" + dependencies: + ansi-escapes: "npm:^4.3.0" + cli-cursor: "npm:^3.1.0" + slice-ansi: "npm:^4.0.0" + wrap-ansi: "npm:^6.2.0" + checksum: 18b299e230432a156f2535660776406d15ba8bb7817dd3eaadd58004b363756d4ecaabcd658f9949f90b62ea7d3354423be3fdeb7a201ab951ec0e8d6139af86 + languageName: node + linkType: hard + "loupe@npm:^2.3.6, loupe@npm:^2.3.7": version: 2.3.7 resolution: "loupe@npm:2.3.7" @@ -7542,6 +8643,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^8.0.4": + version: 8.0.5 + resolution: "lru-cache@npm:8.0.5" + checksum: cd95a9c38497611c5a6453de39a881f6eb5865851a2a01b5f14104ff3fee515362a7b1e7de28606028f423802910ba05bdb8ae1aa7b0d54eae70c92f0cec10b2 + languageName: node + linkType: hard + "lru-cache@npm:^9.1.1 || ^10.0.0": version: 10.0.1 resolution: "lru-cache@npm:10.0.1" @@ -7565,6 +8673,15 @@ __metadata: languageName: node linkType: hard +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: 69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 + languageName: node + linkType: hard + "make-fetch-happen@npm:^13.0.0": version: 13.0.0 resolution: "make-fetch-happen@npm:13.0.0" @@ -7684,7 +8801,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.16, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.16, mime-types@npm:^2.1.18, mime-types@npm:^2.1.27, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -7753,7 +8870,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:9.0.3, minimatch@npm:^9.0.1": +"minimatch@npm:9.0.3, minimatch@npm:^9.0.1, minimatch@npm:^9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" dependencies: @@ -7910,7 +9027,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3": +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -7966,6 +9083,13 @@ __metadata: languageName: node linkType: hard +"muggle-string@npm:^0.3.1": + version: 0.3.1 + resolution: "muggle-string@npm:0.3.1" + checksum: 489b0575fa76e30914393915a36638590052409fca2206a6bef0fb0ad7b181c1cbf99761191bfd16fe402c6f5a3164897965422fa32ef20ada1b44024ba46ab6 + languageName: node + linkType: hard + "multibase@npm:^0.7.0": version: 0.7.0 resolution: "multibase@npm:0.7.0" @@ -8023,16 +9147,14 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.6": - version: 3.3.6 - resolution: "nanoid@npm:3.3.6" - bin: - nanoid: bin/nanoid.cjs - checksum: 606b355960d0fcbe3d27924c4c52ef7d47d3b57208808ece73279420d91469b01ec1dce10fae512b6d4a8c5a5432b352b228336a8b2202a6ea68e67fa348e2ee +"nanocolors@npm:^0.2.1": + version: 0.2.13 + resolution: "nanocolors@npm:0.2.13" + checksum: ee6943a3f0d0c4579856a3400f4f50606e59007adb25cf2fe183b8df7875a123af3f7c3003d723f2366b63bec5f97a90972972fb539a3776f0c4188b5119070f languageName: node linkType: hard -"nanoid@npm:^3.3.7": +"nanoid@npm:^3.1.25, nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" bin: @@ -8041,6 +9163,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.6": + version: 3.3.6 + resolution: "nanoid@npm:3.3.6" + bin: + nanoid: bin/nanoid.cjs + checksum: 606b355960d0fcbe3d27924c4c52ef7d47d3b57208808ece73279420d91469b01ec1dce10fae512b6d4a8c5a5432b352b228336a8b2202a6ea68e67fa348e2ee + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -8174,6 +9305,13 @@ __metadata: languageName: node linkType: hard +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + "normalize-url@npm:^6.0.1": version: 6.1.0 resolution: "normalize-url@npm:6.1.0" @@ -8299,7 +9437,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1": +"on-finished@npm:2.4.1, on-finished@npm:^2.3.0": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -8317,7 +9455,7 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^5.1.2": +"onetime@npm:^5.1.0, onetime@npm:^5.1.2": version: 5.1.2 resolution: "onetime@npm:5.1.2" dependencies: @@ -8335,7 +9473,14 @@ __metadata: languageName: node linkType: hard -"open@npm:^8.4.0": +"only@npm:~0.0.2": + version: 0.0.2 + resolution: "only@npm:0.0.2" + checksum: d26b1347835a5a9b17afbd889ed60de3d3ae14cdeca5ba008d86e6bf055466a431adc731b82e1e8ab24a3b8be5b5c2cdbc16e652d231d18cc1a5752320aaf0a0 + languageName: node + linkType: hard + +"open@npm:^8.0.2, open@npm:^8.4.0": version: 8.4.2 resolution: "open@npm:8.4.2" dependencies: @@ -8477,13 +9622,20 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:~1.3.3": +"parseurl@npm:^1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 languageName: node linkType: hard +"path-browserify@npm:^1.0.1": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: 8b8c3fd5c66bd340272180590ae4ff139769e9ab79522e2eb82e3d571a89b8117c04147f65ad066dccfb42fcad902e5b7d794b3d35e0fd840491a8ddbedf8c66 + languageName: node + linkType: hard + "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -8491,7 +9643,7 @@ __metadata: languageName: node linkType: hard -"path-is-absolute@npm:^1.0.0": +"path-is-absolute@npm:1.0.1, path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" checksum: 127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 @@ -8512,7 +9664,7 @@ __metadata: languageName: node linkType: hard -"path-parse@npm:^1.0.7": +"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" checksum: 11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 @@ -8584,7 +9736,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be @@ -8800,6 +9952,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:^6.5.2": + version: 6.11.2 + resolution: "qs@npm:6.11.2" + dependencies: + side-channel: "npm:^1.0.4" + checksum: 4f95d4ff18ed480befcafa3390022817ffd3087fc65f146cceb40fc5edb9fa96cb31f648cae2fa96ca23818f0798bd63ad4ca369a0e22702fcd41379b3ab6571 + languageName: node + linkType: hard + "qs@npm:~6.5.2": version: 6.5.3 resolution: "qs@npm:6.5.3" @@ -8874,7 +10035,7 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.5.2": +"raw-body@npm:2.5.2, raw-body@npm:^2.3.3": version: 2.5.2 resolution: "raw-body@npm:2.5.2" dependencies: @@ -8943,6 +10104,15 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b + languageName: node + linkType: hard + "regenerator-runtime@npm:^0.14.0": version: 0.14.0 resolution: "regenerator-runtime@npm:0.14.0" @@ -9031,7 +10201,17 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.14.2, resolve@npm:^1.22.0, resolve@npm:^1.22.4": +"resolve-path@npm:^1.4.0": + version: 1.4.0 + resolution: "resolve-path@npm:1.4.0" + dependencies: + http-errors: "npm:~1.6.2" + path-is-absolute: "npm:1.0.1" + checksum: 7405c01e02c7c71c62f89e42eac1b876e5a1bb9c3b85e07ce674646841dd177571bca5639ff6780528bec9ff58be7b44845e69eced1d8c5d519f4c1d72c30907 + languageName: node + linkType: hard + +"resolve@npm:^1.14.2, resolve@npm:^1.22.0, resolve@npm:^1.22.4, resolve@npm:~1.22.1": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -9044,7 +10224,17 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@npm:~1.19.0": + version: 1.19.0 + resolution: "resolve@npm:1.19.0" + dependencies: + is-core-module: "npm:^2.1.0" + path-parse: "npm:^1.0.6" + checksum: 1c8afdfb88c9adab0a19b6f16756d47f5917f64047bf5a38c17aa543aae5ccca2a0631671b19ce8460a7a3e65ead98ee70e046d3056ec173d3377a27487848a8 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -9057,6 +10247,16 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A~1.19.0#optional!builtin": + version: 1.19.0 + resolution: "resolve@patch:resolve@npm%3A1.19.0#optional!builtin::version=1.19.0&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.1.0" + path-parse: "npm:^1.0.6" + checksum: 254980f60dd9fdb28b34a511e70df6e3027d9627efce86a40757eea9b87252d172829c84517554560c4541ebfe207868270c19a0f086997b41209367aa8ef74f + languageName: node + linkType: hard + "responselike@npm:^2.0.0": version: 2.0.1 resolution: "responselike@npm:2.0.1" @@ -9066,6 +10266,16 @@ __metadata: languageName: node linkType: hard +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -9362,7 +10572,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5, semver@npm:^7.5.4": +"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:~7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" dependencies: @@ -9465,6 +10675,13 @@ __metadata: languageName: node linkType: hard +"setprototypeof@npm:1.1.0": + version: 1.1.0 + resolution: "setprototypeof@npm:1.1.0" + checksum: a77b20876689c6a89c3b42f0c3596a9cae02f90fc902570cbd97198e9e8240382086c9303ad043e88cee10f61eae19f1004e51d885395a1e9bf49f9ebed12872 + languageName: node + linkType: hard + "setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -9518,7 +10735,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 @@ -9557,6 +10774,17 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 6c25678db1270d4793e0327620f1e0f9f5bea4630123f51e9e399191bc52c87d6e6de53ed33538609e5eacbd1fab769fae00f3705d08d029f02102a540648918 + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -9620,13 +10848,27 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.7.4": +"source-map@npm:^0.7.3, source-map@npm:^0.7.4": version: 0.7.4 resolution: "source-map@npm:0.7.4" checksum: dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc languageName: node linkType: hard +"source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + "sshpk@npm:^1.7.0": version: 1.18.0 resolution: "sshpk@npm:1.18.0" @@ -9671,6 +10913,13 @@ __metadata: languageName: node linkType: hard +"statuses@npm:>= 1.4.0 < 2, statuses@npm:>= 1.5.0 < 2, statuses@npm:^1.5.0": + version: 1.5.0 + resolution: "statuses@npm:1.5.0" + checksum: e433900956357b3efd79b1c547da4d291799ac836960c016d10a98f6a810b1b5c0dcc13b5a7aa609a58239b5190e1ea176ad9221c2157d2fd1c747393e6b2940 + languageName: node + linkType: hard + "std-env@npm:^3.5.0": version: 3.7.0 resolution: "std-env@npm:3.7.0" @@ -9692,6 +10941,13 @@ __metadata: languageName: node linkType: hard +"string-argv@npm:~0.3.1": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 + languageName: node + linkType: hard + "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -9820,7 +11076,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.1, strip-json-comments@npm:~3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd @@ -10064,6 +11320,13 @@ __metadata: languageName: node linkType: hard +"tsscmp@npm:1.0.6": + version: 1.0.6 + resolution: "tsscmp@npm:1.0.6" + checksum: 2f79a9455e7e3e8071995f98cdf3487ccfc91b760bec21a9abb4d90519557eafaa37246e87c92fa8bf3fef8fd30cfd0cc3c4212bb929baa9fb62494bfa4d24b2 + languageName: node + linkType: hard + "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -10117,7 +11380,14 @@ __metadata: languageName: node linkType: hard -"type-is@npm:~1.6.18": +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + +"type-is@npm:^1.6.16, type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" dependencies: @@ -10207,6 +11477,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: e33cef99d82573624fc0f854a2980322714986bc35b9cb4d1ce736ed182aeab78e2cb32b385efa493b2a976ef52c53e20d6c6918312353a91850e2b76f1ea44f + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A~5.2.0#optional!builtin": version: 5.2.2 resolution: "typescript@patch:typescript@npm%3A5.2.2#optional!builtin::version=5.2.2&hash=f3b441" @@ -10217,6 +11497,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A5.3.3#optional!builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=29ae49" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: e22df47df9b2b2f2617b8bf511a29aea3d177f9f7a0756818230a76b01cbd7da988bf55f9463aaa1a4c1ff90b80f8dc5676460d4e9dfc010572cbba59b822b0c + languageName: node + linkType: hard + "ufo@npm:^1.3.2": version: 1.3.2 resolution: "ufo@npm:1.3.2" @@ -10398,6 +11688,13 @@ __metadata: languageName: node linkType: hard +"validator@npm:^13.7.0": + version: 13.11.0 + resolution: "validator@npm:13.11.0" + checksum: 0107da3add5a4ebc6391dac103c55f6d8ed055bbcc29a4c9cbf89eacfc39ba102a5618c470bdc33c6487d30847771a892134a8c791f06ef0962dd4b7a60ae0f5 + languageName: node + linkType: hard + "varint@npm:^5.0.0": version: 5.0.2 resolution: "varint@npm:5.0.2" @@ -10405,7 +11702,7 @@ __metadata: languageName: node linkType: hard -"vary@npm:^1, vary@npm:~1.1.2": +"vary@npm:^1, vary@npm:^1.1.2, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f @@ -10448,6 +11745,26 @@ __metadata: languageName: node linkType: hard +"vite-plugin-dts@npm:^3.7.1": + version: 3.7.1 + resolution: "vite-plugin-dts@npm:3.7.1" + dependencies: + "@microsoft/api-extractor": "npm:7.39.0" + "@rollup/pluginutils": "npm:^5.1.0" + "@vue/language-core": "npm:^1.8.26" + debug: "npm:^4.3.4" + kolorist: "npm:^1.8.0" + vue-tsc: "npm:^1.8.26" + peerDependencies: + typescript: "*" + vite: "*" + peerDependenciesMeta: + vite: + optional: true + checksum: 48e82059f7f8f4c0fb59eb1331a90e4f2157be75d321fe69b069828509224a50acc45065a5e9886548c3f15765ac5e92a10dd0e731cdcf97764907cf60f6ea7e + languageName: node + linkType: hard + "vite@npm:4.4.11": version: 4.4.11 resolution: "vite@npm:4.4.11" @@ -10660,6 +11977,31 @@ __metadata: languageName: node linkType: hard +"vue-template-compiler@npm:^2.7.14": + version: 2.7.16 + resolution: "vue-template-compiler@npm:2.7.16" + dependencies: + de-indent: "npm:^1.0.2" + he: "npm:^1.2.0" + checksum: 66667ffd5095b707f169c902c4f1a011e9d5ab99fc228e4dac14eb5ca7f107ed99bff261b21578a4b391d2f3d320a8050e754404443472acad13ddaa4bd7bae2 + languageName: node + linkType: hard + +"vue-tsc@npm:^1.8.26": + version: 1.8.27 + resolution: "vue-tsc@npm:1.8.27" + dependencies: + "@volar/typescript": "npm:~1.11.1" + "@vue/language-core": "npm:1.8.27" + semver: "npm:^7.5.4" + peerDependencies: + typescript: "*" + bin: + vue-tsc: bin/vue-tsc.js + checksum: 6e6ba37eb7a0c8b9cc613225729c74edf8bd0632d265e62aca28b1969b5615b9dbe2de03aefb8aed2e26fdbd4b93f134785c8ab0095f92c2469192e2db5d09fd + languageName: node + linkType: hard + "w3c-xmlserializer@npm:^5.0.0": version: 5.0.0 resolution: "w3c-xmlserializer@npm:5.0.0" @@ -11134,6 +12476,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c + languageName: node + linkType: hard + "wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" @@ -11187,6 +12540,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^7.4.2": + version: 7.5.9 + resolution: "ws@npm:7.5.9" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: aec4ef4eb65821a7dde7b44790f8699cfafb7978c9b080f6d7a98a7f8fc0ce674c027073a78574c94786ba7112cc90fa2cc94fc224ceba4d4b1030cff9662494 + languageName: node + linkType: hard + "ws@npm:^8.14.1, ws@npm:^8.8.1": version: 8.14.2 resolution: "ws@npm:8.14.2" @@ -11333,6 +12701,13 @@ __metadata: languageName: node linkType: hard +"ylru@npm:^1.2.0": + version: 1.3.2 + resolution: "ylru@npm:1.3.2" + checksum: 1fcdf0e6428fa4be71d8b1ae96ee6134d8c6194bd23e531b755b9d90bb9c555592415dc629501fe9036dfa410e2e71d0d093e5c91625df46d8e546a29e658ebe + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" @@ -11346,3 +12721,20 @@ __metadata: checksum: 856117aa15cf5103d2a2fb173f0ab4acb12b4b4d0ed3ab249fdbbf612e55d1cadfd27a6110940e24746fb0a78cf640b522cc8bca76f30a3b00b66e90cf82abe0 languageName: node linkType: hard + +"z-schema@npm:~5.0.2": + version: 5.0.5 + resolution: "z-schema@npm:5.0.5" + dependencies: + commander: "npm:^9.4.1" + lodash.get: "npm:^4.4.2" + lodash.isequal: "npm:^4.5.0" + validator: "npm:^13.7.0" + dependenciesMeta: + commander: + optional: true + bin: + z-schema: bin/z-schema + checksum: e4c812cfe6468c19b2a21d07d4ff8fb70359062d33400b45f89017eaa3efe9d51e85963f2b115eaaa99a16b451782249bf9b1fa8b31d35cc473e7becb3e44264 + languageName: node + linkType: hard From bfa4d52d99aeb3f82bf0470ac8fbb78aaf114391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20S=CC=8Ctokovic=CC=81?= Date: Mon, 22 Jan 2024 21:04:33 +0100 Subject: [PATCH 11/41] chore: remove setting prop to default value --- packages/widget/src/widget.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/widget/src/widget.ts b/packages/widget/src/widget.ts index c84325b0..46af16ab 100644 --- a/packages/widget/src/widget.ts +++ b/packages/widget/src/widget.ts @@ -44,7 +44,6 @@ class SygmaProtocolWidget extends LitElement {
Date: Mon, 22 Jan 2024 21:04:56 +0100 Subject: [PATCH 12/41] chore: typo --- packages/widget/src/controllers/widget.ts | 2 +- packages/widget/src/widget.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/widget/src/controllers/widget.ts b/packages/widget/src/controllers/widget.ts index 90bf619a..ca9a119b 100644 --- a/packages/widget/src/controllers/widget.ts +++ b/packages/widget/src/controllers/widget.ts @@ -55,7 +55,7 @@ export class WidgetController implements ReactiveController { this.host.requestUpdate(); } - async makeTranssaction(): Promise { + async makeTransaction(): Promise { //TODO: trigger next tx from AssetTransfer class (approval or actual transfer) } diff --git a/packages/widget/src/widget.ts b/packages/widget/src/widget.ts index 46af16ab..09ff921d 100644 --- a/packages/widget/src/widget.ts +++ b/packages/widget/src/widget.ts @@ -55,7 +55,7 @@ class SygmaProtocolWidget extends LitElement {
`; } } + +declare global { + interface HTMLElementTagNameMap { + 'sygma-address-input': AddressInput; + } +} diff --git a/packages/widget/src/components/address-input/index.ts b/packages/widget/src/components/address-input/index.ts index c59ec94c..3f29279d 100644 --- a/packages/widget/src/components/address-input/index.ts +++ b/packages/widget/src/components/address-input/index.ts @@ -1 +1 @@ -export { default } from './address-input'; +export { AddressInput } from './address-input'; diff --git a/packages/widget/src/components/address-input/styles.ts b/packages/widget/src/components/address-input/styles.ts index 09939775..1401dce0 100644 --- a/packages/widget/src/components/address-input/styles.ts +++ b/packages/widget/src/components/address-input/styles.ts @@ -1,17 +1,7 @@ import { css } from 'lit'; export const styles = css` - .switcher { - --md-sys-color-primary: var(--primary-500-main, #6366f1); - --md-switch-track-color: #ffffff; - --md-switch-selected-handle-color: #ffffff; - --md-switch-track-height: 25px; - --md-switch-track-width: 45px; - --md-switch-selected-handle-height: 17px; - --md-switch-selected-handle-width: 17px; - } - - .switch-container { + .address-input-container { display: flex; flex-direction: column; justify-content: center; diff --git a/packages/widget/src/components/index.ts b/packages/widget/src/components/index.ts index 35b47082..67dd98b6 100644 --- a/packages/widget/src/components/index.ts +++ b/packages/widget/src/components/index.ts @@ -1,2 +1,3 @@ export { AmountSelector } from './amount-selector'; export { NetworkSelector } from './network-selector'; +export { AddressInput } from './address-input'; diff --git a/packages/widget/src/utils/index.ts b/packages/widget/src/utils/index.ts index 84226984..e38eee5f 100644 --- a/packages/widget/src/utils/index.ts +++ b/packages/widget/src/utils/index.ts @@ -1,5 +1,7 @@ import type { HTMLTemplateResult } from 'lit'; import { html } from 'lit'; +import { decodeAddress, encodeAddress } from '@polkadot/keyring'; +import { hexToU8a, isHex } from '@polkadot/util'; import { baseNetworkIcon, cronosNetworkIcon, @@ -46,3 +48,12 @@ export const capitalize = (s: string): string => { const rest = s.slice(1); return `${firstLetter}${rest}`; }; + +export const validatePolkadotAddress = (address: string): boolean => { + try { + encodeAddress(isHex(address) ? hexToU8a(address) : decodeAddress(address)); + return true; + } catch (error) { + return false; + } +}; diff --git a/packages/widget/tests/unit/components/address-input/address-input.test.ts b/packages/widget/tests/unit/components/address-input/address-input.test.ts new file mode 100644 index 00000000..018b243b --- /dev/null +++ b/packages/widget/tests/unit/components/address-input/address-input.test.ts @@ -0,0 +1,87 @@ +import { afterEach, assert, describe, it, vi } from 'vitest'; +import { fixture, fixtureCleanup, oneEvent } from '@open-wc/testing-helpers'; +import { html } from 'lit'; +import { AddressInput } from '../../../../src/components'; + +describe('address-input component', function () { + afterEach(() => { + fixtureCleanup(); + }); + + const handleAddress = (address: string) => console.log(address); + + it('is defined', () => { + const el = document.createElement('sygma-address-input'); + assert.instanceOf(el, AddressInput); + }); + it('renders input field with address value', async () => { + const el = await fixture(html` + + `); + + const input = el.shadowRoot!.querySelector( + '.input-address' + ) as HTMLInputElement; + + console.log(input.value); + assert.equal(input.value, '0x123'); + }); + it('triggers callback on address change and validates Substrate address', async () => { + const mockAddressChangeHandler = vi.fn(); + + const el = await fixture(html` + + `); + + const input = el.shadowRoot!.querySelector( + '.input-address' + ) as HTMLInputElement; + + const listener = oneEvent(input, 'change', false); + + input.value = '42sydUvocBuEorweEPqxY5vZae1VaTtWoJFiKMrPbRamy2BL'; + + input.dispatchEvent(new Event('change')); + + await listener; + + assert.equal(mockAddressChangeHandler.mock.calls.length, 1); + assert.deepEqual(mockAddressChangeHandler.mock.lastCall, [ + '42sydUvocBuEorweEPqxY5vZae1VaTtWoJFiKMrPbRamy2BL' + ]); + }); + + it('triggers callback on address change and validates Ethereum address', async () => { + const mockAddressChangeHandler = vi.fn(); + + const el = await fixture(html` + + `); + + const input = el.shadowRoot!.querySelector( + '.input-address' + ) as HTMLInputElement; + + const listener = oneEvent(input, 'change', false); + + input.value = '0xebFC7A970CAAbC18C8e8b7367147C18FC7585492'; + + input.dispatchEvent(new Event('change')); + + await listener; + + assert.equal(mockAddressChangeHandler.mock.calls.length, 1); + assert.deepEqual(mockAddressChangeHandler.mock.lastCall, [ + '0xebFC7A970CAAbC18C8e8b7367147C18FC7585492' + ]); + }); +}); diff --git a/yarn.lock b/yarn.lock index 39e816f1..9fabbae3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -250,6 +250,8 @@ __metadata: "@open-wc/testing-helpers": "npm:^3.0.0" "@polkadot/api": "npm:^10.11.2" "@polkadot/extension-dapp": "npm:^0.46.6" + "@polkadot/keyring": "npm:^12.6.2" + "@polkadot/util": "npm:^12.6.2" eslint: "npm:^8.48.0" eslint-plugin-lit: "npm:^1.9.1" ethers: "npm:5.7.2" From 61fc32c7fbf345bf9557bb165f5981d2294398f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Tue, 23 Jan 2024 01:55:06 -0300 Subject: [PATCH 19/41] fix: linter issue --- .../tests/unit/components/address-input/address-input.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/widget/tests/unit/components/address-input/address-input.test.ts b/packages/widget/tests/unit/components/address-input/address-input.test.ts index 018b243b..4c6798ff 100644 --- a/packages/widget/tests/unit/components/address-input/address-input.test.ts +++ b/packages/widget/tests/unit/components/address-input/address-input.test.ts @@ -8,7 +8,7 @@ describe('address-input component', function () { fixtureCleanup(); }); - const handleAddress = (address: string) => console.log(address); + const handleAddress = (address: string): string => address; it('is defined', () => { const el = document.createElement('sygma-address-input'); From 0d2919ba7ef4bec44daf51e7f299974628165b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Tue, 23 Jan 2024 10:22:41 -0300 Subject: [PATCH 20/41] Update packages/widget/src/components/address-input/address-input.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marin Petrunić --- packages/widget/src/components/address-input/address-input.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index 876233d4..bce6811b 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -14,7 +14,7 @@ export class AddressInput extends LitElement { }) address: string = ''; - @property() + @property({attribute: false}) handleAddress?: (address: string) => void; @property({ From 699050237586e87ce355178168bdfbfe6433bbe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Tue, 23 Jan 2024 21:25:53 -0300 Subject: [PATCH 21/41] feat: error msg + styling --- packages/widget/package.json | 2 +- .../components/address-input/address-input.ts | 41 +++++++++++++------ .../src/components/address-input/styles.ts | 15 +++++-- packages/widget/src/utils/index.ts | 2 +- yarn.lock | 10 ++--- 5 files changed, 47 insertions(+), 23 deletions(-) diff --git a/packages/widget/package.json b/packages/widget/package.json index 9359fc11..19cae73a 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -26,7 +26,7 @@ }, "author": "Sygmaprotocol Product Team", "dependencies": { - "@buildwithsygma/sygma-sdk-core": "^2.6.0", + "@buildwithsygma/sygma-sdk-core": "2.6.1", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/contracts": "^5.7.0", "@ethersproject/providers": "^5.7.2", diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index bce6811b..8b3349d0 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -1,9 +1,11 @@ import { LitElement, html } from 'lit'; import type { HTMLTemplateResult } from 'lit'; -import { customElement, property } from 'lit/decorators.js'; +import { customElement, property, state } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import { ethers } from 'ethers'; -import { validatePolkadotAddress } from '../../utils'; +import { Network } from '@buildwithsygma/sygma-sdk-core'; +import { when } from 'lit/directives/when.js'; +import { validateSubstrateAddress } from '../../utils'; import { styles } from './styles'; @customElement('sygma-address-input') @@ -14,38 +16,51 @@ export class AddressInput extends LitElement { }) address: string = ''; - @property({attribute: false}) + @property({ attribute: false }) handleAddress?: (address: string) => void; @property({ type: Object }) - network?: 'substrate' | 'evm'; + network: Network = Network.EVM; + + @state() + errorMessage?: string; private handleAddressChange = ({ target }: Event): void => { const { value } = target as HTMLInputElement; - if (this.network !== 'evm') { - const validPolkadotAddress = validatePolkadotAddress(value); - if (validPolkadotAddress) { - return void this.handleAddress?.(value); + if (this.errorMessage) { + this.errorMessage = undefined; + } + + if (this.network !== Network.EVM) { + const validPolkadotAddress = validateSubstrateAddress(value); + + if (!validPolkadotAddress) { + this.errorMessage = 'Invalid Substrate address'; } - // TODO: if not defined or show error } else { const isAddress = ethers.utils.isAddress(value); - if (isAddress) { - return void this.handleAddress?.(value); + if (!isAddress) { + this.errorMessage = 'Invalid Ethereum Address'; } - // TODO: if not defined or show error } + return void this.handleAddress?.(value); }; render(): HTMLTemplateResult { return html`
+ ${when( + this.errorMessage, + () => html` + ${this.errorMessage} + ` + )} this.handleAddressChange.bind(this)(evt)} diff --git a/packages/widget/src/components/address-input/styles.ts b/packages/widget/src/components/address-input/styles.ts index 1401dce0..fdf8c269 100644 --- a/packages/widget/src/components/address-input/styles.ts +++ b/packages/widget/src/components/address-input/styles.ts @@ -18,7 +18,7 @@ export const styles = css` .input-address-container { display: flex; flex-direction: column; - width: 309px; + width: 100%; height: 91px; gap: 8px; } @@ -26,9 +26,18 @@ export const styles = css` .input-address { border-radius: 24px; border: 1px solid var(--zinc-200, #e4e4e7); - width: 320px; + width: 100%; height: 35px; - font-size: 13px; + font-size: 12px; text-align: center; } + + .error { + border-color: red; + } + + .error-message { + color: red; + font-weight: 500; + } `; diff --git a/packages/widget/src/utils/index.ts b/packages/widget/src/utils/index.ts index e38eee5f..949ed3f4 100644 --- a/packages/widget/src/utils/index.ts +++ b/packages/widget/src/utils/index.ts @@ -49,7 +49,7 @@ export const capitalize = (s: string): string => { return `${firstLetter}${rest}`; }; -export const validatePolkadotAddress = (address: string): boolean => { +export const validateSubstrateAddress = (address: string): boolean => { try { encodeAddress(isHex(address) ? hexToU8a(address) : decodeAddress(address)); return true; diff --git a/yarn.lock b/yarn.lock index fbfc00d5..570eb18d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -200,9 +200,9 @@ __metadata: languageName: node linkType: hard -"@buildwithsygma/sygma-sdk-core@npm:^2.6.0": - version: 2.6.0 - resolution: "@buildwithsygma/sygma-sdk-core@npm:2.6.0" +"@buildwithsygma/sygma-sdk-core@npm:2.6.1": + version: 2.6.1 + resolution: "@buildwithsygma/sygma-sdk-core@npm:2.6.1" dependencies: "@buildwithsygma/sygma-contracts": "npm:2.4.1" "@ethersproject/abi": "npm:^5.7.0" @@ -220,7 +220,7 @@ __metadata: axios: "npm:^1.4.0" cross-fetch: "npm:^3.1.5" ethers: "npm:5.6.2" - checksum: c18a45829759e3a9db7bb8e274f22350d969d0d0c71eb91aba824a2b82496811cde41a9b65635d9d2c6e34277ec7216e426a1aa86fdf5fb068039a0c356c0dac + checksum: 6d8951247765cd11226c41a4d3f527e14d778a6b6ffa3f74b789620b7cd575fa6bb6efe6f6da7522126071c5aeda753a63ddc340813e3fb3ac8c6884cc898eea languageName: node linkType: hard @@ -239,7 +239,7 @@ __metadata: version: 0.0.0-use.local resolution: "@buildwithsygma/sygmaprotocol-widget@workspace:packages/widget" dependencies: - "@buildwithsygma/sygma-sdk-core": "npm:^2.6.0" + "@buildwithsygma/sygma-sdk-core": "npm:2.6.1" "@ethersproject/abstract-signer": "npm:^5.7.0" "@ethersproject/contracts": "npm:^5.7.0" "@ethersproject/providers": "npm:^5.7.2" From 8d9b1beb73f4131c95962c8a4d6587f459b53aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Tue, 23 Jan 2024 21:59:56 -0300 Subject: [PATCH 22/41] feat: update tests --- .../components/address-input/address-input.ts | 6 +- .../address-input/address-input.test.ts | 104 +++++++++++++++++- 2 files changed, 101 insertions(+), 9 deletions(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index 8b3349d0..0dcdddaa 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -39,11 +39,13 @@ export class AddressInput extends LitElement { if (!validPolkadotAddress) { this.errorMessage = 'Invalid Substrate address'; + return; } } else { const isAddress = ethers.utils.isAddress(value); if (!isAddress) { this.errorMessage = 'Invalid Ethereum Address'; + return; } } return void this.handleAddress?.(value); @@ -55,9 +57,7 @@ export class AddressInput extends LitElement { ${when( this.errorMessage, - () => html` - ${this.errorMessage} - ` + () => html` ${this.errorMessage} ` )} address; - it('is defined', () => { const el = document.createElement('sygma-address-input'); assert.instanceOf(el, AddressInput); }); + it('renders input field with address value', async () => { + const mockAddressChangeHandler = vi.fn(); + const el = await fixture(html` + `); + + const input = el.shadowRoot!.querySelector( + '.input-address' + ) as HTMLInputElement; + + assert.equal(input.value, '0x123'); + }); + + it('renders input field with address value and then changes triggering callback', async () => { + const mockAddressChangeHandler = vi.fn(); + + const el = await fixture(html` + `); @@ -26,10 +44,24 @@ describe('address-input component', function () { '.input-address' ) as HTMLInputElement; - console.log(input.value); assert.equal(input.value, '0x123'); + + const listener = oneEvent(input, 'change', false); + input.value = '0xebFC7A970CAAbC18C8e8b7367147C18FC7585492'; + + input.dispatchEvent(new Event('change')); + + await listener; + + assert.equal(mockAddressChangeHandler.mock.calls.length, 1); + assert.deepEqual(mockAddressChangeHandler.mock.lastCall, [ + '0xebFC7A970CAAbC18C8e8b7367147C18FC7585492' + ]); }); - it('triggers callback on address change and validates Substrate address', async () => { + + // NOTE: this is not passing due to decodeAddress call failing in validateSubstrateAddress + // it seems checksum fails when running this on jsdom env + it.skip('triggers callback on address change and validates Substrate address', async () => { const mockAddressChangeHandler = vi.fn(); const el = await fixture(html` @@ -62,7 +94,6 @@ describe('address-input component', function () { const el = await fixture(html` `); @@ -84,4 +115,65 @@ describe('address-input component', function () { '0xebFC7A970CAAbC18C8e8b7367147C18FC7585492' ]); }); + + it('displays error message when passing wrong substrate address', async () => { + const mockAddressChangeHandler = vi.fn(); + + const el = await fixture(html` + + `); + + const input = el.shadowRoot!.querySelector( + '.input-address' + ) as HTMLInputElement; + + const listener = oneEvent(input, 'change', false); + + input.value = '42sydUvocBuEorweEPqxY5vZae1VaTtWoJFiKMrPbRamy'; // invalid substrate address + + input.dispatchEvent(new Event('change')); + + await listener; + + assert.equal(mockAddressChangeHandler.mock.calls.length, 0); + + const errorMessage = el.shadowRoot!.querySelector( + '.error-message' + ) as HTMLInputElement; + + assert.equal(errorMessage.textContent, 'Invalid Substrate address'); + }); + + it('displays error message when passing wrong Ethereum address', async () => { + const mockAddressChangeHandler = vi.fn(); + + const el = await fixture(html` + + `); + + const input = el.shadowRoot!.querySelector( + '.input-address' + ) as HTMLInputElement; + + const listener = oneEvent(input, 'change', false); + + input.value = '0xebFC7A970CAAbC18C8e8b7367147C18FC7585'; // invalid eth address + + input.dispatchEvent(new Event('change')); + + await listener; + + assert.equal(mockAddressChangeHandler.mock.calls.length, 0); + + const errorMessage = el.shadowRoot!.querySelector( + '.error-message' + ) as HTMLInputElement; + + assert.equal(errorMessage.textContent, 'Invalid Ethereum Address'); + }); }); From 87b0bdfb7e90508e5de685a0f193c44a2526c39c Mon Sep 17 00:00:00 2001 From: Marin Petrunic Date: Wed, 24 Jan 2024 12:02:54 +0100 Subject: [PATCH 23/41] chore: changed tests to run on happy-dom Signed-off-by: Marin Petrunic --- packages/widget/package.json | 1 + .../address-input/address-input.test.ts | 4 +--- packages/widget/vite.config.ts | 2 +- yarn.lock | 19 +++++++++++++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/widget/package.json b/packages/widget/package.json index 19cae73a..ab5c9a0e 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -46,6 +46,7 @@ "@open-wc/testing-helpers": "^3.0.0", "eslint": "^8.48.0", "eslint-plugin-lit": "^1.9.1", + "happy-dom": "^13.3.1", "jsdom": "^23.2.0", "lit-analyzer": "^2.0.3", "rollup-plugin-visualizer": "^5.9.2", diff --git a/packages/widget/tests/unit/components/address-input/address-input.test.ts b/packages/widget/tests/unit/components/address-input/address-input.test.ts index 5fcc4a3f..de6ba138 100644 --- a/packages/widget/tests/unit/components/address-input/address-input.test.ts +++ b/packages/widget/tests/unit/components/address-input/address-input.test.ts @@ -59,9 +59,7 @@ describe('address-input component', function () { ]); }); - // NOTE: this is not passing due to decodeAddress call failing in validateSubstrateAddress - // it seems checksum fails when running this on jsdom env - it.skip('triggers callback on address change and validates Substrate address', async () => { + it('triggers callback on address change and validates Substrate address', async () => { const mockAddressChangeHandler = vi.fn(); const el = await fixture(html` diff --git a/packages/widget/vite.config.ts b/packages/widget/vite.config.ts index bea954fd..0cac4a3b 100644 --- a/packages/widget/vite.config.ts +++ b/packages/widget/vite.config.ts @@ -17,7 +17,7 @@ export default defineConfig({ }, }, test: { - environment: 'jsdom', + environment: 'happy-dom', include: ['**/*.test.ts'], exclude: ['**/node_modules/**', '**/dist/**', '**/build/**'] } diff --git a/yarn.lock b/yarn.lock index 570eb18d..c249a456 100644 --- a/yarn.lock +++ b/yarn.lock @@ -256,6 +256,7 @@ __metadata: eslint-plugin-lit: "npm:^1.9.1" ethers: "npm:5.7.2" events: "npm:^3.3.0" + happy-dom: "npm:^13.3.1" jsdom: "npm:^23.2.0" lit: "npm:3.0.0" lit-analyzer: "npm:^2.0.3" @@ -7263,6 +7264,17 @@ __metadata: languageName: node linkType: hard +"happy-dom@npm:^13.3.1": + version: 13.3.1 + resolution: "happy-dom@npm:13.3.1" + dependencies: + entities: "npm:^4.5.0" + webidl-conversions: "npm:^7.0.0" + whatwg-mimetype: "npm:^3.0.0" + checksum: e9605d17f1d5219c4fab325614c65fd8c01f244d1b0ff7714cec679fb1d00e9af74e458871999bd1fb202d84b57d6f90798358c08b2ee48fcf0a7cb406678993 + languageName: node + linkType: hard + "har-schema@npm:^2.0.0": version: 2.0.0 resolution: "har-schema@npm:2.0.0" @@ -12389,6 +12401,13 @@ __metadata: languageName: node linkType: hard +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: 323895a1cda29a5fb0b9ca82831d2c316309fede0365047c4c323073e3239067a304a09a1f4b123b9532641ab604203f33a1403b5ca6a62ef405bcd7a204080f + languageName: node + linkType: hard + "whatwg-mimetype@npm:^4.0.0": version: 4.0.0 resolution: "whatwg-mimetype@npm:4.0.0" From 53827bcf28a2c5ad7b626743a2921fe5487ff2fc Mon Sep 17 00:00:00 2001 From: Marin Petrunic Date: Wed, 24 Jan 2024 12:59:14 +0100 Subject: [PATCH 24/41] bump sygma sdk version Signed-off-by: Marin Petrunic --- packages/widget/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/widget/package.json b/packages/widget/package.json index 9481642b..66e351d4 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -27,7 +27,7 @@ }, "author": "Sygmaprotocol Product Team", "dependencies": { - "@buildwithsygma/sygma-sdk-core": "2.6.1", + "@buildwithsygma/sygma-sdk-core": "^2.6.2", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/contracts": "^5.7.0", "@ethersproject/providers": "^5.7.2", diff --git a/yarn.lock b/yarn.lock index c249a456..6e744c6e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -200,9 +200,9 @@ __metadata: languageName: node linkType: hard -"@buildwithsygma/sygma-sdk-core@npm:2.6.1": - version: 2.6.1 - resolution: "@buildwithsygma/sygma-sdk-core@npm:2.6.1" +"@buildwithsygma/sygma-sdk-core@npm:^2.6.2": + version: 2.6.2 + resolution: "@buildwithsygma/sygma-sdk-core@npm:2.6.2" dependencies: "@buildwithsygma/sygma-contracts": "npm:2.4.1" "@ethersproject/abi": "npm:^5.7.0" @@ -220,7 +220,7 @@ __metadata: axios: "npm:^1.4.0" cross-fetch: "npm:^3.1.5" ethers: "npm:5.6.2" - checksum: 6d8951247765cd11226c41a4d3f527e14d778a6b6ffa3f74b789620b7cd575fa6bb6efe6f6da7522126071c5aeda753a63ddc340813e3fb3ac8c6884cc898eea + checksum: 705bbd76fb71da7b530ac49668d5f2811dc97c38625558e7ac34ea041fd10d688ebc080dd26fccfb5b8188200a6156a52e70410cb9d64b918db808fab94e482a languageName: node linkType: hard @@ -239,7 +239,7 @@ __metadata: version: 0.0.0-use.local resolution: "@buildwithsygma/sygmaprotocol-widget@workspace:packages/widget" dependencies: - "@buildwithsygma/sygma-sdk-core": "npm:2.6.1" + "@buildwithsygma/sygma-sdk-core": "npm:^2.6.2" "@ethersproject/abstract-signer": "npm:^5.7.0" "@ethersproject/contracts": "npm:^5.7.0" "@ethersproject/providers": "npm:^5.7.2" From 952a9b9b52ca57e33e104cec16216af01e9c15f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Wed, 24 Jan 2024 10:37:04 -0300 Subject: [PATCH 25/41] chore: update test to validate prefilled address --- .../components/address-input/address-input.ts | 11 +++- .../address-input/address-input.test.ts | 54 +++++++++++++++++-- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index 0dcdddaa..c005cd3f 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -20,13 +20,22 @@ export class AddressInput extends LitElement { handleAddress?: (address: string) => void; @property({ - type: Object + type: String }) network: Network = Network.EVM; @state() errorMessage?: string; + connectedCallback(): void { + super.connectedCallback(); + if (this.address) { + this.handleAddressChange({ + target: { value: this.address } + } as unknown as Event); + } + } + private handleAddressChange = ({ target }: Event): void => { const { value } = target as HTMLInputElement; diff --git a/packages/widget/tests/unit/components/address-input/address-input.test.ts b/packages/widget/tests/unit/components/address-input/address-input.test.ts index de6ba138..a24d0e8e 100644 --- a/packages/widget/tests/unit/components/address-input/address-input.test.ts +++ b/packages/widget/tests/unit/components/address-input/address-input.test.ts @@ -1,6 +1,7 @@ import { afterEach, assert, describe, it, vi } from 'vitest'; import { fixture, fixtureCleanup, oneEvent } from '@open-wc/testing-helpers'; import { html } from 'lit'; +import { Network } from '@buildwithsygma/sygma-sdk-core'; import { AddressInput } from '../../../../src/components'; describe('address-input component', function () { @@ -18,7 +19,7 @@ describe('address-input component', function () { const el = await fixture(html` `); @@ -27,7 +28,54 @@ describe('address-input component', function () { '.input-address' ) as HTMLInputElement; + assert.equal(input.value, '0xebFC7A970CAAbC18C8e8b7367147C18FC7585492'); + + const errorMessage = el.shadowRoot!.querySelector( + '.error-message' + ) as HTMLInputElement; + + assert.equal(errorMessage, null); + }); + + it('renders input field with incorrect address value and triggers error message', async () => { + const mockAddressChangeHandler = vi.fn(); + + let el = await fixture(html` + + `); + + let input = el.shadowRoot!.querySelector( + '.input-address' + ) as HTMLInputElement; + assert.equal(input.value, '0x123'); + + let errorMessage = el.shadowRoot!.querySelector( + '.error-message' + ) as HTMLInputElement; + + assert.equal(errorMessage.textContent, 'Invalid Ethereum Address'); + + el = await fixture(html` + + `); + + input = el.shadowRoot!.querySelector('.input-address') as HTMLInputElement; + + assert.equal(input.value, '42sy'); + + errorMessage = el.shadowRoot!.querySelector( + '.error-message' + ) as HTMLInputElement; + + assert.equal(errorMessage.textContent, 'Invalid Substrate address'); }); it('renders input field with address value and then changes triggering callback', async () => { @@ -64,7 +112,7 @@ describe('address-input component', function () { const el = await fixture(html` `); @@ -119,7 +167,7 @@ describe('address-input component', function () { const el = await fixture(html` `); From 4c263c6b08ecff902d2be1fd8cd52b5a522d59fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Wed, 24 Jan 2024 10:48:25 -0300 Subject: [PATCH 26/41] feat: adding input to the widget, some styles cleanup for input component --- .../src/components/address-input/address-input.ts | 12 ++++++------ .../widget/src/components/address-input/styles.ts | 15 ++++----------- packages/widget/src/controllers/widget.ts | 6 ++++++ packages/widget/src/widget.ts | 10 ++++++++++ 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index c005cd3f..851d50c7 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -17,7 +17,7 @@ export class AddressInput extends LitElement { address: string = ''; @property({ attribute: false }) - handleAddress?: (address: string) => void; + onHandleAddress?: (address: string) => void; @property({ type: String @@ -57,19 +57,19 @@ export class AddressInput extends LitElement { return; } } - return void this.handleAddress?.(value); + return void this.onHandleAddress?.(value); }; render(): HTMLTemplateResult { - return html`
-
+ return html`
+
${when( this.errorMessage, - () => html` ${this.errorMessage} ` + () => html` ${this.errorMessage} ` )} this.handleAddressChange.bind(this)(evt)} diff --git a/packages/widget/src/components/address-input/styles.ts b/packages/widget/src/components/address-input/styles.ts index fdf8c269..8d9f28c4 100644 --- a/packages/widget/src/components/address-input/styles.ts +++ b/packages/widget/src/components/address-input/styles.ts @@ -1,21 +1,14 @@ import { css } from 'lit'; export const styles = css` - .address-input-container { + .addressInputContainer { display: flex; flex-direction: column; justify-content: center; gap: 8px; } - .switch-toggle-container { - display: flex; - flex-direction: row; - align-items: center; - gap: 10px; - } - - .input-address-container { + .inputAddressContainer { display: flex; flex-direction: column; width: 100%; @@ -23,7 +16,7 @@ export const styles = css` gap: 8px; } - .input-address { + .inputAddress { border-radius: 24px; border: 1px solid var(--zinc-200, #e4e4e7); width: 100%; @@ -36,7 +29,7 @@ export const styles = css` border-color: red; } - .error-message { + .errorMessage { color: red; font-weight: 500; } diff --git a/packages/widget/src/controllers/widget.ts b/packages/widget/src/controllers/widget.ts index ca9a119b..d13f82ff 100644 --- a/packages/widget/src/controllers/widget.ts +++ b/packages/widget/src/controllers/widget.ts @@ -18,6 +18,7 @@ export class WidgetController implements ReactiveController { public supportedSourceNetworks: Domain[] = []; public supportedDestinationNetworks: Domain[] = []; public supportedResources: Resource[] = []; + public destinatonAddress?: string = ''; //@ts-expect-error it will be used private assetTransfer?: EVMAssetTransfer | SubstrateAssetTransfer; @@ -126,4 +127,9 @@ export class WidgetController implements ReactiveController { console.log('resource amount', amount); this.resourceAmount = amount; }; + + onDestinationAddressChange = (address: string): void => { + console.log('destination address', address); + this.destinatonAddress = address; + }; } diff --git a/packages/widget/src/widget.ts b/packages/widget/src/widget.ts index c2e5cd1c..00376eca 100644 --- a/packages/widget/src/widget.ts +++ b/packages/widget/src/widget.ts @@ -6,6 +6,7 @@ import { switchNetworkIcon, sygmaLogo } from './assets'; import { WidgetController } from './controllers/widget'; import './components/network-selector'; import './components/amount-selector'; +import './components/address-input'; import { Directions } from './components/network-selector/network-selector'; @customElement('sygmaprotocol-widget') @@ -51,6 +52,15 @@ class SygmaProtocolWidget extends LitElement { >
+
+ + +
From d1a3844d3e8b95d6f0ffaac4d6c86e70728e3f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Mon, 29 Jan 2024 19:52:06 -0300 Subject: [PATCH 34/41] Update packages/widget/src/components/address-input/address-input.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Filip Štoković <59089574+sztok7@users.noreply.github.com> --- packages/widget/src/components/address-input/address-input.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index 6d2757b4..1b68df0c 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -43,7 +43,7 @@ export class AddressInput extends LitElement { this.errorMessage = undefined; } - if (value !== '') { + if (value) { if (this.network === Network.SUBSTRATE) { const validPolkadotAddress = validateSubstrateAddress(value); From a259fd71f19002ebb2509aef22bed757b1f7327b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Mon, 29 Jan 2024 20:53:56 -0300 Subject: [PATCH 35/41] chore: pr review --- packages/widget/package.json | 1 - .../components/address-input/address-input.ts | 28 +- .../src/components/address-input/styles.ts | 4 +- packages/widget/src/utils/index.ts | 29 ++ .../address-input/address-input.test.ts | 2 +- yarn.lock | 273 +----------------- 6 files changed, 46 insertions(+), 291 deletions(-) diff --git a/packages/widget/package.json b/packages/widget/package.json index 66e351d4..9140ed42 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -48,7 +48,6 @@ "eslint": "^8.48.0", "eslint-plugin-lit": "^1.9.1", "happy-dom": "^13.3.1", - "jsdom": "^23.2.0", "lit-analyzer": "^2.0.3", "rollup-plugin-visualizer": "^5.9.2", "typescript": "5.2.2", diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index 1b68df0c..3ecb8345 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -2,10 +2,9 @@ import { LitElement, html } from 'lit'; import type { HTMLTemplateResult } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; -import { ethers } from 'ethers'; import { Network } from '@buildwithsygma/sygma-sdk-core'; import { when } from 'lit/directives/when.js'; -import { validateSubstrateAddress } from '../../utils'; +import { validateAddress } from '../../utils'; import { styles } from './styles'; @customElement('sygma-address-input') @@ -43,28 +42,19 @@ export class AddressInput extends LitElement { this.errorMessage = undefined; } - if (value) { - if (this.network === Network.SUBSTRATE) { - const validPolkadotAddress = validateSubstrateAddress(value); - - if (!validPolkadotAddress) { - this.errorMessage = 'invalid Substrate address'; - return; - } - } else { - const isAddress = ethers.utils.isAddress(value); - if (!isAddress) { - this.errorMessage = 'invalid Ethereum Address'; - return; - } - } + if (!value) { + return; } - void this.onAddressChange?.(value); + this.errorMessage = validateAddress(value, this.network); + + if (!this.errorMessage) { + void this.onAddressChange(value); + } }; render(): HTMLTemplateResult { - return html`
+ return html`
${when( diff --git a/packages/widget/src/components/address-input/styles.ts b/packages/widget/src/components/address-input/styles.ts index acd4ae5e..b96dd68f 100644 --- a/packages/widget/src/components/address-input/styles.ts +++ b/packages/widget/src/components/address-input/styles.ts @@ -1,13 +1,12 @@ import { css } from 'lit'; export const styles = css` - .addressInputContainer { + .inputAddressSection { display: flex; flex-direction: column; justify-content: center; gap: 0.5rem; min-height: 7.75rem; - height: 100%; } .inputAddressContainer { @@ -15,7 +14,6 @@ export const styles = css` flex-direction: column; width: 100%; min-height: 7.75rem; - height: 100%; gap: 0.5rem; } diff --git a/packages/widget/src/utils/index.ts b/packages/widget/src/utils/index.ts index 949ed3f4..ec68b4a1 100644 --- a/packages/widget/src/utils/index.ts +++ b/packages/widget/src/utils/index.ts @@ -2,6 +2,8 @@ import type { HTMLTemplateResult } from 'lit'; import { html } from 'lit'; import { decodeAddress, encodeAddress } from '@polkadot/keyring'; import { hexToU8a, isHex } from '@polkadot/util'; +import { Network } from '@buildwithsygma/sygma-sdk-core'; +import { ethers } from 'ethers'; import { baseNetworkIcon, cronosNetworkIcon, @@ -57,3 +59,30 @@ export const validateSubstrateAddress = (address: string): boolean => { return false; } }; + +export const validateAddress = (address: string, network: Network): string => { + let errorMessage: string = ''; + + switch (network) { + case Network.SUBSTRATE: { + const validPolkadotAddress = validateSubstrateAddress(address); + + if (!validPolkadotAddress) { + errorMessage = 'invalid Substrate address'; + } + break; + } + case Network.EVM: { + const isAddress = ethers.utils.isAddress(address); + if (!isAddress) { + errorMessage = 'invalid Ethereum Address'; + } + break; + } + default: + errorMessage = 'invalid address'; + break; + } + + return errorMessage; +}; diff --git a/packages/widget/tests/unit/components/address-input/address-input.test.ts b/packages/widget/tests/unit/components/address-input/address-input.test.ts index b025de67..3fe3dd78 100644 --- a/packages/widget/tests/unit/components/address-input/address-input.test.ts +++ b/packages/widget/tests/unit/components/address-input/address-input.test.ts @@ -141,7 +141,7 @@ describe('address-input component', function () { await listener; - assert.equal(mockAddressChangeHandler.mock.calls.length, 1); + assert.equal(mockAddressChangeHandler.mock.calls.length, 0); const errorMessageAfterClean = el.shadowRoot!.querySelector( '.errorMessage' diff --git a/yarn.lock b/yarn.lock index 6e744c6e..172a4aa5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,17 +12,6 @@ __metadata: languageName: node linkType: hard -"@asamuzakjp/dom-selector@npm:^2.0.1": - version: 2.0.2 - resolution: "@asamuzakjp/dom-selector@npm:2.0.2" - dependencies: - bidi-js: "npm:^1.0.3" - css-tree: "npm:^2.3.1" - is-potential-custom-element-name: "npm:^1.0.1" - checksum: 54d9afa3d654a98fcf2e45c53ea330237e513877f130f8c8c17611c603c8d50cb18f937e1b0bcc08f0030443a9c8479dcad9cebff02766025e2df2754459c647 - languageName: node - linkType: hard - "@babel/code-frame@npm:^7.12.11": version: 7.23.5 resolution: "@babel/code-frame@npm:7.23.5" @@ -257,7 +246,6 @@ __metadata: ethers: "npm:5.7.2" events: "npm:^3.3.0" happy-dom: "npm:^13.3.1" - jsdom: "npm:^23.2.0" lit: "npm:3.0.0" lit-analyzer: "npm:^2.0.3" rollup-plugin-visualizer: "npm:^5.9.2" @@ -4083,15 +4071,6 @@ __metadata: languageName: node linkType: hard -"bidi-js@npm:^1.0.3": - version: 1.0.3 - resolution: "bidi-js@npm:1.0.3" - dependencies: - require-from-string: "npm:^2.0.2" - checksum: fdddea4aa4120a34285486f2267526cd9298b6e8b773ad25e765d4f104b6d7437ab4ba542e6939e3ac834a7570bcf121ee2cf6d3ae7cd7082c4b5bedc8f271e1 - languageName: node - linkType: hard - "big-integer@npm:^1.6.44": version: 1.6.51 resolution: "big-integer@npm:1.6.51" @@ -4849,25 +4828,6 @@ __metadata: languageName: node linkType: hard -"css-tree@npm:^2.3.1": - version: 2.3.1 - resolution: "css-tree@npm:2.3.1" - dependencies: - mdn-data: "npm:2.0.30" - source-map-js: "npm:^1.0.1" - checksum: 6f8c1a11d5e9b14bf02d10717fc0351b66ba12594166f65abfbd8eb8b5b490dd367f5c7721db241a3c792d935fc6751fbc09f7e1598d421477ad9fadc30f4f24 - languageName: node - linkType: hard - -"cssstyle@npm:^4.0.1": - version: 4.0.1 - resolution: "cssstyle@npm:4.0.1" - dependencies: - rrweb-cssom: "npm:^0.6.0" - checksum: cadf9a8b23e11f4c6d63f21291096a0b0be868bd4ab9c799daa2c5b18330e39e5281605f01da906e901b42f742df0f3b3645af6465e83377ff7d15a88ee432a0 - languageName: node - linkType: hard - "d@npm:1, d@npm:^1.0.1": version: 1.0.1 resolution: "d@npm:1.0.1" @@ -4894,16 +4854,6 @@ __metadata: languageName: node linkType: hard -"data-urls@npm:^5.0.0": - version: 5.0.0 - resolution: "data-urls@npm:5.0.0" - dependencies: - whatwg-mimetype: "npm:^4.0.0" - whatwg-url: "npm:^14.0.0" - checksum: 1b894d7d41c861f3a4ed2ae9b1c3f0909d4575ada02e36d3d3bc584bdd84278e20709070c79c3b3bff7ac98598cb191eb3e86a89a79ea4ee1ef360e1694f92ad - languageName: node - linkType: hard - "de-indent@npm:^1.0.2": version: 1.0.2 resolution: "de-indent@npm:1.0.2" @@ -4948,13 +4898,6 @@ __metadata: languageName: node linkType: hard -"decimal.js@npm:^10.4.3": - version: 10.4.3 - resolution: "decimal.js@npm:10.4.3" - checksum: 6d60206689ff0911f0ce968d40f163304a6c1bc739927758e6efc7921cfa630130388966f16bf6ef6b838cb33679fbe8e7a78a2f3c478afce841fd55ac8fb8ee - languageName: node - linkType: hard - "decode-uri-component@npm:^0.2.0": version: 0.2.2 resolution: "decode-uri-component@npm:0.2.2" @@ -5256,7 +5199,7 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.4.0, entities@npm:^4.5.0": +"entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" checksum: 5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 @@ -7395,15 +7338,6 @@ __metadata: languageName: node linkType: hard -"html-encoding-sniffer@npm:^4.0.0": - version: 4.0.0 - resolution: "html-encoding-sniffer@npm:4.0.0" - dependencies: - whatwg-encoding: "npm:^3.1.1" - checksum: 523398055dc61ac9b34718a719cb4aa691e4166f29187e211e1607de63dc25ac7af52ca7c9aead0c4b3c0415ffecb17326396e1202e2e86ff4bca4c0ee4c6140 - languageName: node - linkType: hard - "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -7514,7 +7448,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2": +"https-proxy-agent@npm:^7.0.1": version: 7.0.2 resolution: "https-proxy-agent@npm:7.0.2" dependencies: @@ -7554,7 +7488,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": +"iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -7887,13 +7821,6 @@ __metadata: languageName: node linkType: hard -"is-potential-custom-element-name@npm:^1.0.1": - version: 1.0.1 - resolution: "is-potential-custom-element-name@npm:1.0.1" - checksum: b73e2f22bc863b0939941d369486d308b43d7aef1f9439705e3582bfccaa4516406865e32c968a35f97a99396dac84e2624e67b0a16b0a15086a785e16ce7db9 - languageName: node - linkType: hard - "is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -8115,40 +8042,6 @@ __metadata: languageName: node linkType: hard -"jsdom@npm:^23.2.0": - version: 23.2.0 - resolution: "jsdom@npm:23.2.0" - dependencies: - "@asamuzakjp/dom-selector": "npm:^2.0.1" - cssstyle: "npm:^4.0.1" - data-urls: "npm:^5.0.0" - decimal.js: "npm:^10.4.3" - form-data: "npm:^4.0.0" - html-encoding-sniffer: "npm:^4.0.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.2" - is-potential-custom-element-name: "npm:^1.0.1" - parse5: "npm:^7.1.2" - rrweb-cssom: "npm:^0.6.0" - saxes: "npm:^6.0.0" - symbol-tree: "npm:^3.2.4" - tough-cookie: "npm:^4.1.3" - w3c-xmlserializer: "npm:^5.0.0" - webidl-conversions: "npm:^7.0.0" - whatwg-encoding: "npm:^3.1.1" - whatwg-mimetype: "npm:^4.0.0" - whatwg-url: "npm:^14.0.0" - ws: "npm:^8.16.0" - xml-name-validator: "npm:^5.0.0" - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true - checksum: b062af50f7be59d914ba75236b7817c848ef3cd007aea1d6b8020a41eb263b7d5bd2652298106e9756b56892f773d990598778d02adab7d0d0d8e58726fc41d3 - languageName: node - linkType: hard - "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -8735,13 +8628,6 @@ __metadata: languageName: node linkType: hard -"mdn-data@npm:2.0.30": - version: 2.0.30 - resolution: "mdn-data@npm:2.0.30" - checksum: a2c472ea16cee3911ae742593715aa4c634eb3d4b9f1e6ada0902aa90df13dcbb7285d19435f3ff213ebaa3b2e0c0265c1eb0e3fb278fda7f8919f046a410cd9 - languageName: node - linkType: hard - "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -9636,15 +9522,6 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^7.1.2": - version: 7.1.2 - resolution: "parse5@npm:7.1.2" - dependencies: - entities: "npm:^4.4.0" - checksum: 297d7af8224f4b5cb7f6617ecdae98eeaed7f8cbd78956c42785e230505d5a4f07cef352af10d3006fa5c1544b76b57784d3a22d861ae071bbc460c649482bf4 - languageName: node - linkType: hard - "parseurl@npm:^1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -9928,7 +9805,7 @@ __metadata: languageName: node linkType: hard -"psl@npm:^1.1.28, psl@npm:^1.1.33": +"psl@npm:^1.1.28": version: 1.9.0 resolution: "psl@npm:1.9.0" checksum: 6a3f805fdab9442f44de4ba23880c4eba26b20c8e8e0830eff1cb31007f6825dace61d17203c58bfe36946842140c97a1ba7f67bc63ca2d88a7ee052b65d97ab @@ -9959,13 +9836,6 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.3.1": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: 14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 - languageName: node - linkType: hard - "qs@npm:6.11.0": version: 6.11.0 resolution: "qs@npm:6.11.0" @@ -10002,13 +9872,6 @@ __metadata: languageName: node linkType: hard -"querystringify@npm:^2.1.1": - version: 2.2.0 - resolution: "querystringify@npm:2.2.0" - checksum: 3258bc3dbdf322ff2663619afe5947c7926a6ef5fb78ad7d384602974c467fadfc8272af44f5eb8cddd0d011aae8fabf3a929a8eee4b86edcc0a21e6bd10f9aa - languageName: node - linkType: hard - "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -10189,13 +10052,6 @@ __metadata: languageName: node linkType: hard -"require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 - languageName: node - linkType: hard - "requireindex@npm:^1.2.0": version: 1.2.0 resolution: "requireindex@npm:1.2.0" @@ -10203,13 +10059,6 @@ __metadata: languageName: node linkType: hard -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: b2bfdd09db16c082c4326e573a82c0771daaf7b53b9ce8ad60ea46aa6e30aaf475fe9b164800b89f93b748d2c234d8abff945d2551ba47bf5698e04cd7713267 - languageName: node - linkType: hard - "resolve-alpn@npm:^1.0.0, resolve-alpn@npm:^1.2.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" @@ -10457,13 +10306,6 @@ __metadata: languageName: unknown linkType: soft -"rrweb-cssom@npm:^0.6.0": - version: 0.6.0 - resolution: "rrweb-cssom@npm:0.6.0" - checksum: 3d9d90d53c2349ea9c8509c2690df5a4ef930c9cf8242aeb9425d4046f09d712bb01047e00da0e1c1dab5db35740b3d78fd45c3e7272f75d3724a563f27c30a3 - languageName: node - linkType: hard - "run-applescript@npm:^5.0.0": version: 5.0.0 resolution: "run-applescript@npm:5.0.0" @@ -10551,15 +10393,6 @@ __metadata: languageName: node linkType: hard -"saxes@npm:^6.0.0": - version: 6.0.0 - resolution: "saxes@npm:6.0.0" - dependencies: - xmlchars: "npm:^2.2.0" - checksum: 3847b839f060ef3476eb8623d099aa502ad658f5c40fd60c105ebce86d244389b0d76fcae30f4d0c728d7705ceb2f7e9b34bb54717b6a7dbedaf5dad2d9a4b74 - languageName: node - linkType: hard - "scrypt-js@npm:3.0.1, scrypt-js@npm:^3.0.0, scrypt-js@npm:^3.0.1": version: 3.0.1 resolution: "scrypt-js@npm:3.0.1" @@ -10864,7 +10697,7 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2": +"source-map-js@npm:^1.0.2": version: 1.0.2 resolution: "source-map-js@npm:1.0.2" checksum: 32f2dfd1e9b7168f9a9715eb1b4e21905850f3b50cf02cf476e47e4eebe8e6b762b63a64357896aa29b37e24922b4282df0f492e0d2ace572b43d15525976ff8 @@ -11159,13 +10992,6 @@ __metadata: languageName: node linkType: hard -"symbol-tree@npm:^3.2.4": - version: 3.2.4 - resolution: "symbol-tree@npm:3.2.4" - checksum: dfbe201ae09ac6053d163578778c53aa860a784147ecf95705de0cd23f42c851e1be7889241495e95c37cabb058edb1052f141387bef68f705afc8f9dd358509 - languageName: node - linkType: hard - "synckit@npm:^0.8.5": version: 0.8.5 resolution: "synckit@npm:0.8.5" @@ -11270,18 +11096,6 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^4.1.3": - version: 4.1.3 - resolution: "tough-cookie@npm:4.1.3" - dependencies: - psl: "npm:^1.1.33" - punycode: "npm:^2.1.1" - universalify: "npm:^0.2.0" - url-parse: "npm:^1.5.3" - checksum: 4fc0433a0cba370d57c4b240f30440c848906dee3180bb6e85033143c2726d322e7e4614abb51d42d111ebec119c4876ed8d7247d4113563033eebbc1739c831 - languageName: node - linkType: hard - "tough-cookie@npm:~2.5.0": version: 2.5.0 resolution: "tough-cookie@npm:2.5.0" @@ -11292,15 +11106,6 @@ __metadata: languageName: node linkType: hard -"tr46@npm:^5.0.0": - version: 5.0.0 - resolution: "tr46@npm:5.0.0" - dependencies: - punycode: "npm:^2.3.1" - checksum: 1521b6e7bbc8adc825c4561480f9fe48eb2276c81335eed9fa610aa4c44a48a3221f78b10e5f18b875769eb3413e30efbf209ed556a17a42aa8d690df44b7bee - languageName: node - linkType: hard - "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -11588,13 +11393,6 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.2.0": - version: 0.2.0 - resolution: "universalify@npm:0.2.0" - checksum: cedbe4d4ca3967edf24c0800cfc161c5a15e240dac28e3ce575c689abc11f2c81ccc6532c8752af3b40f9120fb5e454abecd359e164f4f6aa44c29cd37e194fe - languageName: node - linkType: hard - "unpipe@npm:1.0.0, unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" @@ -11632,16 +11430,6 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.5.3": - version: 1.5.10 - resolution: "url-parse@npm:1.5.10" - dependencies: - querystringify: "npm:^2.1.1" - requires-port: "npm:^1.0.0" - checksum: bd5aa9389f896974beb851c112f63b466505a04b4807cea2e5a3b7092f6fbb75316f0491ea84e44f66fed55f1b440df5195d7e3a8203f64fcefa19d182f5be87 - languageName: node - linkType: hard - "url-set-query@npm:^1.0.0": version: 1.0.0 resolution: "url-set-query@npm:1.0.0" @@ -12025,15 +11813,6 @@ __metadata: languageName: node linkType: hard -"w3c-xmlserializer@npm:^5.0.0": - version: 5.0.0 - resolution: "w3c-xmlserializer@npm:5.0.0" - dependencies: - xml-name-validator: "npm:^5.0.0" - checksum: 8712774c1aeb62dec22928bf1cdfd11426c2c9383a1a63f2bcae18db87ca574165a0fbe96b312b73652149167ac6c7f4cf5409f2eb101d9c805efe0e4bae798b - languageName: node - linkType: hard - "web-component-analyzer@npm:^2.0.0": version: 2.0.0 resolution: "web-component-analyzer@npm:2.0.0" @@ -12385,15 +12164,6 @@ __metadata: languageName: node linkType: hard -"whatwg-encoding@npm:^3.1.1": - version: 3.1.1 - resolution: "whatwg-encoding@npm:3.1.1" - dependencies: - iconv-lite: "npm:0.6.3" - checksum: 273b5f441c2f7fda3368a496c3009edbaa5e43b71b09728f90425e7f487e5cef9eb2b846a31bd760dd8077739c26faf6b5ca43a5f24033172b003b72cf61a93e - languageName: node - linkType: hard - "whatwg-fetch@npm:^2.0.4": version: 2.0.4 resolution: "whatwg-fetch@npm:2.0.4" @@ -12408,23 +12178,6 @@ __metadata: languageName: node linkType: hard -"whatwg-mimetype@npm:^4.0.0": - version: 4.0.0 - resolution: "whatwg-mimetype@npm:4.0.0" - checksum: a773cdc8126b514d790bdae7052e8bf242970cebd84af62fb2f35a33411e78e981f6c0ab9ed1fe6ec5071b09d5340ac9178e05b52d35a9c4bcf558ba1b1551df - languageName: node - linkType: hard - -"whatwg-url@npm:^14.0.0": - version: 14.0.0 - resolution: "whatwg-url@npm:14.0.0" - dependencies: - tr46: "npm:^5.0.0" - webidl-conversions: "npm:^7.0.0" - checksum: ac32e9ba9d08744605519bbe9e1371174d36229689ecc099157b6ba102d4251a95e81d81f3d80271eb8da182eccfa65653f07f0ab43ea66a6934e643fd091ba9 - languageName: node - linkType: hard - "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -12600,7 +12353,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.15.1, ws@npm:^8.16.0": +"ws@npm:^8.15.1": version: 8.16.0 resolution: "ws@npm:8.16.0" peerDependencies: @@ -12651,20 +12404,6 @@ __metadata: languageName: node linkType: hard -"xml-name-validator@npm:^5.0.0": - version: 5.0.0 - resolution: "xml-name-validator@npm:5.0.0" - checksum: 3fcf44e7b73fb18be917fdd4ccffff3639373c7cb83f8fc35df6001fecba7942f1dbead29d91ebb8315e2f2ff786b508f0c9dc0215b6353f9983c6b7d62cb1f5 - languageName: node - linkType: hard - -"xmlchars@npm:^2.2.0": - version: 2.2.0 - resolution: "xmlchars@npm:2.2.0" - checksum: b64b535861a6f310c5d9bfa10834cf49127c71922c297da9d4d1b45eeaae40bf9b4363275876088fbe2667e5db028d2cd4f8ee72eed9bede840a67d57dab7593 - languageName: node - linkType: hard - "xtend@npm:^4.0.0, xtend@npm:^4.0.1, xtend@npm:~4.0.0": version: 4.0.2 resolution: "xtend@npm:4.0.2" From 09cecca320642468db0cb5ae4849106b108a4cf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Tue, 30 Jan 2024 22:32:01 -0300 Subject: [PATCH 36/41] chore: pr review + changing input component to textarea because susbtrate address are to long --- .../components/address-input/address-input.ts | 36 ++++++++++--------- .../src/components/address-input/styles.ts | 5 +-- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index 3ecb8345..a467faad 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -29,14 +29,12 @@ export class AddressInput extends LitElement { connectedCallback(): void { super.connectedCallback(); if (this.address) { - this.handleAddressChange({ - target: { value: this.address } - } as unknown as Event); + this.handleAddressChange(this.address); } } - private handleAddressChange = ({ target }: Event): void => { - const { value } = target as HTMLInputElement; + private handleAddressChange = (value: string): void => { + console.log('value', value); if (this.errorMessage) { this.errorMessage = undefined; @@ -54,20 +52,26 @@ export class AddressInput extends LitElement { }; render(): HTMLTemplateResult { - return html`
+ return html`
- - ${when( - this.errorMessage, - () => html` ${this.errorMessage}` - )} - + Send to + ${when( + this.errorMessage, + () => html` ${this.errorMessage}` + )} +
`; } diff --git a/packages/widget/src/components/address-input/styles.ts b/packages/widget/src/components/address-input/styles.ts index b96dd68f..3ebc64f8 100644 --- a/packages/widget/src/components/address-input/styles.ts +++ b/packages/widget/src/components/address-input/styles.ts @@ -20,10 +20,11 @@ export const styles = css` .inputAddress { border-radius: 1.5rem; border: 0.063rem solid var(--zinc-200); - width: 100%; - height: 4.25rem; + height: 3.25rem; font-size: 0.875rem; text-align: center; + resize: none; + padding-top: 1rem; } .inputAddress:focus { From b1c801cd35fa0b5dfd26806a28dc1da32b9c1294 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Tue, 30 Jan 2024 22:33:59 -0300 Subject: [PATCH 37/41] chore: pushing style changes --- packages/widget/src/components/address-input/styles.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/widget/src/components/address-input/styles.ts b/packages/widget/src/components/address-input/styles.ts index 3ebc64f8..9b1f3978 100644 --- a/packages/widget/src/components/address-input/styles.ts +++ b/packages/widget/src/components/address-input/styles.ts @@ -41,4 +41,10 @@ export const styles = css` font-weight: 300; font-size: 0.75rem; } + + .labelContainer { + display: flex; + flex-direction: row; + justify-content: space-between; + } `; From 16576f110eb2689d6d2419baaf382cf8e724496b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Wed, 31 Jan 2024 12:13:05 -0300 Subject: [PATCH 38/41] chore: minor changes on styles and updating test --- .../src/components/address-input/address-input.ts | 15 +++++++-------- .../widget/src/components/address-input/styles.ts | 5 +++-- packages/widget/src/styles.ts | 1 - .../address-input/address-input.test.ts | 11 +++++++---- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index a467faad..b9f9201f 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -34,20 +34,20 @@ export class AddressInput extends LitElement { } private handleAddressChange = (value: string): void => { - console.log('value', value); + const trimedValue = value.trim(); if (this.errorMessage) { this.errorMessage = undefined; } - if (!value) { + if (!trimedValue) { return; } - this.errorMessage = validateAddress(value, this.network); + this.errorMessage = validateAddress(trimedValue, this.network); if (!this.errorMessage) { - void this.onAddressChange(value); + void this.onAddressChange(trimedValue); } }; @@ -65,12 +65,11 @@ export class AddressInput extends LitElement { class=${this.errorMessage ? 'inputAddress error' : 'inputAddress'} name="address" @change=${(evt: Event) => - this.handleAddressChange( - (evt.target as HTMLInputElement).value.trim() - )} + this.handleAddressChange((evt.target as HTMLInputElement).value)} rows="2" > -${ifDefined(this.address)}
`; diff --git a/packages/widget/src/components/address-input/styles.ts b/packages/widget/src/components/address-input/styles.ts index 9b1f3978..676cff7c 100644 --- a/packages/widget/src/components/address-input/styles.ts +++ b/packages/widget/src/components/address-input/styles.ts @@ -20,11 +20,12 @@ export const styles = css` .inputAddress { border-radius: 1.5rem; border: 0.063rem solid var(--zinc-200); - height: 3.25rem; font-size: 0.875rem; text-align: center; resize: none; - padding-top: 1rem; + box-sizing: border-box; + overflow: hidden; + padding: 1rem; } .inputAddress:focus { diff --git a/packages/widget/src/styles.ts b/packages/widget/src/styles.ts index 0d997ce2..9ee30549 100644 --- a/packages/widget/src/styles.ts +++ b/packages/widget/src/styles.ts @@ -27,7 +27,6 @@ export const styles = css` padding: 24px; width: 21.875rem; /* TODO: remove these hardcoded values */ - height: 31.25rem; /* TODO: ↑ */ border-radius: 12px; border: 1px solid var(--gray-100); background-color: var(--white); diff --git a/packages/widget/tests/unit/components/address-input/address-input.test.ts b/packages/widget/tests/unit/components/address-input/address-input.test.ts index 3fe3dd78..990a7022 100644 --- a/packages/widget/tests/unit/components/address-input/address-input.test.ts +++ b/packages/widget/tests/unit/components/address-input/address-input.test.ts @@ -28,7 +28,10 @@ describe('address-input component', function () { '.inputAddress' ) as HTMLInputElement; - assert.equal(input.value, '0xebFC7A970CAAbC18C8e8b7367147C18FC7585492'); + assert.equal( + input.value.trim(), + '0xebFC7A970CAAbC18C8e8b7367147C18FC7585492' + ); const errorMessage = el.shadowRoot!.querySelector( '.errorMessage' @@ -51,7 +54,7 @@ describe('address-input component', function () { '.inputAddress' ) as HTMLInputElement; - assert.equal(input.value, '0x123'); + assert.equal(input.value.trim(), '0x123'); let errorMessage = el.shadowRoot!.querySelector( '.errorMessage' @@ -69,7 +72,7 @@ describe('address-input component', function () { input = el.shadowRoot!.querySelector('.inputAddress') as HTMLInputElement; - assert.equal(input.value, '42sy'); + assert.equal(input.value.trim(), '42sy'); errorMessage = el.shadowRoot!.querySelector( '.errorMessage' @@ -92,7 +95,7 @@ describe('address-input component', function () { '.inputAddress' ) as HTMLInputElement; - assert.equal(input.value, '0x123'); + assert.equal(input.value.trim(), '0x123'); const listener = oneEvent(input, 'change', false); input.value = '0xebFC7A970CAAbC18C8e8b7367147C18FC7585492'; From 4d6eced2fb846013b48c791789f6844bb9d95040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Wed, 31 Jan 2024 18:02:05 -0300 Subject: [PATCH 39/41] chore: more comments --- .../widget/src/components/address-input/address-input.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/widget/src/components/address-input/address-input.ts b/packages/widget/src/components/address-input/address-input.ts index b9f9201f..cc2a01a9 100644 --- a/packages/widget/src/components/address-input/address-input.ts +++ b/packages/widget/src/components/address-input/address-input.ts @@ -24,20 +24,18 @@ export class AddressInput extends LitElement { network: Network = Network.EVM; @state() - errorMessage?: string; + errorMessage: string | null = null; connectedCallback(): void { super.connectedCallback(); - if (this.address) { - this.handleAddressChange(this.address); - } + this.handleAddressChange(this.address); } private handleAddressChange = (value: string): void => { const trimedValue = value.trim(); if (this.errorMessage) { - this.errorMessage = undefined; + this.errorMessage = null; } if (!trimedValue) { @@ -66,7 +64,6 @@ export class AddressInput extends LitElement { name="address" @change=${(evt: Event) => this.handleAddressChange((evt.target as HTMLInputElement).value)} - rows="2" > ${ifDefined(this.address)} Date: Wed, 31 Jan 2024 18:14:40 -0300 Subject: [PATCH 40/41] chore: more comments --- .../src/components/address-input/styles.ts | 4 ++-- packages/widget/src/utils/index.ts | 24 +++++++------------ 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/packages/widget/src/components/address-input/styles.ts b/packages/widget/src/components/address-input/styles.ts index 676cff7c..f5778c64 100644 --- a/packages/widget/src/components/address-input/styles.ts +++ b/packages/widget/src/components/address-input/styles.ts @@ -6,14 +6,14 @@ export const styles = css` flex-direction: column; justify-content: center; gap: 0.5rem; - min-height: 7.75rem; + min-height: 7.75rem; // TOO: remove this hardcoded value } .inputAddressContainer { display: flex; flex-direction: column; width: 100%; - min-height: 7.75rem; + min-height: 7.75rem; // TOO: remove this hardcoded value gap: 0.5rem; } diff --git a/packages/widget/src/utils/index.ts b/packages/widget/src/utils/index.ts index ec68b4a1..887615e6 100644 --- a/packages/widget/src/utils/index.ts +++ b/packages/widget/src/utils/index.ts @@ -60,29 +60,21 @@ export const validateSubstrateAddress = (address: string): boolean => { } }; -export const validateAddress = (address: string, network: Network): string => { - let errorMessage: string = ''; - +export const validateAddress = ( + address: string, + network: Network +): string | null => { switch (network) { case Network.SUBSTRATE: { const validPolkadotAddress = validateSubstrateAddress(address); - - if (!validPolkadotAddress) { - errorMessage = 'invalid Substrate address'; - } - break; + return validPolkadotAddress ? null : 'invalid Substrate address'; } case Network.EVM: { const isAddress = ethers.utils.isAddress(address); - if (!isAddress) { - errorMessage = 'invalid Ethereum Address'; - } - break; + + return isAddress ? null : 'invalid Ethereum address'; } default: - errorMessage = 'invalid address'; - break; + return 'unsupported network'; } - - return errorMessage; }; From 2ed10b46c79d610620caa8ce49b96aa4dd4845a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Riquelme=20Guzm=C3=A1n?= Date: Wed, 31 Jan 2024 18:20:43 -0300 Subject: [PATCH 41/41] chore: small update on test --- .../unit/components/address-input/address-input.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/widget/tests/unit/components/address-input/address-input.test.ts b/packages/widget/tests/unit/components/address-input/address-input.test.ts index 990a7022..dcc32798 100644 --- a/packages/widget/tests/unit/components/address-input/address-input.test.ts +++ b/packages/widget/tests/unit/components/address-input/address-input.test.ts @@ -60,7 +60,7 @@ describe('address-input component', function () { '.errorMessage' ) as HTMLInputElement; - assert.equal(errorMessage.textContent, 'invalid Ethereum Address'); + assert.equal(errorMessage.textContent, 'invalid Ethereum address'); el = await fixture(html`