diff --git a/package.json b/package.json index df496e5ad..87f2affad 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ "@shikijs/langs": "^3.3.0", "@sqlite.org/sqlite-wasm": "3.49.1-build4", "@webcontainer/env": "^1.1.1", - "better-sqlite3": "^11.9.1", "c12": "^3.0.3", "chokidar": "^4.0.3", "consola": "^3.4.2", @@ -101,7 +100,8 @@ "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", - "sqlite3": "*" + "sqlite3": "*", + "better-sqlite3": "11.x" }, "peerDependenciesMeta": { "@electric-sql/pglite": { @@ -112,6 +112,9 @@ }, "sqlite3": { "optional": true + }, + "better-sqlite3": { + "optional": true } }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf229097e..b7d68ec4c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,7 +33,7 @@ importers: specifier: ^1.1.1 version: 1.1.1 better-sqlite3: - specifier: ^11.9.1 + specifier: 11.x version: 11.9.1 c12: specifier: ^3.0.3 diff --git a/src/utils/database.ts b/src/utils/database.ts index 7366b148a..f691d9cf1 100644 --- a/src/utils/database.ts +++ b/src/utils/database.ts @@ -1,6 +1,7 @@ import { mkdir } from 'node:fs/promises' import type { Connector } from 'db0' import type { Resolver } from '@nuxt/kit' +import { addDependency } from 'nypm' import cloudflareD1Connector from 'db0/connectors/cloudflare-d1' import { isAbsolute, join, dirname } from 'pathe' import { isWebContainer } from '@webcontainer/env' @@ -168,11 +169,13 @@ async function findBestSqliteAdapter(opts: { sqliteConnector?: SQLiteConnector } } if (opts.sqliteConnector === 'better-sqlite3') { + await requireBetterSqlite3() + return 'db0/connectors/better-sqlite3' } if (isWebContainer()) { - if (!await isSqlite3PackageInstalled()) { + if (!await isPackageInstalled('sqlite3')) { logger.error('Nuxt Content requires `sqlite3` module to work in WebContainer environment. Please run `npm install sqlite3` to install it and try again.') process.exit(1) } @@ -180,6 +183,8 @@ async function findBestSqliteAdapter(opts: { sqliteConnector?: SQLiteConnector } return 'db0/connectors/sqlite3' } + await requireBetterSqlite3() + return 'db0/connectors/better-sqlite3' } @@ -217,9 +222,27 @@ function isNodeSqliteAvailable() { } } -async function isSqlite3PackageInstalled() { +async function requireBetterSqlite3() { + if (!await isPackageInstalled('better-sqlite3')) { + logger.error('Nuxt Content requires `better-sqlite3` module to work in Node environment.') + + const confirm = await logger.prompt('Do you want to install `better-sqlite3` package?', { + type: 'confirm', + name: 'confirm', + initial: true, + }) + + if (!confirm) { + process.exit(1) + } + + await addDependency('better-sqlite3') + } +} + +async function isPackageInstalled(packageName: string) { try { - await import('sqlite3') + await import(packageName) return true } catch {