keyv-registry 0.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/LICENSE +22 -0
- package/README.md +202 -0
- package/dist/cjs/index.d.cts +37 -0
- package/dist/cjs/index.d.ts +37 -0
- package/dist/cjs/index.js +82 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/loadAdapter.d.cts +9 -0
- package/dist/cjs/loadAdapter.d.ts +9 -0
- package/dist/cjs/loadAdapter.js +74 -0
- package/dist/cjs/loadAdapter.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/registry.d.cts +13 -0
- package/dist/cjs/registry.d.ts +13 -0
- package/dist/cjs/registry.js +119 -0
- package/dist/cjs/registry.js.map +1 -0
- package/dist/cjs/types.d.cts +33 -0
- package/dist/cjs/types.d.ts +33 -0
- package/dist/cjs/types.js +5 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils.d.cts +8 -0
- package/dist/cjs/utils.d.ts +8 -0
- package/dist/cjs/utils.js +152 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/cjs/worker.d.cts +5 -0
- package/dist/cjs/worker.d.ts +5 -0
- package/dist/cjs/worker.js +138 -0
- package/dist/cjs/worker.js.map +1 -0
- package/dist/esm/index.d.ts +37 -0
- package/dist/esm/index.js +50 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/loadAdapter.d.ts +9 -0
- package/dist/esm/loadAdapter.js +52 -0
- package/dist/esm/loadAdapter.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/registry.d.ts +13 -0
- package/dist/esm/registry.js +73 -0
- package/dist/esm/registry.js.map +1 -0
- package/dist/esm/types.d.ts +33 -0
- package/dist/esm/types.js +3 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.d.ts +8 -0
- package/dist/esm/utils.js +33 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/esm/worker.d.ts +5 -0
- package/dist/esm/worker.js +75 -0
- package/dist/esm/worker.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { resolveFilePath } from './utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Protocol registry mapping URI protocols to adapter configurations
|
|
4
|
+
*/ const PROTOCOL_REGISTRY = {
|
|
5
|
+
// Official @keyv adapters
|
|
6
|
+
'redis:': {
|
|
7
|
+
package: '@keyv/redis'
|
|
8
|
+
},
|
|
9
|
+
'rediss:': {
|
|
10
|
+
package: '@keyv/redis'
|
|
11
|
+
},
|
|
12
|
+
'postgresql:': {
|
|
13
|
+
package: '@keyv/postgres'
|
|
14
|
+
},
|
|
15
|
+
'postgres:': {
|
|
16
|
+
package: '@keyv/postgres'
|
|
17
|
+
},
|
|
18
|
+
'mysql:': {
|
|
19
|
+
package: '@keyv/mysql'
|
|
20
|
+
},
|
|
21
|
+
'sqlite:': {
|
|
22
|
+
package: '@keyv/sqlite'
|
|
23
|
+
},
|
|
24
|
+
'mongodb:': {
|
|
25
|
+
package: '@keyv/mongo'
|
|
26
|
+
},
|
|
27
|
+
'mongodb+srv:': {
|
|
28
|
+
package: '@keyv/mongo'
|
|
29
|
+
},
|
|
30
|
+
'memcache:': {
|
|
31
|
+
package: '@keyv/memcache'
|
|
32
|
+
},
|
|
33
|
+
'etcd:': {
|
|
34
|
+
package: '@keyv/etcd'
|
|
35
|
+
},
|
|
36
|
+
// Third-party adapters
|
|
37
|
+
'file:': {
|
|
38
|
+
package: 'keyv-file',
|
|
39
|
+
exportName: 'KeyvFile',
|
|
40
|
+
optionsMapper: (url)=>({
|
|
41
|
+
filename: resolveFilePath(url)
|
|
42
|
+
})
|
|
43
|
+
},
|
|
44
|
+
// Built-in (no package needed)
|
|
45
|
+
'memory:': {
|
|
46
|
+
package: null
|
|
47
|
+
},
|
|
48
|
+
// Future/custom adapters
|
|
49
|
+
'duckdb:': {
|
|
50
|
+
package: 'keyv-duckdb',
|
|
51
|
+
optionsMapper: (url)=>({
|
|
52
|
+
filename: resolveFilePath(url)
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Register or override a protocol adapter
|
|
58
|
+
*/ export function registerAdapter(protocol, config) {
|
|
59
|
+
const normalizedProtocol = protocol.endsWith(':') ? protocol : `${protocol}:`;
|
|
60
|
+
PROTOCOL_REGISTRY[normalizedProtocol] = config;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the current registry (read-only copy)
|
|
64
|
+
*/ export function getRegistry() {
|
|
65
|
+
return {
|
|
66
|
+
...PROTOCOL_REGISTRY
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get adapter config for a protocol
|
|
71
|
+
*/ export function getAdapterConfig(protocol) {
|
|
72
|
+
return PROTOCOL_REGISTRY[protocol];
|
|
73
|
+
}
|
|
@@ -0,0 +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","exportName","optionsMapper","url","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;IAAc;IACnC,WAAW;QAAEA,SAAS;IAAc;IACpC,eAAe;QAAEA,SAAS;IAAiB;IAC3C,aAAa;QAAEA,SAAS;IAAiB;IACzC,UAAU;QAAEA,SAAS;IAAc;IACnC,WAAW;QAAEA,SAAS;IAAe;IACrC,YAAY;QAAEA,SAAS;IAAc;IACrC,gBAAgB;QAAEA,SAAS;IAAc;IACzC,aAAa;QAAEA,SAAS;IAAiB;IACzC,SAAS;QAAEA,SAAS;IAAa;IAEjC,uBAAuB;IACvB,SAAS;QACPA,SAAS;QACTC,YAAY;QACZC,eAAe,CAACC,MAAc,CAAA;gBAAEC,UAAUN,gBAAgBK;YAAK,CAAA;IACjE;IAEA,+BAA+B;IAC/B,WAAW;QAAEH,SAAS;IAAK;IAE3B,yBAAyB;IACzB,WAAW;QACTA,SAAS;QACTE,eAAe,CAACC,MAAc,CAAA;gBAAEC,UAAUN,gBAAgBK;YAAK,CAAA;IACjE;AACF;AAEA;;CAEC,GACD,OAAO,SAASE,gBAAgBC,QAAgB,EAAEC,MAAqB;IACrE,MAAMC,qBAAqBF,SAASG,QAAQ,CAAC,OAAOH,WAAW,GAAGA,SAAS,CAAC,CAAC;IAC7EP,iBAAiB,CAACS,mBAAmB,GAAGD;AAC1C;AAEA;;CAEC,GACD,OAAO,SAASG;IACd,OAAO;QAAE,GAAGX,iBAAiB;IAAC;AAChC;AAEA;;CAEC,GACD,OAAO,SAASY,iBAAiBL,QAAgB;IAC/C,OAAOP,iBAAiB,CAACO,SAAS;AACpC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type Keyv from 'keyv';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for a protocol adapter
|
|
4
|
+
*/
|
|
5
|
+
export interface AdapterConfig {
|
|
6
|
+
/** npm package name, or null for built-in adapters */
|
|
7
|
+
package: string | null;
|
|
8
|
+
/** Named export from the package (default: 'default') */
|
|
9
|
+
exportName?: string;
|
|
10
|
+
/** Custom function to map URL to adapter options */
|
|
11
|
+
optionsMapper?: (url: URL) => Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Options for createStore
|
|
15
|
+
*/
|
|
16
|
+
export interface CreateStoreOptions {
|
|
17
|
+
/** Pre-instantiated adapter (bypasses URI loading) */
|
|
18
|
+
store?: unknown;
|
|
19
|
+
/** Keyv namespace */
|
|
20
|
+
namespace?: string;
|
|
21
|
+
/** Default TTL in milliseconds */
|
|
22
|
+
ttl?: number;
|
|
23
|
+
/** Additional Keyv options */
|
|
24
|
+
[key: string]: unknown;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Callback type for createStore
|
|
28
|
+
*/
|
|
29
|
+
export type CreateStoreCallback<T> = (err: Error | null, store?: Keyv<T>) => void;
|
|
30
|
+
/**
|
|
31
|
+
* Internal callback type for loadAdapter
|
|
32
|
+
*/
|
|
33
|
+
export type LoadAdapterCallback = (err: Error | null, Adapter?: unknown) => void;
|
|
@@ -0,0 +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":"AAiCA;;CAEC,GACD,WAAiF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve file path from URL, handling ~ and . prefixes
|
|
3
|
+
*/
|
|
4
|
+
export declare function resolveFilePath(url: URL): string;
|
|
5
|
+
/**
|
|
6
|
+
* Parse URL search params into options object with type conversion
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseUriOptions(url: URL): Record<string, unknown>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve file path from URL, handling ~ and . prefixes
|
|
6
|
+
*/ export function resolveFilePath(url) {
|
|
7
|
+
let filePath = url.pathname;
|
|
8
|
+
// Handle ~ for home directory
|
|
9
|
+
if (url.host === '~') {
|
|
10
|
+
filePath = path.join(os.homedir(), filePath.slice(1));
|
|
11
|
+
} else if (url.host === '.') {
|
|
12
|
+
filePath = path.join(process.cwd(), filePath.slice(1));
|
|
13
|
+
}
|
|
14
|
+
// Ensure directory exists
|
|
15
|
+
fs.mkdirSync(path.dirname(filePath), {
|
|
16
|
+
recursive: true
|
|
17
|
+
});
|
|
18
|
+
return filePath;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse URL search params into options object with type conversion
|
|
22
|
+
*/ export function parseUriOptions(url) {
|
|
23
|
+
const options = {};
|
|
24
|
+
for (const [key, value] of url.searchParams){
|
|
25
|
+
// Auto-convert types
|
|
26
|
+
if (value === 'true') options[key] = true;
|
|
27
|
+
else if (value === 'false') options[key] = false;
|
|
28
|
+
else if (/^\d+$/.test(value)) options[key] = Number.parseInt(value, 10);
|
|
29
|
+
else if (/^\d+\.\d+$/.test(value)) options[key] = Number.parseFloat(value);
|
|
30
|
+
else options[key] = value;
|
|
31
|
+
}
|
|
32
|
+
return options;
|
|
33
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/keyv/keyv-registry/src/utils.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * Resolve file path from URL, handling ~ and . prefixes\n */\nexport function resolveFilePath(url: URL): string {\n let filePath = url.pathname;\n\n // Handle ~ for home directory\n if (url.host === '~') {\n filePath = path.join(os.homedir(), filePath.slice(1));\n }\n // Handle . for current directory\n else if (url.host === '.') {\n filePath = path.join(process.cwd(), filePath.slice(1));\n }\n\n // Ensure directory exists\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n\n return filePath;\n}\n\n/**\n * Parse URL search params into options object with type conversion\n */\nexport function parseUriOptions(url: URL): Record<string, unknown> {\n const options: Record<string, unknown> = {};\n\n for (const [key, value] of url.searchParams) {\n // Auto-convert types\n if (value === 'true') options[key] = true;\n else if (value === 'false') options[key] = false;\n else if (/^\\d+$/.test(value)) options[key] = Number.parseInt(value, 10);\n else if (/^\\d+\\.\\d+$/.test(value)) options[key] = Number.parseFloat(value);\n else options[key] = value;\n }\n\n return options;\n}\n"],"names":["fs","os","path","resolveFilePath","url","filePath","pathname","host","join","homedir","slice","process","cwd","mkdirSync","dirname","recursive","parseUriOptions","options","key","value","searchParams","test","Number","parseInt","parseFloat"],"mappings":"AAAA,YAAYA,QAAQ,UAAU;AAC9B,YAAYC,QAAQ,UAAU;AAC9B,YAAYC,UAAU,YAAY;AAElC;;CAEC,GACD,OAAO,SAASC,gBAAgBC,GAAQ;IACtC,IAAIC,WAAWD,IAAIE,QAAQ;IAE3B,8BAA8B;IAC9B,IAAIF,IAAIG,IAAI,KAAK,KAAK;QACpBF,WAAWH,KAAKM,IAAI,CAACP,GAAGQ,OAAO,IAAIJ,SAASK,KAAK,CAAC;IACpD,OAEK,IAAIN,IAAIG,IAAI,KAAK,KAAK;QACzBF,WAAWH,KAAKM,IAAI,CAACG,QAAQC,GAAG,IAAIP,SAASK,KAAK,CAAC;IACrD;IAEA,0BAA0B;IAC1BV,GAAGa,SAAS,CAACX,KAAKY,OAAO,CAACT,WAAW;QAAEU,WAAW;IAAK;IAEvD,OAAOV;AACT;AAEA;;CAEC,GACD,OAAO,SAASW,gBAAgBZ,GAAQ;IACtC,MAAMa,UAAmC,CAAC;IAE1C,KAAK,MAAM,CAACC,KAAKC,MAAM,IAAIf,IAAIgB,YAAY,CAAE;QAC3C,qBAAqB;QACrB,IAAID,UAAU,QAAQF,OAAO,CAACC,IAAI,GAAG;aAChC,IAAIC,UAAU,SAASF,OAAO,CAACC,IAAI,GAAG;aACtC,IAAI,QAAQG,IAAI,CAACF,QAAQF,OAAO,CAACC,IAAI,GAAGI,OAAOC,QAAQ,CAACJ,OAAO;aAC/D,IAAI,aAAaE,IAAI,CAACF,QAAQF,OAAO,CAACC,IAAI,GAAGI,OAAOE,UAAU,CAACL;aAC/DF,OAAO,CAACC,IAAI,GAAGC;IACtB;IAEA,OAAOF;AACT"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import Keyv from 'keyv';
|
|
2
|
+
import loadAdapter from './loadAdapter.js';
|
|
3
|
+
import { getAdapterConfig } from './registry.js';
|
|
4
|
+
import { parseUriOptions } from './utils.js';
|
|
5
|
+
/**
|
|
6
|
+
* Core worker function that creates a Keyv store
|
|
7
|
+
*/ export default function worker(uri, options, callback) {
|
|
8
|
+
// Passthrough: pre-instantiated adapter provided
|
|
9
|
+
if (options.store) {
|
|
10
|
+
try {
|
|
11
|
+
const keyv = new Keyv({
|
|
12
|
+
...options
|
|
13
|
+
});
|
|
14
|
+
callback(null, keyv);
|
|
15
|
+
} catch (err) {
|
|
16
|
+
callback(err);
|
|
17
|
+
}
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// Parse URI
|
|
21
|
+
let url;
|
|
22
|
+
try {
|
|
23
|
+
url = new URL(uri);
|
|
24
|
+
} catch (_err) {
|
|
25
|
+
callback(new Error(`Invalid URI: ${uri}`));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const config = getAdapterConfig(url.protocol);
|
|
29
|
+
if (!config) {
|
|
30
|
+
callback(new Error(`Unknown protocol: ${url.protocol}. Use registerAdapter() to add support.`));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Memory store - no package needed
|
|
34
|
+
if (config.package === null) {
|
|
35
|
+
try {
|
|
36
|
+
const keyv = new Keyv({
|
|
37
|
+
...parseUriOptions(url),
|
|
38
|
+
...options
|
|
39
|
+
});
|
|
40
|
+
callback(null, keyv);
|
|
41
|
+
} catch (err) {
|
|
42
|
+
callback(err);
|
|
43
|
+
}
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Load adapter (install if needed)
|
|
47
|
+
loadAdapter(config.package, config.exportName, (err, AdapterClass)=>{
|
|
48
|
+
if (err) {
|
|
49
|
+
callback(err);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
var _config_optionsMapper;
|
|
54
|
+
var _config_optionsMapper1;
|
|
55
|
+
// Build adapter options: URI params + custom mapper + user options
|
|
56
|
+
const adapterOptions = {
|
|
57
|
+
...parseUriOptions(url),
|
|
58
|
+
...(_config_optionsMapper1 = (_config_optionsMapper = config.optionsMapper) === null || _config_optionsMapper === void 0 ? void 0 : _config_optionsMapper.call(config, url)) !== null && _config_optionsMapper1 !== void 0 ? _config_optionsMapper1 : {
|
|
59
|
+
uri
|
|
60
|
+
},
|
|
61
|
+
...options
|
|
62
|
+
};
|
|
63
|
+
// Remove store from adapter options to avoid confusion
|
|
64
|
+
const { store: _, ...cleanAdapterOptions } = adapterOptions;
|
|
65
|
+
const storeInstance = new AdapterClass(cleanAdapterOptions);
|
|
66
|
+
const keyv = new Keyv({
|
|
67
|
+
store: storeInstance,
|
|
68
|
+
...options
|
|
69
|
+
});
|
|
70
|
+
callback(null, keyv);
|
|
71
|
+
} catch (createErr) {
|
|
72
|
+
callback(createErr);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
@@ -0,0 +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) {\n callback(err);\n return;\n }\n\n try {\n // Build adapter options: URI params + custom mapper + user options\n const adapterOptions = {\n ...parseUriOptions(url),\n ...(config.optionsMapper?.(url) ?? { uri }),\n ...options,\n };\n\n // Remove store from adapter options to avoid confusion\n const { store: _, ...cleanAdapterOptions } = adapterOptions;\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","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;YACPH,SAASG;YACT;QACF;QAEA,IAAI;gBAIIK;gBAAAA;YAHN,mEAAmE;YACnE,MAAMK,iBAAiB;gBACrB,GAAGjB,gBAAgBQ,IAAI;gBACvB,GAAII,CAAAA,0BAAAA,wBAAAA,OAAOM,aAAa,cAApBN,4CAAAA,2BAAAA,QAAuBJ,kBAAvBI,oCAAAA,yBAA+B;oBAAEV;gBAAI,CAAC;gBAC1C,GAAGC,OAAO;YACZ;YAEA,uDAAuD;YACvD,MAAM,EAAEE,OAAOc,CAAC,EAAE,GAAGC,qBAAqB,GAAGH;YAE7C,MAAMI,gBAAgB,IAAKL,aAAmEI;YAC9F,MAAMd,OAAO,IAAIT,KAAQ;gBAAEQ,OAAOgB;gBAAe,GAAGlB,OAAO;YAAC;YAE5DC,SAAS,MAAME;QACjB,EAAE,OAAOgB,WAAW;YAClBlB,SAASkB;QACX;IACF;AACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "keyv-registry",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Protocol-based Keyv adapter registry with dynamic module installation",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"keyv",
|
|
7
|
+
"registry",
|
|
8
|
+
"adapter",
|
|
9
|
+
"cache",
|
|
10
|
+
"storage",
|
|
11
|
+
"redis",
|
|
12
|
+
"postgres",
|
|
13
|
+
"sqlite",
|
|
14
|
+
"mongodb",
|
|
15
|
+
"uri"
|
|
16
|
+
],
|
|
17
|
+
"homepage": "https://github.com/kmalakoff/keyv-registry",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+ssh://git@github.com/kmalakoff/keyv-registry.git"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"author": "Kevin Malakoff <kmalakoff@gmail.com> (https://github.com/kmalakoff)",
|
|
24
|
+
"type": "module",
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"import": "./dist/esm/index.js",
|
|
28
|
+
"require": "./dist/cjs/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./package.json": "./package.json"
|
|
31
|
+
},
|
|
32
|
+
"main": "dist/cjs/index.js",
|
|
33
|
+
"types": "dist/cjs/index.d.ts",
|
|
34
|
+
"files": [
|
|
35
|
+
"dist"
|
|
36
|
+
],
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsds build",
|
|
39
|
+
"format": "biome check --write --unsafe",
|
|
40
|
+
"prepublishOnly": "tsds validate",
|
|
41
|
+
"test": "tsds test:node --no-timeouts",
|
|
42
|
+
"test:engines": "nvu engines tsds test:node --no-timeouts",
|
|
43
|
+
"version": "tsds version"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"install-module-linked": "*",
|
|
47
|
+
"keyv": "^5.0.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@biomejs/biome": "*",
|
|
51
|
+
"@types/mocha": "*",
|
|
52
|
+
"@types/node": "*",
|
|
53
|
+
"node-version-use": "*",
|
|
54
|
+
"ts-dev-stack": "*"
|
|
55
|
+
},
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=16"
|
|
58
|
+
},
|
|
59
|
+
"tsds": {
|
|
60
|
+
"source": "src/index.ts"
|
|
61
|
+
}
|
|
62
|
+
}
|