@solana/keychain 0.6.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -51
- package/dist/__tests__/create-keychain-signer.test.d.ts +2 -0
- package/dist/__tests__/create-keychain-signer.test.d.ts.map +1 -0
- package/dist/__tests__/create-keychain-signer.test.js +137 -0
- package/dist/__tests__/create-keychain-signer.test.js.map +1 -0
- package/dist/__tests__/resolve-address.test.d.ts +2 -0
- package/dist/__tests__/resolve-address.test.d.ts.map +1 -0
- package/dist/__tests__/resolve-address.test.js +106 -0
- package/dist/__tests__/resolve-address.test.js.map +1 -0
- package/dist/create-keychain-signer.d.ts +20 -0
- package/dist/create-keychain-signer.d.ts.map +1 -0
- package/dist/create-keychain-signer.js +61 -0
- package/dist/create-keychain-signer.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/resolve-address.d.ts +26 -0
- package/dist/resolve-address.d.ts.map +1 -0
- package/dist/resolve-address.js +56 -0
- package/dist/resolve-address.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +14 -13
- package/src/__tests__/create-keychain-signer.test.ts +154 -0
- package/src/__tests__/resolve-address.test.ts +131 -0
- package/src/create-keychain-signer.ts +65 -0
- package/src/index.ts +17 -0
- package/src/resolve-address.ts +61 -0
- package/src/types.ts +29 -0
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ This installs all signer implementations. For a smaller bundle, install individu
|
|
|
15
15
|
- `@solana/keychain-crossmint` - Crossmint signer
|
|
16
16
|
- `@solana/keychain-dfns` - Dfns signer
|
|
17
17
|
- `@solana/keychain-fireblocks` - Fireblocks signer
|
|
18
|
-
- `@solana/keychain-gcp-kms` -
|
|
18
|
+
- `@solana/keychain-gcp-kms` - GCP KMS signer
|
|
19
19
|
- `@solana/keychain-para` - Para MPC signer
|
|
20
20
|
- `@solana/keychain-privy` - Privy signer
|
|
21
21
|
- `@solana/keychain-turnkey` - Turnkey signer
|
|
@@ -23,47 +23,109 @@ This installs all signer implementations. For a smaller bundle, install individu
|
|
|
23
23
|
|
|
24
24
|
## Usage
|
|
25
25
|
|
|
26
|
-
###
|
|
26
|
+
### Unified Factory (Recommended)
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
Use `createKeychainSigner` with a discriminated config to create any backend:
|
|
29
29
|
|
|
30
30
|
```typescript
|
|
31
|
-
import {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
31
|
+
import { createKeychainSigner } from '@solana/keychain';
|
|
32
|
+
|
|
33
|
+
const signer = await createKeychainSigner({
|
|
34
|
+
backend: 'privy',
|
|
35
|
+
appId: 'your-app-id',
|
|
36
|
+
appSecret: 'your-app-secret',
|
|
37
|
+
walletId: 'your-wallet-id',
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
await signer.signTransactions([transaction]);
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The `backend` field determines which signer is created. TypeScript narrows the config type automatically — you get full autocomplete for each backend's required fields.
|
|
44
|
+
|
|
45
|
+
### Resolve Address Without Signing
|
|
46
|
+
|
|
47
|
+
Use `resolveAddress` to get a signer's Solana address without initializing the full signing pipeline:
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { resolveAddress } from '@solana/keychain';
|
|
51
|
+
|
|
52
|
+
// Sync backends (AWS KMS, GCP KMS, Turnkey, Vault, CDP) return instantly
|
|
53
|
+
const address = await resolveAddress({
|
|
54
|
+
backend: 'vault',
|
|
55
|
+
vaultAddr: 'https://vault.example.com',
|
|
56
|
+
vaultToken: 'hvs.xxx',
|
|
57
|
+
keyName: 'my-key',
|
|
58
|
+
publicKey: '4Nd1m...',
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Async backends (Privy, Para, Fireblocks, Crossmint, Dfns) fetch from the API
|
|
62
|
+
const address2 = await resolveAddress({
|
|
63
|
+
backend: 'privy',
|
|
64
|
+
appId: '...',
|
|
65
|
+
appSecret: '...',
|
|
66
|
+
walletId: '...',
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Config Types
|
|
71
|
+
|
|
72
|
+
The `KeychainSignerConfig` discriminated union and individual config types are exported for building config management, CLIs, or dashboards:
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import type { KeychainSignerConfig, BackendName, PrivySignerConfig } from '@solana/keychain';
|
|
76
|
+
|
|
77
|
+
// BackendName = 'aws-kms' | 'cdp' | 'crossmint' | 'dfns' | 'fireblocks' | 'gcp-kms' | 'para' | 'privy' | 'turnkey' | 'vault'
|
|
78
|
+
|
|
79
|
+
function loadConfig(json: unknown): KeychainSignerConfig {
|
|
80
|
+
// Parse and validate your config...
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Signing a Compiled Transaction
|
|
85
|
+
|
|
86
|
+
If you already have a compiled transaction (e.g. from a dApp, backend service, or another system), use `signTransactionWithSigners` from `@solana/signers` (≥ 6.5) to sign it directly:
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
import { signTransactionWithSigners } from '@solana/signers';
|
|
90
|
+
import { createKeychainSigner } from '@solana/keychain';
|
|
91
|
+
|
|
92
|
+
const signer = await createKeychainSigner({
|
|
93
|
+
backend: 'vault',
|
|
46
94
|
vaultAddr: 'https://vault.example.com',
|
|
47
95
|
vaultToken: 'hvs.xxx',
|
|
48
|
-
keyName: 'my-
|
|
49
|
-
publicKey: '
|
|
96
|
+
keyName: 'my-key',
|
|
97
|
+
publicKey: '4Nd1m...',
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// Sign an already-compiled transaction
|
|
101
|
+
const signedTx = await signTransactionWithSigners([signer], compiledTransaction);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
This complements the message-level helpers (`signTransactionMessageWithSigners`) which extract signers from account metas automatically. The transaction-level variant is useful when signers aren't embedded in the transaction message.
|
|
105
|
+
|
|
106
|
+
### Direct Factory Imports
|
|
107
|
+
|
|
108
|
+
Each backend also exports its own factory function:
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
import { createPrivySigner } from '@solana/keychain';
|
|
112
|
+
|
|
113
|
+
const signer = await createPrivySigner({
|
|
114
|
+
appId: '...',
|
|
115
|
+
appSecret: '...',
|
|
116
|
+
walletId: '...',
|
|
50
117
|
});
|
|
51
118
|
```
|
|
52
119
|
|
|
53
120
|
### Namespaced Imports
|
|
54
121
|
|
|
55
|
-
Each signer package is
|
|
122
|
+
Each signer package is available under its namespace for accessing types and utilities:
|
|
56
123
|
|
|
57
124
|
```typescript
|
|
58
|
-
import {
|
|
125
|
+
import { fireblocks, vault } from '@solana/keychain';
|
|
59
126
|
|
|
60
|
-
// Access types
|
|
61
127
|
type VaultConfig = vault.VaultSignerConfig;
|
|
62
|
-
type CrossmintConfig = crossmint.CrossmintSignerConfig;
|
|
63
128
|
type FireblocksStatus = fireblocks.FireblocksTransactionStatus;
|
|
64
|
-
|
|
65
|
-
// Or use signers via namespace
|
|
66
|
-
const signer = new vault.VaultSigner({ ... });
|
|
67
129
|
```
|
|
68
130
|
|
|
69
131
|
### Core Utilities
|
|
@@ -71,9 +133,8 @@ const signer = new vault.VaultSigner({ ... });
|
|
|
71
133
|
Core types and utilities from `@solana/keychain-core` are re-exported:
|
|
72
134
|
|
|
73
135
|
```typescript
|
|
74
|
-
import { SignerErrorCode, SolanaSigner } from '@solana/keychain';
|
|
136
|
+
import { SignerErrorCode, type SolanaSigner } from '@solana/keychain';
|
|
75
137
|
|
|
76
|
-
// Use error codes
|
|
77
138
|
try {
|
|
78
139
|
await signer.signMessages([message]);
|
|
79
140
|
} catch (error) {
|
|
@@ -85,22 +146,22 @@ try {
|
|
|
85
146
|
|
|
86
147
|
## Available Signers
|
|
87
148
|
|
|
88
|
-
|
|
|
89
|
-
|
|
90
|
-
| `
|
|
91
|
-
| `
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
96
|
-
| `
|
|
97
|
-
| `
|
|
98
|
-
| `
|
|
99
|
-
| `
|
|
149
|
+
| Backend | Package | Address Source |
|
|
150
|
+
|---------|---------|---------------|
|
|
151
|
+
| `aws-kms` | [@solana/keychain-aws-kms](../aws-kms/README.md) | Config (`publicKey`) |
|
|
152
|
+
| `cdp` | [@solana/keychain-cdp](../cdp/README.md) | Config (`address`) |
|
|
153
|
+
| `crossmint` | [@solana/keychain-crossmint](../crossmint/README.md) | API |
|
|
154
|
+
| `dfns` | [@solana/keychain-dfns](../dfns/README.md) | API |
|
|
155
|
+
| `fireblocks` | [@solana/keychain-fireblocks](../fireblocks/README.md) | API |
|
|
156
|
+
| `gcp-kms` | [@solana/keychain-gcp-kms](../gcp-kms/README.md) | Config (`publicKey`) |
|
|
157
|
+
| `para` | [@solana/keychain-para](../para/README.md) | API |
|
|
158
|
+
| `privy` | [@solana/keychain-privy](../privy/README.md) | API |
|
|
159
|
+
| `turnkey` | [@solana/keychain-turnkey](../turnkey/README.md) | Config (`publicKey`) |
|
|
160
|
+
| `vault` | [@solana/keychain-vault](../vault/README.md) | Config (`publicKey`) |
|
|
100
161
|
|
|
101
162
|
## Common Interface
|
|
102
163
|
|
|
103
|
-
All signers
|
|
164
|
+
All signers implement `SolanaSigner`, which is compatible with `@solana/kit` and `@solana/signers`:
|
|
104
165
|
|
|
105
166
|
```typescript
|
|
106
167
|
interface SolanaSigner<TAddress extends string = string> {
|
|
@@ -111,15 +172,6 @@ interface SolanaSigner<TAddress extends string = string> {
|
|
|
111
172
|
}
|
|
112
173
|
```
|
|
113
174
|
|
|
114
|
-
This allows you to write code that works with any signer:
|
|
115
|
-
|
|
116
|
-
```typescript
|
|
117
|
-
async function signAndSend(signer: SolanaSigner, transaction: Transaction) {
|
|
118
|
-
const [signatures] = await signer.signTransactions([transaction]);
|
|
119
|
-
// ... send transaction
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
175
|
## License
|
|
124
176
|
|
|
125
177
|
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-keychain-signer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/create-keychain-signer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { SignerErrorCode } from '@solana/keychain-core';
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { createKeychainSigner } from '../create-keychain-signer.js';
|
|
4
|
+
const TEST_ADDRESS = '11111111111111111111111111111111';
|
|
5
|
+
function makeMockSigner(address = TEST_ADDRESS) {
|
|
6
|
+
return {
|
|
7
|
+
address,
|
|
8
|
+
isAvailable: vi.fn().mockResolvedValue(true),
|
|
9
|
+
signMessages: vi.fn().mockResolvedValue([]),
|
|
10
|
+
signTransactions: vi.fn().mockResolvedValue([]),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
// Mock all backend factories
|
|
14
|
+
vi.mock('@solana/keychain-aws-kms', () => ({ createAwsKmsSigner: vi.fn() }));
|
|
15
|
+
vi.mock('@solana/keychain-cdp', () => ({ createCdpSigner: vi.fn() }));
|
|
16
|
+
vi.mock('@solana/keychain-crossmint', () => ({ createCrossmintSigner: vi.fn() }));
|
|
17
|
+
vi.mock('@solana/keychain-dfns', () => ({ createDfnsSigner: vi.fn() }));
|
|
18
|
+
vi.mock('@solana/keychain-fireblocks', () => ({ createFireblocksSigner: vi.fn() }));
|
|
19
|
+
vi.mock('@solana/keychain-gcp-kms', () => ({ createGcpKmsSigner: vi.fn() }));
|
|
20
|
+
vi.mock('@solana/keychain-para', () => ({ createParaSigner: vi.fn() }));
|
|
21
|
+
vi.mock('@solana/keychain-privy', () => ({ createPrivySigner: vi.fn() }));
|
|
22
|
+
vi.mock('@solana/keychain-turnkey', () => ({ createTurnkeySigner: vi.fn() }));
|
|
23
|
+
vi.mock('@solana/keychain-vault', () => ({ createVaultSigner: vi.fn() }));
|
|
24
|
+
// Table-driven test configs — one per backend
|
|
25
|
+
const BACKEND_CONFIGS = {
|
|
26
|
+
'aws-kms': {
|
|
27
|
+
config: { backend: 'aws-kms', keyId: 'key-1', publicKey: TEST_ADDRESS },
|
|
28
|
+
factoryName: 'createAwsKmsSigner',
|
|
29
|
+
modulePath: '@solana/keychain-aws-kms',
|
|
30
|
+
},
|
|
31
|
+
cdp: {
|
|
32
|
+
config: {
|
|
33
|
+
backend: 'cdp',
|
|
34
|
+
address: TEST_ADDRESS,
|
|
35
|
+
cdpApiKeyId: 'id',
|
|
36
|
+
cdpApiKeySecret: 's',
|
|
37
|
+
cdpWalletSecret: 'w',
|
|
38
|
+
},
|
|
39
|
+
factoryName: 'createCdpSigner',
|
|
40
|
+
modulePath: '@solana/keychain-cdp',
|
|
41
|
+
},
|
|
42
|
+
crossmint: {
|
|
43
|
+
config: { backend: 'crossmint', apiKey: 'key', walletLocator: 'loc' },
|
|
44
|
+
factoryName: 'createCrossmintSigner',
|
|
45
|
+
modulePath: '@solana/keychain-crossmint',
|
|
46
|
+
},
|
|
47
|
+
dfns: {
|
|
48
|
+
config: { backend: 'dfns', authToken: 'tok', credId: 'cred', privateKeyPem: 'pem', walletId: 'w' },
|
|
49
|
+
factoryName: 'createDfnsSigner',
|
|
50
|
+
modulePath: '@solana/keychain-dfns',
|
|
51
|
+
},
|
|
52
|
+
fireblocks: {
|
|
53
|
+
config: { backend: 'fireblocks', apiKey: 'key', privateKeyPem: 'pem', vaultAccountId: 'v' },
|
|
54
|
+
factoryName: 'createFireblocksSigner',
|
|
55
|
+
modulePath: '@solana/keychain-fireblocks',
|
|
56
|
+
},
|
|
57
|
+
'gcp-kms': {
|
|
58
|
+
config: { backend: 'gcp-kms', keyName: 'key', publicKey: TEST_ADDRESS },
|
|
59
|
+
factoryName: 'createGcpKmsSigner',
|
|
60
|
+
modulePath: '@solana/keychain-gcp-kms',
|
|
61
|
+
},
|
|
62
|
+
para: {
|
|
63
|
+
config: { backend: 'para', apiKey: 'key', walletId: 'w' },
|
|
64
|
+
factoryName: 'createParaSigner',
|
|
65
|
+
modulePath: '@solana/keychain-para',
|
|
66
|
+
},
|
|
67
|
+
privy: {
|
|
68
|
+
config: { backend: 'privy', appId: 'app', appSecret: 'secret', walletId: 'w' },
|
|
69
|
+
factoryName: 'createPrivySigner',
|
|
70
|
+
modulePath: '@solana/keychain-privy',
|
|
71
|
+
},
|
|
72
|
+
turnkey: {
|
|
73
|
+
config: {
|
|
74
|
+
backend: 'turnkey',
|
|
75
|
+
apiPrivateKey: 'pk',
|
|
76
|
+
apiPublicKey: 'pub',
|
|
77
|
+
organizationId: 'org',
|
|
78
|
+
privateKeyId: 'pkid',
|
|
79
|
+
publicKey: TEST_ADDRESS,
|
|
80
|
+
},
|
|
81
|
+
factoryName: 'createTurnkeySigner',
|
|
82
|
+
modulePath: '@solana/keychain-turnkey',
|
|
83
|
+
},
|
|
84
|
+
vault: {
|
|
85
|
+
config: {
|
|
86
|
+
backend: 'vault',
|
|
87
|
+
keyName: 'key',
|
|
88
|
+
publicKey: TEST_ADDRESS,
|
|
89
|
+
vaultAddr: 'https://v',
|
|
90
|
+
vaultToken: 'tok',
|
|
91
|
+
},
|
|
92
|
+
factoryName: 'createVaultSigner',
|
|
93
|
+
modulePath: '@solana/keychain-vault',
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
describe('createKeychainSigner', () => {
|
|
97
|
+
beforeEach(() => {
|
|
98
|
+
vi.clearAllMocks();
|
|
99
|
+
});
|
|
100
|
+
describe.each(Object.entries(BACKEND_CONFIGS))('%s', (_backend, { config, modulePath, factoryName }) => {
|
|
101
|
+
it('dispatches to the correct factory', async () => {
|
|
102
|
+
const mockSigner = makeMockSigner();
|
|
103
|
+
const mod = await import(modulePath);
|
|
104
|
+
const factory = mod[factoryName];
|
|
105
|
+
factory.mockResolvedValue(mockSigner);
|
|
106
|
+
const result = await createKeychainSigner(config);
|
|
107
|
+
expect(result).toBe(mockSigner);
|
|
108
|
+
expect(factory).toHaveBeenCalledOnce();
|
|
109
|
+
});
|
|
110
|
+
it('passes config without the backend field', async () => {
|
|
111
|
+
const mockSigner = makeMockSigner();
|
|
112
|
+
const mod = await import(modulePath);
|
|
113
|
+
const factory = mod[factoryName];
|
|
114
|
+
factory.mockResolvedValue(mockSigner);
|
|
115
|
+
await createKeychainSigner(config);
|
|
116
|
+
const passedConfig = factory.mock.calls[0][0];
|
|
117
|
+
expect(passedConfig).not.toHaveProperty('backend');
|
|
118
|
+
});
|
|
119
|
+
it('propagates factory errors', async () => {
|
|
120
|
+
const mod = await import(modulePath);
|
|
121
|
+
const factory = mod[factoryName];
|
|
122
|
+
factory.mockRejectedValue(new Error('factory error'));
|
|
123
|
+
await expect(createKeychainSigner(config)).rejects.toThrow('factory error');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
it('throws SignerError for unknown backend', async () => {
|
|
127
|
+
const badConfig = { backend: 'nonexistent' };
|
|
128
|
+
try {
|
|
129
|
+
await createKeychainSigner(badConfig);
|
|
130
|
+
expect.unreachable('should have thrown');
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
expect(error.code).toBe(SignerErrorCode.CONFIG_ERROR);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=create-keychain-signer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-keychain-signer.test.js","sourceRoot":"","sources":["../../src/__tests__/create-keychain-signer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-address.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/resolve-address.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { SignerErrorCode } from '@solana/keychain-core';
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
const TEST_ADDRESS = '11111111111111111111111111111111';
|
|
4
|
+
function makeMockSigner(address = TEST_ADDRESS) {
|
|
5
|
+
return {
|
|
6
|
+
address,
|
|
7
|
+
isAvailable: vi.fn().mockResolvedValue(true),
|
|
8
|
+
signMessages: vi.fn().mockResolvedValue([]),
|
|
9
|
+
signTransactions: vi.fn().mockResolvedValue([]),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
// Mock createKeychainSigner so we don't pull in all backend deps
|
|
13
|
+
vi.mock('../create-keychain-signer.js', () => ({
|
|
14
|
+
createKeychainSigner: vi.fn().mockResolvedValue(makeMockSigner()),
|
|
15
|
+
}));
|
|
16
|
+
// Must import after mock setup
|
|
17
|
+
const { resolveAddress } = await import('../resolve-address.js');
|
|
18
|
+
const { createKeychainSigner } = await import('../create-keychain-signer.js');
|
|
19
|
+
describe('resolveAddress', () => {
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
vi.clearAllMocks();
|
|
22
|
+
});
|
|
23
|
+
describe('sync backends (publicKey in config)', () => {
|
|
24
|
+
it.each(['aws-kms', 'gcp-kms', 'turnkey', 'vault'])('%s returns publicKey directly', async (backend) => {
|
|
25
|
+
const config = {
|
|
26
|
+
backend,
|
|
27
|
+
keyId: 'k',
|
|
28
|
+
keyName: 'k',
|
|
29
|
+
publicKey: TEST_ADDRESS,
|
|
30
|
+
vaultAddr: 'https://v',
|
|
31
|
+
vaultToken: 't',
|
|
32
|
+
apiPrivateKey: 'pk',
|
|
33
|
+
apiPublicKey: 'pub',
|
|
34
|
+
organizationId: 'org',
|
|
35
|
+
privateKeyId: 'pkid',
|
|
36
|
+
};
|
|
37
|
+
const address = await resolveAddress(config);
|
|
38
|
+
expect(address).toBe(TEST_ADDRESS);
|
|
39
|
+
expect(createKeychainSigner).not.toHaveBeenCalled();
|
|
40
|
+
});
|
|
41
|
+
it('throws for invalid publicKey', async () => {
|
|
42
|
+
const config = {
|
|
43
|
+
backend: 'vault',
|
|
44
|
+
keyName: 'k',
|
|
45
|
+
publicKey: 'not-a-valid-address',
|
|
46
|
+
vaultAddr: 'https://v',
|
|
47
|
+
vaultToken: 't',
|
|
48
|
+
};
|
|
49
|
+
await expect(resolveAddress(config)).rejects.toThrow();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('cdp (address in config)', () => {
|
|
53
|
+
it('returns address directly', async () => {
|
|
54
|
+
const config = {
|
|
55
|
+
backend: 'cdp',
|
|
56
|
+
address: TEST_ADDRESS,
|
|
57
|
+
cdpApiKeyId: 'id',
|
|
58
|
+
cdpApiKeySecret: 's',
|
|
59
|
+
cdpWalletSecret: 'w',
|
|
60
|
+
};
|
|
61
|
+
const address = await resolveAddress(config);
|
|
62
|
+
expect(address).toBe(TEST_ADDRESS);
|
|
63
|
+
expect(createKeychainSigner).not.toHaveBeenCalled();
|
|
64
|
+
});
|
|
65
|
+
it('throws for invalid address', async () => {
|
|
66
|
+
const config = {
|
|
67
|
+
backend: 'cdp',
|
|
68
|
+
address: 'bad',
|
|
69
|
+
cdpApiKeyId: 'id',
|
|
70
|
+
cdpApiKeySecret: 's',
|
|
71
|
+
cdpWalletSecret: 'w',
|
|
72
|
+
};
|
|
73
|
+
await expect(resolveAddress(config)).rejects.toThrow();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('async backends (fetch from API)', () => {
|
|
77
|
+
it.each(['crossmint', 'dfns', 'fireblocks', 'para', 'privy'])('%s delegates to createKeychainSigner', async (backend) => {
|
|
78
|
+
const config = {
|
|
79
|
+
backend,
|
|
80
|
+
apiKey: 'k',
|
|
81
|
+
appId: 'a',
|
|
82
|
+
appSecret: 's',
|
|
83
|
+
authToken: 't',
|
|
84
|
+
credId: 'c',
|
|
85
|
+
privateKeyPem: 'p',
|
|
86
|
+
vaultAccountId: 'v',
|
|
87
|
+
walletId: 'w',
|
|
88
|
+
walletLocator: 'l',
|
|
89
|
+
};
|
|
90
|
+
const address = await resolveAddress(config);
|
|
91
|
+
expect(address).toBe(TEST_ADDRESS);
|
|
92
|
+
expect(createKeychainSigner).toHaveBeenCalledWith(config);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
it('throws SignerError for unknown backend', async () => {
|
|
96
|
+
const badConfig = { backend: 'nonexistent' };
|
|
97
|
+
try {
|
|
98
|
+
await resolveAddress(badConfig);
|
|
99
|
+
expect.unreachable('should have thrown');
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
expect(error.code).toBe(SignerErrorCode.CONFIG_ERROR);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=resolve-address.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-address.test.js","sourceRoot":"","sources":["../../src/__tests__/resolve-address.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SolanaSigner } from '@solana/keychain-core';
|
|
2
|
+
import type { KeychainSignerConfig } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Create a {@link SolanaSigner} from a backend-tagged configuration.
|
|
5
|
+
*
|
|
6
|
+
* Dispatches to the correct `createXxxSigner()` factory based on
|
|
7
|
+
* the `backend` discriminant.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const signer = await createKeychainSigner({
|
|
12
|
+
* backend: 'privy',
|
|
13
|
+
* appId: '...',
|
|
14
|
+
* appSecret: '...',
|
|
15
|
+
* walletId: '...',
|
|
16
|
+
* });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function createKeychainSigner(config: KeychainSignerConfig): Promise<SolanaSigner>;
|
|
20
|
+
//# sourceMappingURL=create-keychain-signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-keychain-signer.d.ts","sourceRoot":"","sources":["../src/create-keychain-signer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAW1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAMvD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6B9F"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { createAwsKmsSigner } from '@solana/keychain-aws-kms';
|
|
2
|
+
import { createCdpSigner } from '@solana/keychain-cdp';
|
|
3
|
+
import { SignerErrorCode, throwSignerError } from '@solana/keychain-core';
|
|
4
|
+
import { createCrossmintSigner } from '@solana/keychain-crossmint';
|
|
5
|
+
import { createDfnsSigner } from '@solana/keychain-dfns';
|
|
6
|
+
import { createFireblocksSigner } from '@solana/keychain-fireblocks';
|
|
7
|
+
import { createGcpKmsSigner } from '@solana/keychain-gcp-kms';
|
|
8
|
+
import { createParaSigner } from '@solana/keychain-para';
|
|
9
|
+
import { createPrivySigner } from '@solana/keychain-privy';
|
|
10
|
+
import { createTurnkeySigner } from '@solana/keychain-turnkey';
|
|
11
|
+
import { createVaultSigner } from '@solana/keychain-vault';
|
|
12
|
+
function stripBackend({ backend: _, ...rest }) {
|
|
13
|
+
return rest;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a {@link SolanaSigner} from a backend-tagged configuration.
|
|
17
|
+
*
|
|
18
|
+
* Dispatches to the correct `createXxxSigner()` factory based on
|
|
19
|
+
* the `backend` discriminant.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const signer = await createKeychainSigner({
|
|
24
|
+
* backend: 'privy',
|
|
25
|
+
* appId: '...',
|
|
26
|
+
* appSecret: '...',
|
|
27
|
+
* walletId: '...',
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export async function createKeychainSigner(config) {
|
|
32
|
+
switch (config.backend) {
|
|
33
|
+
case 'aws-kms':
|
|
34
|
+
return createAwsKmsSigner(stripBackend(config));
|
|
35
|
+
case 'cdp':
|
|
36
|
+
return await createCdpSigner(stripBackend(config));
|
|
37
|
+
case 'crossmint':
|
|
38
|
+
return await createCrossmintSigner(stripBackend(config));
|
|
39
|
+
case 'dfns':
|
|
40
|
+
return await createDfnsSigner(stripBackend(config));
|
|
41
|
+
case 'fireblocks':
|
|
42
|
+
return await createFireblocksSigner(stripBackend(config));
|
|
43
|
+
case 'gcp-kms':
|
|
44
|
+
return createGcpKmsSigner(stripBackend(config));
|
|
45
|
+
case 'para':
|
|
46
|
+
return await createParaSigner(stripBackend(config));
|
|
47
|
+
case 'privy':
|
|
48
|
+
return await createPrivySigner(stripBackend(config));
|
|
49
|
+
case 'turnkey':
|
|
50
|
+
return createTurnkeySigner(stripBackend(config));
|
|
51
|
+
case 'vault':
|
|
52
|
+
return createVaultSigner(stripBackend(config));
|
|
53
|
+
default: {
|
|
54
|
+
const _exhaustive = config;
|
|
55
|
+
return throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
56
|
+
message: `Unknown backend: ${String(_exhaustive.backend)}`,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=create-keychain-signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-keychain-signer.js","sourceRoot":"","sources":["../src/create-keychain-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAI3D,SAAS,YAAY,CAAgC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,EAAK;IAC3E,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAA4B;IACnE,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,KAAK,SAAS;YACV,OAAO,kBAAkB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,KAAK,KAAK;YACN,OAAO,MAAM,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,KAAK,WAAW;YACZ,OAAO,MAAM,qBAAqB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,KAAK,MAAM;YACP,OAAO,MAAM,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,KAAK,YAAY;YACb,OAAO,MAAM,sBAAsB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,KAAK,SAAS;YACV,OAAO,kBAAkB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,KAAK,MAAM;YACP,OAAO,MAAM,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,KAAK,OAAO;YACR,OAAO,MAAM,iBAAiB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,KAAK,SAAS;YACV,OAAO,mBAAmB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,KAAK,OAAO;YACR,OAAO,iBAAiB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC,CAAC;YACN,MAAM,WAAW,GAAU,MAAM,CAAC;YAClC,OAAO,gBAAgB,CAAC,eAAe,CAAC,YAAY,EAAE;gBAClD,OAAO,EAAE,oBAAoB,MAAM,CAAE,WAAmC,CAAC,OAAO,CAAC,EAAE;aACtF,CAAC,CAAC;QACP,CAAC;IACL,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
export * from '@solana/keychain-core';
|
|
2
|
+
export { createKeychainSigner } from './create-keychain-signer.js';
|
|
3
|
+
export { resolveAddress } from './resolve-address.js';
|
|
4
|
+
export type { BackendName, KeychainSignerConfig } from './types.js';
|
|
5
|
+
export type { AwsKmsSignerConfig } from '@solana/keychain-aws-kms';
|
|
6
|
+
export type { CdpSignerConfig } from '@solana/keychain-cdp';
|
|
7
|
+
export type { CrossmintSignerConfig } from '@solana/keychain-crossmint';
|
|
8
|
+
export type { DfnsSignerConfig } from '@solana/keychain-dfns';
|
|
9
|
+
export type { FireblocksSignerConfig } from '@solana/keychain-fireblocks';
|
|
10
|
+
export type { GcpKmsSignerConfig } from '@solana/keychain-gcp-kms';
|
|
11
|
+
export type { ParaSignerConfig } from '@solana/keychain-para';
|
|
12
|
+
export type { PrivySignerConfig } from '@solana/keychain-privy';
|
|
13
|
+
export type { TurnkeySignerConfig } from '@solana/keychain-turnkey';
|
|
14
|
+
export type { VaultSignerConfig } from '@solana/keychain-vault';
|
|
2
15
|
export * as awsKms from '@solana/keychain-aws-kms';
|
|
3
16
|
export * as cdp from '@solana/keychain-cdp';
|
|
4
17
|
export * as crossmint from '@solana/keychain-crossmint';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,uBAAuB,CAAC;AAGtC,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAC;AAC5C,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAC;AAChD,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAC;AAGhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGpE,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,YAAY,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAC;AAC5C,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAC;AAChD,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAC;AAGhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
// Core types and utilities (flat export)
|
|
2
2
|
export * from '@solana/keychain-core';
|
|
3
|
+
// Unified signer factory, address resolver, and config union
|
|
4
|
+
export { createKeychainSigner } from './create-keychain-signer.js';
|
|
5
|
+
export { resolveAddress } from './resolve-address.js';
|
|
3
6
|
// Signer implementations (namespaced to avoid conflicts)
|
|
4
7
|
export * as awsKms from '@solana/keychain-aws-kms';
|
|
5
8
|
export * as cdp from '@solana/keychain-cdp';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,cAAc,uBAAuB,CAAC;AAEtC,yDAAyD;AACzD,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAC;AAC5C,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAC;AAChD,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAC;AAEhD,uDAAuD;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,+GAA+G;AAC/G,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,cAAc,uBAAuB,CAAC;AAEtC,6DAA6D;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAetD,yDAAyD;AACzD,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAC;AAC5C,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAC;AAChD,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,wBAAwB,CAAC;AAEhD,uDAAuD;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,+GAA+G;AAC/G,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|