Skip to content

Commit 2907e0c

Browse files
Build for node v24
1 parent dcb0901 commit 2907e0c

File tree

6 files changed

+179
-15
lines changed

6 files changed

+179
-15
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
- name: Setup Node.js
2424
uses: actions/setup-node@v4
2525
with:
26-
node-version: "20"
26+
node-version: "24"
2727

2828
- name: Cache node_modules
2929
uses: actions/cache@v4

.github/workflows/ci_bun.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ on:
1111
jobs:
1212
build:
1313
runs-on: ubuntu-latest
14+
timeout-minutes: 20
1415
steps:
1516
- name: Git checkout
1617
uses: actions/checkout@v4

.github/workflows/ci_node20.yml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: Node v20 CI
2+
3+
on:
4+
push:
5+
paths-ignore:
6+
- "*.md"
7+
branches: [main]
8+
pull_request:
9+
branches: [main]
10+
11+
jobs:
12+
build:
13+
runs-on: ubuntu-latest
14+
timeout-minutes: 20
15+
steps:
16+
- name: Git checkout
17+
uses: actions/checkout@v4
18+
with:
19+
fetch-depth: 0
20+
21+
- name: Setup Node.js
22+
uses: actions/setup-node@v4
23+
with:
24+
node-version: "20"
25+
26+
- name: Cache node_modules
27+
uses: actions/cache@v4
28+
with:
29+
path: |
30+
~/.npm
31+
~/.nvm
32+
~/work/better-sqlite3-wrapper/better-sqlite3-wrapper/node_modules
33+
~/work/better-sqlite3-wrapper/better-sqlite3-wrapper/package-lock.json
34+
key: ${{ runner.os }}-node_modules-cache-v1-${{ hashFiles('**/package-lock.json') }}
35+
restore-keys: |
36+
${{ runner.os }}-node_modules-cache-v1-
37+
38+
- name: Run tests
39+
run: |
40+
npm i
41+
node ./index.test.js

index.js

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,70 @@ const wrapper = function () {
33
return require("bun:sqlite").Database;
44
}
55

6-
return require("better-sqlite3");
6+
if (isModuleAvailable("better-sqlite3")) {
7+
return require("better-sqlite3");
8+
}
9+
10+
const { DatabaseSync } = require("node:sqlite");
11+
function dbCtor(path, options) {
12+
if (options) {
13+
return nodeDbWrapper(new DatabaseSync(path, options));
14+
}
15+
16+
return nodeDbWrapper(new DatabaseSync(path));
17+
}
18+
return dbCtor;
719
};
820

21+
function isModuleAvailable(name) {
22+
try {
23+
require.resolve(name);
24+
return true;
25+
} catch {}
26+
27+
return false;
28+
}
29+
30+
function nodeDbWrapper(db) {
31+
//check if node supports it
32+
//see: https://github.com/nodejs/node/issues/57431
33+
if (db.transaction) {
34+
return db;
35+
}
36+
37+
//see: https://github.com/WiseLibs/better-sqlite3/blob/master/docs/api.md#transactionfunction---function
38+
db.transaction = (f) => {
39+
const doTx = (...args) => {
40+
try {
41+
const res = f(...args);
42+
db.prepare("COMMIT").run();
43+
return res;
44+
} catch (error) {
45+
db.prepare("ROLLBACK").run();
46+
throw error;
47+
}
48+
};
49+
50+
const txFn = (...args) => {
51+
db.prepare("BEGIN").run();
52+
return doTx(...args);
53+
};
54+
txFn.deferred = (...args) => {
55+
db.prepare("BEGIN DEFERRED").run();
56+
return doTx(...args);
57+
};
58+
txFn.immediate = (...args) => {
59+
db.prepare("BEGIN IMMEDIATE").run();
60+
return doTx(...args);
61+
};
62+
txFn.exclusive = (...args) => {
63+
db.prepare("BEGIN EXCLUSIVE").run();
64+
return doTx(...args);
65+
};
66+
67+
return txFn;
68+
};
69+
return db;
70+
}
71+
972
module.exports = wrapper();

index.test.js

Lines changed: 71 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,17 @@ it("should open in-memory database", () => {
1414
const query = db.prepare("select 'Hello world' as message;");
1515

1616
//then
17-
assert.deepEqual(query.get(), { message: "Hello world" });
17+
assert.deepEqual({ ...query.get() }, { message: "Hello world" });
1818

1919
//when & then
2020
const results = query.all();
2121
assert.deepEqual(Array.isArray(results), true);
22-
assert.deepEqual(results, [{ message: "Hello world" }]);
22+
assert.deepEqual(
23+
results.map((r) => {
24+
return { ...r };
25+
}),
26+
[{ message: "Hello world" }]
27+
);
2328

2429
//when & then
2530
db.close();
@@ -62,19 +67,73 @@ it("should create file-based database", () => {
6267
const results = db.prepare("select * from test order by id;").all();
6368

6469
//then
65-
assert.deepEqual(results, [
66-
{
67-
id: 1,
68-
name: "test1",
69-
},
70-
{
71-
id: 2,
72-
name: "test2",
73-
},
74-
]);
70+
assert.deepEqual(
71+
results.map((r) => {
72+
return { ...r };
73+
}),
74+
[
75+
{
76+
id: 1,
77+
name: "test1",
78+
},
79+
{
80+
id: 2,
81+
name: "test2",
82+
},
83+
]
84+
);
7585

7686
//cleanup
7787
db.close();
7888
fs.unlinkSync(file);
7989
fs.rmdirSync(tmpDir);
8090
});
91+
92+
it("should rollback failed transaction", () => {
93+
//when
94+
const db = new Database(":memory:");
95+
const changesQuery = db.prepare("SELECT changes() AS changes;");
96+
const lastInsertRowIdQuery = db.prepare("SELECT last_insert_rowid() AS id;");
97+
db.prepare(
98+
`
99+
create table test(
100+
id integer primary key,
101+
name text not null
102+
);
103+
`
104+
).run();
105+
assert.deepEqual(changesQuery.get().changes, 0);
106+
assert.deepEqual(lastInsertRowIdQuery.get().id, 0);
107+
108+
const error = Error("test error");
109+
const txFn = db.transaction((name) => {
110+
const insert = db.prepare("insert into test (name) values (?);");
111+
insert.run(name);
112+
throw error;
113+
});
114+
let caughtError = null;
115+
116+
//when
117+
try {
118+
txFn("test1");
119+
} catch (err) {
120+
caughtError = err;
121+
}
122+
123+
//then
124+
assert.deepEqual(caughtError === error, true);
125+
assert.deepEqual(changesQuery.get().changes, 1);
126+
assert.deepEqual(lastInsertRowIdQuery.get().id, 1);
127+
128+
//when & then
129+
const query = db.prepare("select id, name from test;");
130+
assert.deepEqual(
131+
query.all().map((r) => {
132+
return { ...r };
133+
}),
134+
[]
135+
);
136+
137+
//cleanup
138+
db.close();
139+
});

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"bun": ">=0.8"
4343
},
4444
"optionalDependencies": {
45-
"better-sqlite3": "^11.5.0"
45+
"better-sqlite3": "10.1.0"
4646
},
4747
"devDependencies": {
4848
"prettier": "^2.8.8",

0 commit comments

Comments
 (0)