@walletconnect/cli-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +131 -0
- package/dist/cli.js +680 -0
- package/dist/index.cjs +108 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +146 -0
- package/dist/index.d.ts +146 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/browser-ui/server.ts","../src/session.ts","../src/terminal-ui.ts","../src/config.ts","../src/index.ts"],"sourcesContent":["import { EventEmitter } from \"events\";\nimport { execFileSync } from \"child_process\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { KeyValueStorage } from \"@walletconnect/keyvaluestorage\";\nimport { SignClient } from \"@walletconnect/sign-client\";\nimport type { SessionTypes } from \"@walletconnect/types\";\nimport { createBrowserUI } from \"./browser-ui/server.js\";\nimport { createSessionManager } from \"./session.js\";\nimport { createTerminalUI } from \"./terminal-ui.js\";\nimport type {\n BrowserUI,\n ConnectOptions,\n ConnectResult,\n RequestOptions,\n WalletConnectCLIEvents,\n WalletConnectCLIOptions,\n} from \"./types.js\";\n\nconst DEFAULT_METHODS = [\n \"eth_sendTransaction\",\n \"eth_signTransaction\",\n \"personal_sign\",\n \"eth_sign\",\n \"eth_signTypedData\",\n \"eth_signTypedData_v4\",\n];\n\nconst DEFAULT_EVENTS = [\"chainChanged\", \"accountsChanged\"];\nconst DEFAULT_CHAINS = [\"eip155:1\"];\nconst DEFAULT_STORAGE_PATH = join(homedir(), \".walletconnect-cli\");\n\nexport class WalletConnectCLI extends EventEmitter {\n private readonly options: WalletConnectCLIOptions;\n private signClient: InstanceType<typeof SignClient> | null = null;\n private currentSession: SessionTypes.Struct | null = null;\n private browserUI: BrowserUI | null = null;\n private readonly sessionManager = createSessionManager();\n\n constructor(options: WalletConnectCLIOptions) {\n super();\n this.options = options;\n }\n\n // ---------- Public API ----------------------------------------------- //\n\n async tryRestore(): Promise<ConnectResult | null> {\n const client = await this.ensureClient();\n const existing = this.sessionManager.getExistingSession(client);\n if (!existing) return null;\n this.currentSession = existing;\n return this.buildConnectResult(existing);\n }\n\n async connect(connectOptions?: ConnectOptions): Promise<ConnectResult> {\n const client = await this.ensureClient();\n\n // Check for existing valid session\n if (this.options.autoConnect !== false) {\n const existing = this.sessionManager.getExistingSession(client);\n if (existing) {\n this.currentSession = existing;\n const result = this.buildConnectResult(existing);\n this.emit(\"connect\", result);\n return result;\n }\n }\n\n // Build namespaces\n const chains = this.options.chains || DEFAULT_CHAINS;\n const methods = this.options.methods || DEFAULT_METHODS;\n const events = this.options.events || DEFAULT_EVENTS;\n\n const optionalNamespaces = connectOptions?.optionalNamespaces || {\n eip155: { chains, methods, events },\n };\n\n // Initiate connection\n const { uri, approval } = await client.connect({ optionalNamespaces });\n\n if (!uri) {\n throw new Error(\"Failed to generate WalletConnect URI\");\n }\n\n // Display connection UI\n if (this.options.ui === \"browser\") {\n await this.showBrowserUI(uri);\n } else {\n const terminalUI = createTerminalUI();\n terminalUI.displayQR(uri);\n }\n\n // Wait for wallet approval\n const session = await approval();\n this.currentSession = session;\n\n // Update browser UI if active\n if (this.browserUI) {\n this.browserUI.updateStatus(\"connected\", `Connected to ${session.peer.metadata.name}`);\n // Give browser time to show success, then shut down\n setTimeout(() => this.browserUI?.stop(), 3000);\n }\n\n const result = this.buildConnectResult(session);\n this.emit(\"connect\", result);\n return result;\n }\n\n async request<T = unknown>(options: RequestOptions): Promise<T> {\n const client = await this.ensureClient();\n const topic = options.topic || this.currentSession?.topic;\n\n if (!topic) {\n throw new Error(\"No active session. Call connect() first.\");\n }\n\n this.logRequestDetails(options);\n\n try {\n return await client.request<T>({\n topic,\n chainId: options.chainId,\n request: options.request,\n });\n } catch (error: unknown) {\n const message = this.extractErrorMessage(error);\n\n if (message.includes(\"rejected\") || message.includes(\"denied\") || message.includes(\"cancelled\")) {\n throw new Error(\"Request rejected by user\");\n }\n\n if (typeof error === \"object\" && error !== null) {\n const errObj = error as { code?: number; message?: string };\n if (errObj.code === 0 && !errObj.message) {\n throw new Error(\"Request rejected or timed out in wallet\");\n }\n }\n\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n if (!this.currentSession) return;\n\n try {\n const client = await this.ensureClient();\n // Absorb relay WebSocket errors during disconnect so they don't\n // surface as unhandled 'error' events that crash the process.\n const swallow = () => {};\n client.core.relayer.on(\"error\", swallow);\n try {\n await client.disconnect({\n topic: this.currentSession.topic,\n reason: { code: 6000, message: \"User disconnected\" },\n });\n } finally {\n client.core.relayer.off(\"error\", swallow);\n }\n } catch {\n // Ignore disconnect errors — session may have already expired\n }\n\n // Always clean up local state even if relay notification failed\n this.currentSession = null;\n this.emit(\"disconnect\");\n }\n\n isConnected(): boolean {\n if (!this.currentSession) return false;\n return this.sessionManager.isSessionValid(this.currentSession);\n }\n\n getAccounts(): string[] {\n if (!this.currentSession) return [];\n return Object.values(this.currentSession.namespaces)\n .flatMap((ns) => ns.accounts || []);\n }\n\n getSession(): SessionTypes.Struct | null {\n return this.currentSession;\n }\n\n async destroy(): Promise<void> {\n if (this.browserUI) {\n await this.browserUI.stop();\n this.browserUI = null;\n }\n this.removeAllListeners();\n if (this.signClient) {\n try {\n await this.signClient.core.relayer.transportClose();\n } catch {\n // ignore cleanup errors\n }\n }\n this.signClient = null;\n this.currentSession = null;\n }\n\n // Type-safe event emitter overrides\n override on<K extends keyof WalletConnectCLIEvents>(event: K, listener: WalletConnectCLIEvents[K]): this {\n return super.on(event, listener);\n }\n\n override once<K extends keyof WalletConnectCLIEvents>(event: K, listener: WalletConnectCLIEvents[K]): this {\n return super.once(event, listener);\n }\n\n override off<K extends keyof WalletConnectCLIEvents>(event: K, listener: WalletConnectCLIEvents[K]): this {\n return super.off(event, listener);\n }\n\n override emit<K extends keyof WalletConnectCLIEvents>(\n event: K,\n ...args: Parameters<WalletConnectCLIEvents[K]>\n ): boolean {\n return super.emit(event, ...args);\n }\n\n // ---------- Private -------------------------------------------------- //\n\n private logRequestDetails(options: RequestOptions): void {\n const walletName = this.currentSession?.peer.metadata.name;\n if (walletName) {\n console.log(`\\nRequesting approval on ${walletName}...`);\n }\n\n if (options.request.method === \"eth_sendTransaction\") {\n const params = options.request.params as Array<{ data?: string }>;\n const data = params[0]?.data;\n if (data && data !== \"0x\") {\n try {\n const decoded = execFileSync(\"cast\", [\"4d\", data], {\n encoding: \"utf-8\",\n timeout: 5000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n if (decoded) {\n console.log(`\\n Decoded calldata:\\n${decoded.split(\"\\n\").map((l) => ` ${l}`).join(\"\\n\")}\\n`);\n }\n } catch {\n // cast not available or decode failed — skip silently\n }\n }\n }\n }\n\n private async ensureClient(): Promise<InstanceType<typeof SignClient>> {\n if (this.signClient) return this.signClient;\n\n const storagePath = this.options.storagePath || DEFAULT_STORAGE_PATH;\n const storage = new KeyValueStorage({ database: storagePath });\n\n this.signClient = await SignClient.init({\n projectId: this.options.projectId,\n metadata: this.options.metadata,\n storage,\n logger: this.options.logger || \"silent\",\n });\n\n // Forward sign-client events\n this.signClient.on(\"session_update\", ({ topic }) => {\n const session = this.signClient?.session.get(topic);\n if (session) {\n this.currentSession = session;\n this.emit(\"session_update\", session);\n }\n });\n\n this.signClient.on(\"session_delete\", ({ topic }) => {\n if (this.currentSession?.topic === topic) {\n this.currentSession = null;\n }\n this.emit(\"session_delete\", { topic });\n this.emit(\"disconnect\");\n });\n\n return this.signClient;\n }\n\n private async showBrowserUI(uri: string): Promise<void> {\n this.browserUI = createBrowserUI(this.options.port);\n try {\n const { url } = await this.browserUI.start(uri);\n console.log(`\\nConnect your wallet at: ${url}\\n`);\n } catch {\n // Fall back to terminal QR if browser fails\n console.log(\"Could not open browser, falling back to terminal QR code.\");\n const terminalUI = createTerminalUI();\n terminalUI.displayQR(uri);\n this.browserUI = null;\n }\n }\n\n private buildConnectResult(session: SessionTypes.Struct): ConnectResult {\n const accounts = Object.values(session.namespaces)\n .flatMap((ns) => ns.accounts || []);\n return {\n session,\n accounts,\n topic: session.topic,\n };\n }\n\n private extractErrorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"object\" && error !== null) {\n const errObj = error as { message?: string };\n if (errObj.message) return errObj.message;\n return JSON.stringify(error);\n }\n return String(error);\n }\n}\n","import http from \"http\";\nimport type { AddressInfo } from \"net\";\nimport type { BrowserUI } from \"../types.js\";\n\ninterface SSEClient {\n res: http.ServerResponse;\n}\n\nconst SCRIPT_CLOSE = \"</script>\";\n\nfunction buildHTML(uri: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>WalletConnect — Connect Wallet</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n background: #1a1a2e;\n color: #e0e0e0;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n }\n .container {\n text-align: center;\n padding: 2rem;\n max-width: 420px;\n }\n h1 { font-size: 1.5rem; margin-bottom: 0.5rem; color: #fff; }\n .subtitle { color: #8888aa; margin-bottom: 2rem; }\n #qr-container {\n background: #fff;\n border-radius: 16px;\n padding: 24px;\n display: inline-block;\n margin-bottom: 1.5rem;\n }\n #qr-container canvas { display: block; }\n .uri-box {\n background: #16213e;\n border: 1px solid #333;\n border-radius: 8px;\n padding: 12px;\n word-break: break-all;\n font-size: 0.75rem;\n color: #8888aa;\n margin-bottom: 1.5rem;\n cursor: pointer;\n transition: border-color 0.2s;\n }\n .uri-box:hover { border-color: #5566ff; }\n .uri-box:active { border-color: #3344dd; }\n #status {\n font-size: 0.9rem;\n padding: 8px 16px;\n border-radius: 8px;\n display: inline-block;\n }\n .status-waiting { background: #16213e; color: #8888aa; }\n .status-connected { background: #0a3d2a; color: #4ade80; }\n .status-error { background: #3d0a0a; color: #f87171; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Connect Your Wallet</h1>\n <p class=\"subtitle\">Scan the QR code with your mobile wallet</p>\n <div id=\"qr-container\"><canvas id=\"qr\"></canvas></div>\n <div class=\"uri-box\" onclick=\"navigator.clipboard.writeText('${uri}').then(()=>this.textContent='Copied!').catch(()=>{})\">\n ${uri}\n </div>\n <div id=\"status\" class=\"status-waiting\">Waiting for connection...</div>\n </div>\n <script src=\"https://cdn.jsdelivr.net/npm/qrcode@1/build/qrcode.min.js\">${SCRIPT_CLOSE}\n <script>\n QRCode.toCanvas(document.getElementById(\"qr\"), \"${uri}\", {\n width: 280,\n margin: 0,\n color: { dark: \"#1a1a2e\", light: \"#ffffff\" }\n });\n\n const evtSource = new EventSource(\"/events\");\n evtSource.onmessage = function(event) {\n const data = JSON.parse(event.data);\n const el = document.getElementById(\"status\");\n el.className = \"status-\" + data.status;\n el.textContent = data.message || data.status;\n if (data.status === \"connected\") {\n evtSource.close();\n setTimeout(() => window.close(), 2000);\n }\n };\n ${SCRIPT_CLOSE}\n</body>\n</html>`;\n}\n\nexport function createBrowserUI(preferredPort?: number): BrowserUI {\n let server: http.Server | null = null;\n const sseClients: SSEClient[] = [];\n\n return {\n async start(uri: string): Promise<{ port: number; url: string }> {\n const html = buildHTML(uri);\n\n server = http.createServer((req, res) => {\n if (req.url === \"/events\") {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n res.write(`data: ${JSON.stringify({ status: \"waiting\", message: \"Waiting for connection...\" })}\\n\\n`);\n const client: SSEClient = { res };\n sseClients.push(client);\n req.on(\"close\", () => {\n const idx = sseClients.indexOf(client);\n if (idx !== -1) sseClients.splice(idx, 1);\n });\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(html);\n });\n\n const port = await new Promise<number>((resolve, reject) => {\n server!.listen(preferredPort || 0, \"127.0.0.1\", () => {\n const addr = server!.address() as AddressInfo;\n resolve(addr.port);\n });\n server!.on(\"error\", reject);\n });\n\n const url = `http://127.0.0.1:${port}`;\n\n // Dynamic import for ESM-only `open` package\n try {\n const { default: open } = await import(\"open\");\n await open(url);\n } catch {\n console.log(`Open your browser at: ${url}`);\n }\n\n return { port, url };\n },\n\n updateStatus(status: \"waiting\" | \"connected\" | \"error\", message?: string) {\n const payload = JSON.stringify({\n status,\n message: message || status,\n });\n for (const client of sseClients) {\n try {\n client.res.write(`data: ${payload}\\n\\n`);\n } catch {\n // Client disconnected — ignore\n }\n }\n },\n\n async stop() {\n for (const client of sseClients) {\n try {\n client.res.end();\n } catch {\n // Ignore\n }\n }\n sseClients.length = 0;\n\n if (server) {\n await new Promise<void>((resolve) => {\n server!.close(() => resolve());\n });\n server = null;\n }\n },\n };\n}\n","import type { SignClient } from \"@walletconnect/sign-client\";\nimport type { SessionTypes } from \"@walletconnect/types\";\n\nexport interface SessionManager {\n /** Returns the most recent valid (non-expired) session, or null */\n getExistingSession(client: InstanceType<typeof SignClient>): SessionTypes.Struct | null;\n /** Checks if a session has not expired */\n isSessionValid(session: SessionTypes.Struct): boolean;\n}\n\nexport function createSessionManager(): SessionManager {\n return {\n getExistingSession(client: InstanceType<typeof SignClient>): SessionTypes.Struct | null {\n const sessions = client.session.getAll();\n if (sessions.length === 0) return null;\n\n const now = Math.floor(Date.now() / 1000);\n const valid = sessions\n .filter((s) => s.expiry > now)\n .sort((a, b) => b.expiry - a.expiry);\n\n return valid.length > 0 ? valid[0] : null;\n },\n\n isSessionValid(session: SessionTypes.Struct): boolean {\n const now = Math.floor(Date.now() / 1000);\n return session.expiry > now;\n },\n };\n}\n","import qrcodeModule from \"qrcode-terminal\";\nimport type { TerminalUI } from \"./types.js\";\n\nexport function createTerminalUI(): TerminalUI {\n return {\n displayQR(uri: string) {\n console.log(\"\\nScan this QR code with your wallet app:\\n\");\n qrcodeModule.generate(uri, { small: true });\n console.log(\"\\nOr copy this URI:\", uri);\n console.log(\"\\nWaiting for wallet connection...\\n\");\n },\n\n showStatus(message: string) {\n console.log(`[WalletConnect] ${message}`);\n },\n\n showError(message: string) {\n console.error(`[WalletConnect] Error: ${message}`);\n },\n\n showSuccess(message: string) {\n console.log(`[WalletConnect] ${message}`);\n },\n };\n}\n","import { homedir } from \"os\";\nimport { join } from \"path\";\nimport { readFileSync, writeFileSync, mkdirSync } from \"fs\";\n\nconst CONFIG_DIR = join(homedir(), \".walletconnect-cli\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\ninterface Config {\n projectId?: string;\n}\n\nfunction readConfig(): Config {\n try {\n return JSON.parse(readFileSync(CONFIG_FILE, \"utf-8\")) as Config;\n } catch {\n return {};\n }\n}\n\nfunction writeConfig(config: Config): void {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", { mode: 0o600 });\n}\n\n/** Get a config value */\nexport function getConfigValue(key: keyof Config): string | undefined {\n return readConfig()[key];\n}\n\n/** Set a config value */\nexport function setConfigValue(key: keyof Config, value: string): void {\n const config = readConfig();\n config[key] = value;\n writeConfig(config);\n}\n\n/** Resolve project ID: env var > config file. Returns undefined if neither is set. */\nexport function resolveProjectId(): string | undefined {\n return process.env.WALLETCONNECT_PROJECT_ID || getConfigValue(\"projectId\");\n}\n","import { WalletConnectCLI } from \"./client.js\";\nimport type { WithWalletOptions, ConnectResult } from \"./types.js\";\n\nexport { WalletConnectCLI } from \"./client.js\";\nexport { createSessionManager } from \"./session.js\";\nexport { createTerminalUI } from \"./terminal-ui.js\";\nexport { createBrowserUI } from \"./browser-ui/server.js\";\nexport { getConfigValue, setConfigValue, resolveProjectId } from \"./config.js\";\n\nexport type {\n WalletConnectCLIOptions,\n ConnectOptions,\n ConnectResult,\n RequestOptions,\n WalletConnectCLIEvents,\n WithWalletOptions,\n TerminalUI,\n BrowserUI,\n} from \"./types.js\";\n\n/**\n * Higher-level helper that wraps the connect → callback → cleanup pattern.\n *\n * @example\n * ```ts\n * await withWallet({ projectId, metadata }, async (wallet, { accounts }) => {\n * const txHash = await wallet.request({\n * chainId: 'eip155:1',\n * request: { method: 'eth_sendTransaction', params: [tx] }\n * });\n * });\n * ```\n */\nexport async function withWallet(\n options: WithWalletOptions,\n callback: (wallet: WalletConnectCLI, result: ConnectResult) => Promise<void>,\n): Promise<void> {\n const wallet = new WalletConnectCLI(options);\n try {\n const result = await wallet.connect(options.connectOptions);\n await callback(wallet, result);\n if (options.disconnectAfter !== false) {\n await wallet.disconnect();\n }\n } finally {\n await wallet.destroy();\n }\n}\n"],"mappings":"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","names":["EventEmitter","execFileSync","homedir","join","KeyValueStorage","SignClient","http","SCRIPT_CLOSE","buildHTML","uri","createBrowserUI","preferredPort","server","sseClients","html","req","res","client","idx","port","resolve","reject","addr","url","open","status","message","payload","createSessionManager","client","sessions","now","valid","s","a","b","session","qrcodeModule","createTerminalUI","uri","message","DEFAULT_METHODS","DEFAULT_EVENTS","DEFAULT_CHAINS","DEFAULT_STORAGE_PATH","join","homedir","WalletConnectCLI","EventEmitter","options","createSessionManager","client","existing","connectOptions","result","chains","methods","events","optionalNamespaces","uri","approval","createTerminalUI","session","topic","error","message","errObj","swallow","ns","event","listener","args","walletName","data","decoded","execFileSync","l","storagePath","storage","KeyValueStorage","SignClient","createBrowserUI","url","accounts","homedir","join","readFileSync","writeFileSync","mkdirSync","CONFIG_DIR","CONFIG_FILE","readConfig","writeConfig","config","getConfigValue","key","setConfigValue","value","resolveProjectId","withWallet","options","callback","wallet","WalletConnectCLI","result"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@walletconnect/cli-sdk",
|
|
3
|
+
"description": "WalletConnect CLI SDK — wallet connection and signing for terminal applications",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"private": false,
|
|
6
|
+
"author": "WalletConnect, Inc. <walletconnect.com>",
|
|
7
|
+
"license": "SEE LICENSE IN LICENSE.md",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"main": "dist/index.cjs",
|
|
10
|
+
"module": "dist/index.js",
|
|
11
|
+
"types": "dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js",
|
|
16
|
+
"require": "./dist/index.cjs"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
22
|
+
"keywords": [
|
|
23
|
+
"wallet",
|
|
24
|
+
"walletconnect",
|
|
25
|
+
"cli",
|
|
26
|
+
"terminal",
|
|
27
|
+
"signing",
|
|
28
|
+
"web3",
|
|
29
|
+
"ethereum"
|
|
30
|
+
],
|
|
31
|
+
"bin": {
|
|
32
|
+
"walletconnect": "dist/cli.js"
|
|
33
|
+
},
|
|
34
|
+
"sideEffects": false,
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"test": "vitest run --dir test --reporter=verbose",
|
|
38
|
+
"lint": "eslint --fix 'src/**/*.ts'",
|
|
39
|
+
"prettier": "prettier --check '{src,test}/**/*.{js,ts,jsx,tsx}'"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@walletconnect/keyvaluestorage": "1.1.1",
|
|
43
|
+
"@walletconnect/sign-client": "2.23.4",
|
|
44
|
+
"@walletconnect/types": "2.23.4",
|
|
45
|
+
"open": "^10.1.0",
|
|
46
|
+
"qrcode-terminal": "^0.12.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^25.2.3",
|
|
50
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
51
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
52
|
+
"eslint": "^9.0.0",
|
|
53
|
+
"tsup": "^8.0.0",
|
|
54
|
+
"typescript": "^5.5.0",
|
|
55
|
+
"vitest": "^3.2.0"
|
|
56
|
+
}
|
|
57
|
+
}
|