@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 CHANGED
@@ -35,12 +35,18 @@ __export(index_exports, {
35
35
  default: () => index_default
36
36
  });
37
37
  module.exports = __toCommonJS(index_exports);
38
- var import_events = __toESM(require("events"), 1);
39
- var import_util = require("util");
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 toString = (input) => String(input).search(/^[a-zA-Z]+$/) < 0 ? "_" + input : input;
43
- var KeyvSqlite = class extends import_events.default {
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) => ({ query: (0, import_util.promisify)(database.all).bind(database), close: (0, import_util.promisify)(database.close).bind(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 = toString(this.opts.table);
83
- const createTable = `CREATE TABLE IF NOT EXISTS ${this.opts.table}(key VARCHAR(${Number(this.opts.keySize)}) PRIMARY KEY, value TEXT )`;
84
- const connected = this.opts.connect().then(async (database) => database.query(createTable).then(() => database)).catch((error) => this.emit("error", error));
85
- this.query = async (sqlString, ...parameter) => connected.then(async (database) => database.query(sqlString, ...parameter));
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((row2) => row2.key === key);
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, [`${namespace ? namespace + ":" : ""}%`, limit, offset]);
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
@@ -1,4 +1,4 @@
1
- import EventEmitter from 'events';
1
+ import EventEmitter from 'node:events';
2
2
  import Keyv, { KeyvStoreAdapter, StoredData } from 'keyv';
3
3
 
4
4
  type DbQuery = (sqlString: string, ...parameter: unknown[]) => Promise<any>;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import EventEmitter from 'events';
1
+ import EventEmitter from 'node:events';
2
2
  import Keyv, { KeyvStoreAdapter, StoredData } from 'keyv';
3
3
 
4
4
  type DbQuery = (sqlString: string, ...parameter: unknown[]) => Promise<any>;
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 toString = (input) => String(input).search(/^[a-zA-Z]+$/) < 0 ? "_" + input : input;
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) => ({ query: promisify(database.all).bind(database), close: promisify(database.close).bind(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 = toString(this.opts.table);
47
- const createTable = `CREATE TABLE IF NOT EXISTS ${this.opts.table}(key VARCHAR(${Number(this.opts.keySize)}) PRIMARY KEY, value TEXT )`;
48
- const connected = this.opts.connect().then(async (database) => database.query(createTable).then(() => database)).catch((error) => this.emit("error", error));
49
- this.query = async (sqlString, ...parameter) => connected.then(async (database) => database.query(sqlString, ...parameter));
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((row2) => row2.key === key);
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, [`${namespace ? namespace + ":" : ""}%`, limit, offset]);
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.5",
3
+ "version": "4.0.8",
4
4
  "description": "SQLite storage adapter for Keyv",
5
5
  "type": "module",
6
- "main": "dist/index.cjs",
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": "./dist/index.cjs",
12
- "import": "./dist/index.js"
13
- }
14
- },
15
- "xo": {
16
- "rules": {
17
- "import/no-named-as-default": "off",
18
- "unicorn/prefer-module": "off",
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.3.4"
47
+ "keyv": "^5.6.0"
60
48
  },
61
49
  "devDependencies": {
62
- "@faker-js/faker": "^9.8.0",
63
- "@vitest/coverage-v8": "^3.2.4",
64
- "rimraf": "^6.0.1",
65
- "tsd": "^0.32.0",
66
- "vitest": "^3.2.4",
67
- "xo": "^1.1.0",
68
- "@keyv/test-suite": "^2.0.8"
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
- "test": "xo --fix && vitest run --coverage",
83
- "test:ci": "xo && vitest --run --sequence.setupFiles=list --coverage",
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
  }