@txnlab/use-wallet-kmd 5.0.0-rc.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 TxnLab, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,43 @@
1
+ import algosdk from "algosdk";
2
+ import { AdapterConstructorParams, BaseWallet, WalletAccount, WalletMetadata } from "@txnlab/use-wallet/adapter";
3
+ import { WalletAdapterConfig } from "@txnlab/use-wallet";
4
+
5
+ //#region src/adapter.d.ts
6
+ interface KmdConstructor {
7
+ token: string | algosdk.KMDTokenHeader | algosdk.CustomTokenHeader;
8
+ baseServer?: string;
9
+ port?: string | number;
10
+ headers?: Record<string, string>;
11
+ promptForPassword: () => Promise<string>;
12
+ }
13
+ type KmdOptions = Partial<Pick<KmdConstructor, 'token' | 'promptForPassword'>> & Omit<KmdConstructor, 'token' | 'promptForPassword'> & {
14
+ wallet?: string;
15
+ };
16
+ declare class KmdAdapter extends BaseWallet<KmdOptions> {
17
+ private client;
18
+ private kmdOptions;
19
+ private walletName;
20
+ private kmdWalletId;
21
+ private password;
22
+ constructor(params: AdapterConstructorParams<KmdOptions>);
23
+ static defaultMetadata: WalletMetadata;
24
+ private initializeClient;
25
+ connect: () => Promise<WalletAccount[]>;
26
+ disconnect: () => Promise<void>;
27
+ resumeSession: () => Promise<void>;
28
+ private processTxns;
29
+ private processEncodedTxns;
30
+ signTransactions: <T extends algosdk.Transaction[] | Uint8Array[]>(txnGroup: T | T[], indexesToSign?: number[]) => Promise<(Uint8Array | null)[]>;
31
+ private fetchWalletId;
32
+ private fetchToken;
33
+ private releaseToken;
34
+ private getPassword;
35
+ private fetchAccounts;
36
+ }
37
+ //#endregion
38
+ //#region src/index.d.ts
39
+ declare const WALLET_ID: "kmd";
40
+ declare function kmd(options?: KmdOptions): WalletAdapterConfig;
41
+ //#endregion
42
+ export { KmdAdapter, type KmdOptions, WALLET_ID, kmd };
43
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,191 @@
1
+ import algosdk from "algosdk";
2
+ import { BaseWallet, flattenTxnGroup, isSignedTxn, isTransactionArray } from "@txnlab/use-wallet/adapter";
3
+ //#endregion
4
+ //#region src/adapter.ts
5
+ const ICON = `data:image/svg+xml;base64,${btoa(`
6
+ <svg viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
7
+ <linearGradient id="algokitGradient" gradientUnits="userSpaceOnUse" x1="0" y1="400" x2="400" y2="0">
8
+ <stop offset="0" style="stop-color:#31D8EE"/>
9
+ <stop offset="1" style="stop-color:#01DC94"/>
10
+ </linearGradient>
11
+ <rect fill="url(#algokitGradient)" width="400" height="400" />
12
+ <path fill="#FFFFFF" d="M309.2,309.3H275l-22.2-82.7l-47.9,82.7h-38.3l73.9-128l-11.9-44.5l-99.6,172.6H90.8L217.1,90.6 h33.5l14.7,54.3h34.6l-23.6,41L309.2,309.3z" />
13
+ </svg>
14
+ `)}`;
15
+ var KmdAdapter = class extends BaseWallet {
16
+ client = null;
17
+ kmdOptions;
18
+ walletName;
19
+ kmdWalletId = "";
20
+ password = null;
21
+ constructor(params) {
22
+ super(params);
23
+ const { token = "a".repeat(64), baseServer = "http://127.0.0.1", port = 4002, wallet = "unencrypted-default-wallet", promptForPassword = () => Promise.resolve(prompt("KMD password") || "") } = this.options || {};
24
+ this.kmdOptions = {
25
+ token,
26
+ baseServer,
27
+ port,
28
+ promptForPassword
29
+ };
30
+ this.walletName = wallet;
31
+ }
32
+ static defaultMetadata = {
33
+ name: "KMD",
34
+ icon: ICON
35
+ };
36
+ async initializeClient() {
37
+ this.logger.info("Initializing client...");
38
+ const { token, baseServer, port } = this.kmdOptions;
39
+ const client = new algosdk.Kmd(token, baseServer, port);
40
+ this.client = client;
41
+ this.logger.info("Client initialized");
42
+ return client;
43
+ }
44
+ connect = async () => {
45
+ this.logger.info("Connecting...");
46
+ if (!this.client) await this.initializeClient();
47
+ try {
48
+ const token = await this.fetchToken();
49
+ const accounts = await this.fetchAccounts(token);
50
+ if (accounts.length === 0) throw new Error("No accounts found!");
51
+ const walletAccounts = accounts.map((address, idx) => ({
52
+ name: `${this.metadata.name} Account ${idx + 1}`,
53
+ address
54
+ }));
55
+ const walletState = {
56
+ accounts: walletAccounts,
57
+ activeAccount: walletAccounts[0]
58
+ };
59
+ this.store.addWallet(walletState);
60
+ await this.releaseToken(token);
61
+ this.logger.info("Connected successfully", walletState);
62
+ return walletAccounts;
63
+ } catch (error) {
64
+ this.logger.error("Error connecting:", error.message);
65
+ throw error;
66
+ }
67
+ };
68
+ disconnect = async () => {
69
+ this.logger.info("Disconnecting...");
70
+ this.onDisconnect();
71
+ this.logger.info("Disconnected");
72
+ };
73
+ resumeSession = async () => {
74
+ try {
75
+ if (!this.store.getWalletState()) {
76
+ this.logger.info("No session to resume");
77
+ return;
78
+ }
79
+ this.logger.info("Resuming session...");
80
+ await this.initializeClient();
81
+ this.logger.info("Session resumed");
82
+ } catch (error) {
83
+ this.logger.error("Error resuming session:", error.message);
84
+ this.onDisconnect();
85
+ throw error;
86
+ }
87
+ };
88
+ processTxns(txnGroup, indexesToSign) {
89
+ const txnsToSign = [];
90
+ txnGroup.forEach((txn, index) => {
91
+ const isIndexMatch = !indexesToSign || indexesToSign.includes(index);
92
+ const signer = txn.sender.toString();
93
+ const canSignTxn = this.addresses.includes(signer);
94
+ if (isIndexMatch && canSignTxn) txnsToSign.push(txn);
95
+ });
96
+ return txnsToSign;
97
+ }
98
+ processEncodedTxns(txnGroup, indexesToSign) {
99
+ const txnsToSign = [];
100
+ txnGroup.forEach((txnBuffer, index) => {
101
+ const isSigned = isSignedTxn(algosdk.msgpackRawDecode(txnBuffer));
102
+ const txn = isSigned ? algosdk.decodeSignedTransaction(txnBuffer).txn : algosdk.decodeUnsignedTransaction(txnBuffer);
103
+ const isIndexMatch = !indexesToSign || indexesToSign.includes(index);
104
+ const signer = txn.sender.toString();
105
+ const canSignTxn = !isSigned && this.addresses.includes(signer);
106
+ if (isIndexMatch && canSignTxn) txnsToSign.push(txn);
107
+ });
108
+ return txnsToSign;
109
+ }
110
+ signTransactions = async (txnGroup, indexesToSign) => {
111
+ try {
112
+ this.logger.debug("Signing transactions...", {
113
+ txnGroup,
114
+ indexesToSign
115
+ });
116
+ let txnsToSign = [];
117
+ if (isTransactionArray(txnGroup)) {
118
+ const flatTxns = flattenTxnGroup(txnGroup);
119
+ txnsToSign = this.processTxns(flatTxns, indexesToSign);
120
+ } else {
121
+ const flatTxns = flattenTxnGroup(txnGroup);
122
+ txnsToSign = this.processEncodedTxns(flatTxns, indexesToSign);
123
+ }
124
+ const token = await this.fetchToken();
125
+ const password = await this.getPassword();
126
+ const client = this.client || await this.initializeClient();
127
+ this.logger.debug("Sending processed transactions to wallet...", txnsToSign);
128
+ const signedTxns = await Promise.all(txnsToSign.map((txn) => client.signTransaction(token, password, txn)));
129
+ this.logger.debug("Received signed transactions from wallet", signedTxns);
130
+ await this.releaseToken(token);
131
+ this.logger.debug("Transactions signed successfully", signedTxns);
132
+ return signedTxns;
133
+ } catch (error) {
134
+ this.logger.error("Error signing transactions:", error.message);
135
+ throw error;
136
+ }
137
+ };
138
+ async fetchWalletId() {
139
+ this.logger.debug("Fetching wallet data...", { walletName: this.walletName });
140
+ const { wallets } = await (this.client || await this.initializeClient()).listWallets();
141
+ const wallet = wallets.find((wallet) => wallet.name === this.walletName);
142
+ if (!wallet) {
143
+ this.logger.error(`Wallet "${this.walletName}" not found!`);
144
+ throw new Error(`Wallet "${this.walletName}" not found!`);
145
+ }
146
+ this.kmdWalletId = wallet.id;
147
+ this.logger.debug("Wallet data fetched successfully", { walletId: this.kmdWalletId });
148
+ return wallet.id;
149
+ }
150
+ async fetchToken() {
151
+ this.logger.debug("Fetching token...", { walletId: this.kmdWalletId });
152
+ const client = this.client || await this.initializeClient();
153
+ const walletId = this.kmdWalletId || await this.fetchWalletId();
154
+ const password = await this.getPassword();
155
+ const { wallet_handle_token } = await client.initWalletHandle(walletId, password);
156
+ this.logger.debug("Token fetched successfully");
157
+ return wallet_handle_token;
158
+ }
159
+ async releaseToken(token) {
160
+ this.logger.debug("Releasing token...");
161
+ await (this.client || await this.initializeClient()).releaseWalletHandle(token);
162
+ this.logger.debug("Token released successfully");
163
+ }
164
+ async getPassword() {
165
+ if (this.password !== null) return this.password;
166
+ const password = await this.kmdOptions.promptForPassword();
167
+ this.password = password;
168
+ return password;
169
+ }
170
+ async fetchAccounts(token) {
171
+ this.logger.debug("Fetching accounts...");
172
+ const { addresses } = await (this.client || await this.initializeClient()).listKeys(token);
173
+ this.logger.debug("Accounts fetched successfully", { addresses });
174
+ return addresses;
175
+ }
176
+ };
177
+ //#endregion
178
+ //#region src/index.ts
179
+ const WALLET_ID = "kmd";
180
+ function kmd(options) {
181
+ return {
182
+ id: "kmd",
183
+ metadata: KmdAdapter.defaultMetadata,
184
+ Adapter: KmdAdapter,
185
+ options
186
+ };
187
+ }
188
+ //#endregion
189
+ export { KmdAdapter, WALLET_ID, kmd };
190
+
191
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/icon.ts","../src/adapter.ts","../src/index.ts"],"sourcesContent":["export const icon = `\n<svg viewBox=\"0 0 400 400\" xmlns=\"http://www.w3.org/2000/svg\">\n <linearGradient id=\"algokitGradient\" gradientUnits=\"userSpaceOnUse\" x1=\"0\" y1=\"400\" x2=\"400\" y2=\"0\">\n <stop offset=\"0\" style=\"stop-color:#31D8EE\"/>\n <stop offset=\"1\" style=\"stop-color:#01DC94\"/>\n </linearGradient>\n <rect fill=\"url(#algokitGradient)\" width=\"400\" height=\"400\" />\n <path fill=\"#FFFFFF\" d=\"M309.2,309.3H275l-22.2-82.7l-47.9,82.7h-38.3l73.9-128l-11.9-44.5l-99.6,172.6H90.8L217.1,90.6 h33.5l14.7,54.3h34.6l-23.6,41L309.2,309.3z\" />\n</svg>\n`\n","import algosdk from 'algosdk'\nimport {\n BaseWallet,\n flattenTxnGroup,\n isSignedTxn,\n isTransactionArray,\n type AdapterConstructorParams,\n type WalletAccount,\n type WalletMetadata,\n type WalletState\n} from '@txnlab/use-wallet/adapter'\n\ninterface KmdConstructor {\n token: string | algosdk.KMDTokenHeader | algosdk.CustomTokenHeader\n baseServer?: string\n port?: string | number\n headers?: Record<string, string>\n promptForPassword: () => Promise<string>\n}\n\nexport type KmdOptions = Partial<Pick<KmdConstructor, 'token' | 'promptForPassword'>> &\n Omit<KmdConstructor, 'token' | 'promptForPassword'> & {\n wallet?: string\n }\n\ninterface KmdWalletRecord {\n id: string\n name: string\n driver_name?: string\n driver_version?: number\n mnemonic_ux?: boolean\n supported_txs?: Array<any>\n}\n\ninterface ListWalletsResponse {\n wallets: KmdWalletRecord[]\n message?: string\n error?: boolean\n}\n\ninterface InitWalletHandleResponse {\n wallet_handle_token: string\n message?: string\n error?: boolean\n}\n\ninterface ListKeysResponse {\n addresses: string[]\n message?: string\n error?: boolean\n}\n\nimport { icon } from './icon'\n\nconst ICON = `data:image/svg+xml;base64,${btoa(icon)}`\n\nexport class KmdAdapter extends BaseWallet<KmdOptions> {\n private client: algosdk.Kmd | null = null\n private kmdOptions: KmdConstructor\n private walletName: string\n private kmdWalletId: string = ''\n private password: string | null = null\n\n constructor(params: AdapterConstructorParams<KmdOptions>) {\n super(params)\n\n const {\n token = 'a'.repeat(64),\n baseServer = 'http://127.0.0.1',\n port = 4002,\n wallet = 'unencrypted-default-wallet',\n promptForPassword = () => Promise.resolve(prompt('KMD password') || '')\n } = this.options || {}\n\n this.kmdOptions = { token, baseServer, port, promptForPassword }\n this.walletName = wallet\n }\n\n static defaultMetadata: WalletMetadata = {\n name: 'KMD',\n icon: ICON\n }\n\n private async initializeClient(): Promise<algosdk.Kmd> {\n this.logger.info('Initializing client...')\n const { token, baseServer, port } = this.kmdOptions\n const client = new algosdk.Kmd(token, baseServer, port)\n this.client = client\n this.logger.info('Client initialized')\n return client\n }\n\n public connect = async (): Promise<WalletAccount[]> => {\n this.logger.info('Connecting...')\n if (!this.client) {\n await this.initializeClient()\n }\n\n try {\n // Get token and fetch accounts\n const token = await this.fetchToken()\n const accounts = await this.fetchAccounts(token)\n\n if (accounts.length === 0) {\n throw new Error('No accounts found!')\n }\n\n const walletAccounts = accounts.map((address: string, idx: number) => ({\n name: `${this.metadata.name} Account ${idx + 1}`,\n address\n }))\n\n const activeAccount = walletAccounts[0]\n\n const walletState: WalletState = {\n accounts: walletAccounts,\n activeAccount\n }\n\n this.store.addWallet(walletState)\n\n // Release token\n await this.releaseToken(token)\n\n this.logger.info('Connected successfully', walletState)\n return walletAccounts\n } catch (error: any) {\n this.logger.error('Error connecting:', error.message)\n throw error\n }\n }\n\n public disconnect = async (): Promise<void> => {\n this.logger.info('Disconnecting...')\n this.onDisconnect()\n this.logger.info('Disconnected')\n }\n\n public resumeSession = async (): Promise<void> => {\n try {\n const walletState = this.store.getWalletState()\n\n // No session to resume\n if (!walletState) {\n this.logger.info('No session to resume')\n return\n }\n\n this.logger.info('Resuming session...')\n await this.initializeClient()\n this.logger.info('Session resumed')\n } catch (error: any) {\n this.logger.error('Error resuming session:', error.message)\n this.onDisconnect()\n throw error\n }\n }\n\n private processTxns(\n txnGroup: algosdk.Transaction[],\n indexesToSign?: number[]\n ): algosdk.Transaction[] {\n const txnsToSign: algosdk.Transaction[] = []\n\n txnGroup.forEach((txn, index) => {\n const isIndexMatch = !indexesToSign || indexesToSign.includes(index)\n const signer = txn.sender.toString()\n const canSignTxn = this.addresses.includes(signer)\n\n if (isIndexMatch && canSignTxn) {\n txnsToSign.push(txn)\n }\n })\n\n return txnsToSign\n }\n\n private processEncodedTxns(\n txnGroup: Uint8Array[],\n indexesToSign?: number[]\n ): algosdk.Transaction[] {\n const txnsToSign: algosdk.Transaction[] = []\n\n txnGroup.forEach((txnBuffer, index) => {\n const decodedObj = algosdk.msgpackRawDecode(txnBuffer)\n const isSigned = isSignedTxn(decodedObj)\n\n const txn: algosdk.Transaction = isSigned\n ? algosdk.decodeSignedTransaction(txnBuffer).txn\n : algosdk.decodeUnsignedTransaction(txnBuffer)\n\n const isIndexMatch = !indexesToSign || indexesToSign.includes(index)\n const signer = txn.sender.toString()\n const canSignTxn = !isSigned && this.addresses.includes(signer)\n\n if (isIndexMatch && canSignTxn) {\n txnsToSign.push(txn)\n }\n })\n\n return txnsToSign\n }\n\n public signTransactions = async <T extends algosdk.Transaction[] | Uint8Array[]>(\n txnGroup: T | T[],\n indexesToSign?: number[]\n ): Promise<(Uint8Array | null)[]> => {\n try {\n this.logger.debug('Signing transactions...', { txnGroup, indexesToSign })\n let txnsToSign: algosdk.Transaction[] = []\n\n // Determine type and process transactions for signing\n if (isTransactionArray(txnGroup)) {\n const flatTxns: algosdk.Transaction[] = flattenTxnGroup(txnGroup)\n txnsToSign = this.processTxns(flatTxns, indexesToSign)\n } else {\n const flatTxns: Uint8Array[] = flattenTxnGroup(txnGroup as Uint8Array[])\n txnsToSign = this.processEncodedTxns(flatTxns, indexesToSign)\n }\n\n // Get token and password\n const token = await this.fetchToken()\n const password = await this.getPassword()\n\n const client = this.client || (await this.initializeClient())\n\n this.logger.debug('Sending processed transactions to wallet...', txnsToSign)\n\n // Sign transactions\n const signedTxns = await Promise.all(\n txnsToSign.map((txn) => client.signTransaction(token, password, txn))\n )\n\n this.logger.debug('Received signed transactions from wallet', signedTxns)\n\n // Release token\n await this.releaseToken(token)\n\n this.logger.debug('Transactions signed successfully', signedTxns)\n return signedTxns\n } catch (error: any) {\n this.logger.error('Error signing transactions:', error.message)\n throw error\n }\n }\n\n private async fetchWalletId(): Promise<string> {\n this.logger.debug('Fetching wallet data...', { walletName: this.walletName })\n const client = this.client || (await this.initializeClient())\n\n const { wallets }: ListWalletsResponse = await client.listWallets()\n const wallet = wallets.find((wallet: KmdWalletRecord) => wallet.name === this.walletName)\n\n if (!wallet) {\n this.logger.error(`Wallet \"${this.walletName}\" not found!`)\n throw new Error(`Wallet \"${this.walletName}\" not found!`)\n }\n\n this.kmdWalletId = wallet.id\n this.logger.debug('Wallet data fetched successfully', { walletId: this.kmdWalletId })\n return wallet.id\n }\n\n private async fetchToken(): Promise<string> {\n this.logger.debug('Fetching token...', { walletId: this.kmdWalletId })\n const client = this.client || (await this.initializeClient())\n\n const walletId = this.kmdWalletId || (await this.fetchWalletId())\n const password = await this.getPassword()\n\n const { wallet_handle_token }: InitWalletHandleResponse = await client.initWalletHandle(\n walletId,\n password\n )\n this.logger.debug('Token fetched successfully')\n return wallet_handle_token\n }\n\n private async releaseToken(token: string): Promise<void> {\n this.logger.debug('Releasing token...')\n const client = this.client || (await this.initializeClient())\n await client.releaseWalletHandle(token)\n this.logger.debug('Token released successfully')\n }\n\n private async getPassword(): Promise<string> {\n if (this.password !== null) {\n return this.password\n }\n const password = await this.kmdOptions.promptForPassword()\n this.password = password\n return password\n }\n\n private async fetchAccounts(token: string): Promise<string[]> {\n this.logger.debug('Fetching accounts...')\n const client = this.client || (await this.initializeClient())\n const { addresses }: ListKeysResponse = await client.listKeys(token)\n this.logger.debug('Accounts fetched successfully', { addresses })\n return addresses\n }\n}\n","import { KmdAdapter } from './adapter'\nimport type { KmdOptions } from './adapter'\nimport type { WalletAdapterConfig } from '@txnlab/use-wallet'\n\nexport const WALLET_ID = 'kmd' as const\n\nexport function kmd(options?: KmdOptions): WalletAdapterConfig {\n return {\n id: WALLET_ID,\n metadata: KmdAdapter.defaultMetadata,\n Adapter: KmdAdapter as unknown as WalletAdapterConfig['Adapter'],\n options: options as unknown as Record<string, unknown> | undefined\n }\n}\n\nexport { KmdAdapter }\nexport type { KmdOptions }\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@txnlab/use-wallet-kmd",
3
+ "version": "5.0.0-rc.1",
4
+ "publishConfig": {
5
+ "access": "public",
6
+ "provenance": true
7
+ },
8
+ "description": "KMD wallet adapter for @txnlab/use-wallet",
9
+ "author": "Doug Richar <drichar@gmail.com>",
10
+ "license": "MIT",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/txnlab/use-wallet.git",
14
+ "directory": "packages/wallets/kmd"
15
+ },
16
+ "type": "module",
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "default": "./dist/index.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "peerDependencies": {
29
+ "@txnlab/use-wallet": "^5.0.0",
30
+ "algosdk": "^3.0.0"
31
+ },
32
+ "devDependencies": {
33
+ "@txnlab/use-wallet": "5.0.0-rc.1",
34
+ "algosdk": "3.5.2",
35
+ "tsdown": "0.21.0",
36
+ "typescript": "5.9.3"
37
+ },
38
+ "scripts": {
39
+ "build": "tsdown",
40
+ "start": "tsdown --watch",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest --watch",
43
+ "lint": "eslint \"src/**/*.{js,ts}\"",
44
+ "typecheck": "tsc --noEmit"
45
+ }
46
+ }