Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: expose underlying client instance #446

Merged
merged 13 commits into from
May 16, 2024
1 change: 1 addition & 0 deletions src/drivers/azure-app-configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ export default defineDriver((opts: AzureAppConfigurationOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getClient,
async hasItem(key) {
try {
await getClient().getConfigurationSetting({
Expand Down
1 change: 1 addition & 0 deletions src/drivers/azure-cosmos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ export default defineDriver((opts: AzureCosmosOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getCosmosClient,
async hasItem(key) {
const item = await (await getCosmosClient())
.item(key)
Expand Down
1 change: 1 addition & 0 deletions src/drivers/azure-key-vault.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export default defineDriver((opts: AzureKeyVaultOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getKeyVaultClient,
async hasItem(key) {
try {
await getKeyVaultClient().getSecret(encode(key));
Expand Down
1 change: 1 addition & 0 deletions src/drivers/azure-storage-blob.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ export default defineDriver((opts: AzureStorageBlobOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getContainerClient,
async hasItem(key) {
return await getContainerClient().getBlockBlobClient(key).exists();
},
Expand Down
1 change: 1 addition & 0 deletions src/drivers/azure-storage-table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ export default defineDriver((opts: AzureStorageTableOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getClient,
async hasItem(key) {
try {
await getClient().getEntity(partitionKey, key);
Expand Down
81 changes: 42 additions & 39 deletions src/drivers/capacitor-preferences.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,43 +8,46 @@ export interface CapacitorPreferencesOptions {
base?: string;
}

export default defineDriver<CapacitorPreferencesOptions>((opts) => {
const base = normalizeKey(opts?.base || "");
const resolveKey = (key: string) => joinKeys(base, key);
export default defineDriver<CapacitorPreferencesOptions, typeof Preferences>(
(opts) => {
const base = normalizeKey(opts?.base || "");
const resolveKey = (key: string) => joinKeys(base, key);

return {
name: DRIVER_NAME,
options: opts,
hasItem(key) {
return Preferences.keys().then((r) => r.keys.includes(resolveKey(key)));
},
getItem(key) {
return Preferences.get({ key: resolveKey(key) }).then((r) => r.value);
},
getItemRaw(key) {
return Preferences.get({ key: resolveKey(key) }).then((r) => r.value);
},
setItem(key, value) {
return Preferences.set({ key: resolveKey(key), value });
},
setItemRaw(key, value) {
return Preferences.set({ key: resolveKey(key), value });
},
removeItem(key) {
return Preferences.remove({ key: resolveKey(key) });
},
async getKeys() {
const { keys } = await Preferences.keys();
return keys.map((key) => key.slice(base.length));
},
async clear(prefix) {
const { keys } = await Preferences.keys();
const _prefix = resolveKey(prefix || "");
await Promise.all(
keys
.filter((key) => key.startsWith(_prefix))
.map((key) => Preferences.remove({ key }))
);
},
};
});
return {
name: DRIVER_NAME,
options: opts,
getInstance: () => Preferences,
hasItem(key) {
return Preferences.keys().then((r) => r.keys.includes(resolveKey(key)));
},
getItem(key) {
return Preferences.get({ key: resolveKey(key) }).then((r) => r.value);
},
getItemRaw(key) {
return Preferences.get({ key: resolveKey(key) }).then((r) => r.value);
},
setItem(key, value) {
return Preferences.set({ key: resolveKey(key), value });
},
setItemRaw(key, value) {
return Preferences.set({ key: resolveKey(key), value });
},
removeItem(key) {
return Preferences.remove({ key: resolveKey(key) });
},
async getKeys() {
const { keys } = await Preferences.keys();
return keys.map((key) => key.slice(base.length));
},
async clear(prefix) {
const { keys } = await Preferences.keys();
const _prefix = resolveKey(prefix || "");
await Promise.all(
keys
.filter((key) => key.startsWith(_prefix))
.map((key) => Preferences.remove({ key }))
);
},
};
}
);
1 change: 1 addition & 0 deletions src/drivers/cloudflare-kv-binding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export default defineDriver((opts: KVOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: () => getKVBinding(opts.binding),
async hasItem(key) {
key = r(key);
const binding = getKVBinding(opts.binding);
Expand Down
1 change: 1 addition & 0 deletions src/drivers/cloudflare-r2-binding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export default defineDriver((opts: CloudflareR2Options = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: () => getR2Binding(opts.binding),
async hasItem(key) {
key = r(key);
const binding = getR2Binding(opts.binding);
Expand Down
1 change: 1 addition & 0 deletions src/drivers/localstorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export default defineDriver((opts: LocalStorageOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: () => opts.localStorage!,
hasItem(key) {
return Object.prototype.hasOwnProperty.call(opts.localStorage!, r(key));
},
Expand Down
1 change: 1 addition & 0 deletions src/drivers/lru-cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export default defineDriver((opts: LRUDriverOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: () => cache,
hasItem(key) {
return cache.has(key);
},
Expand Down
5 changes: 3 additions & 2 deletions src/drivers/memory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ import { defineDriver } from "./utils";

const DRIVER_NAME = "memory";

export default defineDriver<void>(() => {
export default defineDriver<void, Map<string, any>>(() => {
const data = new Map<string, any>();

return {
name: DRIVER_NAME,
options: {},
getInstance: () => data,
options: undefined,
pi0 marked this conversation as resolved.
Show resolved Hide resolved
hasItem(key) {
return data.has(key);
},
Expand Down
1 change: 1 addition & 0 deletions src/drivers/mongodb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export default defineDriver((opts: MongoDbOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getMongoCollection,
async hasItem(key) {
const result = await getMongoCollection().findOne({ key });
return !!result;
Expand Down
132 changes: 66 additions & 66 deletions src/drivers/netlify-blobs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,73 +42,73 @@ export type NetlifyStoreOptions =
| NetlifyDeployStoreOptions
| NetlifyNamedStoreOptions;

export default defineDriver(
({ deployScoped, name, ...opts }: NetlifyStoreOptions) => {
let store: Store;
export default defineDriver((options: NetlifyStoreOptions) => {
const { deployScoped, name, ...opts } = options;
let store: Store;

const getClient = () => {
if (!store) {
if (deployScoped) {
if (name) {
throw createError(
DRIVER_NAME,
"deploy-scoped stores cannot have a name"
);
}
store = getDeployStore({ fetch, ...opts });
} else {
if (!name) {
throw createRequiredError(DRIVER_NAME, "name");
}
// Ensures that reserved characters are encoded
store = getStore({ name: encodeURIComponent(name), fetch, ...opts });
const getClient = () => {
if (!store) {
if (deployScoped) {
if (name) {
throw createError(
DRIVER_NAME,
"deploy-scoped stores cannot have a name"
);
}
store = getDeployStore({ fetch, ...options });
} else {
if (!name) {
throw createRequiredError(DRIVER_NAME, "name");
}
// Ensures that reserved characters are encoded
store = getStore({ name: encodeURIComponent(name), fetch, ...opts });
}
return store;
};
}
return store;
};

return {
name: DRIVER_NAME,
options: {},
async hasItem(key) {
return getClient().getMetadata(key).then(Boolean);
},
getItem: (key, tops?: GetOptions) => {
// @ts-expect-error has trouble with the overloaded types
return getClient().get(key, tops);
},
getMeta(key) {
return getClient().getMetadata(key);
},
getItemRaw(key, topts?: GetOptions) {
// @ts-expect-error has trouble with the overloaded types
return getClient().get(key, { type: topts?.type ?? "arrayBuffer" });
},
setItem(key, value, topts?: SetOptions) {
return getClient().set(key, value, topts);
},
setItemRaw(key, value: string | ArrayBuffer | Blob, topts?: SetOptions) {
return getClient().set(key, value, topts);
},
removeItem(key) {
return getClient().delete(key);
},
async getKeys(
base?: string,
tops?: Omit<ListOptions, "prefix" | "paginate">
) {
return (await getClient().list({ ...tops, prefix: base })).blobs.map(
(item) => item.key
);
},
async clear(base?: string) {
const client = getClient();
return Promise.allSettled(
(await client.list({ prefix: base })).blobs.map((item) =>
client.delete(item.key)
)
).then(() => {});
},
};
}
);
return {
name: DRIVER_NAME,
options,
getInstance: getClient,
async hasItem(key) {
return getClient().getMetadata(key).then(Boolean);
},
getItem: (key, tops?: GetOptions) => {
// @ts-expect-error has trouble with the overloaded types
return getClient().get(key, tops);
},
getMeta(key) {
return getClient().getMetadata(key);
},
getItemRaw(key, topts?: GetOptions) {
// @ts-expect-error has trouble with the overloaded types
return getClient().get(key, { type: topts?.type ?? "arrayBuffer" });
},
setItem(key, value, topts?: SetOptions) {
return getClient().set(key, value, topts);
},
setItemRaw(key, value: string | ArrayBuffer | Blob, topts?: SetOptions) {
return getClient().set(key, value, topts);
},
removeItem(key) {
return getClient().delete(key);
},
async getKeys(
base?: string,
tops?: Omit<ListOptions, "prefix" | "paginate">
) {
return (await getClient().list({ ...tops, prefix: base })).blobs.map(
(item) => item.key
);
},
async clear(base?: string) {
const client = getClient();
return Promise.allSettled(
(await client.list({ prefix: base })).blobs.map((item) =>
client.delete(item.key)
)
).then(() => {});
},
};
});
1 change: 1 addition & 0 deletions src/drivers/planetscale.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export default defineDriver((opts: PlanetscaleDriverOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getConnection,
hasItem: async (key) => {
const res = await getConnection().execute(
`SELECT EXISTS (SELECT 1 FROM ${opts.table} WHERE id = :key) as value;`,
Expand Down
3 changes: 2 additions & 1 deletion src/drivers/redis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export interface RedisOptions extends _RedisOptions {

const DRIVER_NAME = "redis";

export default defineDriver((opts: RedisOptions = {}) => {
export default defineDriver((opts: RedisOptions) => {
let redisClient: Redis | Cluster;
const getRedisClient = () => {
if (redisClient) {
Expand All @@ -58,6 +58,7 @@ export default defineDriver((opts: RedisOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getRedisClient,
async hasItem(key) {
return Boolean(await getRedisClient().exists(p(key)));
},
Expand Down
1 change: 1 addition & 0 deletions src/drivers/session-storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export default defineDriver((opts: SessionStorageOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: () => opts.sessionStorage!,
hasItem(key) {
return Object.prototype.hasOwnProperty.call(opts.sessionStorage, r(key));
},
Expand Down
10 changes: 6 additions & 4 deletions src/drivers/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import type { Driver } from "../..";

type DriverFactory<T> = (opts: T) => Driver;
type DriverFactory<OptionsT, InstanceT> = (
opts: OptionsT
) => Driver<OptionsT, InstanceT>;
interface ErrorOptions {}

export function defineDriver<T = any>(
factory: DriverFactory<T>
): DriverFactory<T> {
export function defineDriver<OptionsT = any, InstanceT = never>(
factory: DriverFactory<OptionsT, InstanceT>
): DriverFactory<OptionsT, InstanceT> {
return factory;
}

Expand Down
7 changes: 5 additions & 2 deletions src/drivers/vercel-kv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export interface VercelKVOptions extends Partial<RedisConfigNodejs> {

const DRIVER_NAME = "vercel-kv";

export default defineDriver<VercelKVOptions>((opts) => {
export default defineDriver<VercelKVOptions, VercelKV>((opts) => {
const base = normalizeKey(opts?.base);
const r = (...keys: string[]) => joinKeys(base, ...keys);

Expand Down Expand Up @@ -56,13 +56,16 @@ export default defineDriver<VercelKVOptions>((opts) => {
);
}
}
_client = createClient(opts as RedisConfigNodejs);
_client = createClient(
opts as VercelKVOptions & { url: string; token: string }
);
}
return _client;
};

return {
name: DRIVER_NAME,
getInstance: getClient,
hasItem(key) {
return getClient().exists(r(key)).then(Boolean);
},
Expand Down
Loading
Loading