@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,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2180: Database Abstraction Layer Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests the database interface contracts and driver implementations.
|
|
5
|
+
* These tests should pass with any conforming driver (better-sqlite3, sql.js).
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
8
|
+
import { createDatabaseSync, createDatabaseAsync, detectAvailableDrivers, getBestDriver, } from '../../src/db/createDatabase.js';
|
|
9
|
+
import { isBetterSqlite3Available, BetterSqlite3Database, } from '../../src/db/drivers/betterSqlite3Driver.js';
|
|
10
|
+
describe('Database Abstraction Layer', () => {
|
|
11
|
+
describe('Driver Detection', () => {
|
|
12
|
+
it('should detect available drivers', () => {
|
|
13
|
+
const drivers = detectAvailableDrivers();
|
|
14
|
+
expect(drivers).toBeInstanceOf(Array);
|
|
15
|
+
expect(drivers.length).toBeGreaterThan(0);
|
|
16
|
+
// Each driver should have required fields
|
|
17
|
+
for (const driver of drivers) {
|
|
18
|
+
expect(driver).toHaveProperty('type');
|
|
19
|
+
expect(driver).toHaveProperty('available');
|
|
20
|
+
expect(typeof driver.available).toBe('boolean');
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
it('should get best available driver', () => {
|
|
24
|
+
const best = getBestDriver();
|
|
25
|
+
// In Docker environment, better-sqlite3 should be available
|
|
26
|
+
if (isBetterSqlite3Available()) {
|
|
27
|
+
expect(best).toBe('better-sqlite3');
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
it('should detect better-sqlite3 availability', () => {
|
|
31
|
+
const available = isBetterSqlite3Available();
|
|
32
|
+
expect(typeof available).toBe('boolean');
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('Database Interface Contract', () => {
|
|
36
|
+
let db;
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
// Skip if no driver available
|
|
39
|
+
if (!isBetterSqlite3Available()) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
db = createDatabaseSync(':memory:');
|
|
43
|
+
});
|
|
44
|
+
afterEach(() => {
|
|
45
|
+
if (db?.open) {
|
|
46
|
+
db.close();
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
it('should create in-memory database', () => {
|
|
50
|
+
if (!isBetterSqlite3Available())
|
|
51
|
+
return;
|
|
52
|
+
expect(db).toBeDefined();
|
|
53
|
+
expect(db.open).toBe(true);
|
|
54
|
+
expect(db.memory).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
it('should execute raw SQL', () => {
|
|
57
|
+
if (!isBetterSqlite3Available())
|
|
58
|
+
return;
|
|
59
|
+
expect(() => {
|
|
60
|
+
db.exec(`
|
|
61
|
+
CREATE TABLE test (
|
|
62
|
+
id INTEGER PRIMARY KEY,
|
|
63
|
+
name TEXT NOT NULL
|
|
64
|
+
)
|
|
65
|
+
`);
|
|
66
|
+
}).not.toThrow();
|
|
67
|
+
});
|
|
68
|
+
it('should prepare and execute statements', () => {
|
|
69
|
+
if (!isBetterSqlite3Available())
|
|
70
|
+
return;
|
|
71
|
+
db.exec('CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)');
|
|
72
|
+
const insertStmt = db.prepare('INSERT INTO test (name) VALUES (?)');
|
|
73
|
+
const result = insertStmt.run('Alice');
|
|
74
|
+
expect(result.changes).toBe(1);
|
|
75
|
+
expect(result.lastInsertRowid).toBe(1);
|
|
76
|
+
});
|
|
77
|
+
it('should query single row with get()', () => {
|
|
78
|
+
if (!isBetterSqlite3Available())
|
|
79
|
+
return;
|
|
80
|
+
db.exec('CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)');
|
|
81
|
+
db.exec("INSERT INTO test (name) VALUES ('Alice'), ('Bob')");
|
|
82
|
+
const stmt = db.prepare('SELECT * FROM test WHERE name = ?');
|
|
83
|
+
const row = stmt.get('Alice');
|
|
84
|
+
expect(row).toEqual({ id: 1, name: 'Alice' });
|
|
85
|
+
});
|
|
86
|
+
it('should return undefined for non-existent row', () => {
|
|
87
|
+
if (!isBetterSqlite3Available())
|
|
88
|
+
return;
|
|
89
|
+
db.exec('CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)');
|
|
90
|
+
const stmt = db.prepare('SELECT * FROM test WHERE name = ?');
|
|
91
|
+
const row = stmt.get('NonExistent');
|
|
92
|
+
expect(row).toBeUndefined();
|
|
93
|
+
});
|
|
94
|
+
it('should query multiple rows with all()', () => {
|
|
95
|
+
if (!isBetterSqlite3Available())
|
|
96
|
+
return;
|
|
97
|
+
db.exec('CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)');
|
|
98
|
+
db.exec("INSERT INTO test (name) VALUES ('Alice'), ('Bob'), ('Charlie')");
|
|
99
|
+
const stmt = db.prepare('SELECT * FROM test');
|
|
100
|
+
const rows = stmt.all();
|
|
101
|
+
expect(rows).toHaveLength(3);
|
|
102
|
+
expect(rows[0].name).toBe('Alice');
|
|
103
|
+
expect(rows[1].name).toBe('Bob');
|
|
104
|
+
expect(rows[2].name).toBe('Charlie');
|
|
105
|
+
});
|
|
106
|
+
it('should iterate over rows with iterate()', () => {
|
|
107
|
+
if (!isBetterSqlite3Available())
|
|
108
|
+
return;
|
|
109
|
+
db.exec('CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)');
|
|
110
|
+
db.exec("INSERT INTO test (name) VALUES ('Alice'), ('Bob')");
|
|
111
|
+
const stmt = db.prepare('SELECT * FROM test');
|
|
112
|
+
const names = [];
|
|
113
|
+
for (const row of stmt.iterate()) {
|
|
114
|
+
names.push(row.name);
|
|
115
|
+
}
|
|
116
|
+
expect(names).toEqual(['Alice', 'Bob']);
|
|
117
|
+
});
|
|
118
|
+
it('should execute transactions', () => {
|
|
119
|
+
if (!isBetterSqlite3Available())
|
|
120
|
+
return;
|
|
121
|
+
db.exec('CREATE TABLE test (id INTEGER PRIMARY KEY, balance INTEGER)');
|
|
122
|
+
db.exec('INSERT INTO test (balance) VALUES (100), (50)');
|
|
123
|
+
const transfer = () => {
|
|
124
|
+
const withdraw = db.prepare('UPDATE test SET balance = balance - ? WHERE id = ?');
|
|
125
|
+
const deposit = db.prepare('UPDATE test SET balance = balance + ? WHERE id = ?');
|
|
126
|
+
withdraw.run(30, 1);
|
|
127
|
+
deposit.run(30, 2);
|
|
128
|
+
return 'success';
|
|
129
|
+
};
|
|
130
|
+
// transaction() returns a callable function
|
|
131
|
+
const txn = db.transaction(transfer);
|
|
132
|
+
const result = txn();
|
|
133
|
+
expect(result).toBe('success');
|
|
134
|
+
// Verify balances
|
|
135
|
+
const stmt = db.prepare('SELECT balance FROM test WHERE id = ?');
|
|
136
|
+
expect(stmt.get(1)?.balance).toBe(70);
|
|
137
|
+
expect(stmt.get(2)?.balance).toBe(80);
|
|
138
|
+
});
|
|
139
|
+
it('should execute pragma statements', () => {
|
|
140
|
+
if (!isBetterSqlite3Available())
|
|
141
|
+
return;
|
|
142
|
+
// Set pragma
|
|
143
|
+
db.pragma('foreign_keys = ON');
|
|
144
|
+
// Get pragma value
|
|
145
|
+
const result = db.pragma('foreign_keys');
|
|
146
|
+
expect(result).toBeDefined();
|
|
147
|
+
});
|
|
148
|
+
it('should close database', () => {
|
|
149
|
+
if (!isBetterSqlite3Available())
|
|
150
|
+
return;
|
|
151
|
+
expect(db.open).toBe(true);
|
|
152
|
+
db.close();
|
|
153
|
+
expect(db.open).toBe(false);
|
|
154
|
+
});
|
|
155
|
+
it('should expose database properties', () => {
|
|
156
|
+
if (!isBetterSqlite3Available())
|
|
157
|
+
return;
|
|
158
|
+
expect(db.name).toBe(':memory:');
|
|
159
|
+
expect(db.memory).toBe(true);
|
|
160
|
+
expect(db.readonly).toBe(false);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe('Async Database Creation', () => {
|
|
164
|
+
it('should create database asynchronously', async () => {
|
|
165
|
+
if (!isBetterSqlite3Available())
|
|
166
|
+
return;
|
|
167
|
+
const db = await createDatabaseAsync(':memory:');
|
|
168
|
+
expect(db).toBeDefined();
|
|
169
|
+
expect(db.open).toBe(true);
|
|
170
|
+
db.close();
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe('BetterSqlite3Database Wrapper', () => {
|
|
174
|
+
it('should provide access to native instance', () => {
|
|
175
|
+
if (!isBetterSqlite3Available())
|
|
176
|
+
return;
|
|
177
|
+
const db = createDatabaseSync(':memory:');
|
|
178
|
+
expect(db).toBeInstanceOf(BetterSqlite3Database);
|
|
179
|
+
const native = db.native;
|
|
180
|
+
expect(native).toBeDefined();
|
|
181
|
+
expect(native.open).toBe(true);
|
|
182
|
+
db.close();
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('Error Handling', () => {
|
|
186
|
+
it('should throw on invalid SQL', () => {
|
|
187
|
+
if (!isBetterSqlite3Available())
|
|
188
|
+
return;
|
|
189
|
+
const db = createDatabaseSync(':memory:');
|
|
190
|
+
expect(() => {
|
|
191
|
+
db.exec('INVALID SQL STATEMENT');
|
|
192
|
+
}).toThrow();
|
|
193
|
+
db.close();
|
|
194
|
+
});
|
|
195
|
+
it('should throw on constraint violation', () => {
|
|
196
|
+
if (!isBetterSqlite3Available())
|
|
197
|
+
return;
|
|
198
|
+
const db = createDatabaseSync(':memory:');
|
|
199
|
+
db.exec('CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT UNIQUE)');
|
|
200
|
+
db.exec("INSERT INTO test (name) VALUES ('Alice')");
|
|
201
|
+
expect(() => {
|
|
202
|
+
db.exec("INSERT INTO test (name) VALUES ('Alice')");
|
|
203
|
+
}).toThrow();
|
|
204
|
+
db.close();
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
//# sourceMappingURL=database-abstraction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-abstraction.test.js","sourceRoot":"","sources":["../../../tests/db/database-abstraction.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2182: FTS5 Support Test
|
|
3
|
+
*
|
|
4
|
+
* Tests whether the current sql.js installation has FTS5 support.
|
|
5
|
+
* FTS5 is required for full-text search capabilities.
|
|
6
|
+
*
|
|
7
|
+
* Standard sql.js builds do NOT include FTS5 by default.
|
|
8
|
+
* If this test fails, we need to build a custom sql.js with FTS5 enabled.
|
|
9
|
+
*
|
|
10
|
+
* @see https://github.com/niclaslindstedt/sql.js-fts5
|
|
11
|
+
* @see https://www.sqlite.org/fts5.html
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=fts5-support.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts5-support.test.d.ts","sourceRoot":"","sources":["../../../tests/db/fts5-support.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2182: FTS5 Support Test
|
|
3
|
+
*
|
|
4
|
+
* Tests whether the current sql.js installation has FTS5 support.
|
|
5
|
+
* FTS5 is required for full-text search capabilities.
|
|
6
|
+
*
|
|
7
|
+
* Standard sql.js builds do NOT include FTS5 by default.
|
|
8
|
+
* If this test fails, we need to build a custom sql.js with FTS5 enabled.
|
|
9
|
+
*
|
|
10
|
+
* @see https://github.com/niclaslindstedt/sql.js-fts5
|
|
11
|
+
* @see https://www.sqlite.org/fts5.html
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
14
|
+
// Track database for cleanup
|
|
15
|
+
let db = null;
|
|
16
|
+
/**
|
|
17
|
+
* Load fts5-sql-bundle WASM module directly for this test
|
|
18
|
+
* fts5-sql-bundle has a built-in locateFile that correctly resolves the WASM file
|
|
19
|
+
*/
|
|
20
|
+
async function loadSqlJs() {
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
const module = (await import('fts5-sql-bundle'));
|
|
23
|
+
const initSqlJs = module.default || module;
|
|
24
|
+
return initSqlJs();
|
|
25
|
+
}
|
|
26
|
+
describe('FTS5 Support Detection', () => {
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
if (db) {
|
|
29
|
+
db.close();
|
|
30
|
+
db = null;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
it('should detect FTS5 availability in sql.js', async () => {
|
|
34
|
+
const SQL = await loadSqlJs();
|
|
35
|
+
db = new SQL.Database();
|
|
36
|
+
let fts5Available = false;
|
|
37
|
+
let errorMessage = '';
|
|
38
|
+
try {
|
|
39
|
+
// Attempt to create an FTS5 virtual table
|
|
40
|
+
db.run(`
|
|
41
|
+
CREATE VIRTUAL TABLE test_fts USING fts5(content);
|
|
42
|
+
`);
|
|
43
|
+
fts5Available = true;
|
|
44
|
+
// If successful, test insertion and MATCH query
|
|
45
|
+
db.run(`INSERT INTO test_fts (content) VALUES ('hello world');`);
|
|
46
|
+
db.run(`INSERT INTO test_fts (content) VALUES ('goodbye world');`);
|
|
47
|
+
db.run(`INSERT INTO test_fts (content) VALUES ('hello there');`);
|
|
48
|
+
// Run a MATCH query
|
|
49
|
+
const stmt = db.prepare(`SELECT content FROM test_fts WHERE test_fts MATCH 'hello';`);
|
|
50
|
+
const results = [];
|
|
51
|
+
while (stmt.step()) {
|
|
52
|
+
const row = stmt.get();
|
|
53
|
+
results.push(row[0]);
|
|
54
|
+
}
|
|
55
|
+
stmt.free();
|
|
56
|
+
// Verify MATCH query works
|
|
57
|
+
expect(results).toHaveLength(2);
|
|
58
|
+
expect(results).toContain('hello world');
|
|
59
|
+
expect(results).toContain('hello there');
|
|
60
|
+
console.log('\n========================================');
|
|
61
|
+
console.log('FTS5 IS AVAILABLE in sql.js');
|
|
62
|
+
console.log('----------------------------------------');
|
|
63
|
+
console.log('FTS5 virtual table creation: SUCCESS');
|
|
64
|
+
console.log('FTS5 INSERT operations: SUCCESS');
|
|
65
|
+
console.log('FTS5 MATCH query: SUCCESS');
|
|
66
|
+
console.log(` - Found ${results.length} results for "hello"`);
|
|
67
|
+
console.log('========================================\n');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
fts5Available = false;
|
|
71
|
+
errorMessage = error instanceof Error ? error.message : String(error);
|
|
72
|
+
console.log('\n========================================');
|
|
73
|
+
console.log('FTS5 IS NOT AVAILABLE in sql.js');
|
|
74
|
+
console.log('----------------------------------------');
|
|
75
|
+
console.log(`Error: ${errorMessage}`);
|
|
76
|
+
console.log('');
|
|
77
|
+
console.log('RECOMMENDATION: Build custom sql.js with FTS5');
|
|
78
|
+
console.log('See: https://github.com/niclaslindstedt/sql.js-fts5');
|
|
79
|
+
console.log('Or: Build from source with -DSQLITE_ENABLE_FTS5');
|
|
80
|
+
console.log('========================================\n');
|
|
81
|
+
}
|
|
82
|
+
// Report the result - test passes either way to show the detection result
|
|
83
|
+
console.log(`\nFTS5 Support: ${fts5Available ? 'YES' : 'NO'}`);
|
|
84
|
+
// Make this an informational test that always passes
|
|
85
|
+
// The real assertion is whether we need a custom build
|
|
86
|
+
expect(true).toBe(true);
|
|
87
|
+
});
|
|
88
|
+
it('should report SQLite compile options', async () => {
|
|
89
|
+
const SQL = await loadSqlJs();
|
|
90
|
+
db = new SQL.Database();
|
|
91
|
+
// Query compile options to see what's enabled
|
|
92
|
+
const stmt = db.prepare('PRAGMA compile_options;');
|
|
93
|
+
const options = [];
|
|
94
|
+
while (stmt.step()) {
|
|
95
|
+
const row = stmt.get();
|
|
96
|
+
options.push(row[0]);
|
|
97
|
+
}
|
|
98
|
+
stmt.free();
|
|
99
|
+
console.log('\n========================================');
|
|
100
|
+
console.log('SQLite Compile Options in sql.js');
|
|
101
|
+
console.log('----------------------------------------');
|
|
102
|
+
options.forEach((opt) => {
|
|
103
|
+
console.log(` - ${opt}`);
|
|
104
|
+
});
|
|
105
|
+
console.log('========================================\n');
|
|
106
|
+
// Check for FTS-related options
|
|
107
|
+
const hasFts3 = options.some((opt) => opt.includes('FTS3'));
|
|
108
|
+
const hasFts4 = options.some((opt) => opt.includes('FTS4'));
|
|
109
|
+
const hasFts5 = options.some((opt) => opt.includes('FTS5'));
|
|
110
|
+
console.log(`FTS3: ${hasFts3 ? 'ENABLED' : 'NOT FOUND'}`);
|
|
111
|
+
console.log(`FTS4: ${hasFts4 ? 'ENABLED' : 'NOT FOUND'}`);
|
|
112
|
+
console.log(`FTS5: ${hasFts5 ? 'ENABLED' : 'NOT FOUND'}`);
|
|
113
|
+
// This test always passes - it's for reporting purposes
|
|
114
|
+
expect(options.length).toBeGreaterThan(0);
|
|
115
|
+
});
|
|
116
|
+
it('should report SQLite version', async () => {
|
|
117
|
+
const SQL = await loadSqlJs();
|
|
118
|
+
db = new SQL.Database();
|
|
119
|
+
const stmt = db.prepare('SELECT sqlite_version();');
|
|
120
|
+
stmt.step();
|
|
121
|
+
const version = stmt.get()[0];
|
|
122
|
+
stmt.free();
|
|
123
|
+
console.log(`\nSQLite Version: ${version}`);
|
|
124
|
+
expect(version).toBeDefined();
|
|
125
|
+
expect(version).toMatch(/^\d+\.\d+\.\d+$/);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=fts5-support.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts5-support.test.js","sourceRoot":"","sources":["../../../tests/db/fts5-support.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2206: Async Schema Functions Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for async database initialization with WASM fallback support.
|
|
5
|
+
* These tests verify that createDatabaseAsync and openDatabaseAsync work
|
|
6
|
+
* correctly with automatic driver selection.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=schema-async.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-async.test.d.ts","sourceRoot":"","sources":["../../../tests/db/schema-async.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|