@johnboxcodes/boxlogger 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.
- package/CHANGELOG.md +23 -0
- package/LICENSE +21 -0
- package/README.md +248 -0
- package/dist/index.d.ts +607 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1147 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +180 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +389 -0
- package/dist/logger.js.map +1 -0
- package/dist/scope.d.ts +242 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +373 -0
- package/dist/scope.js.map +1 -0
- package/dist/stores/base.d.ts +127 -0
- package/dist/stores/base.d.ts.map +1 -0
- package/dist/stores/base.js +288 -0
- package/dist/stores/base.js.map +1 -0
- package/dist/stores/index.d.ts +12 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +12 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/stores/memory.d.ts +131 -0
- package/dist/stores/memory.d.ts.map +1 -0
- package/dist/stores/memory.js +284 -0
- package/dist/stores/memory.js.map +1 -0
- package/dist/stores/sqlite.d.ts +204 -0
- package/dist/stores/sqlite.d.ts.map +1 -0
- package/dist/stores/sqlite.js +608 -0
- package/dist/stores/sqlite.js.map +1 -0
- package/dist/types.d.ts +607 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Store Provider
|
|
3
|
+
*
|
|
4
|
+
* In-memory storage implementation for development, testing, or ephemeral logging.
|
|
5
|
+
*
|
|
6
|
+
* @module stores/memory
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { BaseStoreProvider } from './base.js';
|
|
10
|
+
/**
|
|
11
|
+
* In-memory store provider
|
|
12
|
+
*
|
|
13
|
+
* @remarks
|
|
14
|
+
* Fast read/write operations with no persistence.
|
|
15
|
+
* Data is lost when the process exits.
|
|
16
|
+
* Ideal for testing, development, or caching scenarios.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { MemoryStoreProvider } from '@nodelogger/core/memory';
|
|
21
|
+
*
|
|
22
|
+
* const store = new MemoryStoreProvider({ maxLogs: 5000 });
|
|
23
|
+
* await store.init();
|
|
24
|
+
*
|
|
25
|
+
* await store.saveLog({
|
|
26
|
+
* id: '1',
|
|
27
|
+
* timestamp: new Date().toISOString(),
|
|
28
|
+
* level: 'info',
|
|
29
|
+
* message: 'Hello world'
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export class MemoryStoreProvider extends BaseStoreProvider {
|
|
34
|
+
name = 'memory';
|
|
35
|
+
logs = [];
|
|
36
|
+
sessions = new Map();
|
|
37
|
+
constructor(config) {
|
|
38
|
+
super({
|
|
39
|
+
...config,
|
|
40
|
+
maxLogs: config?.maxLogs ?? 10000,
|
|
41
|
+
maxSessions: config?.maxSessions ?? 1000,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Initialize the memory store
|
|
46
|
+
*/
|
|
47
|
+
async init() {
|
|
48
|
+
this._ready = true;
|
|
49
|
+
this.startCleanupTimer();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Close the memory store and clear all data
|
|
53
|
+
*/
|
|
54
|
+
async close() {
|
|
55
|
+
this.stopCleanupTimer();
|
|
56
|
+
this.logs = [];
|
|
57
|
+
this.sessions.clear();
|
|
58
|
+
this._ready = false;
|
|
59
|
+
}
|
|
60
|
+
// =========================================================================
|
|
61
|
+
// Log Operations
|
|
62
|
+
// =========================================================================
|
|
63
|
+
/**
|
|
64
|
+
* Save a log entry to memory
|
|
65
|
+
* @param entry - Log entry to save
|
|
66
|
+
*/
|
|
67
|
+
async saveLog(entry) {
|
|
68
|
+
this.ensureReady();
|
|
69
|
+
const logEntry = {
|
|
70
|
+
...entry,
|
|
71
|
+
id: entry.id || this.generateId(),
|
|
72
|
+
timestamp: entry.timestamp || this.now(),
|
|
73
|
+
};
|
|
74
|
+
this.logs.push(logEntry);
|
|
75
|
+
// Enforce max logs limit (FIFO eviction)
|
|
76
|
+
if (this.logs.length > this.config.maxLogs) {
|
|
77
|
+
this.logs = this.logs.slice(-this.config.maxLogs);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get log entries matching filter
|
|
82
|
+
* @param filter - Query filter
|
|
83
|
+
* @returns Matching log entries
|
|
84
|
+
*/
|
|
85
|
+
async getLogs(filter) {
|
|
86
|
+
this.ensureReady();
|
|
87
|
+
if (!filter) {
|
|
88
|
+
return this.logs.map((log) => this.clone(log));
|
|
89
|
+
}
|
|
90
|
+
return this.filterLogs(this.logs, filter).map((log) => this.clone(log));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Delete log entries matching filter
|
|
94
|
+
* @param filter - Query filter
|
|
95
|
+
* @returns Number of deleted entries
|
|
96
|
+
*/
|
|
97
|
+
async deleteLogs(filter) {
|
|
98
|
+
this.ensureReady();
|
|
99
|
+
if (!filter) {
|
|
100
|
+
const count = this.logs.length;
|
|
101
|
+
this.logs = [];
|
|
102
|
+
return count;
|
|
103
|
+
}
|
|
104
|
+
const toDelete = new Set(this.filterLogs(this.logs, filter).map((l) => l.id));
|
|
105
|
+
const before = this.logs.length;
|
|
106
|
+
this.logs = this.logs.filter((log) => !toDelete.has(log.id));
|
|
107
|
+
return before - this.logs.length;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Count log entries matching filter
|
|
111
|
+
* @param filter - Query filter
|
|
112
|
+
* @returns Count of matching entries
|
|
113
|
+
*/
|
|
114
|
+
async countLogs(filter) {
|
|
115
|
+
this.ensureReady();
|
|
116
|
+
if (!filter) {
|
|
117
|
+
return this.logs.length;
|
|
118
|
+
}
|
|
119
|
+
return this.filterLogs(this.logs, filter).length;
|
|
120
|
+
}
|
|
121
|
+
// =========================================================================
|
|
122
|
+
// Session Operations
|
|
123
|
+
// =========================================================================
|
|
124
|
+
/**
|
|
125
|
+
* Create a new session
|
|
126
|
+
* @param session - Session to create
|
|
127
|
+
*/
|
|
128
|
+
async createSession(session) {
|
|
129
|
+
this.ensureReady();
|
|
130
|
+
const sessionEntry = {
|
|
131
|
+
...session,
|
|
132
|
+
id: session.id || this.generateId(),
|
|
133
|
+
startedAt: session.startedAt || this.now(),
|
|
134
|
+
status: session.status || 'active',
|
|
135
|
+
errorCount: session.errorCount || 0,
|
|
136
|
+
};
|
|
137
|
+
this.sessions.set(sessionEntry.id, sessionEntry);
|
|
138
|
+
// Enforce max sessions limit
|
|
139
|
+
if (this.sessions.size > this.config.maxSessions) {
|
|
140
|
+
const sorted = Array.from(this.sessions.values()).sort((a, b) => this.parseTimestamp(a.startedAt).getTime() -
|
|
141
|
+
this.parseTimestamp(b.startedAt).getTime());
|
|
142
|
+
const toRemove = sorted.slice(0, this.sessions.size - this.config.maxSessions);
|
|
143
|
+
for (const s of toRemove) {
|
|
144
|
+
this.sessions.delete(s.id);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Update an existing session
|
|
150
|
+
* @param sessionId - Session ID
|
|
151
|
+
* @param updates - Partial session data
|
|
152
|
+
*/
|
|
153
|
+
async updateSession(sessionId, updates) {
|
|
154
|
+
this.ensureReady();
|
|
155
|
+
const session = this.sessions.get(sessionId);
|
|
156
|
+
if (!session) {
|
|
157
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
158
|
+
}
|
|
159
|
+
this.sessions.set(sessionId, {
|
|
160
|
+
...session,
|
|
161
|
+
...updates,
|
|
162
|
+
id: session.id, // Don't allow ID change
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get a session by ID
|
|
167
|
+
* @param sessionId - Session ID
|
|
168
|
+
* @returns Session or null
|
|
169
|
+
*/
|
|
170
|
+
async getSession(sessionId) {
|
|
171
|
+
this.ensureReady();
|
|
172
|
+
const session = this.sessions.get(sessionId);
|
|
173
|
+
return session ? this.clone(session) : null;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get sessions matching filter
|
|
177
|
+
* @param filter - Query filter
|
|
178
|
+
* @returns Matching sessions
|
|
179
|
+
*/
|
|
180
|
+
async getSessions(filter) {
|
|
181
|
+
this.ensureReady();
|
|
182
|
+
const sessions = Array.from(this.sessions.values());
|
|
183
|
+
if (!filter) {
|
|
184
|
+
return sessions
|
|
185
|
+
.sort((a, b) => this.parseTimestamp(b.startedAt).getTime() -
|
|
186
|
+
this.parseTimestamp(a.startedAt).getTime())
|
|
187
|
+
.map((s) => this.clone(s));
|
|
188
|
+
}
|
|
189
|
+
return this.filterSessions(sessions, filter).map((s) => this.clone(s));
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Delete a session and its associated logs
|
|
193
|
+
* @param sessionId - Session ID
|
|
194
|
+
*/
|
|
195
|
+
async deleteSession(sessionId) {
|
|
196
|
+
this.ensureReady();
|
|
197
|
+
this.sessions.delete(sessionId);
|
|
198
|
+
this.logs = this.logs.filter((log) => log.sessionId !== sessionId);
|
|
199
|
+
}
|
|
200
|
+
// =========================================================================
|
|
201
|
+
// Maintenance Operations
|
|
202
|
+
// =========================================================================
|
|
203
|
+
/**
|
|
204
|
+
* Clean up old data
|
|
205
|
+
* @param olderThan - Delete entries older than this date
|
|
206
|
+
* @returns Number of deleted entries
|
|
207
|
+
*/
|
|
208
|
+
async cleanup(olderThan) {
|
|
209
|
+
this.ensureReady();
|
|
210
|
+
const cutoff = olderThan.getTime();
|
|
211
|
+
let deleted = 0;
|
|
212
|
+
// Clean logs
|
|
213
|
+
const logsBefore = this.logs.length;
|
|
214
|
+
this.logs = this.logs.filter((log) => this.parseTimestamp(log.timestamp).getTime() > cutoff);
|
|
215
|
+
deleted += logsBefore - this.logs.length;
|
|
216
|
+
// Clean ended sessions
|
|
217
|
+
for (const [id, session] of this.sessions) {
|
|
218
|
+
if (session.status !== 'active' &&
|
|
219
|
+
session.endedAt &&
|
|
220
|
+
this.parseTimestamp(session.endedAt).getTime() <= cutoff) {
|
|
221
|
+
this.sessions.delete(id);
|
|
222
|
+
deleted++;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return deleted;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Get storage statistics
|
|
229
|
+
* @returns Storage stats
|
|
230
|
+
*/
|
|
231
|
+
async getStats() {
|
|
232
|
+
this.ensureReady();
|
|
233
|
+
const logsByLevel = {
|
|
234
|
+
fatal: 0,
|
|
235
|
+
error: 0,
|
|
236
|
+
warn: 0,
|
|
237
|
+
info: 0,
|
|
238
|
+
debug: 0,
|
|
239
|
+
trace: 0,
|
|
240
|
+
};
|
|
241
|
+
let oldest;
|
|
242
|
+
let newest;
|
|
243
|
+
for (const log of this.logs) {
|
|
244
|
+
logsByLevel[log.level]++;
|
|
245
|
+
if (!oldest || log.timestamp < oldest) {
|
|
246
|
+
oldest = log.timestamp;
|
|
247
|
+
}
|
|
248
|
+
if (!newest || log.timestamp > newest) {
|
|
249
|
+
newest = log.timestamp;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
const activeSessions = Array.from(this.sessions.values()).filter((s) => s.status === 'active').length;
|
|
253
|
+
return {
|
|
254
|
+
totalLogs: this.logs.length,
|
|
255
|
+
totalSessions: this.sessions.size,
|
|
256
|
+
activeSessions,
|
|
257
|
+
logsByLevel,
|
|
258
|
+
oldestLog: oldest,
|
|
259
|
+
newestLog: newest,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// =========================================================================
|
|
263
|
+
// Additional Memory Store Methods
|
|
264
|
+
// =========================================================================
|
|
265
|
+
/**
|
|
266
|
+
* Clear all data from the store
|
|
267
|
+
*/
|
|
268
|
+
async clear() {
|
|
269
|
+
this.ensureReady();
|
|
270
|
+
this.logs = [];
|
|
271
|
+
this.sessions.clear();
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Get raw storage arrays (for debugging)
|
|
275
|
+
* @returns Internal storage references
|
|
276
|
+
*/
|
|
277
|
+
getRawData() {
|
|
278
|
+
return {
|
|
279
|
+
logs: this.logs,
|
|
280
|
+
sessions: this.sessions,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/stores/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Store Provider
|
|
3
|
+
*
|
|
4
|
+
* Persistent storage using better-sqlite3 - the most reliable SQLite library for Node.js.
|
|
5
|
+
*
|
|
6
|
+
* @module stores/sqlite
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import Database, { type Database as DatabaseType } from 'better-sqlite3';
|
|
10
|
+
import { BaseStoreProvider } from './base.js';
|
|
11
|
+
import type { StoreProviderConfig, LogEntry, Session, LogFilter, SessionFilter, StoreStats } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Configuration options for SQLite store
|
|
14
|
+
*/
|
|
15
|
+
export interface SQLiteStoreConfig extends StoreProviderConfig {
|
|
16
|
+
/**
|
|
17
|
+
* Path to SQLite database file
|
|
18
|
+
* @default ':memory:' for in-memory database
|
|
19
|
+
*/
|
|
20
|
+
filename?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Enable WAL mode for better concurrent read performance
|
|
23
|
+
* @default true
|
|
24
|
+
*/
|
|
25
|
+
walMode?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Cache size in KB (negative for number of pages)
|
|
28
|
+
* @default -2000 (2000 pages)
|
|
29
|
+
*/
|
|
30
|
+
cacheSize?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Enable foreign keys
|
|
33
|
+
* @default true
|
|
34
|
+
*/
|
|
35
|
+
foreignKeys?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Create indexes for common queries
|
|
38
|
+
* @default true
|
|
39
|
+
*/
|
|
40
|
+
createIndexes?: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* SQLite store provider using better-sqlite3
|
|
44
|
+
*
|
|
45
|
+
* @remarks
|
|
46
|
+
* Uses synchronous better-sqlite3 for maximum performance and reliability.
|
|
47
|
+
* Supports both file-based and in-memory databases.
|
|
48
|
+
*
|
|
49
|
+
* Features:
|
|
50
|
+
* - WAL mode for concurrent reads
|
|
51
|
+
* - Automatic schema creation and migration
|
|
52
|
+
* - Full-text search on message field
|
|
53
|
+
* - Efficient indexes for common query patterns
|
|
54
|
+
* - Transaction support for bulk operations
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* import { SQLiteStoreProvider } from '@nodelogger/core/sqlite';
|
|
59
|
+
*
|
|
60
|
+
* // File-based persistent storage
|
|
61
|
+
* const store = new SQLiteStoreProvider({
|
|
62
|
+
* filename: './logs.db',
|
|
63
|
+
* walMode: true
|
|
64
|
+
* });
|
|
65
|
+
* await store.init();
|
|
66
|
+
*
|
|
67
|
+
* // In-memory (fast, non-persistent)
|
|
68
|
+
* const memStore = new SQLiteStoreProvider();
|
|
69
|
+
* await memStore.init();
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export declare class SQLiteStoreProvider extends BaseStoreProvider {
|
|
73
|
+
readonly name = "sqlite";
|
|
74
|
+
private db;
|
|
75
|
+
private sqliteConfig;
|
|
76
|
+
constructor(config?: SQLiteStoreConfig);
|
|
77
|
+
/**
|
|
78
|
+
* Initialize the SQLite database
|
|
79
|
+
*/
|
|
80
|
+
init(): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Close the database connection
|
|
83
|
+
*/
|
|
84
|
+
close(): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Create database schema
|
|
87
|
+
*/
|
|
88
|
+
private createSchema;
|
|
89
|
+
/**
|
|
90
|
+
* Save a log entry
|
|
91
|
+
* @param entry - Log entry to save
|
|
92
|
+
*/
|
|
93
|
+
saveLog(entry: LogEntry): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Save multiple log entries in a transaction
|
|
96
|
+
* @param entries - Log entries to save
|
|
97
|
+
*/
|
|
98
|
+
saveLogs(entries: LogEntry[]): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Get log entries matching filter
|
|
101
|
+
* @param filter - Query filter
|
|
102
|
+
* @returns Matching log entries
|
|
103
|
+
*/
|
|
104
|
+
getLogs(filter?: LogFilter): Promise<LogEntry[]>;
|
|
105
|
+
/**
|
|
106
|
+
* Delete log entries matching filter
|
|
107
|
+
* @param filter - Query filter
|
|
108
|
+
* @returns Number of deleted entries
|
|
109
|
+
*/
|
|
110
|
+
deleteLogs(filter?: LogFilter): Promise<number>;
|
|
111
|
+
/**
|
|
112
|
+
* Count log entries matching filter
|
|
113
|
+
* @param filter - Query filter
|
|
114
|
+
* @returns Count of matching entries
|
|
115
|
+
*/
|
|
116
|
+
countLogs(filter?: LogFilter): Promise<number>;
|
|
117
|
+
/**
|
|
118
|
+
* Enforce maximum log limit by deleting oldest entries
|
|
119
|
+
*/
|
|
120
|
+
private enforceLogLimit;
|
|
121
|
+
/**
|
|
122
|
+
* Create a new session
|
|
123
|
+
* @param session - Session to create
|
|
124
|
+
*/
|
|
125
|
+
createSession(session: Session): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Update an existing session
|
|
128
|
+
* @param sessionId - Session ID
|
|
129
|
+
* @param updates - Partial session data
|
|
130
|
+
*/
|
|
131
|
+
updateSession(sessionId: string, updates: Partial<Session>): Promise<void>;
|
|
132
|
+
/**
|
|
133
|
+
* Get a session by ID
|
|
134
|
+
* @param sessionId - Session ID
|
|
135
|
+
* @returns Session or null
|
|
136
|
+
*/
|
|
137
|
+
getSession(sessionId: string): Promise<Session | null>;
|
|
138
|
+
/**
|
|
139
|
+
* Get sessions matching filter
|
|
140
|
+
* @param filter - Query filter
|
|
141
|
+
* @returns Matching sessions
|
|
142
|
+
*/
|
|
143
|
+
getSessions(filter?: SessionFilter): Promise<Session[]>;
|
|
144
|
+
/**
|
|
145
|
+
* Delete a session and its logs
|
|
146
|
+
* @param sessionId - Session ID
|
|
147
|
+
*/
|
|
148
|
+
deleteSession(sessionId: string): Promise<void>;
|
|
149
|
+
/**
|
|
150
|
+
* Enforce maximum session limit
|
|
151
|
+
*/
|
|
152
|
+
private enforceSessionLimit;
|
|
153
|
+
/**
|
|
154
|
+
* Clean up old data
|
|
155
|
+
* @param olderThan - Delete entries older than this date
|
|
156
|
+
* @returns Number of deleted entries
|
|
157
|
+
*/
|
|
158
|
+
cleanup(olderThan: Date): Promise<number>;
|
|
159
|
+
/**
|
|
160
|
+
* Get storage statistics
|
|
161
|
+
* @returns Storage stats
|
|
162
|
+
*/
|
|
163
|
+
getStats(): Promise<StoreStats>;
|
|
164
|
+
/**
|
|
165
|
+
* Build WHERE clause from filter
|
|
166
|
+
*/
|
|
167
|
+
private buildWhereClause;
|
|
168
|
+
/**
|
|
169
|
+
* Build complete SELECT query from filter
|
|
170
|
+
*/
|
|
171
|
+
private buildLogQuery;
|
|
172
|
+
/**
|
|
173
|
+
* Convert SQLite row to LogEntry
|
|
174
|
+
*/
|
|
175
|
+
private rowToLogEntry;
|
|
176
|
+
/**
|
|
177
|
+
* Convert SQLite row to Session
|
|
178
|
+
*/
|
|
179
|
+
private rowToSession;
|
|
180
|
+
/**
|
|
181
|
+
* Execute raw SQL query
|
|
182
|
+
* @param sql - SQL query
|
|
183
|
+
* @param params - Query parameters
|
|
184
|
+
* @returns Query results
|
|
185
|
+
*/
|
|
186
|
+
query<T>(sql: string, ...params: unknown[]): T[];
|
|
187
|
+
/**
|
|
188
|
+
* Execute raw SQL statement
|
|
189
|
+
* @param sql - SQL statement
|
|
190
|
+
* @param params - Statement parameters
|
|
191
|
+
* @returns Run result
|
|
192
|
+
*/
|
|
193
|
+
execute(sql: string, ...params: unknown[]): Database.RunResult;
|
|
194
|
+
/**
|
|
195
|
+
* Run VACUUM to optimize database
|
|
196
|
+
*/
|
|
197
|
+
vacuum(): void;
|
|
198
|
+
/**
|
|
199
|
+
* Get the underlying better-sqlite3 database instance
|
|
200
|
+
* @returns Database instance or null
|
|
201
|
+
*/
|
|
202
|
+
getDatabase(): DatabaseType | null;
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/stores/sqlite.ts"],"names":[],"mappings":"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"}
|