From e2170129ddf771146302be585a0a70d2c5b9a8b5 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Mon, 12 May 2025 18:45:57 +0300 Subject: [PATCH 1/4] chore(deps): make `better-sqlite3` dependency optional --- package.json | 7 +++++-- pnpm-lock.yaml | 2 +- src/utils/database.ts | 17 ++++++++++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index c837a3252..909b791fd 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 ddb6ce304..16180624d 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 8d439e25e..6d2e14060 100644 --- a/src/utils/database.ts +++ b/src/utils/database.ts @@ -168,11 +168,13 @@ function findBestSqliteAdapter(opts: { sqliteConnector?: SQLiteConnector }) { } if (opts.sqliteConnector === 'better-sqlite3') { + requireBetterSqlite3() + return 'db0/connectors/better-sqlite3' } if (isWebContainer()) { - if (!isSqlite3PackageInstalled()) { + if (!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 +182,8 @@ function findBestSqliteAdapter(opts: { sqliteConnector?: SQLiteConnector }) { return 'db0/connectors/sqlite3' } + requireBetterSqlite3() + return 'db0/connectors/better-sqlite3' } @@ -217,9 +221,16 @@ function isNodeSqliteAvailable() { } } -function isSqlite3PackageInstalled() { +function requireBetterSqlite3() { + if (!isPackageInstalled('better-sqlite3')) { + logger.error('Nuxt Content requires `better-sqlite3` module to work in Node environment. Please run `npm install better-sqlite3` to install it and try again.') + process.exit(1) + } +} + +function isPackageInstalled(packageName: string) { try { - require.resolve('sqlite3') + require.resolve(packageName) return true } catch { From ea336e0e22725345286f8812bb54a9eee9f1e46f Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Thu, 29 May 2025 15:44:51 +0300 Subject: [PATCH 2/4] chore(deps): suggest to install `better-sqlite3` if needed --- src/module.ts | 4 ++-- src/utils/database.ts | 26 +++++++++++++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/module.ts b/src/module.ts index 10f4b542e..29566ea6a 100644 --- a/src/module.ts +++ b/src/module.ts @@ -177,8 +177,8 @@ export default defineNuxtModule({ const resolveOptions = { resolver, sqliteConnector: options.experimental?.sqliteConnector || (options.experimental?.nativeSqlite ? 'native' : undefined) } config.alias ||= {} - config.alias['#content/adapter'] = resolveDatabaseAdapter(config.runtimeConfig!.content!.database?.type || options.database.type, resolveOptions) - config.alias['#content/local-adapter'] = resolveDatabaseAdapter(options._localDatabase!.type || 'sqlite', resolveOptions) + config.alias['#content/adapter'] = await resolveDatabaseAdapter(config.runtimeConfig!.content!.database?.type || options.database.type, resolveOptions) + config.alias['#content/local-adapter'] = await resolveDatabaseAdapter(options._localDatabase!.type || 'sqlite', resolveOptions) config.handlers ||= [] config.handlers.push({ diff --git a/src/utils/database.ts b/src/utils/database.ts index 6d2e14060..c6a44e4a1 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' @@ -59,7 +60,7 @@ async function getDatabase(database: SqliteDatabaseConfig | D1DatabaseConfig, op return cloudflareD1Connector({ bindingName: database.bindingName }) } - return import(findBestSqliteAdapter(opts)) + return import(await findBestSqliteAdapter(opts)) .then((m) => { const connector = (m.default || m) as (config: unknown) => Connector return connector({ path: database.filename }) @@ -153,7 +154,7 @@ export async function getLocalDatabase(database: SqliteDatabaseConfig | D1Databa } } -function findBestSqliteAdapter(opts: { sqliteConnector?: SQLiteConnector }) { +async function findBestSqliteAdapter(opts: { sqliteConnector?: SQLiteConnector }) { if (process.versions.bun) { return 'db0/connectors/bun-sqlite' } @@ -168,7 +169,7 @@ function findBestSqliteAdapter(opts: { sqliteConnector?: SQLiteConnector }) { } if (opts.sqliteConnector === 'better-sqlite3') { - requireBetterSqlite3() + await requireBetterSqlite3() return 'db0/connectors/better-sqlite3' } @@ -182,7 +183,7 @@ function findBestSqliteAdapter(opts: { sqliteConnector?: SQLiteConnector }) { return 'db0/connectors/sqlite3' } - requireBetterSqlite3() + await requireBetterSqlite3() return 'db0/connectors/better-sqlite3' } @@ -221,10 +222,21 @@ function isNodeSqliteAvailable() { } } -function requireBetterSqlite3() { +async function requireBetterSqlite3() { if (!isPackageInstalled('better-sqlite3')) { - logger.error('Nuxt Content requires `better-sqlite3` module to work in Node environment. Please run `npm install better-sqlite3` to install it and try again.') - process.exit(1) + 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') } } From 8b49eb597c5d036f9e29d08b5fc6b5ed3a00d1eb Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Thu, 29 May 2025 18:15:28 +0300 Subject: [PATCH 3/4] fix(deps): add implicit `nypm` dependency --- package.json | 1 + pnpm-lock.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/package.json b/package.json index 87f2affad..ef52b8ed2 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,7 @@ "micromatch": "^4.0.8", "minimatch": "^10.0.1", "nuxt-component-meta": "^0.11.0", + "nypm": "^0.6.0", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7d68ec4c..3c67dd3b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,6 +95,9 @@ importers: nuxt-component-meta: specifier: ^0.11.0 version: 0.11.0(magicast@0.3.5) + nypm: + specifier: ^0.6.0 + version: 0.6.0 ohash: specifier: ^2.0.11 version: 2.0.11 From ffdd9997b89894d7c92a5943cd765559e91b94a0 Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Mon, 2 Jun 2025 09:34:48 +0200 Subject: [PATCH 4/4] chore: prompt to install sqlite3 --- src/utils/database.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/utils/database.ts b/src/utils/database.ts index f691d9cf1..006f2709f 100644 --- a/src/utils/database.ts +++ b/src/utils/database.ts @@ -169,21 +169,18 @@ async function findBestSqliteAdapter(opts: { sqliteConnector?: SQLiteConnector } } if (opts.sqliteConnector === 'better-sqlite3') { - await requireBetterSqlite3() + await ensurePackageInstalled('better-sqlite3') return 'db0/connectors/better-sqlite3' } if (isWebContainer()) { - 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) - } + await ensurePackageInstalled('sqlite3') return 'db0/connectors/sqlite3' } - await requireBetterSqlite3() + await ensurePackageInstalled('better-sqlite3') return 'db0/connectors/better-sqlite3' } @@ -222,21 +219,22 @@ function isNodeSqliteAvailable() { } } -async function requireBetterSqlite3() { - if (!await isPackageInstalled('better-sqlite3')) { - logger.error('Nuxt Content requires `better-sqlite3` module to work in Node environment.') +async function ensurePackageInstalled(pkg: string) { + if (!await isPackageInstalled(pkg)) { + logger.error(`Nuxt Content requires \`${pkg}\` module to operate.`) - const confirm = await logger.prompt('Do you want to install `better-sqlite3` package?', { + const confirm = await logger.prompt(`Do you want to install \`${pkg}\` package?`, { type: 'confirm', name: 'confirm', initial: true, }) if (!confirm) { + logger.error(`Nuxt Content requires \`${pkg}\` module to operate. Please install \`${pkg}\` package manually and try again. \`npm install ${pkg}\``) process.exit(1) } - await addDependency('better-sqlite3') + await addDependency(pkg) } }