keyv-registry 0.3.1 → 0.4.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 +28 -9
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/registry.js +55 -10
- package/dist/cjs/registry.js.map +1 -1
- package/dist/cjs/types.d.cts +2 -0
- package/dist/cjs/types.d.ts +2 -0
- package/dist/cjs/worker.js +13 -7
- package/dist/cjs/worker.js.map +1 -1
- package/dist/esm/index.js +1 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/registry.js +41 -10
- package/dist/esm/registry.js.map +1 -1
- package/dist/esm/types.d.ts +2 -0
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/worker.js +10 -3
- package/dist/esm/worker.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -77,6 +77,25 @@ const store = await createStore('redis://localhost:6379?keyPrefix=myapp&ttl=3600
|
|
|
77
77
|
const file = await createStore('file://~/data.json?writeDelay=100&pretty=true');
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
+
### Connection String Handling
|
|
81
|
+
|
|
82
|
+
Connection strings are passed to adapters via protocol-specific mappings. Different adapters expect connection information in different formats:
|
|
83
|
+
|
|
84
|
+
**Direct URL passing** (adapter instantiated with URI string):
|
|
85
|
+
- `redis://`, `rediss://` - Redis
|
|
86
|
+
- `memcache://` - Memcached
|
|
87
|
+
|
|
88
|
+
**URI option mapping** (wrapped in `{ uri }` object):
|
|
89
|
+
- `postgresql://`, `postgres://` - PostgreSQL
|
|
90
|
+
- `mysql://` - MySQL/MariaDB
|
|
91
|
+
- `sqlite://` - SQLite
|
|
92
|
+
|
|
93
|
+
**URL option mapping** (wrapped in `{ url }` object):
|
|
94
|
+
- `mongodb://`, `mongodb+srv://` - MongoDB
|
|
95
|
+
- `etcd://` - etcd
|
|
96
|
+
|
|
97
|
+
Query parameters are always passed through and can be used for adapter-specific configuration. User options override both query parameters and protocol mappings.
|
|
98
|
+
|
|
80
99
|
### Custom Adapters
|
|
81
100
|
|
|
82
101
|
Register custom protocols or override defaults:
|
|
@@ -119,15 +138,15 @@ const store = await createStore('redis://ignored', { store: customRedis });
|
|
|
119
138
|
|
|
120
139
|
### Official @keyv Adapters
|
|
121
140
|
|
|
122
|
-
| Protocol | Package | Notes |
|
|
123
|
-
|
|
124
|
-
| `redis://`, `rediss://` | `@keyv/redis` | Redis, supports TLS |
|
|
125
|
-
| `postgresql://`, `postgres://` | `@keyv/postgres` | PostgreSQL |
|
|
126
|
-
| `mysql://` | `@keyv/mysql` | MySQL/MariaDB |
|
|
127
|
-
| `sqlite://` | `@keyv/sqlite` | SQLite |
|
|
128
|
-
| `mongodb://`, `mongodb+srv://` | `@keyv/mongo` | MongoDB |
|
|
129
|
-
| `memcache://` | `@keyv/memcache` | Memcached |
|
|
130
|
-
| `etcd://` | `@keyv/etcd` | etcd |
|
|
141
|
+
| Protocol | Package | Connection String Handling | Notes |
|
|
142
|
+
|----------|---------|---------------------------|-------|
|
|
143
|
+
| `redis://`, `rediss://` | `@keyv/redis` | Direct URL | Redis, supports TLS |
|
|
144
|
+
| `postgresql://`, `postgres://` | `@keyv/postgres` | URI option | PostgreSQL |
|
|
145
|
+
| `mysql://` | `@keyv/mysql` | URI option | MySQL/MariaDB |
|
|
146
|
+
| `sqlite://` | `@keyv/sqlite` | URI option | SQLite |
|
|
147
|
+
| `mongodb://`, `mongodb+srv://` | `@keyv/mongo` | URL option | MongoDB |
|
|
148
|
+
| `memcache://` | `@keyv/memcache` | Direct URI | Memcached |
|
|
149
|
+
| `etcd://` | `@keyv/etcd` | URL option | etcd |
|
|
131
150
|
|
|
132
151
|
### Third-party Adapters
|
|
133
152
|
|
package/dist/cjs/index.js
CHANGED
|
@@ -35,7 +35,7 @@ function createStore(uri, options, callback) {
|
|
|
35
35
|
options = typeof options === 'function' ? {} : options || {};
|
|
36
36
|
if (typeof callback === 'function') return (0, _workerts.default)(uri, options, callback);
|
|
37
37
|
return new Promise(function(resolve, reject) {
|
|
38
|
-
(0, _workerts.default)(uri, options, function(err, store) {
|
|
38
|
+
return (0, _workerts.default)(uri, options, function(err, store) {
|
|
39
39
|
return err ? reject(err) : resolve(store);
|
|
40
40
|
});
|
|
41
41
|
});
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/index.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport type { CreateStoreCallback, CreateStoreOptions } from './types.ts';\nimport worker from './worker.ts';\n\nexport { clearAdapterCache } from './loadAdapter.ts';\nexport { getRegistry, registerAdapter } from './registry.ts';\nexport type { AdapterConfig, CreateStoreCallback, CreateStoreOptions } from './types.ts';\n\n/**\n * Create a Keyv store from a URI string\n *\n * Supports dual-boot API (callback or Promise):\n *\n * @example\n * // Promise API\n * const store = await createStore('redis://localhost:6379');\n * const file = await createStore('file://~/.cache/app/data.json');\n * const memory = await createStore('memory://');\n *\n * @example\n * // Callback API\n * createStore('redis://localhost:6379', (err, store) => {\n * if (err) throw err;\n * // use store\n * });\n *\n * @example\n * // With options\n * const store = await createStore('redis://localhost:6379', {\n * namespace: 'myapp',\n * ttl: 60000\n * });\n *\n * @example\n * // Pre-instantiated adapter passthrough\n * import KeyvRedis from '@keyv/redis';\n * const redis = new KeyvRedis('redis://localhost:6379');\n * const store = await createStore('redis://ignored', { store: redis });\n */\nexport default function createStore<T>(uri: string, callback: CreateStoreCallback<T>): void;\nexport default function createStore<T>(uri: string, options: CreateStoreOptions, callback: CreateStoreCallback<T>): void;\nexport default function createStore<T>(uri: string, options?: CreateStoreOptions): Promise<Keyv<T>>;\nexport default function createStore<T>(uri: string, options?: CreateStoreOptions | CreateStoreCallback<T>, callback?: CreateStoreCallback<T>): void | Promise<Keyv<T>> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as CreateStoreOptions);\n\n if (typeof callback === 'function') return worker(uri, options, callback);\n return new Promise((resolve, reject) =>
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/index.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport type { CreateStoreCallback, CreateStoreOptions } from './types.ts';\nimport worker from './worker.ts';\n\nexport { clearAdapterCache } from './loadAdapter.ts';\nexport { getRegistry, registerAdapter } from './registry.ts';\nexport type { AdapterConfig, CreateStoreCallback, CreateStoreOptions } from './types.ts';\n\n/**\n * Create a Keyv store from a URI string\n *\n * Supports dual-boot API (callback or Promise):\n *\n * @example\n * // Promise API\n * const store = await createStore('redis://localhost:6379');\n * const file = await createStore('file://~/.cache/app/data.json');\n * const memory = await createStore('memory://');\n *\n * @example\n * // Callback API\n * createStore('redis://localhost:6379', (err, store) => {\n * if (err) throw err;\n * // use store\n * });\n *\n * @example\n * // With options\n * const store = await createStore('redis://localhost:6379', {\n * namespace: 'myapp',\n * ttl: 60000\n * });\n *\n * @example\n * // Pre-instantiated adapter passthrough\n * import KeyvRedis from '@keyv/redis';\n * const redis = new KeyvRedis('redis://localhost:6379');\n * const store = await createStore('redis://ignored', { store: redis });\n */\nexport default function createStore<T>(uri: string, callback: CreateStoreCallback<T>): void;\nexport default function createStore<T>(uri: string, options: CreateStoreOptions, callback: CreateStoreCallback<T>): void;\nexport default function createStore<T>(uri: string, options?: CreateStoreOptions): Promise<Keyv<T>>;\nexport default function createStore<T>(uri: string, options?: CreateStoreOptions | CreateStoreCallback<T>, callback?: CreateStoreCallback<T>): void | Promise<Keyv<T>> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as CreateStoreOptions);\n\n if (typeof callback === 'function') return worker(uri, options, callback);\n return new Promise((resolve, reject) => worker(uri, options, (err, store) => (err ? reject(err) : resolve(store as Keyv<T>))));\n}\n"],"names":["clearAdapterCache","createStore","getRegistry","registerAdapter","uri","options","callback","worker","Promise","resolve","reject","err","store"],"mappings":";;;;;;;;;;;QAISA;eAAAA,gCAAiB;;QAsC1B;eAAwBC;;QArCfC;eAAAA,uBAAW;;QAAEC;eAAAA,2BAAe;;;+DAHlB;6BAEe;0BACW;;;;;;AAqC9B,SAASF,YAAeG,GAAW,EAAEC,OAAqD,EAAEC,QAAiC;IAC1IA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;IACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;IAE7D,IAAI,OAAOC,aAAa,YAAY,OAAOC,IAAAA,iBAAM,EAACH,KAAKC,SAASC;IAChE,OAAO,IAAIE,QAAQ,SAACC,SAASC;eAAWH,IAAAA,iBAAM,EAACH,KAAKC,SAAS,SAACM,KAAKC;mBAAWD,MAAMD,OAAOC,OAAOF,QAAQG;;;AAC5G"}
|
package/dist/cjs/registry.js
CHANGED
|
@@ -53,34 +53,79 @@ function _object_spread(target) {
|
|
|
53
53
|
*/ var PROTOCOL_REGISTRY = {
|
|
54
54
|
// Official @keyv adapters
|
|
55
55
|
'redis:': {
|
|
56
|
-
package: '@keyv/redis'
|
|
56
|
+
package: '@keyv/redis',
|
|
57
|
+
mode: 'string'
|
|
57
58
|
},
|
|
58
59
|
'rediss:': {
|
|
59
|
-
package: '@keyv/redis'
|
|
60
|
+
package: '@keyv/redis',
|
|
61
|
+
mode: 'string'
|
|
60
62
|
},
|
|
61
63
|
'postgresql:': {
|
|
62
|
-
package: '@keyv/postgres'
|
|
64
|
+
package: '@keyv/postgres',
|
|
65
|
+
mode: 'options',
|
|
66
|
+
optionsMapper: function(url) {
|
|
67
|
+
return {
|
|
68
|
+
uri: url.toString()
|
|
69
|
+
};
|
|
70
|
+
}
|
|
63
71
|
},
|
|
64
72
|
'postgres:': {
|
|
65
|
-
package: '@keyv/postgres'
|
|
73
|
+
package: '@keyv/postgres',
|
|
74
|
+
mode: 'options',
|
|
75
|
+
optionsMapper: function(url) {
|
|
76
|
+
return {
|
|
77
|
+
uri: url.toString()
|
|
78
|
+
};
|
|
79
|
+
}
|
|
66
80
|
},
|
|
67
81
|
'mysql:': {
|
|
68
|
-
package: '@keyv/mysql'
|
|
82
|
+
package: '@keyv/mysql',
|
|
83
|
+
mode: 'options',
|
|
84
|
+
optionsMapper: function(url) {
|
|
85
|
+
return {
|
|
86
|
+
uri: url.toString()
|
|
87
|
+
};
|
|
88
|
+
}
|
|
69
89
|
},
|
|
70
90
|
'sqlite:': {
|
|
71
|
-
package: '@keyv/sqlite'
|
|
91
|
+
package: '@keyv/sqlite',
|
|
92
|
+
mode: 'options',
|
|
93
|
+
optionsMapper: function(url) {
|
|
94
|
+
return {
|
|
95
|
+
uri: url.toString()
|
|
96
|
+
};
|
|
97
|
+
}
|
|
72
98
|
},
|
|
73
99
|
'mongodb:': {
|
|
74
|
-
package: '@keyv/mongo'
|
|
100
|
+
package: '@keyv/mongo',
|
|
101
|
+
mode: 'options',
|
|
102
|
+
optionsMapper: function(url) {
|
|
103
|
+
return {
|
|
104
|
+
url: url.toString()
|
|
105
|
+
};
|
|
106
|
+
}
|
|
75
107
|
},
|
|
76
108
|
'mongodb+srv:': {
|
|
77
|
-
package: '@keyv/mongo'
|
|
109
|
+
package: '@keyv/mongo',
|
|
110
|
+
mode: 'options',
|
|
111
|
+
optionsMapper: function(url) {
|
|
112
|
+
return {
|
|
113
|
+
url: url.toString()
|
|
114
|
+
};
|
|
115
|
+
}
|
|
78
116
|
},
|
|
79
117
|
'memcache:': {
|
|
80
|
-
package: '@keyv/memcache'
|
|
118
|
+
package: '@keyv/memcache',
|
|
119
|
+
mode: 'string'
|
|
81
120
|
},
|
|
82
121
|
'etcd:': {
|
|
83
|
-
package: '@keyv/etcd'
|
|
122
|
+
package: '@keyv/etcd',
|
|
123
|
+
mode: 'options',
|
|
124
|
+
optionsMapper: function(url) {
|
|
125
|
+
return {
|
|
126
|
+
url: url.toString()
|
|
127
|
+
};
|
|
128
|
+
}
|
|
84
129
|
},
|
|
85
130
|
// Third-party adapters
|
|
86
131
|
'file:': {
|
package/dist/cjs/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/registry.ts"],"sourcesContent":["import type { AdapterConfig } from './types.ts';\nimport { resolveFilePath } from './utils.ts';\n\n/**\n * Protocol registry mapping URI protocols to adapter configurations\n */\nconst PROTOCOL_REGISTRY: Record<string, AdapterConfig> = {\n // Official @keyv adapters\n 'redis:': { package: '@keyv/redis' },\n 'rediss:': { package: '@keyv/redis' },\n 'postgresql:': { package: '@keyv/postgres' },\n 'postgres:': { package: '@keyv/postgres' },\n 'mysql:': { package: '@keyv/mysql' },\n 'sqlite:': { package: '@keyv/sqlite' },\n 'mongodb:': { package: '@keyv/mongo' },\n 'mongodb+srv:': { package: '@keyv/mongo' },\n 'memcache:': { package: '@keyv/memcache' },\n 'etcd:': { package: '@keyv/etcd' },\n\n // Third-party adapters\n 'file:': {\n package: 'keyv-file',\n exportName: 'KeyvFile',\n optionsMapper: (url: URL) => ({ filename: resolveFilePath(url) }),\n },\n\n // Built-in (no package needed)\n 'memory:': { package: null },\n\n // Future/custom adapters\n 'duckdb:': {\n package: 'keyv-duckdb',\n optionsMapper: (url: URL) => ({ filename: resolveFilePath(url) }),\n },\n};\n\n/**\n * Register or override a protocol adapter\n */\nexport function registerAdapter(protocol: string, config: AdapterConfig): void {\n const normalizedProtocol = protocol.endsWith(':') ? protocol : `${protocol}:`;\n PROTOCOL_REGISTRY[normalizedProtocol] = config;\n}\n\n/**\n * Get the current registry (read-only copy)\n */\nexport function getRegistry(): Readonly<Record<string, AdapterConfig>> {\n return { ...PROTOCOL_REGISTRY };\n}\n\n/**\n * Get adapter config for a protocol\n */\nexport function getAdapterConfig(protocol: string): AdapterConfig | undefined {\n return PROTOCOL_REGISTRY[protocol];\n}\n"],"names":["getAdapterConfig","getRegistry","registerAdapter","PROTOCOL_REGISTRY","package","
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/registry.ts"],"sourcesContent":["import type { AdapterConfig } from './types.ts';\nimport { resolveFilePath } from './utils.ts';\n\n/**\n * Protocol registry mapping URI protocols to adapter configurations\n */\nconst PROTOCOL_REGISTRY: Record<string, AdapterConfig> = {\n // Official @keyv adapters\n 'redis:': { package: '@keyv/redis', mode: 'string' },\n 'rediss:': { package: '@keyv/redis', mode: 'string' },\n 'postgresql:': { package: '@keyv/postgres', mode: 'options', optionsMapper: (url) => ({ uri: url.toString() }) },\n 'postgres:': { package: '@keyv/postgres', mode: 'options', optionsMapper: (url) => ({ uri: url.toString() }) },\n 'mysql:': { package: '@keyv/mysql', mode: 'options', optionsMapper: (url) => ({ uri: url.toString() }) },\n 'sqlite:': { package: '@keyv/sqlite', mode: 'options', optionsMapper: (url) => ({ uri: url.toString() }) },\n 'mongodb:': { package: '@keyv/mongo', mode: 'options', optionsMapper: (url) => ({ url: url.toString() }) },\n 'mongodb+srv:': { package: '@keyv/mongo', mode: 'options', optionsMapper: (url) => ({ url: url.toString() }) },\n 'memcache:': { package: '@keyv/memcache', mode: 'string' },\n 'etcd:': { package: '@keyv/etcd', mode: 'options', optionsMapper: (url) => ({ url: url.toString() }) },\n\n // Third-party adapters\n 'file:': {\n package: 'keyv-file',\n exportName: 'KeyvFile',\n optionsMapper: (url: URL) => ({ filename: resolveFilePath(url) }),\n },\n\n // Built-in (no package needed)\n 'memory:': { package: null },\n\n // Future/custom adapters\n 'duckdb:': {\n package: 'keyv-duckdb',\n optionsMapper: (url: URL) => ({ filename: resolveFilePath(url) }),\n },\n};\n\n/**\n * Register or override a protocol adapter\n */\nexport function registerAdapter(protocol: string, config: AdapterConfig): void {\n const normalizedProtocol = protocol.endsWith(':') ? protocol : `${protocol}:`;\n PROTOCOL_REGISTRY[normalizedProtocol] = config;\n}\n\n/**\n * Get the current registry (read-only copy)\n */\nexport function getRegistry(): Readonly<Record<string, AdapterConfig>> {\n return { ...PROTOCOL_REGISTRY };\n}\n\n/**\n * Get adapter config for a protocol\n */\nexport function getAdapterConfig(protocol: string): AdapterConfig | undefined {\n return PROTOCOL_REGISTRY[protocol];\n}\n"],"names":["getAdapterConfig","getRegistry","registerAdapter","PROTOCOL_REGISTRY","package","mode","optionsMapper","url","uri","toString","exportName","filename","resolveFilePath","protocol","config","normalizedProtocol","endsWith"],"mappings":";;;;;;;;;;;QAsDgBA;eAAAA;;QAPAC;eAAAA;;QARAC;eAAAA;;;uBAtCgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEhC;;CAEC,GACD,IAAMC,oBAAmD;IACvD,0BAA0B;IAC1B,UAAU;QAAEC,SAAS;QAAeC,MAAM;IAAS;IACnD,WAAW;QAAED,SAAS;QAAeC,MAAM;IAAS;IACpD,eAAe;QAAED,SAAS;QAAkBC,MAAM;QAAWC,eAAe,SAACC;mBAAS;gBAAEC,KAAKD,IAAIE,QAAQ;YAAG;;IAAG;IAC/G,aAAa;QAAEL,SAAS;QAAkBC,MAAM;QAAWC,eAAe,SAACC;mBAAS;gBAAEC,KAAKD,IAAIE,QAAQ;YAAG;;IAAG;IAC7G,UAAU;QAAEL,SAAS;QAAeC,MAAM;QAAWC,eAAe,SAACC;mBAAS;gBAAEC,KAAKD,IAAIE,QAAQ;YAAG;;IAAG;IACvG,WAAW;QAAEL,SAAS;QAAgBC,MAAM;QAAWC,eAAe,SAACC;mBAAS;gBAAEC,KAAKD,IAAIE,QAAQ;YAAG;;IAAG;IACzG,YAAY;QAAEL,SAAS;QAAeC,MAAM;QAAWC,eAAe,SAACC;mBAAS;gBAAEA,KAAKA,IAAIE,QAAQ;YAAG;;IAAG;IACzG,gBAAgB;QAAEL,SAAS;QAAeC,MAAM;QAAWC,eAAe,SAACC;mBAAS;gBAAEA,KAAKA,IAAIE,QAAQ;YAAG;;IAAG;IAC7G,aAAa;QAAEL,SAAS;QAAkBC,MAAM;IAAS;IACzD,SAAS;QAAED,SAAS;QAAcC,MAAM;QAAWC,eAAe,SAACC;mBAAS;gBAAEA,KAAKA,IAAIE,QAAQ;YAAG;;IAAG;IAErG,uBAAuB;IACvB,SAAS;QACPL,SAAS;QACTM,YAAY;QACZJ,eAAe,SAACC;mBAAc;gBAAEI,UAAUC,IAAAA,wBAAe,EAACL;YAAK;;IACjE;IAEA,+BAA+B;IAC/B,WAAW;QAAEH,SAAS;IAAK;IAE3B,yBAAyB;IACzB,WAAW;QACTA,SAAS;QACTE,eAAe,SAACC;mBAAc;gBAAEI,UAAUC,IAAAA,wBAAe,EAACL;YAAK;;IACjE;AACF;AAKO,SAASL,gBAAgBW,QAAgB,EAAEC,MAAqB;IACrE,IAAMC,qBAAqBF,SAASG,QAAQ,CAAC,OAAOH,WAAW,AAAC,GAAW,OAATA,UAAS;IAC3EV,iBAAiB,CAACY,mBAAmB,GAAGD;AAC1C;AAKO,SAASb;IACd,OAAO,mBAAKE;AACd;AAKO,SAASH,iBAAiBa,QAAgB;IAC/C,OAAOV,iBAAiB,CAACU,SAAS;AACpC"}
|
package/dist/cjs/types.d.cts
CHANGED
|
@@ -7,6 +7,8 @@ export interface AdapterConfig {
|
|
|
7
7
|
package: string | null;
|
|
8
8
|
/** Named export from the package (default: 'default') */
|
|
9
9
|
exportName?: string;
|
|
10
|
+
/** How to instantiate the adapter */
|
|
11
|
+
mode?: 'string' | 'options';
|
|
10
12
|
/** Custom function to map URL to adapter options */
|
|
11
13
|
optionsMapper?: (url: URL) => Record<string, unknown>;
|
|
12
14
|
}
|
package/dist/cjs/types.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export interface AdapterConfig {
|
|
|
7
7
|
package: string | null;
|
|
8
8
|
/** Named export from the package (default: 'default') */
|
|
9
9
|
exportName?: string;
|
|
10
|
+
/** How to instantiate the adapter */
|
|
11
|
+
mode?: 'string' | 'options';
|
|
10
12
|
/** Custom function to map URL to adapter options */
|
|
11
13
|
optionsMapper?: (url: URL) => Record<string, unknown>;
|
|
12
14
|
}
|
package/dist/cjs/worker.js
CHANGED
|
@@ -124,18 +124,24 @@ function worker(uri, options, callback) {
|
|
|
124
124
|
var _ref;
|
|
125
125
|
var _config_optionsMapper;
|
|
126
126
|
// Build adapter options: URI params + custom mapper + user options
|
|
127
|
-
var adapterOptions = _object_spread({}, (0, _utilsts.parseUriOptions)(url), (_ref = (_config_optionsMapper = config.optionsMapper) === null || _config_optionsMapper === void 0 ? void 0 : _config_optionsMapper.call(config, url)) !== null && _ref !== void 0 ? _ref : {
|
|
128
|
-
uri: uri
|
|
129
|
-
}, options);
|
|
127
|
+
var adapterOptions = _object_spread({}, (0, _utilsts.parseUriOptions)(url), (_ref = (_config_optionsMapper = config.optionsMapper) === null || _config_optionsMapper === void 0 ? void 0 : _config_optionsMapper.call(config, url)) !== null && _ref !== void 0 ? _ref : {}, options);
|
|
130
128
|
// Remove store from adapter options to avoid confusion
|
|
131
129
|
var _ = adapterOptions.store, cleanAdapterOptions = _object_without_properties(adapterOptions, [
|
|
132
130
|
"store"
|
|
133
131
|
]);
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
132
|
+
if (config.mode === 'string') {
|
|
133
|
+
var storeInstance = new AdapterClass(uri, cleanAdapterOptions);
|
|
134
|
+
var keyv = new _keyv.default(_object_spread({
|
|
135
|
+
store: storeInstance
|
|
136
|
+
}, options));
|
|
137
|
+
callback(null, keyv);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
var storeInstance1 = new AdapterClass(cleanAdapterOptions);
|
|
141
|
+
var keyv1 = new _keyv.default(_object_spread({
|
|
142
|
+
store: storeInstance1
|
|
137
143
|
}, options));
|
|
138
|
-
callback(null,
|
|
144
|
+
callback(null, keyv1);
|
|
139
145
|
} catch (createErr) {
|
|
140
146
|
callback(createErr);
|
|
141
147
|
}
|
package/dist/cjs/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/worker.ts"],"sourcesContent":["import Keyv from 'keyv';\nimport loadAdapter from './loadAdapter.ts';\nimport { getAdapterConfig } from './registry.ts';\nimport type { CreateStoreCallback, CreateStoreOptions } from './types.ts';\nimport { parseUriOptions } from './utils.ts';\n\n/**\n * Core worker function that creates a Keyv store\n */\nexport default function worker<T>(uri: string, options: CreateStoreOptions, callback: CreateStoreCallback<T>): void {\n // Passthrough: pre-instantiated adapter provided\n if (options.store) {\n try {\n const keyv = new Keyv<T>({ ...options });\n callback(null, keyv);\n } catch (err) {\n callback(err as Error);\n }\n return;\n }\n\n // Parse URI\n let url: URL;\n try {\n url = new URL(uri);\n } catch (_err) {\n callback(new Error(`Invalid URI: ${uri}`));\n return;\n }\n\n const config = getAdapterConfig(url.protocol);\n\n if (!config) {\n callback(new Error(`Unknown protocol: ${url.protocol}. Use registerAdapter() to add support.`));\n return;\n }\n\n // Memory store - no package needed\n if (config.package === null) {\n try {\n const keyv = new Keyv<T>({ ...parseUriOptions(url), ...options });\n callback(null, keyv);\n } catch (err) {\n callback(err as Error);\n }\n return;\n }\n\n // Load adapter (install if needed)\n loadAdapter(config.package, config.exportName, (err, AdapterClass) => {\n if (err) return callback(err);\n\n try {\n // Build adapter options: URI params + custom mapper + user options\n const adapterOptions = {\n ...parseUriOptions(url),\n ...(config.optionsMapper?.(url) ?? {
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/worker.ts"],"sourcesContent":["import Keyv from 'keyv';\nimport loadAdapter from './loadAdapter.ts';\nimport { getAdapterConfig } from './registry.ts';\nimport type { CreateStoreCallback, CreateStoreOptions } from './types.ts';\nimport { parseUriOptions } from './utils.ts';\n\n/**\n * Core worker function that creates a Keyv store\n */\nexport default function worker<T>(uri: string, options: CreateStoreOptions, callback: CreateStoreCallback<T>): void {\n // Passthrough: pre-instantiated adapter provided\n if (options.store) {\n try {\n const keyv = new Keyv<T>({ ...options });\n callback(null, keyv);\n } catch (err) {\n callback(err as Error);\n }\n return;\n }\n\n // Parse URI\n let url: URL;\n try {\n url = new URL(uri);\n } catch (_err) {\n callback(new Error(`Invalid URI: ${uri}`));\n return;\n }\n\n const config = getAdapterConfig(url.protocol);\n\n if (!config) {\n callback(new Error(`Unknown protocol: ${url.protocol}. Use registerAdapter() to add support.`));\n return;\n }\n\n // Memory store - no package needed\n if (config.package === null) {\n try {\n const keyv = new Keyv<T>({ ...parseUriOptions(url), ...options });\n callback(null, keyv);\n } catch (err) {\n callback(err as Error);\n }\n return;\n }\n\n // Load adapter (install if needed)\n loadAdapter(config.package, config.exportName, (err, AdapterClass) => {\n if (err) return callback(err);\n\n try {\n // Build adapter options: URI params + custom mapper + user options\n const adapterOptions = {\n ...parseUriOptions(url),\n ...(config.optionsMapper?.(url) ?? {}),\n ...options,\n };\n\n // Remove store from adapter options to avoid confusion\n const { store: _, ...cleanAdapterOptions } = adapterOptions;\n\n if (config.mode === 'string') {\n const storeInstance = new (AdapterClass as new (uri: string, options: Record<string, unknown>) => unknown)(uri, cleanAdapterOptions);\n const keyv = new Keyv<T>({ store: storeInstance, ...options });\n callback(null, keyv);\n return;\n }\n\n const storeInstance = new (AdapterClass as new (options: Record<string, unknown>) => unknown)(cleanAdapterOptions);\n const keyv = new Keyv<T>({ store: storeInstance, ...options });\n\n callback(null, keyv);\n } catch (createErr) {\n callback(createErr as Error);\n }\n });\n}\n"],"names":["worker","uri","options","callback","store","keyv","Keyv","err","url","URL","_err","Error","config","getAdapterConfig","protocol","package","parseUriOptions","loadAdapter","exportName","AdapterClass","adapterOptions","optionsMapper","_","cleanAdapterOptions","mode","storeInstance","createErr"],"mappings":";;;;+BAMA;;CAEC,GACD;;;eAAwBA;;;2DATP;oEACO;0BACS;uBAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKjB,SAASA,OAAUC,GAAW,EAAEC,OAA2B,EAAEC,QAAgC;IAC1G,iDAAiD;IACjD,IAAID,QAAQE,KAAK,EAAE;QACjB,IAAI;YACF,IAAMC,OAAO,IAAIC,aAAI,CAAI,mBAAKJ;YAC9BC,SAAS,MAAME;QACjB,EAAE,OAAOE,KAAK;YACZJ,SAASI;QACX;QACA;IACF;IAEA,YAAY;IACZ,IAAIC;IACJ,IAAI;QACFA,MAAM,IAAIC,IAAIR;IAChB,EAAE,OAAOS,MAAM;QACbP,SAAS,IAAIQ,MAAM,AAAC,gBAAmB,OAAJV;QACnC;IACF;IAEA,IAAMW,SAASC,IAAAA,4BAAgB,EAACL,IAAIM,QAAQ;IAE5C,IAAI,CAACF,QAAQ;QACXT,SAAS,IAAIQ,MAAM,AAAC,qBAAiC,OAAbH,IAAIM,QAAQ,EAAC;QACrD;IACF;IAEA,mCAAmC;IACnC,IAAIF,OAAOG,OAAO,KAAK,MAAM;QAC3B,IAAI;YACF,IAAMV,QAAO,IAAIC,aAAI,CAAI,mBAAKU,IAAAA,wBAAe,EAACR,MAASN;YACvDC,SAAS,MAAME;QACjB,EAAE,OAAOE,KAAK;YACZJ,SAASI;QACX;QACA;IACF;IAEA,mCAAmC;IACnCU,IAAAA,sBAAW,EAACL,OAAOG,OAAO,EAAEH,OAAOM,UAAU,EAAE,SAACX,KAAKY;QACnD,IAAIZ,KAAK,OAAOJ,SAASI;QAEzB,IAAI;;gBAIIK;YAHN,mEAAmE;YACnE,IAAMQ,iBAAiB,mBAClBJ,IAAAA,wBAAe,EAACR,eACfI,wBAAAA,OAAOS,aAAa,cAApBT,4CAAAA,2BAAAA,QAAuBJ,2CAAQ,CAAC,GACjCN;YAGL,uDAAuD;YACvD,IAAQE,AAAOkB,IAA8BF,eAArChB,OAAamB,iDAAwBH;;;YAE7C,IAAIR,OAAOY,IAAI,KAAK,UAAU;gBAC5B,IAAMC,gBAAgB,IAAKN,aAAgFlB,KAAKsB;gBAChH,IAAMlB,OAAO,IAAIC,aAAI,CAAI;oBAAEF,OAAOqB;mBAAkBvB;gBACpDC,SAAS,MAAME;gBACf;YACF;YAEA,IAAMoB,iBAAgB,IAAKN,aAAmEI;YAC9F,IAAMlB,QAAO,IAAIC,aAAI,CAAI;gBAAEF,OAAOqB;eAAkBvB;YAEpDC,SAAS,MAAME;QACjB,EAAE,OAAOqB,WAAW;YAClBvB,SAASuB;QACX;IACF;AACF"}
|
package/dist/esm/index.js
CHANGED
|
@@ -5,7 +5,5 @@ export default function createStore(uri, options, callback) {
|
|
|
5
5
|
callback = typeof options === 'function' ? options : callback;
|
|
6
6
|
options = typeof options === 'function' ? {} : options || {};
|
|
7
7
|
if (typeof callback === 'function') return worker(uri, options, callback);
|
|
8
|
-
return new Promise((resolve, reject)=>
|
|
9
|
-
worker(uri, options, (err, store)=>err ? reject(err) : resolve(store));
|
|
10
|
-
});
|
|
8
|
+
return new Promise((resolve, reject)=>worker(uri, options, (err, store)=>err ? reject(err) : resolve(store)));
|
|
11
9
|
}
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/index.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport type { CreateStoreCallback, CreateStoreOptions } from './types.ts';\nimport worker from './worker.ts';\n\nexport { clearAdapterCache } from './loadAdapter.ts';\nexport { getRegistry, registerAdapter } from './registry.ts';\nexport type { AdapterConfig, CreateStoreCallback, CreateStoreOptions } from './types.ts';\n\n/**\n * Create a Keyv store from a URI string\n *\n * Supports dual-boot API (callback or Promise):\n *\n * @example\n * // Promise API\n * const store = await createStore('redis://localhost:6379');\n * const file = await createStore('file://~/.cache/app/data.json');\n * const memory = await createStore('memory://');\n *\n * @example\n * // Callback API\n * createStore('redis://localhost:6379', (err, store) => {\n * if (err) throw err;\n * // use store\n * });\n *\n * @example\n * // With options\n * const store = await createStore('redis://localhost:6379', {\n * namespace: 'myapp',\n * ttl: 60000\n * });\n *\n * @example\n * // Pre-instantiated adapter passthrough\n * import KeyvRedis from '@keyv/redis';\n * const redis = new KeyvRedis('redis://localhost:6379');\n * const store = await createStore('redis://ignored', { store: redis });\n */\nexport default function createStore<T>(uri: string, callback: CreateStoreCallback<T>): void;\nexport default function createStore<T>(uri: string, options: CreateStoreOptions, callback: CreateStoreCallback<T>): void;\nexport default function createStore<T>(uri: string, options?: CreateStoreOptions): Promise<Keyv<T>>;\nexport default function createStore<T>(uri: string, options?: CreateStoreOptions | CreateStoreCallback<T>, callback?: CreateStoreCallback<T>): void | Promise<Keyv<T>> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as CreateStoreOptions);\n\n if (typeof callback === 'function') return worker(uri, options, callback);\n return new Promise((resolve, reject) =>
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/index.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport type { CreateStoreCallback, CreateStoreOptions } from './types.ts';\nimport worker from './worker.ts';\n\nexport { clearAdapterCache } from './loadAdapter.ts';\nexport { getRegistry, registerAdapter } from './registry.ts';\nexport type { AdapterConfig, CreateStoreCallback, CreateStoreOptions } from './types.ts';\n\n/**\n * Create a Keyv store from a URI string\n *\n * Supports dual-boot API (callback or Promise):\n *\n * @example\n * // Promise API\n * const store = await createStore('redis://localhost:6379');\n * const file = await createStore('file://~/.cache/app/data.json');\n * const memory = await createStore('memory://');\n *\n * @example\n * // Callback API\n * createStore('redis://localhost:6379', (err, store) => {\n * if (err) throw err;\n * // use store\n * });\n *\n * @example\n * // With options\n * const store = await createStore('redis://localhost:6379', {\n * namespace: 'myapp',\n * ttl: 60000\n * });\n *\n * @example\n * // Pre-instantiated adapter passthrough\n * import KeyvRedis from '@keyv/redis';\n * const redis = new KeyvRedis('redis://localhost:6379');\n * const store = await createStore('redis://ignored', { store: redis });\n */\nexport default function createStore<T>(uri: string, callback: CreateStoreCallback<T>): void;\nexport default function createStore<T>(uri: string, options: CreateStoreOptions, callback: CreateStoreCallback<T>): void;\nexport default function createStore<T>(uri: string, options?: CreateStoreOptions): Promise<Keyv<T>>;\nexport default function createStore<T>(uri: string, options?: CreateStoreOptions | CreateStoreCallback<T>, callback?: CreateStoreCallback<T>): void | Promise<Keyv<T>> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as CreateStoreOptions);\n\n if (typeof callback === 'function') return worker(uri, options, callback);\n return new Promise((resolve, reject) => worker(uri, options, (err, store) => (err ? reject(err) : resolve(store as Keyv<T>))));\n}\n"],"names":["worker","clearAdapterCache","getRegistry","registerAdapter","createStore","uri","options","callback","Promise","resolve","reject","err","store"],"mappings":"AAEA,OAAOA,YAAY,cAAc;AAEjC,SAASC,iBAAiB,QAAQ,mBAAmB;AACrD,SAASC,WAAW,EAAEC,eAAe,QAAQ,gBAAgB;AAqC7D,eAAe,SAASC,YAAeC,GAAW,EAAEC,OAAqD,EAAEC,QAAiC;IAC1IA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;IACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;IAE7D,IAAI,OAAOC,aAAa,YAAY,OAAOP,OAAOK,KAAKC,SAASC;IAChE,OAAO,IAAIC,QAAQ,CAACC,SAASC,SAAWV,OAAOK,KAAKC,SAAS,CAACK,KAAKC,QAAWD,MAAMD,OAAOC,OAAOF,QAAQG;AAC5G"}
|
package/dist/esm/registry.js
CHANGED
|
@@ -4,34 +4,65 @@ import { resolveFilePath } from './utils.js';
|
|
|
4
4
|
*/ const PROTOCOL_REGISTRY = {
|
|
5
5
|
// Official @keyv adapters
|
|
6
6
|
'redis:': {
|
|
7
|
-
package: '@keyv/redis'
|
|
7
|
+
package: '@keyv/redis',
|
|
8
|
+
mode: 'string'
|
|
8
9
|
},
|
|
9
10
|
'rediss:': {
|
|
10
|
-
package: '@keyv/redis'
|
|
11
|
+
package: '@keyv/redis',
|
|
12
|
+
mode: 'string'
|
|
11
13
|
},
|
|
12
14
|
'postgresql:': {
|
|
13
|
-
package: '@keyv/postgres'
|
|
15
|
+
package: '@keyv/postgres',
|
|
16
|
+
mode: 'options',
|
|
17
|
+
optionsMapper: (url)=>({
|
|
18
|
+
uri: url.toString()
|
|
19
|
+
})
|
|
14
20
|
},
|
|
15
21
|
'postgres:': {
|
|
16
|
-
package: '@keyv/postgres'
|
|
22
|
+
package: '@keyv/postgres',
|
|
23
|
+
mode: 'options',
|
|
24
|
+
optionsMapper: (url)=>({
|
|
25
|
+
uri: url.toString()
|
|
26
|
+
})
|
|
17
27
|
},
|
|
18
28
|
'mysql:': {
|
|
19
|
-
package: '@keyv/mysql'
|
|
29
|
+
package: '@keyv/mysql',
|
|
30
|
+
mode: 'options',
|
|
31
|
+
optionsMapper: (url)=>({
|
|
32
|
+
uri: url.toString()
|
|
33
|
+
})
|
|
20
34
|
},
|
|
21
35
|
'sqlite:': {
|
|
22
|
-
package: '@keyv/sqlite'
|
|
36
|
+
package: '@keyv/sqlite',
|
|
37
|
+
mode: 'options',
|
|
38
|
+
optionsMapper: (url)=>({
|
|
39
|
+
uri: url.toString()
|
|
40
|
+
})
|
|
23
41
|
},
|
|
24
42
|
'mongodb:': {
|
|
25
|
-
package: '@keyv/mongo'
|
|
43
|
+
package: '@keyv/mongo',
|
|
44
|
+
mode: 'options',
|
|
45
|
+
optionsMapper: (url)=>({
|
|
46
|
+
url: url.toString()
|
|
47
|
+
})
|
|
26
48
|
},
|
|
27
49
|
'mongodb+srv:': {
|
|
28
|
-
package: '@keyv/mongo'
|
|
50
|
+
package: '@keyv/mongo',
|
|
51
|
+
mode: 'options',
|
|
52
|
+
optionsMapper: (url)=>({
|
|
53
|
+
url: url.toString()
|
|
54
|
+
})
|
|
29
55
|
},
|
|
30
56
|
'memcache:': {
|
|
31
|
-
package: '@keyv/memcache'
|
|
57
|
+
package: '@keyv/memcache',
|
|
58
|
+
mode: 'string'
|
|
32
59
|
},
|
|
33
60
|
'etcd:': {
|
|
34
|
-
package: '@keyv/etcd'
|
|
61
|
+
package: '@keyv/etcd',
|
|
62
|
+
mode: 'options',
|
|
63
|
+
optionsMapper: (url)=>({
|
|
64
|
+
url: url.toString()
|
|
65
|
+
})
|
|
35
66
|
},
|
|
36
67
|
// Third-party adapters
|
|
37
68
|
'file:': {
|
package/dist/esm/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/registry.ts"],"sourcesContent":["import type { AdapterConfig } from './types.ts';\nimport { resolveFilePath } from './utils.ts';\n\n/**\n * Protocol registry mapping URI protocols to adapter configurations\n */\nconst PROTOCOL_REGISTRY: Record<string, AdapterConfig> = {\n // Official @keyv adapters\n 'redis:': { package: '@keyv/redis' },\n 'rediss:': { package: '@keyv/redis' },\n 'postgresql:': { package: '@keyv/postgres' },\n 'postgres:': { package: '@keyv/postgres' },\n 'mysql:': { package: '@keyv/mysql' },\n 'sqlite:': { package: '@keyv/sqlite' },\n 'mongodb:': { package: '@keyv/mongo' },\n 'mongodb+srv:': { package: '@keyv/mongo' },\n 'memcache:': { package: '@keyv/memcache' },\n 'etcd:': { package: '@keyv/etcd' },\n\n // Third-party adapters\n 'file:': {\n package: 'keyv-file',\n exportName: 'KeyvFile',\n optionsMapper: (url: URL) => ({ filename: resolveFilePath(url) }),\n },\n\n // Built-in (no package needed)\n 'memory:': { package: null },\n\n // Future/custom adapters\n 'duckdb:': {\n package: 'keyv-duckdb',\n optionsMapper: (url: URL) => ({ filename: resolveFilePath(url) }),\n },\n};\n\n/**\n * Register or override a protocol adapter\n */\nexport function registerAdapter(protocol: string, config: AdapterConfig): void {\n const normalizedProtocol = protocol.endsWith(':') ? protocol : `${protocol}:`;\n PROTOCOL_REGISTRY[normalizedProtocol] = config;\n}\n\n/**\n * Get the current registry (read-only copy)\n */\nexport function getRegistry(): Readonly<Record<string, AdapterConfig>> {\n return { ...PROTOCOL_REGISTRY };\n}\n\n/**\n * Get adapter config for a protocol\n */\nexport function getAdapterConfig(protocol: string): AdapterConfig | undefined {\n return PROTOCOL_REGISTRY[protocol];\n}\n"],"names":["resolveFilePath","PROTOCOL_REGISTRY","package","
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/registry.ts"],"sourcesContent":["import type { AdapterConfig } from './types.ts';\nimport { resolveFilePath } from './utils.ts';\n\n/**\n * Protocol registry mapping URI protocols to adapter configurations\n */\nconst PROTOCOL_REGISTRY: Record<string, AdapterConfig> = {\n // Official @keyv adapters\n 'redis:': { package: '@keyv/redis', mode: 'string' },\n 'rediss:': { package: '@keyv/redis', mode: 'string' },\n 'postgresql:': { package: '@keyv/postgres', mode: 'options', optionsMapper: (url) => ({ uri: url.toString() }) },\n 'postgres:': { package: '@keyv/postgres', mode: 'options', optionsMapper: (url) => ({ uri: url.toString() }) },\n 'mysql:': { package: '@keyv/mysql', mode: 'options', optionsMapper: (url) => ({ uri: url.toString() }) },\n 'sqlite:': { package: '@keyv/sqlite', mode: 'options', optionsMapper: (url) => ({ uri: url.toString() }) },\n 'mongodb:': { package: '@keyv/mongo', mode: 'options', optionsMapper: (url) => ({ url: url.toString() }) },\n 'mongodb+srv:': { package: '@keyv/mongo', mode: 'options', optionsMapper: (url) => ({ url: url.toString() }) },\n 'memcache:': { package: '@keyv/memcache', mode: 'string' },\n 'etcd:': { package: '@keyv/etcd', mode: 'options', optionsMapper: (url) => ({ url: url.toString() }) },\n\n // Third-party adapters\n 'file:': {\n package: 'keyv-file',\n exportName: 'KeyvFile',\n optionsMapper: (url: URL) => ({ filename: resolveFilePath(url) }),\n },\n\n // Built-in (no package needed)\n 'memory:': { package: null },\n\n // Future/custom adapters\n 'duckdb:': {\n package: 'keyv-duckdb',\n optionsMapper: (url: URL) => ({ filename: resolveFilePath(url) }),\n },\n};\n\n/**\n * Register or override a protocol adapter\n */\nexport function registerAdapter(protocol: string, config: AdapterConfig): void {\n const normalizedProtocol = protocol.endsWith(':') ? protocol : `${protocol}:`;\n PROTOCOL_REGISTRY[normalizedProtocol] = config;\n}\n\n/**\n * Get the current registry (read-only copy)\n */\nexport function getRegistry(): Readonly<Record<string, AdapterConfig>> {\n return { ...PROTOCOL_REGISTRY };\n}\n\n/**\n * Get adapter config for a protocol\n */\nexport function getAdapterConfig(protocol: string): AdapterConfig | undefined {\n return PROTOCOL_REGISTRY[protocol];\n}\n"],"names":["resolveFilePath","PROTOCOL_REGISTRY","package","mode","optionsMapper","url","uri","toString","exportName","filename","registerAdapter","protocol","config","normalizedProtocol","endsWith","getRegistry","getAdapterConfig"],"mappings":"AACA,SAASA,eAAe,QAAQ,aAAa;AAE7C;;CAEC,GACD,MAAMC,oBAAmD;IACvD,0BAA0B;IAC1B,UAAU;QAAEC,SAAS;QAAeC,MAAM;IAAS;IACnD,WAAW;QAAED,SAAS;QAAeC,MAAM;IAAS;IACpD,eAAe;QAAED,SAAS;QAAkBC,MAAM;QAAWC,eAAe,CAACC,MAAS,CAAA;gBAAEC,KAAKD,IAAIE,QAAQ;YAAG,CAAA;IAAG;IAC/G,aAAa;QAAEL,SAAS;QAAkBC,MAAM;QAAWC,eAAe,CAACC,MAAS,CAAA;gBAAEC,KAAKD,IAAIE,QAAQ;YAAG,CAAA;IAAG;IAC7G,UAAU;QAAEL,SAAS;QAAeC,MAAM;QAAWC,eAAe,CAACC,MAAS,CAAA;gBAAEC,KAAKD,IAAIE,QAAQ;YAAG,CAAA;IAAG;IACvG,WAAW;QAAEL,SAAS;QAAgBC,MAAM;QAAWC,eAAe,CAACC,MAAS,CAAA;gBAAEC,KAAKD,IAAIE,QAAQ;YAAG,CAAA;IAAG;IACzG,YAAY;QAAEL,SAAS;QAAeC,MAAM;QAAWC,eAAe,CAACC,MAAS,CAAA;gBAAEA,KAAKA,IAAIE,QAAQ;YAAG,CAAA;IAAG;IACzG,gBAAgB;QAAEL,SAAS;QAAeC,MAAM;QAAWC,eAAe,CAACC,MAAS,CAAA;gBAAEA,KAAKA,IAAIE,QAAQ;YAAG,CAAA;IAAG;IAC7G,aAAa;QAAEL,SAAS;QAAkBC,MAAM;IAAS;IACzD,SAAS;QAAED,SAAS;QAAcC,MAAM;QAAWC,eAAe,CAACC,MAAS,CAAA;gBAAEA,KAAKA,IAAIE,QAAQ;YAAG,CAAA;IAAG;IAErG,uBAAuB;IACvB,SAAS;QACPL,SAAS;QACTM,YAAY;QACZJ,eAAe,CAACC,MAAc,CAAA;gBAAEI,UAAUT,gBAAgBK;YAAK,CAAA;IACjE;IAEA,+BAA+B;IAC/B,WAAW;QAAEH,SAAS;IAAK;IAE3B,yBAAyB;IACzB,WAAW;QACTA,SAAS;QACTE,eAAe,CAACC,MAAc,CAAA;gBAAEI,UAAUT,gBAAgBK;YAAK,CAAA;IACjE;AACF;AAEA;;CAEC,GACD,OAAO,SAASK,gBAAgBC,QAAgB,EAAEC,MAAqB;IACrE,MAAMC,qBAAqBF,SAASG,QAAQ,CAAC,OAAOH,WAAW,GAAGA,SAAS,CAAC,CAAC;IAC7EV,iBAAiB,CAACY,mBAAmB,GAAGD;AAC1C;AAEA;;CAEC,GACD,OAAO,SAASG;IACd,OAAO;QAAE,GAAGd,iBAAiB;IAAC;AAChC;AAEA;;CAEC,GACD,OAAO,SAASe,iBAAiBL,QAAgB;IAC/C,OAAOV,iBAAiB,CAACU,SAAS;AACpC"}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export interface AdapterConfig {
|
|
|
7
7
|
package: string | null;
|
|
8
8
|
/** Named export from the package (default: 'default') */
|
|
9
9
|
exportName?: string;
|
|
10
|
+
/** How to instantiate the adapter */
|
|
11
|
+
mode?: 'string' | 'options';
|
|
10
12
|
/** Custom function to map URL to adapter options */
|
|
11
13
|
optionsMapper?: (url: URL) => Record<string, unknown>;
|
|
12
14
|
}
|
package/dist/esm/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/types.ts"],"sourcesContent":["import type Keyv from 'keyv';\n\n/**\n * Configuration for a protocol adapter\n */\nexport interface AdapterConfig {\n /** npm package name, or null for built-in adapters */\n package: string | null;\n /** Named export from the package (default: 'default') */\n exportName?: string;\n /** Custom function to map URL to adapter options */\n optionsMapper?: (url: URL) => Record<string, unknown>;\n}\n\n/**\n * Options for createStore\n */\nexport interface CreateStoreOptions {\n /** Pre-instantiated adapter (bypasses URI loading) */\n store?: unknown;\n /** Keyv namespace */\n namespace?: string;\n /** Default TTL in milliseconds */\n ttl?: number;\n /** Additional Keyv options */\n [key: string]: unknown;\n}\n\n/**\n * Callback type for createStore\n */\nexport type CreateStoreCallback<T> = (err: Error | null, store?: Keyv<T>) => void;\n\n/**\n * Internal callback type for loadAdapter\n */\nexport type LoadAdapterCallback = (err: Error | null, Adapter?: unknown) => void;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/types.ts"],"sourcesContent":["import type Keyv from 'keyv';\n\n/**\n * Configuration for a protocol adapter\n */\nexport interface AdapterConfig {\n /** npm package name, or null for built-in adapters */\n package: string | null;\n /** Named export from the package (default: 'default') */\n exportName?: string;\n /** How to instantiate the adapter */\n mode?: 'string' | 'options';\n /** Custom function to map URL to adapter options */\n optionsMapper?: (url: URL) => Record<string, unknown>;\n}\n\n/**\n * Options for createStore\n */\nexport interface CreateStoreOptions {\n /** Pre-instantiated adapter (bypasses URI loading) */\n store?: unknown;\n /** Keyv namespace */\n namespace?: string;\n /** Default TTL in milliseconds */\n ttl?: number;\n /** Additional Keyv options */\n [key: string]: unknown;\n}\n\n/**\n * Callback type for createStore\n */\nexport type CreateStoreCallback<T> = (err: Error | null, store?: Keyv<T>) => void;\n\n/**\n * Internal callback type for loadAdapter\n */\nexport type LoadAdapterCallback = (err: Error | null, Adapter?: unknown) => void;\n"],"names":[],"mappings":"AAmCA;;CAEC,GACD,WAAiF"}
|
package/dist/esm/worker.js
CHANGED
|
@@ -52,13 +52,20 @@ import { parseUriOptions } from './utils.js';
|
|
|
52
52
|
// Build adapter options: URI params + custom mapper + user options
|
|
53
53
|
const adapterOptions = {
|
|
54
54
|
...parseUriOptions(url),
|
|
55
|
-
...(_ref = (_config_optionsMapper = config.optionsMapper) === null || _config_optionsMapper === void 0 ? void 0 : _config_optionsMapper.call(config, url)) !== null && _ref !== void 0 ? _ref : {
|
|
56
|
-
uri
|
|
57
|
-
},
|
|
55
|
+
...(_ref = (_config_optionsMapper = config.optionsMapper) === null || _config_optionsMapper === void 0 ? void 0 : _config_optionsMapper.call(config, url)) !== null && _ref !== void 0 ? _ref : {},
|
|
58
56
|
...options
|
|
59
57
|
};
|
|
60
58
|
// Remove store from adapter options to avoid confusion
|
|
61
59
|
const { store: _, ...cleanAdapterOptions } = adapterOptions;
|
|
60
|
+
if (config.mode === 'string') {
|
|
61
|
+
const storeInstance = new AdapterClass(uri, cleanAdapterOptions);
|
|
62
|
+
const keyv = new Keyv({
|
|
63
|
+
store: storeInstance,
|
|
64
|
+
...options
|
|
65
|
+
});
|
|
66
|
+
callback(null, keyv);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
62
69
|
const storeInstance = new AdapterClass(cleanAdapterOptions);
|
|
63
70
|
const keyv = new Keyv({
|
|
64
71
|
store: storeInstance,
|
package/dist/esm/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/worker.ts"],"sourcesContent":["import Keyv from 'keyv';\nimport loadAdapter from './loadAdapter.ts';\nimport { getAdapterConfig } from './registry.ts';\nimport type { CreateStoreCallback, CreateStoreOptions } from './types.ts';\nimport { parseUriOptions } from './utils.ts';\n\n/**\n * Core worker function that creates a Keyv store\n */\nexport default function worker<T>(uri: string, options: CreateStoreOptions, callback: CreateStoreCallback<T>): void {\n // Passthrough: pre-instantiated adapter provided\n if (options.store) {\n try {\n const keyv = new Keyv<T>({ ...options });\n callback(null, keyv);\n } catch (err) {\n callback(err as Error);\n }\n return;\n }\n\n // Parse URI\n let url: URL;\n try {\n url = new URL(uri);\n } catch (_err) {\n callback(new Error(`Invalid URI: ${uri}`));\n return;\n }\n\n const config = getAdapterConfig(url.protocol);\n\n if (!config) {\n callback(new Error(`Unknown protocol: ${url.protocol}. Use registerAdapter() to add support.`));\n return;\n }\n\n // Memory store - no package needed\n if (config.package === null) {\n try {\n const keyv = new Keyv<T>({ ...parseUriOptions(url), ...options });\n callback(null, keyv);\n } catch (err) {\n callback(err as Error);\n }\n return;\n }\n\n // Load adapter (install if needed)\n loadAdapter(config.package, config.exportName, (err, AdapterClass) => {\n if (err) return callback(err);\n\n try {\n // Build adapter options: URI params + custom mapper + user options\n const adapterOptions = {\n ...parseUriOptions(url),\n ...(config.optionsMapper?.(url) ?? {
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/worker.ts"],"sourcesContent":["import Keyv from 'keyv';\nimport loadAdapter from './loadAdapter.ts';\nimport { getAdapterConfig } from './registry.ts';\nimport type { CreateStoreCallback, CreateStoreOptions } from './types.ts';\nimport { parseUriOptions } from './utils.ts';\n\n/**\n * Core worker function that creates a Keyv store\n */\nexport default function worker<T>(uri: string, options: CreateStoreOptions, callback: CreateStoreCallback<T>): void {\n // Passthrough: pre-instantiated adapter provided\n if (options.store) {\n try {\n const keyv = new Keyv<T>({ ...options });\n callback(null, keyv);\n } catch (err) {\n callback(err as Error);\n }\n return;\n }\n\n // Parse URI\n let url: URL;\n try {\n url = new URL(uri);\n } catch (_err) {\n callback(new Error(`Invalid URI: ${uri}`));\n return;\n }\n\n const config = getAdapterConfig(url.protocol);\n\n if (!config) {\n callback(new Error(`Unknown protocol: ${url.protocol}. Use registerAdapter() to add support.`));\n return;\n }\n\n // Memory store - no package needed\n if (config.package === null) {\n try {\n const keyv = new Keyv<T>({ ...parseUriOptions(url), ...options });\n callback(null, keyv);\n } catch (err) {\n callback(err as Error);\n }\n return;\n }\n\n // Load adapter (install if needed)\n loadAdapter(config.package, config.exportName, (err, AdapterClass) => {\n if (err) return callback(err);\n\n try {\n // Build adapter options: URI params + custom mapper + user options\n const adapterOptions = {\n ...parseUriOptions(url),\n ...(config.optionsMapper?.(url) ?? {}),\n ...options,\n };\n\n // Remove store from adapter options to avoid confusion\n const { store: _, ...cleanAdapterOptions } = adapterOptions;\n\n if (config.mode === 'string') {\n const storeInstance = new (AdapterClass as new (uri: string, options: Record<string, unknown>) => unknown)(uri, cleanAdapterOptions);\n const keyv = new Keyv<T>({ store: storeInstance, ...options });\n callback(null, keyv);\n return;\n }\n\n const storeInstance = new (AdapterClass as new (options: Record<string, unknown>) => unknown)(cleanAdapterOptions);\n const keyv = new Keyv<T>({ store: storeInstance, ...options });\n\n callback(null, keyv);\n } catch (createErr) {\n callback(createErr as Error);\n }\n });\n}\n"],"names":["Keyv","loadAdapter","getAdapterConfig","parseUriOptions","worker","uri","options","callback","store","keyv","err","url","URL","_err","Error","config","protocol","package","exportName","AdapterClass","adapterOptions","optionsMapper","_","cleanAdapterOptions","mode","storeInstance","createErr"],"mappings":"AAAA,OAAOA,UAAU,OAAO;AACxB,OAAOC,iBAAiB,mBAAmB;AAC3C,SAASC,gBAAgB,QAAQ,gBAAgB;AAEjD,SAASC,eAAe,QAAQ,aAAa;AAE7C;;CAEC,GACD,eAAe,SAASC,OAAUC,GAAW,EAAEC,OAA2B,EAAEC,QAAgC;IAC1G,iDAAiD;IACjD,IAAID,QAAQE,KAAK,EAAE;QACjB,IAAI;YACF,MAAMC,OAAO,IAAIT,KAAQ;gBAAE,GAAGM,OAAO;YAAC;YACtCC,SAAS,MAAME;QACjB,EAAE,OAAOC,KAAK;YACZH,SAASG;QACX;QACA;IACF;IAEA,YAAY;IACZ,IAAIC;IACJ,IAAI;QACFA,MAAM,IAAIC,IAAIP;IAChB,EAAE,OAAOQ,MAAM;QACbN,SAAS,IAAIO,MAAM,CAAC,aAAa,EAAET,KAAK;QACxC;IACF;IAEA,MAAMU,SAASb,iBAAiBS,IAAIK,QAAQ;IAE5C,IAAI,CAACD,QAAQ;QACXR,SAAS,IAAIO,MAAM,CAAC,kBAAkB,EAAEH,IAAIK,QAAQ,CAAC,uCAAuC,CAAC;QAC7F;IACF;IAEA,mCAAmC;IACnC,IAAID,OAAOE,OAAO,KAAK,MAAM;QAC3B,IAAI;YACF,MAAMR,OAAO,IAAIT,KAAQ;gBAAE,GAAGG,gBAAgBQ,IAAI;gBAAE,GAAGL,OAAO;YAAC;YAC/DC,SAAS,MAAME;QACjB,EAAE,OAAOC,KAAK;YACZH,SAASG;QACX;QACA;IACF;IAEA,mCAAmC;IACnCT,YAAYc,OAAOE,OAAO,EAAEF,OAAOG,UAAU,EAAE,CAACR,KAAKS;QACnD,IAAIT,KAAK,OAAOH,SAASG;QAEzB,IAAI;;gBAIIK;YAHN,mEAAmE;YACnE,MAAMK,iBAAiB;gBACrB,GAAGjB,gBAAgBQ,IAAI;4BACnBI,wBAAAA,OAAOM,aAAa,cAApBN,4CAAAA,2BAAAA,QAAuBJ,2CAAQ,CAAC,CAApC;gBACA,GAAGL,OAAO;YACZ;YAEA,uDAAuD;YACvD,MAAM,EAAEE,OAAOc,CAAC,EAAE,GAAGC,qBAAqB,GAAGH;YAE7C,IAAIL,OAAOS,IAAI,KAAK,UAAU;gBAC5B,MAAMC,gBAAgB,IAAKN,aAAgFd,KAAKkB;gBAChH,MAAMd,OAAO,IAAIT,KAAQ;oBAAEQ,OAAOiB;oBAAe,GAAGnB,OAAO;gBAAC;gBAC5DC,SAAS,MAAME;gBACf;YACF;YAEA,MAAMgB,gBAAgB,IAAKN,aAAmEI;YAC9F,MAAMd,OAAO,IAAIT,KAAQ;gBAAEQ,OAAOiB;gBAAe,GAAGnB,OAAO;YAAC;YAE5DC,SAAS,MAAME;QACjB,EAAE,OAAOiB,WAAW;YAClBnB,SAASmB;QACX;IACF;AACF"}
|