@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 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` - Google Cloud KMS signer
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
- ### Direct Signer Imports
26
+ ### Unified Factory (Recommended)
27
27
 
28
- The main signer classes are exported directly for convenience:
28
+ Use `createKeychainSigner` with a discriminated config to create any backend:
29
29
 
30
30
  ```typescript
31
- import {
32
- AwsKmsSigner,
33
- CdpSigner,
34
- CrossmintSigner,
35
- DfnsSigner,
36
- FireblocksSigner,
37
- GcpKmsSigner,
38
- ParaSigner,
39
- PrivySigner,
40
- TurnkeySigner,
41
- VaultSigner,
42
- } from '@solana/keychain';
43
-
44
- // Use any signer directly
45
- const signer = new VaultSigner({
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-solana-key',
49
- publicKey: 'YourSolanaPublicKey',
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 also available under its namespace for accessing types and utilities:
122
+ Each signer package is available under its namespace for accessing types and utilities:
56
123
 
57
124
  ```typescript
58
- import { awsKms, cdp, crossmint, dfns, fireblocks, gcpKms, para, privy, turnkey, vault } from '@solana/keychain';
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
- | Signer | Package |
89
- |--------|----------|
90
- | `AwsKmsSigner` | [@solana/keychain-aws-kms](../aws-kms/README.md) |
91
- | `CdpSigner` | [@solana/keychain-cdp](../cdp/README.md) |
92
- | `CrossmintSigner` | [@solana/keychain-crossmint](../crossmint/README.md) |
93
- | `DfnsSigner` | [@solana/keychain-dfns](../dfns/README.md) |
94
- | `FireblocksSigner` | [@solana/keychain-fireblocks](../fireblocks/README.md) |
95
- | `GcpKmsSigner` | [@solana/keychain-gcp-kms](../gcp-kms/README.md) |
96
- | `ParaSigner` | [@solana/keychain-para](../para/README.md) |
97
- | `PrivySigner` | [@solana/keychain-privy](../privy/README.md) |
98
- | `TurnkeySigner` | [@solana/keychain-turnkey](../turnkey/README.md) |
99
- | `VaultSigner` | [@solana/keychain-vault](../vault/README.md) |
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 are compatible with the `@solana/kit` and `@solana/signers` libraries and implement the `SolanaSigner` interface:
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=create-keychain-signer.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolve-address.test.d.ts.map
@@ -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":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAI9D,MAAM,YAAY,GAAG,kCAA6C,CAAC;AAEnE,SAAS,cAAc,CAAC,UAAmB,YAAY;IACnD,OAAO;QACH,OAAO;QACP,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC5C,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC3C,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;KACvB,CAAC;AACjC,CAAC;AAED,iEAAiE;AACjE,EAAE,CAAC,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC;CACpE,CAAC,CAAC,CAAC;AAEJ,+BAA+B;AAC/B,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;AACjE,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;AAE9E,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;QACjD,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC,CAAC,+BAA+B,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;YAC1G,MAAM,MAAM,GAAG;gBACX,OAAO;gBACP,KAAK,EAAE,GAAG;gBACV,OAAO,EAAE,GAAG;gBACZ,SAAS,EAAE,YAAY;gBACvB,SAAS,EAAE,WAAW;gBACtB,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,IAAI;gBACnB,YAAY,EAAE,KAAK;gBACnB,cAAc,EAAE,KAAK;gBACrB,YAAY,EAAE,MAAM;aACC,CAAC;YAE1B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAE7C,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,MAAM,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC1C,MAAM,MAAM,GAAG;gBACX,OAAO,EAAE,OAAgB;gBACzB,OAAO,EAAE,GAAG;gBACZ,SAAS,EAAE,qBAAqB;gBAChC,SAAS,EAAE,WAAW;gBACtB,UAAU,EAAE,GAAG;aAClB,CAAC;YAEF,MAAM,MAAM,CAAC,cAAc,CAAC,MAA8B,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACnF,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACtC,MAAM,MAAM,GAAG;gBACX,OAAO,EAAE,KAAc;gBACvB,OAAO,EAAE,YAAY;gBACrB,WAAW,EAAE,IAAI;gBACjB,eAAe,EAAE,GAAG;gBACpB,eAAe,EAAE,GAAG;aACvB,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAA8B,CAAC,CAAC;YAErE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,MAAM,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,MAAM,GAAG;gBACX,OAAO,EAAE,KAAc;gBACvB,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE,IAAI;gBACjB,eAAe,EAAE,GAAG;gBACpB,eAAe,EAAE,GAAG;aACvB,CAAC;YAEF,MAAM,MAAM,CAAC,cAAc,CAAC,MAA8B,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACnF,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC,CAClE,sCAAsC,EACtC,KAAK,EAAC,OAAO,EAAC,EAAE;YACZ,MAAM,MAAM,GAAG;gBACX,OAAO;gBACP,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;gBACd,MAAM,EAAE,GAAG;gBACX,aAAa,EAAE,GAAG;gBAClB,cAAc,EAAE,GAAG;gBACnB,QAAQ,EAAE,GAAG;gBACb,aAAa,EAAE,GAAG;aACG,CAAC;YAE1B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAE7C,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,MAAM,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC9D,CAAC,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,aAAa,EAAqC,CAAC;QAEhF,IAAI,CAAC;YACD,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAE,KAA0B,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAChF,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -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';
@@ -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"}