@keyv/sqlite 4.0.5 → 4.0.8
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/dist/index.cjs +44 -11
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +41 -8
- package/package.json +24 -34
package/dist/index.cjs
CHANGED
|
@@ -35,12 +35,18 @@ __export(index_exports, {
|
|
|
35
35
|
default: () => index_default
|
|
36
36
|
});
|
|
37
37
|
module.exports = __toCommonJS(index_exports);
|
|
38
|
-
var
|
|
39
|
-
var
|
|
38
|
+
var import_node_events = __toESM(require("events"), 1);
|
|
39
|
+
var import_node_util = require("util");
|
|
40
40
|
var import_keyv = __toESM(require("keyv"), 1);
|
|
41
41
|
var import_sqlite3 = __toESM(require("sqlite3"), 1);
|
|
42
|
-
var
|
|
43
|
-
|
|
42
|
+
var toTableString = (input) => {
|
|
43
|
+
const sanitized = String(input).replace(/[^a-zA-Z0-9_]/g, "");
|
|
44
|
+
if (sanitized.length === 0) {
|
|
45
|
+
throw new Error("Invalid table name: must contain alphanumeric characters");
|
|
46
|
+
}
|
|
47
|
+
return /^[a-zA-Z]/.test(sanitized) ? sanitized : `_${sanitized}`;
|
|
48
|
+
};
|
|
49
|
+
var KeyvSqlite = class extends import_node_events.default {
|
|
44
50
|
ttlSupport;
|
|
45
51
|
opts;
|
|
46
52
|
namespace;
|
|
@@ -73,16 +79,34 @@ var KeyvSqlite = class extends import_events.default {
|
|
|
73
79
|
resolve(database);
|
|
74
80
|
}
|
|
75
81
|
});
|
|
76
|
-
}).then((database) => ({
|
|
82
|
+
}).then((database) => ({
|
|
83
|
+
// @ts-expect-error
|
|
84
|
+
query: (0, import_node_util.promisify)(database.all).bind(database),
|
|
85
|
+
// @ts-expect-error
|
|
86
|
+
close: (0, import_node_util.promisify)(database.close).bind(database)
|
|
87
|
+
}));
|
|
77
88
|
this.opts = {
|
|
78
89
|
table: "keyv",
|
|
79
90
|
keySize: 255,
|
|
80
91
|
...options
|
|
81
92
|
};
|
|
82
|
-
this.opts.table =
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
93
|
+
this.opts.table = toTableString(this.opts.table);
|
|
94
|
+
const keySize = Number(this.opts.keySize);
|
|
95
|
+
if (!Number.isFinite(keySize) || keySize <= 0 || keySize > 65535) {
|
|
96
|
+
throw new Error(
|
|
97
|
+
"Invalid keySize: must be a positive number between 1 and 65535"
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
const createTable = `CREATE TABLE IF NOT EXISTS ${this.opts.table}(key VARCHAR(${keySize}) PRIMARY KEY, value TEXT )`;
|
|
101
|
+
const connected = this.opts.connect().then(
|
|
102
|
+
async (database) => database.query(createTable).then(() => database)
|
|
103
|
+
).catch((error) => {
|
|
104
|
+
this.emit("error", error);
|
|
105
|
+
throw error;
|
|
106
|
+
});
|
|
107
|
+
this.query = async (sqlString, ...parameter) => connected.then(
|
|
108
|
+
async (database) => database.query(sqlString, ...parameter)
|
|
109
|
+
);
|
|
86
110
|
this.close = async () => connected.then((database) => database.close());
|
|
87
111
|
}
|
|
88
112
|
async get(key) {
|
|
@@ -98,10 +122,13 @@ var KeyvSqlite = class extends import_events.default {
|
|
|
98
122
|
const select = `SELECT * FROM ${this.opts.table} WHERE key IN (SELECT value FROM json_each(?))`;
|
|
99
123
|
const rows = await this.query(select, JSON.stringify(keys));
|
|
100
124
|
return keys.map((key) => {
|
|
101
|
-
const row = rows.find(
|
|
125
|
+
const row = rows.find(
|
|
126
|
+
(row2) => row2.key === key
|
|
127
|
+
);
|
|
102
128
|
return row ? row.value : void 0;
|
|
103
129
|
});
|
|
104
130
|
}
|
|
131
|
+
// biome-ignore lint/suspicious/noExplicitAny: type format
|
|
105
132
|
async set(key, value) {
|
|
106
133
|
const upsert = `INSERT INTO ${this.opts.table} (key, value)
|
|
107
134
|
VALUES(?, ?)
|
|
@@ -137,7 +164,12 @@ var KeyvSqlite = class extends import_events.default {
|
|
|
137
164
|
const limit = Number.parseInt(this.opts.iterationLimit, 10) || 10;
|
|
138
165
|
async function* iterate(offset, options, query) {
|
|
139
166
|
const select = `SELECT * FROM ${options.table} WHERE key LIKE ? LIMIT ? OFFSET ?`;
|
|
140
|
-
const iterator = await query(select, [
|
|
167
|
+
const iterator = await query(select, [
|
|
168
|
+
// biome-ignore lint/style/useTemplate: need to fix
|
|
169
|
+
`${namespace ? namespace + ":" : ""}%`,
|
|
170
|
+
limit,
|
|
171
|
+
offset
|
|
172
|
+
]);
|
|
141
173
|
const entries = [...iterator];
|
|
142
174
|
if (entries.length === 0) {
|
|
143
175
|
return;
|
|
@@ -166,3 +198,4 @@ var index_default = KeyvSqlite;
|
|
|
166
198
|
KeyvSqlite,
|
|
167
199
|
createKeyv
|
|
168
200
|
});
|
|
201
|
+
/* v8 ignore next -- @preserve */
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -3,7 +3,13 @@ import EventEmitter from "events";
|
|
|
3
3
|
import { promisify } from "util";
|
|
4
4
|
import Keyv from "keyv";
|
|
5
5
|
import sqlite3 from "sqlite3";
|
|
6
|
-
var
|
|
6
|
+
var toTableString = (input) => {
|
|
7
|
+
const sanitized = String(input).replace(/[^a-zA-Z0-9_]/g, "");
|
|
8
|
+
if (sanitized.length === 0) {
|
|
9
|
+
throw new Error("Invalid table name: must contain alphanumeric characters");
|
|
10
|
+
}
|
|
11
|
+
return /^[a-zA-Z]/.test(sanitized) ? sanitized : `_${sanitized}`;
|
|
12
|
+
};
|
|
7
13
|
var KeyvSqlite = class extends EventEmitter {
|
|
8
14
|
ttlSupport;
|
|
9
15
|
opts;
|
|
@@ -37,16 +43,34 @@ var KeyvSqlite = class extends EventEmitter {
|
|
|
37
43
|
resolve(database);
|
|
38
44
|
}
|
|
39
45
|
});
|
|
40
|
-
}).then((database) => ({
|
|
46
|
+
}).then((database) => ({
|
|
47
|
+
// @ts-expect-error
|
|
48
|
+
query: promisify(database.all).bind(database),
|
|
49
|
+
// @ts-expect-error
|
|
50
|
+
close: promisify(database.close).bind(database)
|
|
51
|
+
}));
|
|
41
52
|
this.opts = {
|
|
42
53
|
table: "keyv",
|
|
43
54
|
keySize: 255,
|
|
44
55
|
...options
|
|
45
56
|
};
|
|
46
|
-
this.opts.table =
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
this.opts.table = toTableString(this.opts.table);
|
|
58
|
+
const keySize = Number(this.opts.keySize);
|
|
59
|
+
if (!Number.isFinite(keySize) || keySize <= 0 || keySize > 65535) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
"Invalid keySize: must be a positive number between 1 and 65535"
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
const createTable = `CREATE TABLE IF NOT EXISTS ${this.opts.table}(key VARCHAR(${keySize}) PRIMARY KEY, value TEXT )`;
|
|
65
|
+
const connected = this.opts.connect().then(
|
|
66
|
+
async (database) => database.query(createTable).then(() => database)
|
|
67
|
+
).catch((error) => {
|
|
68
|
+
this.emit("error", error);
|
|
69
|
+
throw error;
|
|
70
|
+
});
|
|
71
|
+
this.query = async (sqlString, ...parameter) => connected.then(
|
|
72
|
+
async (database) => database.query(sqlString, ...parameter)
|
|
73
|
+
);
|
|
50
74
|
this.close = async () => connected.then((database) => database.close());
|
|
51
75
|
}
|
|
52
76
|
async get(key) {
|
|
@@ -62,10 +86,13 @@ var KeyvSqlite = class extends EventEmitter {
|
|
|
62
86
|
const select = `SELECT * FROM ${this.opts.table} WHERE key IN (SELECT value FROM json_each(?))`;
|
|
63
87
|
const rows = await this.query(select, JSON.stringify(keys));
|
|
64
88
|
return keys.map((key) => {
|
|
65
|
-
const row = rows.find(
|
|
89
|
+
const row = rows.find(
|
|
90
|
+
(row2) => row2.key === key
|
|
91
|
+
);
|
|
66
92
|
return row ? row.value : void 0;
|
|
67
93
|
});
|
|
68
94
|
}
|
|
95
|
+
// biome-ignore lint/suspicious/noExplicitAny: type format
|
|
69
96
|
async set(key, value) {
|
|
70
97
|
const upsert = `INSERT INTO ${this.opts.table} (key, value)
|
|
71
98
|
VALUES(?, ?)
|
|
@@ -101,7 +128,12 @@ var KeyvSqlite = class extends EventEmitter {
|
|
|
101
128
|
const limit = Number.parseInt(this.opts.iterationLimit, 10) || 10;
|
|
102
129
|
async function* iterate(offset, options, query) {
|
|
103
130
|
const select = `SELECT * FROM ${options.table} WHERE key LIKE ? LIMIT ? OFFSET ?`;
|
|
104
|
-
const iterator = await query(select, [
|
|
131
|
+
const iterator = await query(select, [
|
|
132
|
+
// biome-ignore lint/style/useTemplate: need to fix
|
|
133
|
+
`${namespace ? namespace + ":" : ""}%`,
|
|
134
|
+
limit,
|
|
135
|
+
offset
|
|
136
|
+
]);
|
|
105
137
|
const entries = [...iterator];
|
|
106
138
|
if (entries.length === 0) {
|
|
107
139
|
return;
|
|
@@ -130,3 +162,4 @@ export {
|
|
|
130
162
|
createKeyv,
|
|
131
163
|
index_default as default
|
|
132
164
|
};
|
|
165
|
+
/* v8 ignore next -- @preserve */
|
package/package.json
CHANGED
|
@@ -1,33 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keyv/sqlite",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.8",
|
|
4
4
|
"description": "SQLite storage adapter for Keyv",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "dist/index.
|
|
7
|
-
"module": "dist/index.js",
|
|
8
|
-
"types": "dist/index.d.ts",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
-
"require":
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"n/file-extension-in-import": "off",
|
|
20
|
-
"unicorn/prefer-event-target": "off",
|
|
21
|
-
"unicorn/prefer-node-protocol": "off",
|
|
22
|
-
"promise/prefer-await-to-then": "off",
|
|
23
|
-
"@typescript-eslint/use-unknown-in-catch-callback-variable": "off",
|
|
24
|
-
"import/extensions": "off",
|
|
25
|
-
"@typescript-eslint/no-unsafe-argument": "off",
|
|
26
|
-
"@typescript-eslint/no-unsafe-assignment": "off",
|
|
27
|
-
"@typescript-eslint/no-unsafe-call": "off",
|
|
28
|
-
"@typescript-eslint/no-unsafe-return": "off",
|
|
29
|
-
"import/no-extraneous-dependencies": "off",
|
|
30
|
-
"unicorn/prevent-abbreviations": "off"
|
|
11
|
+
"require": {
|
|
12
|
+
"types": "./dist/index.d.cts",
|
|
13
|
+
"default": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"import": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"default": "./dist/index.js"
|
|
18
|
+
}
|
|
31
19
|
}
|
|
32
20
|
},
|
|
33
21
|
"repository": {
|
|
@@ -56,16 +44,16 @@
|
|
|
56
44
|
"sqlite3": "^5.1.7"
|
|
57
45
|
},
|
|
58
46
|
"peerDependencies": {
|
|
59
|
-
"keyv": "^5.
|
|
47
|
+
"keyv": "^5.6.0"
|
|
60
48
|
},
|
|
61
49
|
"devDependencies": {
|
|
62
|
-
"@
|
|
63
|
-
"@
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"@keyv/test-suite": "^2.
|
|
50
|
+
"@biomejs/biome": "^2.3.11",
|
|
51
|
+
"@faker-js/faker": "^10.2.0",
|
|
52
|
+
"@vitest/coverage-v8": "^4.0.17",
|
|
53
|
+
"rimraf": "^6.1.2",
|
|
54
|
+
"tsd": "^0.33.0",
|
|
55
|
+
"vitest": "^4.0.17",
|
|
56
|
+
"@keyv/test-suite": "^2.1.2"
|
|
69
57
|
},
|
|
70
58
|
"tsd": {
|
|
71
59
|
"directory": "test"
|
|
@@ -79,8 +67,10 @@
|
|
|
79
67
|
],
|
|
80
68
|
"scripts": {
|
|
81
69
|
"build": "rimraf ./dist && tsup src/index.ts --format cjs,esm --dts --clean",
|
|
82
|
-
"
|
|
83
|
-
"
|
|
70
|
+
"lint": "biome check --write --error-on-warnings",
|
|
71
|
+
"lint:ci": "biome check --error-on-warnings",
|
|
72
|
+
"test": "pnpm lint && vitest run --coverage",
|
|
73
|
+
"test:ci": "pnpm lint:ci && vitest --run --sequence.setupFiles=list --coverage",
|
|
84
74
|
"clean": "rimraf ./node_modules ./coverage ./test/testdb.sqlite ./dist"
|
|
85
75
|
}
|
|
86
76
|
}
|