From b9d9957dcb07f17aaf15813605ef381101901cc1 Mon Sep 17 00:00:00 2001 From: jinoosss <112360739+jinoosss@users.noreply.github.com> Date: Fri, 6 Sep 2024 15:38:19 +0900 Subject: [PATCH] feat: implement SDK with provider injection and connection management (#5) --- jest.config.json | 15 + package.json | 2 +- packages/sdk/jest.config.json | 8 +- packages/sdk/package.json | 3 +- .../sdk/src/core/__mocks__/mock-global.ts | 11 + .../sdk/src/core/__mocks__/mock-storage.ts | 18 + .../core/__mocks__/mock-wallet-provider.ts | 164 ++++ .../connection/connection-manager.test.ts | 78 ++ .../connection-state-manger.test.ts | 54 ++ .../src/core/connection/connection-manager.ts | 85 ++ .../src/core/connection/connection-state.ts | 34 + packages/sdk/src/core/connection/index.ts | 2 + packages/sdk/src/core/index.ts | 4 + .../sdk/src/core/methods/add-establish.ts | 9 + packages/sdk/src/core/methods/add-network.ts | 6 + .../src/core/methods/broadcast-transaction.ts | 9 + packages/sdk/src/core/methods/get-account.ts | 6 + packages/sdk/src/core/methods/index.ts | 9 + packages/sdk/src/core/methods/is-connected.ts | 6 + .../sdk/src/core/methods/on-change-account.ts | 9 + .../sdk/src/core/methods/on-change-network.ts | 9 + .../sdk/src/core/methods/sign-transaction.ts | 9 + .../sdk/src/core/methods/switch-network.ts | 9 + packages/sdk/src/core/providers/wallet.ts | 46 +- packages/sdk/src/core/sdk/adena-sdk.ts | 126 +++ packages/sdk/src/core/sdk/index.ts | 1 + packages/sdk/src/core/types/account.types.ts | 4 +- packages/sdk/src/core/types/config.types.ts | 7 + packages/sdk/src/core/types/index.ts | 2 +- .../core/types/methods/add-establish.types.ts | 7 + .../core/types/methods/add-network.types.ts | 9 + .../methods/broadcast-transaction.types.ts | 12 + .../core/types/methods/get-account.types.ts | 4 + packages/sdk/src/core/types/methods/index.ts | 9 + .../core/types/methods/is-connected.types.ts | 3 + .../types/methods/off-connection-change.ts | 7 + .../types/methods/on-change-account.types.ts | 5 + .../types/methods/on-change-network.types.ts | 5 + .../types/methods/on-connection-change.ts | 7 + .../types/methods/sign-transaction.types.ts | 9 + .../types/methods/switch-network.types.ts | 7 + .../sdk/src/core/types/transaction.types.ts | 8 +- packages/sdk/src/core/types/wallet.types.ts | 265 +++++- packages/sdk/src/core/utils/encode.utils.ts | 16 + packages/sdk/src/core/utils/index.ts | 4 + packages/sdk/src/core/utils/message.utils.ts | 9 + packages/sdk/src/core/utils/provider.utils.ts | 6 + packages/sdk/src/core/utils/storage.utils.ts | 15 + .../sdk/src/core/utils/transaction.utils.ts | 74 ++ packages/sdk/src/index.ts | 1 + .../providers/adena-wallet/adena-wallet.ts | 83 +- .../providers/adena-wallet/mapper.utils.ts | 17 +- .../providers/adena-wallet/types/general.ts | 4 +- .../adena-wallet/types/transactions.ts | 2 +- packages/sdk/src/providers/index.ts | 1 - packages/sdk/tsconfig.json | 3 +- packages/sdk/tsup.config.ts | 16 +- yarn.lock | 792 +++++++++--------- 58 files changed, 1673 insertions(+), 472 deletions(-) create mode 100644 jest.config.json create mode 100644 packages/sdk/src/core/__mocks__/mock-global.ts create mode 100644 packages/sdk/src/core/__mocks__/mock-storage.ts create mode 100644 packages/sdk/src/core/__mocks__/mock-wallet-provider.ts create mode 100644 packages/sdk/src/core/__tests__/connection/connection-manager.test.ts create mode 100644 packages/sdk/src/core/__tests__/connection/connection-state-manger.test.ts create mode 100644 packages/sdk/src/core/connection/connection-manager.ts create mode 100644 packages/sdk/src/core/connection/connection-state.ts create mode 100644 packages/sdk/src/core/connection/index.ts create mode 100644 packages/sdk/src/core/index.ts create mode 100644 packages/sdk/src/core/methods/add-establish.ts create mode 100644 packages/sdk/src/core/methods/add-network.ts create mode 100644 packages/sdk/src/core/methods/broadcast-transaction.ts create mode 100644 packages/sdk/src/core/methods/get-account.ts create mode 100644 packages/sdk/src/core/methods/index.ts create mode 100644 packages/sdk/src/core/methods/is-connected.ts create mode 100644 packages/sdk/src/core/methods/on-change-account.ts create mode 100644 packages/sdk/src/core/methods/on-change-network.ts create mode 100644 packages/sdk/src/core/methods/sign-transaction.ts create mode 100644 packages/sdk/src/core/methods/switch-network.ts create mode 100644 packages/sdk/src/core/sdk/adena-sdk.ts create mode 100644 packages/sdk/src/core/sdk/index.ts create mode 100644 packages/sdk/src/core/types/config.types.ts create mode 100644 packages/sdk/src/core/types/methods/add-establish.types.ts create mode 100644 packages/sdk/src/core/types/methods/add-network.types.ts create mode 100644 packages/sdk/src/core/types/methods/broadcast-transaction.types.ts create mode 100644 packages/sdk/src/core/types/methods/get-account.types.ts create mode 100644 packages/sdk/src/core/types/methods/index.ts create mode 100644 packages/sdk/src/core/types/methods/is-connected.types.ts create mode 100644 packages/sdk/src/core/types/methods/off-connection-change.ts create mode 100644 packages/sdk/src/core/types/methods/on-change-account.types.ts create mode 100644 packages/sdk/src/core/types/methods/on-change-network.types.ts create mode 100644 packages/sdk/src/core/types/methods/on-connection-change.ts create mode 100644 packages/sdk/src/core/types/methods/sign-transaction.types.ts create mode 100644 packages/sdk/src/core/types/methods/switch-network.types.ts create mode 100644 packages/sdk/src/core/utils/encode.utils.ts create mode 100644 packages/sdk/src/core/utils/index.ts create mode 100644 packages/sdk/src/core/utils/message.utils.ts create mode 100644 packages/sdk/src/core/utils/provider.utils.ts create mode 100644 packages/sdk/src/core/utils/storage.utils.ts create mode 100644 packages/sdk/src/core/utils/transaction.utils.ts diff --git a/jest.config.json b/jest.config.json new file mode 100644 index 0000000..5283418 --- /dev/null +++ b/jest.config.json @@ -0,0 +1,15 @@ +{ + "projects": ["/packages/*"], + "watchPathIgnorePatterns": ["/node_modules/", "/bin/"], + "testPathIgnorePatterns": [ + "/node_modules/", + "/bin/", + "/**/node_modules/", + "/**/bin/", + "/**/__mocks__/", + "/**/coverage/" + ], + "transform": { + "^.+\\.(ts|tsx)$": "ts-jest" + } +} diff --git a/package.json b/package.json index 89e1b70..76ba55f 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "url": "https://github.com/onbloc/adena-wallet-sdk" }, "scripts": { - "build": "yarn workspaces foreach -vptR run build", + "build": "yarn workspaces foreach -vA run build", "lint": "yarn workspaces foreach -vA run lint", "lint:fix": "yarn workspaces foreach -vA run lint:fix", "test": "yarn workspaces foreach -vA run test", diff --git a/packages/sdk/jest.config.json b/packages/sdk/jest.config.json index 5c0541c..87b6465 100644 --- a/packages/sdk/jest.config.json +++ b/packages/sdk/jest.config.json @@ -1,5 +1,11 @@ { "preset": "ts-jest", "testEnvironment": "node", - "modulePathIgnorePatterns": ["bin", "node_modules"] + "transform": { + "^.+\\.(ts|tsx)$": "ts-jest" + }, + "testMatch": ["/**/*.test.(ts|tsx)"], + "moduleFileExtensions": ["ts", "tsx", "js", "jsx"], + "moduleDirectories": ["node_modules", "/packages"], + "modulePathIgnorePatterns": ["bin", "node_modules", "coverage", "__mocks__"] } diff --git a/packages/sdk/package.json b/packages/sdk/package.json index e149395..12b2841 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -35,7 +35,8 @@ "test:ci": "jest --coverage --passWithNoTests " }, "dependencies": { - "@gnolang/gno-js-client": "^1.3.0" + "@gnolang/gno-js-client": "^1.3.0", + "@gnolang/tm2-js-client": "^1.2.1" }, "devDependencies": { "@types/eslint": "^9", diff --git a/packages/sdk/src/core/__mocks__/mock-global.ts b/packages/sdk/src/core/__mocks__/mock-global.ts new file mode 100644 index 0000000..b491eaf --- /dev/null +++ b/packages/sdk/src/core/__mocks__/mock-global.ts @@ -0,0 +1,11 @@ +import { mockSessionStorage } from './mock-storage'; + +export const defineGlobalMock = () => { + Object.defineProperty(global, 'sessionStorage', { + value: mockSessionStorage, + }); +}; + +export const clearGlobalMock = () => { + Object.defineProperty(global, 'sessionStorage', {}); +}; diff --git a/packages/sdk/src/core/__mocks__/mock-storage.ts b/packages/sdk/src/core/__mocks__/mock-storage.ts new file mode 100644 index 0000000..d1c79a5 --- /dev/null +++ b/packages/sdk/src/core/__mocks__/mock-storage.ts @@ -0,0 +1,18 @@ +export const mockSessionStorage = (() => { + let store: Record = {}; + + return { + getItem(key: string) { + return store[key] || null; + }, + setItem(key: string, value: string) { + store[key] = value.toString(); + }, + removeItem(key: string) { + delete store[key]; + }, + clear() { + store = {}; + }, + }; +})(); diff --git a/packages/sdk/src/core/__mocks__/mock-wallet-provider.ts b/packages/sdk/src/core/__mocks__/mock-wallet-provider.ts new file mode 100644 index 0000000..e2653de --- /dev/null +++ b/packages/sdk/src/core/__mocks__/mock-wallet-provider.ts @@ -0,0 +1,164 @@ +import { WalletProvider } from '../providers'; +import { WalletResponseFailureType, WalletResponseStatus, WalletResponseSuccessType } from '../types'; + +export const mockWalletProvider: jest.Mocked = { + isConnected: jest.fn().mockResolvedValue({ + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.CONNECTION_SUCCESS, + message: 'Wallet is connected', + data: null, + }), + addEstablish: jest.fn().mockResolvedValue({ + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.CONNECTION_SUCCESS, + message: 'Connection established', + data: null, + }), + getAccount: jest.fn().mockResolvedValue({ + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.GET_ACCOUNT_SUCCESS, + message: 'Account retrieved', + data: { address: 'mock-address', connected: true }, + }), + switchNetwork: jest.fn().mockResolvedValue({ + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.SWITCH_NETWORK_SUCCESS, + message: 'Network switched', + data: null, + }), + addNetwork: jest.fn().mockResolvedValue({ + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.ADD_NETWORK_SUCCESS, + message: 'Network added', + data: null, + }), + signTransaction: jest.fn().mockResolvedValue({ + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.SIGN_SUCCESS, + message: 'Transaction signed', + data: 'mock-signed-transaction', + }), + broadcastTransaction: jest.fn().mockResolvedValue({ + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.TRANSACTION_SUCCESS, + message: 'Transaction broadcasted', + data: { result: 'mock-result' }, + }), + onChangeAccount: jest.fn().mockImplementation(() => { + return { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.CONNECTION_SUCCESS, + message: 'Account change listener added', + data: null, + }; + }), + onChangeNetwork: jest.fn().mockImplementation(() => { + return { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.SWITCH_NETWORK_SUCCESS, + message: 'Network change listener added', + data: null, + }; + }), +}; + +jest.mock('../providers', () => ({ + WalletProvider: jest.fn(() => mockWalletProvider), +})); + +export const isConnectedSuccessMock = { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.CONNECTION_SUCCESS, + message: '', + data: true, +}; + +export const isConnectedFailureMock = { + code: 4000, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.ALREADY_CONNECTED, + message: '', + data: false, +}; + +export const addEstablishSuccessMock = { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.CONNECTION_SUCCESS, + message: '', + data: null, +}; + +export const addEstablishFailureMock = { + code: 4000, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.ALREADY_CONNECTED, + message: '', + data: null, +}; + +export const getAccountSuccessMock = { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.GET_ACCOUNT_SUCCESS, + message: '', + data: { address: '' }, +}; + +export const switchNetworkSuccessMock = { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.SWITCH_NETWORK_SUCCESS, + message: '', + data: null, +}; + +export const addNetworkSuccessMock = { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.ADD_NETWORK_SUCCESS, + message: '', + data: null, +}; + +export const signTransactionSuccessMock = { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.SIGN_SUCCESS, + message: '', + data: '', +}; + +export const broadcastTransactionSuccessMock = { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.TRANSACTION_SUCCESS, + message: '', + data: { result: '' }, +}; + +export const onChangeAccountSuccessMock = { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.CONNECTION_SUCCESS, + message: '', + data: null, +}; + +export const onChangeNetworkSuccessMock = { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.SWITCH_NETWORK_SUCCESS, + message: '', + data: null, +}; diff --git a/packages/sdk/src/core/__tests__/connection/connection-manager.test.ts b/packages/sdk/src/core/__tests__/connection/connection-manager.test.ts new file mode 100644 index 0000000..06d8e1d --- /dev/null +++ b/packages/sdk/src/core/__tests__/connection/connection-manager.test.ts @@ -0,0 +1,78 @@ +import { clearGlobalMock, defineGlobalMock } from '../../__mocks__/mock-global'; +import { + addEstablishFailureMock, + addEstablishSuccessMock, + isConnectedFailureMock, + isConnectedSuccessMock, + mockWalletProvider, +} from '../../__mocks__/mock-wallet-provider'; +import { ConnectionManager, ConnectionState } from '../../connection'; +import { SDKConnectionConfigure } from '../../types/config.types'; + +describe('ConnectionManager', () => { + let connectionManager: ConnectionManager; + let config: SDKConnectionConfigure; + + beforeEach(() => { + defineGlobalMock(); + config = { isSession: true }; + + // Initialize ConnectionManager with a real instance of ConnectionStateManager + connectionManager = new ConnectionManager(mockWalletProvider, config); + }); + + afterEach(() => { + jest.clearAllMocks(); + clearGlobalMock(); + }); + + test('should initialize and load state if isSession is true', () => { + // Initially, loadState should set the state to CONNECTED if it was not saved + connectionManager = new ConnectionManager(mockWalletProvider, config); + expect(connectionManager.getConnectionState()).toBe(ConnectionState.CONNECTED); + }); + + test('should set state to CONNECTING when connecting wallet', async () => { + mockWalletProvider.isConnected.mockResolvedValue(isConnectedSuccessMock); + mockWalletProvider.addEstablish.mockResolvedValue(addEstablishSuccessMock); + + await connectionManager.connectWallet(); + + expect(connectionManager.getConnectionState()).toBe(ConnectionState.CONNECTED); + }); + + test('should connect wallet if already connected', async () => { + mockWalletProvider.isConnected.mockResolvedValue(isConnectedSuccessMock); + + await connectionManager.connectWallet(); + + expect(connectionManager.getConnectionState()).toBe(ConnectionState.CONNECTED); + }); + + test('should set state to DISCONNECTED if connection fails', async () => { + connectionManager = new ConnectionManager(mockWalletProvider, { isSession: false }); + mockWalletProvider.isConnected.mockResolvedValue(isConnectedFailureMock); + mockWalletProvider.addEstablish.mockResolvedValue(addEstablishFailureMock); + + await connectionManager.connectWallet(); + + expect(connectionManager.getConnectionState()).toBe(ConnectionState.DISCONNECTED); + }); + + test('should set state to ERROR if an exception is thrown', async () => { + mockWalletProvider.isConnected.mockRejectedValueOnce(new Error('connection error')); + + await expect(connectionManager.connectWallet()).rejects.toThrow('connection error'); + expect(connectionManager.getConnectionState()).toBe(ConnectionState.ERROR); + }); + + test('should trigger connection event when connected', () => { + const listener = jest.fn(); + connectionManager.on(listener); + + connectionManager['connect'](); + + expect(connectionManager.getConnectionState()).toBe(ConnectionState.CONNECTED); + expect(listener).toHaveBeenCalledWith('connect'); + }); +}); diff --git a/packages/sdk/src/core/__tests__/connection/connection-state-manger.test.ts b/packages/sdk/src/core/__tests__/connection/connection-state-manger.test.ts new file mode 100644 index 0000000..dfef909 --- /dev/null +++ b/packages/sdk/src/core/__tests__/connection/connection-state-manger.test.ts @@ -0,0 +1,54 @@ +import { clearGlobalMock, defineGlobalMock } from '../../__mocks__/mock-global'; +import { ConnectionState, ConnectionStateManager } from '../../connection'; +import { getSessionStorageItem, setSessionStorageItem } from '../../utils/storage.utils'; + +jest.mock('../../utils/storage.utils', () => ({ + getSessionStorageItem: jest.fn(), + setSessionStorageItem: jest.fn(), +})); + +describe('ConnectionStateManager', () => { + let manager: ConnectionStateManager; + + beforeEach(() => { + defineGlobalMock(); + manager = new ConnectionStateManager(); + }); + + afterEach(() => { + jest.clearAllMocks(); + clearGlobalMock(); + }); + + it('should initialize with DISCONNECTED state', () => { + expect(manager.getState()).toBe(ConnectionState.DISCONNECTED); + }); + + it('should save state to session storage when setState is called', () => { + manager.setState(ConnectionState.CONNECTED); + + expect(setSessionStorageItem).toHaveBeenCalledWith( + 'adena-sdk-connection-state', + ConnectionState.CONNECTED.toString() + ); + expect(manager.getState()).toBe(ConnectionState.CONNECTED); + }); + + it('should load state from session storage when loadState is called', () => { + (getSessionStorageItem as jest.Mock).mockReturnValue(ConnectionState.CONNECTED.toString()); + + manager.loadState(); + + expect(getSessionStorageItem).toHaveBeenCalledWith('adena-sdk-connection-state'); + expect(manager.getState()).toBe(ConnectionState.CONNECTED); + }); + + it('should not change state if the loaded state is not CONNECTED', () => { + (getSessionStorageItem as jest.Mock).mockReturnValue(ConnectionState.DISCONNECTED.toString()); + + manager.loadState(); + + expect(getSessionStorageItem).toHaveBeenCalledWith('adena-sdk-connection-state'); + expect(manager.getState()).toBe(ConnectionState.DISCONNECTED); + }); +}); diff --git a/packages/sdk/src/core/connection/connection-manager.ts b/packages/sdk/src/core/connection/connection-manager.ts new file mode 100644 index 0000000..2d9be2c --- /dev/null +++ b/packages/sdk/src/core/connection/connection-manager.ts @@ -0,0 +1,85 @@ +import { WalletProvider } from '../providers'; +import { WalletConnectionEvent, WalletResponseStatus } from '../types'; +import { SDKConnectionConfigure } from '../types/config.types'; +import { ConnectionState, ConnectionStateManager } from './connection-state'; + +export class ConnectionManager { + private stateManager: ConnectionStateManager; + private listeners: ((event: WalletConnectionEvent) => void)[]; + + constructor( + private provider: WalletProvider, + private config: SDKConnectionConfigure + ) { + this.listeners = []; + this.stateManager = new ConnectionStateManager(); + if (this.config.isSession) { + this.stateManager.loadState(); + this.connectWallet(); + } + } + + async connectWallet(): Promise { + if (this.getConnectionState() !== ConnectionState.CONNECTED) { + this.stateManager.setState(ConnectionState.CONNECTING); + } + + try { + // If your wallet is already connected, change to connected. + const isConnectedResponse = await this.provider.isConnected(); + if (isConnectedResponse.status === WalletResponseStatus.SUCCESS) { + this.connect(); + return; + } + + // If the app is registered in your wallet, change the status to connected. + const addEstablishResponse = await this.provider.addEstablish({}); + if (addEstablishResponse.status === WalletResponseStatus.SUCCESS) { + this.connect(); + return; + } + } catch (error) { + this.stateManager.setState(ConnectionState.ERROR); + throw error; + } + + this.stateManager.setState(ConnectionState.DISCONNECTED); + } + + disconnectWallet(): void { + this.disconnect(); + } + + getConnectionState(): ConnectionState { + return this.stateManager.getState(); + } + + getWalletProvider(): WalletProvider { + if (this.stateManager.getState() !== ConnectionState.CONNECTED) { + throw new Error('not connect wallet'); + } + return this.provider; + } + + on(listener: (connection: WalletConnectionEvent) => void): void { + this.listeners.push(listener); + } + + off(listener: (connection: WalletConnectionEvent) => void): void { + this.listeners = this.listeners.filter((l) => l !== listener); + } + + private connect() { + this.stateManager.setState(ConnectionState.CONNECTED); + this.triggerConnectionEvent('connect'); + } + + private disconnect() { + this.stateManager.setState(ConnectionState.DISCONNECTED); + this.triggerConnectionEvent('disconnect'); + } + + private triggerConnectionEvent(event: WalletConnectionEvent): void { + this.listeners?.forEach((listener) => listener(event)); + } +} diff --git a/packages/sdk/src/core/connection/connection-state.ts b/packages/sdk/src/core/connection/connection-state.ts new file mode 100644 index 0000000..7735195 --- /dev/null +++ b/packages/sdk/src/core/connection/connection-state.ts @@ -0,0 +1,34 @@ +import { getSessionStorageItem, setSessionStorageItem } from '../utils/storage.utils'; + +export enum ConnectionState { + DISCONNECTED, + CONNECTING, + CONNECTED, + ERROR, +} + +export class ConnectionStateManager { + private static readonly STORAGE_KEY = 'adena-sdk-connection-state'; + + private state: ConnectionState = ConnectionState.DISCONNECTED; + + getState(): ConnectionState { + return this.state; + } + + setState(state: ConnectionState): void { + this.state = state; + this.saveState(); + } + + loadState(): void { + const savedState = getSessionStorageItem(ConnectionStateManager.STORAGE_KEY); + if (savedState === ConnectionState.CONNECTED.toString()) { + this.setState(ConnectionState.CONNECTED); + } + } + + private saveState(): void { + setSessionStorageItem(ConnectionStateManager.STORAGE_KEY, this.state.toString()); + } +} diff --git a/packages/sdk/src/core/connection/index.ts b/packages/sdk/src/core/connection/index.ts new file mode 100644 index 0000000..36672a4 --- /dev/null +++ b/packages/sdk/src/core/connection/index.ts @@ -0,0 +1,2 @@ +export * from './connection-manager'; +export * from './connection-state'; diff --git a/packages/sdk/src/core/index.ts b/packages/sdk/src/core/index.ts new file mode 100644 index 0000000..2187982 --- /dev/null +++ b/packages/sdk/src/core/index.ts @@ -0,0 +1,4 @@ +export * from './providers'; +export * from './sdk'; +export * from './types'; +export * from './utils'; diff --git a/packages/sdk/src/core/methods/add-establish.ts b/packages/sdk/src/core/methods/add-establish.ts new file mode 100644 index 0000000..ff4ddab --- /dev/null +++ b/packages/sdk/src/core/methods/add-establish.ts @@ -0,0 +1,9 @@ +import { WalletProvider } from '../providers'; +import { AddEstablishOptions, AddEstablishResponse } from '../types/methods'; + +export const addEstablish = ( + walletProvider: WalletProvider, + options: AddEstablishOptions +): Promise => { + return walletProvider.addEstablish(options); +}; diff --git a/packages/sdk/src/core/methods/add-network.ts b/packages/sdk/src/core/methods/add-network.ts new file mode 100644 index 0000000..473de63 --- /dev/null +++ b/packages/sdk/src/core/methods/add-network.ts @@ -0,0 +1,6 @@ +import { WalletProvider } from '../providers'; +import { AddNetworkOptions, AddNetworkResponse } from '../types/methods'; + +export const addNetwork = (walletProvider: WalletProvider, options: AddNetworkOptions): Promise => { + return walletProvider.addNetwork(options); +}; diff --git a/packages/sdk/src/core/methods/broadcast-transaction.ts b/packages/sdk/src/core/methods/broadcast-transaction.ts new file mode 100644 index 0000000..34003c7 --- /dev/null +++ b/packages/sdk/src/core/methods/broadcast-transaction.ts @@ -0,0 +1,9 @@ +import { WalletProvider } from '../providers'; +import { BroadcastTransactionOptions, BroadcastTransactionResponse } from '../types/methods'; + +export const broadcastTransaction = ( + walletProvider: WalletProvider, + options: BroadcastTransactionOptions +): Promise => { + return walletProvider.broadcastTransaction(options); +}; diff --git a/packages/sdk/src/core/methods/get-account.ts b/packages/sdk/src/core/methods/get-account.ts new file mode 100644 index 0000000..74ffeda --- /dev/null +++ b/packages/sdk/src/core/methods/get-account.ts @@ -0,0 +1,6 @@ +import { WalletProvider } from '../providers'; +import { GetAccountResponse } from '../types/methods'; + +export const getAccount = (walletProvider: WalletProvider): Promise => { + return walletProvider.getAccount(); +}; diff --git a/packages/sdk/src/core/methods/index.ts b/packages/sdk/src/core/methods/index.ts new file mode 100644 index 0000000..0a643fd --- /dev/null +++ b/packages/sdk/src/core/methods/index.ts @@ -0,0 +1,9 @@ +export * from './add-establish'; +export * from './add-network'; +export * from './broadcast-transaction'; +export * from './get-account'; +export * from './is-connected'; +export * from './on-change-account'; +export * from './on-change-network'; +export * from './sign-transaction'; +export * from './switch-network'; diff --git a/packages/sdk/src/core/methods/is-connected.ts b/packages/sdk/src/core/methods/is-connected.ts new file mode 100644 index 0000000..fb55d27 --- /dev/null +++ b/packages/sdk/src/core/methods/is-connected.ts @@ -0,0 +1,6 @@ +import { WalletProvider } from '../providers'; +import { IsConnectedResponse } from '../types/methods'; + +export const isConnected = (walletProvider: WalletProvider): Promise => { + return walletProvider.isConnected(); +}; diff --git a/packages/sdk/src/core/methods/on-change-account.ts b/packages/sdk/src/core/methods/on-change-account.ts new file mode 100644 index 0000000..7a6c839 --- /dev/null +++ b/packages/sdk/src/core/methods/on-change-account.ts @@ -0,0 +1,9 @@ +import { WalletProvider } from '../providers'; +import { OnChangeAccountOptions, OnChangeAccountResponse } from '../types/methods'; + +export const onChangeAccount = ( + walletProvider: WalletProvider, + options: OnChangeAccountOptions +): OnChangeAccountResponse => { + return walletProvider.onChangeAccount(options); +}; diff --git a/packages/sdk/src/core/methods/on-change-network.ts b/packages/sdk/src/core/methods/on-change-network.ts new file mode 100644 index 0000000..1e5d953 --- /dev/null +++ b/packages/sdk/src/core/methods/on-change-network.ts @@ -0,0 +1,9 @@ +import { WalletProvider } from '../providers'; +import { OnChangeNetworkOptions, OnChangeNetworkResponse } from '../types/methods'; + +export const onChangeNetwork = ( + walletProvider: WalletProvider, + options: OnChangeNetworkOptions +): OnChangeNetworkResponse => { + return walletProvider.onChangeNetwork(options); +}; diff --git a/packages/sdk/src/core/methods/sign-transaction.ts b/packages/sdk/src/core/methods/sign-transaction.ts new file mode 100644 index 0000000..ff98748 --- /dev/null +++ b/packages/sdk/src/core/methods/sign-transaction.ts @@ -0,0 +1,9 @@ +import { WalletProvider } from '../providers'; +import { SignTransactionOptions, SignTransactionResponse } from '../types/methods'; + +export const signTransaction = ( + walletProvider: WalletProvider, + options: SignTransactionOptions +): Promise => { + return walletProvider.signTransaction(options); +}; diff --git a/packages/sdk/src/core/methods/switch-network.ts b/packages/sdk/src/core/methods/switch-network.ts new file mode 100644 index 0000000..c880ddc --- /dev/null +++ b/packages/sdk/src/core/methods/switch-network.ts @@ -0,0 +1,9 @@ +import { WalletProvider } from '../providers'; +import { SwitchNetworkOptions, SwitchNetworkResponse } from '../types/methods'; + +export const switchNetwork = ( + walletProvider: WalletProvider, + options: SwitchNetworkOptions +): Promise => { + return walletProvider.switchNetwork(options); +}; diff --git a/packages/sdk/src/core/providers/wallet.ts b/packages/sdk/src/core/providers/wallet.ts index 31218f6..25a8b66 100644 --- a/packages/sdk/src/core/providers/wallet.ts +++ b/packages/sdk/src/core/providers/wallet.ts @@ -1,16 +1,23 @@ import { - AccountInfo, - BroadcastType, - SingTransaction, - TransactionData, - TransactionResult, - TransactionResultCommit, - TransactionResultSync, - WalletResponse, -} from '../types'; + AddEstablishOptions, + AddEstablishResponse, + AddNetworkOptions, + AddNetworkResponse, + BroadcastTransactionOptions, + BroadcastTransactionResponse, + GetAccountResponse, + IsConnectedResponse, + OnChangeAccountOptions, + OnChangeAccountResponse, + OnChangeNetworkOptions, + OnChangeNetworkResponse, + SwitchNetworkOptions, + SwitchNetworkResponse, +} from '../types/methods'; +import { SignTransactionOptions, SignTransactionResponse } from '../types/methods/sign-transaction.types'; export interface WalletProvider { - isConnected: () => Promise>; + isConnected: () => Promise; /** * Establish a connection to your site from Adena @@ -18,14 +25,14 @@ export interface WalletProvider { * @param {string} name - The name of the website requesting to connect * @returns Original Adena response, useful to check if the site was already connected */ - addEstablish: (name: string) => Promise>; + addEstablish: (options: AddEstablishOptions) => Promise; /** * Fetch information about the current connected account * @async * @returns Original Adena response with the account information */ - getAccount: () => Promise>; + getAccount: () => Promise; /** * Switches the Adena network to the given chain ID @@ -33,7 +40,7 @@ export interface WalletProvider { * @param {string} chainId - Chain ID * @returns Nothing, throws an error if it fails */ - switchNetwork: (chainId: string) => Promise>; + switchNetwork: (options: SwitchNetworkOptions) => Promise; /** * Add a custom network to Adena @@ -43,7 +50,7 @@ export interface WalletProvider { * @param {string} rpcUrl - Network RPC URL * @returns Nothing, throws an error if it fails */ - addNetwork: (chainId: string, chainName: string, rpcUrl: string) => Promise>; + addNetwork: (options: AddNetworkOptions) => Promise; /** * Sign a transaction crafted by a web-app @@ -54,7 +61,7 @@ export interface WalletProvider { * @param {string} memo - Transaction memo (tag) * @returns {string} Encoded transaction */ - signTransaction: (transactionData: TransactionData) => Promise>; + signTransaction: (options: SignTransactionOptions) => Promise; /** * Sign and broadcast a transaction crafted by a web-app @@ -65,10 +72,7 @@ export interface WalletProvider { * @param {string} memo - Transaction memo (tag) * @returns {BroadcastTxCommitResult} Result of the broadcast transaction */ - broadcastTransaction: ( - transactionData: TransactionData, - broadcastType?: BroadcastType - ) => Promise>; + broadcastTransaction: (options: BroadcastTransactionOptions) => Promise; /** * Add a listener on connected account changes @@ -76,7 +80,7 @@ export interface WalletProvider { * @param {OnAccountChangeFunc} func - Function to call on a new event * @returns Nothing, throws an error if it fails */ - onChangeAccount: (callback: (address: string) => void) => void; + onChangeAccount: (options: OnChangeAccountOptions) => OnChangeAccountResponse; /** * Add a listener on network changes @@ -84,5 +88,5 @@ export interface WalletProvider { * @param {OnNetworkChangeFunc} func - Function to call on a new event * @returns Nothing, throws an error if it fails */ - onChangeNetwork: (callback: (chainId: string) => void) => void; + onChangeNetwork: (options: OnChangeNetworkOptions) => OnChangeNetworkResponse; } diff --git a/packages/sdk/src/core/sdk/adena-sdk.ts b/packages/sdk/src/core/sdk/adena-sdk.ts new file mode 100644 index 0000000..93eaf88 --- /dev/null +++ b/packages/sdk/src/core/sdk/adena-sdk.ts @@ -0,0 +1,126 @@ +import { ConnectionManager, ConnectionState } from '../connection'; +import { + addEstablish, + addNetwork, + broadcastTransaction, + getAccount, + isConnected, + onChangeAccount, + onChangeNetwork, + signTransaction, + switchNetwork, +} from '../methods'; +import { WalletProvider } from '../providers'; +import { SDKConfigure } from '../types/config.types'; +import { + AddEstablishOptions, + AddEstablishResponse, + AddNetworkOptions, + AddNetworkResponse, + BroadcastTransactionOptions, + BroadcastTransactionResponse, + GetAccountResponse, + IsConnectedResponse, + OnChangeAccountOptions, + OnChangeAccountResponse, + OnChangeNetworkOptions, + OnChangeNetworkResponse, + SignTransactionOptions, + SignTransactionResponse, + SwitchNetworkOptions, + SwitchNetworkResponse, +} from '../types/methods'; +import { OffConnectionChangeOptions, OffConnectionChangeResponse } from '../types/methods/off-connection-change'; +import { OnConnectionChangeOptions, OnConnectionChangeResponse } from '../types/methods/on-connection-change'; + +const DEFAULT_ADENA_URL = 'https://www.adena.app'; + +function createSDKConfigure({ + isSession = false, + walletDownloadUrl = DEFAULT_ADENA_URL, + ...rest +}: SDKConfigure = {}): SDKConfigure { + return { + ...rest, + isSession, + walletDownloadUrl, + }; +} + +export class AdenaSDK { + private connectionManager: ConnectionManager; + private config: SDKConfigure; + + constructor(provider: WalletProvider, config?: SDKConfigure) { + this.config = createSDKConfigure(config); + this.connectionManager = new ConnectionManager(provider, this.config); + } + + private get walletProvider() { + return this.connectionManager.getWalletProvider(); + } + + async connectWallet(): Promise { + return this.connectionManager.connectWallet().catch(() => { + if (this.config.walletDownloadUrl) { + this.openLink(this.config.walletDownloadUrl); + } + }); + } + + disconnectWallet(): void { + this.connectionManager.disconnectWallet(); + } + + getConnectionState(): ConnectionState { + return this.connectionManager.getConnectionState(); + } + + onConnectionChange(options: OnConnectionChangeOptions): OnConnectionChangeResponse { + return this.connectionManager.on(options.callback); + } + + offConnectionChange(options: OffConnectionChangeOptions): OffConnectionChangeResponse { + return this.connectionManager.off(options.callback); + } + + isConnected(): Promise { + return isConnected(this.walletProvider); + } + + addEstablish(options: AddEstablishOptions): Promise { + return addEstablish(this.walletProvider, options); + } + + getAccount(): Promise { + return getAccount(this.walletProvider); + } + + switchNetwork(options: SwitchNetworkOptions): Promise { + return switchNetwork(this.walletProvider, options); + } + + addNetwork(options: AddNetworkOptions): Promise { + return addNetwork(this.walletProvider, options); + } + + signTransaction(options: SignTransactionOptions): Promise { + return signTransaction(this.walletProvider, options); + } + + broadcastTransaction(options: BroadcastTransactionOptions): Promise { + return broadcastTransaction(this.walletProvider, options); + } + + onChangeAccount(options: OnChangeAccountOptions): OnChangeAccountResponse { + return onChangeAccount(this.walletProvider, options); + } + + onChangeNetwork(options: OnChangeNetworkOptions): OnChangeNetworkResponse { + return onChangeNetwork(this.walletProvider, options); + } + + private openLink(url: string): void { + window?.open(url, '_blank'); + } +} diff --git a/packages/sdk/src/core/sdk/index.ts b/packages/sdk/src/core/sdk/index.ts new file mode 100644 index 0000000..e15f8d3 --- /dev/null +++ b/packages/sdk/src/core/sdk/index.ts @@ -0,0 +1 @@ +export * from './adena-sdk'; diff --git a/packages/sdk/src/core/types/account.types.ts b/packages/sdk/src/core/types/account.types.ts index 1b9f5f1..5a82d20 100644 --- a/packages/sdk/src/core/types/account.types.ts +++ b/packages/sdk/src/core/types/account.types.ts @@ -7,8 +7,8 @@ export type AccountInfo = { chainId: string; sequence: string; status: AccountStatusType; - public_key: { + publicKey: { '@type': string; value: string; - }; + } | null; }; diff --git a/packages/sdk/src/core/types/config.types.ts b/packages/sdk/src/core/types/config.types.ts new file mode 100644 index 0000000..291be38 --- /dev/null +++ b/packages/sdk/src/core/types/config.types.ts @@ -0,0 +1,7 @@ +export interface SDKConfigure extends SDKConnectionConfigure { + walletDownloadUrl?: string; +} + +export interface SDKConnectionConfigure { + isSession?: boolean; +} diff --git a/packages/sdk/src/core/types/index.ts b/packages/sdk/src/core/types/index.ts index 90dffb2..50aaed7 100644 --- a/packages/sdk/src/core/types/index.ts +++ b/packages/sdk/src/core/types/index.ts @@ -1,3 +1,3 @@ -export * from './wallet.types'; export * from './account.types'; export * from './transaction.types'; +export * from './wallet.types'; diff --git a/packages/sdk/src/core/types/methods/add-establish.types.ts b/packages/sdk/src/core/types/methods/add-establish.types.ts new file mode 100644 index 0000000..009cb03 --- /dev/null +++ b/packages/sdk/src/core/types/methods/add-establish.types.ts @@ -0,0 +1,7 @@ +import { WalletResponse } from '../wallet.types'; + +export interface AddEstablishOptions { + siteName?: string; +} + +export type AddEstablishResponse = WalletResponse; diff --git a/packages/sdk/src/core/types/methods/add-network.types.ts b/packages/sdk/src/core/types/methods/add-network.types.ts new file mode 100644 index 0000000..282a45f --- /dev/null +++ b/packages/sdk/src/core/types/methods/add-network.types.ts @@ -0,0 +1,9 @@ +import { WalletResponse } from '../wallet.types'; + +export interface AddNetworkOptions { + chainId: string; + chainName: string; + rpcUrl: string; +} + +export type AddNetworkResponse = WalletResponse; diff --git a/packages/sdk/src/core/types/methods/broadcast-transaction.types.ts b/packages/sdk/src/core/types/methods/broadcast-transaction.types.ts new file mode 100644 index 0000000..0efff0a --- /dev/null +++ b/packages/sdk/src/core/types/methods/broadcast-transaction.types.ts @@ -0,0 +1,12 @@ +import { Tx } from '@gnolang/tm2-js-client'; +import { BroadcastType, TransactionResult, TransactionResultCommit, TransactionResultSync } from '../transaction.types'; +import { WalletResponse } from '../wallet.types'; + +export interface BroadcastTransactionOptions { + tx: Tx; + broadcastType?: BroadcastType; +} + +export type BroadcastTransactionResponse = WalletResponse< + TransactionResult | TransactionResultSync | TransactionResultCommit +>; diff --git a/packages/sdk/src/core/types/methods/get-account.types.ts b/packages/sdk/src/core/types/methods/get-account.types.ts new file mode 100644 index 0000000..4d355b6 --- /dev/null +++ b/packages/sdk/src/core/types/methods/get-account.types.ts @@ -0,0 +1,4 @@ +import { AccountInfo } from '../account.types'; +import { WalletResponse } from '../wallet.types'; + +export type GetAccountResponse = WalletResponse; diff --git a/packages/sdk/src/core/types/methods/index.ts b/packages/sdk/src/core/types/methods/index.ts new file mode 100644 index 0000000..e1611cd --- /dev/null +++ b/packages/sdk/src/core/types/methods/index.ts @@ -0,0 +1,9 @@ +export * from './add-establish.types'; +export * from './add-network.types'; +export * from './broadcast-transaction.types'; +export * from './get-account.types'; +export * from './is-connected.types'; +export * from './on-change-account.types'; +export * from './on-change-network.types'; +export * from './sign-transaction.types'; +export * from './switch-network.types'; diff --git a/packages/sdk/src/core/types/methods/is-connected.types.ts b/packages/sdk/src/core/types/methods/is-connected.types.ts new file mode 100644 index 0000000..dc418a6 --- /dev/null +++ b/packages/sdk/src/core/types/methods/is-connected.types.ts @@ -0,0 +1,3 @@ +import { WalletResponse } from '../wallet.types'; + +export type IsConnectedResponse = WalletResponse; diff --git a/packages/sdk/src/core/types/methods/off-connection-change.ts b/packages/sdk/src/core/types/methods/off-connection-change.ts new file mode 100644 index 0000000..dfece3f --- /dev/null +++ b/packages/sdk/src/core/types/methods/off-connection-change.ts @@ -0,0 +1,7 @@ +import { WalletConnectionEvent } from '../wallet.types'; + +export interface OffConnectionChangeOptions { + callback: (connection: WalletConnectionEvent) => void; +} + +export type OffConnectionChangeResponse = void; diff --git a/packages/sdk/src/core/types/methods/on-change-account.types.ts b/packages/sdk/src/core/types/methods/on-change-account.types.ts new file mode 100644 index 0000000..f8d2739 --- /dev/null +++ b/packages/sdk/src/core/types/methods/on-change-account.types.ts @@ -0,0 +1,5 @@ +export interface OnChangeAccountOptions { + callback: (address: string) => void; +} + +export type OnChangeAccountResponse = void; diff --git a/packages/sdk/src/core/types/methods/on-change-network.types.ts b/packages/sdk/src/core/types/methods/on-change-network.types.ts new file mode 100644 index 0000000..70be75f --- /dev/null +++ b/packages/sdk/src/core/types/methods/on-change-network.types.ts @@ -0,0 +1,5 @@ +export interface OnChangeNetworkOptions { + callback: (chainId: string) => void; +} + +export type OnChangeNetworkResponse = void; diff --git a/packages/sdk/src/core/types/methods/on-connection-change.ts b/packages/sdk/src/core/types/methods/on-connection-change.ts new file mode 100644 index 0000000..14b1718 --- /dev/null +++ b/packages/sdk/src/core/types/methods/on-connection-change.ts @@ -0,0 +1,7 @@ +import { WalletConnectionEvent } from '../wallet.types'; + +export interface OnConnectionChangeOptions { + callback: (connection: WalletConnectionEvent) => void; +} + +export type OnConnectionChangeResponse = void; diff --git a/packages/sdk/src/core/types/methods/sign-transaction.types.ts b/packages/sdk/src/core/types/methods/sign-transaction.types.ts new file mode 100644 index 0000000..3abcfa6 --- /dev/null +++ b/packages/sdk/src/core/types/methods/sign-transaction.types.ts @@ -0,0 +1,9 @@ +import { Tx } from '@gnolang/tm2-js-client'; +import { SingTransaction } from '../transaction.types'; +import { WalletResponse } from '../wallet.types'; + +export interface SignTransactionOptions { + tx: Tx; +} + +export type SignTransactionResponse = WalletResponse; diff --git a/packages/sdk/src/core/types/methods/switch-network.types.ts b/packages/sdk/src/core/types/methods/switch-network.types.ts new file mode 100644 index 0000000..5666973 --- /dev/null +++ b/packages/sdk/src/core/types/methods/switch-network.types.ts @@ -0,0 +1,7 @@ +import { WalletResponse } from '../wallet.types'; + +export interface SwitchNetworkOptions { + chainId: string; +} + +export type SwitchNetworkResponse = WalletResponse; diff --git a/packages/sdk/src/core/types/transaction.types.ts b/packages/sdk/src/core/types/transaction.types.ts index 9edd1fa..156998d 100644 --- a/packages/sdk/src/core/types/transaction.types.ts +++ b/packages/sdk/src/core/types/transaction.types.ts @@ -1,9 +1,9 @@ import { MsgAddPackage, MsgCall, MsgSend } from '@gnolang/gno-js-client'; import { MsgRun } from '@gnolang/gno-js-client/bin/proto/gno/vm'; -export type MessageType = '/bank.MsgSend' | '/vm.m_call' | '/vm.m_addpkg' | '/vm.m_run'; +export type TransactionMessageType = '/bank.MsgSend' | '/vm.m_call' | '/vm.m_addpkg' | '/vm.m_run'; -export type MessageValue = MsgAddPackage | MsgCall | MsgSend | MsgRun; +export type TransactionMessageValue = MsgAddPackage | MsgCall | MsgSend | MsgRun; export enum BroadcastType { SYNC = 'SYNC', @@ -11,8 +11,8 @@ export enum BroadcastType { } export type TransactionMessage = { - type: MessageType; - value: MessageValue; + type: TransactionMessageType; + value: TransactionMessageValue; }; export interface TransactionData { diff --git a/packages/sdk/src/core/types/wallet.types.ts b/packages/sdk/src/core/types/wallet.types.ts index c6ccbf3..1c20ace 100644 --- a/packages/sdk/src/core/types/wallet.types.ts +++ b/packages/sdk/src/core/types/wallet.types.ts @@ -1,3 +1,12 @@ +export interface WalletState { + address: string | null; + connected: boolean; +} + +export type WalletConnectionEvent = 'connect' | 'disconnect'; + +export type WalletListener = (state: WalletState) => void; + export interface WalletResponse { code: number; status: WalletResponseStatus; @@ -11,18 +20,22 @@ export enum WalletResponseStatus { FAILURE = 'failure', } -export type WalletResponseType = WalletResponseSuccessType | WalletResponseFailedType | WalletResponseRejectedType; +export type WalletResponseType = + | WalletResponseSuccessType + | WalletResponseFailureType + | WalletResponseRejectType + | WalletResponseExecuteType; export enum WalletResponseSuccessType { CONNECTION_SUCCESS = 'CONNECTION_SUCCESS', - GET_ACCOUNT_SUCCESS = 'GET_ACCOUNT_SUCCESS', - SIGN_SUCCESS = 'SIGN_SUCCESS', + GET_ACCOUNT_SUCCESS = 'GET_ACCOUNT', + SIGN_SUCCESS = 'SIGN_TX', ADD_NETWORK_SUCCESS = 'ADD_NETWORK_SUCCESS', SWITCH_NETWORK_SUCCESS = 'SWITCH_NETWORK_SUCCESS', TRANSACTION_SUCCESS = 'TRANSACTION_SUCCESS', } -export enum WalletResponseFailedType { +export enum WalletResponseFailureType { NOT_CONNECTED = 'NOT_CONNECTED', UNRESOLVED_TRANSACTION_EXISTS = 'UNRESOLVED_TRANSACTION_EXISTS', INVALID_FORMAT = 'INVALID_FORMAT', @@ -40,10 +53,252 @@ export enum WalletResponseFailedType { UNEXPECTED_ERROR = 'UNEXPECTED_ERROR', } -export enum WalletResponseRejectedType { +export enum WalletResponseRejectType { TRANSACTION_REJECTED = 'TRANSACTION_REJECTED', SIGN_REJECTED = 'SIGN_REJECTED', CONNECTION_REJECTED = 'CONNECTION_REJECTED', SWITCH_NETWORK_REJECTED = 'SWITCH_NETWORK_REJECTED', ADD_NETWORK_REJECTED = 'ADD_NETWORK_REJECTED', } + +export enum WalletResponseExecuteType { + ADD_ESTABLISH = 'ADD_ESTABLISH', + DO_CONTRACT = 'DO_CONTRACT', + GET_ACCOUNT = 'GET_ACCOUNT', + SIGN_AMINO = 'SIGN_AMINO', + SIGN_TX = 'SIGN_TX', + ADD_NETWORK = 'ADD_NETWORK', + SWITCH_NETWORK = 'SWITCH_NETWORK', +} + +const WalletSuccessMessageInfo: Record< + WalletResponseSuccessType, + { code: number; status: WalletResponseStatus; type: WalletResponseType; message: string } +> = { + CONNECTION_SUCCESS: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.CONNECTION_SUCCESS, + message: 'The connection has been successfully established.', + }, + GET_ACCOUNT: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.GET_ACCOUNT_SUCCESS, + message: 'Account information has been successfully returned.', + }, + SIGN_TX: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.SIGN_SUCCESS, + message: 'Signature hash has been successfully generated.', + }, + ADD_NETWORK_SUCCESS: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.ADD_NETWORK_SUCCESS, + message: 'The network has been successfully added.', + }, + SWITCH_NETWORK_SUCCESS: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.SWITCH_NETWORK_SUCCESS, + message: 'The network has been successfully changed.', + }, + TRANSACTION_SUCCESS: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseSuccessType.TRANSACTION_SUCCESS, + message: 'Transaction has been successfully executed.', + }, +} as const; + +const WalletFailureMessageInfo: Record< + WalletResponseFailureType, + { code: number; status: WalletResponseStatus; type: WalletResponseType; message: string } +> = { + NOT_CONNECTED: { + code: 1000, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.NOT_CONNECTED, + message: 'A connection has not been established.', + }, + UNRESOLVED_TRANSACTION_EXISTS: { + code: 1001, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.UNRESOLVED_TRANSACTION_EXISTS, + message: 'An unresolved transaction pop-up exists.', + }, + INVALID_FORMAT: { + code: 1002, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.INVALID_FORMAT, + message: 'The transaction is in an invalid format.', + }, + WALLET_LOCKED: { + code: 2000, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.WALLET_LOCKED, + message: 'Adena is Locked.', + }, + ACCOUNT_MISMATCH: { + code: 3001, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.ACCOUNT_MISMATCH, + message: 'The account does not match the caller.', + }, + NO_ACCOUNT: { + code: 3002, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.NO_ACCOUNT, + message: 'No account found on Adena.', + }, + TRANSACTION_FAILED: { + code: 4001, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.TRANSACTION_FAILED, + message: 'Adena could not execute the transaction.', + }, + SIGN_FAILED: { + code: 4001, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.SIGN_FAILED, + message: 'Adena could not generate the signature hash.', + }, + ALREADY_CONNECTED: { + code: 4001, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.ALREADY_CONNECTED, + message: 'The account is already connected to this website.', + }, + NETWORK_TIMEOUT: { + code: 4001, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.NETWORK_TIMEOUT, + message: 'The network response has timed out.', + }, + REDUNDANT_CHANGE_REQUEST: { + code: 4001, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.REDUNDANT_CHANGE_REQUEST, + message: 'Unable to change to the current network.', + }, + NETWORK_ALREADY_EXISTS: { + code: 4001, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.NETWORK_ALREADY_EXISTS, + message: 'The network already exists.', + }, + UNADDED_NETWORK: { + code: 4001, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.UNADDED_NETWORK, + message: 'The network has not been added on Adena.', + }, + UNSUPPORTED_TYPE: { + code: 4005, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.UNSUPPORTED_TYPE, + message: 'Adena does not support the requested transaction type.', + }, + UNEXPECTED_ERROR: { + code: 9000, + status: WalletResponseStatus.FAILURE, + type: WalletResponseFailureType.UNEXPECTED_ERROR, + message: 'Adena has encountered an unexpected error.', + }, +} as const; + +const WalletRejectMessageInfo: Record< + WalletResponseRejectType, + { code: number; status: WalletResponseStatus; type: WalletResponseType; message: string } +> = { + TRANSACTION_REJECTED: { + code: 4000, + status: WalletResponseStatus.FAILURE, + type: WalletResponseRejectType.TRANSACTION_REJECTED, + message: 'The transaction has been rejected by the user.', + }, + SIGN_REJECTED: { + code: 4000, + status: WalletResponseStatus.FAILURE, + type: WalletResponseRejectType.SIGN_REJECTED, + message: 'The signature has been rejected by the user.', + }, + CONNECTION_REJECTED: { + code: 4000, + status: WalletResponseStatus.FAILURE, + type: WalletResponseRejectType.CONNECTION_REJECTED, + message: 'The connection request has been rejected by the user.', + }, + SWITCH_NETWORK_REJECTED: { + code: 4000, + status: WalletResponseStatus.FAILURE, + type: WalletResponseRejectType.SWITCH_NETWORK_REJECTED, + message: 'Switching the network has been rejected by the user.', + }, + ADD_NETWORK_REJECTED: { + code: 4000, + status: WalletResponseStatus.FAILURE, + type: WalletResponseRejectType.ADD_NETWORK_REJECTED, + message: 'Adding a network has been rejected by the user.', + }, +} as const; + +const WalletExecuteMessageInfo: Record< + WalletResponseExecuteType, + { code: number; status: WalletResponseStatus; type: WalletResponseType; message: string } +> = { + ADD_ESTABLISH: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseExecuteType.ADD_ESTABLISH, + message: 'Establish Connection.', + }, + DO_CONTRACT: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseExecuteType.DO_CONTRACT, + message: 'Do Contract.', + }, + GET_ACCOUNT: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseExecuteType.GET_ACCOUNT, + message: 'Get Account Information.', + }, + SIGN_AMINO: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseExecuteType.SIGN_AMINO, + message: 'Sign Amino', + }, + SIGN_TX: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseExecuteType.SIGN_TX, + message: 'Sign Transaction', + }, + ADD_NETWORK: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseExecuteType.ADD_NETWORK, + message: 'Add Network', + }, + SWITCH_NETWORK: { + code: 0, + status: WalletResponseStatus.SUCCESS, + type: WalletResponseExecuteType.SWITCH_NETWORK, + message: 'Switch Network', + }, +} as const; + +export const WalletMessageInfo: Record< + WalletResponseType, + { code: number; status: WalletResponseStatus; type: WalletResponseType; message: string } +> = { + ...WalletSuccessMessageInfo, + ...WalletFailureMessageInfo, + ...WalletRejectMessageInfo, + ...WalletExecuteMessageInfo, +} as const; diff --git a/packages/sdk/src/core/utils/encode.utils.ts b/packages/sdk/src/core/utils/encode.utils.ts new file mode 100644 index 0000000..993b8eb --- /dev/null +++ b/packages/sdk/src/core/utils/encode.utils.ts @@ -0,0 +1,16 @@ +import { Tx, uint8ArrayToBase64 } from '@gnolang/tm2-js-client'; + +export const hexToUint8Array = (hexString: string) => { + const adjustString = hexString.replace('0x', ''); + return Uint8Array.from(Buffer.from(adjustString, 'hex')); +}; + +/** + * encode a transaction to base64 + * + * @param transaction + * @returns + */ +export const encodeTransaction = (transaction: Tx): string => { + return uint8ArrayToBase64(Tx.encode(transaction).finish()); +}; diff --git a/packages/sdk/src/core/utils/index.ts b/packages/sdk/src/core/utils/index.ts new file mode 100644 index 0000000..e51ddd2 --- /dev/null +++ b/packages/sdk/src/core/utils/index.ts @@ -0,0 +1,4 @@ +export * from './encode.utils'; +export * from './message.utils'; +export * from './storage.utils'; +export * from './transaction.utils'; diff --git a/packages/sdk/src/core/utils/message.utils.ts b/packages/sdk/src/core/utils/message.utils.ts new file mode 100644 index 0000000..737fded --- /dev/null +++ b/packages/sdk/src/core/utils/message.utils.ts @@ -0,0 +1,9 @@ +import { WalletMessageInfo, WalletResponse, WalletResponseType } from '../types'; + +export const makeResponseMessage = (messageType: WalletResponseType, data?: D): WalletResponse => { + const messageInfo = WalletMessageInfo[messageType]; + return { + ...messageInfo, + data: data || null, + }; +}; diff --git a/packages/sdk/src/core/utils/provider.utils.ts b/packages/sdk/src/core/utils/provider.utils.ts new file mode 100644 index 0000000..a8ba524 --- /dev/null +++ b/packages/sdk/src/core/utils/provider.utils.ts @@ -0,0 +1,6 @@ +import { GnoSocialWalletProvider, GnoWalletProvider } from '../../providers'; +import { TM2WalletProvider, WalletProvider } from '../providers'; + +export function isTM2WalletProvider(wallet: WalletProvider): wallet is TM2WalletProvider { + return wallet instanceof GnoWalletProvider || wallet instanceof GnoSocialWalletProvider; +} diff --git a/packages/sdk/src/core/utils/storage.utils.ts b/packages/sdk/src/core/utils/storage.utils.ts new file mode 100644 index 0000000..8e2e30d --- /dev/null +++ b/packages/sdk/src/core/utils/storage.utils.ts @@ -0,0 +1,15 @@ +export function setSessionStorageItem(key: string, value: string): void { + sessionStorage.setItem(key, value); +} + +export function getSessionStorageItem(key: string): string | null { + const storedValue = sessionStorage.getItem(key); + if (storedValue) { + return storedValue; + } + return null; +} + +export function removeSessionStorageItem(key: string): void { + sessionStorage.removeItem(key); +} diff --git a/packages/sdk/src/core/utils/transaction.utils.ts b/packages/sdk/src/core/utils/transaction.utils.ts new file mode 100644 index 0000000..5fd3d6e --- /dev/null +++ b/packages/sdk/src/core/utils/transaction.utils.ts @@ -0,0 +1,74 @@ +import { Tx } from '@gnolang/tm2-js-client'; +import { TransactionMessage } from '../types'; + +export const defaultGasFee = { + amount: 1000000, + denom: 'ugnot', +}; + +export const defaultGasWanted = 1_000_000; + +export class TransactionBuilder { + private _messages: TransactionMessage[] = []; + private _fees: { amount: string; denom: string }[] = []; + private _chainId: string = ''; + private _memo: string = ''; + private _accountNumber: string = ''; + private _sequence: string = ''; + private _gasWanted: string = ''; + + messages(...messages: TransactionMessage[]): TransactionBuilder { + this._messages = messages; + return this; + } + + fees(...fees: { amount: number; denom: string }[]): TransactionBuilder { + this._fees = fees.map((fee) => ({ amount: fee.amount.toString(), denom: fee.denom })); + return this; + } + + gasWanted(amount: number): TransactionBuilder { + this._gasWanted = amount.toString(); + return this; + } + + chainId(chainId: string): TransactionBuilder { + this._chainId = chainId; + return this; + } + + accountNumber(accountNumber: number): TransactionBuilder { + this._accountNumber = accountNumber.toString(); + return this; + } + + sequence(sequence: number): TransactionBuilder { + this._sequence = sequence.toString(); + return this; + } + + memo(memo: string): TransactionBuilder { + this._memo = memo; + return this; + } + + build(): Tx { + const txDocument = { + msgs: this._messages, + fee: { + amount: this._fees, + gas: this._gasWanted, + }, + chain_id: this._chainId, + account_number: this._accountNumber, + sequence: this._sequence, + memo: this._memo, + }; + + return Tx.fromJSON(txDocument); + } + + public static create(): TransactionBuilder { + return new TransactionBuilder().gasWanted(defaultGasWanted).fees(defaultGasFee); + } +} diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 254ec8d..f7da9b2 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -1 +1,2 @@ +export * from './core'; export * from './providers'; diff --git a/packages/sdk/src/providers/adena-wallet/adena-wallet.ts b/packages/sdk/src/providers/adena-wallet/adena-wallet.ts index a179879..1e0999e 100644 --- a/packages/sdk/src/providers/adena-wallet/adena-wallet.ts +++ b/packages/sdk/src/providers/adena-wallet/adena-wallet.ts @@ -1,16 +1,27 @@ -import { - AccountInfo, - BroadcastType, - SingTransaction, - TransactionData, - TransactionResult, - TransactionResultCommit, - TransactionResultSync, - WalletResponse, -} from '../../core/types'; +import { Tx } from '@gnolang/tm2-js-client'; +import { makeResponseMessage } from '../../core'; import { WalletProvider } from '../../core/providers'; -import { mapResponseByAdenaResponse } from './mapper.utils'; -import { AdenaWallet } from './types'; +import { AccountInfo, WalletResponseFailureType, WalletResponseSuccessType } from '../../core/types'; +import { + AddEstablishOptions, + AddEstablishResponse, + AddNetworkOptions, + AddNetworkResponse, + BroadcastTransactionOptions, + BroadcastTransactionResponse, + GetAccountResponse, + IsConnectedResponse, + OnChangeAccountOptions, + OnChangeAccountResponse, + OnChangeNetworkOptions, + OnChangeNetworkResponse, + SignTransactionOptions, + SignTransactionResponse, + SwitchNetworkOptions, + SwitchNetworkResponse, +} from '../../core/types/methods'; +import { isSuccessType, mapResponseByAdenaResponse } from './mapper.utils'; +import { AdenaWallet, TransactionParams } from './types'; export class AdenaWalletProvider implements WalletProvider { private getAdena(): AdenaWallet { @@ -27,65 +38,69 @@ export class AdenaWalletProvider implements WalletProvider { return adena; } - isConnected(): Promise> { - throw new Error('not implements'); + async isConnected(): Promise { + return makeResponseMessage(WalletResponseFailureType.UNSUPPORTED_TYPE, false); } - async addEstablish(name: string): Promise> { + async addEstablish(options: AddEstablishOptions): Promise { const adena = this.getAdena(); + const name = options.siteName || ''; const response = await adena.AddEstablish(name); + const succeed = + isSuccessType(response.type) || response.type === WalletResponseFailureType.ALREADY_CONNECTED.toString(); - return mapResponseByAdenaResponse(response); + if (succeed) { + return makeResponseMessage(WalletResponseSuccessType.CONNECTION_SUCCESS, succeed); + } + return mapResponseByAdenaResponse(response, false); } - async getAccount(): Promise> { + async getAccount(): Promise { const adena = this.getAdena(); const response = await adena.GetAccount(); - const accountInfo: AccountInfo = response.data; + const accountInfo: AccountInfo = { + ...response.data, + }; return mapResponseByAdenaResponse(response, accountInfo); } - async switchNetwork(chainId: string): Promise> { + async switchNetwork(options: SwitchNetworkOptions): Promise { const adena = this.getAdena(); - const response = await adena.SwitchNetwork(chainId); + const response = await adena.SwitchNetwork(options.chainId); return mapResponseByAdenaResponse(response); } - async addNetwork(chainId: string, chainName: string, rpcUrl: string): Promise> { + async addNetwork(options: AddNetworkOptions): Promise { const adena = this.getAdena(); - const response = await adena.AddNetwork({ chainId, chainName, rpcUrl }); + const response = await adena.AddNetwork(options); return mapResponseByAdenaResponse(response); } - async signTransaction(transactionData: TransactionData): Promise> { + async signTransaction(options: SignTransactionOptions): Promise { const adena = this.getAdena(); - const response = await adena.SignTx(transactionData); + const response = await adena.SignTx(Tx.toJSON(options.tx) as TransactionParams); return mapResponseByAdenaResponse(response, response.data); } - async broadcastTransaction( - transactionData: TransactionData, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - broadcastType: BroadcastType = BroadcastType.SYNC - ): Promise> { + async broadcastTransaction(options: BroadcastTransactionOptions): Promise { const adena = this.getAdena(); - const response = await adena.DoContract(transactionData); + const response = await adena.DoContract(Tx.toJSON(options.tx) as TransactionParams); const transactionResult = response.data; return mapResponseByAdenaResponse(response, transactionResult); } - onChangeAccount(callback: (address: string) => void): void { + onChangeAccount(options: OnChangeAccountOptions): OnChangeAccountResponse { const adena = this.getAdena(); - adena.On('changedAccount', callback); + adena.On('changedAccount', options.callback); } - onChangeNetwork(callback: (chainId: string) => void): void { + onChangeNetwork(options: OnChangeNetworkOptions): OnChangeNetworkResponse { const adena = this.getAdena(); - adena.On('changedNetwork', callback); + adena.On('changedNetwork', options.callback); } } diff --git a/packages/sdk/src/providers/adena-wallet/mapper.utils.ts b/packages/sdk/src/providers/adena-wallet/mapper.utils.ts index 54440b7..ed88491 100644 --- a/packages/sdk/src/providers/adena-wallet/mapper.utils.ts +++ b/packages/sdk/src/providers/adena-wallet/mapper.utils.ts @@ -1,23 +1,26 @@ import { WalletResponse, - WalletResponseFailedType, + WalletResponseFailureType, + WalletResponseRejectType, WalletResponseStatus, WalletResponseSuccessType, WalletResponseType, - WalletResponseRejectedType, } from '../../core/types'; import { AdenaResponse, AdenaResponseStatus } from './types'; export function isSuccessType(type: WalletResponseType | string): type is WalletResponseSuccessType { - return Object.values(WalletResponseSuccessType).includes(type as WalletResponseSuccessType); + const typeValue = type.toString(); + return !!Object.values(WalletResponseSuccessType).find((value) => value === typeValue); } -export function isFailedType(type: WalletResponseType | string): type is WalletResponseFailedType { - return Object.values(WalletResponseFailedType).includes(type as WalletResponseFailedType); +export function isFailedType(type: WalletResponseType | string): type is WalletResponseFailureType { + const typeValue = type.toString(); + return !!Object.values(WalletResponseFailureType).find((value) => value === typeValue); } -export function isRejectType(type: WalletResponseType | string): type is WalletResponseRejectedType { - return Object.values(WalletResponseRejectedType).includes(type as WalletResponseRejectedType); +export function isRejectType(type: WalletResponseType | string): type is WalletResponseRejectType { + const typeValue = type.toString(); + return !!Object.values(WalletResponseRejectType).find((value) => value === typeValue); } function mapResponseStatus(status: AdenaResponseStatus): WalletResponseStatus { diff --git a/packages/sdk/src/providers/adena-wallet/types/general.ts b/packages/sdk/src/providers/adena-wallet/types/general.ts index f16f399..a938900 100644 --- a/packages/sdk/src/providers/adena-wallet/types/general.ts +++ b/packages/sdk/src/providers/adena-wallet/types/general.ts @@ -27,10 +27,10 @@ export type GetAccountResponseData = { chainId: string; sequence: string; status: EAccountStatus; - public_key: { + publicKey: { '@type': string; value: string; - }; + } | null; }; type GetAccountResponse = AdenaResponse; diff --git a/packages/sdk/src/providers/adena-wallet/types/transactions.ts b/packages/sdk/src/providers/adena-wallet/types/transactions.ts index e4bf450..e0f014d 100644 --- a/packages/sdk/src/providers/adena-wallet/types/transactions.ts +++ b/packages/sdk/src/providers/adena-wallet/types/transactions.ts @@ -13,7 +13,7 @@ export type ContractMessage = { value: TMessage; }; -type TransactionParams = { +export type TransactionParams = { messages: ContractMessage[]; gasFee: number; gasWanted: number; diff --git a/packages/sdk/src/providers/index.ts b/packages/sdk/src/providers/index.ts index 0a1c3e8..d199075 100644 --- a/packages/sdk/src/providers/index.ts +++ b/packages/sdk/src/providers/index.ts @@ -1,2 +1 @@ export * from './adena-wallet'; -export * from './wallet'; diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json index eb6ed28..1a9bff2 100644 --- a/packages/sdk/tsconfig.json +++ b/packages/sdk/tsconfig.json @@ -10,7 +10,8 @@ "strict": true, "skipLibCheck": true, "declaration": true, - "strictPropertyInitialization": false + "strictPropertyInitialization": false, + "allowSyntheticDefaultImports": true }, "include": ["./src/**/*.ts"], "exclude": ["./node_modules"] diff --git a/packages/sdk/tsup.config.ts b/packages/sdk/tsup.config.ts index 5d6de2d..a976781 100644 --- a/packages/sdk/tsup.config.ts +++ b/packages/sdk/tsup.config.ts @@ -1,11 +1,11 @@ -import { defineConfig } from "tsup"; +import { defineConfig } from 'tsup'; export default defineConfig({ - entry: ["src/index.ts"], - format: ["cjs", "esm"], // Build for commonJS and ESModules - dts: true, // Generate declaration file (.d.ts) - splitting: false, - sourcemap: true, - clean: true, - outDir: "bin" + entry: ['src/index.ts'], + format: ['cjs', 'esm'], // Build for commonJS and ESModules + dts: true, // Generate declaration file (.d.ts) + splitting: false, + sourcemap: true, + clean: true, + outDir: 'bin', }); diff --git a/yarn.lock b/yarn.lock index da7c0e6..1f84ac2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,6 +10,7 @@ __metadata: resolution: "@adena-wallet/sdk@workspace:packages/sdk" dependencies: "@gnolang/gno-js-client": "npm:^1.3.0" + "@gnolang/tm2-js-client": "npm:^1.2.1" "@types/eslint": "npm:^9" "@types/jest": "npm:^29.5.12" "@types/node": "npm:^22.0.0" @@ -47,9 +48,9 @@ __metadata: linkType: hard "@babel/compat-data@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/compat-data@npm:7.25.2" - checksum: 10c0/5bf1f14d6e5f0d37c19543e99209ff4a94bb97915e1ce01e5334a144aa08cd56b6e62ece8135dac77e126723d63d4d4b96fc603a12c43b88c28f4b5e070270c5 + version: 7.25.4 + resolution: "@babel/compat-data@npm:7.25.4" + checksum: 10c0/50d79734d584a28c69d6f5b99adfaa064d0f41609a378aef04eb06accc5b44f8520e68549eba3a082478180957b7d5783f1bfb1672e4ae8574e797ce8bae79fa languageName: node linkType: hard @@ -76,15 +77,15 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.7.2": - version: 7.25.0 - resolution: "@babel/generator@npm:7.25.0" +"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.6, @babel/generator@npm:^7.7.2": + version: 7.25.6 + resolution: "@babel/generator@npm:7.25.6" dependencies: - "@babel/types": "npm:^7.25.0" + "@babel/types": "npm:^7.25.6" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^2.5.1" - checksum: 10c0/d0e2dfcdc8bdbb5dded34b705ceebf2e0bc1b06795a1530e64fb6a3ccf313c189db7f60c1616effae48114e1a25adc75855bc4496f3779a396b3377bae718ce7 + checksum: 10c0/f89282cce4ddc63654470b98086994d219407d025497f483eb03ba102086e11e2b685b27122f6ff2e1d93b5b5fa0c3a6b7e974fbf2e4a75b685041a746a4291e languageName: node linkType: hard @@ -125,7 +126,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.8.0": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.24.8 resolution: "@babel/helper-plugin-utils@npm:7.24.8" checksum: 10c0/0376037f94a3bfe6b820a39f81220ac04f243eaee7193774b983e956c1750883ff236b30785795abbcda43fac3ece74750566830c2daa4d6e3870bb0dff34c2d @@ -164,12 +165,12 @@ __metadata: linkType: hard "@babel/helpers@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helpers@npm:7.25.0" + version: 7.25.6 + resolution: "@babel/helpers@npm:7.25.6" dependencies: "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10c0/b7fe007fc4194268abf70aa3810365085e290e6528dcb9fbbf7a765d43c74b6369ce0f99c5ccd2d44c413853099daa449c9a0123f0b212ac8d18643f2e8174b8 + "@babel/types": "npm:^7.25.6" + checksum: 10c0/448c1cdabccca42fd97a252f73f1e4bcd93776dbf24044f3b4f49b756bf2ece73ee6df05177473bb74ea7456dddd18d6f481e4d96d2cc7839d078900d48c696c languageName: node linkType: hard @@ -185,12 +186,14 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/parser@npm:7.25.0" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/parser@npm:7.25.6" + dependencies: + "@babel/types": "npm:^7.25.6" bin: parser: ./bin/babel-parser.js - checksum: 10c0/4aecf13829fa6f4a66835429bd235458544d9cd14374b17c19bc7726f472727ca33f500e51e1298ddc72db93bdd77fcaa9ddc095200b0b792173069e6cf9742e + checksum: 10c0/f88a0e895dbb096fd37c4527ea97d12b5fc013720602580a941ac3a339698872f0c911e318c292b184c36b5fbe23b612f05aff9d24071bc847c7b1c21552c41d languageName: node linkType: hard @@ -216,7 +219,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-class-properties@npm:^7.8.3": +"@babel/plugin-syntax-class-properties@npm:^7.12.13": version: 7.12.13 resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: @@ -227,7 +230,29 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-meta@npm:^7.8.3": +"@babel/plugin-syntax-class-static-block@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-attributes@npm:^7.24.7": + version: 7.25.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.25.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0e9359cf2d117476310961dfcfd7204ed692e933707da10d6194153d3996cd2ea5b7635fc90d720dce3612083af89966bb862561064a509c350320dc98644751 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" dependencies: @@ -260,7 +285,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" dependencies: @@ -282,7 +307,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" dependencies: @@ -326,7 +351,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-top-level-await@npm:^7.8.3": +"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": version: 7.14.5 resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" dependencies: @@ -338,22 +374,22 @@ __metadata: linkType: hard "@babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.24.7 - resolution: "@babel/plugin-syntax-typescript@npm:7.24.7" + version: 7.25.4 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cdabd2e8010fb0ad15b49c2c270efc97c4bfe109ead36c7bbcf22da7a74bc3e49702fc4f22f12d2d6049e8e22a5769258df1fd05f0420ae45e11bdd5bc07805a + checksum: 10c0/199919d44c73e5edee9ffd311cf638f88d26a810189e32d338c46c7600441fd5c4a2e431f9be377707cbf318410895304e90b83bf8d9011d205150fa7f260e63 languageName: node linkType: hard "@babel/runtime@npm:^7.11.2": - version: 7.25.0 - resolution: "@babel/runtime@npm:7.25.0" + version: 7.25.6 + resolution: "@babel/runtime@npm:7.25.6" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/bd3faf246170826cef2071a94d7b47b49d532351360ecd17722d03f6713fd93a3eb3dbd9518faa778d5e8ccad7392a7a604e56bd37aaad3f3aa68d619ccd983d + checksum: 10c0/d6143adf5aa1ce79ed374e33fdfd74fa975055a80bc6e479672ab1eadc4e4bfd7484444e17dd063a1d180e051f3ec62b357c7a2b817e7657687b47313158c3d2 languageName: node linkType: hard @@ -369,28 +405,28 @@ __metadata: linkType: hard "@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/traverse@npm:7.25.2" + version: 7.25.6 + resolution: "@babel/traverse@npm:7.25.6" dependencies: "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.0" + "@babel/generator": "npm:^7.25.6" + "@babel/parser": "npm:^7.25.6" "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.2" + "@babel/types": "npm:^7.25.6" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/1edcb602801d6ea577584e957a3f6ad48753c4ccb9373fce4c92ebfdee04833f5bd5f1b74758ab7d61fe66d6d83ffdd7c8d482f46199767feeaed6af7df2191e + checksum: 10c0/964304c6fa46bd705428ba380bf73177eeb481c3f26d82ea3d0661242b59e0dd4329d23886035e9ca9a4ceb565c03a76fd615109830687a27bcd350059d6377e languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": - version: 7.25.2 - resolution: "@babel/types@npm:7.25.2" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6, @babel/types@npm:^7.3.3": + version: 7.25.6 + resolution: "@babel/types@npm:7.25.6" dependencies: "@babel/helper-string-parser": "npm:^7.24.8" "@babel/helper-validator-identifier": "npm:^7.24.7" to-fast-properties: "npm:^2.0.0" - checksum: 10c0/e489435856be239f8cc1120c90a197e4c2865385121908e5edb7223cfdff3768cba18f489adfe0c26955d9e7bbb1fb10625bc2517505908ceb0af848989bd864 + checksum: 10c0/89d45fbee24e27a05dca2d08300a26b905bd384a480448823f6723c72d3a30327c517476389b7280ce8cb9a2c48ef8f47da7f9f6d326faf6f53fd6b68237bdc4 languageName: node linkType: hard @@ -479,170 +515,170 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/aix-ppc64@npm:0.23.0" +"@esbuild/aix-ppc64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/aix-ppc64@npm:0.23.1" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/android-arm64@npm:0.23.0" +"@esbuild/android-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/android-arm64@npm:0.23.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/android-arm@npm:0.23.0" +"@esbuild/android-arm@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/android-arm@npm:0.23.1" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/android-x64@npm:0.23.0" +"@esbuild/android-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/android-x64@npm:0.23.1" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/darwin-arm64@npm:0.23.0" +"@esbuild/darwin-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/darwin-arm64@npm:0.23.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/darwin-x64@npm:0.23.0" +"@esbuild/darwin-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/darwin-x64@npm:0.23.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/freebsd-arm64@npm:0.23.0" +"@esbuild/freebsd-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/freebsd-arm64@npm:0.23.1" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/freebsd-x64@npm:0.23.0" +"@esbuild/freebsd-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/freebsd-x64@npm:0.23.1" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/linux-arm64@npm:0.23.0" +"@esbuild/linux-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-arm64@npm:0.23.1" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/linux-arm@npm:0.23.0" +"@esbuild/linux-arm@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-arm@npm:0.23.1" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/linux-ia32@npm:0.23.0" +"@esbuild/linux-ia32@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-ia32@npm:0.23.1" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/linux-loong64@npm:0.23.0" +"@esbuild/linux-loong64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-loong64@npm:0.23.1" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/linux-mips64el@npm:0.23.0" +"@esbuild/linux-mips64el@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-mips64el@npm:0.23.1" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/linux-ppc64@npm:0.23.0" +"@esbuild/linux-ppc64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-ppc64@npm:0.23.1" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/linux-riscv64@npm:0.23.0" +"@esbuild/linux-riscv64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-riscv64@npm:0.23.1" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/linux-s390x@npm:0.23.0" +"@esbuild/linux-s390x@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-s390x@npm:0.23.1" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/linux-x64@npm:0.23.0" +"@esbuild/linux-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-x64@npm:0.23.1" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/netbsd-x64@npm:0.23.0" +"@esbuild/netbsd-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/netbsd-x64@npm:0.23.1" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/openbsd-arm64@npm:0.23.0" +"@esbuild/openbsd-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/openbsd-arm64@npm:0.23.1" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/openbsd-x64@npm:0.23.0" +"@esbuild/openbsd-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/openbsd-x64@npm:0.23.1" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/sunos-x64@npm:0.23.0" +"@esbuild/sunos-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/sunos-x64@npm:0.23.1" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/win32-arm64@npm:0.23.0" +"@esbuild/win32-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/win32-arm64@npm:0.23.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/win32-ia32@npm:0.23.0" +"@esbuild/win32-ia32@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/win32-ia32@npm:0.23.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.23.0": - version: 0.23.0 - resolution: "@esbuild/win32-x64@npm:0.23.0" +"@esbuild/win32-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/win32-x64@npm:0.23.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -665,14 +701,14 @@ __metadata: languageName: node linkType: hard -"@eslint/config-array@npm:^0.17.1": - version: 0.17.1 - resolution: "@eslint/config-array@npm:0.17.1" +"@eslint/config-array@npm:^0.18.0": + version: 0.18.0 + resolution: "@eslint/config-array@npm:0.18.0" dependencies: "@eslint/object-schema": "npm:^2.1.4" debug: "npm:^4.3.1" minimatch: "npm:^3.1.2" - checksum: 10c0/b986a0a96f2b42467578968ce3d4ae3b9284e587f8490f2dcdc44ff1b8d30580c62b221da6e58d07b09e156c3050e2dc38267f9370521d9cafc099c4e30154ef + checksum: 10c0/0234aeb3e6b052ad2402a647d0b4f8a6aa71524bafe1adad0b8db1dfe94d7f5f26d67c80f79bb37ac61361a1d4b14bb8fb475efe501de37263cf55eabb79868f languageName: node linkType: hard @@ -693,10 +729,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.8.0": - version: 9.8.0 - resolution: "@eslint/js@npm:9.8.0" - checksum: 10c0/42edaae6b020436410454579509dcb6a8cd5b260e9f18e037fd803ae28d35eb13663d4019f0ab8ba686a19d3c4a43b0e11394c148e23345377ab694da0e83262 +"@eslint/js@npm:9.9.1": + version: 9.9.1 + resolution: "@eslint/js@npm:9.9.1" + checksum: 10c0/a3a91de2ce78469f7c4eee78c1eba77360706e1d0fa0ace2e19102079bcf237b851217c85ea501dc92c4c3719d60d9df966977abc8554d4c38e3638c1f53dcb2 languageName: node linkType: hard @@ -1104,9 +1140,9 @@ __metadata: linkType: hard "@noble/hashes@npm:^1": - version: 1.4.0 - resolution: "@noble/hashes@npm:1.4.0" - checksum: 10c0/8c3f005ee72e7b8f9cff756dfae1241485187254e3f743873e22073d63906863df5d4f13d441b7530ea614b7a093f0d889309f28b59850f33b66cb26a779a4a5 + version: 1.5.0 + resolution: "@noble/hashes@npm:1.5.0" + checksum: 10c0/1b46539695fbfe4477c0822d90c881a04d4fa2921c08c552375b444a48cac9930cb1ee68de0a3c7859e676554d0f3771999716606dc4d8f826e414c11692cdd9 languageName: node linkType: hard @@ -1239,114 +1275,114 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.19.2" +"@rollup/rollup-android-arm-eabi@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.21.2" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-android-arm64@npm:4.19.2" +"@rollup/rollup-android-arm64@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-android-arm64@npm:4.21.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-darwin-arm64@npm:4.19.2" +"@rollup/rollup-darwin-arm64@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.21.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-darwin-x64@npm:4.19.2" +"@rollup/rollup-darwin-x64@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.21.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.19.2" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.21.2" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.19.2" +"@rollup/rollup-linux-arm-musleabihf@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.21.2" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.19.2" +"@rollup/rollup-linux-arm64-gnu@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.21.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.19.2" +"@rollup/rollup-linux-arm64-musl@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.21.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.19.2" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.2" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.19.2" +"@rollup/rollup-linux-riscv64-gnu@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.21.2" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.19.2" +"@rollup/rollup-linux-s390x-gnu@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.21.2" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.19.2" +"@rollup/rollup-linux-x64-gnu@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.21.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.19.2" +"@rollup/rollup-linux-x64-musl@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.21.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.19.2" +"@rollup/rollup-win32-arm64-msvc@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.21.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.19.2" +"@rollup/rollup-win32-ia32-msvc@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.21.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.19.2": - version: 4.19.2 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.19.2" +"@rollup/rollup-win32-x64-msvc@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.21.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1446,12 +1482,12 @@ __metadata: linkType: hard "@types/eslint@npm:^9": - version: 9.6.0 - resolution: "@types/eslint@npm:9.6.0" + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" dependencies: "@types/estree": "npm:*" "@types/json-schema": "npm:*" - checksum: 10c0/69301356bc73b85e381ae00931291de2e96d1cc49a112c592c74ee32b2f85412203dea6a333b4315fd9839bb14f364f265cbfe7743fc5a78492ee0326dd6a2c1 + checksum: 10c0/69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e languageName: node linkType: hard @@ -1513,21 +1549,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^22.0.0": - version: 22.0.0 - resolution: "@types/node@npm:22.0.0" - dependencies: - undici-types: "npm:~6.11.1" - checksum: 10c0/af26a8ec7266c857b0ced75dc3a93c6b65280d1fa40d1b4488c814d30831c5c752489c99ecb5698daec1376145b1a9ddd08350882dc2e07769917a5f22a460bc - languageName: node - linkType: hard - -"@types/node@npm:>=13.7.0": - version: 22.1.0 - resolution: "@types/node@npm:22.1.0" +"@types/node@npm:*, @types/node@npm:>=13.7.0, @types/node@npm:^22.0.0": + version: 22.5.3 + resolution: "@types/node@npm:22.5.3" dependencies: - undici-types: "npm:~6.13.0" - checksum: 10c0/553dafcb842b889c036d43b390d464e8ffcf3ca455ddd5b1a1ef98396381eafbeb0c112a15cc6bf9662b72bc25fc45efc4b6f604760e1e84c410f1b7936c488b + undici-types: "npm:~6.19.2" + checksum: 10c0/a068e31dd424a0eadfba7d9a5c5b415b76cfd729f3caa299674ad257f59df85c5fe77f1d0a343e811864c790baefb9003d7627618ee3cf85400af338481ba29f languageName: node linkType: hard @@ -1553,23 +1580,23 @@ __metadata: linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.32 - resolution: "@types/yargs@npm:17.0.32" + version: 17.0.33 + resolution: "@types/yargs@npm:17.0.33" dependencies: "@types/yargs-parser": "npm:*" - checksum: 10c0/2095e8aad8a4e66b86147415364266b8d607a3b95b4239623423efd7e29df93ba81bb862784a6e08664f645cc1981b25fd598f532019174cd3e5e1e689e1cccf + checksum: 10c0/d16937d7ac30dff697801c3d6f235be2166df42e4a88bf730fa6dc09201de3727c0a9500c59a672122313341de5f24e45ee0ff579c08ce91928e519090b7906b languageName: node linkType: hard "@typescript-eslint/eslint-plugin@npm:^8.2.0": - version: 8.2.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.2.0" + version: 8.4.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.4.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.2.0" - "@typescript-eslint/type-utils": "npm:8.2.0" - "@typescript-eslint/utils": "npm:8.2.0" - "@typescript-eslint/visitor-keys": "npm:8.2.0" + "@typescript-eslint/scope-manager": "npm:8.4.0" + "@typescript-eslint/type-utils": "npm:8.4.0" + "@typescript-eslint/utils": "npm:8.4.0" + "@typescript-eslint/visitor-keys": "npm:8.4.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -1580,68 +1607,68 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/17243ee1b34d78723fe3e1a308c64490eee49bd83301e3abe8a6f05bce05434d70f56caf75756b8cffa051154dc89cdf485114ede6781fc087f0aaca37a026ec + checksum: 10c0/c75e9bb176e9e0277c9f9c4c006bc2c31ac91984e555de1390a9bbe876e3b6787d59d96015b3f0cd083fd22c814aea4ed4858910d3afdd24d64ab79815da31e5 languageName: node linkType: hard "@typescript-eslint/parser@npm:^8.2.0": - version: 8.2.0 - resolution: "@typescript-eslint/parser@npm:8.2.0" + version: 8.4.0 + resolution: "@typescript-eslint/parser@npm:8.4.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.2.0" - "@typescript-eslint/types": "npm:8.2.0" - "@typescript-eslint/typescript-estree": "npm:8.2.0" - "@typescript-eslint/visitor-keys": "npm:8.2.0" + "@typescript-eslint/scope-manager": "npm:8.4.0" + "@typescript-eslint/types": "npm:8.4.0" + "@typescript-eslint/typescript-estree": "npm:8.4.0" + "@typescript-eslint/visitor-keys": "npm:8.4.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/bb4ebc0a40b5e68c5287de17af3acf3045e2ef7886ebee8d1c4a6fd07bd6d55e9fc12bc7b89d07d15a2a4182cbf6380b50ad148d4a37e93d2e54930aa386a3bf + checksum: 10c0/19f3358e5bc4bbad693183eefe1a90ea64be054a934bc2c8a972ff4738b94580b55ad4955af5797db42298628caa59b3ba3f9fd960582b5fc2c836da3a4578a5 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.2.0": - version: 8.2.0 - resolution: "@typescript-eslint/scope-manager@npm:8.2.0" +"@typescript-eslint/scope-manager@npm:8.4.0": + version: 8.4.0 + resolution: "@typescript-eslint/scope-manager@npm:8.4.0" dependencies: - "@typescript-eslint/types": "npm:8.2.0" - "@typescript-eslint/visitor-keys": "npm:8.2.0" - checksum: 10c0/8026e11d9cfbb674c62eb38929d08d42c4a373f3463c2591ed6603c496d3d00321f553edce47f1d7504b55fcbe9664ea2bdcaa3131c8c834bde1b1f07497af5d + "@typescript-eslint/types": "npm:8.4.0" + "@typescript-eslint/visitor-keys": "npm:8.4.0" + checksum: 10c0/95188c663df7db106529c6b93c4c7c61647ed34ab6dd48114e41ddf49140ff606c5501ce2ae451a988ec49b5d3874ea96ff212fc102802327b10affd2ff80a37 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.2.0": - version: 8.2.0 - resolution: "@typescript-eslint/type-utils@npm:8.2.0" +"@typescript-eslint/type-utils@npm:8.4.0": + version: 8.4.0 + resolution: "@typescript-eslint/type-utils@npm:8.4.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.2.0" - "@typescript-eslint/utils": "npm:8.2.0" + "@typescript-eslint/typescript-estree": "npm:8.4.0" + "@typescript-eslint/utils": "npm:8.4.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/5ff387d39fec3ba47af167ca3e48a200f87e4b97b010170245f495cd3d2e30fd0a5b2a9b27aae2ae929c99f92acabcd07315944dc6f9de963bad1c61ba9ea53c + checksum: 10c0/ae51100594d9ca61c7577b5aed0bd10c1959725df5c38cd9653eed1fd3dbdfff9146b6e48f3409994b4c8d781b9d95025c36b30f73a5a1b3dbdee6d142cecc87 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.2.0": - version: 8.2.0 - resolution: "@typescript-eslint/types@npm:8.2.0" - checksum: 10c0/2ffba0d0183dfdd2f859fb414013d17d009f5e886664823f973aaa1145243fceb52cfe26aa7c50208af7833b3703b7788337f1aab136c9a4eb36d905493847d1 +"@typescript-eslint/types@npm:8.4.0": + version: 8.4.0 + resolution: "@typescript-eslint/types@npm:8.4.0" + checksum: 10c0/15e09ced84827c349553530a31822f06ae5bad456c03d561b7d0c64b6ad9b5d7ca795e030bd93e65d5a2cd41bfde36ed08dcd2ff9feaa8b60a67080827f47ecb languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.2.0": - version: 8.2.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.2.0" +"@typescript-eslint/typescript-estree@npm:8.4.0": + version: 8.4.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.4.0" dependencies: - "@typescript-eslint/types": "npm:8.2.0" - "@typescript-eslint/visitor-keys": "npm:8.2.0" + "@typescript-eslint/types": "npm:8.4.0" + "@typescript-eslint/visitor-keys": "npm:8.4.0" debug: "npm:^4.3.4" - globby: "npm:^11.1.0" + fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" minimatch: "npm:^9.0.4" semver: "npm:^7.6.0" @@ -1649,31 +1676,31 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/f49aabc78e396908307394812fdebc4015ca407983efc361be106d3e2d58971dec4a1a725362fcfbd637f3d8150baa0735eb5929fd170172b7f2a65e06eeb3d2 + checksum: 10c0/170702b024121cff9268f53de8054796b0ce025f9a78d6f2bc850a360e5f3f7032ba3ee9d4b7392726308273a5f3ade5ab31b1788b504b514bc15afc07302b37 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.2.0": - version: 8.2.0 - resolution: "@typescript-eslint/utils@npm:8.2.0" +"@typescript-eslint/utils@npm:8.4.0": + version: 8.4.0 + resolution: "@typescript-eslint/utils@npm:8.4.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.2.0" - "@typescript-eslint/types": "npm:8.2.0" - "@typescript-eslint/typescript-estree": "npm:8.2.0" + "@typescript-eslint/scope-manager": "npm:8.4.0" + "@typescript-eslint/types": "npm:8.4.0" + "@typescript-eslint/typescript-estree": "npm:8.4.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: 10c0/0f3d5cf804c2863ea9432ef76bfdb1cadbb244cbf8a64ac77c0e559c012a1e98382c4535354e54696c564c0abd9c10dffc78d38972c97035e963798d360d1830 + checksum: 10c0/8c9c36b3aa23f9bcc28cc4b10f0fa2996f1bc6cdd75135f08c2ef734baa30dbd2a8b92f344b90518e1fd07a486936734789fc7e90b780221a7707dad8e9c9364 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.2.0": - version: 8.2.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.2.0" +"@typescript-eslint/visitor-keys@npm:8.4.0": + version: 8.4.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.4.0" dependencies: - "@typescript-eslint/types": "npm:8.2.0" + "@typescript-eslint/types": "npm:8.4.0" eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/788633bd2905c88ea2cf20d9e317a2bc992a70fcf725cb54bbe55a17c42138a6fe877c89fbda41a733e0e8ad6dce893163bada60509a1b856321f4329a316973 + checksum: 10c0/339199b7fbb9ac83b530d03ab25f6bc5ceb688c9cd0ae460112cd14ee78ca7284a845aef5620cdf70170980123475ec875e85ebf595c60255ba3c0d6fe48c714 languageName: node linkType: hard @@ -1851,9 +1878,9 @@ __metadata: linkType: hard "async@npm:^3.2.3": - version: 3.2.5 - resolution: "async@npm:3.2.5" - checksum: 10c0/1408287b26c6db67d45cb346e34892cee555b8b59e6c68e6f8c3e495cad5ca13b4f218180e871f3c2ca30df4ab52693b66f2f6ff43644760cab0b2198bda79c1 + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 languageName: node linkType: hard @@ -1918,24 +1945,27 @@ __metadata: linkType: hard "babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.0.1 - resolution: "babel-preset-current-node-syntax@npm:1.0.1" + version: 1.1.0 + resolution: "babel-preset-current-node-syntax@npm:1.1.0" dependencies: "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-bigint": "npm:^7.8.3" - "@babel/plugin-syntax-class-properties": "npm:^7.8.3" - "@babel/plugin-syntax-import-meta": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.12.13" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" + "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-top-level-await": "npm:^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/5ba39a3a0e6c37d25e56a4fb843be632dac98d54706d8a0933f9bcb1a07987a96d55c2b5a6c11788a74063fb2534fe68c1f1dbb6c93626850c785e0938495627 + checksum: 10c0/0b838d4412e3322cb4436f246e24e9c00bebcedfd8f00a2f51489db683bd35406bbd55a700759c28d26959c6e03f84dd6a1426f576f440267c1d7a73c5717281 languageName: node linkType: hard @@ -2029,20 +2059,20 @@ __metadata: linkType: hard "browserslist@npm:^4.23.1": - version: 4.23.2 - resolution: "browserslist@npm:4.23.2" + version: 4.23.3 + resolution: "browserslist@npm:4.23.3" dependencies: - caniuse-lite: "npm:^1.0.30001640" - electron-to-chromium: "npm:^1.4.820" - node-releases: "npm:^2.0.14" + caniuse-lite: "npm:^1.0.30001646" + electron-to-chromium: "npm:^1.5.4" + node-releases: "npm:^2.0.18" update-browserslist-db: "npm:^1.1.0" bin: browserslist: cli.js - checksum: 10c0/0217d23c69ed61cdd2530c7019bf7c822cd74c51f8baab18dd62457fed3129f52499f8d3a6f809ae1fb7bb3050aa70caa9a529cc36c7478427966dbf429723a5 + checksum: 10c0/3063bfdf812815346447f4796c8f04601bf5d62003374305fd323c2a463e42776475bcc5309264e39bcf9a8605851e53560695991a623be988138b3ff8c66642 languageName: node linkType: hard -"bs-logger@npm:0.x": +"bs-logger@npm:^0.2.6": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" dependencies: @@ -2126,10 +2156,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001640": - version: 1.0.30001644 - resolution: "caniuse-lite@npm:1.0.30001644" - checksum: 10c0/96de82909f3ba9f44e5b261c42d3d8814ba99b7b8b48eb8f8eafb7015804ccb2bc2120c5fbc5e193e14e0c87bf1cd0d4de920d8f5a5b477e66e8f0c3972d0eb7 +"caniuse-lite@npm:^1.0.30001646": + version: 1.0.30001655 + resolution: "caniuse-lite@npm:1.0.30001655" + checksum: 10c0/fff0c0c3ffcba89828bfa6b99f118e82c064f46f15bb8655b9f2a352a3f552ccac0b87a9fe9532f8c5a29e284aae5579791e196480ec717d11ef1d1a1c2e3ff9 languageName: node linkType: hard @@ -2195,9 +2225,9 @@ __metadata: linkType: hard "cjs-module-lexer@npm:^1.0.0": - version: 1.3.1 - resolution: "cjs-module-lexer@npm:1.3.1" - checksum: 10c0/cd98fbf3c7f4272fb0ebf71d08d0c54bc75ce0e30b9d186114e15b4ba791f3d310af65a339eea2a0318599af2818cdd8886d353b43dfab94468f72987397ad16 + version: 1.4.0 + resolution: "cjs-module-lexer@npm:1.4.0" + checksum: 10c0/b5ef03e10297c24f0db56b13d7d2f92e377499c83d7bf9352ec73df544b5310e024dfb1779a6b810e7a06eb18caa6a0e2da5f11df8116af73306f362e67fb61a languageName: node linkType: hard @@ -2430,16 +2460,16 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.820": - version: 1.5.3 - resolution: "electron-to-chromium@npm:1.5.3" - checksum: 10c0/acd4dad650dafa16c4bd19868fe79c58ae3208f666d868ef8d4c81012707b2855b1816241d1c243b50c75a6933817a9e33401a5a17bc4222c52a5ee8abf457e8 +"electron-to-chromium@npm:^1.5.4": + version: 1.5.13 + resolution: "electron-to-chromium@npm:1.5.13" + checksum: 10c0/1d88ac39447e1d718c4296f92fe89836df4688daf2d362d6c49108136795f05a56dd9c950f1c6715e0395fa037c3b5f5ea686c543fdc90e6d74a005877c45022 languageName: node linkType: hard "elliptic@npm:^6.5.4": - version: 6.5.6 - resolution: "elliptic@npm:6.5.6" + version: 6.5.7 + resolution: "elliptic@npm:6.5.7" dependencies: bn.js: "npm:^4.11.9" brorand: "npm:^1.1.0" @@ -2448,7 +2478,7 @@ __metadata: inherits: "npm:^2.0.4" minimalistic-assert: "npm:^1.0.1" minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/635ccd2b3c76a8506071804fc1f7b34db62f8b1b570032f593417f2a84853211d891003ec952730a310577ac30898bc338c91c10d53d4b9e13339896b05420a1 + checksum: 10c0/799959b6c54ea3564e8961f35abdf8c77e37617f3051614b05ab1fb6a04ddb65bd1caa75ed1bae375b15dda312a0f79fed26ebe76ecf05c5a7af244152a601b8 languageName: node linkType: hard @@ -2506,33 +2536,33 @@ __metadata: linkType: hard "esbuild@npm:^0.23.0": - version: 0.23.0 - resolution: "esbuild@npm:0.23.0" - dependencies: - "@esbuild/aix-ppc64": "npm:0.23.0" - "@esbuild/android-arm": "npm:0.23.0" - "@esbuild/android-arm64": "npm:0.23.0" - "@esbuild/android-x64": "npm:0.23.0" - "@esbuild/darwin-arm64": "npm:0.23.0" - "@esbuild/darwin-x64": "npm:0.23.0" - "@esbuild/freebsd-arm64": "npm:0.23.0" - "@esbuild/freebsd-x64": "npm:0.23.0" - "@esbuild/linux-arm": "npm:0.23.0" - "@esbuild/linux-arm64": "npm:0.23.0" - "@esbuild/linux-ia32": "npm:0.23.0" - "@esbuild/linux-loong64": "npm:0.23.0" - "@esbuild/linux-mips64el": "npm:0.23.0" - "@esbuild/linux-ppc64": "npm:0.23.0" - "@esbuild/linux-riscv64": "npm:0.23.0" - "@esbuild/linux-s390x": "npm:0.23.0" - "@esbuild/linux-x64": "npm:0.23.0" - "@esbuild/netbsd-x64": "npm:0.23.0" - "@esbuild/openbsd-arm64": "npm:0.23.0" - "@esbuild/openbsd-x64": "npm:0.23.0" - "@esbuild/sunos-x64": "npm:0.23.0" - "@esbuild/win32-arm64": "npm:0.23.0" - "@esbuild/win32-ia32": "npm:0.23.0" - "@esbuild/win32-x64": "npm:0.23.0" + version: 0.23.1 + resolution: "esbuild@npm:0.23.1" + dependencies: + "@esbuild/aix-ppc64": "npm:0.23.1" + "@esbuild/android-arm": "npm:0.23.1" + "@esbuild/android-arm64": "npm:0.23.1" + "@esbuild/android-x64": "npm:0.23.1" + "@esbuild/darwin-arm64": "npm:0.23.1" + "@esbuild/darwin-x64": "npm:0.23.1" + "@esbuild/freebsd-arm64": "npm:0.23.1" + "@esbuild/freebsd-x64": "npm:0.23.1" + "@esbuild/linux-arm": "npm:0.23.1" + "@esbuild/linux-arm64": "npm:0.23.1" + "@esbuild/linux-ia32": "npm:0.23.1" + "@esbuild/linux-loong64": "npm:0.23.1" + "@esbuild/linux-mips64el": "npm:0.23.1" + "@esbuild/linux-ppc64": "npm:0.23.1" + "@esbuild/linux-riscv64": "npm:0.23.1" + "@esbuild/linux-s390x": "npm:0.23.1" + "@esbuild/linux-x64": "npm:0.23.1" + "@esbuild/netbsd-x64": "npm:0.23.1" + "@esbuild/openbsd-arm64": "npm:0.23.1" + "@esbuild/openbsd-x64": "npm:0.23.1" + "@esbuild/sunos-x64": "npm:0.23.1" + "@esbuild/win32-arm64": "npm:0.23.1" + "@esbuild/win32-ia32": "npm:0.23.1" + "@esbuild/win32-x64": "npm:0.23.1" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -2584,14 +2614,14 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/08c148c067795165798c0467ce02d2d1ecedc096989bded5f0d795c61a1fcbec6c14d0a3c9f4ad6185cc29ec52087acaa335ed6d98be6ad57f7fa4264626bde0 + checksum: 10c0/08c2ed1105cc3c5e3a24a771e35532fe6089dd24a39c10097899072cef4a99f20860e41e9294e000d86380f353b04d8c50af482483d7f69f5208481cce61eec7 languageName: node linkType: hard "escalade@npm:^3.1.1, escalade@npm:^3.1.2": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 languageName: node linkType: hard @@ -2652,14 +2682,14 @@ __metadata: linkType: hard "eslint@npm:^9.8.0": - version: 9.8.0 - resolution: "eslint@npm:9.8.0" + version: 9.9.1 + resolution: "eslint@npm:9.9.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.11.0" - "@eslint/config-array": "npm:^0.17.1" + "@eslint/config-array": "npm:^0.18.0" "@eslint/eslintrc": "npm:^3.1.0" - "@eslint/js": "npm:9.8.0" + "@eslint/js": "npm:9.9.1" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.3.0" "@nodelib/fs.walk": "npm:^1.2.8" @@ -2689,9 +2719,14 @@ __metadata: optionator: "npm:^0.9.3" strip-ansi: "npm:^6.0.1" text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 10c0/a2ee0cce1147565d011fe185733af482f34d5466f5df5f390d0ea2ecf78097883cf568ed6c771d687138609c63cd55cd1e3ff12de7393c03f54fcffcdd0f225d + checksum: 10c0/5e71efda7c0a14ee95436d5cdfed04ee61dfb1d89d7a32b50a424de2e680af82849628ea6581950c2e0726491f786a3cfd0032ce013c1c5093786e475cfdfb33 languageName: node linkType: hard @@ -2806,7 +2841,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9": +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -2916,22 +2951,22 @@ __metadata: linkType: hard "follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" + version: 1.15.8 + resolution: "follow-redirects@npm:1.15.8" peerDependenciesMeta: debug: optional: true - checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 + checksum: 10c0/ffb8f71338000717f6bfefddc3247dda226326f29fdafb9ef32ef67176339a1ae13c419aea837645b58331f94eba6168704149f4d10a8a976687efd2e45131d2 languageName: node linkType: hard "foreground-child@npm:^3.1.0": - version: 3.2.1 - resolution: "foreground-child@npm:3.2.1" + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" dependencies: cross-spawn: "npm:^7.0.0" signal-exit: "npm:^4.0.1" - checksum: 10c0/9a53a33dbd87090e9576bef65fb4a71de60f6863a8062a7b11bc1cbe3cc86d428677d7c0b9ef61cdac11007ac580006f78bd5638618d564cfd5e6fd713d6878f + checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 languageName: node linkType: hard @@ -3221,9 +3256,9 @@ __metadata: linkType: hard "ignore@npm:^5.2.0, ignore@npm:^5.3.1": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 languageName: node linkType: hard @@ -3307,11 +3342,11 @@ __metadata: linkType: hard "is-core-module@npm:^2.13.0": - version: 2.15.0 - resolution: "is-core-module@npm:2.15.0" + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" dependencies: hasown: "npm:^2.0.2" - checksum: 10c0/da161f3d9906f459486da65609b2f1a2dfdc60887c689c234d04e88a062cb7920fa5be5fb7ab08dc43b732929653c4135ef05bf77888ae2a9040ce76815eb7b1 + checksum: 10c0/53432f10c69c40bfd2fa8914133a68709ff9498c86c3bf5fca3cdf3145a56fd2168cbf4a43b29843a6202a120a5f9c5ffba0a4322e1e3441739bc0b641682612 languageName: node linkType: hard @@ -4053,19 +4088,19 @@ __metadata: languageName: node linkType: hard -"libsodium-sumo@npm:^0.7.14": - version: 0.7.14 - resolution: "libsodium-sumo@npm:0.7.14" - checksum: 10c0/d780700f97ca9baa8d3fb27443b23f287a63d16e0b50ad3ff14f2f49fc381dee11ecf025946ea0295822c437a17e5cbea8868e94eb574390ba5faba518501587 +"libsodium-sumo@npm:^0.7.15": + version: 0.7.15 + resolution: "libsodium-sumo@npm:0.7.15" + checksum: 10c0/5a1437ccff03c72669e7b49da702034e171df9ff6a4e65698297ab63ad0bf8f889d3dd51494e29418c643143526d8d7f08cbba3929d220334cddbe3e74a1560e languageName: node linkType: hard "libsodium-wrappers-sumo@npm:^0.7.11": - version: 0.7.14 - resolution: "libsodium-wrappers-sumo@npm:0.7.14" + version: 0.7.15 + resolution: "libsodium-wrappers-sumo@npm:0.7.15" dependencies: - libsodium-sumo: "npm:^0.7.14" - checksum: 10c0/6cd02986bb101ec7109a31e41ad8636fcdfefae5175c2ef136bb5cf39c173907a7e0c3846e97bd6b5ea966fc6bc7c23e815a439b4bfea77077c6872f735418c9 + libsodium-sumo: "npm:^0.7.15" + checksum: 10c0/6da919a13395346d54f2ce4841adda8feb3fbb8a8c378ec5c93b7e6dc6353b379289349e659f3e017a9f1995ef396bf43f89c7ab4aab4e3b5ed85df62407d810 languageName: node linkType: hard @@ -4108,7 +4143,7 @@ __metadata: languageName: node linkType: hard -"lodash.memoize@npm:4.x": +"lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 @@ -4161,7 +4196,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:1.x, make-error@npm:^1.1.1": +"make-error@npm:^1.1.1, make-error@npm:^1.3.6": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f @@ -4212,12 +4247,12 @@ __metadata: linkType: hard "micromatch@npm:^4.0.4": - version: 4.0.7 - resolution: "micromatch@npm:4.0.7" + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" dependencies: braces: "npm:^3.0.3" picomatch: "npm:^2.3.1" - checksum: 10c0/58fa99bc5265edec206e9163a1d2cec5fabc46a5b473c45f4a700adce88c2520456ae35f2b301e4410fb3afb27e9521fb2813f6fc96be0a48a89430e0916a772 + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 languageName: node linkType: hard @@ -4437,7 +4472,7 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.14": +"node-releases@npm:^2.0.18": version: 2.0.18 resolution: "node-releases@npm:2.0.18" checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 @@ -4636,9 +4671,9 @@ __metadata: linkType: hard "picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": - version: 1.0.1 - resolution: "picocolors@npm:1.0.1" - checksum: 10c0/c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400 + version: 1.1.0 + resolution: "picocolors@npm:1.1.0" + checksum: 10c0/86946f6032148801ef09c051c6fb13b5cf942eaf147e30ea79edb91dd32d700934edebe782a1078ff859fb2b816792e97ef4dab03d7f0b804f6b01a0df35e023 languageName: node linkType: hard @@ -4743,8 +4778,8 @@ __metadata: linkType: hard "protobufjs@npm:^7.2.3": - version: 7.3.2 - resolution: "protobufjs@npm:7.3.2" + version: 7.4.0 + resolution: "protobufjs@npm:7.4.0" dependencies: "@protobufjs/aspromise": "npm:^1.1.2" "@protobufjs/base64": "npm:^1.1.2" @@ -4758,7 +4793,7 @@ __metadata: "@protobufjs/utf8": "npm:^1.1.0" "@types/node": "npm:>=13.7.0" long: "npm:^5.0.0" - checksum: 10c0/b87e38fffc989793099010439a7ff45a0a57ef5b8f44b5209f06bfa5085ac96a365aa37eb3c79bd6954d6ef1b50fc69da37dae8ea2a31d90b7bc8fb2fa0e3955 + checksum: 10c0/a5460a63fe596523b9a067cbce39a6b310d1a71750fda261f076535662aada97c24450e18c5bc98a27784f70500615904ff1227e1742183509f0db4fdede669b languageName: node linkType: hard @@ -4919,25 +4954,25 @@ __metadata: linkType: hard "rollup@npm:^4.19.0": - version: 4.19.2 - resolution: "rollup@npm:4.19.2" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.19.2" - "@rollup/rollup-android-arm64": "npm:4.19.2" - "@rollup/rollup-darwin-arm64": "npm:4.19.2" - "@rollup/rollup-darwin-x64": "npm:4.19.2" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.19.2" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.19.2" - "@rollup/rollup-linux-arm64-gnu": "npm:4.19.2" - "@rollup/rollup-linux-arm64-musl": "npm:4.19.2" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.19.2" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.19.2" - "@rollup/rollup-linux-s390x-gnu": "npm:4.19.2" - "@rollup/rollup-linux-x64-gnu": "npm:4.19.2" - "@rollup/rollup-linux-x64-musl": "npm:4.19.2" - "@rollup/rollup-win32-arm64-msvc": "npm:4.19.2" - "@rollup/rollup-win32-ia32-msvc": "npm:4.19.2" - "@rollup/rollup-win32-x64-msvc": "npm:4.19.2" + version: 4.21.2 + resolution: "rollup@npm:4.21.2" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.21.2" + "@rollup/rollup-android-arm64": "npm:4.21.2" + "@rollup/rollup-darwin-arm64": "npm:4.21.2" + "@rollup/rollup-darwin-x64": "npm:4.21.2" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.21.2" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.21.2" + "@rollup/rollup-linux-arm64-gnu": "npm:4.21.2" + "@rollup/rollup-linux-arm64-musl": "npm:4.21.2" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.21.2" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.21.2" + "@rollup/rollup-linux-s390x-gnu": "npm:4.21.2" + "@rollup/rollup-linux-x64-gnu": "npm:4.21.2" + "@rollup/rollup-linux-x64-musl": "npm:4.21.2" + "@rollup/rollup-win32-arm64-msvc": "npm:4.21.2" + "@rollup/rollup-win32-ia32-msvc": "npm:4.21.2" + "@rollup/rollup-win32-x64-msvc": "npm:4.21.2" "@types/estree": "npm:1.0.5" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -4977,7 +5012,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/ff5c1d071c873f25016263568177f5406d76f242a04d25a191a37f4b859a1662a1acc9f76bf680968ffcebb467ac4952521462375698468c80506ff91a0b9f2d + checksum: 10c0/c9d97f7a21cde110371b2e890a31a996fee09b81e639e79372b962a9638ae653d2d24186b94632fc5dfab8a0582e1d0639dfe34b8b75051facd86915a9585a5f languageName: node linkType: hard @@ -5022,7 +5057,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:^7.3.5, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -5401,18 +5436,18 @@ __metadata: linkType: hard "ts-jest@npm:^29.2.3": - version: 29.2.3 - resolution: "ts-jest@npm:29.2.3" + version: 29.2.5 + resolution: "ts-jest@npm:29.2.5" dependencies: - bs-logger: "npm:0.x" + bs-logger: "npm:^0.2.6" ejs: "npm:^3.1.10" - fast-json-stable-stringify: "npm:2.x" + fast-json-stable-stringify: "npm:^2.1.0" jest-util: "npm:^29.0.0" json5: "npm:^2.2.3" - lodash.memoize: "npm:4.x" - make-error: "npm:1.x" - semver: "npm:^7.5.3" - yargs-parser: "npm:^21.0.1" + lodash.memoize: "npm:^4.1.2" + make-error: "npm:^1.3.6" + semver: "npm:^7.6.3" + yargs-parser: "npm:^21.1.1" peerDependencies: "@babel/core": ">=7.0.0-beta.0 <8" "@jest/transform": ^29.0.0 @@ -5433,7 +5468,7 @@ __metadata: optional: true bin: ts-jest: cli.js - checksum: 10c0/3be57a9f0e9cf0d0de235f5543dc1f2a33da4380bf46e660f79d050a15a6e7bab71a7a80ba9559761ce1203248b40d0f9386c19356718165575f32192e32140e + checksum: 10c0/acb62d168faec073e64b20873b583974ba8acecdb94681164eb346cef82ade8fb481c5b979363e01a97ce4dd1e793baf64d9efd90720bc941ad7fc1c3d6f3f68 languageName: node linkType: hard @@ -5566,17 +5601,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.11.1": - version: 6.11.1 - resolution: "undici-types@npm:6.11.1" - checksum: 10c0/d8f5739a8e6c779d72336c82deb49c56d5ac9f9f6e0eb2e8dd4d3f6929ae9db7cde370d2e46516fe6cad04ea53e790c5e16c4c75eed7cd0f9bd31b0763bb2fa3 - languageName: node - linkType: hard - -"undici-types@npm:~6.13.0": - version: 6.13.0 - resolution: "undici-types@npm:6.13.0" - checksum: 10c0/2de55181f569c77a4f08063f8bf2722fcbb6ea312a26a9e927bd1f5ea5cf3a281c5ddf23155061db083e0a25838f54813543ff13b0ac34d230d5c1205ead66c1 +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 languageName: node linkType: hard @@ -5786,7 +5814,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": +"yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2