@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.
Files changed (240) hide show
  1. package/README.md +1 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/analysis/adapters/java-parsers.d.ts.map +1 -1
  4. package/dist/src/analysis/adapters/java-parsers.js +9 -2
  5. package/dist/src/analysis/adapters/java-parsers.js.map +1 -1
  6. package/dist/src/analytics/AnalyticsRepository.d.ts +1 -1
  7. package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
  8. package/dist/src/analytics/ExperimentService.d.ts +1 -1
  9. package/dist/src/analytics/ExperimentService.d.ts.map +1 -1
  10. package/dist/src/analytics/ROIDashboardService.d.ts +1 -1
  11. package/dist/src/analytics/ROIDashboardService.d.ts.map +1 -1
  12. package/dist/src/analytics/UsageAnalyticsService.d.ts +1 -1
  13. package/dist/src/analytics/UsageAnalyticsService.d.ts.map +1 -1
  14. package/dist/src/analytics/metrics-aggregator.d.ts +1 -1
  15. package/dist/src/analytics/metrics-aggregator.d.ts.map +1 -1
  16. package/dist/src/analytics/schema.d.ts +1 -1
  17. package/dist/src/analytics/schema.d.ts.map +1 -1
  18. package/dist/src/analytics/storage.d.ts.map +1 -1
  19. package/dist/src/analytics/storage.js +2 -2
  20. package/dist/src/analytics/storage.js.map +1 -1
  21. package/dist/src/api/client.d.ts +1 -0
  22. package/dist/src/api/client.d.ts.map +1 -1
  23. package/dist/src/api/client.js +14 -7
  24. package/dist/src/api/client.js.map +1 -1
  25. package/dist/src/api/schemas.d.ts +17 -10
  26. package/dist/src/api/schemas.d.ts.map +1 -1
  27. package/dist/src/api/schemas.js +9 -2
  28. package/dist/src/api/schemas.js.map +1 -1
  29. package/dist/src/billing/BillingService.d.ts.map +1 -1
  30. package/dist/src/billing/BillingService.js.map +1 -1
  31. package/dist/src/billing/BillingService.types.d.ts +2 -2
  32. package/dist/src/billing/BillingService.types.d.ts.map +1 -1
  33. package/dist/src/billing/GDPRComplianceService.d.ts.map +1 -1
  34. package/dist/src/billing/GDPRComplianceService.js.map +1 -1
  35. package/dist/src/billing/StripeReconciliationJob.d.ts.map +1 -1
  36. package/dist/src/billing/StripeReconciliationJob.js.map +1 -1
  37. package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -1
  38. package/dist/src/billing/StripeWebhookHandler.js.map +1 -1
  39. package/dist/src/billing/gdpr-types.d.ts +2 -2
  40. package/dist/src/billing/gdpr-types.d.ts.map +1 -1
  41. package/dist/src/billing/reconciliation-types.d.ts +2 -2
  42. package/dist/src/billing/reconciliation-types.d.ts.map +1 -1
  43. package/dist/src/billing/webhook-handlers.d.ts +4 -4
  44. package/dist/src/billing/webhook-handlers.d.ts.map +1 -1
  45. package/dist/src/billing/webhook-handlers.js.map +1 -1
  46. package/dist/src/billing/webhook-types.d.ts +2 -2
  47. package/dist/src/billing/webhook-types.d.ts.map +1 -1
  48. package/dist/src/cache/TieredCache.d.ts.map +1 -1
  49. package/dist/src/cache/TieredCache.js +2 -2
  50. package/dist/src/cache/TieredCache.js.map +1 -1
  51. package/dist/src/cache/sqlite.d.ts.map +1 -1
  52. package/dist/src/cache/sqlite.js +5 -4
  53. package/dist/src/cache/sqlite.js.map +1 -1
  54. package/dist/src/db/createDatabase.d.ts +86 -0
  55. package/dist/src/db/createDatabase.d.ts.map +1 -0
  56. package/dist/src/db/createDatabase.js +139 -0
  57. package/dist/src/db/createDatabase.js.map +1 -0
  58. package/dist/src/db/database-interface.d.ts +141 -0
  59. package/dist/src/db/database-interface.d.ts.map +1 -0
  60. package/dist/src/db/database-interface.js +14 -0
  61. package/dist/src/db/database-interface.js.map +1 -0
  62. package/dist/src/db/drivers/betterSqlite3Driver.d.ts +48 -0
  63. package/dist/src/db/drivers/betterSqlite3Driver.d.ts.map +1 -0
  64. package/dist/src/db/drivers/betterSqlite3Driver.js +138 -0
  65. package/dist/src/db/drivers/betterSqlite3Driver.js.map +1 -0
  66. package/dist/src/db/drivers/index.d.ts +8 -0
  67. package/dist/src/db/drivers/index.d.ts.map +1 -0
  68. package/dist/src/db/drivers/index.js +8 -0
  69. package/dist/src/db/drivers/index.js.map +1 -0
  70. package/dist/src/db/drivers/sqljsDriver.d.ts +91 -0
  71. package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -0
  72. package/dist/src/db/drivers/sqljsDriver.js +335 -0
  73. package/dist/src/db/drivers/sqljsDriver.js.map +1 -0
  74. package/dist/src/db/migration.d.ts +1 -1
  75. package/dist/src/db/migration.d.ts.map +1 -1
  76. package/dist/src/db/quarantine-schema.d.ts +1 -1
  77. package/dist/src/db/quarantine-schema.d.ts.map +1 -1
  78. package/dist/src/db/schema.d.ts +22 -2
  79. package/dist/src/db/schema.d.ts.map +1 -1
  80. package/dist/src/db/schema.js +55 -3
  81. package/dist/src/db/schema.js.map +1 -1
  82. package/dist/src/embeddings/hnsw-store.js +2 -2
  83. package/dist/src/embeddings/hnsw-store.js.map +1 -1
  84. package/dist/src/embeddings/index.d.ts.map +1 -1
  85. package/dist/src/embeddings/index.js +2 -2
  86. package/dist/src/embeddings/index.js.map +1 -1
  87. package/dist/src/exports/repositories.d.ts +4 -1
  88. package/dist/src/exports/repositories.d.ts.map +1 -1
  89. package/dist/src/exports/repositories.js +9 -3
  90. package/dist/src/exports/repositories.js.map +1 -1
  91. package/dist/src/exports/services.d.ts +1 -0
  92. package/dist/src/exports/services.d.ts.map +1 -1
  93. package/dist/src/exports/services.js +4 -0
  94. package/dist/src/exports/services.js.map +1 -1
  95. package/dist/src/index.d.ts +4 -0
  96. package/dist/src/index.d.ts.map +1 -1
  97. package/dist/src/index.js +8 -0
  98. package/dist/src/index.js.map +1 -1
  99. package/dist/src/indexer/SkillParser.d.ts +20 -0
  100. package/dist/src/indexer/SkillParser.d.ts.map +1 -1
  101. package/dist/src/indexer/SkillParser.js +58 -0
  102. package/dist/src/indexer/SkillParser.js.map +1 -1
  103. package/dist/src/learning/PatternStore.d.ts.map +1 -1
  104. package/dist/src/learning/PatternStore.js +2 -7
  105. package/dist/src/learning/PatternStore.js.map +1 -1
  106. package/dist/src/learning/PatternStore.queries.d.ts +17 -17
  107. package/dist/src/learning/PatternStore.queries.d.ts.map +1 -1
  108. package/dist/src/learning/PatternStore.queries.js.map +1 -1
  109. package/dist/src/repositories/CacheRepository.d.ts +1 -1
  110. package/dist/src/repositories/CacheRepository.d.ts.map +1 -1
  111. package/dist/src/repositories/IndexerRepository.d.ts +1 -1
  112. package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
  113. package/dist/src/repositories/SkillRepository.d.ts +1 -1
  114. package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
  115. package/dist/src/repositories/SyncConfigRepository.d.ts +1 -1
  116. package/dist/src/repositories/SyncConfigRepository.d.ts.map +1 -1
  117. package/dist/src/repositories/SyncHistoryRepository.d.ts +1 -1
  118. package/dist/src/repositories/SyncHistoryRepository.d.ts.map +1 -1
  119. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts +1 -1
  120. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
  121. package/dist/src/repositories/quarantine/QuarantineRepository.js +4 -1
  122. package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
  123. package/dist/src/scripts/merge-skills.d.ts.map +1 -1
  124. package/dist/src/scripts/merge-skills.js +2 -2
  125. package/dist/src/scripts/merge-skills.js.map +1 -1
  126. package/dist/src/scripts/review-lenny-skills.js +2 -2
  127. package/dist/src/scripts/review-lenny-skills.js.map +1 -1
  128. package/dist/src/scripts/validation/types.d.ts +2 -2
  129. package/dist/src/search/hybrid.d.ts.map +1 -1
  130. package/dist/src/search/hybrid.js +2 -2
  131. package/dist/src/search/hybrid.js.map +1 -1
  132. package/dist/src/security/AuditLogger.d.ts +1 -1
  133. package/dist/src/security/AuditLogger.d.ts.map +1 -1
  134. package/dist/src/security/audit-types.d.ts +2 -2
  135. package/dist/src/security/audit-types.d.ts.map +1 -1
  136. package/dist/src/security/audit-types.js.map +1 -1
  137. package/dist/src/security/sanitization.d.ts.map +1 -1
  138. package/dist/src/security/sanitization.js +25 -17
  139. package/dist/src/security/sanitization.js.map +1 -1
  140. package/dist/src/services/SearchService.d.ts +1 -1
  141. package/dist/src/services/SearchService.d.ts.map +1 -1
  142. package/dist/src/services/TransformationService.d.ts +1 -1
  143. package/dist/src/services/TransformationService.d.ts.map +1 -1
  144. package/dist/src/services/index.d.ts +9 -0
  145. package/dist/src/services/index.d.ts.map +1 -0
  146. package/dist/src/services/index.js +10 -0
  147. package/dist/src/services/index.js.map +1 -0
  148. package/dist/src/services/quarantine/QuarantineService.d.ts +149 -0
  149. package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -0
  150. package/dist/src/services/quarantine/QuarantineService.js +406 -0
  151. package/dist/src/services/quarantine/QuarantineService.js.map +1 -0
  152. package/dist/src/services/quarantine/index.d.ts +10 -0
  153. package/dist/src/services/quarantine/index.d.ts.map +1 -0
  154. package/dist/src/services/quarantine/index.js +14 -0
  155. package/dist/src/services/quarantine/index.js.map +1 -0
  156. package/dist/src/services/quarantine/types.d.ts +127 -0
  157. package/dist/src/services/quarantine/types.d.ts.map +1 -0
  158. package/dist/src/services/quarantine/types.js +59 -0
  159. package/dist/src/services/quarantine/types.js.map +1 -0
  160. package/dist/src/types/skill.d.ts +6 -1
  161. package/dist/src/types/skill.d.ts.map +1 -1
  162. package/dist/src/types/skill.js.map +1 -1
  163. package/dist/src/types.d.ts +1 -1
  164. package/dist/src/types.d.ts.map +1 -1
  165. package/dist/src/utils/github-url.d.ts +57 -0
  166. package/dist/src/utils/github-url.d.ts.map +1 -0
  167. package/dist/src/utils/github-url.js +88 -0
  168. package/dist/src/utils/github-url.js.map +1 -0
  169. package/dist/src/utils/index.d.ts +2 -0
  170. package/dist/src/utils/index.d.ts.map +1 -1
  171. package/dist/src/utils/index.js +4 -0
  172. package/dist/src/utils/index.js.map +1 -1
  173. package/dist/src/utils/safe-fs.d.ts +63 -0
  174. package/dist/src/utils/safe-fs.d.ts.map +1 -0
  175. package/dist/src/utils/safe-fs.js +119 -0
  176. package/dist/src/utils/safe-fs.js.map +1 -0
  177. package/dist/src/validation/input-validators.d.ts.map +1 -1
  178. package/dist/src/validation/input-validators.js +11 -4
  179. package/dist/src/validation/input-validators.js.map +1 -1
  180. package/dist/tests/Analytics.integration.test.js +2 -2
  181. package/dist/tests/Analytics.integration.test.js.map +1 -1
  182. package/dist/tests/AnalyticsRepository.test.js +2 -2
  183. package/dist/tests/AnalyticsRepository.test.js.map +1 -1
  184. package/dist/tests/AuditLogger.test.js.map +1 -1
  185. package/dist/tests/ExperimentService.test.js +2 -2
  186. package/dist/tests/ExperimentService.test.js.map +1 -1
  187. package/dist/tests/QuarantineRepository.test.js +39 -2
  188. package/dist/tests/QuarantineRepository.test.js.map +1 -1
  189. package/dist/tests/ROIDashboardService.test.js +2 -2
  190. package/dist/tests/ROIDashboardService.test.js.map +1 -1
  191. package/dist/tests/UsageAnalyticsService.test.js +2 -2
  192. package/dist/tests/UsageAnalyticsService.test.js.map +1 -1
  193. package/dist/tests/analytics/metrics-aggregator.test.js +2 -2
  194. package/dist/tests/analytics/metrics-aggregator.test.js.map +1 -1
  195. package/dist/tests/analytics/metrics-exporter.test.js +2 -2
  196. package/dist/tests/analytics/metrics-exporter.test.js.map +1 -1
  197. package/dist/tests/api/client.structural-typing.test.d.ts +11 -0
  198. package/dist/tests/api/client.structural-typing.test.d.ts.map +1 -0
  199. package/dist/tests/api/client.structural-typing.test.js +209 -0
  200. package/dist/tests/api/client.structural-typing.test.js.map +1 -0
  201. package/dist/tests/billing/BillingService.test.js +2 -2
  202. package/dist/tests/billing/BillingService.test.js.map +1 -1
  203. package/dist/tests/billing/GDPRCompliance.test.js +2 -2
  204. package/dist/tests/billing/GDPRCompliance.test.js.map +1 -1
  205. package/dist/tests/billing/StripeReconciliation.test.js +2 -2
  206. package/dist/tests/billing/StripeReconciliation.test.js.map +1 -1
  207. package/dist/tests/db/database-abstraction.test.d.ts +8 -0
  208. package/dist/tests/db/database-abstraction.test.d.ts.map +1 -0
  209. package/dist/tests/db/database-abstraction.test.js +208 -0
  210. package/dist/tests/db/database-abstraction.test.js.map +1 -0
  211. package/dist/tests/db/fts5-support.test.d.ts +14 -0
  212. package/dist/tests/db/fts5-support.test.d.ts.map +1 -0
  213. package/dist/tests/db/fts5-support.test.js +128 -0
  214. package/dist/tests/db/fts5-support.test.js.map +1 -0
  215. package/dist/tests/db/schema-async.test.d.ts +9 -0
  216. package/dist/tests/db/schema-async.test.d.ts.map +1 -0
  217. package/dist/tests/db/schema-async.test.js +302 -0
  218. package/dist/tests/db/schema-async.test.js.map +1 -0
  219. package/dist/tests/db/sqljs-driver.test.d.ts +8 -0
  220. package/dist/tests/db/sqljs-driver.test.d.ts.map +1 -0
  221. package/dist/tests/db/sqljs-driver.test.js +323 -0
  222. package/dist/tests/db/sqljs-driver.test.js.map +1 -0
  223. package/dist/tests/edge-cases/EdgeCases.test.js +5 -2
  224. package/dist/tests/edge-cases/EdgeCases.test.js.map +1 -1
  225. package/dist/tests/integration/QuarantineService.test.d.ts +11 -0
  226. package/dist/tests/integration/QuarantineService.test.d.ts.map +1 -0
  227. package/dist/tests/integration/QuarantineService.test.js +378 -0
  228. package/dist/tests/integration/QuarantineService.test.js.map +1 -0
  229. package/dist/tests/schema.test.js.map +1 -1
  230. package/dist/tests/scripts/import-to-database.test.js +7 -7
  231. package/dist/tests/scripts/import-to-database.test.js.map +1 -1
  232. package/dist/tests/unit/check-references.test.d.ts +2 -0
  233. package/dist/tests/unit/check-references.test.d.ts.map +1 -0
  234. package/dist/tests/unit/check-references.test.js +118 -0
  235. package/dist/tests/unit/check-references.test.js.map +1 -0
  236. package/dist/tests/utils/safe-fs.test.d.ts +12 -0
  237. package/dist/tests/utils/safe-fs.test.d.ts.map +1 -0
  238. package/dist/tests/utils/safe-fs.test.js +116 -0
  239. package/dist/tests/utils/safe-fs.test.js.map +1 -0
  240. 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"}