@vue-solana/vue 2.1.0 → 2.2.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.
Files changed (46) hide show
  1. package/README.md +51 -0
  2. package/dist/index.cjs +5 -3
  3. package/dist/index.d.cts +4 -3
  4. package/dist/index.d.mts +4 -3
  5. package/dist/index.d.ts +4 -3
  6. package/dist/index.mjs +4 -3
  7. package/dist/shared/{vue.DImwKTwJ.mjs → vue.B8VvC8d2.mjs} +18 -20
  8. package/dist/shared/{vue.B8ub540p.mjs → vue.BDNOyiGZ.mjs} +7 -7
  9. package/dist/shared/vue.BSfiHqwj.mjs +34 -0
  10. package/dist/shared/vue.CTqPbvz3.cjs +36 -0
  11. package/dist/shared/{vue.CogzzQXM.mjs → vue.CbJFnho-.mjs} +4 -4
  12. package/dist/shared/{vue.DtCbCcPd.cjs → vue.DxM45azl.cjs} +4 -4
  13. package/dist/shared/{vue.B8pLQ8P4.cjs → vue.ZuUCEEab.cjs} +18 -20
  14. package/dist/shared/{vue.BVj9lWBK.cjs → vue.l3UCdN7z.cjs} +7 -7
  15. package/dist/swr.cjs +3 -3
  16. package/dist/swr.mjs +3 -3
  17. package/dist/useAirdrop.cjs +14 -0
  18. package/dist/useAirdrop.d.cts +25 -0
  19. package/dist/useAirdrop.d.mts +25 -0
  20. package/dist/useAirdrop.d.ts +25 -0
  21. package/dist/useAirdrop.mjs +8 -0
  22. package/dist/useConnection.d.cts +3 -2
  23. package/dist/useConnection.d.mts +3 -2
  24. package/dist/useConnection.d.ts +3 -2
  25. package/dist/useRequest.cjs +1 -1
  26. package/dist/useRequest.d.cts +22 -6
  27. package/dist/useRequest.d.mts +22 -6
  28. package/dist/useRequest.d.ts +22 -6
  29. package/dist/useRequest.mjs +1 -1
  30. package/dist/useRpc.d.cts +3 -2
  31. package/dist/useRpc.d.mts +3 -2
  32. package/dist/useRpc.d.ts +3 -2
  33. package/dist/useSolanaClient.d.cts +3 -2
  34. package/dist/useSolanaClient.d.mts +3 -2
  35. package/dist/useSolanaClient.d.ts +3 -2
  36. package/dist/useSubscription.cjs +1 -1
  37. package/dist/useSubscription.d.cts +15 -3
  38. package/dist/useSubscription.d.mts +15 -3
  39. package/dist/useSubscription.d.ts +15 -3
  40. package/dist/useSubscription.mjs +1 -1
  41. package/dist/useTrackedData.cjs +1 -1
  42. package/dist/useTrackedData.d.cts +15 -3
  43. package/dist/useTrackedData.d.mts +15 -3
  44. package/dist/useTrackedData.d.ts +15 -3
  45. package/dist/useTrackedData.mjs +1 -1
  46. package/package.json +7 -2
package/README.md CHANGED
@@ -164,6 +164,22 @@ const { balance, loading, error, refresh } = useBalance(address);
164
164
  </template>
165
165
  ```
166
166
 
167
+ ### Airdrop on Test Networks
168
+
169
+ `useAirdrop()` sends SOL to an account on devnet, testnet, or a local validator. It requires an airdrop capability on the Kit client, installed with `createClient().use(solanaRpcConnection({ ... })).use(rpcAirdrop())` from `@solana/kit-plugin-rpc`.
170
+
171
+ ```ts
172
+ import { lamports } from "@solana/kit";
173
+ import { useAirdrop } from "@vue-solana/vue/useAirdrop";
174
+
175
+ const { data, status, error, dispatch } = useAirdrop();
176
+ await dispatch(address, lamports(1_000_000_000)); // 1 SOL
177
+ ```
178
+
179
+ Each `dispatch(address, amount)` runs a fresh airdrop and aborts the previous in-flight call. `data` resolves to the transaction `Signature`, or to `undefined` when the network applies the airdrop without a transaction (some local validators, e.g. LiteSVM).
180
+
181
+ Airdrops to a single address are rate-limited (public devnets commonly return HTTP 429, and 1 SOL requires enough devnet balance); wait before dispatching again or use a fresh address. Errors surface through `error` / the `error` state.
182
+
167
183
  ## Read Account Data
168
184
 
169
185
  ```ts
@@ -341,6 +357,39 @@ import { useRequestSwr } from "@vue-solana/vue/swr";
341
357
  const balance = useRequestSwr(["balance", address], () => client.rpc.getBalance(address).send());
342
358
  ```
343
359
 
360
+ ### Cancellation & Timeouts
361
+
362
+ `useRequest()`, `useSubscription()`, and `useTrackedData()` accept a `getAbortSignal` option — a factory called once per attempt (request) or connection (subscription/tracked data). It is the natural place for a timeout:
363
+
364
+ ```ts
365
+ const { data, refresh } = useRequest(source, {
366
+ getAbortSignal: (attempt) => AbortSignal.timeout(10_000),
367
+ });
368
+
369
+ await refresh({ abortSignal: AbortSignal.timeout(2_000) });
370
+ ```
371
+
372
+ The factory is read fresh from the latest render on every attempt, so inline closures work without `useCallback`-style wrapping. Each manual refresh or reconnect can instead pass a single `{ abortSignal }` override that replaces the factory for that attempt; pass `AbortSignal` explicitly as `undefined` to skip caller cancellation entirely. Aborting the composed signal fails only that attempt — previous `data` is kept and `status` drops back to `error`.
373
+
374
+ To kill the data hook entirely, set its source to `null` (status becomes `disabled` and in-flight work is cancelled) or unmount the component that owns it.
375
+
376
+ ### Actions with `useAction`
377
+
378
+ `useAction()` and its derivatives (`useAirdrop()`, `useSignAndSendTransaction()` themes) manage one async action at a time:
379
+
380
+ ```ts
381
+ const { data, status, error, dispatch } = useAction(async (signal, input) => {
382
+ /* ... */
383
+ });
384
+
385
+ dispatch(inputA); // runs
386
+ await dispatch(inputB); // aborts dispatch(inputA) before starting
387
+ ```
388
+
389
+ - `useAction` keeps the handler in a ref — every `dispatch` runs the latest closure, so there is no deps array to keep in sync. In-flight calls keep running with the closure they started with.
390
+ - `dispatch` returns a `Promise<TResult>`. If a newer dispatch supersedes it, the older promise rejects with an abort error; awaiters should treat that as "superseded", not a failure, and fresh awaits win.
391
+ - Calling `dispatch` again aborts the prior in-flight call with a fresh `AbortSignal`, and resets state to `idle` before the new run starts.
392
+
344
393
  ### Sign In With Solana
345
394
 
346
395
  `useSignIn()` triggers the SIWS flow when the connected wallet supports the `solana:signIn` feature:
@@ -420,6 +469,7 @@ Docs: [Vue Solana Agent Skill](https://vue-solana-docs.vercel.app/agent-skill)
420
469
  | `useWallets()` | Returns discovered browser extension wallets, Android MWA wallets, iOS browser wallet links, and wallet selection actions. |
421
470
  | `useSignMessage()` | Signs arbitrary message bytes through the connected wallet when message signing is supported. |
422
471
  | `useBalance(address, commitment?)` | Loads lamport balance for an address string. |
472
+ | `useAirdrop()` | Airdrops SOL on devnet/testnet/localnets; `data` is the `Signature`, or `undefined` when applied directly. |
423
473
  | `useAccountInfo(address, options?)` | Loads normalized account info (executable, lamports, owner, space, data bytes). |
424
474
  | `useProgramAccounts(programId, config?)` | Loads accounts owned by a program with optional filters, commitment, and `dataSlice`. |
425
475
  | `useTransaction(handler, options?)` | Generic async transaction state helper with optional timeout settings. |
@@ -452,6 +502,7 @@ Direct composable subpaths:
452
502
  - `@vue-solana/vue/useRpc`
453
503
  - `@vue-solana/vue/useConnection`
454
504
  - `@vue-solana/vue/useAccountInfo`
505
+ - `@vue-solana/vue/useAirdrop`
455
506
  - `@vue-solana/vue/useBalance`
456
507
  - `@vue-solana/vue/useProgramAccounts`
457
508
  - `@vue-solana/vue/useWallet`
package/dist/index.cjs CHANGED
@@ -2,13 +2,14 @@
2
2
 
3
3
  const useAccountInfo = require('./shared/vue.D-qi8PSL.cjs');
4
4
  const useAction = require('./shared/vue.CoaIWGPT.cjs');
5
+ const useAirdrop = require('./shared/vue.CTqPbvz3.cjs');
5
6
  const useBalance = require('./shared/vue.E_npPFoV.cjs');
6
7
  const useClientCapability = require('./shared/vue.BY0qpgYr.cjs');
7
8
  const useConnection = require('./shared/vue.BVaMoz9y.cjs');
8
9
  const usePlanTransaction = require('./shared/vue.B4-LEdSE.cjs');
9
10
  const useProgramAccounts = require('./shared/vue.Di7yjJ-R.cjs');
10
11
  const usePayer = require('./shared/vue.g8fnm_ca.cjs');
11
- const useRequest = require('./shared/vue.B8pLQ8P4.cjs');
12
+ const useRequest = require('./shared/vue.ZuUCEEab.cjs');
12
13
  const useRpc = require('./shared/vue.FiMmnMHr.cjs');
13
14
  const SelectedWalletAccountProvider = require('./shared/vue.DDbVk0Zh.cjs');
14
15
  const useSignMessage = require('./shared/vue.B6ainw2G.cjs');
@@ -19,10 +20,10 @@ const useSignatureStatus = require('./shared/vue.CIs8QhCw.cjs');
19
20
  const useSignIn = require('./shared/vue.9TPxZPMf.cjs');
20
21
  const useSolana = require('./shared/vue.DE3emjSF.cjs');
21
22
  const useSolanaClient = require('./shared/vue.BIxphCAq.cjs');
22
- const useSubscription = require('./shared/vue.BVj9lWBK.cjs');
23
+ const useSubscription = require('./shared/vue.l3UCdN7z.cjs');
23
24
  const useTokenAccounts = require('./shared/vue.Bwd1sGAM.cjs');
24
25
  const useTokenBalance = require('./shared/vue.DAg5wC1G.cjs');
25
- const useTrackedData = require('./shared/vue.DtCbCcPd.cjs');
26
+ const useTrackedData = require('./shared/vue.DxM45azl.cjs');
26
27
  const useTransaction = require('./shared/vue.Bk5xjlUx.cjs');
27
28
  const useTransactionConfirmation = require('./shared/vue.Sbbm9JSu.cjs');
28
29
  const useWallet = require('./shared/vue.BGxz4dru.cjs');
@@ -386,6 +387,7 @@ const VueSolana = createSolanaPlugin;
386
387
 
387
388
  exports.useAccountInfo = useAccountInfo.useAccountInfo;
388
389
  exports.useAction = useAction.useAction;
390
+ exports.useAirdrop = useAirdrop.useAirdrop;
389
391
  exports.useBalance = useBalance.useBalance;
390
392
  exports.MissingClientCapabilityError = useClientCapability.MissingClientCapabilityError;
391
393
  exports.useClientCapability = useClientCapability.useClientCapability;
package/dist/index.d.cts CHANGED
@@ -1,12 +1,13 @@
1
1
  export { AccountInfo, UseAccountInfoOptions, useAccountInfo } from './useAccountInfo.cjs';
2
2
  export { UseActionOptions, UseActionReturn, UseActionStatus, useAction } from './useAction.cjs';
3
+ export { useAirdrop } from './useAirdrop.cjs';
3
4
  export { BalanceInput, useBalance } from './useBalance.cjs';
4
5
  export { MissingClientCapabilityError, UseClientCapabilityOptions, useClientCapability } from './useClientCapability.cjs';
5
6
  export { useConnection } from './useConnection.cjs';
6
7
  export { PlanTransactionConfig, PlanTransactionStatus, usePlanTransaction, usePlanTransactions } from './usePlanTransaction.cjs';
7
8
  export { ProgramAccount, ProgramAccountDataSizeFilter, ProgramAccountDataSlice, ProgramAccountFilter, ProgramAccountMemcmpEncoding, ProgramAccountMemcmpFilter, UseProgramAccountsOptions, useProgramAccounts } from './useProgramAccounts.cjs';
8
9
  export { useIdentity, usePayer } from './usePayer.cjs';
9
- export { UseRequestOptions, UseRequestReturn, UseRequestSource, UseRequestStatus, useRequest } from './useRequest.cjs';
10
+ export { UseRequestOptions, UseRequestRefresherOptions, UseRequestReturn, UseRequestSource, UseRequestStatus, useRequest } from './useRequest.cjs';
10
11
  export { useRpc } from './useRpc.cjs';
11
12
  export { SelectedWalletAccount, SelectedWalletAccountContext, SelectedWalletAccountOptions, SelectedWalletAccountProvider, WalletAccountFilter, createSelectedWalletAccountContext, provideSelectedWalletAccount, selectedWalletAccountInjectionKey, useSelectedWalletAccount } from './useSelectedWalletAccount.cjs';
12
13
  export { SignMessageStatus, useSignMessage } from './useSignMessage.cjs';
@@ -17,10 +18,10 @@ export { SignatureStatus, UseSignatureStatusOptions, useSignatureStatus } from '
17
18
  export { SignInStatus, useSignIn } from './useSignIn.cjs';
18
19
  export { tryUseSolana, useSolana } from './useSolana.cjs';
19
20
  export { useSolanaClient } from './useSolanaClient.cjs';
20
- export { UseSubscriptionOptions, UseSubscriptionReturn, UseSubscriptionSource, UseSubscriptionStatus, useSubscription } from './useSubscription.cjs';
21
+ export { UseSubscriptionOptions, UseSubscriptionReconnectOptions, UseSubscriptionReturn, UseSubscriptionSource, UseSubscriptionStatus, useSubscription } from './useSubscription.cjs';
21
22
  export { UseTokenAccountsOptions, useTokenAccounts } from './useTokenAccounts.cjs';
22
23
  export { useTokenBalance } from './useTokenBalance.cjs';
23
- export { UseTrackedDataInitialSource, UseTrackedDataOptions, UseTrackedDataReturn, UseTrackedDataSource, UseTrackedDataStatus, UseTrackedDataStreamSource, useTrackedData } from './useTrackedData.cjs';
24
+ export { UseTrackedDataInitialSource, UseTrackedDataOptions, UseTrackedDataRefresherOptions, UseTrackedDataReturn, UseTrackedDataSource, UseTrackedDataStatus, UseTrackedDataStreamSource, useTrackedData } from './useTrackedData.cjs';
24
25
  export { UseTransactionOptions, useTransaction } from './useTransaction.cjs';
25
26
  export { TransactionConfirmationStatus, getConfirmedTransactionStatus, useTransactionConfirmation } from './useTransactionConfirmation.cjs';
26
27
  export { useWallet } from './useWallet.cjs';
package/dist/index.d.mts CHANGED
@@ -1,12 +1,13 @@
1
1
  export { AccountInfo, UseAccountInfoOptions, useAccountInfo } from './useAccountInfo.mjs';
2
2
  export { UseActionOptions, UseActionReturn, UseActionStatus, useAction } from './useAction.mjs';
3
+ export { useAirdrop } from './useAirdrop.mjs';
3
4
  export { BalanceInput, useBalance } from './useBalance.mjs';
4
5
  export { MissingClientCapabilityError, UseClientCapabilityOptions, useClientCapability } from './useClientCapability.mjs';
5
6
  export { useConnection } from './useConnection.mjs';
6
7
  export { PlanTransactionConfig, PlanTransactionStatus, usePlanTransaction, usePlanTransactions } from './usePlanTransaction.mjs';
7
8
  export { ProgramAccount, ProgramAccountDataSizeFilter, ProgramAccountDataSlice, ProgramAccountFilter, ProgramAccountMemcmpEncoding, ProgramAccountMemcmpFilter, UseProgramAccountsOptions, useProgramAccounts } from './useProgramAccounts.mjs';
8
9
  export { useIdentity, usePayer } from './usePayer.mjs';
9
- export { UseRequestOptions, UseRequestReturn, UseRequestSource, UseRequestStatus, useRequest } from './useRequest.mjs';
10
+ export { UseRequestOptions, UseRequestRefresherOptions, UseRequestReturn, UseRequestSource, UseRequestStatus, useRequest } from './useRequest.mjs';
10
11
  export { useRpc } from './useRpc.mjs';
11
12
  export { SelectedWalletAccount, SelectedWalletAccountContext, SelectedWalletAccountOptions, SelectedWalletAccountProvider, WalletAccountFilter, createSelectedWalletAccountContext, provideSelectedWalletAccount, selectedWalletAccountInjectionKey, useSelectedWalletAccount } from './useSelectedWalletAccount.mjs';
12
13
  export { SignMessageStatus, useSignMessage } from './useSignMessage.mjs';
@@ -17,10 +18,10 @@ export { SignatureStatus, UseSignatureStatusOptions, useSignatureStatus } from '
17
18
  export { SignInStatus, useSignIn } from './useSignIn.mjs';
18
19
  export { tryUseSolana, useSolana } from './useSolana.mjs';
19
20
  export { useSolanaClient } from './useSolanaClient.mjs';
20
- export { UseSubscriptionOptions, UseSubscriptionReturn, UseSubscriptionSource, UseSubscriptionStatus, useSubscription } from './useSubscription.mjs';
21
+ export { UseSubscriptionOptions, UseSubscriptionReconnectOptions, UseSubscriptionReturn, UseSubscriptionSource, UseSubscriptionStatus, useSubscription } from './useSubscription.mjs';
21
22
  export { UseTokenAccountsOptions, useTokenAccounts } from './useTokenAccounts.mjs';
22
23
  export { useTokenBalance } from './useTokenBalance.mjs';
23
- export { UseTrackedDataInitialSource, UseTrackedDataOptions, UseTrackedDataReturn, UseTrackedDataSource, UseTrackedDataStatus, UseTrackedDataStreamSource, useTrackedData } from './useTrackedData.mjs';
24
+ export { UseTrackedDataInitialSource, UseTrackedDataOptions, UseTrackedDataRefresherOptions, UseTrackedDataReturn, UseTrackedDataSource, UseTrackedDataStatus, UseTrackedDataStreamSource, useTrackedData } from './useTrackedData.mjs';
24
25
  export { UseTransactionOptions, useTransaction } from './useTransaction.mjs';
25
26
  export { TransactionConfirmationStatus, getConfirmedTransactionStatus, useTransactionConfirmation } from './useTransactionConfirmation.mjs';
26
27
  export { useWallet } from './useWallet.mjs';
package/dist/index.d.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  export { AccountInfo, UseAccountInfoOptions, useAccountInfo } from './useAccountInfo.js';
2
2
  export { UseActionOptions, UseActionReturn, UseActionStatus, useAction } from './useAction.js';
3
+ export { useAirdrop } from './useAirdrop.js';
3
4
  export { BalanceInput, useBalance } from './useBalance.js';
4
5
  export { MissingClientCapabilityError, UseClientCapabilityOptions, useClientCapability } from './useClientCapability.js';
5
6
  export { useConnection } from './useConnection.js';
6
7
  export { PlanTransactionConfig, PlanTransactionStatus, usePlanTransaction, usePlanTransactions } from './usePlanTransaction.js';
7
8
  export { ProgramAccount, ProgramAccountDataSizeFilter, ProgramAccountDataSlice, ProgramAccountFilter, ProgramAccountMemcmpEncoding, ProgramAccountMemcmpFilter, UseProgramAccountsOptions, useProgramAccounts } from './useProgramAccounts.js';
8
9
  export { useIdentity, usePayer } from './usePayer.js';
9
- export { UseRequestOptions, UseRequestReturn, UseRequestSource, UseRequestStatus, useRequest } from './useRequest.js';
10
+ export { UseRequestOptions, UseRequestRefresherOptions, UseRequestReturn, UseRequestSource, UseRequestStatus, useRequest } from './useRequest.js';
10
11
  export { useRpc } from './useRpc.js';
11
12
  export { SelectedWalletAccount, SelectedWalletAccountContext, SelectedWalletAccountOptions, SelectedWalletAccountProvider, WalletAccountFilter, createSelectedWalletAccountContext, provideSelectedWalletAccount, selectedWalletAccountInjectionKey, useSelectedWalletAccount } from './useSelectedWalletAccount.js';
12
13
  export { SignMessageStatus, useSignMessage } from './useSignMessage.js';
@@ -17,10 +18,10 @@ export { SignatureStatus, UseSignatureStatusOptions, useSignatureStatus } from '
17
18
  export { SignInStatus, useSignIn } from './useSignIn.js';
18
19
  export { tryUseSolana, useSolana } from './useSolana.js';
19
20
  export { useSolanaClient } from './useSolanaClient.js';
20
- export { UseSubscriptionOptions, UseSubscriptionReturn, UseSubscriptionSource, UseSubscriptionStatus, useSubscription } from './useSubscription.js';
21
+ export { UseSubscriptionOptions, UseSubscriptionReconnectOptions, UseSubscriptionReturn, UseSubscriptionSource, UseSubscriptionStatus, useSubscription } from './useSubscription.js';
21
22
  export { UseTokenAccountsOptions, useTokenAccounts } from './useTokenAccounts.js';
22
23
  export { useTokenBalance } from './useTokenBalance.js';
23
- export { UseTrackedDataInitialSource, UseTrackedDataOptions, UseTrackedDataReturn, UseTrackedDataSource, UseTrackedDataStatus, UseTrackedDataStreamSource, useTrackedData } from './useTrackedData.js';
24
+ export { UseTrackedDataInitialSource, UseTrackedDataOptions, UseTrackedDataRefresherOptions, UseTrackedDataReturn, UseTrackedDataSource, UseTrackedDataStatus, UseTrackedDataStreamSource, useTrackedData } from './useTrackedData.js';
24
25
  export { UseTransactionOptions, useTransaction } from './useTransaction.js';
25
26
  export { TransactionConfirmationStatus, getConfirmedTransactionStatus, useTransactionConfirmation } from './useTransactionConfirmation.js';
26
27
  export { useWallet } from './useWallet.js';
package/dist/index.mjs CHANGED
@@ -1,12 +1,13 @@
1
1
  export { u as useAccountInfo } from './shared/vue.BQRpjwKl.mjs';
2
2
  export { u as useAction } from './shared/vue.DYk0Xfr3.mjs';
3
+ export { u as useAirdrop } from './shared/vue.BSfiHqwj.mjs';
3
4
  export { u as useBalance } from './shared/vue.BINkrA8h.mjs';
4
5
  export { M as MissingClientCapabilityError, u as useClientCapability } from './shared/vue.B8LptjZP.mjs';
5
6
  export { u as useConnection } from './shared/vue.CpkwC8Th.mjs';
6
7
  export { u as usePlanTransaction, a as usePlanTransactions } from './shared/vue.C5FVoEZT.mjs';
7
8
  export { u as useProgramAccounts } from './shared/vue.C13umiQi.mjs';
8
9
  export { u as useIdentity, a as usePayer } from './shared/vue.CATOh_9G.mjs';
9
- export { u as useRequest } from './shared/vue.DImwKTwJ.mjs';
10
+ export { u as useRequest } from './shared/vue.B8VvC8d2.mjs';
10
11
  export { u as useRpc } from './shared/vue.BsGwt78R.mjs';
11
12
  export { S as SelectedWalletAccountProvider, c as createSelectedWalletAccountContext, p as provideSelectedWalletAccount, s as selectedWalletAccountInjectionKey, u as useSelectedWalletAccount } from './shared/vue.DXQVIRZA.mjs';
12
13
  export { u as useSignMessage } from './shared/vue.JUWqu6kD.mjs';
@@ -17,10 +18,10 @@ export { u as useSignatureStatus } from './shared/vue.CXB4NEMA.mjs';
17
18
  export { u as useSignIn } from './shared/vue.ByxbBC3y.mjs';
18
19
  export { t as tryUseSolana, u as useSolana } from './shared/vue.CQh3AUE8.mjs';
19
20
  export { u as useSolanaClient } from './shared/vue.Mxc8w6Qk.mjs';
20
- export { u as useSubscription } from './shared/vue.B8ub540p.mjs';
21
+ export { u as useSubscription } from './shared/vue.BDNOyiGZ.mjs';
21
22
  export { u as useTokenAccounts } from './shared/vue.BOpgWr43.mjs';
22
23
  export { u as useTokenBalance } from './shared/vue.BD6Gm1nl.mjs';
23
- export { u as useTrackedData } from './shared/vue.CogzzQXM.mjs';
24
+ export { u as useTrackedData } from './shared/vue.CbJFnho-.mjs';
24
25
  export { u as useTransaction } from './shared/vue.5euWd6-V.mjs';
25
26
  export { g as getConfirmedTransactionStatus, u as useTransactionConfirmation } from './shared/vue.D3Y0PWbF.mjs';
26
27
  export { u as useWallet } from './shared/vue.D218Ow7t.mjs';
@@ -9,24 +9,22 @@ function useRequest(source, options = {}) {
9
9
  const status = shallowRef("fetching");
10
10
  let disposed = false;
11
11
  let attempt = 0;
12
- const store = createSolanaActionStore(
13
- async (signal, resolved) => {
14
- attempt += 1;
15
- const callerSignal = options.getAbortSignal?.(attempt);
16
- const composedSignal = callerSignal ? AbortSignal.any([signal, callerSignal]) : signal;
17
- let pending;
18
- if (isSendSource(resolved)) {
19
- pending = Promise.resolve(resolved.send({ abortSignal: composedSignal }));
20
- } else if (typeof resolved === "function") {
21
- pending = Promise.resolve(resolved(composedSignal)).then(
22
- (result) => isSendSource(result) ? result.send({ abortSignal: composedSignal }) : result
23
- );
24
- } else {
25
- throw new Error("useRequest source did not resolve to a request function");
26
- }
27
- return getAbortablePromise(pending, composedSignal);
12
+ const store = createSolanaActionStore(async (signal, resolved, override) => {
13
+ attempt += 1;
14
+ const callerSignal = override ? override.abortSignal : options.getAbortSignal?.(attempt);
15
+ const composedSignal = callerSignal ? AbortSignal.any([signal, callerSignal]) : signal;
16
+ let pending;
17
+ if (isSendSource(resolved)) {
18
+ pending = Promise.resolve(resolved.send({ abortSignal: composedSignal }));
19
+ } else if (typeof resolved === "function") {
20
+ pending = Promise.resolve(resolved(composedSignal)).then(
21
+ (result) => isSendSource(result) ? result.send({ abortSignal: composedSignal }) : result
22
+ );
23
+ } else {
24
+ throw new Error("useRequest source did not resolve to a request function");
28
25
  }
29
- );
26
+ return getAbortablePromise(pending, composedSignal);
27
+ });
30
28
  const unsubscribe = store.subscribe(() => {
31
29
  const next = store.getState();
32
30
  if (next.status === "success") {
@@ -51,7 +49,7 @@ function useRequest(source, options = {}) {
51
49
  }
52
50
  return source;
53
51
  }
54
- async function run() {
52
+ async function run(override) {
55
53
  if (disposed) {
56
54
  return void 0;
57
55
  }
@@ -65,7 +63,7 @@ function useRequest(source, options = {}) {
65
63
  }
66
64
  status.value = "fetching";
67
65
  try {
68
- return await store.dispatchAsync(resolved);
66
+ return await store.dispatchAsync(resolved, override);
69
67
  } catch (cause) {
70
68
  if (store.getState().status !== "error") {
71
69
  return void 0;
@@ -73,7 +71,7 @@ function useRequest(source, options = {}) {
73
71
  throw normalizeSolanaError(cause, "RPC_FAILURE");
74
72
  }
75
73
  }
76
- const refresh = () => run();
74
+ const refresh = (options2) => run(options2);
77
75
  watch(
78
76
  () => isRef(source) ? source.value : source,
79
77
  () => {
@@ -27,11 +27,11 @@ function useSubscription(source, options = {}) {
27
27
  status.value = "loading";
28
28
  }
29
29
  }
30
- function openConnection(store) {
30
+ function openConnection(store, override) {
31
31
  activeStore = store;
32
32
  connectionCount += 1;
33
33
  const connection = connectionCount;
34
- const callerSignal = options.getAbortSignal?.(connection);
34
+ const callerSignal = override ? override.abortSignal : options.getAbortSignal?.(connection);
35
35
  applyState(store.getState());
36
36
  disposables.push(
37
37
  store.subscribe(() => {
@@ -59,7 +59,7 @@ function useSubscription(source, options = {}) {
59
59
  }
60
60
  activeSource = void 0;
61
61
  }
62
- function connectCurrent() {
62
+ function connectCurrent(override) {
63
63
  if (disposed) {
64
64
  return;
65
65
  }
@@ -72,12 +72,12 @@ function useSubscription(source, options = {}) {
72
72
  return;
73
73
  }
74
74
  if (activeSource === resolved && activeStore) {
75
- openConnection(activeStore);
75
+ openConnection(activeStore, override);
76
76
  return;
77
77
  }
78
78
  disconnect();
79
79
  activeSource = resolved;
80
- openConnection(resolved.reactiveStore());
80
+ openConnection(resolved.reactiveStore(), override);
81
81
  }
82
82
  watch(
83
83
  () => isRef(source) ? source.value : source,
@@ -99,8 +99,8 @@ function useSubscription(source, options = {}) {
99
99
  return {
100
100
  data: computed(() => data.value),
101
101
  error: computed(() => error.value),
102
- reconnect: () => {
103
- connectCurrent();
102
+ reconnect: (options2) => {
103
+ connectCurrent(options2);
104
104
  },
105
105
  status: computed(() => status.value)
106
106
  };
@@ -0,0 +1,34 @@
1
+ import { u as useAction } from './vue.DYk0Xfr3.mjs';
2
+ import { u as useClientCapability } from './vue.B8LptjZP.mjs';
3
+ import { u as useSolanaClient } from './vue.Mxc8w6Qk.mjs';
4
+
5
+ function toReadableAirdropError(error) {
6
+ if (error instanceof Error) {
7
+ const httpStatus = error.context?.statusCode;
8
+ const isThrottled = httpStatus === 429 || error.message.startsWith("JSON-RPC error: Internal JSON-RPC error (Internal error)");
9
+ if (!isThrottled) {
10
+ throw error;
11
+ }
12
+ throw new Error(
13
+ `${error.message} This likely means the network's airdrop faucet is rate-limited or out of test SOL. Retry later, use https://faucet.solana.com, or point the client at a local validator.`,
14
+ { cause: error }
15
+ );
16
+ }
17
+ throw new Error(`Airdrop failed: ${String(error)}`);
18
+ }
19
+ function useAirdrop() {
20
+ useClientCapability("airdrop", {
21
+ hookName: "useAirdrop",
22
+ providerHint: "Install it by adding the airdrop capability with `createClient().use(solanaRpcConnection({ ... })).use(rpcAirdrop())` from `@solana/kit-plugin-rpc`."
23
+ });
24
+ const { client } = useSolanaClient();
25
+ return useAction((abortSignal, address, amount) => {
26
+ const airdrop = client.airdrop;
27
+ if (!airdrop) {
28
+ throw new Error("useAirdrop requires the `airdrop` capability on the Solana client.");
29
+ }
30
+ return airdrop(address, amount, abortSignal).catch(toReadableAirdropError);
31
+ });
32
+ }
33
+
34
+ export { useAirdrop as u };
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ const useAction = require('./vue.CoaIWGPT.cjs');
4
+ const useClientCapability = require('./vue.BY0qpgYr.cjs');
5
+ const useSolanaClient = require('./vue.BIxphCAq.cjs');
6
+
7
+ function toReadableAirdropError(error) {
8
+ if (error instanceof Error) {
9
+ const httpStatus = error.context?.statusCode;
10
+ const isThrottled = httpStatus === 429 || error.message.startsWith("JSON-RPC error: Internal JSON-RPC error (Internal error)");
11
+ if (!isThrottled) {
12
+ throw error;
13
+ }
14
+ throw new Error(
15
+ `${error.message} This likely means the network's airdrop faucet is rate-limited or out of test SOL. Retry later, use https://faucet.solana.com, or point the client at a local validator.`,
16
+ { cause: error }
17
+ );
18
+ }
19
+ throw new Error(`Airdrop failed: ${String(error)}`);
20
+ }
21
+ function useAirdrop() {
22
+ useClientCapability.useClientCapability("airdrop", {
23
+ hookName: "useAirdrop",
24
+ providerHint: "Install it by adding the airdrop capability with `createClient().use(solanaRpcConnection({ ... })).use(rpcAirdrop())` from `@solana/kit-plugin-rpc`."
25
+ });
26
+ const { client } = useSolanaClient.useSolanaClient();
27
+ return useAction.useAction((abortSignal, address, amount) => {
28
+ const airdrop = client.airdrop;
29
+ if (!airdrop) {
30
+ throw new Error("useAirdrop requires the `airdrop` capability on the Solana client.");
31
+ }
32
+ return airdrop(address, amount, abortSignal).catch(toReadableAirdropError);
33
+ });
34
+ }
35
+
36
+ exports.useAirdrop = useAirdrop;
@@ -28,7 +28,7 @@ function useTrackedData(source, options = {}) {
28
28
  error.value = null;
29
29
  }
30
30
  }
31
- function buildAndConnect() {
31
+ function buildAndConnect(override) {
32
32
  if (disposed) {
33
33
  return;
34
34
  }
@@ -104,7 +104,7 @@ function useTrackedData(source, options = {}) {
104
104
  }
105
105
  connectionCount += 1;
106
106
  const connection = connectionCount;
107
- const callerSignal = options.getAbortSignal?.(connection);
107
+ const callerSignal = override ? override.abortSignal : options.getAbortSignal?.(connection);
108
108
  const store = createReactiveStoreWithInitialValueAndSlotTracking({
109
109
  initialValueMapper: source.rpcValueMapper,
110
110
  initialValueSource: rpcRequest,
@@ -158,8 +158,8 @@ function useTrackedData(source, options = {}) {
158
158
  return {
159
159
  data: computed(() => data.value),
160
160
  error: computed(() => error.value),
161
- refresh: () => {
162
- buildAndConnect();
161
+ refresh: (options2) => {
162
+ buildAndConnect(options2);
163
163
  },
164
164
  status: computed(() => status.value)
165
165
  };
@@ -30,7 +30,7 @@ function useTrackedData(source, options = {}) {
30
30
  error.value = null;
31
31
  }
32
32
  }
33
- function buildAndConnect() {
33
+ function buildAndConnect(override) {
34
34
  if (disposed) {
35
35
  return;
36
36
  }
@@ -106,7 +106,7 @@ function useTrackedData(source, options = {}) {
106
106
  }
107
107
  connectionCount += 1;
108
108
  const connection = connectionCount;
109
- const callerSignal = options.getAbortSignal?.(connection);
109
+ const callerSignal = override ? override.abortSignal : options.getAbortSignal?.(connection);
110
110
  const store = kit.createReactiveStoreWithInitialValueAndSlotTracking({
111
111
  initialValueMapper: source.rpcValueMapper,
112
112
  initialValueSource: rpcRequest,
@@ -160,8 +160,8 @@ function useTrackedData(source, options = {}) {
160
160
  return {
161
161
  data: vue.computed(() => data.value),
162
162
  error: vue.computed(() => error.value),
163
- refresh: () => {
164
- buildAndConnect();
163
+ refresh: (options2) => {
164
+ buildAndConnect(options2);
165
165
  },
166
166
  status: vue.computed(() => status.value)
167
167
  };
@@ -11,24 +11,22 @@ function useRequest(source, options = {}) {
11
11
  const status = vue.shallowRef("fetching");
12
12
  let disposed = false;
13
13
  let attempt = 0;
14
- const store = action.createSolanaActionStore(
15
- async (signal, resolved) => {
16
- attempt += 1;
17
- const callerSignal = options.getAbortSignal?.(attempt);
18
- const composedSignal = callerSignal ? AbortSignal.any([signal, callerSignal]) : signal;
19
- let pending;
20
- if (isSendSource(resolved)) {
21
- pending = Promise.resolve(resolved.send({ abortSignal: composedSignal }));
22
- } else if (typeof resolved === "function") {
23
- pending = Promise.resolve(resolved(composedSignal)).then(
24
- (result) => isSendSource(result) ? result.send({ abortSignal: composedSignal }) : result
25
- );
26
- } else {
27
- throw new Error("useRequest source did not resolve to a request function");
28
- }
29
- return kit.getAbortablePromise(pending, composedSignal);
14
+ const store = action.createSolanaActionStore(async (signal, resolved, override) => {
15
+ attempt += 1;
16
+ const callerSignal = override ? override.abortSignal : options.getAbortSignal?.(attempt);
17
+ const composedSignal = callerSignal ? AbortSignal.any([signal, callerSignal]) : signal;
18
+ let pending;
19
+ if (isSendSource(resolved)) {
20
+ pending = Promise.resolve(resolved.send({ abortSignal: composedSignal }));
21
+ } else if (typeof resolved === "function") {
22
+ pending = Promise.resolve(resolved(composedSignal)).then(
23
+ (result) => isSendSource(result) ? result.send({ abortSignal: composedSignal }) : result
24
+ );
25
+ } else {
26
+ throw new Error("useRequest source did not resolve to a request function");
30
27
  }
31
- );
28
+ return kit.getAbortablePromise(pending, composedSignal);
29
+ });
32
30
  const unsubscribe = store.subscribe(() => {
33
31
  const next = store.getState();
34
32
  if (next.status === "success") {
@@ -53,7 +51,7 @@ function useRequest(source, options = {}) {
53
51
  }
54
52
  return source;
55
53
  }
56
- async function run() {
54
+ async function run(override) {
57
55
  if (disposed) {
58
56
  return void 0;
59
57
  }
@@ -67,7 +65,7 @@ function useRequest(source, options = {}) {
67
65
  }
68
66
  status.value = "fetching";
69
67
  try {
70
- return await store.dispatchAsync(resolved);
68
+ return await store.dispatchAsync(resolved, override);
71
69
  } catch (cause) {
72
70
  if (store.getState().status !== "error") {
73
71
  return void 0;
@@ -75,7 +73,7 @@ function useRequest(source, options = {}) {
75
73
  throw errors.normalizeSolanaError(cause, "RPC_FAILURE");
76
74
  }
77
75
  }
78
- const refresh = () => run();
76
+ const refresh = (options2) => run(options2);
79
77
  vue.watch(
80
78
  () => vue.isRef(source) ? source.value : source,
81
79
  () => {
@@ -29,11 +29,11 @@ function useSubscription(source, options = {}) {
29
29
  status.value = "loading";
30
30
  }
31
31
  }
32
- function openConnection(store) {
32
+ function openConnection(store, override) {
33
33
  activeStore = store;
34
34
  connectionCount += 1;
35
35
  const connection = connectionCount;
36
- const callerSignal = options.getAbortSignal?.(connection);
36
+ const callerSignal = override ? override.abortSignal : options.getAbortSignal?.(connection);
37
37
  applyState(store.getState());
38
38
  disposables.push(
39
39
  store.subscribe(() => {
@@ -61,7 +61,7 @@ function useSubscription(source, options = {}) {
61
61
  }
62
62
  activeSource = void 0;
63
63
  }
64
- function connectCurrent() {
64
+ function connectCurrent(override) {
65
65
  if (disposed) {
66
66
  return;
67
67
  }
@@ -74,12 +74,12 @@ function useSubscription(source, options = {}) {
74
74
  return;
75
75
  }
76
76
  if (activeSource === resolved && activeStore) {
77
- openConnection(activeStore);
77
+ openConnection(activeStore, override);
78
78
  return;
79
79
  }
80
80
  disconnect();
81
81
  activeSource = resolved;
82
- openConnection(resolved.reactiveStore());
82
+ openConnection(resolved.reactiveStore(), override);
83
83
  }
84
84
  vue.watch(
85
85
  () => vue.isRef(source) ? source.value : source,
@@ -101,8 +101,8 @@ function useSubscription(source, options = {}) {
101
101
  return {
102
102
  data: vue.computed(() => data.value),
103
103
  error: vue.computed(() => error.value),
104
- reconnect: () => {
105
- connectCurrent();
104
+ reconnect: (options2) => {
105
+ connectCurrent(options2);
106
106
  },
107
107
  status: vue.computed(() => status.value)
108
108
  };
package/dist/swr.cjs CHANGED
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  const vue = require('vue');
4
- const useRequest = require('./shared/vue.B8pLQ8P4.cjs');
5
- const useSubscription = require('./shared/vue.BVj9lWBK.cjs');
6
- const useTrackedData = require('./shared/vue.DtCbCcPd.cjs');
4
+ const useRequest = require('./shared/vue.ZuUCEEab.cjs');
5
+ const useSubscription = require('./shared/vue.l3UCdN7z.cjs');
6
+ const useTrackedData = require('./shared/vue.DxM45azl.cjs');
7
7
  require('@vue-solana/core/action');
8
8
  require('@vue-solana/core/kit');
9
9
  require('@vue-solana/core/errors');
package/dist/swr.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { watch, computed } from 'vue';
2
- import { u as useRequest } from './shared/vue.DImwKTwJ.mjs';
3
- import { u as useSubscription } from './shared/vue.B8ub540p.mjs';
4
- import { u as useTrackedData } from './shared/vue.CogzzQXM.mjs';
2
+ import { u as useRequest } from './shared/vue.B8VvC8d2.mjs';
3
+ import { u as useSubscription } from './shared/vue.BDNOyiGZ.mjs';
4
+ import { u as useTrackedData } from './shared/vue.CbJFnho-.mjs';
5
5
  import '@vue-solana/core/action';
6
6
  import '@vue-solana/core/kit';
7
7
  import '@vue-solana/core/errors';
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ const useAirdrop = require('./shared/vue.CTqPbvz3.cjs');
4
+ require('./shared/vue.CoaIWGPT.cjs');
5
+ require('@vue-solana/core/action');
6
+ require('vue');
7
+ require('./shared/vue.BY0qpgYr.cjs');
8
+ require('./shared/vue.BIxphCAq.cjs');
9
+ require('./shared/vue.DE3emjSF.cjs');
10
+ require('./shared/vue.DEHxNvUX.cjs');
11
+
12
+
13
+
14
+ exports.useAirdrop = useAirdrop.useAirdrop;