@buoy-design/db 0.1.0

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.
@@ -0,0 +1,18 @@
1
+ import { type Database as BetterSqlite3Database } from 'better-sqlite3';
2
+ import { type BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
3
+ import * as schema from './schema/index.js';
4
+ export interface DbConfig {
5
+ path?: string;
6
+ inMemory?: boolean;
7
+ }
8
+ export type SqliteDb = BetterSqlite3Database;
9
+ export interface DbInstance {
10
+ db: BetterSQLite3Database<typeof schema>;
11
+ sqlite: SqliteDb;
12
+ close: () => void;
13
+ }
14
+ export declare function createDb(config?: DbConfig): DbInstance;
15
+ export type BuoyDb = DbInstance['db'];
16
+ export declare function initializeDb(_db: BuoyDb, sqlite: SqliteDb): void;
17
+ export declare function setupDb(config?: DbConfig): DbInstance;
18
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAiB,EAAE,KAAK,QAAQ,IAAI,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAW,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAI5C,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AAI7C,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,qBAAqB,CAAC,OAAO,MAAM,CAAC,CAAC;IACzC,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,QAAQ,CAAC,MAAM,GAAE,QAAa,GAAG,UAAU,CAuB1D;AAED,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;AAGtC,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CA8GhE;AAGD,wBAAgB,OAAO,CAAC,MAAM,GAAE,QAAa,GAAG,UAAU,CAIzD"}
package/dist/client.js ADDED
@@ -0,0 +1,146 @@
1
+ import Database from 'better-sqlite3';
2
+ import { drizzle } from 'drizzle-orm/better-sqlite3';
3
+ import * as schema from './schema/index.js';
4
+ import { resolve, dirname } from 'path';
5
+ import { existsSync, mkdirSync } from 'fs';
6
+ const DEFAULT_DB_PATH = '.buoy/buoy.db';
7
+ export function createDb(config = {}) {
8
+ let dbPath;
9
+ if (config.inMemory) {
10
+ dbPath = ':memory:';
11
+ }
12
+ else {
13
+ dbPath = config.path || resolve(process.cwd(), DEFAULT_DB_PATH);
14
+ // Ensure directory exists
15
+ const dir = dirname(dbPath);
16
+ if (!existsSync(dir)) {
17
+ mkdirSync(dir, { recursive: true });
18
+ }
19
+ }
20
+ const sqlite = new Database(dbPath);
21
+ const db = drizzle(sqlite, { schema });
22
+ return {
23
+ db,
24
+ sqlite,
25
+ close: () => sqlite.close(),
26
+ };
27
+ }
28
+ // Initialize database schema
29
+ export function initializeDb(_db, sqlite) {
30
+ // Create tables if they don't exist
31
+ sqlite.exec(`
32
+ CREATE TABLE IF NOT EXISTS projects (
33
+ id TEXT PRIMARY KEY,
34
+ name TEXT NOT NULL,
35
+ repo_url TEXT,
36
+ figma_file_keys TEXT,
37
+ storybook_url TEXT,
38
+ config TEXT,
39
+ created_at INTEGER NOT NULL,
40
+ updated_at INTEGER NOT NULL
41
+ );
42
+
43
+ CREATE TABLE IF NOT EXISTS scans (
44
+ id TEXT PRIMARY KEY,
45
+ project_id TEXT NOT NULL REFERENCES projects(id),
46
+ status TEXT NOT NULL DEFAULT 'pending',
47
+ sources TEXT NOT NULL,
48
+ stats TEXT,
49
+ errors TEXT,
50
+ started_at INTEGER,
51
+ completed_at INTEGER,
52
+ created_at INTEGER NOT NULL
53
+ );
54
+
55
+ CREATE TABLE IF NOT EXISTS components (
56
+ id TEXT PRIMARY KEY,
57
+ project_id TEXT NOT NULL REFERENCES projects(id),
58
+ scan_id TEXT NOT NULL REFERENCES scans(id),
59
+ external_id TEXT NOT NULL,
60
+ name TEXT NOT NULL,
61
+ source TEXT NOT NULL,
62
+ source_location TEXT NOT NULL,
63
+ props TEXT,
64
+ variants TEXT,
65
+ token_refs TEXT,
66
+ dependencies TEXT,
67
+ metadata TEXT,
68
+ scanned_at INTEGER NOT NULL
69
+ );
70
+
71
+ CREATE TABLE IF NOT EXISTS tokens (
72
+ id TEXT PRIMARY KEY,
73
+ project_id TEXT NOT NULL REFERENCES projects(id),
74
+ scan_id TEXT NOT NULL REFERENCES scans(id),
75
+ external_id TEXT NOT NULL,
76
+ name TEXT NOT NULL,
77
+ category TEXT NOT NULL,
78
+ value TEXT NOT NULL,
79
+ source TEXT NOT NULL,
80
+ aliases TEXT,
81
+ usedby TEXT,
82
+ metadata TEXT,
83
+ scanned_at INTEGER NOT NULL
84
+ );
85
+
86
+ CREATE TABLE IF NOT EXISTS drift_signals (
87
+ id TEXT PRIMARY KEY,
88
+ project_id TEXT NOT NULL REFERENCES projects(id),
89
+ scan_id TEXT REFERENCES scans(id),
90
+ type TEXT NOT NULL,
91
+ severity TEXT NOT NULL,
92
+ source TEXT NOT NULL,
93
+ target TEXT,
94
+ message TEXT NOT NULL,
95
+ details TEXT,
96
+ claude_analysis TEXT,
97
+ resolved INTEGER DEFAULT 0,
98
+ resolution TEXT,
99
+ detected_at INTEGER NOT NULL,
100
+ resolved_at INTEGER
101
+ );
102
+
103
+ CREATE TABLE IF NOT EXISTS intents (
104
+ id TEXT PRIMARY KEY,
105
+ project_id TEXT NOT NULL REFERENCES projects(id),
106
+ entity_type TEXT NOT NULL,
107
+ entity_id TEXT NOT NULL,
108
+ entity_name TEXT NOT NULL,
109
+ decision TEXT NOT NULL,
110
+ context TEXT,
111
+ status TEXT NOT NULL DEFAULT 'active',
112
+ created_by TEXT,
113
+ created_at INTEGER NOT NULL,
114
+ updated_at INTEGER,
115
+ expires_at INTEGER
116
+ );
117
+
118
+ CREATE TABLE IF NOT EXISTS snapshots (
119
+ id TEXT PRIMARY KEY,
120
+ project_id TEXT NOT NULL REFERENCES projects(id),
121
+ scan_id TEXT NOT NULL REFERENCES scans(id),
122
+ summary TEXT NOT NULL,
123
+ component_count INTEGER NOT NULL,
124
+ token_count INTEGER NOT NULL,
125
+ drift_count INTEGER NOT NULL,
126
+ coverage_score INTEGER,
127
+ created_at INTEGER NOT NULL
128
+ );
129
+
130
+ -- Indexes for common queries
131
+ CREATE INDEX IF NOT EXISTS idx_scans_project ON scans(project_id);
132
+ CREATE INDEX IF NOT EXISTS idx_components_project ON components(project_id);
133
+ CREATE INDEX IF NOT EXISTS idx_components_scan ON components(scan_id);
134
+ CREATE INDEX IF NOT EXISTS idx_tokens_project ON tokens(project_id);
135
+ CREATE INDEX IF NOT EXISTS idx_drift_signals_project ON drift_signals(project_id);
136
+ CREATE INDEX IF NOT EXISTS idx_drift_signals_resolved ON drift_signals(resolved);
137
+ CREATE INDEX IF NOT EXISTS idx_intents_entity ON intents(entity_type, entity_id);
138
+ `);
139
+ }
140
+ // Convenience function to create and initialize
141
+ export function setupDb(config = {}) {
142
+ const { db, sqlite, close } = createDb(config);
143
+ initializeDb(db, sqlite);
144
+ return { db, sqlite, close };
145
+ }
146
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,QAAoD,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,OAAO,EAA8B,MAAM,4BAA4B,CAAC;AACjF,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAS3C,MAAM,eAAe,GAAG,eAAe,CAAC;AAQxC,MAAM,UAAU,QAAQ,CAAC,SAAmB,EAAE;IAC5C,IAAI,MAAc,CAAC;IAEnB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,GAAG,UAAU,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;QAEhE,0BAA0B;QAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvC,OAAO;QACL,EAAE;QACF,MAAM;QACN,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;KAC5B,CAAC;AACJ,CAAC;AAID,6BAA6B;AAC7B,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,MAAgB;IACxD,oCAAoC;IACpC,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2GX,CAAC,CAAC;AACL,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,OAAO,CAAC,SAAmB,EAAE;IAC3C,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/C,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACzB,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './schema/index.js';
2
+ export { createDb, initializeDb, setupDb, type BuoyDb, type DbConfig } from './client.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './schema/index.js';
2
+ export { createDb, initializeDb, setupDb } from './client.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAA8B,MAAM,aAAa,CAAC"}