Skip to content

Commit 7d7958c

Browse files
authored
build(dep): replace sqlite3 with better-sqlite3 (#116)
1 parent 4dc2ac2 commit 7d7958c

File tree

7 files changed

+69
-686
lines changed

7 files changed

+69
-686
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"@heroui/tooltip": "2.2.24",
1818
"@tailwindcss/vite": "4.1.15",
1919
"@vitejs/plugin-react": "5.0.4",
20+
"better-sqlite3": "12.4.1",
2021
"buffer": "6.0.3",
2122
"compression": "1.8.1",
2223
"express": "5.1.0",
@@ -26,7 +27,6 @@
2627
"protobufjs": "7.5.3",
2728
"react": "19.2.0",
2829
"react-dom": "19.2.0",
29-
"sqlite3": "5.1.7",
3030
"tailwindcss": "4.1.15",
3131
"vike": "0.4.244",
3232
"vike-react": "0.6.10",
@@ -36,6 +36,7 @@
3636
"devDependencies": {
3737
"@eslint/compat": "1.4.0",
3838
"@eslint/js": "9.38.0",
39+
"@types/better-sqlite3": "^7.6.13",
3940
"@types/compression": "1.8.1",
4041
"@types/express": "5.0.3",
4142
"@types/fontfaceobserver": "2.1.3",

pages/@workspace/builder/+data.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ import { render } from 'vike/abort'
1919
import { db } from '../../../repo/database'
2020
import { getWorkspace } from '../../../repo/workspace'
2121

22-
export const data = async (pageContext: PageContextServer) => {
23-
const workspace = await getWorkspace(db, pageContext.routeParams.workspace)
22+
export const data = (pageContext: PageContextServer) => {
23+
const workspace = getWorkspace(db, pageContext.routeParams.workspace)
2424
if (!workspace) {
2525
throw render(
2626
404,

pnpm-lock.yaml

Lines changed: 22 additions & 594 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

repo/database.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,12 @@
1515
*/
1616

1717
import fs from 'node:fs'
18-
import sqlite3 from 'sqlite3'
18+
import Database from 'better-sqlite3'
1919

20-
export const db = new sqlite3.Database(process.env.DATABASE_PATH ?? '')
20+
export const db = new Database(process.env.DATABASE_PATH ?? '')
2121

2222
export const initDB = () => {
23-
return new Promise<void>((resolve, reject) => {
24-
const initDBData = fs.readFileSync('./repo/db.sql', 'utf8')
23+
const initDBData = fs.readFileSync('./repo/db.sql', 'utf8')
2524

26-
db.exec(initDBData, function (this, err) {
27-
if (err) {
28-
reject(err)
29-
return
30-
}
31-
32-
resolve()
33-
})
34-
})
25+
db.exec(initDBData)
3526
}

repo/workspace.ts

Lines changed: 32 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
import sqlite3 from 'sqlite3'
17+
import { Database } from 'better-sqlite3'
1818
import { Sentence, RuleSet } from './proto/bundle.js'
1919
import { DEFAULT_SENTENCE } from './data/sentence.js'
2020
import { DEFAULT_RULESET } from './data/ruleset.js'
@@ -35,86 +35,49 @@ interface WorkspaceRow {
3535
updated_at: string
3636
}
3737

38-
interface Workspace {
39-
id: string
40-
ruleset: RuleSet
41-
sentence: Sentence
42-
createdAt: Date
43-
updatedAt: Date
44-
}
45-
46-
export const createWorkspace = async (db: sqlite3.Database, id: string) => {
38+
export const createWorkspace = (db: Database, id: string) => {
4739
const timestamp = new Date()
4840

4941
const sentence = Sentence.encode(DEFAULT_SENTENCE).finish()
5042
const ruleSet = RuleSet.encode(DEFAULT_RULESET).finish()
5143

52-
return new Promise<sqlite3.RunResult>((resolve, reject) =>
53-
db.run(
54-
'INSERT INTO workspaces (id, sentence, ruleset, created_at, updated_at) VALUES (?, ?, ?, ?, ?);',
55-
[id, sentence, ruleSet, timestamp.toISOString(), timestamp.toISOString()],
56-
function (this, err) {
57-
if (err) {
58-
reject(err)
59-
return
60-
}
61-
62-
resolve(this)
63-
}
64-
)
65-
)
44+
db.prepare(
45+
'INSERT INTO workspaces (id, sentence, ruleset, created_at, updated_at) VALUES (?, ?, ?, ?, ?);'
46+
).run(id, sentence, ruleSet, timestamp.toISOString(), timestamp.toISOString())
6647
}
6748

68-
export const getWorkspace = async (db: sqlite3.Database, id: string) => {
69-
return new Promise<Workspace | void>((resolve, reject) => {
70-
db.get(
71-
'SELECT id, sentence, ruleset, created_at, updated_at FROM workspaces WHERE id = ?;',
72-
id,
73-
function (this, err, row: WorkspaceRow) {
74-
if (err) {
75-
reject(err)
76-
return
77-
}
78-
if (!row) {
79-
resolve()
80-
return
81-
}
49+
export const getWorkspace = (db: Database, id: string) => {
50+
const row = db
51+
.prepare<
52+
string,
53+
WorkspaceRow
54+
>('SELECT id, sentence, ruleset, created_at, updated_at FROM workspaces WHERE id = ?;')
55+
.get(id)
56+
if (!row) {
57+
return undefined
58+
}
8259

83-
resolve({
84-
id: row.id,
85-
ruleset: RuleSet.decode(row.ruleset),
86-
sentence: Sentence.decode(row.sentence),
87-
createdAt: new Date(row.created_at),
88-
updatedAt: new Date(row.updated_at)
89-
})
90-
}
91-
)
92-
})
60+
return {
61+
id: row.id,
62+
ruleset: RuleSet.decode(row.ruleset),
63+
sentence: Sentence.decode(row.sentence),
64+
createdAt: new Date(row.created_at),
65+
updatedAt: new Date(row.updated_at)
66+
}
9367
}
9468

95-
export const updateWorkspace = async (
96-
db: sqlite3.Database,
69+
export const updateWorkspace = (
70+
db: Database,
9771
id: string,
9872
ruleset: RuleSet,
9973
sentence: Sentence
10074
) => {
101-
return new Promise((resolve, reject) => {
102-
db.run(
103-
'UPDATE workspaces SET sentence = ?, ruleset = ?, updated_at = ? WHERE id = ?;',
104-
[
105-
Sentence.encode(sentence).finish(),
106-
RuleSet.encode(ruleset).finish(),
107-
new Date().toISOString(),
108-
id
109-
],
110-
function (this, err) {
111-
if (err) {
112-
reject(err)
113-
return
114-
}
115-
116-
resolve(this)
117-
}
118-
)
119-
})
75+
db.prepare(
76+
'UPDATE workspaces SET sentence = ?, ruleset = ?, updated_at = ? WHERE id = ?;'
77+
).run(
78+
Sentence.encode(sentence).finish(),
79+
RuleSet.encode(ruleset).finish(),
80+
new Date().toISOString(),
81+
id
82+
)
12083
}

server/handlers/workspace.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ import { randomUUID } from 'node:crypto'
2727

2828
export const router = Router()
2929

30-
router.post('/', async (_, res) => {
30+
router.post('/', (_, res) => {
3131
const id = randomUUID()
3232

33-
await createWorkspace(db, id)
33+
createWorkspace(db, id)
3434

3535
res.send({ id })
3636
})
3737

38-
router.get('/:id', async (req, res) => {
39-
const workspace = await getWorkspace(db, req.params.id)
38+
router.get('/:id', (req, res) => {
39+
const workspace = getWorkspace(db, req.params.id)
4040
if (!workspace) {
4141
res.sendStatus(404)
4242
return
@@ -51,7 +51,7 @@ type WorkspacePutReqest = Request<
5151
{ ruleset: unknown; sentence: unknown }
5252
>
5353

54-
router.put('/:id', async (req: WorkspacePutReqest, res) => {
54+
router.put('/:id', (req: WorkspacePutReqest, res) => {
5555
const ruleset: unknown = req.body.ruleset
5656
if (!isRuleSet(ruleset)) {
5757
res.sendStatus(422)
@@ -64,7 +64,7 @@ router.put('/:id', async (req: WorkspacePutReqest, res) => {
6464
return
6565
}
6666

67-
await updateWorkspace(db, req.params.id, ruleset, sentence)
67+
updateWorkspace(db, req.params.id, ruleset, sentence)
6868

6969
res.sendStatus(200)
7070
})

server/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { serve } from 'vike-server/express/serve'
2121
import { router as api } from './handlers/api.js'
2222
import { initDB } from '../repo/database.js'
2323

24-
initDB().catch(console.error)
24+
initDB()
2525

2626
const app = express()
2727

0 commit comments

Comments
 (0)