@skillsmith/core 0.4.8 → 0.4.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/adapters/java-parsers.d.ts.map +1 -1
- package/dist/src/analysis/adapters/java-parsers.js +9 -2
- package/dist/src/analysis/adapters/java-parsers.js.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.d.ts +1 -1
- package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
- package/dist/src/analytics/ExperimentService.d.ts +1 -1
- package/dist/src/analytics/ExperimentService.d.ts.map +1 -1
- package/dist/src/analytics/ROIDashboardService.d.ts +1 -1
- package/dist/src/analytics/ROIDashboardService.d.ts.map +1 -1
- package/dist/src/analytics/UsageAnalyticsService.d.ts +1 -1
- package/dist/src/analytics/UsageAnalyticsService.d.ts.map +1 -1
- package/dist/src/analytics/metrics-aggregator.d.ts +1 -1
- package/dist/src/analytics/metrics-aggregator.d.ts.map +1 -1
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/storage.d.ts.map +1 -1
- package/dist/src/analytics/storage.js +2 -2
- package/dist/src/analytics/storage.js.map +1 -1
- package/dist/src/api/client.d.ts +1 -0
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +14 -7
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/schemas.d.ts +17 -10
- package/dist/src/api/schemas.d.ts.map +1 -1
- package/dist/src/api/schemas.js +9 -2
- package/dist/src/api/schemas.js.map +1 -1
- package/dist/src/billing/BillingService.d.ts.map +1 -1
- package/dist/src/billing/BillingService.js.map +1 -1
- package/dist/src/billing/BillingService.types.d.ts +2 -2
- package/dist/src/billing/BillingService.types.d.ts.map +1 -1
- package/dist/src/billing/GDPRComplianceService.d.ts.map +1 -1
- package/dist/src/billing/GDPRComplianceService.js.map +1 -1
- package/dist/src/billing/StripeReconciliationJob.d.ts.map +1 -1
- package/dist/src/billing/StripeReconciliationJob.js.map +1 -1
- package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -1
- package/dist/src/billing/StripeWebhookHandler.js.map +1 -1
- package/dist/src/billing/gdpr-types.d.ts +2 -2
- package/dist/src/billing/gdpr-types.d.ts.map +1 -1
- package/dist/src/billing/reconciliation-types.d.ts +2 -2
- package/dist/src/billing/reconciliation-types.d.ts.map +1 -1
- package/dist/src/billing/webhook-handlers.d.ts +4 -4
- package/dist/src/billing/webhook-handlers.d.ts.map +1 -1
- package/dist/src/billing/webhook-handlers.js.map +1 -1
- package/dist/src/billing/webhook-types.d.ts +2 -2
- package/dist/src/billing/webhook-types.d.ts.map +1 -1
- package/dist/src/cache/TieredCache.d.ts.map +1 -1
- package/dist/src/cache/TieredCache.js +2 -2
- package/dist/src/cache/TieredCache.js.map +1 -1
- package/dist/src/cache/sqlite.d.ts.map +1 -1
- package/dist/src/cache/sqlite.js +5 -4
- package/dist/src/cache/sqlite.js.map +1 -1
- package/dist/src/db/createDatabase.d.ts +86 -0
- package/dist/src/db/createDatabase.d.ts.map +1 -0
- package/dist/src/db/createDatabase.js +139 -0
- package/dist/src/db/createDatabase.js.map +1 -0
- package/dist/src/db/database-interface.d.ts +141 -0
- package/dist/src/db/database-interface.d.ts.map +1 -0
- package/dist/src/db/database-interface.js +14 -0
- package/dist/src/db/database-interface.js.map +1 -0
- package/dist/src/db/drivers/betterSqlite3Driver.d.ts +48 -0
- package/dist/src/db/drivers/betterSqlite3Driver.d.ts.map +1 -0
- package/dist/src/db/drivers/betterSqlite3Driver.js +138 -0
- package/dist/src/db/drivers/betterSqlite3Driver.js.map +1 -0
- package/dist/src/db/drivers/index.d.ts +8 -0
- package/dist/src/db/drivers/index.d.ts.map +1 -0
- package/dist/src/db/drivers/index.js +8 -0
- package/dist/src/db/drivers/index.js.map +1 -0
- package/dist/src/db/drivers/sqljsDriver.d.ts +91 -0
- package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -0
- package/dist/src/db/drivers/sqljsDriver.js +335 -0
- package/dist/src/db/drivers/sqljsDriver.js.map +1 -0
- package/dist/src/db/migration.d.ts +1 -1
- package/dist/src/db/migration.d.ts.map +1 -1
- package/dist/src/db/quarantine-schema.d.ts +1 -1
- package/dist/src/db/quarantine-schema.d.ts.map +1 -1
- package/dist/src/db/schema.d.ts +22 -2
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +55 -3
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/embeddings/hnsw-store.js +2 -2
- package/dist/src/embeddings/hnsw-store.js.map +1 -1
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js +2 -2
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/exports/repositories.d.ts +4 -1
- package/dist/src/exports/repositories.d.ts.map +1 -1
- package/dist/src/exports/repositories.js +9 -3
- package/dist/src/exports/repositories.js.map +1 -1
- package/dist/src/exports/services.d.ts +1 -0
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +4 -0
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/SkillParser.d.ts +20 -0
- package/dist/src/indexer/SkillParser.d.ts.map +1 -1
- package/dist/src/indexer/SkillParser.js +58 -0
- package/dist/src/indexer/SkillParser.js.map +1 -1
- package/dist/src/learning/PatternStore.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.js +2 -7
- package/dist/src/learning/PatternStore.js.map +1 -1
- package/dist/src/learning/PatternStore.queries.d.ts +17 -17
- package/dist/src/learning/PatternStore.queries.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.queries.js.map +1 -1
- package/dist/src/repositories/CacheRepository.d.ts +1 -1
- package/dist/src/repositories/CacheRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SyncConfigRepository.d.ts +1 -1
- package/dist/src/repositories/SyncConfigRepository.d.ts.map +1 -1
- package/dist/src/repositories/SyncHistoryRepository.d.ts +1 -1
- package/dist/src/repositories/SyncHistoryRepository.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.js +4 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
- package/dist/src/scripts/merge-skills.d.ts.map +1 -1
- package/dist/src/scripts/merge-skills.js +2 -2
- package/dist/src/scripts/merge-skills.js.map +1 -1
- package/dist/src/scripts/review-lenny-skills.js +2 -2
- package/dist/src/scripts/review-lenny-skills.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +2 -2
- package/dist/src/search/hybrid.d.ts.map +1 -1
- package/dist/src/search/hybrid.js +2 -2
- package/dist/src/search/hybrid.js.map +1 -1
- package/dist/src/security/AuditLogger.d.ts +1 -1
- package/dist/src/security/AuditLogger.d.ts.map +1 -1
- package/dist/src/security/audit-types.d.ts +2 -2
- package/dist/src/security/audit-types.d.ts.map +1 -1
- package/dist/src/security/audit-types.js.map +1 -1
- package/dist/src/security/sanitization.d.ts.map +1 -1
- package/dist/src/security/sanitization.js +25 -17
- package/dist/src/security/sanitization.js.map +1 -1
- package/dist/src/services/SearchService.d.ts +1 -1
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/TransformationService.d.ts +1 -1
- package/dist/src/services/TransformationService.d.ts.map +1 -1
- package/dist/src/services/index.d.ts +9 -0
- package/dist/src/services/index.d.ts.map +1 -0
- package/dist/src/services/index.js +10 -0
- package/dist/src/services/index.js.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.d.ts +149 -0
- package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.js +406 -0
- package/dist/src/services/quarantine/QuarantineService.js.map +1 -0
- package/dist/src/services/quarantine/index.d.ts +10 -0
- package/dist/src/services/quarantine/index.d.ts.map +1 -0
- package/dist/src/services/quarantine/index.js +14 -0
- package/dist/src/services/quarantine/index.js.map +1 -0
- package/dist/src/services/quarantine/types.d.ts +127 -0
- package/dist/src/services/quarantine/types.d.ts.map +1 -0
- package/dist/src/services/quarantine/types.js +59 -0
- package/dist/src/services/quarantine/types.js.map +1 -0
- package/dist/src/types/skill.d.ts +6 -1
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types/skill.js.map +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/github-url.d.ts +57 -0
- package/dist/src/utils/github-url.d.ts.map +1 -0
- package/dist/src/utils/github-url.js +88 -0
- package/dist/src/utils/github-url.js.map +1 -0
- package/dist/src/utils/index.d.ts +2 -0
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +4 -0
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/safe-fs.d.ts +63 -0
- package/dist/src/utils/safe-fs.d.ts.map +1 -0
- package/dist/src/utils/safe-fs.js +119 -0
- package/dist/src/utils/safe-fs.js.map +1 -0
- package/dist/src/validation/input-validators.d.ts.map +1 -1
- package/dist/src/validation/input-validators.js +11 -4
- package/dist/src/validation/input-validators.js.map +1 -1
- package/dist/tests/Analytics.integration.test.js +2 -2
- package/dist/tests/Analytics.integration.test.js.map +1 -1
- package/dist/tests/AnalyticsRepository.test.js +2 -2
- package/dist/tests/AnalyticsRepository.test.js.map +1 -1
- package/dist/tests/AuditLogger.test.js.map +1 -1
- package/dist/tests/ExperimentService.test.js +2 -2
- package/dist/tests/ExperimentService.test.js.map +1 -1
- package/dist/tests/QuarantineRepository.test.js +39 -2
- package/dist/tests/QuarantineRepository.test.js.map +1 -1
- package/dist/tests/ROIDashboardService.test.js +2 -2
- package/dist/tests/ROIDashboardService.test.js.map +1 -1
- package/dist/tests/UsageAnalyticsService.test.js +2 -2
- package/dist/tests/UsageAnalyticsService.test.js.map +1 -1
- package/dist/tests/analytics/metrics-aggregator.test.js +2 -2
- package/dist/tests/analytics/metrics-aggregator.test.js.map +1 -1
- package/dist/tests/analytics/metrics-exporter.test.js +2 -2
- package/dist/tests/analytics/metrics-exporter.test.js.map +1 -1
- package/dist/tests/api/client.structural-typing.test.d.ts +11 -0
- package/dist/tests/api/client.structural-typing.test.d.ts.map +1 -0
- package/dist/tests/api/client.structural-typing.test.js +209 -0
- package/dist/tests/api/client.structural-typing.test.js.map +1 -0
- package/dist/tests/billing/BillingService.test.js +2 -2
- package/dist/tests/billing/BillingService.test.js.map +1 -1
- package/dist/tests/billing/GDPRCompliance.test.js +2 -2
- package/dist/tests/billing/GDPRCompliance.test.js.map +1 -1
- package/dist/tests/billing/StripeReconciliation.test.js +2 -2
- package/dist/tests/billing/StripeReconciliation.test.js.map +1 -1
- package/dist/tests/db/database-abstraction.test.d.ts +8 -0
- package/dist/tests/db/database-abstraction.test.d.ts.map +1 -0
- package/dist/tests/db/database-abstraction.test.js +208 -0
- package/dist/tests/db/database-abstraction.test.js.map +1 -0
- package/dist/tests/db/fts5-support.test.d.ts +14 -0
- package/dist/tests/db/fts5-support.test.d.ts.map +1 -0
- package/dist/tests/db/fts5-support.test.js +128 -0
- package/dist/tests/db/fts5-support.test.js.map +1 -0
- package/dist/tests/db/schema-async.test.d.ts +9 -0
- package/dist/tests/db/schema-async.test.d.ts.map +1 -0
- package/dist/tests/db/schema-async.test.js +302 -0
- package/dist/tests/db/schema-async.test.js.map +1 -0
- package/dist/tests/db/sqljs-driver.test.d.ts +8 -0
- package/dist/tests/db/sqljs-driver.test.d.ts.map +1 -0
- package/dist/tests/db/sqljs-driver.test.js +323 -0
- package/dist/tests/db/sqljs-driver.test.js.map +1 -0
- package/dist/tests/edge-cases/EdgeCases.test.js +5 -2
- package/dist/tests/edge-cases/EdgeCases.test.js.map +1 -1
- package/dist/tests/integration/QuarantineService.test.d.ts +11 -0
- package/dist/tests/integration/QuarantineService.test.d.ts.map +1 -0
- package/dist/tests/integration/QuarantineService.test.js +378 -0
- package/dist/tests/integration/QuarantineService.test.js.map +1 -0
- package/dist/tests/schema.test.js.map +1 -1
- package/dist/tests/scripts/import-to-database.test.js +7 -7
- package/dist/tests/scripts/import-to-database.test.js.map +1 -1
- package/dist/tests/unit/check-references.test.d.ts +2 -0
- package/dist/tests/unit/check-references.test.d.ts.map +1 -0
- package/dist/tests/unit/check-references.test.js +118 -0
- package/dist/tests/unit/check-references.test.js.map +1 -0
- package/dist/tests/utils/safe-fs.test.d.ts +12 -0
- package/dist/tests/utils/safe-fs.test.d.ts.map +1 -0
- package/dist/tests/utils/safe-fs.test.js +116 -0
- package/dist/tests/utils/safe-fs.test.js.map +1 -0
- package/package.json +16 -10
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2180: Database Factory with Auto-Detection
|
|
3
|
+
*
|
|
4
|
+
* Creates database connections with automatic driver selection:
|
|
5
|
+
* 1. Try native better-sqlite3 first (fastest, requires native module)
|
|
6
|
+
* 2. Fall back to sql.js WASM (cross-platform, no native compilation)
|
|
7
|
+
*
|
|
8
|
+
* This enables the MCP server to work on any platform without Docker.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // Auto-detect best driver
|
|
13
|
+
* const db = await createDatabaseAsync('~/.skillsmith/skills.db')
|
|
14
|
+
*
|
|
15
|
+
* // Force specific driver
|
|
16
|
+
* const db = createDatabaseSync(path) // better-sqlite3 only
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import { createBetterSqlite3Database, isBetterSqlite3Available, } from './drivers/betterSqlite3Driver.js';
|
|
20
|
+
import { createSqlJsDatabase, isSqlJsAvailable } from './drivers/sqljsDriver.js';
|
|
21
|
+
/**
|
|
22
|
+
* Detect which database drivers are available
|
|
23
|
+
* @returns Array of driver info objects
|
|
24
|
+
*/
|
|
25
|
+
export function detectAvailableDrivers() {
|
|
26
|
+
const drivers = [];
|
|
27
|
+
// Check better-sqlite3
|
|
28
|
+
if (isBetterSqlite3Available()) {
|
|
29
|
+
drivers.push({ type: 'better-sqlite3', available: true });
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
drivers.push({
|
|
33
|
+
type: 'better-sqlite3',
|
|
34
|
+
available: false,
|
|
35
|
+
reason: 'Native module not available (binary incompatibility or not installed)',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// Check sql.js (WASM - always available in Node.js)
|
|
39
|
+
if (isSqlJsAvailable()) {
|
|
40
|
+
drivers.push({ type: 'sql.js', available: true });
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
drivers.push({
|
|
44
|
+
type: 'sql.js',
|
|
45
|
+
available: false,
|
|
46
|
+
reason: 'sql.js package not installed',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return drivers;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get the best available driver type
|
|
53
|
+
* @returns The driver type to use, or null if none available
|
|
54
|
+
*/
|
|
55
|
+
export function getBestDriver() {
|
|
56
|
+
// Prefer native for performance
|
|
57
|
+
if (isBetterSqlite3Available()) {
|
|
58
|
+
return 'better-sqlite3';
|
|
59
|
+
}
|
|
60
|
+
// Fall back to sql.js WASM
|
|
61
|
+
if (isSqlJsAvailable()) {
|
|
62
|
+
return 'sql.js';
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create a database connection synchronously using better-sqlite3
|
|
68
|
+
*
|
|
69
|
+
* Use this when you know native modules are available (e.g., in Docker).
|
|
70
|
+
* For cross-platform code, use createDatabaseAsync instead.
|
|
71
|
+
*
|
|
72
|
+
* @param path - Path to database file, or ':memory:' for in-memory
|
|
73
|
+
* @param options - Database connection options
|
|
74
|
+
* @returns Database instance
|
|
75
|
+
* @throws Error if better-sqlite3 is not available
|
|
76
|
+
*/
|
|
77
|
+
export function createDatabaseSync(path = ':memory:', options) {
|
|
78
|
+
if (!isBetterSqlite3Available()) {
|
|
79
|
+
throw new Error('[Skillsmith] Native SQLite module (better-sqlite3) is not available. ' +
|
|
80
|
+
'This may be due to:\n' +
|
|
81
|
+
' - Binary compiled for a different platform (Linux vs macOS)\n' +
|
|
82
|
+
' - Node.js version mismatch\n' +
|
|
83
|
+
' - Missing native build tools\n\n' +
|
|
84
|
+
'Solutions:\n' +
|
|
85
|
+
' - Run in Docker: docker compose --profile dev up -d\n' +
|
|
86
|
+
' - Rebuild native module: npm rebuild better-sqlite3\n' +
|
|
87
|
+
' - Use createDatabaseAsync() for automatic WASM fallback');
|
|
88
|
+
}
|
|
89
|
+
return createBetterSqlite3Database(path, options);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a database connection with automatic driver selection
|
|
93
|
+
*
|
|
94
|
+
* This is the recommended way to create database connections for
|
|
95
|
+
* cross-platform compatibility. It will:
|
|
96
|
+
* 1. Try better-sqlite3 native module first (fastest)
|
|
97
|
+
* 2. Fall back to sql.js WASM if native is unavailable
|
|
98
|
+
*
|
|
99
|
+
* @param path - Path to database file, or ':memory:' for in-memory
|
|
100
|
+
* @param options - Database connection options
|
|
101
|
+
* @returns Promise resolving to Database instance
|
|
102
|
+
* @throws Error if no database driver is available
|
|
103
|
+
*/
|
|
104
|
+
export async function createDatabaseAsync(path = ':memory:', options) {
|
|
105
|
+
// Try native first
|
|
106
|
+
if (isBetterSqlite3Available()) {
|
|
107
|
+
return createBetterSqlite3Database(path, options);
|
|
108
|
+
}
|
|
109
|
+
// Fall back to sql.js WASM
|
|
110
|
+
if (isSqlJsAvailable()) {
|
|
111
|
+
console.warn('[Skillsmith] Native SQLite unavailable, using WASM driver');
|
|
112
|
+
return await createSqlJsDatabase(path, options);
|
|
113
|
+
}
|
|
114
|
+
throw new Error('[Skillsmith] No SQLite driver available.\n\n' +
|
|
115
|
+
'Neither better-sqlite3 (native) nor sql.js (WASM) could be loaded.\n\n' +
|
|
116
|
+
'Solutions:\n' +
|
|
117
|
+
' - Run in Docker: docker compose --profile dev up -d\n' +
|
|
118
|
+
' - Rebuild native module: npm rebuild better-sqlite3\n' +
|
|
119
|
+
' - Install sql.js: npm install sql.js');
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* @deprecated Use createDatabaseAsync() instead for cross-platform support.
|
|
123
|
+
*
|
|
124
|
+
* createDatabase() only works with native better-sqlite3 and will fail on
|
|
125
|
+
* platforms where native modules aren't available (e.g., macOS without Docker).
|
|
126
|
+
*
|
|
127
|
+
* Migration:
|
|
128
|
+
* ```typescript
|
|
129
|
+
* // Before (synchronous, native only)
|
|
130
|
+
* const db = createDatabase(path)
|
|
131
|
+
*
|
|
132
|
+
* // After (async, with automatic WASM fallback)
|
|
133
|
+
* const db = await createDatabaseAsync(path)
|
|
134
|
+
* ```
|
|
135
|
+
*
|
|
136
|
+
* This alias is maintained for backward compatibility with existing code.
|
|
137
|
+
*/
|
|
138
|
+
export const createDatabase = createDatabaseSync;
|
|
139
|
+
//# sourceMappingURL=createDatabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createDatabase.js","sourceRoot":"","sources":["../../../src/db/createDatabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAgBhF;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAiB,EAAE,CAAA;IAEhC,uBAAuB;IACvB,IAAI,wBAAwB,EAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,uEAAuE;SAChF,CAAC,CAAA;IACJ,CAAC;IAED,oDAAoD;IACpD,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,8BAA8B;SACvC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,gCAAgC;IAChC,IAAI,wBAAwB,EAAE,EAAE,CAAC;QAC/B,OAAO,gBAAgB,CAAA;IACzB,CAAC;IAED,2BAA2B;IAC3B,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe,UAAU,EAAE,OAAyB;IACrF,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,uEAAuE;YACrE,uBAAuB;YACvB,iEAAiE;YACjE,gCAAgC;YAChC,oCAAoC;YACpC,cAAc;YACd,yDAAyD;YACzD,yDAAyD;YACzD,2DAA2D,CAC9D,CAAA;IACH,CAAC;IAED,OAAO,2BAA2B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AACnD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe,UAAU,EACzB,OAAyB;IAEzB,mBAAmB;IACnB,IAAI,wBAAwB,EAAE,EAAE,CAAC;QAC/B,OAAO,2BAA2B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC;IAED,2BAA2B;IAC3B,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;QACzE,OAAO,MAAM,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC;IAED,MAAM,IAAI,KAAK,CACb,8CAA8C;QAC5C,wEAAwE;QACxE,cAAc;QACd,yDAAyD;QACzD,yDAAyD;QACzD,wCAAwC,CAC3C,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2180: Database Abstraction Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified interface for SQLite operations that works with both:
|
|
5
|
+
* - better-sqlite3 (native, synchronous) - used in Docker/Linux
|
|
6
|
+
* - sql.js (WASM, async) - used on macOS/WebContainers
|
|
7
|
+
*
|
|
8
|
+
* This abstraction enables cross-platform MCP server execution without
|
|
9
|
+
* requiring native module compilation.
|
|
10
|
+
*
|
|
11
|
+
* @see docs/issues/mcp-server-native-module-fix-wasm.md
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Result of a database write operation (INSERT, UPDATE, DELETE)
|
|
15
|
+
*/
|
|
16
|
+
export interface RunResult {
|
|
17
|
+
/** Number of rows changed by the operation */
|
|
18
|
+
changes: number;
|
|
19
|
+
/** Row ID of the last inserted row (for INSERT operations) */
|
|
20
|
+
lastInsertRowid: number | bigint;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A prepared SQL statement that can be executed multiple times with different parameters.
|
|
24
|
+
*
|
|
25
|
+
* Type parameter T represents the shape of rows returned by SELECT queries.
|
|
26
|
+
*/
|
|
27
|
+
export interface Statement<T = unknown> {
|
|
28
|
+
/**
|
|
29
|
+
* Execute a write operation (INSERT, UPDATE, DELETE)
|
|
30
|
+
* @param params - Bound parameters for the SQL statement
|
|
31
|
+
* @returns Result containing changes count and last insert rowid
|
|
32
|
+
*/
|
|
33
|
+
run(...params: unknown[]): RunResult;
|
|
34
|
+
/**
|
|
35
|
+
* Execute a SELECT query and return the first matching row
|
|
36
|
+
* @param params - Bound parameters for the SQL statement
|
|
37
|
+
* @returns The first row or undefined if no rows match
|
|
38
|
+
*/
|
|
39
|
+
get(...params: unknown[]): T | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Execute a SELECT query and return all matching rows
|
|
42
|
+
* @param params - Bound parameters for the SQL statement
|
|
43
|
+
* @returns Array of all matching rows
|
|
44
|
+
*/
|
|
45
|
+
all(...params: unknown[]): T[];
|
|
46
|
+
/**
|
|
47
|
+
* Execute a SELECT query and iterate over results
|
|
48
|
+
* Useful for large result sets to avoid loading all rows into memory
|
|
49
|
+
* @param params - Bound parameters for the SQL statement
|
|
50
|
+
* @returns Iterator over matching rows
|
|
51
|
+
*/
|
|
52
|
+
iterate(...params: unknown[]): IterableIterator<T>;
|
|
53
|
+
/**
|
|
54
|
+
* Release resources associated with this prepared statement
|
|
55
|
+
* Should be called when the statement is no longer needed
|
|
56
|
+
*/
|
|
57
|
+
finalize(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Bind parameters to the statement for later execution
|
|
60
|
+
* @param params - Parameters to bind
|
|
61
|
+
* @returns The statement for chaining
|
|
62
|
+
*/
|
|
63
|
+
bind(...params: unknown[]): this;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Database connection interface that abstracts SQLite operations.
|
|
67
|
+
*
|
|
68
|
+
* Implementations:
|
|
69
|
+
* - BetterSqlite3Database: Wraps better-sqlite3 for native performance
|
|
70
|
+
* - SqlJsDatabase: Wraps sql.js for cross-platform WASM support
|
|
71
|
+
*/
|
|
72
|
+
export interface Database {
|
|
73
|
+
/**
|
|
74
|
+
* Execute raw SQL without returning results
|
|
75
|
+
* Useful for DDL statements (CREATE, DROP, ALTER) and multi-statement scripts
|
|
76
|
+
* @param sql - SQL statement(s) to execute
|
|
77
|
+
*/
|
|
78
|
+
exec(sql: string): void;
|
|
79
|
+
/**
|
|
80
|
+
* Prepare a SQL statement for repeated execution
|
|
81
|
+
* @param sql - SQL statement with optional parameter placeholders (?)
|
|
82
|
+
* @returns A prepared statement that can be executed multiple times
|
|
83
|
+
*/
|
|
84
|
+
prepare<T = unknown>(sql: string): Statement<T>;
|
|
85
|
+
/**
|
|
86
|
+
* Execute a function within a transaction
|
|
87
|
+
* If the function throws, the transaction is rolled back
|
|
88
|
+
*
|
|
89
|
+
* Returns a callable function that executes the transaction when called.
|
|
90
|
+
* For zero-argument functions, call as: db.transaction(fn)()
|
|
91
|
+
*
|
|
92
|
+
* @param fn - Function to execute within transaction
|
|
93
|
+
* @returns A callable transaction function
|
|
94
|
+
*/
|
|
95
|
+
transaction<T, Args extends unknown[] = []>(fn: (...args: Args) => T): (...args: Args) => T;
|
|
96
|
+
/**
|
|
97
|
+
* Execute a PRAGMA statement and return the result
|
|
98
|
+
* @param pragma - PRAGMA statement (e.g., 'foreign_keys = ON')
|
|
99
|
+
* @returns The PRAGMA result value, or undefined for set operations
|
|
100
|
+
*/
|
|
101
|
+
pragma(pragma: string): unknown;
|
|
102
|
+
/**
|
|
103
|
+
* Close the database connection and release all resources
|
|
104
|
+
* For file-based databases, this ensures all changes are persisted
|
|
105
|
+
*/
|
|
106
|
+
close(): void;
|
|
107
|
+
/**
|
|
108
|
+
* Check if the database connection is open
|
|
109
|
+
*/
|
|
110
|
+
readonly open: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* The file path of the database, or ':memory:' for in-memory databases
|
|
113
|
+
*/
|
|
114
|
+
readonly name: string;
|
|
115
|
+
/**
|
|
116
|
+
* Whether the database is in-memory
|
|
117
|
+
*/
|
|
118
|
+
readonly memory: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Whether the database is read-only
|
|
121
|
+
*/
|
|
122
|
+
readonly readonly: boolean;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Options for creating a database connection
|
|
126
|
+
*/
|
|
127
|
+
export interface DatabaseOptions {
|
|
128
|
+
/** Open database in read-only mode */
|
|
129
|
+
readonly?: boolean;
|
|
130
|
+
/** Create database file if it doesn't exist (default: true) */
|
|
131
|
+
fileMustExist?: boolean;
|
|
132
|
+
/** Set busy timeout in milliseconds (default: 5000) */
|
|
133
|
+
timeout?: number;
|
|
134
|
+
/** Enable verbose logging */
|
|
135
|
+
verbose?: boolean;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Factory function type for creating database connections
|
|
139
|
+
*/
|
|
140
|
+
export type DatabaseFactory = (path: string, options?: DatabaseOptions) => Database | Promise<Database>;
|
|
141
|
+
//# sourceMappingURL=database-interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-interface.d.ts","sourceRoot":"","sources":["../../../src/db/database-interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,eAAe,EAAE,MAAM,GAAG,MAAM,CAAA;CACjC;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO;IACpC;;;;OAIG;IACH,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAA;IAEpC;;;;OAIG;IACH,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,SAAS,CAAA;IAExC;;;;OAIG;IACH,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAA;IAE9B;;;;;OAKG;IACH,OAAO,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAElD;;;OAGG;IACH,QAAQ,IAAI,IAAI,CAAA;IAEhB;;;;OAIG;IACH,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CACjC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAEvB;;;;OAIG;IACH,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;IAE/C;;;;;;;;;OASG;IACH,WAAW,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,CAAA;IAE3F;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAE/B;;;OAGG;IACH,KAAK,IAAI,IAAI,CAAA;IAEb;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IAEtB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IAExB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,KACtB,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2180: Database Abstraction Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified interface for SQLite operations that works with both:
|
|
5
|
+
* - better-sqlite3 (native, synchronous) - used in Docker/Linux
|
|
6
|
+
* - sql.js (WASM, async) - used on macOS/WebContainers
|
|
7
|
+
*
|
|
8
|
+
* This abstraction enables cross-platform MCP server execution without
|
|
9
|
+
* requiring native module compilation.
|
|
10
|
+
*
|
|
11
|
+
* @see docs/issues/mcp-server-native-module-fix-wasm.md
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=database-interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-interface.js","sourceRoot":"","sources":["../../../src/db/database-interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2180: better-sqlite3 Driver Implementation
|
|
3
|
+
*
|
|
4
|
+
* Wraps the better-sqlite3 library to implement the Database abstraction interface.
|
|
5
|
+
* This driver is used when native modules are available (Docker, Linux, CI).
|
|
6
|
+
*
|
|
7
|
+
* better-sqlite3 is synchronous and provides excellent performance for local SQLite.
|
|
8
|
+
*
|
|
9
|
+
* @see https://github.com/WiseLibs/better-sqlite3
|
|
10
|
+
*/
|
|
11
|
+
import type BetterSqlite3 from 'better-sqlite3';
|
|
12
|
+
import type { Database, Statement, DatabaseOptions } from '../database-interface.js';
|
|
13
|
+
/**
|
|
14
|
+
* Wraps a better-sqlite3 Database to implement our Database interface
|
|
15
|
+
*/
|
|
16
|
+
export declare class BetterSqlite3Database implements Database {
|
|
17
|
+
private readonly db;
|
|
18
|
+
constructor(db: BetterSqlite3.Database);
|
|
19
|
+
exec(sql: string): void;
|
|
20
|
+
prepare<T = unknown>(sql: string): Statement<T>;
|
|
21
|
+
transaction<T, Args extends unknown[] = []>(fn: (...args: Args) => T): (...args: Args) => T;
|
|
22
|
+
pragma(pragma: string): unknown;
|
|
23
|
+
close(): void;
|
|
24
|
+
get open(): boolean;
|
|
25
|
+
get name(): string;
|
|
26
|
+
get memory(): boolean;
|
|
27
|
+
get readonly(): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Get the underlying better-sqlite3 database instance
|
|
30
|
+
* Use with caution - this bypasses the abstraction layer
|
|
31
|
+
*/
|
|
32
|
+
get native(): BetterSqlite3.Database;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a database connection using better-sqlite3
|
|
36
|
+
*
|
|
37
|
+
* @param path - Path to database file, or ':memory:' for in-memory database
|
|
38
|
+
* @param options - Database connection options
|
|
39
|
+
* @returns A Database instance wrapping better-sqlite3
|
|
40
|
+
* @throws Error if better-sqlite3 native module is not available
|
|
41
|
+
*/
|
|
42
|
+
export declare function createBetterSqlite3Database(path?: string, options?: DatabaseOptions): BetterSqlite3Database;
|
|
43
|
+
/**
|
|
44
|
+
* Check if better-sqlite3 native module is available
|
|
45
|
+
* @returns true if the native module can be loaded
|
|
46
|
+
*/
|
|
47
|
+
export declare function isBetterSqlite3Available(): boolean;
|
|
48
|
+
//# sourceMappingURL=betterSqlite3Driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"betterSqlite3Driver.d.ts","sourceRoot":"","sources":["../../../../src/db/drivers/betterSqlite3Driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAa,eAAe,EAAE,MAAM,0BAA0B,CAAA;AA0C/F;;GAEG;AACH,qBAAa,qBAAsB,YAAW,QAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa,CAAC,QAAQ;IAEvD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAK/C,WAAW,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC;IAK3F,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI/B,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,aAAa,CAAC,QAAQ,CAEnC;CACF;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,GAAE,MAAmB,EACzB,OAAO,CAAC,EAAE,eAAe,GACxB,qBAAqB,CAyBvB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAWlD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2180: better-sqlite3 Driver Implementation
|
|
3
|
+
*
|
|
4
|
+
* Wraps the better-sqlite3 library to implement the Database abstraction interface.
|
|
5
|
+
* This driver is used when native modules are available (Docker, Linux, CI).
|
|
6
|
+
*
|
|
7
|
+
* better-sqlite3 is synchronous and provides excellent performance for local SQLite.
|
|
8
|
+
*
|
|
9
|
+
* @see https://github.com/WiseLibs/better-sqlite3
|
|
10
|
+
*/
|
|
11
|
+
import { createRequire } from 'node:module';
|
|
12
|
+
// ESM-compatible require for native modules
|
|
13
|
+
const require = createRequire(import.meta.url);
|
|
14
|
+
/**
|
|
15
|
+
* Wraps a better-sqlite3 Statement to implement our Statement interface
|
|
16
|
+
*/
|
|
17
|
+
class BetterSqlite3Statement {
|
|
18
|
+
stmt;
|
|
19
|
+
constructor(stmt) {
|
|
20
|
+
this.stmt = stmt;
|
|
21
|
+
}
|
|
22
|
+
run(...params) {
|
|
23
|
+
const result = this.stmt.run(...params);
|
|
24
|
+
return {
|
|
25
|
+
changes: result.changes,
|
|
26
|
+
lastInsertRowid: result.lastInsertRowid,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
get(...params) {
|
|
30
|
+
return this.stmt.get(...params);
|
|
31
|
+
}
|
|
32
|
+
all(...params) {
|
|
33
|
+
return this.stmt.all(...params);
|
|
34
|
+
}
|
|
35
|
+
iterate(...params) {
|
|
36
|
+
return this.stmt.iterate(...params);
|
|
37
|
+
}
|
|
38
|
+
finalize() {
|
|
39
|
+
// better-sqlite3 doesn't require explicit finalization
|
|
40
|
+
// Statements are automatically cleaned up when garbage collected
|
|
41
|
+
}
|
|
42
|
+
bind(...params) {
|
|
43
|
+
this.stmt.bind(...params);
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Wraps a better-sqlite3 Database to implement our Database interface
|
|
49
|
+
*/
|
|
50
|
+
export class BetterSqlite3Database {
|
|
51
|
+
db;
|
|
52
|
+
constructor(db) {
|
|
53
|
+
this.db = db;
|
|
54
|
+
}
|
|
55
|
+
exec(sql) {
|
|
56
|
+
this.db.exec(sql);
|
|
57
|
+
}
|
|
58
|
+
prepare(sql) {
|
|
59
|
+
const stmt = this.db.prepare(sql);
|
|
60
|
+
return new BetterSqlite3Statement(stmt);
|
|
61
|
+
}
|
|
62
|
+
transaction(fn) {
|
|
63
|
+
// better-sqlite3 transaction returns a wrapped function
|
|
64
|
+
return this.db.transaction(fn);
|
|
65
|
+
}
|
|
66
|
+
pragma(pragma) {
|
|
67
|
+
return this.db.pragma(pragma);
|
|
68
|
+
}
|
|
69
|
+
close() {
|
|
70
|
+
this.db.close();
|
|
71
|
+
}
|
|
72
|
+
get open() {
|
|
73
|
+
return this.db.open;
|
|
74
|
+
}
|
|
75
|
+
get name() {
|
|
76
|
+
return this.db.name;
|
|
77
|
+
}
|
|
78
|
+
get memory() {
|
|
79
|
+
return this.db.memory;
|
|
80
|
+
}
|
|
81
|
+
get readonly() {
|
|
82
|
+
return this.db.readonly;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get the underlying better-sqlite3 database instance
|
|
86
|
+
* Use with caution - this bypasses the abstraction layer
|
|
87
|
+
*/
|
|
88
|
+
get native() {
|
|
89
|
+
return this.db;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create a database connection using better-sqlite3
|
|
94
|
+
*
|
|
95
|
+
* @param path - Path to database file, or ':memory:' for in-memory database
|
|
96
|
+
* @param options - Database connection options
|
|
97
|
+
* @returns A Database instance wrapping better-sqlite3
|
|
98
|
+
* @throws Error if better-sqlite3 native module is not available
|
|
99
|
+
*/
|
|
100
|
+
export function createBetterSqlite3Database(path = ':memory:', options) {
|
|
101
|
+
// Dynamic import to avoid loading native module at module evaluation time
|
|
102
|
+
// This is synchronous because better-sqlite3 is synchronous
|
|
103
|
+
const Database = require('better-sqlite3');
|
|
104
|
+
// Build options object, only including defined values
|
|
105
|
+
// better-sqlite3 doesn't accept undefined for boolean options
|
|
106
|
+
const dbOptions = {
|
|
107
|
+
timeout: options?.timeout ?? 5000,
|
|
108
|
+
};
|
|
109
|
+
if (options?.readonly !== undefined) {
|
|
110
|
+
dbOptions.readonly = options.readonly;
|
|
111
|
+
}
|
|
112
|
+
if (options?.fileMustExist !== undefined) {
|
|
113
|
+
dbOptions.fileMustExist = options.fileMustExist;
|
|
114
|
+
}
|
|
115
|
+
if (options?.verbose) {
|
|
116
|
+
dbOptions.verbose = console.log;
|
|
117
|
+
}
|
|
118
|
+
const db = new Database(path, dbOptions);
|
|
119
|
+
return new BetterSqlite3Database(db);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if better-sqlite3 native module is available
|
|
123
|
+
* @returns true if the native module can be loaded
|
|
124
|
+
*/
|
|
125
|
+
export function isBetterSqlite3Available() {
|
|
126
|
+
try {
|
|
127
|
+
const Database = require('better-sqlite3');
|
|
128
|
+
// Instantiate in-memory DB to trigger dlopen of the native binary.
|
|
129
|
+
// Catches ABI mismatch (Node upgrade) and platform mismatch (Linux binary on macOS).
|
|
130
|
+
const testDb = new Database(':memory:');
|
|
131
|
+
testDb.close();
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=betterSqlite3Driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"betterSqlite3Driver.js","sourceRoot":"","sources":["../../../../src/db/drivers/betterSqlite3Driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2180: Database Driver Exports
|
|
3
|
+
*
|
|
4
|
+
* Re-exports all database drivers and utilities.
|
|
5
|
+
*/
|
|
6
|
+
export { BetterSqlite3Database, createBetterSqlite3Database, isBetterSqlite3Available, } from './betterSqlite3Driver.js';
|
|
7
|
+
export { SqlJsDatabaseAdapter, createSqlJsDatabase, isSqlJsAvailable } from './sqljsDriver.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/db/drivers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2180: Database Driver Exports
|
|
3
|
+
*
|
|
4
|
+
* Re-exports all database drivers and utilities.
|
|
5
|
+
*/
|
|
6
|
+
export { BetterSqlite3Database, createBetterSqlite3Database, isBetterSqlite3Available, } from './betterSqlite3Driver.js';
|
|
7
|
+
export { SqlJsDatabaseAdapter, createSqlJsDatabase, isSqlJsAvailable } from './sqljsDriver.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/db/drivers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2182: sql.js (WASM) Driver Implementation
|
|
3
|
+
*
|
|
4
|
+
* Wraps the sql.js library to implement the Database abstraction interface.
|
|
5
|
+
* This driver is used when native modules are NOT available (macOS, WebContainers).
|
|
6
|
+
*
|
|
7
|
+
* sql.js is a JavaScript implementation of SQLite that runs in WebAssembly.
|
|
8
|
+
* It requires async initialization but provides cross-platform compatibility.
|
|
9
|
+
*
|
|
10
|
+
* Key differences from better-sqlite3:
|
|
11
|
+
* - Async initialization (WASM loading)
|
|
12
|
+
* - In-memory by default, manual persistence to file
|
|
13
|
+
* - Different API for prepared statements
|
|
14
|
+
*
|
|
15
|
+
* @see https://github.com/sql-js/sql.js
|
|
16
|
+
*/
|
|
17
|
+
import type { Database, Statement, DatabaseOptions } from '../database-interface.js';
|
|
18
|
+
interface SqlJsDatabase {
|
|
19
|
+
run(sql: string): void;
|
|
20
|
+
prepare(sql: string): SqlJsStatement;
|
|
21
|
+
export(): Uint8Array;
|
|
22
|
+
close(): void;
|
|
23
|
+
}
|
|
24
|
+
interface SqlJsStatement {
|
|
25
|
+
bind(params?: SqlJsBindParams): boolean;
|
|
26
|
+
step(): boolean;
|
|
27
|
+
get(): SqlJsValue[];
|
|
28
|
+
getColumnNames(): string[];
|
|
29
|
+
reset(): void;
|
|
30
|
+
free(): void;
|
|
31
|
+
}
|
|
32
|
+
type SqlJsValue = string | number | null | Uint8Array;
|
|
33
|
+
type SqlJsBindParams = SqlJsValue[] | Record<string, SqlJsValue>;
|
|
34
|
+
/**
|
|
35
|
+
* Wraps a sql.js Database to implement our Database interface
|
|
36
|
+
*/
|
|
37
|
+
export declare class SqlJsDatabaseAdapter implements Database {
|
|
38
|
+
private readonly db;
|
|
39
|
+
private readonly filePath;
|
|
40
|
+
private _open;
|
|
41
|
+
private readonly _memory;
|
|
42
|
+
private readonly _readonly;
|
|
43
|
+
private _transactionDepth;
|
|
44
|
+
constructor(db: SqlJsDatabase, filePath: string, options?: DatabaseOptions);
|
|
45
|
+
exec(sql: string): void;
|
|
46
|
+
prepare<T = unknown>(sql: string): Statement<T>;
|
|
47
|
+
transaction<T, Args extends unknown[] = []>(fn: (...args: Args) => T): (...args: Args) => T;
|
|
48
|
+
pragma(pragma: string): unknown;
|
|
49
|
+
close(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Persist the in-memory database to file
|
|
52
|
+
*/
|
|
53
|
+
persist(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Export the database as a Uint8Array
|
|
56
|
+
* Useful for manual persistence or serialization
|
|
57
|
+
*/
|
|
58
|
+
export(): Uint8Array;
|
|
59
|
+
get open(): boolean;
|
|
60
|
+
get name(): string;
|
|
61
|
+
get memory(): boolean;
|
|
62
|
+
get readonly(): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Get the underlying sql.js database instance
|
|
65
|
+
* Use with caution - this bypasses the abstraction layer
|
|
66
|
+
*/
|
|
67
|
+
get native(): SqlJsDatabase;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Create a database connection using sql.js (WASM)
|
|
71
|
+
*
|
|
72
|
+
* @param path - Path to database file, or ':memory:' for in-memory database
|
|
73
|
+
* @param options - Database connection options
|
|
74
|
+
* @returns Promise resolving to a Database instance wrapping sql.js
|
|
75
|
+
* @throws Error if sql.js WASM module fails to load
|
|
76
|
+
*/
|
|
77
|
+
export declare function createSqlJsDatabase(path?: string, options?: DatabaseOptions): Promise<SqlJsDatabaseAdapter>;
|
|
78
|
+
/**
|
|
79
|
+
* Check if fts5-sql-bundle (sql.js with FTS5) is available
|
|
80
|
+
* This always returns true in Node.js since it's a pure JS/WASM module
|
|
81
|
+
*
|
|
82
|
+
* Note: We use require.resolve() here instead of dynamic import() because:
|
|
83
|
+
* 1. This is a synchronous availability check - dynamic import would require async
|
|
84
|
+
* 2. require.resolve() is fast and doesn't load the module, just checks resolvability
|
|
85
|
+
* 3. The actual loading in loadSqlJs() uses dynamic import() for proper ESM support
|
|
86
|
+
*
|
|
87
|
+
* @returns true if fts5-sql-bundle is loadable in Node.js
|
|
88
|
+
*/
|
|
89
|
+
export declare function isSqlJsAvailable(): boolean;
|
|
90
|
+
export {};
|
|
91
|
+
//# sourceMappingURL=sqljsDriver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqljsDriver.d.ts","sourceRoot":"","sources":["../../../../src/db/drivers/sqljsDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAa,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAY/F,UAAU,aAAa;IACrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;IACpC,MAAM,IAAI,UAAU,CAAA;IACpB,KAAK,IAAI,IAAI,CAAA;CACd;AAED,UAAU,cAAc;IACtB,IAAI,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAA;IACvC,IAAI,IAAI,OAAO,CAAA;IACf,GAAG,IAAI,UAAU,EAAE,CAAA;IACnB,cAAc,IAAI,MAAM,EAAE,CAAA;IAC1B,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;CACb;AAGD,KAAK,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,UAAU,CAAA;AACrD,KAAK,eAAe,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;AAqKhE;;GAEG;AACH,qBAAa,oBAAqB,YAAW,QAAQ;IAQjD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR3B,OAAO,CAAC,KAAK,CAAO;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,iBAAiB,CAAI;gBAGV,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,MAAM,EACjC,OAAO,CAAC,EAAE,eAAe;IAM3B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAI/C,WAAW,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC;IAuC3F,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAsB/B,KAAK,IAAI,IAAI;IAYb;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;;OAGG;IACH,MAAM,IAAI,UAAU;IAIpB,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,aAAa,CAE1B;CACF;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,GAAE,MAAmB,EACzB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAqB/B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAO1C"}
|