@wallet-ui/core 2.2.2 → 3.0.0-canary-20260121173832
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/dist/index.browser.cjs +30 -10
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.mjs +30 -11
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.development.js +40 -11
- package/dist/index.development.js.map +1 -1
- package/dist/index.native.mjs +30 -11
- package/dist/index.native.mjs.map +1 -1
- package/dist/index.node.cjs +30 -10
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +30 -11
- package/dist/index.node.mjs.map +1 -1
- package/dist/index.production.min.js +10 -9
- package/dist/types/clusters.d.ts +5 -3
- package/dist/types/clusters.d.ts.map +1 -1
- package/dist/types/types/solana-cluster.d.ts +2 -0
- package/dist/types/types/solana-cluster.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.browser.cjs
CHANGED
|
@@ -1,41 +1,60 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var kit = require('@solana/kit');
|
|
3
4
|
var persistent = require('@nanostores/persistent');
|
|
4
5
|
var nanostores = require('nanostores');
|
|
5
6
|
|
|
6
7
|
// src/clusters.ts
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
// src/types/solana-cluster.ts
|
|
10
|
+
function localnet(url) {
|
|
11
|
+
return url;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// src/clusters.ts
|
|
15
|
+
function createSolanaCluster(props, { id, label, url: defaultUrl, urlWs: defaultUrlWs }) {
|
|
8
16
|
if (typeof props === "string") {
|
|
9
17
|
return { id, label, url: props };
|
|
10
18
|
}
|
|
11
|
-
return {
|
|
19
|
+
return {
|
|
20
|
+
id,
|
|
21
|
+
label: props.label ?? label,
|
|
22
|
+
url: props.url ?? defaultUrl,
|
|
23
|
+
urlWs: props.urlWs ?? defaultUrlWs
|
|
24
|
+
};
|
|
12
25
|
}
|
|
13
|
-
function createSolanaDevnet(props =
|
|
26
|
+
function createSolanaDevnet(props = "https://api.devnet.solana.com") {
|
|
14
27
|
return createSolanaCluster(props, {
|
|
15
28
|
id: "solana:devnet",
|
|
16
29
|
label: "Devnet",
|
|
17
|
-
url:
|
|
30
|
+
url: kit.devnet(typeof props === "string" ? props : props.url)
|
|
18
31
|
});
|
|
19
32
|
}
|
|
20
|
-
function createSolanaLocalnet(props =
|
|
33
|
+
function createSolanaLocalnet(props = "http://localhost:8899") {
|
|
34
|
+
const url = typeof props === "string" ? props : props.url;
|
|
35
|
+
const urlWs = typeof props !== "string" ? props.urlWs ?? getLocalUrlWs(url) : void 0;
|
|
21
36
|
return createSolanaCluster(props, {
|
|
22
37
|
id: "solana:localnet",
|
|
23
38
|
label: "Localnet",
|
|
24
|
-
url:
|
|
39
|
+
url: localnet(url),
|
|
40
|
+
urlWs
|
|
25
41
|
});
|
|
26
42
|
}
|
|
27
|
-
function
|
|
43
|
+
function getLocalUrlWs(url) {
|
|
44
|
+
return url.endsWith(":8899") ? url.replace(":8899", ":8900").replace("http", "ws") : void 0;
|
|
45
|
+
}
|
|
46
|
+
function createSolanaMainnet(props) {
|
|
28
47
|
return createSolanaCluster(props, {
|
|
29
48
|
id: "solana:mainnet",
|
|
30
49
|
label: "Mainnet",
|
|
31
|
-
url:
|
|
50
|
+
url: kit.mainnet(typeof props === "string" ? props : props.url)
|
|
32
51
|
});
|
|
33
52
|
}
|
|
34
|
-
function createSolanaTestnet(props =
|
|
53
|
+
function createSolanaTestnet(props = "https://api.testnet.solana.com") {
|
|
35
54
|
return createSolanaCluster(props, {
|
|
36
55
|
id: "solana:testnet",
|
|
37
56
|
label: "Testnet",
|
|
38
|
-
url:
|
|
57
|
+
url: kit.testnet(typeof props === "string" ? props : props.url)
|
|
39
58
|
});
|
|
40
59
|
}
|
|
41
60
|
var Storage = class {
|
|
@@ -148,5 +167,6 @@ exports.createStorageCluster = createStorageCluster;
|
|
|
148
167
|
exports.explorerProviders = explorerProviders;
|
|
149
168
|
exports.getExplorerUrl = getExplorerUrl;
|
|
150
169
|
exports.handleCopyText = handleCopyText;
|
|
170
|
+
exports.localnet = localnet;
|
|
151
171
|
//# sourceMappingURL=index.browser.cjs.map
|
|
152
172
|
//# sourceMappingURL=index.browser.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/clusters.ts","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":["persistentAtom","computed"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import type {\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = Partial<Pick<SolanaCluster, 'label' | 'url'>> | string;\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url }: SolanaCluster,\n): Pick<SolanaCluster, 'id' | 'label' | 'url'> {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return { id, label: props.label ?? label, url: props.url ?? url };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: 'devnet' as SolanaDevnetUrl,\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: 'localnet' as SolanaLocalnetUrl,\n });\n}\n\nexport function createSolanaMainnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: 'mainnet' as SolanaMainnetUrl,\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: 'testnet' as SolanaTestnetUrl,\n });\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/solana-cluster.ts","../src/clusters.ts","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":["devnet","mainnet","testnet","persistentAtom","computed"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import type {\n DevnetUrl as SolanaDevnetUrl,\n MainnetUrl as SolanaMainnetUrl,\n TestnetUrl as SolanaTestnetUrl,\n} from '@solana/kit';\n\nimport { SolanaClusterId } from './solana-cluster-id';\n\nexport type { SolanaDevnetUrl, SolanaMainnetUrl, SolanaTestnetUrl };\n\nexport type SolanaLocalnetUrl = string & { '~cluster': 'localnet' };\n\nexport function localnet(url: string) {\n return url as SolanaLocalnetUrl;\n}\n\nexport interface SolanaCluster {\n id: SolanaClusterId;\n label: string;\n url: SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl | string;\n urlWs?: string;\n}\n","import { devnet, mainnet, testnet } from '@solana/kit';\n\nimport {\n localnet,\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = string | (Partial<Pick<SolanaCluster, 'label' | 'url' | 'urlWs'>> & { url: string });\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url: defaultUrl, urlWs: defaultUrlWs }: Pick<SolanaCluster, 'id' | 'label' | 'url' | 'urlWs'>,\n): SolanaCluster {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return {\n id,\n label: props.label ?? label,\n url: props.url ?? defaultUrl,\n urlWs: props.urlWs ?? defaultUrlWs,\n };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = 'https://api.devnet.solana.com'): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: devnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = 'http://localhost:8899'): SolanaCluster {\n const url = typeof props === 'string' ? props : props.url;\n const urlWs = typeof props !== 'string' ? (props.urlWs ?? getLocalUrlWs(url)) : undefined;\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: localnet(url),\n urlWs,\n });\n}\n\nfunction getLocalUrlWs(url: string) {\n return url.endsWith(':8899') ? url.replace(':8899', ':8900').replace('http', 'ws') : undefined;\n}\nexport function createSolanaMainnet(props: CreateSolanaProps): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: mainnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = 'https://api.testnet.solana.com'): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: testnet(typeof props === 'string' ? props : props.url),\n });\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
package/dist/index.browser.mjs
CHANGED
|
@@ -1,39 +1,58 @@
|
|
|
1
|
+
import { devnet, mainnet, testnet } from '@solana/kit';
|
|
1
2
|
import { persistentAtom } from '@nanostores/persistent';
|
|
2
3
|
import { computed } from 'nanostores';
|
|
3
4
|
|
|
4
5
|
// src/clusters.ts
|
|
5
|
-
|
|
6
|
+
|
|
7
|
+
// src/types/solana-cluster.ts
|
|
8
|
+
function localnet(url) {
|
|
9
|
+
return url;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// src/clusters.ts
|
|
13
|
+
function createSolanaCluster(props, { id, label, url: defaultUrl, urlWs: defaultUrlWs }) {
|
|
6
14
|
if (typeof props === "string") {
|
|
7
15
|
return { id, label, url: props };
|
|
8
16
|
}
|
|
9
|
-
return {
|
|
17
|
+
return {
|
|
18
|
+
id,
|
|
19
|
+
label: props.label ?? label,
|
|
20
|
+
url: props.url ?? defaultUrl,
|
|
21
|
+
urlWs: props.urlWs ?? defaultUrlWs
|
|
22
|
+
};
|
|
10
23
|
}
|
|
11
|
-
function createSolanaDevnet(props =
|
|
24
|
+
function createSolanaDevnet(props = "https://api.devnet.solana.com") {
|
|
12
25
|
return createSolanaCluster(props, {
|
|
13
26
|
id: "solana:devnet",
|
|
14
27
|
label: "Devnet",
|
|
15
|
-
url:
|
|
28
|
+
url: devnet(typeof props === "string" ? props : props.url)
|
|
16
29
|
});
|
|
17
30
|
}
|
|
18
|
-
function createSolanaLocalnet(props =
|
|
31
|
+
function createSolanaLocalnet(props = "http://localhost:8899") {
|
|
32
|
+
const url = typeof props === "string" ? props : props.url;
|
|
33
|
+
const urlWs = typeof props !== "string" ? props.urlWs ?? getLocalUrlWs(url) : void 0;
|
|
19
34
|
return createSolanaCluster(props, {
|
|
20
35
|
id: "solana:localnet",
|
|
21
36
|
label: "Localnet",
|
|
22
|
-
url:
|
|
37
|
+
url: localnet(url),
|
|
38
|
+
urlWs
|
|
23
39
|
});
|
|
24
40
|
}
|
|
25
|
-
function
|
|
41
|
+
function getLocalUrlWs(url) {
|
|
42
|
+
return url.endsWith(":8899") ? url.replace(":8899", ":8900").replace("http", "ws") : void 0;
|
|
43
|
+
}
|
|
44
|
+
function createSolanaMainnet(props) {
|
|
26
45
|
return createSolanaCluster(props, {
|
|
27
46
|
id: "solana:mainnet",
|
|
28
47
|
label: "Mainnet",
|
|
29
|
-
url:
|
|
48
|
+
url: mainnet(typeof props === "string" ? props : props.url)
|
|
30
49
|
});
|
|
31
50
|
}
|
|
32
|
-
function createSolanaTestnet(props =
|
|
51
|
+
function createSolanaTestnet(props = "https://api.testnet.solana.com") {
|
|
33
52
|
return createSolanaCluster(props, {
|
|
34
53
|
id: "solana:testnet",
|
|
35
54
|
label: "Testnet",
|
|
36
|
-
url:
|
|
55
|
+
url: testnet(typeof props === "string" ? props : props.url)
|
|
37
56
|
});
|
|
38
57
|
}
|
|
39
58
|
var Storage = class {
|
|
@@ -135,6 +154,6 @@ function handleCopyText(text) {
|
|
|
135
154
|
void globalThis.navigator.clipboard.writeText(text);
|
|
136
155
|
}
|
|
137
156
|
|
|
138
|
-
export { Storage, createSolanaDevnet, createSolanaLocalnet, createSolanaMainnet, createSolanaTestnet, createStorage, createStorageAccount, createStorageCluster, explorerProviders, getExplorerUrl, handleCopyText };
|
|
157
|
+
export { Storage, createSolanaDevnet, createSolanaLocalnet, createSolanaMainnet, createSolanaTestnet, createStorage, createStorageAccount, createStorageCluster, explorerProviders, getExplorerUrl, handleCopyText, localnet };
|
|
139
158
|
//# sourceMappingURL=index.browser.mjs.map
|
|
140
159
|
//# sourceMappingURL=index.browser.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/clusters.ts","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":[],"mappings":"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","file":"index.browser.mjs","sourcesContent":["import type {\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = Partial<Pick<SolanaCluster, 'label' | 'url'>> | string;\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url }: SolanaCluster,\n): Pick<SolanaCluster, 'id' | 'label' | 'url'> {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return { id, label: props.label ?? label, url: props.url ?? url };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: 'devnet' as SolanaDevnetUrl,\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: 'localnet' as SolanaLocalnetUrl,\n });\n}\n\nexport function createSolanaMainnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: 'mainnet' as SolanaMainnetUrl,\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: 'testnet' as SolanaTestnetUrl,\n });\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/solana-cluster.ts","../src/clusters.ts","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":[],"mappings":"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","file":"index.browser.mjs","sourcesContent":["import type {\n DevnetUrl as SolanaDevnetUrl,\n MainnetUrl as SolanaMainnetUrl,\n TestnetUrl as SolanaTestnetUrl,\n} from '@solana/kit';\n\nimport { SolanaClusterId } from './solana-cluster-id';\n\nexport type { SolanaDevnetUrl, SolanaMainnetUrl, SolanaTestnetUrl };\n\nexport type SolanaLocalnetUrl = string & { '~cluster': 'localnet' };\n\nexport function localnet(url: string) {\n return url as SolanaLocalnetUrl;\n}\n\nexport interface SolanaCluster {\n id: SolanaClusterId;\n label: string;\n url: SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl | string;\n urlWs?: string;\n}\n","import { devnet, mainnet, testnet } from '@solana/kit';\n\nimport {\n localnet,\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = string | (Partial<Pick<SolanaCluster, 'label' | 'url' | 'urlWs'>> & { url: string });\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url: defaultUrl, urlWs: defaultUrlWs }: Pick<SolanaCluster, 'id' | 'label' | 'url' | 'urlWs'>,\n): SolanaCluster {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return {\n id,\n label: props.label ?? label,\n url: props.url ?? defaultUrl,\n urlWs: props.urlWs ?? defaultUrlWs,\n };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = 'https://api.devnet.solana.com'): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: devnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = 'http://localhost:8899'): SolanaCluster {\n const url = typeof props === 'string' ? props : props.url;\n const urlWs = typeof props !== 'string' ? (props.urlWs ?? getLocalUrlWs(url)) : undefined;\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: localnet(url),\n urlWs,\n });\n}\n\nfunction getLocalUrlWs(url: string) {\n return url.endsWith(':8899') ? url.replace(':8899', ':8900').replace('http', 'ws') : undefined;\n}\nexport function createSolanaMainnet(props: CreateSolanaProps): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: mainnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = 'https://api.testnet.solana.com'): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: testnet(typeof props === 'string' ? props : props.url),\n });\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
|
@@ -6,40 +6,68 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
6
6
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
7
7
|
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
|
|
8
8
|
|
|
9
|
+
// ../../node_modules/.pnpm/@solana+rpc-types@5.0.0_fastestsmallesttextencoderdecoder@1.0.22_typescript@5.9.3/node_modules/@solana/rpc-types/dist/index.browser.mjs
|
|
10
|
+
function mainnet(putativeString) {
|
|
11
|
+
return putativeString;
|
|
12
|
+
}
|
|
13
|
+
function devnet(putativeString) {
|
|
14
|
+
return putativeString;
|
|
15
|
+
}
|
|
16
|
+
function testnet(putativeString) {
|
|
17
|
+
return putativeString;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// src/types/solana-cluster.ts
|
|
21
|
+
function localnet(url) {
|
|
22
|
+
return url;
|
|
23
|
+
}
|
|
24
|
+
|
|
9
25
|
// src/clusters.ts
|
|
10
|
-
function createSolanaCluster(props, { id, label, url }) {
|
|
11
|
-
var _a, _b;
|
|
26
|
+
function createSolanaCluster(props, { id, label, url: defaultUrl, urlWs: defaultUrlWs }) {
|
|
27
|
+
var _a, _b, _c;
|
|
12
28
|
if (typeof props === "string") {
|
|
13
29
|
return { id, label, url: props };
|
|
14
30
|
}
|
|
15
|
-
return {
|
|
31
|
+
return {
|
|
32
|
+
id,
|
|
33
|
+
label: (_a = props.label) != null ? _a : label,
|
|
34
|
+
url: (_b = props.url) != null ? _b : defaultUrl,
|
|
35
|
+
urlWs: (_c = props.urlWs) != null ? _c : defaultUrlWs
|
|
36
|
+
};
|
|
16
37
|
}
|
|
17
|
-
function createSolanaDevnet(props =
|
|
38
|
+
function createSolanaDevnet(props = "https://api.devnet.solana.com") {
|
|
18
39
|
return createSolanaCluster(props, {
|
|
19
40
|
id: "solana:devnet",
|
|
20
41
|
label: "Devnet",
|
|
21
|
-
url:
|
|
42
|
+
url: devnet(typeof props === "string" ? props : props.url)
|
|
22
43
|
});
|
|
23
44
|
}
|
|
24
|
-
function createSolanaLocalnet(props =
|
|
45
|
+
function createSolanaLocalnet(props = "http://localhost:8899") {
|
|
46
|
+
var _a;
|
|
47
|
+
const url = typeof props === "string" ? props : props.url;
|
|
48
|
+
const urlWs = typeof props !== "string" ? (_a = props.urlWs) != null ? _a : getLocalUrlWs(url) : void 0;
|
|
25
49
|
return createSolanaCluster(props, {
|
|
26
50
|
id: "solana:localnet",
|
|
27
51
|
label: "Localnet",
|
|
28
|
-
url:
|
|
52
|
+
url: localnet(url),
|
|
53
|
+
urlWs
|
|
29
54
|
});
|
|
30
55
|
}
|
|
31
|
-
function
|
|
56
|
+
function getLocalUrlWs(url) {
|
|
57
|
+
return url.endsWith(":8899") ? url.replace(":8899", ":8900").replace("http", "ws") : void 0;
|
|
58
|
+
}
|
|
59
|
+
function createSolanaMainnet(props) {
|
|
32
60
|
return createSolanaCluster(props, {
|
|
33
61
|
id: "solana:mainnet",
|
|
34
62
|
label: "Mainnet",
|
|
35
|
-
url:
|
|
63
|
+
url: mainnet(typeof props === "string" ? props : props.url)
|
|
36
64
|
});
|
|
37
65
|
}
|
|
38
|
-
function createSolanaTestnet(props =
|
|
66
|
+
function createSolanaTestnet(props = "https://api.testnet.solana.com") {
|
|
39
67
|
return createSolanaCluster(props, {
|
|
40
68
|
id: "solana:testnet",
|
|
41
69
|
label: "Testnet",
|
|
42
|
-
url:
|
|
70
|
+
url: testnet(typeof props === "string" ? props : props.url)
|
|
43
71
|
});
|
|
44
72
|
}
|
|
45
73
|
|
|
@@ -416,6 +444,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
416
444
|
exports.explorerProviders = explorerProviders;
|
|
417
445
|
exports.getExplorerUrl = getExplorerUrl;
|
|
418
446
|
exports.handleCopyText = handleCopyText;
|
|
447
|
+
exports.localnet = localnet;
|
|
419
448
|
|
|
420
449
|
return exports;
|
|
421
450
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/clusters.ts","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/atom/index.js","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/lifecycle/index.js","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/computed/index.js","../../../node_modules/.pnpm/@nanostores+persistent@1.1.0_nanostores@1.0.1/node_modules/@nanostores/persistent/index.js","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":["batched"],"mappings":"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","file":"index.development.js","sourcesContent":["import type {\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = Partial<Pick<SolanaCluster, 'label' | 'url'>> | string;\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url }: SolanaCluster,\n): Pick<SolanaCluster, 'id' | 'label' | 'url'> {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return { id, label: props.label ?? label, url: props.url ?? url };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: 'devnet' as SolanaDevnetUrl,\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: 'localnet' as SolanaLocalnetUrl,\n });\n}\n\nexport function createSolanaMainnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: 'mainnet' as SolanaMainnetUrl,\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: 'testnet' as SolanaTestnetUrl,\n });\n}\n","import { cleanTasks } from '../task/index.js'\n\nexport let clean = Symbol('clean')\n\nexport let cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\nexport let atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n","import { clean } from '../clean-stores/index.js'\n\nconst START = 0\nconst STOP = 1\nconst SET = 2\nconst NOTIFY = 3\nconst MOUNT = 5\nconst UNMOUNT = 6\nconst REVERT_MUTATION = 10\n\nexport let on = (object, listener, eventKey, mutateStore) => {\n object.events = object.events || {}\n if (!object.events[eventKey + REVERT_MUTATION]) {\n object.events[eventKey + REVERT_MUTATION] = mutateStore(eventProps => {\n // eslint-disable-next-line no-sequences\n object.events[eventKey].reduceRight((event, l) => (l(event), event), {\n shared: {},\n ...eventProps\n })\n })\n }\n object.events[eventKey] = object.events[eventKey] || []\n object.events[eventKey].push(listener)\n return () => {\n let currentListeners = object.events[eventKey]\n let index = currentListeners.indexOf(listener)\n currentListeners.splice(index, 1)\n if (!currentListeners.length) {\n delete object.events[eventKey]\n object.events[eventKey + REVERT_MUTATION]()\n delete object.events[eventKey + REVERT_MUTATION]\n }\n }\n}\n\nexport let onStart = ($store, listener) =>\n on($store, listener, START, runListeners => {\n let originListen = $store.listen\n $store.listen = arg => {\n if (!$store.lc && !$store.starting) {\n $store.starting = true\n runListeners()\n delete $store.starting\n }\n return originListen(arg)\n }\n return () => {\n $store.listen = originListen\n }\n })\n\nexport let onStop = ($store, listener) =>\n on($store, listener, STOP, runListeners => {\n let originOff = $store.off\n $store.off = () => {\n runListeners()\n originOff()\n }\n return () => {\n $store.off = originOff\n }\n })\n\nexport let onSet = ($store, listener) =>\n on($store, listener, SET, runListeners => {\n let originSet = $store.set\n let originSetKey = $store.setKey\n if ($store.setKey) {\n $store.setKey = (changed, changedValue) => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({\n abort,\n changed,\n newValue: { ...$store.value, [changed]: changedValue }\n })\n if (!isAborted) return originSetKey(changed, changedValue)\n }\n }\n $store.set = newValue => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({ abort, newValue })\n if (!isAborted) return originSet(newValue)\n }\n return () => {\n $store.set = originSet\n $store.setKey = originSetKey\n }\n })\n\nexport let onNotify = ($store, listener) =>\n on($store, listener, NOTIFY, runListeners => {\n let originNotify = $store.notify\n $store.notify = (oldValue, changed) => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({ abort, changed, oldValue })\n if (!isAborted) return originNotify(oldValue, changed)\n }\n return () => {\n $store.notify = originNotify\n }\n })\n\nexport let STORE_UNMOUNT_DELAY = 1000\n\nexport let onMount = ($store, initialize) => {\n let listener = payload => {\n let destroy = initialize(payload)\n if (destroy) $store.events[UNMOUNT].push(destroy)\n }\n return on($store, listener, MOUNT, runListeners => {\n let originListen = $store.listen\n $store.listen = (...args) => {\n if (!$store.lc && !$store.active) {\n $store.active = true\n runListeners()\n }\n return originListen(...args)\n }\n\n let originOff = $store.off\n $store.events[UNMOUNT] = []\n $store.off = () => {\n originOff()\n setTimeout(() => {\n if ($store.active && !$store.lc) {\n $store.active = false\n for (let destroy of $store.events[UNMOUNT]) destroy()\n $store.events[UNMOUNT] = []\n }\n }, STORE_UNMOUNT_DELAY)\n }\n\n if (process.env.NODE_ENV !== 'production') {\n let originClean = $store[clean]\n $store[clean] = () => {\n for (let destroy of $store.events[UNMOUNT]) destroy()\n $store.events[UNMOUNT] = []\n $store.active = false\n originClean()\n }\n }\n\n return () => {\n $store.listen = originListen\n $store.off = originOff\n }\n })\n}\n","import { atom, epoch } from '../atom/index.js'\nimport { onMount } from '../lifecycle/index.js'\n\nlet computedStore = (stores, cb, batched) => {\n if (!Array.isArray(stores)) stores = [stores]\n\n let previousArgs\n let currentEpoch\n let set = () => {\n if (currentEpoch === epoch) return\n currentEpoch = epoch\n let args = stores.map($store => $store.get())\n if (!previousArgs || args.some((arg, i) => arg !== previousArgs[i])) {\n previousArgs = args\n let value = cb(...args)\n if (value && value.then && value.t) {\n value.then(asyncValue => {\n if (previousArgs === args) {\n // Prevent a stale set\n $computed.set(asyncValue)\n }\n })\n } else {\n $computed.set(value)\n currentEpoch = epoch\n }\n }\n }\n let $computed = atom(undefined)\n let get = $computed.get\n $computed.get = () => {\n set()\n return get()\n }\n\n let timer\n let run = batched\n ? () => {\n clearTimeout(timer)\n timer = setTimeout(set)\n }\n : set\n\n onMount($computed, () => {\n let unbinds = stores.map($store => $store.listen(run))\n set()\n return () => {\n for (let unbind of unbinds) unbind()\n }\n })\n\n return $computed\n}\n\nexport let computed = (stores, fn) => computedStore(stores, fn)\nexport let batched = (stores, fn) => computedStore(stores, fn, true)\n","import { atom, map, onMount } from 'nanostores'\n\nlet identity = a => a\nlet storageEngine = {}\nlet eventsEngine = { addEventListener() {}, removeEventListener() {} }\n\nfunction testSupport() {\n try {\n return typeof localStorage !== 'undefined'\n /* c8 ignore next 4 */\n } catch {\n // In Privacy Mode access to localStorage will return error\n return false\n }\n}\nif (testSupport()) {\n storageEngine = localStorage\n}\n\nexport let windowPersistentEvents = {\n addEventListener(key, listener, restore) {\n window.addEventListener('storage', listener)\n window.addEventListener('pageshow', restore)\n },\n removeEventListener(key, listener, restore) {\n window.removeEventListener('storage', listener)\n window.removeEventListener('pageshow', restore)\n }\n}\n\nif (typeof window !== 'undefined') {\n eventsEngine = windowPersistentEvents\n}\n\nexport function setPersistentEngine(storage, events) {\n storageEngine = storage\n eventsEngine = events\n}\n\nexport function persistentAtom(name, initial = undefined, opts = {}) {\n let encode = opts.encode || identity\n let decode = opts.decode || identity\n\n let store = atom(initial)\n\n let set = store.set\n store.set = newValue => {\n let converted = encode(newValue)\n if (typeof converted === 'undefined') {\n delete storageEngine[name]\n } else {\n storageEngine[name] = converted\n }\n set(newValue)\n }\n\n function listener(e) {\n if (e.key === name) {\n if (e.newValue === null) {\n set(initial)\n } else {\n set(decode(e.newValue))\n }\n } else if (!storageEngine[name]) {\n set(initial)\n }\n }\n\n function restore() {\n store.set(storageEngine[name] ? decode(storageEngine[name]) : initial)\n }\n\n onMount(store, () => {\n restore()\n if (opts.listen !== false) {\n eventsEngine.addEventListener(name, listener, restore)\n return () => {\n eventsEngine.removeEventListener(name, listener, restore)\n }\n }\n })\n\n return store\n}\n\nexport function persistentMap(prefix, initial = {}, opts = {}) {\n let encode = opts.encode || identity\n let decode = opts.decode || identity\n\n let store = map()\n\n let setKey = store.setKey\n let storeKey = (key, newValue) => {\n if (typeof newValue === 'undefined') {\n if (opts.listen !== false && eventsEngine.perKey) {\n eventsEngine.removeEventListener(prefix + key, listener, restore)\n }\n delete storageEngine[prefix + key]\n } else {\n if (\n opts.listen !== false &&\n eventsEngine.perKey &&\n !(key in store.value)\n ) {\n eventsEngine.addEventListener(prefix + key, listener, restore)\n }\n storageEngine[prefix + key] = encode(newValue)\n }\n }\n\n store.setKey = (key, newValue) => {\n storeKey(key, newValue)\n setKey(key, newValue)\n }\n\n let set = store.set\n store.set = function (newObject) {\n for (let key in newObject) {\n storeKey(key, newObject[key])\n }\n for (let key in store.value) {\n if (!(key in newObject)) {\n storeKey(key, undefined)\n }\n }\n set(newObject)\n }\n\n function listener(e) {\n if (!e.key) {\n set({})\n } else if (e.key.startsWith(prefix)) {\n if (e.newValue === null) {\n setKey(e.key.slice(prefix.length), undefined)\n } else {\n setKey(e.key.slice(prefix.length), decode(e.newValue))\n }\n }\n }\n\n function restore() {\n let data = { ...initial }\n for (let key in storageEngine) {\n if (key.startsWith(prefix)) {\n data[key.slice(prefix.length)] = decode(storageEngine[key])\n }\n }\n for (let key in data) {\n store.setKey(key, data[key])\n }\n }\n\n onMount(store, () => {\n restore()\n if (opts.listen !== false) {\n eventsEngine.addEventListener(prefix, listener, restore)\n return () => {\n eventsEngine.removeEventListener(prefix, listener, restore)\n for (let key in store.value) {\n eventsEngine.removeEventListener(prefix + key, listener, restore)\n }\n }\n }\n })\n\n return store\n}\n\nlet testStorage = {}\nlet testListeners = []\n\nexport function useTestStorageEngine() {\n setPersistentEngine(testStorage, {\n addEventListener(key, cb) {\n testListeners.push(cb)\n },\n removeEventListener(key, cb) {\n testListeners = testListeners.filter(i => i !== cb)\n }\n })\n}\n\nexport function setTestStorageKey(key, newValue) {\n if (typeof newValue === 'undefined') {\n delete testStorage[key]\n } else {\n testStorage[key] = newValue\n }\n let event = { key, newValue }\n for (let listener of testListeners) {\n listener(event)\n }\n}\n\nexport function getTestStorage() {\n return testStorage\n}\n\nexport function cleanTestStorage() {\n for (let i in testStorage) {\n setTestStorageKey(i, undefined)\n }\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/@solana+rpc-types@5.0.0_fastestsmallesttextencoderdecoder@1.0.22_typescript@5.9.3/node_modules/@solana/rpc-types/src/cluster-url.ts","../src/types/solana-cluster.ts","../src/clusters.ts","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/atom/index.js","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/lifecycle/index.js","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/computed/index.js","../../../node_modules/.pnpm/@nanostores+persistent@1.1.0_nanostores@1.0.1/node_modules/@nanostores/persistent/index.js","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":["batched"],"mappings":";;;;;;;;;EAMO,SAAS,QAAQ,cAAA,EAAoC;EACjD,EAAA,OAAA,cAAA;EACX;EAEO,SAAS,OAAO,cAAA,EAAmC;EAC/C,EAAA,OAAA,cAAA;EACX;EAEO,SAAS,QAAQ,cAAA,EAAoC;EACjD,EAAA,OAAA,cAAA;EACX;;;ECJO,SAAS,SAAS,GAAA,EAAa;EAClC,EAAA,OAAO,GAAA;EACX;;;ECDA,SAAS,mBAAA,CACL,OACA,EAAE,EAAA,EAAI,OAAO,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,YAAA,EAAa,EACrC;EAhBjB,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;EAiBI,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;EAC3B,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK,KAAA,EAAW;EAAA,EACxC;EAEA,EAAA,OAAO;EAAA,IACH,EAAA;EAAA,IACA,KAAA,EAAA,CAAO,EAAA,GAAA,KAAA,CAAM,KAAA,KAAN,IAAA,GAAA,EAAA,GAAe,KAAA;EAAA,IACtB,GAAA,EAAA,CAAK,EAAA,GAAA,KAAA,CAAM,GAAA,KAAN,IAAA,GAAA,EAAA,GAAa,UAAA;EAAA,IAClB,KAAA,EAAA,CAAO,EAAA,GAAA,KAAA,CAAM,KAAA,KAAN,IAAA,GAAA,EAAA,GAAe;EAAA,GAC1B;EACJ;EAEO,SAAS,kBAAA,CAAmB,QAA2B,+BAAA,EAAgD;EAC1G,EAAA,OAAO,oBAAqC,KAAA,EAAO;EAAA,IAC/C,EAAA,EAAI,eAAA;EAAA,IACJ,KAAA,EAAO,QAAA;EAAA,IACP,KAAK,MAAA,CAAO,OAAO,UAAU,QAAA,GAAW,KAAA,GAAQ,MAAM,GAAG;EAAA,GAC5D,CAAA;EACL;EAEO,SAAS,oBAAA,CAAqB,QAA2B,uBAAA,EAAwC;EArCxG,EAAA,IAAA,EAAA;EAsCI,EAAA,MAAM,GAAA,GAAM,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,CAAM,GAAA;EACtD,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,KAAU,QAAA,GAAA,CAAY,WAAM,KAAA,KAAN,IAAA,GAAA,EAAA,GAAe,aAAA,CAAc,GAAG,CAAA,GAAK,MAAA;EAChF,EAAA,OAAO,oBAAoB,KAAA,EAAO;EAAA,IAC9B,EAAA,EAAI,iBAAA;EAAA,IACJ,KAAA,EAAO,UAAA;EAAA,IACP,GAAA,EAAK,SAAS,GAAG,CAAA;EAAA,IACjB;EAAA,GACH,CAAA;EACL;EAEA,SAAS,cAAc,GAAA,EAAa;EAChC,EAAA,OAAO,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA,GAAI,MAAA;EACzF;EACO,SAAS,oBAAoB,KAAA,EAAyC;EACzE,EAAA,OAAO,oBAAoB,KAAA,EAAO;EAAA,IAC9B,EAAA,EAAI,gBAAA;EAAA,IACJ,KAAA,EAAO,SAAA;EAAA,IACP,KAAK,OAAA,CAAQ,OAAO,UAAU,QAAA,GAAW,KAAA,GAAQ,MAAM,GAAG;EAAA,GAC7D,CAAA;EACL;EAEO,SAAS,mBAAA,CAAoB,QAA2B,gCAAA,EAAiD;EAC5G,EAAA,OAAO,oBAAoB,KAAA,EAAO;EAAA,IAC9B,EAAA,EAAI,gBAAA;EAAA,IACJ,KAAA,EAAO,SAAA;EAAA,IACP,KAAK,OAAA,CAAQ,OAAO,UAAU,QAAA,GAAW,KAAA,GAAQ,MAAM,GAAG;EAAA,GAC7D,CAAA;EACL;;;EC/DO,IAAI,KAAA,GAAQ,OAAO,OAAO,CAAA;;;ECAjC,IAAI,gBAAgB,EAAC;EACrB,IAAI,OAAA,GAAU,CAAA;EACd,IAAM,wBAAA,GAA2B,CAAA;EAC1B,IAAI,KAAA,GAAQ,CAAA;EAEZ,IAAI,OAAO,CAAA,YAAA,KAAgB;EAChC,EAAA,IAAI,YAAY,EAAC;EACjB,EAAA,IAAI,KAAA,GAAQ;EAAA,IACV,GAAA,GAAM;EACJ,MAAA,IAAI,CAAC,MAAM,EAAA,EAAI;EACb,QAAA,KAAA,CAAM,OAAO,MAAM;EAAA,QAAC,CAAC,CAAA,EAAE;EAAA,MACzB;EACA,MAAA,OAAO,KAAA,CAAM,KAAA;EAAA,IACf,CAAA;EAAA,IACA,EAAA,EAAI,CAAA;EAAA,IACJ,OAAO,QAAA,EAAU;EACf,MAAA,KAAA,CAAM,EAAA,GAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA;EAElC,MAAA,OAAO,MAAM;EACX,QAAA,KAAA,IACM,CAAA,GAAI,OAAA,GAAU,wBAAA,EAClB,CAAA,GAAI,cAAc,MAAA,IAElB;EACA,UAAA,IAAI,aAAA,CAAc,CAAC,CAAA,KAAM,QAAA,EAAU;EACjC,YAAA,aAAA,CAAc,MAAA,CAAO,GAAG,wBAAwB,CAAA;EAAA,UAClD,CAAA,MAAO;EACL,YAAA,CAAA,IAAK,wBAAA;EAAA,UACP;EAAA,QACF;EAEA,QAAA,IAAI,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;EACtC,QAAA,IAAI,CAAC,KAAA,EAAO;EACV,UAAA,SAAA,CAAU,MAAA,CAAO,OAAO,CAAC,CAAA;EACzB,UAAA,IAAI,CAAC,EAAE,KAAA,CAAM,EAAA,QAAU,GAAA,EAAI;EAAA,QAC7B;EAAA,MACF,CAAA;EAAA,IACF,CAAA;EAAA,IACA,MAAA,CAAO,UAAU,UAAA,EAAY;EAC3B,MAAA,KAAA,EAAA;EACA,MAAA,IAAI,gBAAA,GAAmB,CAAC,aAAA,CAAc,MAAA;EACtC,MAAA,KAAA,IAAS,YAAY,SAAA,EAAW;EAC9B,QAAA,aAAA,CAAc,IAAA,CAAK,QAAA,EAAU,KAAA,CAAM,KAAA,EAAO,UAAU,UAAU,CAAA;EAAA,MAChE;EAEA,MAAA,IAAI,gBAAA,EAAkB;EACpB,QAAA,KACE,UAAU,CAAA,EACV,OAAA,GAAU,aAAA,CAAc,MAAA,EACxB,WAAW,wBAAA,EACX;EACA,UAAA,aAAA,CAAc,OAAO,CAAA;EAAA,YACnB,aAAA,CAAc,UAAU,CAAC,CAAA;EAAA,YACzB,aAAA,CAAc,UAAU,CAAC,CAAA;EAAA,YACzB,aAAA,CAAc,UAAU,CAAC;EAAA,WAC3B;EAAA,QACF;EACA,QAAA,aAAA,CAAc,MAAA,GAAS,CAAA;EAAA,MACzB;EAAA,IACF,CAAA;EAAA;EAAA;EAAA,IAGA,GAAA,GAAM;EAAA,IAAC,CAAA;EAAA,IACP,IAAI,QAAA,EAAU;EACZ,MAAA,IAAI,WAAW,KAAA,CAAM,KAAA;EACrB,MAAA,IAAI,aAAa,QAAA,EAAU;EACzB,QAAA,KAAA,CAAM,KAAA,GAAQ,QAAA;EACd,QAAA,KAAA,CAAM,OAAO,QAAQ,CAAA;EAAA,MACvB;EAAA,IACF,CAAA;EAAA,IACA,UAAU,QAAA,EAAU;EAClB,MAAA,IAAI,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;EAClC,MAAA,QAAA,CAAS,MAAM,KAAK,CAAA;EACpB,MAAA,OAAO,MAAA;EAAA,IACT,CAAA;EAAA,IACA,KAAA,EAAO;EAAA,GACT;EAEA,EAA2C;EACzC,IAAA,KAAA,CAAM,KAAK,IAAI,MAAM;EACnB,MAAA,SAAA,GAAY,EAAC;EACb,MAAA,KAAA,CAAM,EAAA,GAAK,CAAA;EACX,MAAA,KAAA,CAAM,GAAA,EAAI;EAAA,IACZ,CAAA;EAAA,EACF;EAEA,EAAA,OAAO,KAAA;EACT,CAAA;;;ECnFA,IAAM,KAAA,GAAQ,CAAA;EACd,IAAM,OAAA,GAAU,CAAA;EAChB,IAAM,eAAA,GAAkB,EAAA;EAEjB,IAAI,EAAA,GAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,UAAU,WAAA,KAAgB;EAC3D,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,EAAC;EAClC,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,QAAA,GAAW,eAAe,CAAA,EAAG;EAC9C,IAAA,MAAA,CAAO,MAAA,CAAO,QAAA,GAAW,eAAe,CAAA,GAAI,YAAY,CAAA,UAAA,KAAc;EAEpE,MAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,CAAE,WAAA,CAAY,CAAC,OAAO,CAAA,MAAO,CAAA,CAAE,KAAK,CAAA,EAAG,KAAA,CAAA,EAAQ;EAAA,QACnE,QAAQ,EAAC;EAAA,QACT,GAAG;EAAA,OACJ,CAAA;EAAA,IACH,CAAC,CAAA;EAAA,EACH;EACA,EAAA,MAAA,CAAO,OAAO,QAAQ,CAAA,GAAI,OAAO,MAAA,CAAO,QAAQ,KAAK,EAAC;EACtD,EAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;EACrC,EAAA,OAAO,MAAM;EACX,IAAA,IAAI,gBAAA,GAAmB,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;EAC7C,IAAA,IAAI,KAAA,GAAQ,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAA;EAC7C,IAAA,gBAAA,CAAiB,MAAA,CAAO,OAAO,CAAC,CAAA;EAChC,IAAA,IAAI,CAAC,iBAAiB,MAAA,EAAQ;EAC5B,MAAA,OAAO,MAAA,CAAO,OAAO,QAAQ,CAAA;EAC7B,MAAA,MAAA,CAAO,MAAA,CAAO,QAAA,GAAW,eAAe,CAAA,EAAE;EAC1C,MAAA,OAAO,MAAA,CAAO,MAAA,CAAO,QAAA,GAAW,eAAe,CAAA;EAAA,IACjD;EAAA,EACF,CAAA;EACF,CAAA;EAiFO,IAAI,mBAAA,GAAsB,GAAA;EAE1B,IAAI,OAAA,GAAU,CAAC,MAAA,EAAQ,UAAA,KAAe;EAC3C,EAAA,IAAI,WAAW,CAAA,OAAA,KAAW;EACxB,IAAA,IAAI,OAAA,GAAU,WAAW,OAAO,CAAA;EAChC,IAAA,IAAI,SAAS,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,OAAO,CAAA;EAAA,EAClD,CAAA;EACA,EAAA,OAAO,EAAA,CAAG,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,CAAA,YAAA,KAAgB;EACjD,IAAA,IAAI,eAAe,MAAA,CAAO,MAAA;EAC1B,IAAA,MAAA,CAAO,MAAA,GAAS,IAAI,IAAA,KAAS;EAC3B,MAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,OAAO,MAAA,EAAQ;EAChC,QAAA,MAAA,CAAO,MAAA,GAAS,IAAA;EAChB,QAAA,YAAA,EAAa;EAAA,MACf;EACA,MAAA,OAAO,YAAA,CAAa,GAAG,IAAI,CAAA;EAAA,IAC7B,CAAA;EAEA,IAAA,IAAI,YAAY,MAAA,CAAO,GAAA;EACvB,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,GAAI,EAAC;EAC1B,IAAA,MAAA,CAAO,MAAM,MAAM;EACjB,MAAA,SAAA,EAAU;EACV,MAAA,UAAA,CAAW,MAAM;EACf,QAAA,IAAI,MAAA,CAAO,MAAA,IAAU,CAAC,MAAA,CAAO,EAAA,EAAI;EAC/B,UAAA,MAAA,CAAO,MAAA,GAAS,KAAA;EAChB,UAAA,KAAA,IAAS,OAAA,IAAW,MAAA,CAAO,MAAA,CAAO,OAAO,GAAG,OAAA,EAAQ;EACpD,UAAA,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,GAAI,EAAC;EAAA,QAC5B;EAAA,MACF,GAAG,mBAAmB,CAAA;EAAA,IACxB,CAAA;EAEA,IAA2C;EACzC,MAAA,IAAI,WAAA,GAAc,OAAO,KAAK,CAAA;EAC9B,MAAA,MAAA,CAAO,KAAK,IAAI,MAAM;EACpB,QAAA,KAAA,IAAS,OAAA,IAAW,MAAA,CAAO,MAAA,CAAO,OAAO,GAAG,OAAA,EAAQ;EACpD,QAAA,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,GAAI,EAAC;EAC1B,QAAA,MAAA,CAAO,MAAA,GAAS,KAAA;EAChB,QAAA,WAAA,EAAY;EAAA,MACd,CAAA;EAAA,IACF;EAEA,IAAA,OAAO,MAAM;EACX,MAAA,MAAA,CAAO,MAAA,GAAS,YAAA;EAChB,MAAA,MAAA,CAAO,GAAA,GAAM,SAAA;EAAA,IACf,CAAA;EAAA,EACF,CAAC,CAAA;EACH,CAAA;;;EC5JA,IAAI,aAAA,GAAgB,CAAC,MAAA,EAAQ,EAAA,EAAIA,QAAAA,KAAY;EAC3C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,MAAA,GAAS,CAAC,MAAM,CAAA;EAE5C,EAAA,IAAI,YAAA;EACJ,EAAA,IAAI,YAAA;EACJ,EAAA,IAAI,MAAM,MAAM;EACd,IAAA,IAAI,iBAAiB,KAAA,EAAO;EAC5B,IAAA,YAAA,GAAe,KAAA;EACf,IAAA,IAAI,OAAO,MAAA,CAAO,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,KAAK,CAAA;EAC5C,IAAA,IAAI,CAAC,YAAA,IAAgB,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,KAAQ,YAAA,CAAa,CAAC,CAAC,CAAA,EAAG;EACnE,MAAA,YAAA,GAAe,IAAA;EACf,MAAA,IAAI,KAAA,GAAQ,EAAA,CAAG,GAAG,IAAI,CAAA;EACtB,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,CAAA,EAAG;EAClC,QAAA,KAAA,CAAM,KAAK,CAAA,UAAA,KAAc;EACvB,UAAA,IAAI,iBAAiB,IAAA,EAAM;EAEzB,YAAA,SAAA,CAAU,IAAI,UAAU,CAAA;EAAA,UAC1B;EAAA,QACF,CAAC,CAAA;EAAA,MACH,CAAA,MAAO;EACL,QAAA,SAAA,CAAU,IAAI,KAAK,CAAA;EACnB,QAAA,YAAA,GAAe,KAAA;EAAA,MACjB;EAAA,IACF;EAAA,EACF,CAAA;EACA,EAAA,IAAI,SAAA,GAAY,KAAK,MAAS,CAAA;EAC9B,EAAA,IAAI,MAAM,SAAA,CAAU,GAAA;EACpB,EAAA,SAAA,CAAU,MAAM,MAAM;EACpB,IAAA,GAAA,EAAI;EACJ,IAAA,OAAO,GAAA,EAAI;EAAA,EACb,CAAA;EAGA,EAAA,IAAI,GAAA,GAKA,GAAA;EAEJ,EAAA,OAAA,CAAQ,WAAW,MAAM;EACvB,IAAA,IAAI,UAAU,MAAA,CAAO,GAAA,CAAI,YAAU,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;EACrD,IAAA,GAAA,EAAI;EACJ,IAAA,OAAO,MAAM;EACX,MAAA,KAAA,IAAS,MAAA,IAAU,SAAS,MAAA,EAAO;EAAA,IACrC,CAAA;EAAA,EACF,CAAC,CAAA;EAED,EAAA,OAAO,SAAA;EACT,CAAA;EAEO,IAAI,WAAW,CAAC,MAAA,EAAQ,EAAA,KAAO,aAAA,CAAc,QAAQ,EAAE,CAAA;;;ECpD9D,IAAI,WAAW,CAAA,CAAA,KAAK,CAAA;EACpB,IAAI,gBAAgB,EAAC;EACrB,IAAI,YAAA,GAAe,EAAE,gBAAA,GAAmB;EAAC,CAAA,EAAG,mBAAA,GAAsB;EAAC,CAAA,EAAE;EAErE,SAAS,WAAA,GAAc;EACrB,EAAA,IAAI;EACF,IAAA,OAAO,OAAO,YAAA,KAAiB,WAAA;EAAA,EAEjC,CAAA,CAAA,MAAQ;EAEN,IAAA,OAAO,KAAA;EAAA,EACT;EACF;EACA,IAAI,aAAY,EAAG;EACjB,EAAA,aAAA,GAAgB,YAAA;EAClB;EAEO,IAAI,sBAAA,GAAyB;EAAA,EAClC,gBAAA,CAAiB,GAAA,EAAK,QAAA,EAAU,OAAA,EAAS;EACvC,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,QAAQ,CAAA;EAC3C,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,OAAO,CAAA;EAAA,EAC7C,CAAA;EAAA,EACA,mBAAA,CAAoB,GAAA,EAAK,QAAA,EAAU,OAAA,EAAS;EAC1C,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,QAAQ,CAAA;EAC9C,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,OAAO,CAAA;EAAA,EAChD;EACF,CAAA;EAEA,IAAI,OAAO,WAAW,WAAA,EAAa;EACjC,EAAA,YAAA,GAAe,sBAAA;EACjB;EAOO,SAAS,eAAe,IAAA,EAAM,OAAA,GAAU,MAAA,EAAW,IAAA,GAAO,EAAC,EAAG;EACnE,EAAA,IAAI,MAAA,GAAS,KAAK,MAAA,IAAU,QAAA;EAC5B,EAAA,IAAI,MAAA,GAAS,KAAK,MAAA,IAAU,QAAA;EAE5B,EAAA,IAAI,KAAA,GAAQ,KAAK,OAAO,CAAA;EAExB,EAAA,IAAI,MAAM,KAAA,CAAM,GAAA;EAChB,EAAA,KAAA,CAAM,MAAM,CAAA,QAAA,KAAY;EACtB,IAAA,IAAI,SAAA,GAAY,OAAO,QAAQ,CAAA;EAC/B,IAAA,IAAI,OAAO,cAAc,WAAA,EAAa;EACpC,MAAA,OAAO,cAAc,IAAI,CAAA;EAAA,IAC3B,CAAA,MAAO;EACL,MAAA,aAAA,CAAc,IAAI,CAAA,GAAI,SAAA;EAAA,IACxB;EACA,IAAA,GAAA,CAAI,QAAQ,CAAA;EAAA,EACd,CAAA;EAEA,EAAA,SAAS,SAAS,CAAA,EAAG;EACnB,IAAA,IAAI,CAAA,CAAE,QAAQ,IAAA,EAAM;EAClB,MAAA,IAAI,CAAA,CAAE,aAAa,IAAA,EAAM;EACvB,QAAA,GAAA,CAAI,OAAO,CAAA;EAAA,MACb,CAAA,MAAO;EACL,QAAA,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;EAAA,MACxB;EAAA,IACF,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG;EAC/B,MAAA,GAAA,CAAI,OAAO,CAAA;EAAA,IACb;EAAA,EACF;EAEA,EAAA,SAAS,OAAA,GAAU;EACjB,IAAA,KAAA,CAAM,GAAA,CAAI,cAAc,IAAI,CAAA,GAAI,OAAO,aAAA,CAAc,IAAI,CAAC,CAAA,GAAI,OAAO,CAAA;EAAA,EACvE;EAEA,EAAA,OAAA,CAAQ,OAAO,MAAM;EACnB,IAAA,OAAA,EAAQ;EACR,IAAA,IAAI,IAAA,CAAK,WAAW,KAAA,EAAO;EACzB,MAAA,YAAA,CAAa,gBAAA,CAAiB,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;EACrD,MAAA,OAAO,MAAM;EACX,QAAA,YAAA,CAAa,mBAAA,CAAoB,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;EAAA,MAC1D,CAAA;EAAA,IACF;EAAA,EACF,CAAC,CAAA;EAED,EAAA,OAAO,KAAA;EACT;;;AChFO,MAAM,UAAN,MAAiB;EAAA,EAGpB,WAAA,CACa,KACA,OAAA,EACX;EAFW,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;EACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;EAJb,IAAA,aAAA,CAAA,IAAA,EAAiB,MAAA,CAAA;EAMb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA,CAAkB,GAAA,EAAK,OAAA,EAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,CAAA;EAAA,EAC9F;EAAA,EAEA,GAAA,GAAM;EACF,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,EAAI;EAAA,EACzB;EAAA,EAEA,IAAI,KAAA,EAAU;EACV,IAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAK,CAAA;EAAA,EACvB;EAAA,EAEA,IAAI,KAAA,GAAQ;EACR,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,CAAA,KAAA,KAAS,KAAK,CAAA;EAAA,EAC7C;EACJ;;;ECtBO,SAAS,aAAA,CAAiB,EAAE,OAAA,EAAS,GAAA,EAAI,EAAgC;EAC5E,EAAA,OAAO,IAAI,OAAA,CAAQ,GAAA,EAAK,OAAO,CAAA;EACnC;;;ECCO,SAAS,oBAAA,CAAqB;EAAA,EACjC,OAAA;EAAA,EACA;EACJ,CAAA,GAGI,EAAC,EAAmB;EACpB,EAAA,OAAO,aAAA,CAAkC;EAAA,IACrC,OAAA;EAAA,IACA,KAAK,GAAA,IAAA,IAAA,GAAA,GAAA,GAAO;EAAA,GACf,CAAA;EACL;;;ECVO,SAAS,oBAAA,CAAqB;EAAA,EACjC,OAAA;EAAA,EACA;EACJ,CAAA,GAGI,EAAC,EAAmB;EACpB,EAAA,OAAO,aAAA,CAA+B;EAAA,IAClC,SAAS,OAAA,IAAA,IAAA,GAAA,OAAA,GAAW,eAAA;EAAA,IACpB,KAAK,GAAA,IAAA,IAAA,GAAA,GAAA,GAAO;EAAA,GACf,CAAA;EACL;;;ACbO,MAAM,iBAAA,GAAwC,CAAC,QAAA,EAAU,SAAA,EAAW,KAAK;EAazE,SAAS,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAM,UAAS,EAAwB;EAC7E,EAAA,IAAI,EAAE,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI;EACvF,IAAA,MAAM,IAAI,MAAM,4EAA4E,CAAA;EAAA,EAChG;EACA,EAAA,IAAI,CAAC,iBAAA,CAAkB,QAAA,CAAS,QAAQ,CAAA,EAAG;EACvC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,kBAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;EAAA,EACvF;EACA,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,kBAAA,CAAmB,QAAQ,CAAC,CAAA;EAChD,EAAA,GAAA,CAAI,QAAA,GAAW,IAAA;EACf,EAAA,MAAM,MAAA,GAAS,kBAAkB,OAAO,CAAA;EACxC,EAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;EACvB,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;EAAA,EAClD;EACA,EAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAQ;EACzB,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,MAAA,CAAO,SAAS,CAAA;EAAA,EACtD;EACA,EAAA,OAAO,IAAI,QAAA,EAAS;EACxB;EAEA,SAAS,mBAAmB,QAAA,EAA4B;EACpD,EAAA,QAAQ,QAAA;EAAU,IACd,KAAK,KAAA;EACD,MAAA,OAAO,uBAAA;EAAA,IACX,KAAK,SAAA;EACD,MAAA,OAAO,oBAAA;EAAA,IACX;EACI,MAAA,OAAO,6BAAA;EAAA;EAEnB;EAEA,SAAS,kBAAkB,KAAA,EAGzB;EACE,EAAA,QAAQ,MAAM,EAAA;EAAI,IACd,KAAK,eAAA;EACD,MAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,EAAA,EAAG;EAAA,IAC9C,KAAK,iBAAA;EACD,MAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,MAAM,GAAA,EAAI;EAAA,IACrD,KAAK,gBAAA;EACD,MAAA,OAAO,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,EAAA,EAAG;EAAA,IAC/C;EACI,MAAA,OAAO,EAAE,OAAA,EAAS,EAAA,EAAI,SAAA,EAAW,EAAA,EAAG;EAAA;EAEhD;;;EC7DO,SAAS,eAAe,IAAA,EAAe;EAC1C,EAAA,IAAI,CAAC,IAAA,EAAM;EACP,IAAA;EAAA,EACJ;EACA,EAAA,IACI,OAAO,UAAA,KAAe,WAAA,IACtB,CAAC,WAAW,SAAA,IACZ,CAAC,UAAA,CAAW,SAAA,CAAU,SAAA,IACtB,CAAC,UAAA,CAAW,SAAA,CAAU,UAAU,SAAA,EAClC;EACE,IAAA;EAAA,EACJ;EACA,EAAA,KAAK,UAAA,CAAW,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;EACtD","file":"index.development.js","sourcesContent":["export type MainnetUrl = string & { '~cluster': 'mainnet' };\nexport type DevnetUrl = string & { '~cluster': 'devnet' };\nexport type TestnetUrl = string & { '~cluster': 'testnet' };\nexport type ClusterUrl = DevnetUrl | MainnetUrl | TestnetUrl | string;\n\n/** Given a URL casts it to a type that is only accepted where mainnet URLs are expected. */\nexport function mainnet(putativeString: string): MainnetUrl {\n return putativeString as MainnetUrl;\n}\n/** Given a URL casts it to a type that is only accepted where devnet URLs are expected. */\nexport function devnet(putativeString: string): DevnetUrl {\n return putativeString as DevnetUrl;\n}\n/** Given a URL casts it to a type that is only accepted where testnet URLs are expected. */\nexport function testnet(putativeString: string): TestnetUrl {\n return putativeString as TestnetUrl;\n}\n","import type {\n DevnetUrl as SolanaDevnetUrl,\n MainnetUrl as SolanaMainnetUrl,\n TestnetUrl as SolanaTestnetUrl,\n} from '@solana/kit';\n\nimport { SolanaClusterId } from './solana-cluster-id';\n\nexport type { SolanaDevnetUrl, SolanaMainnetUrl, SolanaTestnetUrl };\n\nexport type SolanaLocalnetUrl = string & { '~cluster': 'localnet' };\n\nexport function localnet(url: string) {\n return url as SolanaLocalnetUrl;\n}\n\nexport interface SolanaCluster {\n id: SolanaClusterId;\n label: string;\n url: SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl | string;\n urlWs?: string;\n}\n","import { devnet, mainnet, testnet } from '@solana/kit';\n\nimport {\n localnet,\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = string | (Partial<Pick<SolanaCluster, 'label' | 'url' | 'urlWs'>> & { url: string });\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url: defaultUrl, urlWs: defaultUrlWs }: Pick<SolanaCluster, 'id' | 'label' | 'url' | 'urlWs'>,\n): SolanaCluster {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return {\n id,\n label: props.label ?? label,\n url: props.url ?? defaultUrl,\n urlWs: props.urlWs ?? defaultUrlWs,\n };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = 'https://api.devnet.solana.com'): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: devnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = 'http://localhost:8899'): SolanaCluster {\n const url = typeof props === 'string' ? props : props.url;\n const urlWs = typeof props !== 'string' ? (props.urlWs ?? getLocalUrlWs(url)) : undefined;\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: localnet(url),\n urlWs,\n });\n}\n\nfunction getLocalUrlWs(url: string) {\n return url.endsWith(':8899') ? url.replace(':8899', ':8900').replace('http', 'ws') : undefined;\n}\nexport function createSolanaMainnet(props: CreateSolanaProps): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: mainnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = 'https://api.testnet.solana.com'): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: testnet(typeof props === 'string' ? props : props.url),\n });\n}\n","import { cleanTasks } from '../task/index.js'\n\nexport let clean = Symbol('clean')\n\nexport let cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\nexport let atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n","import { clean } from '../clean-stores/index.js'\n\nconst START = 0\nconst STOP = 1\nconst SET = 2\nconst NOTIFY = 3\nconst MOUNT = 5\nconst UNMOUNT = 6\nconst REVERT_MUTATION = 10\n\nexport let on = (object, listener, eventKey, mutateStore) => {\n object.events = object.events || {}\n if (!object.events[eventKey + REVERT_MUTATION]) {\n object.events[eventKey + REVERT_MUTATION] = mutateStore(eventProps => {\n // eslint-disable-next-line no-sequences\n object.events[eventKey].reduceRight((event, l) => (l(event), event), {\n shared: {},\n ...eventProps\n })\n })\n }\n object.events[eventKey] = object.events[eventKey] || []\n object.events[eventKey].push(listener)\n return () => {\n let currentListeners = object.events[eventKey]\n let index = currentListeners.indexOf(listener)\n currentListeners.splice(index, 1)\n if (!currentListeners.length) {\n delete object.events[eventKey]\n object.events[eventKey + REVERT_MUTATION]()\n delete object.events[eventKey + REVERT_MUTATION]\n }\n }\n}\n\nexport let onStart = ($store, listener) =>\n on($store, listener, START, runListeners => {\n let originListen = $store.listen\n $store.listen = arg => {\n if (!$store.lc && !$store.starting) {\n $store.starting = true\n runListeners()\n delete $store.starting\n }\n return originListen(arg)\n }\n return () => {\n $store.listen = originListen\n }\n })\n\nexport let onStop = ($store, listener) =>\n on($store, listener, STOP, runListeners => {\n let originOff = $store.off\n $store.off = () => {\n runListeners()\n originOff()\n }\n return () => {\n $store.off = originOff\n }\n })\n\nexport let onSet = ($store, listener) =>\n on($store, listener, SET, runListeners => {\n let originSet = $store.set\n let originSetKey = $store.setKey\n if ($store.setKey) {\n $store.setKey = (changed, changedValue) => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({\n abort,\n changed,\n newValue: { ...$store.value, [changed]: changedValue }\n })\n if (!isAborted) return originSetKey(changed, changedValue)\n }\n }\n $store.set = newValue => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({ abort, newValue })\n if (!isAborted) return originSet(newValue)\n }\n return () => {\n $store.set = originSet\n $store.setKey = originSetKey\n }\n })\n\nexport let onNotify = ($store, listener) =>\n on($store, listener, NOTIFY, runListeners => {\n let originNotify = $store.notify\n $store.notify = (oldValue, changed) => {\n let isAborted\n let abort = () => {\n isAborted = true\n }\n\n runListeners({ abort, changed, oldValue })\n if (!isAborted) return originNotify(oldValue, changed)\n }\n return () => {\n $store.notify = originNotify\n }\n })\n\nexport let STORE_UNMOUNT_DELAY = 1000\n\nexport let onMount = ($store, initialize) => {\n let listener = payload => {\n let destroy = initialize(payload)\n if (destroy) $store.events[UNMOUNT].push(destroy)\n }\n return on($store, listener, MOUNT, runListeners => {\n let originListen = $store.listen\n $store.listen = (...args) => {\n if (!$store.lc && !$store.active) {\n $store.active = true\n runListeners()\n }\n return originListen(...args)\n }\n\n let originOff = $store.off\n $store.events[UNMOUNT] = []\n $store.off = () => {\n originOff()\n setTimeout(() => {\n if ($store.active && !$store.lc) {\n $store.active = false\n for (let destroy of $store.events[UNMOUNT]) destroy()\n $store.events[UNMOUNT] = []\n }\n }, STORE_UNMOUNT_DELAY)\n }\n\n if (process.env.NODE_ENV !== 'production') {\n let originClean = $store[clean]\n $store[clean] = () => {\n for (let destroy of $store.events[UNMOUNT]) destroy()\n $store.events[UNMOUNT] = []\n $store.active = false\n originClean()\n }\n }\n\n return () => {\n $store.listen = originListen\n $store.off = originOff\n }\n })\n}\n","import { atom, epoch } from '../atom/index.js'\nimport { onMount } from '../lifecycle/index.js'\n\nlet computedStore = (stores, cb, batched) => {\n if (!Array.isArray(stores)) stores = [stores]\n\n let previousArgs\n let currentEpoch\n let set = () => {\n if (currentEpoch === epoch) return\n currentEpoch = epoch\n let args = stores.map($store => $store.get())\n if (!previousArgs || args.some((arg, i) => arg !== previousArgs[i])) {\n previousArgs = args\n let value = cb(...args)\n if (value && value.then && value.t) {\n value.then(asyncValue => {\n if (previousArgs === args) {\n // Prevent a stale set\n $computed.set(asyncValue)\n }\n })\n } else {\n $computed.set(value)\n currentEpoch = epoch\n }\n }\n }\n let $computed = atom(undefined)\n let get = $computed.get\n $computed.get = () => {\n set()\n return get()\n }\n\n let timer\n let run = batched\n ? () => {\n clearTimeout(timer)\n timer = setTimeout(set)\n }\n : set\n\n onMount($computed, () => {\n let unbinds = stores.map($store => $store.listen(run))\n set()\n return () => {\n for (let unbind of unbinds) unbind()\n }\n })\n\n return $computed\n}\n\nexport let computed = (stores, fn) => computedStore(stores, fn)\nexport let batched = (stores, fn) => computedStore(stores, fn, true)\n","import { atom, map, onMount } from 'nanostores'\n\nlet identity = a => a\nlet storageEngine = {}\nlet eventsEngine = { addEventListener() {}, removeEventListener() {} }\n\nfunction testSupport() {\n try {\n return typeof localStorage !== 'undefined'\n /* c8 ignore next 4 */\n } catch {\n // In Privacy Mode access to localStorage will return error\n return false\n }\n}\nif (testSupport()) {\n storageEngine = localStorage\n}\n\nexport let windowPersistentEvents = {\n addEventListener(key, listener, restore) {\n window.addEventListener('storage', listener)\n window.addEventListener('pageshow', restore)\n },\n removeEventListener(key, listener, restore) {\n window.removeEventListener('storage', listener)\n window.removeEventListener('pageshow', restore)\n }\n}\n\nif (typeof window !== 'undefined') {\n eventsEngine = windowPersistentEvents\n}\n\nexport function setPersistentEngine(storage, events) {\n storageEngine = storage\n eventsEngine = events\n}\n\nexport function persistentAtom(name, initial = undefined, opts = {}) {\n let encode = opts.encode || identity\n let decode = opts.decode || identity\n\n let store = atom(initial)\n\n let set = store.set\n store.set = newValue => {\n let converted = encode(newValue)\n if (typeof converted === 'undefined') {\n delete storageEngine[name]\n } else {\n storageEngine[name] = converted\n }\n set(newValue)\n }\n\n function listener(e) {\n if (e.key === name) {\n if (e.newValue === null) {\n set(initial)\n } else {\n set(decode(e.newValue))\n }\n } else if (!storageEngine[name]) {\n set(initial)\n }\n }\n\n function restore() {\n store.set(storageEngine[name] ? decode(storageEngine[name]) : initial)\n }\n\n onMount(store, () => {\n restore()\n if (opts.listen !== false) {\n eventsEngine.addEventListener(name, listener, restore)\n return () => {\n eventsEngine.removeEventListener(name, listener, restore)\n }\n }\n })\n\n return store\n}\n\nexport function persistentMap(prefix, initial = {}, opts = {}) {\n let encode = opts.encode || identity\n let decode = opts.decode || identity\n\n let store = map()\n\n let setKey = store.setKey\n let storeKey = (key, newValue) => {\n if (typeof newValue === 'undefined') {\n if (opts.listen !== false && eventsEngine.perKey) {\n eventsEngine.removeEventListener(prefix + key, listener, restore)\n }\n delete storageEngine[prefix + key]\n } else {\n if (\n opts.listen !== false &&\n eventsEngine.perKey &&\n !(key in store.value)\n ) {\n eventsEngine.addEventListener(prefix + key, listener, restore)\n }\n storageEngine[prefix + key] = encode(newValue)\n }\n }\n\n store.setKey = (key, newValue) => {\n storeKey(key, newValue)\n setKey(key, newValue)\n }\n\n let set = store.set\n store.set = function (newObject) {\n for (let key in newObject) {\n storeKey(key, newObject[key])\n }\n for (let key in store.value) {\n if (!(key in newObject)) {\n storeKey(key, undefined)\n }\n }\n set(newObject)\n }\n\n function listener(e) {\n if (!e.key) {\n set({})\n } else if (e.key.startsWith(prefix)) {\n if (e.newValue === null) {\n setKey(e.key.slice(prefix.length), undefined)\n } else {\n setKey(e.key.slice(prefix.length), decode(e.newValue))\n }\n }\n }\n\n function restore() {\n let data = { ...initial }\n for (let key in storageEngine) {\n if (key.startsWith(prefix)) {\n data[key.slice(prefix.length)] = decode(storageEngine[key])\n }\n }\n for (let key in data) {\n store.setKey(key, data[key])\n }\n }\n\n onMount(store, () => {\n restore()\n if (opts.listen !== false) {\n eventsEngine.addEventListener(prefix, listener, restore)\n return () => {\n eventsEngine.removeEventListener(prefix, listener, restore)\n for (let key in store.value) {\n eventsEngine.removeEventListener(prefix + key, listener, restore)\n }\n }\n }\n })\n\n return store\n}\n\nlet testStorage = {}\nlet testListeners = []\n\nexport function useTestStorageEngine() {\n setPersistentEngine(testStorage, {\n addEventListener(key, cb) {\n testListeners.push(cb)\n },\n removeEventListener(key, cb) {\n testListeners = testListeners.filter(i => i !== cb)\n }\n })\n}\n\nexport function setTestStorageKey(key, newValue) {\n if (typeof newValue === 'undefined') {\n delete testStorage[key]\n } else {\n testStorage[key] = newValue\n }\n let event = { key, newValue }\n for (let listener of testListeners) {\n listener(event)\n }\n}\n\nexport function getTestStorage() {\n return testStorage\n}\n\nexport function cleanTestStorage() {\n for (let i in testStorage) {\n setTestStorageKey(i, undefined)\n }\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
package/dist/index.native.mjs
CHANGED
|
@@ -1,39 +1,58 @@
|
|
|
1
|
+
import { devnet, mainnet, testnet } from '@solana/kit';
|
|
1
2
|
import { persistentAtom } from '@nanostores/persistent';
|
|
2
3
|
import { computed } from 'nanostores';
|
|
3
4
|
|
|
4
5
|
// src/clusters.ts
|
|
5
|
-
|
|
6
|
+
|
|
7
|
+
// src/types/solana-cluster.ts
|
|
8
|
+
function localnet(url) {
|
|
9
|
+
return url;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// src/clusters.ts
|
|
13
|
+
function createSolanaCluster(props, { id, label, url: defaultUrl, urlWs: defaultUrlWs }) {
|
|
6
14
|
if (typeof props === "string") {
|
|
7
15
|
return { id, label, url: props };
|
|
8
16
|
}
|
|
9
|
-
return {
|
|
17
|
+
return {
|
|
18
|
+
id,
|
|
19
|
+
label: props.label ?? label,
|
|
20
|
+
url: props.url ?? defaultUrl,
|
|
21
|
+
urlWs: props.urlWs ?? defaultUrlWs
|
|
22
|
+
};
|
|
10
23
|
}
|
|
11
|
-
function createSolanaDevnet(props =
|
|
24
|
+
function createSolanaDevnet(props = "https://api.devnet.solana.com") {
|
|
12
25
|
return createSolanaCluster(props, {
|
|
13
26
|
id: "solana:devnet",
|
|
14
27
|
label: "Devnet",
|
|
15
|
-
url:
|
|
28
|
+
url: devnet(typeof props === "string" ? props : props.url)
|
|
16
29
|
});
|
|
17
30
|
}
|
|
18
|
-
function createSolanaLocalnet(props =
|
|
31
|
+
function createSolanaLocalnet(props = "http://localhost:8899") {
|
|
32
|
+
const url = typeof props === "string" ? props : props.url;
|
|
33
|
+
const urlWs = typeof props !== "string" ? props.urlWs ?? getLocalUrlWs(url) : void 0;
|
|
19
34
|
return createSolanaCluster(props, {
|
|
20
35
|
id: "solana:localnet",
|
|
21
36
|
label: "Localnet",
|
|
22
|
-
url:
|
|
37
|
+
url: localnet(url),
|
|
38
|
+
urlWs
|
|
23
39
|
});
|
|
24
40
|
}
|
|
25
|
-
function
|
|
41
|
+
function getLocalUrlWs(url) {
|
|
42
|
+
return url.endsWith(":8899") ? url.replace(":8899", ":8900").replace("http", "ws") : void 0;
|
|
43
|
+
}
|
|
44
|
+
function createSolanaMainnet(props) {
|
|
26
45
|
return createSolanaCluster(props, {
|
|
27
46
|
id: "solana:mainnet",
|
|
28
47
|
label: "Mainnet",
|
|
29
|
-
url:
|
|
48
|
+
url: mainnet(typeof props === "string" ? props : props.url)
|
|
30
49
|
});
|
|
31
50
|
}
|
|
32
|
-
function createSolanaTestnet(props =
|
|
51
|
+
function createSolanaTestnet(props = "https://api.testnet.solana.com") {
|
|
33
52
|
return createSolanaCluster(props, {
|
|
34
53
|
id: "solana:testnet",
|
|
35
54
|
label: "Testnet",
|
|
36
|
-
url:
|
|
55
|
+
url: testnet(typeof props === "string" ? props : props.url)
|
|
37
56
|
});
|
|
38
57
|
}
|
|
39
58
|
var Storage = class {
|
|
@@ -135,6 +154,6 @@ function handleCopyText(text) {
|
|
|
135
154
|
void globalThis.navigator.clipboard.writeText(text);
|
|
136
155
|
}
|
|
137
156
|
|
|
138
|
-
export { Storage, createSolanaDevnet, createSolanaLocalnet, createSolanaMainnet, createSolanaTestnet, createStorage, createStorageAccount, createStorageCluster, explorerProviders, getExplorerUrl, handleCopyText };
|
|
157
|
+
export { Storage, createSolanaDevnet, createSolanaLocalnet, createSolanaMainnet, createSolanaTestnet, createStorage, createStorageAccount, createStorageCluster, explorerProviders, getExplorerUrl, handleCopyText, localnet };
|
|
139
158
|
//# sourceMappingURL=index.native.mjs.map
|
|
140
159
|
//# sourceMappingURL=index.native.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/clusters.ts","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":[],"mappings":"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","file":"index.native.mjs","sourcesContent":["import type {\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = Partial<Pick<SolanaCluster, 'label' | 'url'>> | string;\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url }: SolanaCluster,\n): Pick<SolanaCluster, 'id' | 'label' | 'url'> {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return { id, label: props.label ?? label, url: props.url ?? url };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: 'devnet' as SolanaDevnetUrl,\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: 'localnet' as SolanaLocalnetUrl,\n });\n}\n\nexport function createSolanaMainnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: 'mainnet' as SolanaMainnetUrl,\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: 'testnet' as SolanaTestnetUrl,\n });\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/solana-cluster.ts","../src/clusters.ts","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":[],"mappings":"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","file":"index.native.mjs","sourcesContent":["import type {\n DevnetUrl as SolanaDevnetUrl,\n MainnetUrl as SolanaMainnetUrl,\n TestnetUrl as SolanaTestnetUrl,\n} from '@solana/kit';\n\nimport { SolanaClusterId } from './solana-cluster-id';\n\nexport type { SolanaDevnetUrl, SolanaMainnetUrl, SolanaTestnetUrl };\n\nexport type SolanaLocalnetUrl = string & { '~cluster': 'localnet' };\n\nexport function localnet(url: string) {\n return url as SolanaLocalnetUrl;\n}\n\nexport interface SolanaCluster {\n id: SolanaClusterId;\n label: string;\n url: SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl | string;\n urlWs?: string;\n}\n","import { devnet, mainnet, testnet } from '@solana/kit';\n\nimport {\n localnet,\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = string | (Partial<Pick<SolanaCluster, 'label' | 'url' | 'urlWs'>> & { url: string });\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url: defaultUrl, urlWs: defaultUrlWs }: Pick<SolanaCluster, 'id' | 'label' | 'url' | 'urlWs'>,\n): SolanaCluster {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return {\n id,\n label: props.label ?? label,\n url: props.url ?? defaultUrl,\n urlWs: props.urlWs ?? defaultUrlWs,\n };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = 'https://api.devnet.solana.com'): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: devnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = 'http://localhost:8899'): SolanaCluster {\n const url = typeof props === 'string' ? props : props.url;\n const urlWs = typeof props !== 'string' ? (props.urlWs ?? getLocalUrlWs(url)) : undefined;\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: localnet(url),\n urlWs,\n });\n}\n\nfunction getLocalUrlWs(url: string) {\n return url.endsWith(':8899') ? url.replace(':8899', ':8900').replace('http', 'ws') : undefined;\n}\nexport function createSolanaMainnet(props: CreateSolanaProps): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: mainnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = 'https://api.testnet.solana.com'): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: testnet(typeof props === 'string' ? props : props.url),\n });\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
package/dist/index.node.cjs
CHANGED
|
@@ -1,41 +1,60 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var kit = require('@solana/kit');
|
|
3
4
|
var persistent = require('@nanostores/persistent');
|
|
4
5
|
var nanostores = require('nanostores');
|
|
5
6
|
|
|
6
7
|
// src/clusters.ts
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
// src/types/solana-cluster.ts
|
|
10
|
+
function localnet(url) {
|
|
11
|
+
return url;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// src/clusters.ts
|
|
15
|
+
function createSolanaCluster(props, { id, label, url: defaultUrl, urlWs: defaultUrlWs }) {
|
|
8
16
|
if (typeof props === "string") {
|
|
9
17
|
return { id, label, url: props };
|
|
10
18
|
}
|
|
11
|
-
return {
|
|
19
|
+
return {
|
|
20
|
+
id,
|
|
21
|
+
label: props.label ?? label,
|
|
22
|
+
url: props.url ?? defaultUrl,
|
|
23
|
+
urlWs: props.urlWs ?? defaultUrlWs
|
|
24
|
+
};
|
|
12
25
|
}
|
|
13
|
-
function createSolanaDevnet(props =
|
|
26
|
+
function createSolanaDevnet(props = "https://api.devnet.solana.com") {
|
|
14
27
|
return createSolanaCluster(props, {
|
|
15
28
|
id: "solana:devnet",
|
|
16
29
|
label: "Devnet",
|
|
17
|
-
url:
|
|
30
|
+
url: kit.devnet(typeof props === "string" ? props : props.url)
|
|
18
31
|
});
|
|
19
32
|
}
|
|
20
|
-
function createSolanaLocalnet(props =
|
|
33
|
+
function createSolanaLocalnet(props = "http://localhost:8899") {
|
|
34
|
+
const url = typeof props === "string" ? props : props.url;
|
|
35
|
+
const urlWs = typeof props !== "string" ? props.urlWs ?? getLocalUrlWs(url) : void 0;
|
|
21
36
|
return createSolanaCluster(props, {
|
|
22
37
|
id: "solana:localnet",
|
|
23
38
|
label: "Localnet",
|
|
24
|
-
url:
|
|
39
|
+
url: localnet(url),
|
|
40
|
+
urlWs
|
|
25
41
|
});
|
|
26
42
|
}
|
|
27
|
-
function
|
|
43
|
+
function getLocalUrlWs(url) {
|
|
44
|
+
return url.endsWith(":8899") ? url.replace(":8899", ":8900").replace("http", "ws") : void 0;
|
|
45
|
+
}
|
|
46
|
+
function createSolanaMainnet(props) {
|
|
28
47
|
return createSolanaCluster(props, {
|
|
29
48
|
id: "solana:mainnet",
|
|
30
49
|
label: "Mainnet",
|
|
31
|
-
url:
|
|
50
|
+
url: kit.mainnet(typeof props === "string" ? props : props.url)
|
|
32
51
|
});
|
|
33
52
|
}
|
|
34
|
-
function createSolanaTestnet(props =
|
|
53
|
+
function createSolanaTestnet(props = "https://api.testnet.solana.com") {
|
|
35
54
|
return createSolanaCluster(props, {
|
|
36
55
|
id: "solana:testnet",
|
|
37
56
|
label: "Testnet",
|
|
38
|
-
url:
|
|
57
|
+
url: kit.testnet(typeof props === "string" ? props : props.url)
|
|
39
58
|
});
|
|
40
59
|
}
|
|
41
60
|
var Storage = class {
|
|
@@ -148,5 +167,6 @@ exports.createStorageCluster = createStorageCluster;
|
|
|
148
167
|
exports.explorerProviders = explorerProviders;
|
|
149
168
|
exports.getExplorerUrl = getExplorerUrl;
|
|
150
169
|
exports.handleCopyText = handleCopyText;
|
|
170
|
+
exports.localnet = localnet;
|
|
151
171
|
//# sourceMappingURL=index.node.cjs.map
|
|
152
172
|
//# sourceMappingURL=index.node.cjs.map
|
package/dist/index.node.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/clusters.ts","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":["persistentAtom","computed"],"mappings":"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","file":"index.node.cjs","sourcesContent":["import type {\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = Partial<Pick<SolanaCluster, 'label' | 'url'>> | string;\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url }: SolanaCluster,\n): Pick<SolanaCluster, 'id' | 'label' | 'url'> {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return { id, label: props.label ?? label, url: props.url ?? url };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: 'devnet' as SolanaDevnetUrl,\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: 'localnet' as SolanaLocalnetUrl,\n });\n}\n\nexport function createSolanaMainnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: 'mainnet' as SolanaMainnetUrl,\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: 'testnet' as SolanaTestnetUrl,\n });\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/solana-cluster.ts","../src/clusters.ts","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":["devnet","mainnet","testnet","persistentAtom","computed"],"mappings":"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","file":"index.node.cjs","sourcesContent":["import type {\n DevnetUrl as SolanaDevnetUrl,\n MainnetUrl as SolanaMainnetUrl,\n TestnetUrl as SolanaTestnetUrl,\n} from '@solana/kit';\n\nimport { SolanaClusterId } from './solana-cluster-id';\n\nexport type { SolanaDevnetUrl, SolanaMainnetUrl, SolanaTestnetUrl };\n\nexport type SolanaLocalnetUrl = string & { '~cluster': 'localnet' };\n\nexport function localnet(url: string) {\n return url as SolanaLocalnetUrl;\n}\n\nexport interface SolanaCluster {\n id: SolanaClusterId;\n label: string;\n url: SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl | string;\n urlWs?: string;\n}\n","import { devnet, mainnet, testnet } from '@solana/kit';\n\nimport {\n localnet,\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = string | (Partial<Pick<SolanaCluster, 'label' | 'url' | 'urlWs'>> & { url: string });\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url: defaultUrl, urlWs: defaultUrlWs }: Pick<SolanaCluster, 'id' | 'label' | 'url' | 'urlWs'>,\n): SolanaCluster {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return {\n id,\n label: props.label ?? label,\n url: props.url ?? defaultUrl,\n urlWs: props.urlWs ?? defaultUrlWs,\n };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = 'https://api.devnet.solana.com'): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: devnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = 'http://localhost:8899'): SolanaCluster {\n const url = typeof props === 'string' ? props : props.url;\n const urlWs = typeof props !== 'string' ? (props.urlWs ?? getLocalUrlWs(url)) : undefined;\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: localnet(url),\n urlWs,\n });\n}\n\nfunction getLocalUrlWs(url: string) {\n return url.endsWith(':8899') ? url.replace(':8899', ':8900').replace('http', 'ws') : undefined;\n}\nexport function createSolanaMainnet(props: CreateSolanaProps): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: mainnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = 'https://api.testnet.solana.com'): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: testnet(typeof props === 'string' ? props : props.url),\n });\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
package/dist/index.node.mjs
CHANGED
|
@@ -1,39 +1,58 @@
|
|
|
1
|
+
import { devnet, mainnet, testnet } from '@solana/kit';
|
|
1
2
|
import { persistentAtom } from '@nanostores/persistent';
|
|
2
3
|
import { computed } from 'nanostores';
|
|
3
4
|
|
|
4
5
|
// src/clusters.ts
|
|
5
|
-
|
|
6
|
+
|
|
7
|
+
// src/types/solana-cluster.ts
|
|
8
|
+
function localnet(url) {
|
|
9
|
+
return url;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// src/clusters.ts
|
|
13
|
+
function createSolanaCluster(props, { id, label, url: defaultUrl, urlWs: defaultUrlWs }) {
|
|
6
14
|
if (typeof props === "string") {
|
|
7
15
|
return { id, label, url: props };
|
|
8
16
|
}
|
|
9
|
-
return {
|
|
17
|
+
return {
|
|
18
|
+
id,
|
|
19
|
+
label: props.label ?? label,
|
|
20
|
+
url: props.url ?? defaultUrl,
|
|
21
|
+
urlWs: props.urlWs ?? defaultUrlWs
|
|
22
|
+
};
|
|
10
23
|
}
|
|
11
|
-
function createSolanaDevnet(props =
|
|
24
|
+
function createSolanaDevnet(props = "https://api.devnet.solana.com") {
|
|
12
25
|
return createSolanaCluster(props, {
|
|
13
26
|
id: "solana:devnet",
|
|
14
27
|
label: "Devnet",
|
|
15
|
-
url:
|
|
28
|
+
url: devnet(typeof props === "string" ? props : props.url)
|
|
16
29
|
});
|
|
17
30
|
}
|
|
18
|
-
function createSolanaLocalnet(props =
|
|
31
|
+
function createSolanaLocalnet(props = "http://localhost:8899") {
|
|
32
|
+
const url = typeof props === "string" ? props : props.url;
|
|
33
|
+
const urlWs = typeof props !== "string" ? props.urlWs ?? getLocalUrlWs(url) : void 0;
|
|
19
34
|
return createSolanaCluster(props, {
|
|
20
35
|
id: "solana:localnet",
|
|
21
36
|
label: "Localnet",
|
|
22
|
-
url:
|
|
37
|
+
url: localnet(url),
|
|
38
|
+
urlWs
|
|
23
39
|
});
|
|
24
40
|
}
|
|
25
|
-
function
|
|
41
|
+
function getLocalUrlWs(url) {
|
|
42
|
+
return url.endsWith(":8899") ? url.replace(":8899", ":8900").replace("http", "ws") : void 0;
|
|
43
|
+
}
|
|
44
|
+
function createSolanaMainnet(props) {
|
|
26
45
|
return createSolanaCluster(props, {
|
|
27
46
|
id: "solana:mainnet",
|
|
28
47
|
label: "Mainnet",
|
|
29
|
-
url:
|
|
48
|
+
url: mainnet(typeof props === "string" ? props : props.url)
|
|
30
49
|
});
|
|
31
50
|
}
|
|
32
|
-
function createSolanaTestnet(props =
|
|
51
|
+
function createSolanaTestnet(props = "https://api.testnet.solana.com") {
|
|
33
52
|
return createSolanaCluster(props, {
|
|
34
53
|
id: "solana:testnet",
|
|
35
54
|
label: "Testnet",
|
|
36
|
-
url:
|
|
55
|
+
url: testnet(typeof props === "string" ? props : props.url)
|
|
37
56
|
});
|
|
38
57
|
}
|
|
39
58
|
var Storage = class {
|
|
@@ -135,6 +154,6 @@ function handleCopyText(text) {
|
|
|
135
154
|
void globalThis.navigator.clipboard.writeText(text);
|
|
136
155
|
}
|
|
137
156
|
|
|
138
|
-
export { Storage, createSolanaDevnet, createSolanaLocalnet, createSolanaMainnet, createSolanaTestnet, createStorage, createStorageAccount, createStorageCluster, explorerProviders, getExplorerUrl, handleCopyText };
|
|
157
|
+
export { Storage, createSolanaDevnet, createSolanaLocalnet, createSolanaMainnet, createSolanaTestnet, createStorage, createStorageAccount, createStorageCluster, explorerProviders, getExplorerUrl, handleCopyText, localnet };
|
|
139
158
|
//# sourceMappingURL=index.node.mjs.map
|
|
140
159
|
//# sourceMappingURL=index.node.mjs.map
|
package/dist/index.node.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/clusters.ts","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":[],"mappings":"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","file":"index.node.mjs","sourcesContent":["import type {\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = Partial<Pick<SolanaCluster, 'label' | 'url'>> | string;\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url }: SolanaCluster,\n): Pick<SolanaCluster, 'id' | 'label' | 'url'> {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return { id, label: props.label ?? label, url: props.url ?? url };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: 'devnet' as SolanaDevnetUrl,\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: 'localnet' as SolanaLocalnetUrl,\n });\n}\n\nexport function createSolanaMainnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: 'mainnet' as SolanaMainnetUrl,\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = {}): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: 'testnet' as SolanaTestnetUrl,\n });\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/solana-cluster.ts","../src/clusters.ts","../src/storage.ts","../src/create-storage.ts","../src/create-storage-account.ts","../src/create-storage-cluster.ts","../src/get-explorer-url.ts","../src/handle-copy-text.ts"],"names":[],"mappings":"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","file":"index.node.mjs","sourcesContent":["import type {\n DevnetUrl as SolanaDevnetUrl,\n MainnetUrl as SolanaMainnetUrl,\n TestnetUrl as SolanaTestnetUrl,\n} from '@solana/kit';\n\nimport { SolanaClusterId } from './solana-cluster-id';\n\nexport type { SolanaDevnetUrl, SolanaMainnetUrl, SolanaTestnetUrl };\n\nexport type SolanaLocalnetUrl = string & { '~cluster': 'localnet' };\n\nexport function localnet(url: string) {\n return url as SolanaLocalnetUrl;\n}\n\nexport interface SolanaCluster {\n id: SolanaClusterId;\n label: string;\n url: SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl | string;\n urlWs?: string;\n}\n","import { devnet, mainnet, testnet } from '@solana/kit';\n\nimport {\n localnet,\n SolanaCluster,\n SolanaDevnetUrl,\n SolanaLocalnetUrl,\n SolanaMainnetUrl,\n SolanaTestnetUrl,\n} from './types/solana-cluster';\n\nexport type CreateSolanaProps = string | (Partial<Pick<SolanaCluster, 'label' | 'url' | 'urlWs'>> & { url: string });\n\nfunction createSolanaCluster<T extends SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl>(\n props: CreateSolanaProps,\n { id, label, url: defaultUrl, urlWs: defaultUrlWs }: Pick<SolanaCluster, 'id' | 'label' | 'url' | 'urlWs'>,\n): SolanaCluster {\n if (typeof props === 'string') {\n return { id, label, url: props as T };\n }\n\n return {\n id,\n label: props.label ?? label,\n url: props.url ?? defaultUrl,\n urlWs: props.urlWs ?? defaultUrlWs,\n };\n}\n\nexport function createSolanaDevnet(props: CreateSolanaProps = 'https://api.devnet.solana.com'): SolanaCluster {\n return createSolanaCluster<SolanaDevnetUrl>(props, {\n id: 'solana:devnet',\n label: 'Devnet',\n url: devnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaLocalnet(props: CreateSolanaProps = 'http://localhost:8899'): SolanaCluster {\n const url = typeof props === 'string' ? props : props.url;\n const urlWs = typeof props !== 'string' ? (props.urlWs ?? getLocalUrlWs(url)) : undefined;\n return createSolanaCluster(props, {\n id: 'solana:localnet',\n label: 'Localnet',\n url: localnet(url),\n urlWs,\n });\n}\n\nfunction getLocalUrlWs(url: string) {\n return url.endsWith(':8899') ? url.replace(':8899', ':8900').replace('http', 'ws') : undefined;\n}\nexport function createSolanaMainnet(props: CreateSolanaProps): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: mainnet(typeof props === 'string' ? props : props.url),\n });\n}\n\nexport function createSolanaTestnet(props: CreateSolanaProps = 'https://api.testnet.solana.com'): SolanaCluster {\n return createSolanaCluster(props, {\n id: 'solana:testnet',\n label: 'Testnet',\n url: testnet(typeof props === 'string' ? props : props.url),\n });\n}\n","import { persistentAtom } from '@nanostores/persistent';\nimport { computed, WritableAtom } from 'nanostores';\n\nexport class Storage<T> {\n private readonly atom: WritableAtom<T>;\n\n constructor(\n readonly key: string,\n readonly initial: T,\n ) {\n this.atom = persistentAtom<T>(key, initial, { decode: JSON.parse, encode: JSON.stringify });\n }\n\n get() {\n return this.atom.get();\n }\n\n set(value: T) {\n this.atom.set(value);\n }\n\n get value() {\n return computed(this.atom, value => value);\n }\n}\n","import { Storage } from './storage';\n\nexport function createStorage<T>({ initial, key }: { initial: T; key: string }) {\n return new Storage(key, initial);\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\n\nexport type StorageAccount = Storage<string | undefined>;\n\nexport function createStorageAccount({\n initial,\n key,\n}: {\n initial?: string | undefined;\n key?: string;\n} = {}): StorageAccount {\n return createStorage<string | undefined>({\n initial,\n key: key ?? 'wallet-ui:account',\n });\n}\n","import { createStorage } from './create-storage';\nimport { Storage } from './storage';\nimport { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type StorageCluster = Storage<SolanaClusterId>;\n\nexport function createStorageCluster({\n initial,\n key,\n}: {\n initial?: SolanaClusterId;\n key?: string;\n} = {}): StorageCluster {\n return createStorage<SolanaClusterId>({\n initial: initial ?? 'solana:devnet',\n key: key ?? 'wallet-ui:cluster',\n });\n}\n","import { SolanaClusterId } from './types/solana-cluster-id';\n\nexport type ExplorerPath = `/address/${string}` | `/block/${string}` | `/tx/${string}`;\nexport type ExplorerProvider = 'orb' | 'solana' | 'solscan';\nexport const explorerProviders: ExplorerProvider[] = ['solana', 'solscan', 'orb'] as const;\n\nexport interface GetNetworkSuffixProps {\n id: SolanaClusterId;\n url: string;\n}\n\nexport interface GetExplorerUrlProps {\n network: GetNetworkSuffixProps;\n path: ExplorerPath;\n provider: ExplorerProvider;\n}\n\nexport function getExplorerUrl({ network, path, provider }: GetExplorerUrlProps) {\n if (!(path.startsWith('/address') || path.startsWith('/block') || path.startsWith('/tx'))) {\n throw new Error('Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.');\n }\n if (!explorerProviders.includes(provider)) {\n throw new Error(`Invalid provider. Must be one of ${explorerProviders.join(', ')}.`);\n }\n const url = new URL(getExplorerBaseUrl(provider));\n url.pathname = path;\n const params = getExplorerSuffix(network);\n if (params.cluster.length) {\n url.searchParams.set('cluster', params.cluster);\n }\n if (params.customUrl.length) {\n url.searchParams.set('customUrl', params.customUrl);\n }\n return url.toString();\n}\n\nfunction getExplorerBaseUrl(provider: ExplorerProvider) {\n switch (provider) {\n case 'orb':\n return 'https://orbmarkets.io';\n case 'solscan':\n return 'https://solscan.io';\n default:\n return 'https://explorer.solana.com';\n }\n}\n\nfunction getExplorerSuffix(props: GetNetworkSuffixProps): {\n cluster: string;\n customUrl: string;\n} {\n switch (props.id) {\n case 'solana:devnet':\n return { cluster: 'devnet', customUrl: '' };\n case 'solana:localnet':\n return { cluster: 'custom', customUrl: props.url };\n case 'solana:testnet':\n return { cluster: 'testnet', customUrl: '' };\n default:\n return { cluster: '', customUrl: '' };\n }\n}\n","export function handleCopyText(text?: string) {\n if (!text) {\n return;\n }\n if (\n typeof globalThis === 'undefined' ||\n !globalThis.navigator ||\n !globalThis.navigator.clipboard ||\n !globalThis.navigator.clipboard.writeText\n ) {\n return;\n }\n void globalThis.navigator.clipboard.writeText(text);\n}\n"]}
|
|
@@ -2,19 +2,20 @@ this.globalThis = this.globalThis || {};
|
|
|
2
2
|
this.globalThis.solanaWeb3 = (function (exports) {
|
|
3
3
|
'use strict';
|
|
4
4
|
|
|
5
|
-
var A=Object.defineProperty;var
|
|
5
|
+
var A=Object.defineProperty;var W=(e,t,r)=>t in e?A(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var P=(e,t,r)=>W(e,t+"",r);function B(e){return e}function x(e,{id:t,label:r,url:o,urlWs:n}){var l,a,f;return typeof e=="string"?{id:t,label:r,url:e}:{id:t,label:(l=e.label)!=null?l:r,url:(a=e.url)!=null?a:o,urlWs:(f=e.urlWs)!=null?f:n}}function q(e="https://api.devnet.solana.com"){return x(e,{id:"solana:devnet",label:"Devnet",url:typeof e=="string"?e:e.url})}function F(e="http://localhost:8899"){var o;let t=typeof e=="string"?e:e.url,r=typeof e!="string"?(o=e.urlWs)!=null?o:O(t):void 0;return x(e,{id:"solana:localnet",label:"Localnet",url:t,urlWs:r})}function O(e){return e.endsWith(":8899")?e.replace(":8899",":8900").replace("http","ws"):void 0}function z(e){return x(e,{id:"solana:mainnet",label:"Mainnet",url:typeof e=="string"?e:e.url})}function H(e="https://api.testnet.solana.com"){return x(e,{id:"solana:testnet",label:"Testnet",url:typeof e=="string"?e:e.url})}var s=[],d=0,y=4,g=0,S=e=>{let t=[],r={get(){return r.lc||r.listen(()=>{})(),r.value},lc:0,listen(o){return r.lc=t.push(o),()=>{for(let l=d+y;l<s.length;)s[l]===o?s.splice(l,y):l+=y;let n=t.indexOf(o);~n&&(t.splice(n,1),--r.lc||r.off());}},notify(o,n){g++;let l=!s.length;for(let a of t)s.push(a,r.value,o,n);if(l){for(d=0;d<s.length;d+=y)s[d](s[d+1],s[d+2],s[d+3]);s.length=0;}},off(){},set(o){let n=r.value;n!==o&&(r.value=o,r.notify(n));},subscribe(o){let n=r.listen(o);return o(r.value),n},value:e};return r};var I=5,h=6,T=10,D=(e,t,r,o)=>(e.events=e.events||{},e.events[r+T]||(e.events[r+T]=o(n=>{e.events[r].reduceRight((l,a)=>(a(l),l),{shared:{},...n});})),e.events[r]=e.events[r]||[],e.events[r].push(t),()=>{let n=e.events[r],l=n.indexOf(t);n.splice(l,1),n.length||(delete e.events[r],e.events[r+T](),delete e.events[r+T]);});var w=1e3,v=(e,t)=>D(e,o=>{let n=t(o);n&&e.events[h].push(n);},I,o=>{let n=e.listen;e.listen=(...a)=>(!e.lc&&!e.active&&(e.active=true,o()),n(...a));let l=e.off;return e.events[h]=[],e.off=()=>{l(),setTimeout(()=>{if(e.active&&!e.lc){e.active=false;for(let a of e.events[h])a();e.events[h]=[];}},w);},()=>{e.listen=n,e.off=l;}});var _=(e,t,r)=>{Array.isArray(e)||(e=[e]);let o,n,l=()=>{if(n===g)return;n=g;let u=e.map(i=>i.get());if(!o||u.some((i,L)=>i!==o[L])){o=u;let i=t(...u);i&&i.then&&i.t?i.then(L=>{o===u&&a.set(L);}):(a.set(i),n=g);}},a=S(void 0),f=a.get;a.get=()=>(l(),f());let c=l;return v(a,()=>{let u=e.map(i=>i.listen(c));return l(),()=>{for(let i of u)i();}}),a},b=(e,t)=>_(e,t);var N=e=>e,m={},C={addEventListener(){},removeEventListener(){}};function R(){try{return typeof localStorage<"u"}catch{return false}}R()&&(m=localStorage);var K={addEventListener(e,t,r){window.addEventListener("storage",t),window.addEventListener("pageshow",r);},removeEventListener(e,t,r){window.removeEventListener("storage",t),window.removeEventListener("pageshow",r);}};typeof window<"u"&&(C=K);function M(e,t=void 0,r={}){let o=r.encode||N,n=r.decode||N,l=S(t),a=l.set;l.set=c=>{let u=o(c);typeof u>"u"?delete m[e]:m[e]=u,a(c);};function f(c){c.key===e?c.newValue===null?a(t):a(n(c.newValue)):m[e]||a(t);}function p(){l.set(m[e]?n(m[e]):t);}return v(l,()=>{if(p(),r.listen!==false)return C.addEventListener(e,f,p),()=>{C.removeEventListener(e,f,p);}}),l}var E=class{constructor(t,r){this.key=t;this.initial=r;P(this,"atom");this.atom=M(t,r,{decode:JSON.parse,encode:JSON.stringify});}get(){return this.atom.get()}set(t){this.atom.set(t);}get value(){return b(this.atom,t=>t)}};function U({initial:e,key:t}){return new E(t,e)}function Ee({initial:e,key:t}={}){return U({initial:e,key:t!=null?t:"wallet-ui:account"})}function be({initial:e,key:t}={}){return U({initial:e!=null?e:"solana:devnet",key:t!=null?t:"wallet-ui:cluster"})}var k=["solana","solscan","orb"];function Pe({network:e,path:t,provider:r}){if(!(t.startsWith("/address")||t.startsWith("/block")||t.startsWith("/tx")))throw new Error("Invalid path. Must be /address/{address}, /block/{id}, or /tx/{signature}.");if(!k.includes(r))throw new Error(`Invalid provider. Must be one of ${k.join(", ")}.`);let o=new URL(G(r));o.pathname=t;let n=Q(e);return n.cluster.length&&o.searchParams.set("cluster",n.cluster),n.customUrl.length&&o.searchParams.set("customUrl",n.customUrl),o.toString()}function G(e){switch(e){case "orb":return "https://orbmarkets.io";case "solscan":return "https://solscan.io";default:return "https://explorer.solana.com"}}function Q(e){switch(e.id){case "solana:devnet":return {cluster:"devnet",customUrl:""};case "solana:localnet":return {cluster:"custom",customUrl:e.url};case "solana:testnet":return {cluster:"testnet",customUrl:""};default:return {cluster:"",customUrl:""}}}function Ne(e){e&&(typeof globalThis>"u"||!globalThis.navigator||!globalThis.navigator.clipboard||!globalThis.navigator.clipboard.writeText||globalThis.navigator.clipboard.writeText(e));}
|
|
6
6
|
|
|
7
|
-
exports.Storage =
|
|
8
|
-
exports.createSolanaDevnet =
|
|
9
|
-
exports.createSolanaLocalnet =
|
|
10
|
-
exports.createSolanaMainnet =
|
|
11
|
-
exports.createSolanaTestnet =
|
|
7
|
+
exports.Storage = E;
|
|
8
|
+
exports.createSolanaDevnet = q;
|
|
9
|
+
exports.createSolanaLocalnet = F;
|
|
10
|
+
exports.createSolanaMainnet = z;
|
|
11
|
+
exports.createSolanaTestnet = H;
|
|
12
12
|
exports.createStorage = U;
|
|
13
13
|
exports.createStorageAccount = Ee;
|
|
14
|
-
exports.createStorageCluster =
|
|
14
|
+
exports.createStorageCluster = be;
|
|
15
15
|
exports.explorerProviders = k;
|
|
16
|
-
exports.getExplorerUrl =
|
|
17
|
-
exports.handleCopyText =
|
|
16
|
+
exports.getExplorerUrl = Pe;
|
|
17
|
+
exports.handleCopyText = Ne;
|
|
18
|
+
exports.localnet = B;
|
|
18
19
|
|
|
19
20
|
return exports;
|
|
20
21
|
|
package/dist/types/clusters.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
export type CreateSolanaProps = Partial<Pick<SolanaCluster, 'label' | 'url'
|
|
1
|
+
import { SolanaCluster } from './types/solana-cluster';
|
|
2
|
+
export type CreateSolanaProps = string | (Partial<Pick<SolanaCluster, 'label' | 'url' | 'urlWs'>> & {
|
|
3
|
+
url: string;
|
|
4
|
+
});
|
|
3
5
|
export declare function createSolanaDevnet(props?: CreateSolanaProps): SolanaCluster;
|
|
4
6
|
export declare function createSolanaLocalnet(props?: CreateSolanaProps): SolanaCluster;
|
|
5
|
-
export declare function createSolanaMainnet(props
|
|
7
|
+
export declare function createSolanaMainnet(props: CreateSolanaProps): SolanaCluster;
|
|
6
8
|
export declare function createSolanaTestnet(props?: CreateSolanaProps): SolanaCluster;
|
|
7
9
|
//# sourceMappingURL=clusters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clusters.d.ts","sourceRoot":"","sources":["../../src/clusters.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"clusters.d.ts","sourceRoot":"","sources":["../../src/clusters.ts"],"names":[],"mappings":"AAEA,OAAO,EAEH,aAAa,EAKhB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAkBrH,wBAAgB,kBAAkB,CAAC,KAAK,GAAE,iBAAmD,GAAG,aAAa,CAM5G;AAED,wBAAgB,oBAAoB,CAAC,KAAK,GAAE,iBAA2C,GAAG,aAAa,CAStG;AAKD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,CAM3E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,GAAE,iBAAoD,GAAG,aAAa,CAM9G"}
|
|
@@ -4,9 +4,11 @@ export type { SolanaDevnetUrl, SolanaMainnetUrl, SolanaTestnetUrl };
|
|
|
4
4
|
export type SolanaLocalnetUrl = string & {
|
|
5
5
|
'~cluster': 'localnet';
|
|
6
6
|
};
|
|
7
|
+
export declare function localnet(url: string): SolanaLocalnetUrl;
|
|
7
8
|
export interface SolanaCluster {
|
|
8
9
|
id: SolanaClusterId;
|
|
9
10
|
label: string;
|
|
10
11
|
url: SolanaDevnetUrl | SolanaLocalnetUrl | SolanaMainnetUrl | SolanaTestnetUrl | string;
|
|
12
|
+
urlWs?: string;
|
|
11
13
|
}
|
|
12
14
|
//# sourceMappingURL=solana-cluster.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solana-cluster.d.ts","sourceRoot":"","sources":["../../../src/types/solana-cluster.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,SAAS,IAAI,eAAe,EAC5B,UAAU,IAAI,gBAAgB,EAC9B,UAAU,IAAI,gBAAgB,EACjC,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;AAEpE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,eAAe,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"solana-cluster.d.ts","sourceRoot":"","sources":["../../../src/types/solana-cluster.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,SAAS,IAAI,eAAe,EAC5B,UAAU,IAAI,gBAAgB,EAC9B,UAAU,IAAI,gBAAgB,EACjC,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;AAEpE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAEpE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAClB,iBAAiB,CAClC;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,eAAe,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,MAAM,CAAC;IACxF,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB"}
|