Skip to content

Commit

Permalink
feat: expose underlying client instance (#446)
Browse files Browse the repository at this point in the history
  • Loading branch information
xuzuodong authored May 16, 2024
1 parent 486a400 commit d23cba5
Show file tree
Hide file tree
Showing 22 changed files with 153 additions and 123 deletions.
1 change: 1 addition & 0 deletions build.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,5 @@ export default defineBuildConfig({
declaration: false,
},
],
externals: ["mongodb"],
});
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
4 changes: 2 additions & 2 deletions src/drivers/memory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ 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,
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
Loading

0 comments on commit d23cba5

Please sign in to comment.