From 10c8aa93a7fe3f9a053ca4231f7f2e10f1e3fa30 Mon Sep 17 00:00:00 2001 From: Paul Valladares <85648028+dreyfus92@users.noreply.github.com> Date: Tue, 28 Apr 2026 18:37:30 -0500 Subject: [PATCH 1/4] feat(preferred): add `sqlite3` replacement options --- docs/modules/sqlite3.md | 56 ++++++++++++++++++++++++++++++++++++++++ manifests/preferred.json | 33 ++++++++++++++++------- 2 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 docs/modules/sqlite3.md diff --git a/docs/modules/sqlite3.md b/docs/modules/sqlite3.md new file mode 100644 index 0000000..52ecd6e --- /dev/null +++ b/docs/modules/sqlite3.md @@ -0,0 +1,56 @@ +--- +description: Modern alternatives to the sqlite3 package for working with SQLite in Node.js +--- + +# Replacements for `sqlite3` + +## `node:sqlite` (native, Node.js) + +Node.js ships a built-in SQLite module, [`node:sqlite`](https://nodejs.org/api/sqlite.html), which is the preferred option when you can target a recent Node runtime. + +Example: + +```ts +import sqlite3 from 'sqlite3' // [!code --] +import { DatabaseSync } from 'node:sqlite' // [!code ++] + +const db = new sqlite3.Database('app.db') // [!code --] +const db = new DatabaseSync('app.db') // [!code ++] + +db.all('SELECT * FROM users', (err, rows) => {}) // [!code --] +const rows = db.prepare('SELECT * FROM users').all() // [!code ++] +``` + +## `better-sqlite3` + +[`better-sqlite3`](https://github.com/WiseLibs/better-sqlite3) is a popular and actively maintained SQLite library for Node.js. + +Example: + +```ts +import sqlite3 from 'sqlite3' // [!code --] +import Database from 'better-sqlite3' // [!code ++] + +const db = new sqlite3.Database('app.db') // [!code --] +const db = new Database('app.db') // [!code ++] + +db.all('SELECT * FROM users', (err, rows) => {}) // [!code --] +const rows = db.prepare('SELECT * FROM users').all() // [!code ++] +``` + +## `sqlite` + +[`sqlite`](https://github.com/kriasoft/node-sqlite) is an actively maintained option commonly used for promise-based APIs. + +Example: + +```ts +import sqlite3 from 'sqlite3' // [!code --] +import { open } from 'sqlite' // [!code ++] + +const db = new sqlite3.Database('app.db') // [!code --] +const db = await open({ filename: 'app.db', driver: sqlite3.Database }) // [!code ++] + +db.all('SELECT * FROM users', (err, rows) => {}) // [!code --] +const rows = await db.all('SELECT * FROM users') // [!code ++] +``` diff --git a/manifests/preferred.json b/manifests/preferred.json index e275345..aca8c93 100644 --- a/manifests/preferred.json +++ b/manifests/preferred.json @@ -2576,6 +2576,12 @@ "replacements": ["readline.createInterface"], "url": {"type": "e18e", "id": "split"} }, + "sqlite3": { + "type": "module", + "moduleName": "sqlite3", + "replacements": ["node:sqlite", "better-sqlite3", "sqlite"], + "url": {"type": "e18e", "id": "sqlite3"} + }, "stream-buffers": { "type": "module", "moduleName": "stream-buffers", @@ -2905,6 +2911,11 @@ "type": "documented", "replacementModule": "ansis" }, + "better-sqlite3": { + "id": "better-sqlite3", + "type": "documented", + "replacementModule": "better-sqlite3" + }, "betterknown": { "id": "betterknown", "type": "documented", @@ -2942,10 +2953,7 @@ "crypto.timingSafeEqual": { "id": "crypto.timingSafeEqual", "type": "native", - "url": { - "type": "node", - "id": "api/crypto.html#cryptotimingsafeequala-b" - }, + "url": {"type": "node", "id": "api/crypto.html#cryptotimingsafeequala-b"}, "nodeFeatureId": {"moduleName": "crypto", "exportName": "timingSafeEqual"} }, "date-fns": { @@ -3169,11 +3177,7 @@ "type": "documented", "replacementModule": "milliparsec" }, - "mri": { - "id": "mri", - "type": "documented", - "replacementModule": "mri" - }, + "mri": {"id": "mri", "type": "documented", "replacementModule": "mri"}, "nano-staged": { "id": "nano-staged", "type": "documented", @@ -3220,6 +3224,12 @@ "type": "documented", "replacementModule": "node:fs" }, + "node:sqlite": { + "id": "node:sqlite", + "type": "native", + "nodeFeatureId": {"moduleName": "node:sqlite"}, + "url": {"type": "node", "id": "api/sqlite.html"} + }, "node:stream": { "id": "node:stream", "type": "native", @@ -3336,6 +3346,11 @@ "type": "documented", "replacementModule": "sortobject" }, + "sqlite": { + "id": "sqlite", + "type": "documented", + "replacementModule": "sqlite" + }, "streams": { "id": "streams", "type": "native", From 1ade6213be7c543c6f7611cf84d108266e75fd98 Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Tue, 5 May 2026 08:55:23 +0100 Subject: [PATCH 2/4] chore: remove sqlite --- docs/modules/sqlite3.md | 17 ----------------- manifests/preferred.json | 7 +------ 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/docs/modules/sqlite3.md b/docs/modules/sqlite3.md index 52ecd6e..e06f193 100644 --- a/docs/modules/sqlite3.md +++ b/docs/modules/sqlite3.md @@ -37,20 +37,3 @@ const db = new Database('app.db') // [!code ++] db.all('SELECT * FROM users', (err, rows) => {}) // [!code --] const rows = db.prepare('SELECT * FROM users').all() // [!code ++] ``` - -## `sqlite` - -[`sqlite`](https://github.com/kriasoft/node-sqlite) is an actively maintained option commonly used for promise-based APIs. - -Example: - -```ts -import sqlite3 from 'sqlite3' // [!code --] -import { open } from 'sqlite' // [!code ++] - -const db = new sqlite3.Database('app.db') // [!code --] -const db = await open({ filename: 'app.db', driver: sqlite3.Database }) // [!code ++] - -db.all('SELECT * FROM users', (err, rows) => {}) // [!code --] -const rows = await db.all('SELECT * FROM users') // [!code ++] -``` diff --git a/manifests/preferred.json b/manifests/preferred.json index aca8c93..8db93ee 100644 --- a/manifests/preferred.json +++ b/manifests/preferred.json @@ -2579,7 +2579,7 @@ "sqlite3": { "type": "module", "moduleName": "sqlite3", - "replacements": ["node:sqlite", "better-sqlite3", "sqlite"], + "replacements": ["node:sqlite", "better-sqlite3"], "url": {"type": "e18e", "id": "sqlite3"} }, "stream-buffers": { @@ -3346,11 +3346,6 @@ "type": "documented", "replacementModule": "sortobject" }, - "sqlite": { - "id": "sqlite", - "type": "documented", - "replacementModule": "sqlite" - }, "streams": { "id": "streams", "type": "native", From 84f1cf4415b96e92c0e24e1782743b5ddef63b4e Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Wed, 6 May 2026 09:06:07 +0100 Subject: [PATCH 3/4] chore: escape the 9b --- manifests/micro-utilities.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifests/micro-utilities.json b/manifests/micro-utilities.json index 181f7cb..5b92d52 100644 --- a/manifests/micro-utilities.json +++ b/manifests/micro-utilities.json @@ -100,7 +100,7 @@ "id": "snippet::has-ansi", "type": "simple", "description": "You can use the `includes` method on the string to check if a specific ANSI byte is present.", - "example": "string.includes(\"\u001b\") || string.includes(\"›\")" + "example": "string.includes(\"\\u001b\") || string.includes(\"\\u009b\")" }, "snippet::has-argv": { "id": "snippet::has-argv", From ab22274ef19cc51bbe960fd4d5187a42831139dc Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Wed, 6 May 2026 09:07:06 +0100 Subject: [PATCH 4/4] Apply suggestion from @gameroman Co-authored-by: Roman --- docs/modules/sqlite3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/sqlite3.md b/docs/modules/sqlite3.md index e06f193..8b78348 100644 --- a/docs/modules/sqlite3.md +++ b/docs/modules/sqlite3.md @@ -4,7 +4,7 @@ description: Modern alternatives to the sqlite3 package for working with SQLite # Replacements for `sqlite3` -## `node:sqlite` (native, Node.js) +## `node:sqlite` (native, since Node.js 22.13.0) Node.js ships a built-in SQLite module, [`node:sqlite`](https://nodejs.org/api/sqlite.html), which is the preferred option when you can target a recent Node runtime.