read-email-mcp 1.0.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/dist/store.js ADDED
@@ -0,0 +1,597 @@
1
+ import Database from "better-sqlite3";
2
+ import path from "node:path";
3
+ import fs from "node:fs";
4
+ export class EmailStore {
5
+ databasePath;
6
+ db = null;
7
+ constructor(databasePath) {
8
+ this.databasePath = databasePath;
9
+ }
10
+ init() {
11
+ fs.mkdirSync(path.dirname(this.databasePath), { recursive: true });
12
+ this.db = new Database(this.databasePath);
13
+ this.connection.pragma("journal_mode = WAL");
14
+ this.connection.pragma("synchronous = NORMAL");
15
+ this.connection.pragma("busy_timeout = 5000");
16
+ this.connection.pragma("temp_store = MEMORY");
17
+ this.connection.pragma("foreign_keys = ON");
18
+ this.connection.exec(`
19
+ CREATE TABLE IF NOT EXISTS mailboxes (
20
+ path TEXT PRIMARY KEY,
21
+ delimiter TEXT NOT NULL,
22
+ uid_validity TEXT,
23
+ highest_uid INTEGER NOT NULL DEFAULT 0,
24
+ selectable INTEGER NOT NULL DEFAULT 1,
25
+ last_synced_at TEXT
26
+ );
27
+
28
+ CREATE TABLE IF NOT EXISTS messages (
29
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
30
+ mailbox TEXT NOT NULL,
31
+ uid INTEGER NOT NULL,
32
+ uid_validity TEXT NOT NULL,
33
+ message_id TEXT,
34
+ in_reply_to TEXT,
35
+ refs_json TEXT NOT NULL,
36
+ subject TEXT,
37
+ date TEXT NOT NULL,
38
+ internal_date TEXT,
39
+ from_json TEXT NOT NULL,
40
+ to_json TEXT NOT NULL,
41
+ cc_json TEXT NOT NULL,
42
+ bcc_json TEXT NOT NULL,
43
+ flags_json TEXT NOT NULL,
44
+ size INTEGER,
45
+ has_attachments INTEGER NOT NULL DEFAULT 0,
46
+ attachment_count INTEGER NOT NULL DEFAULT 0,
47
+ preview TEXT,
48
+ text TEXT,
49
+ html TEXT,
50
+ headers_json TEXT NOT NULL,
51
+ attachments_json TEXT NOT NULL,
52
+ raw_path TEXT NOT NULL,
53
+ parse_error TEXT,
54
+ updated_at TEXT NOT NULL,
55
+ UNIQUE(mailbox, uid)
56
+ );
57
+
58
+ CREATE INDEX IF NOT EXISTS idx_messages_date ON messages(date, id);
59
+ CREATE INDEX IF NOT EXISTS idx_messages_mailbox_uid ON messages(mailbox, uid);
60
+ CREATE INDEX IF NOT EXISTS idx_messages_message_id ON messages(message_id);
61
+ CREATE INDEX IF NOT EXISTS idx_messages_in_reply_to ON messages(in_reply_to);
62
+
63
+ CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(
64
+ subject,
65
+ addresses,
66
+ body,
67
+ preview
68
+ );
69
+
70
+ CREATE TABLE IF NOT EXISTS sync_runs (
71
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
72
+ ok INTEGER NOT NULL,
73
+ mailbox TEXT,
74
+ started_at TEXT NOT NULL,
75
+ finished_at TEXT NOT NULL,
76
+ message TEXT NOT NULL,
77
+ synced_messages INTEGER NOT NULL
78
+ );
79
+ `);
80
+ this.connection.pragma("optimize=0x10002");
81
+ }
82
+ close() {
83
+ if (this.db) {
84
+ this.optimize();
85
+ }
86
+ this.db?.close();
87
+ this.db = null;
88
+ }
89
+ upsertMailbox(mailbox) {
90
+ this.connection
91
+ .prepare(`
92
+ INSERT INTO mailboxes(path, delimiter, uid_validity, highest_uid, selectable, last_synced_at)
93
+ VALUES (@path, @delimiter, @uidValidity, @highestUid, @selectable, @lastSyncedAt)
94
+ ON CONFLICT(path) DO UPDATE SET
95
+ delimiter = excluded.delimiter,
96
+ uid_validity = excluded.uid_validity,
97
+ highest_uid = excluded.highest_uid,
98
+ selectable = excluded.selectable,
99
+ last_synced_at = excluded.last_synced_at
100
+ `)
101
+ .run({
102
+ path: mailbox.path,
103
+ delimiter: mailbox.delimiter,
104
+ uidValidity: mailbox.uidValidity,
105
+ highestUid: mailbox.highestUid,
106
+ selectable: mailbox.selectable ? 1 : 0,
107
+ lastSyncedAt: mailbox.lastSyncedAt ?? null
108
+ });
109
+ }
110
+ listMailboxes() {
111
+ const rows = this.connection
112
+ .prepare(`
113
+ SELECT
114
+ mailboxes.path,
115
+ mailboxes.delimiter,
116
+ mailboxes.uid_validity AS uidValidity,
117
+ mailboxes.highest_uid AS highestUid,
118
+ mailboxes.selectable,
119
+ mailboxes.last_synced_at AS lastSyncedAt,
120
+ COUNT(messages.id) AS messageCount
121
+ FROM mailboxes
122
+ LEFT JOIN messages ON messages.mailbox = mailboxes.path
123
+ GROUP BY mailboxes.path
124
+ ORDER BY mailboxes.path ASC
125
+ `)
126
+ .all();
127
+ return rows.map((row) => ({
128
+ path: String(row.path),
129
+ delimiter: String(row.delimiter),
130
+ uidValidity: nullableString(row.uidValidity),
131
+ highestUid: Number(row.highestUid),
132
+ selectable: Boolean(row.selectable),
133
+ lastSyncedAt: nullableString(row.lastSyncedAt),
134
+ messageCount: Number(row.messageCount)
135
+ }));
136
+ }
137
+ getMailbox(mailboxPath) {
138
+ const row = this.connection
139
+ .prepare(`
140
+ SELECT path, delimiter, uid_validity AS uidValidity, highest_uid AS highestUid,
141
+ selectable, last_synced_at AS lastSyncedAt
142
+ FROM mailboxes
143
+ WHERE path = ?
144
+ `)
145
+ .get(mailboxPath);
146
+ if (!row) {
147
+ return null;
148
+ }
149
+ return {
150
+ path: String(row.path),
151
+ delimiter: String(row.delimiter),
152
+ uidValidity: nullableString(row.uidValidity),
153
+ highestUid: Number(row.highestUid),
154
+ selectable: Boolean(row.selectable),
155
+ lastSyncedAt: nullableString(row.lastSyncedAt)
156
+ };
157
+ }
158
+ deleteMailboxMessages(mailboxPath) {
159
+ const rows = this.connection.prepare("SELECT id FROM messages WHERE mailbox = ?").all(mailboxPath);
160
+ const transaction = this.connection.transaction(() => {
161
+ for (const row of rows) {
162
+ this.connection.prepare("DELETE FROM messages_fts WHERE rowid = ?").run(row.id);
163
+ }
164
+ this.connection.prepare("DELETE FROM messages WHERE mailbox = ?").run(mailboxPath);
165
+ });
166
+ transaction();
167
+ }
168
+ upsertMessage(message) {
169
+ const transaction = this.connection.transaction((input) => {
170
+ const existing = this.connection
171
+ .prepare("SELECT id FROM messages WHERE mailbox = ? AND uid = ?")
172
+ .get(input.mailbox, input.uid);
173
+ const payload = this.messagePayload(input);
174
+ let id;
175
+ if (existing) {
176
+ this.connection
177
+ .prepare(`
178
+ UPDATE messages SET
179
+ uid_validity = @uidValidity,
180
+ message_id = @messageId,
181
+ in_reply_to = @inReplyTo,
182
+ refs_json = @refsJson,
183
+ subject = @subject,
184
+ date = @date,
185
+ internal_date = @internalDate,
186
+ from_json = @fromJson,
187
+ to_json = @toJson,
188
+ cc_json = @ccJson,
189
+ bcc_json = @bccJson,
190
+ flags_json = @flagsJson,
191
+ size = @size,
192
+ has_attachments = @hasAttachments,
193
+ attachment_count = @attachmentCount,
194
+ preview = @preview,
195
+ text = @text,
196
+ html = @html,
197
+ headers_json = @headersJson,
198
+ attachments_json = @attachmentsJson,
199
+ raw_path = @rawPath,
200
+ parse_error = @parseError,
201
+ updated_at = @updatedAt
202
+ WHERE id = @id
203
+ `)
204
+ .run({ ...payload, id: existing.id });
205
+ id = existing.id;
206
+ }
207
+ else {
208
+ const result = this.connection
209
+ .prepare(`
210
+ INSERT INTO messages(
211
+ mailbox, uid, uid_validity, message_id, in_reply_to, refs_json, subject, date,
212
+ internal_date, from_json, to_json, cc_json, bcc_json, flags_json, size,
213
+ has_attachments, attachment_count, preview, text, html, headers_json,
214
+ attachments_json, raw_path, parse_error, updated_at
215
+ )
216
+ VALUES (
217
+ @mailbox, @uid, @uidValidity, @messageId, @inReplyTo, @refsJson, @subject, @date,
218
+ @internalDate, @fromJson, @toJson, @ccJson, @bccJson, @flagsJson, @size,
219
+ @hasAttachments, @attachmentCount, @preview, @text, @html, @headersJson,
220
+ @attachmentsJson, @rawPath, @parseError, @updatedAt
221
+ )
222
+ `)
223
+ .run(payload);
224
+ id = Number(result.lastInsertRowid);
225
+ }
226
+ this.refreshFts(id, input);
227
+ return id;
228
+ });
229
+ return transaction(message);
230
+ }
231
+ searchMessages(filters = {}) {
232
+ return this.queryMessages(filters, true);
233
+ }
234
+ listMessages(filters = {}) {
235
+ return this.queryMessages(filters, false);
236
+ }
237
+ getMessageById(id) {
238
+ const row = this.connection.prepare("SELECT * FROM messages WHERE id = ?").get(id);
239
+ return row ? rowToMessage(row) : null;
240
+ }
241
+ getMessageByMailboxUid(mailbox, uid) {
242
+ const row = this.connection
243
+ .prepare("SELECT * FROM messages WHERE mailbox = ? AND uid = ?")
244
+ .get(mailbox, uid);
245
+ return row ? rowToMessage(row) : null;
246
+ }
247
+ getMessageByMessageId(messageId) {
248
+ const row = this.connection
249
+ .prepare("SELECT * FROM messages WHERE message_id = ? ORDER BY date ASC, id ASC LIMIT 1")
250
+ .get(messageId);
251
+ return row ? rowToMessage(row) : null;
252
+ }
253
+ getThread(messageIdOrInternalId) {
254
+ const root = typeof messageIdOrInternalId === "number"
255
+ ? this.getMessageById(messageIdOrInternalId)
256
+ : this.getMessageByMessageId(messageIdOrInternalId);
257
+ if (!root) {
258
+ return [];
259
+ }
260
+ const identifiers = new Set([root.messageId, root.inReplyTo, ...root.references].filter((value) => Boolean(value)));
261
+ if (identifiers.size === 0) {
262
+ return [root];
263
+ }
264
+ const all = this.connection.prepare("SELECT * FROM messages ORDER BY date ASC, id ASC").all().map(rowToMessage);
265
+ return all.filter((message) => {
266
+ const messageIdentifiers = [message.messageId, message.inReplyTo, ...message.references].filter((value) => Boolean(value));
267
+ return messageIdentifiers.some((value) => identifiers.has(value));
268
+ });
269
+ }
270
+ getDateBuckets(options) {
271
+ const params = {};
272
+ const where = this.filterClauses(options, params);
273
+ const rows = this.connection
274
+ .prepare(`SELECT m.date FROM messages m ${where.length ? `WHERE ${where.join(" AND ")}` : ""} ORDER BY m.date ASC`)
275
+ .all(params);
276
+ const counts = new Map();
277
+ for (const row of rows) {
278
+ const bucket = bucketDate(row.date, options.granularity);
279
+ counts.set(bucket, (counts.get(bucket) ?? 0) + 1);
280
+ }
281
+ return [...counts.entries()].map(([bucket, count]) => ({ bucket, count }));
282
+ }
283
+ recordSyncResult(result) {
284
+ this.connection
285
+ .prepare(`
286
+ INSERT INTO sync_runs(ok, mailbox, started_at, finished_at, message, synced_messages)
287
+ VALUES (@ok, @mailbox, @startedAt, @finishedAt, @message, @syncedMessages)
288
+ `)
289
+ .run({
290
+ ok: result.ok ? 1 : 0,
291
+ mailbox: result.mailbox,
292
+ startedAt: result.startedAt,
293
+ finishedAt: result.finishedAt,
294
+ message: result.message,
295
+ syncedMessages: result.syncedMessages
296
+ });
297
+ }
298
+ getSyncStatus() {
299
+ const total = this.connection.prepare("SELECT COUNT(*) AS count FROM messages").get();
300
+ const latest = this.connection.prepare("SELECT MAX(date) AS latest FROM messages").get();
301
+ const last = this.connection
302
+ .prepare(`
303
+ SELECT ok, mailbox, started_at AS startedAt, finished_at AS finishedAt, message, synced_messages AS syncedMessages
304
+ FROM sync_runs
305
+ ORDER BY id DESC
306
+ LIMIT 1
307
+ `)
308
+ .get();
309
+ return {
310
+ totalMessages: Number(total.count),
311
+ latestMessageDate: latest.latest,
312
+ mailboxes: this.listMailboxes(),
313
+ lastSync: last
314
+ ? {
315
+ ok: Boolean(last.ok),
316
+ mailbox: nullableString(last.mailbox),
317
+ startedAt: String(last.startedAt),
318
+ finishedAt: String(last.finishedAt),
319
+ message: String(last.message),
320
+ syncedMessages: Number(last.syncedMessages)
321
+ }
322
+ : null
323
+ };
324
+ }
325
+ getStorageStats() {
326
+ const pageCount = Number(this.connection.pragma("page_count", { simple: true }));
327
+ const pageSize = Number(this.connection.pragma("page_size", { simple: true }));
328
+ return {
329
+ databasePath: this.databasePath,
330
+ databaseSizeBytes: fileSize(this.databasePath),
331
+ walSizeBytes: fileSize(`${this.databasePath}-wal`),
332
+ shmSizeBytes: fileSize(`${this.databasePath}-shm`),
333
+ pageCount,
334
+ pageSize
335
+ };
336
+ }
337
+ optimize() {
338
+ this.connection.pragma("optimize");
339
+ this.connection.prepare("INSERT INTO messages_fts(messages_fts) VALUES('optimize')").run();
340
+ return { ok: true };
341
+ }
342
+ queryMessages(filters, allowFullText) {
343
+ const limit = normalizeLimit(filters.limit);
344
+ const sort = filters.sort ?? "date_desc";
345
+ const cursor = decodeCursor(filters.cursor);
346
+ const params = { limit: limit + 1 };
347
+ const where = this.filterClauses(filters, params);
348
+ if (cursor && cursor.sort === sort) {
349
+ params.cursorDate = cursor.date;
350
+ params.cursorId = cursor.id;
351
+ where.push(sort === "date_asc"
352
+ ? "(m.date > @cursorDate OR (m.date = @cursorDate AND m.id > @cursorId))"
353
+ : "(m.date < @cursorDate OR (m.date = @cursorDate AND m.id < @cursorId))");
354
+ }
355
+ if (allowFullText && filters.query?.trim()) {
356
+ params.ftsQuery = toFtsQuery(filters.query);
357
+ where.push("m.id IN (SELECT rowid FROM messages_fts WHERE messages_fts MATCH @ftsQuery)");
358
+ }
359
+ const direction = sort === "date_asc" ? "ASC" : "DESC";
360
+ const rows = this.connection
361
+ .prepare(`
362
+ SELECT m.* FROM messages m
363
+ ${where.length ? `WHERE ${where.join(" AND ")}` : ""}
364
+ ORDER BY m.date ${direction}, m.id ${direction}
365
+ LIMIT @limit
366
+ `)
367
+ .all(params);
368
+ const hasMore = rows.length > limit;
369
+ const pageRows = hasMore ? rows.slice(0, limit) : rows;
370
+ return {
371
+ items: pageRows.map((row) => messageToSummary(rowToMessage(row))),
372
+ nextCursor: hasMore ? encodeCursor(rowToMessage(pageRows[pageRows.length - 1]), sort) : undefined
373
+ };
374
+ }
375
+ filterClauses(filters, params) {
376
+ const prefix = "m.";
377
+ const clauses = [];
378
+ if (filters.mailbox) {
379
+ params.mailbox = filters.mailbox;
380
+ clauses.push(`${prefix}mailbox = @mailbox`);
381
+ }
382
+ if (filters.from) {
383
+ params.from = `%${filters.from.toLowerCase()}%`;
384
+ clauses.push(`LOWER(${prefix}from_json) LIKE @from`);
385
+ }
386
+ if (filters.to) {
387
+ params.to = `%${filters.to.toLowerCase()}%`;
388
+ clauses.push(`LOWER(${prefix}to_json) LIKE @to`);
389
+ }
390
+ if (filters.cc) {
391
+ params.cc = `%${filters.cc.toLowerCase()}%`;
392
+ clauses.push(`LOWER(${prefix}cc_json) LIKE @cc`);
393
+ }
394
+ if (filters.subject) {
395
+ params.subject = `%${filters.subject.toLowerCase()}%`;
396
+ clauses.push(`LOWER(${prefix}subject) LIKE @subject`);
397
+ }
398
+ if (filters.startDate) {
399
+ params.startDate = filters.startDate;
400
+ clauses.push(`${prefix}date >= @startDate`);
401
+ }
402
+ if (filters.endDate) {
403
+ params.endDate = filters.endDate;
404
+ clauses.push(`${prefix}date <= @endDate`);
405
+ }
406
+ if (filters.hasAttachments !== undefined) {
407
+ params.hasAttachments = filters.hasAttachments ? 1 : 0;
408
+ clauses.push(`${prefix}has_attachments = @hasAttachments`);
409
+ }
410
+ if (filters.isUnread !== undefined) {
411
+ params.seenFlag = "\\Seen";
412
+ const seenTest = `EXISTS (SELECT 1 FROM json_each(${prefix}flags_json) WHERE value = @seenFlag)`;
413
+ clauses.push(filters.isUnread ? `NOT ${seenTest}` : seenTest);
414
+ }
415
+ if (filters.isFlagged !== undefined) {
416
+ params.flaggedFlag = "\\Flagged";
417
+ const flaggedTest = `EXISTS (SELECT 1 FROM json_each(${prefix}flags_json) WHERE value = @flaggedFlag)`;
418
+ clauses.push(filters.isFlagged ? flaggedTest : `NOT ${flaggedTest}`);
419
+ }
420
+ return clauses;
421
+ }
422
+ messagePayload(message) {
423
+ return {
424
+ mailbox: message.mailbox,
425
+ uid: message.uid,
426
+ uidValidity: message.uidValidity,
427
+ messageId: message.messageId,
428
+ inReplyTo: message.inReplyTo,
429
+ refsJson: JSON.stringify(message.references),
430
+ subject: message.subject,
431
+ date: message.date,
432
+ internalDate: message.internalDate,
433
+ fromJson: JSON.stringify(message.from),
434
+ toJson: JSON.stringify(message.to),
435
+ ccJson: JSON.stringify(message.cc),
436
+ bccJson: JSON.stringify(message.bcc),
437
+ flagsJson: JSON.stringify(message.flags),
438
+ size: message.size,
439
+ hasAttachments: message.hasAttachments ? 1 : 0,
440
+ attachmentCount: message.attachmentCount,
441
+ preview: message.preview,
442
+ text: message.text,
443
+ html: message.html,
444
+ headersJson: JSON.stringify(message.headers),
445
+ attachmentsJson: JSON.stringify(message.attachments),
446
+ rawPath: message.rawPath,
447
+ parseError: message.parseError,
448
+ updatedAt: new Date().toISOString()
449
+ };
450
+ }
451
+ refreshFts(id, message) {
452
+ const addresses = [
453
+ ...formatAddresses(message.from),
454
+ ...formatAddresses(message.to),
455
+ ...formatAddresses(message.cc),
456
+ ...formatAddresses(message.bcc)
457
+ ].join(" ");
458
+ this.connection.prepare("DELETE FROM messages_fts WHERE rowid = ?").run(id);
459
+ this.connection
460
+ .prepare(`
461
+ INSERT INTO messages_fts(rowid, subject, addresses, body, preview)
462
+ VALUES (?, ?, ?, ?, ?)
463
+ `)
464
+ .run(id, message.subject ?? "", addresses, message.text ?? "", message.preview ?? "");
465
+ }
466
+ get connection() {
467
+ if (!this.db) {
468
+ throw new Error("EmailStore has not been initialized");
469
+ }
470
+ return this.db;
471
+ }
472
+ }
473
+ function rowToMessage(row) {
474
+ return {
475
+ id: Number(row.id),
476
+ mailbox: String(row.mailbox),
477
+ uid: Number(row.uid),
478
+ uidValidity: String(row.uid_validity),
479
+ messageId: nullableString(row.message_id),
480
+ inReplyTo: nullableString(row.in_reply_to),
481
+ references: parseJson(row.refs_json, []),
482
+ subject: nullableString(row.subject),
483
+ date: String(row.date),
484
+ internalDate: nullableString(row.internal_date),
485
+ from: parseJson(row.from_json, []),
486
+ to: parseJson(row.to_json, []),
487
+ cc: parseJson(row.cc_json, []),
488
+ bcc: parseJson(row.bcc_json, []),
489
+ flags: parseJson(row.flags_json, []),
490
+ size: row.size === null || row.size === undefined ? null : Number(row.size),
491
+ hasAttachments: Boolean(row.has_attachments),
492
+ attachmentCount: Number(row.attachment_count),
493
+ preview: nullableString(row.preview),
494
+ text: nullableString(row.text),
495
+ html: nullableString(row.html),
496
+ headers: parseJson(row.headers_json, {}),
497
+ attachments: parseJson(row.attachments_json, []),
498
+ rawPath: String(row.raw_path),
499
+ parseError: nullableString(row.parse_error)
500
+ };
501
+ }
502
+ function messageToSummary(message) {
503
+ return {
504
+ id: message.id,
505
+ mailbox: message.mailbox,
506
+ uid: message.uid,
507
+ messageId: message.messageId,
508
+ date: message.date,
509
+ from: message.from,
510
+ to: message.to,
511
+ cc: message.cc,
512
+ subject: message.subject,
513
+ preview: message.preview,
514
+ flags: message.flags,
515
+ hasAttachments: message.hasAttachments,
516
+ attachmentCount: message.attachmentCount
517
+ };
518
+ }
519
+ function parseJson(value, fallback) {
520
+ if (typeof value !== "string") {
521
+ return fallback;
522
+ }
523
+ try {
524
+ return JSON.parse(value);
525
+ }
526
+ catch {
527
+ return fallback;
528
+ }
529
+ }
530
+ function nullableString(value) {
531
+ return value === null || value === undefined ? null : String(value);
532
+ }
533
+ function formatAddresses(addresses) {
534
+ return addresses.map((address) => `${address.name ?? ""} ${address.address}`.trim());
535
+ }
536
+ function normalizeLimit(limit) {
537
+ if (!Number.isFinite(limit)) {
538
+ return 25;
539
+ }
540
+ return Math.min(Math.max(Math.trunc(limit ?? 25), 1), 100);
541
+ }
542
+ function encodeCursor(message, sort) {
543
+ return Buffer.from(JSON.stringify({ date: message.date, id: message.id, sort }), "utf8").toString("base64url");
544
+ }
545
+ function decodeCursor(cursor) {
546
+ if (!cursor) {
547
+ return null;
548
+ }
549
+ try {
550
+ const decoded = JSON.parse(Buffer.from(cursor, "base64url").toString("utf8"));
551
+ if (typeof decoded.date === "string" &&
552
+ typeof decoded.id === "number" &&
553
+ (decoded.sort === "date_asc" || decoded.sort === "date_desc")) {
554
+ return { date: decoded.date, id: decoded.id, sort: decoded.sort };
555
+ }
556
+ return null;
557
+ }
558
+ catch {
559
+ return null;
560
+ }
561
+ }
562
+ function fileSize(filePath) {
563
+ try {
564
+ return fs.statSync(filePath).size;
565
+ }
566
+ catch {
567
+ return 0;
568
+ }
569
+ }
570
+ function toFtsQuery(query) {
571
+ const terms = query
572
+ .trim()
573
+ .split(/\s+/)
574
+ .map((term) => term.replace(/"/g, '""'))
575
+ .filter(Boolean);
576
+ return terms.map((term) => `"${term}"`).join(" AND ");
577
+ }
578
+ function bucketDate(value, granularity) {
579
+ const date = new Date(value);
580
+ if (granularity === "day") {
581
+ return date.toISOString().slice(0, 10);
582
+ }
583
+ if (granularity === "month") {
584
+ return date.toISOString().slice(0, 7);
585
+ }
586
+ const { year, week } = isoWeek(date);
587
+ return `${year}-W${String(week).padStart(2, "0")}`;
588
+ }
589
+ function isoWeek(input) {
590
+ const date = new Date(Date.UTC(input.getUTCFullYear(), input.getUTCMonth(), input.getUTCDate()));
591
+ const day = date.getUTCDay() || 7;
592
+ date.setUTCDate(date.getUTCDate() + 4 - day);
593
+ const yearStart = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));
594
+ const week = Math.ceil(((date.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
595
+ return { year: date.getUTCFullYear(), week };
596
+ }
597
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}