bun-sqlite-key-value
Advanced tools
Comparing version 1.3.9 to 1.3.10
@@ -21,3 +21,2 @@ import { BunSqliteKeyValue } from "../src" | ||
settingsStore.set("screen-position", {top: 100, left: 100}) | ||
settingsStore.set("window-size", {height: 1000, width: 1000}) | ||
@@ -33,24 +32,7 @@ // Write languages | ||
// -> [ | ||
// { | ||
// key: "language", | ||
// value: "de", | ||
// }, { | ||
// key: "page-size", | ||
// value: "A4", | ||
// }, { | ||
// key: "screen-position", | ||
// value: { | ||
// top: 100, | ||
// left: 100, | ||
// }, | ||
// }, { | ||
// key: "window-size", | ||
// value: { | ||
// height: 1000, | ||
// width: 1000, | ||
// }, | ||
// } | ||
// {key: "language", value: "de"}, | ||
// {key: "page-size", value: "A4"}, | ||
// {key: "screen-position", value: {top: 100, left: 100}}, | ||
// ] | ||
// Read all languages | ||
@@ -60,3 +42,2 @@ const languageValues = languagesStore.getValues() | ||
// Read current language | ||
@@ -67,5 +48,4 @@ const languageKey = settingsStore.get("language") | ||
// Explicitly close DBs | ||
settingsStore.close() | ||
languagesStore.close() |
{ | ||
"name": "bun-sqlite-key-value", | ||
"version": "1.3.9", | ||
"version": "1.3.10", | ||
"author": "Gerold Penz<gerold@gp-softwaretechnik.at>", | ||
@@ -5,0 +5,0 @@ "repository": { |
@@ -271,2 +271,3 @@ # Bun SQLite Key Value | ||
import { BunSqliteKeyValue } from "bun-sqlite-key-value" | ||
import { join } from "node:path" | ||
@@ -291,3 +292,2 @@ import { exists, mkdir } from "node:fs/promises" | ||
settingsStore.set("screen-position", {top: 100, left: 100}) | ||
settingsStore.set("window-size", {height: 1000, width: 1000}) | ||
@@ -303,24 +303,7 @@ // Write languages | ||
// -> [ | ||
// { | ||
// key: "language", | ||
// value: "de", | ||
// }, { | ||
// key: "page-size", | ||
// value: "A4", | ||
// }, { | ||
// key: "screen-position", | ||
// value: { | ||
// top: 100, | ||
// left: 100, | ||
// }, | ||
// }, { | ||
// key: "window-size", | ||
// value: { | ||
// height: 1000, | ||
// width: 1000, | ||
// }, | ||
// } | ||
// {key: "language", value: "de"}, | ||
// {key: "page-size", value: "A4"}, | ||
// {key: "screen-position", value: {top: 100, left: 100}}, | ||
// ] | ||
// Read all languages | ||
@@ -330,3 +313,2 @@ const languageValues = languagesStore.getValues() | ||
// Read current language | ||
@@ -337,3 +319,2 @@ const languageKey = settingsStore.get("language") | ||
// Explicitly close DBs | ||
@@ -340,0 +321,0 @@ settingsStore.close() |
@@ -44,2 +44,5 @@ import { Database, type Statement } from "bun:sqlite" | ||
private getItemsStartsWithStatement: Statement<RawItem> | ||
private getKeyStatement: Statement<Omit<RawItem, "value">> | ||
// private getAllKeysStatement: Statement<Omit<RawItem, "value">> | ||
// private getKeysStartsWithStatement: Statement<Omit<RawItem, "value">> | ||
@@ -82,2 +85,5 @@ | ||
this.deleteStatement = this.db.query("DELETE FROM items WHERE key = $key") | ||
this.getKeyStatement = this.db.query("SELECT key, expires FROM items WHERE key = $key") | ||
// this.getAllKeysStatement = this.db.query("SELECT key, expires FROM items") | ||
// this.getKeysStartsWithStatement = this.db.query("SELECT key, expires FROM items WHERE key LIKE $startsWith") | ||
@@ -95,4 +101,13 @@ // Delete expired items | ||
delete(key: string) { | ||
this.deleteStatement.run({key}) | ||
// Delete one or multiple items | ||
delete(keyOrKeys: string | string[]) { | ||
if (typeof keyOrKeys === "string") { | ||
this.deleteStatement.run({key: keyOrKeys}) | ||
} else { | ||
this.db.transaction(() => { | ||
keyOrKeys.forEach((key) => { | ||
this.deleteStatement.run({key}) | ||
}) | ||
})() | ||
} | ||
} | ||
@@ -131,3 +146,3 @@ | ||
// Set ttlMs to 0 if you explicitly want to disable expiration. | ||
setValue<T = any>(key: string, value: T, ttlMs?: number) { | ||
set<T = any>(key: string, value: T, ttlMs?: number) { | ||
let expires: number | undefined | ||
@@ -142,7 +157,8 @@ ttlMs = ttlMs ?? this.ttlMs | ||
// Alias for `setValue` | ||
set = this.setValue | ||
// Alias for `set` | ||
setValue = this.set | ||
getItem<T = any>(key: string): Item<T> | undefined { | ||
// Get one value | ||
get<T = any>(key: string): T | undefined { | ||
const record = this.getItemStatement.get({key}) | ||
@@ -157,18 +173,20 @@ if (!record) return | ||
} | ||
return { | ||
key, | ||
value: value ? deserialize(value) as T : undefined | ||
} | ||
return value ? deserialize(value) as T : undefined | ||
} | ||
getValue<T = any>(key: string): T | undefined { | ||
return this.getItem<T>(key)?.value || undefined | ||
} | ||
// Alias for `get` | ||
getValue = this.get | ||
// Alias for getValue | ||
get = this.getValue | ||
// Get one item (key, value) | ||
getItem<T = any>(key: string): Item<T> | undefined { | ||
return { | ||
key, | ||
value: this.get<T>(key) | ||
} | ||
} | ||
// Get multiple items (key-value array) | ||
getItems<T = any>(startsWithOrKeys?: string | string[]): Item<T>[] | undefined { | ||
@@ -215,2 +233,3 @@ let records: RawItem[] | ||
// Get multiple values as array | ||
getValues<T = any>(startsWithOrKeys?: string | string[]): (T | undefined)[] | undefined { | ||
@@ -225,12 +244,39 @@ return this.getItems<T>(startsWithOrKeys)?.map((result) => result.value) | ||
getItemsObject<T = any>(startsWithOrKeys?: string | string[]): {[key: string]: T} | undefined { | ||
// Get multiple items as object | ||
getItemsObject<T = any>(startsWithOrKeys?: string | string[]): {[key: string]: T | undefined} | undefined { | ||
const items = this.getItems(startsWithOrKeys) | ||
if (!items) return | ||
const result: {[key: string]: T} = {} | ||
for (const item of items) { | ||
result[item.key] = item.value | ||
return Object.fromEntries(items.map(item => [item.key, item.value as T | undefined])) | ||
} | ||
// Get multiple items as Map() | ||
getItemsMap<T = any>(startsWithOrKeys?: string | string[]): Map<string, T | undefined> | undefined { | ||
const items = this.getItems(startsWithOrKeys) | ||
if (!items) return | ||
return new Map(items.map(item => [item.key, item.value as T | undefined])) | ||
} | ||
// Get multiple values as Set() | ||
getValuesSet<T = any>(startsWithOrKeys?: string | string[]): Set<T> | undefined { | ||
const values = this.getValues(startsWithOrKeys) | ||
if (!values) return | ||
return new Set(values) | ||
} | ||
// Checks if key exists | ||
has(key: string): boolean { | ||
const record = this.getKeyStatement.get({key}) | ||
if (!record) return false | ||
if (record.expires) { | ||
if (record.expires < Date.now()) { | ||
this.delete(key) | ||
return false | ||
} | ||
} | ||
return result | ||
return true | ||
} | ||
} |
@@ -94,3 +94,16 @@ import { expect, test } from "bun:test" | ||
test("Delete item", () => { | ||
test("Caching with implicite TTL", async () => { | ||
const store: BunSqliteKeyValue = new BunSqliteKeyValue(undefined, {ttlMs: 40}) | ||
store.set(KEY_1, STRING_VALUE_1) | ||
store.set(KEY_2, STRING_VALUE_2) | ||
store.set(KEY_3, STRING_VALUE_3) | ||
await Bun.sleep(60) | ||
expect(store.get(KEY_1)).toBeUndefined() | ||
expect(store.get(KEY_2)).toBeUndefined() | ||
expect(store.get(KEY_3)).toBeUndefined() | ||
}) | ||
test("Delete one item", () => { | ||
const store: BunSqliteKeyValue = new BunSqliteKeyValue() | ||
@@ -104,2 +117,12 @@ store.set<string>(KEY_1, STRING_VALUE_1) | ||
test("Delete multiple items", () => { | ||
const store: BunSqliteKeyValue = new BunSqliteKeyValue() | ||
store.set<string>(KEY_1, STRING_VALUE_1) | ||
store.set<string>(KEY_2, STRING_VALUE_2) | ||
store.set<string>(KEY_3, STRING_VALUE_3) | ||
store.delete([KEY_1, KEY_2]) | ||
expect(store.length).toEqual(1) | ||
}) | ||
test("Delete all items (clear)", () => { | ||
@@ -281,13 +304,44 @@ const store: BunSqliteKeyValue = new BunSqliteKeyValue() | ||
test("Caching with implicite TTL", async () => { | ||
const store: BunSqliteKeyValue = new BunSqliteKeyValue(undefined, {ttlMs: 40}) | ||
test("Get items as Map", () => { | ||
const store: BunSqliteKeyValue = new BunSqliteKeyValue() | ||
store.set(KEY_1, STRING_VALUE_1) | ||
store.set(KEY_2, STRING_VALUE_2) | ||
store.set(KEY_3, STRING_VALUE_3) | ||
await Bun.sleep(60) | ||
expect(store.get(KEY_1)).toBeUndefined() | ||
expect(store.get(KEY_2)).toBeUndefined() | ||
expect(store.get(KEY_3)).toBeUndefined() | ||
store.set<string>(KEY_1, STRING_VALUE_1) | ||
store.set<string>(KEY_2, STRING_VALUE_2) | ||
store.set(KEY_3, null) | ||
expect(store.getItemsMap([ | ||
KEY_1, | ||
KEY_2, | ||
KEY_3, | ||
"unknown-key" | ||
])).toEqual(new Map([ | ||
[KEY_1, STRING_VALUE_1], | ||
[KEY_2, STRING_VALUE_2], | ||
[KEY_3, null], | ||
["unknown-key", undefined], | ||
])) | ||
}) | ||
test("Get values as Set", () => { | ||
const store: BunSqliteKeyValue = new BunSqliteKeyValue() | ||
store.set<string>(KEY_1, STRING_VALUE_1) | ||
store.set<string>(KEY_2, STRING_VALUE_2) | ||
store.set(KEY_3, null) | ||
expect(store.getValuesSet([ | ||
KEY_1, KEY_2, KEY_3, "unknown-key" | ||
])).toEqual(new Set([ | ||
STRING_VALUE_1, STRING_VALUE_2, null, undefined | ||
])) | ||
}) | ||
test("Has key", () => { | ||
const store: BunSqliteKeyValue = new BunSqliteKeyValue() | ||
store.set<string>(KEY_1, STRING_VALUE_1) | ||
expect(store.has(KEY_1)).toEqual(true) | ||
expect(store.has(KEY_2)).toEqual(false) | ||
}) |
46899
747
368