@critical-path/core 0.1.2 → 0.2.1

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 (50) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +43 -26
  3. package/dist/engine/index.d.ts +19 -1
  4. package/dist/engine/index.d.ts.map +1 -1
  5. package/dist/engine/index.js +129 -6
  6. package/dist/engine/index.js.map +1 -1
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.test.js +96 -1
  12. package/dist/index.test.js.map +1 -1
  13. package/dist/store/firebase.d.ts +113 -0
  14. package/dist/store/firebase.d.ts.map +1 -0
  15. package/dist/store/firebase.js +319 -0
  16. package/dist/store/firebase.js.map +1 -0
  17. package/dist/store/firebase.test.d.ts +2 -0
  18. package/dist/store/firebase.test.d.ts.map +1 -0
  19. package/dist/store/firebase.test.js +45 -0
  20. package/dist/store/firebase.test.js.map +1 -0
  21. package/dist/store/index.d.ts +36 -8
  22. package/dist/store/index.d.ts.map +1 -1
  23. package/dist/store/index.js +78 -12
  24. package/dist/store/index.js.map +1 -1
  25. package/dist/store/sqlite.d.ts +61 -0
  26. package/dist/store/sqlite.d.ts.map +1 -0
  27. package/dist/store/sqlite.js +492 -0
  28. package/dist/store/sqlite.js.map +1 -0
  29. package/dist/store/sqlite.test.d.ts +2 -0
  30. package/dist/store/sqlite.test.d.ts.map +1 -0
  31. package/dist/store/sqlite.test.js +63 -0
  32. package/dist/store/sqlite.test.js.map +1 -0
  33. package/dist/types/index.d.ts +68 -8
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/utils/status.d.ts +14 -0
  36. package/dist/utils/status.d.ts.map +1 -0
  37. package/dist/utils/status.js +58 -0
  38. package/dist/utils/status.js.map +1 -0
  39. package/package.json +9 -1
  40. package/src/engine/index.ts +161 -8
  41. package/src/index.test.ts +113 -1
  42. package/src/index.ts +1 -0
  43. package/src/store/firebase.test.ts +59 -0
  44. package/src/store/firebase.ts +381 -0
  45. package/src/store/index.ts +113 -19
  46. package/src/store/sqlite.test.ts +78 -0
  47. package/src/store/sqlite.ts +729 -0
  48. package/src/types/index.ts +74 -9
  49. package/src/utils/status.ts +85 -0
  50. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,492 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ export class SQLiteStore {
3
+ db;
4
+ constructor(config = {}) {
5
+ if (config.db) {
6
+ this.db = config.db;
7
+ }
8
+ else {
9
+ this.db = new DatabaseSync(config.filename || ':memory:');
10
+ }
11
+ this.initTables();
12
+ }
13
+ initTables() {
14
+ this.db.exec(`
15
+ CREATE TABLE IF NOT EXISTS projects (
16
+ id TEXT PRIMARY KEY,
17
+ key TEXT NOT NULL,
18
+ name TEXT NOT NULL,
19
+ description TEXT,
20
+ ownerId TEXT,
21
+ members TEXT,
22
+ teamIds TEXT,
23
+ statusDefinitions TEXT,
24
+ priorityDefinitions TEXT,
25
+ customFieldDefinitions TEXT,
26
+ createdAt TEXT NOT NULL,
27
+ updatedAt TEXT NOT NULL
28
+ );
29
+
30
+ CREATE TABLE IF NOT EXISTS teams (
31
+ id TEXT PRIMARY KEY,
32
+ name TEXT NOT NULL,
33
+ description TEXT,
34
+ leaderId TEXT,
35
+ memberIds TEXT NOT NULL,
36
+ createdAt TEXT NOT NULL,
37
+ updatedAt TEXT NOT NULL
38
+ );
39
+
40
+ CREATE TABLE IF NOT EXISTS containers (
41
+ id TEXT PRIMARY KEY,
42
+ projectId TEXT NOT NULL,
43
+ name TEXT NOT NULL,
44
+ description TEXT,
45
+ parentId TEXT,
46
+ type TEXT,
47
+ color TEXT,
48
+ createdAt TEXT NOT NULL,
49
+ updatedAt TEXT NOT NULL
50
+ );
51
+
52
+ CREATE TABLE IF NOT EXISTS tasks (
53
+ id TEXT PRIMARY KEY,
54
+ projectId TEXT NOT NULL,
55
+ title TEXT NOT NULL,
56
+ description TEXT,
57
+ status TEXT NOT NULL,
58
+ priority TEXT NOT NULL,
59
+ assigneeId TEXT,
60
+ reporterId TEXT,
61
+ reviewerId TEXT,
62
+ iterationId TEXT,
63
+ teamId TEXT,
64
+ containerId TEXT,
65
+ plannedStartDate TEXT,
66
+ actualStartDate TEXT,
67
+ actualEndDate TEXT,
68
+ dueDate TEXT,
69
+ estimatedHours REAL,
70
+ loggedHours REAL,
71
+ actualHours REAL,
72
+ billableHours REAL,
73
+ estimatedDurationMinutes REAL,
74
+ actualDurationMinutes REAL,
75
+ billableDurationMinutes REAL,
76
+ progress REAL,
77
+ tags TEXT,
78
+ customFields TEXT,
79
+ parentId TEXT,
80
+ createdAt TEXT NOT NULL,
81
+ updatedAt TEXT NOT NULL
82
+ );
83
+
84
+ CREATE TABLE IF NOT EXISTS iterations (
85
+ id TEXT PRIMARY KEY,
86
+ projectId TEXT NOT NULL,
87
+ name TEXT NOT NULL,
88
+ goal TEXT,
89
+ type TEXT,
90
+ startDate TEXT,
91
+ endDate TEXT,
92
+ status TEXT NOT NULL,
93
+ createdAt TEXT NOT NULL
94
+ );
95
+
96
+ CREATE TABLE IF NOT EXISTS comments (
97
+ id TEXT PRIMARY KEY,
98
+ taskId TEXT NOT NULL,
99
+ authorId TEXT NOT NULL,
100
+ content TEXT NOT NULL,
101
+ createdAt TEXT NOT NULL,
102
+ updatedAt TEXT NOT NULL
103
+ );
104
+
105
+ CREATE TABLE IF NOT EXISTS activities (
106
+ id TEXT PRIMARY KEY,
107
+ projectId TEXT,
108
+ taskId TEXT,
109
+ actorId TEXT NOT NULL,
110
+ action TEXT NOT NULL,
111
+ details TEXT,
112
+ createdAt TEXT NOT NULL
113
+ );
114
+
115
+ CREATE TABLE IF NOT EXISTS time_entries (
116
+ id TEXT PRIMARY KEY,
117
+ taskId TEXT NOT NULL,
118
+ userId TEXT NOT NULL,
119
+ hours REAL NOT NULL,
120
+ isBillable INTEGER,
121
+ description TEXT,
122
+ loggedAt TEXT NOT NULL
123
+ );
124
+
125
+ CREATE TABLE IF NOT EXISTS dependencies (
126
+ id TEXT PRIMARY KEY,
127
+ taskId TEXT NOT NULL,
128
+ dependsOnTaskId TEXT NOT NULL,
129
+ type TEXT NOT NULL
130
+ );
131
+
132
+ CREATE TABLE IF NOT EXISTS webhooks (
133
+ id TEXT PRIMARY KEY,
134
+ url TEXT NOT NULL,
135
+ events TEXT NOT NULL,
136
+ secret TEXT,
137
+ active INTEGER NOT NULL,
138
+ createdAt TEXT NOT NULL
139
+ );
140
+ `);
141
+ }
142
+ // --- Projects ---
143
+ async getProjects() {
144
+ const stmt = this.db.prepare('SELECT * FROM projects');
145
+ const rows = stmt.all();
146
+ return rows.map((r) => this.mapProject(r));
147
+ }
148
+ async getProject(id) {
149
+ const stmt = this.db.prepare('SELECT * FROM projects WHERE id = ?');
150
+ const row = stmt.get(id);
151
+ return row ? this.mapProject(row) : null;
152
+ }
153
+ async createProject(project) {
154
+ const id = `proj_${Math.random().toString(36).substring(2, 9)}`;
155
+ const now = new Date().toISOString();
156
+ const newProj = { ...project, id, createdAt: now, updatedAt: now };
157
+ const stmt = this.db.prepare(`
158
+ INSERT INTO projects (id, key, name, description, ownerId, members, teamIds, statusDefinitions, priorityDefinitions, customFieldDefinitions, createdAt, updatedAt)
159
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
160
+ `);
161
+ stmt.run(newProj.id, newProj.key, newProj.name, newProj.description || null, newProj.ownerId || null, JSON.stringify(newProj.members || []), JSON.stringify(newProj.teamIds || []), JSON.stringify(newProj.statusDefinitions || []), JSON.stringify(newProj.priorityDefinitions || []), JSON.stringify(newProj.customFieldDefinitions || []), newProj.createdAt, newProj.updatedAt);
162
+ return newProj;
163
+ }
164
+ async updateProject(id, updates) {
165
+ const existing = await this.getProject(id);
166
+ if (!existing)
167
+ return null;
168
+ const updated = {
169
+ ...existing,
170
+ ...updates,
171
+ updatedAt: new Date().toISOString()
172
+ };
173
+ const stmt = this.db.prepare(`
174
+ UPDATE projects
175
+ SET key = ?, name = ?, description = ?, ownerId = ?, members = ?, teamIds = ?, statusDefinitions = ?, priorityDefinitions = ?, customFieldDefinitions = ?, updatedAt = ?
176
+ WHERE id = ?
177
+ `);
178
+ stmt.run(updated.key, updated.name, updated.description || null, updated.ownerId || null, JSON.stringify(updated.members || []), JSON.stringify(updated.teamIds || []), JSON.stringify(updated.statusDefinitions || []), JSON.stringify(updated.priorityDefinitions || []), JSON.stringify(updated.customFieldDefinitions || []), updated.updatedAt, id);
179
+ return updated;
180
+ }
181
+ async deleteProject(id) {
182
+ const stmt = this.db.prepare('DELETE FROM projects WHERE id = ?');
183
+ const result = stmt.run(id);
184
+ return (result.changes ?? 0) > 0;
185
+ }
186
+ // --- Teams ---
187
+ async getTeams() {
188
+ const stmt = this.db.prepare('SELECT * FROM teams');
189
+ const rows = stmt.all();
190
+ return rows.map((r) => this.mapTeam(r));
191
+ }
192
+ async getTeam(id) {
193
+ const stmt = this.db.prepare('SELECT * FROM teams WHERE id = ?');
194
+ const row = stmt.get(id);
195
+ return row ? this.mapTeam(row) : null;
196
+ }
197
+ async createTeam(team) {
198
+ const id = `team_${Math.random().toString(36).substring(2, 9)}`;
199
+ const now = new Date().toISOString();
200
+ const newTeam = { ...team, id, createdAt: now, updatedAt: now };
201
+ const stmt = this.db.prepare(`
202
+ INSERT INTO teams (id, name, description, leaderId, memberIds, createdAt, updatedAt)
203
+ VALUES (?, ?, ?, ?, ?, ?, ?)
204
+ `);
205
+ stmt.run(newTeam.id, newTeam.name, newTeam.description || null, newTeam.leaderId || null, JSON.stringify(newTeam.memberIds || []), newTeam.createdAt, newTeam.updatedAt);
206
+ return newTeam;
207
+ }
208
+ async updateTeam(id, updates) {
209
+ const existing = await this.getTeam(id);
210
+ if (!existing)
211
+ return null;
212
+ const updated = { ...existing, ...updates, updatedAt: new Date().toISOString() };
213
+ const stmt = this.db.prepare(`
214
+ UPDATE teams SET name = ?, description = ?, leaderId = ?, memberIds = ?, updatedAt = ?
215
+ WHERE id = ?
216
+ `);
217
+ stmt.run(updated.name, updated.description || null, updated.leaderId || null, JSON.stringify(updated.memberIds || []), updated.updatedAt, id);
218
+ return updated;
219
+ }
220
+ async deleteTeam(id) {
221
+ const stmt = this.db.prepare('DELETE FROM teams WHERE id = ?');
222
+ const result = stmt.run(id);
223
+ return (result.changes ?? 0) > 0;
224
+ }
225
+ // --- Task Containers ---
226
+ async getContainers(projectId) {
227
+ const stmt = this.db.prepare('SELECT * FROM containers WHERE projectId = ?');
228
+ const rows = stmt.all(projectId);
229
+ return rows;
230
+ }
231
+ async getContainer(id) {
232
+ const stmt = this.db.prepare('SELECT * FROM containers WHERE id = ?');
233
+ const row = stmt.get(id);
234
+ return row || null;
235
+ }
236
+ async createContainer(container) {
237
+ const id = `cnt_${Math.random().toString(36).substring(2, 9)}`;
238
+ const now = new Date().toISOString();
239
+ const newContainer = { ...container, id, createdAt: now, updatedAt: now };
240
+ const stmt = this.db.prepare(`
241
+ INSERT INTO containers (id, projectId, name, description, parentId, type, color, createdAt, updatedAt)
242
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
243
+ `);
244
+ stmt.run(newContainer.id, newContainer.projectId, newContainer.name, newContainer.description || null, newContainer.parentId || null, newContainer.type || null, newContainer.color || null, newContainer.createdAt, newContainer.updatedAt);
245
+ return newContainer;
246
+ }
247
+ async updateContainer(id, updates) {
248
+ const existing = await this.getContainer(id);
249
+ if (!existing)
250
+ return null;
251
+ const updated = { ...existing, ...updates, updatedAt: new Date().toISOString() };
252
+ const stmt = this.db.prepare(`
253
+ UPDATE containers SET name = ?, description = ?, parentId = ?, type = ?, color = ?, updatedAt = ?
254
+ WHERE id = ?
255
+ `);
256
+ stmt.run(updated.name, updated.description || null, updated.parentId || null, updated.type || null, updated.color || null, updated.updatedAt, id);
257
+ return updated;
258
+ }
259
+ async deleteContainer(id) {
260
+ const stmt = this.db.prepare('DELETE FROM containers WHERE id = ?');
261
+ const result = stmt.run(id);
262
+ return (result.changes ?? 0) > 0;
263
+ }
264
+ // --- Tasks ---
265
+ async getTasks(projectId) {
266
+ let rows;
267
+ if (projectId) {
268
+ const stmt = this.db.prepare('SELECT * FROM tasks WHERE projectId = ?');
269
+ rows = stmt.all(projectId);
270
+ }
271
+ else {
272
+ const stmt = this.db.prepare('SELECT * FROM tasks');
273
+ rows = stmt.all();
274
+ }
275
+ return rows.map((r) => this.mapTask(r));
276
+ }
277
+ async getTask(id) {
278
+ const stmt = this.db.prepare('SELECT * FROM tasks WHERE id = ?');
279
+ const row = stmt.get(id);
280
+ return row ? this.mapTask(row) : null;
281
+ }
282
+ async createTask(task) {
283
+ const id = `task_${Math.random().toString(36).substring(2, 9)}`;
284
+ const now = new Date().toISOString();
285
+ const newTask = { ...task, id, createdAt: now, updatedAt: now };
286
+ const stmt = this.db.prepare(`
287
+ INSERT INTO tasks (
288
+ id, projectId, title, description, status, priority, assigneeId, reporterId,
289
+ reviewerId, iterationId, teamId, containerId, plannedStartDate, actualStartDate, actualEndDate,
290
+ dueDate, estimatedHours, loggedHours, actualHours, billableHours,
291
+ estimatedDurationMinutes, actualDurationMinutes, billableDurationMinutes, progress,
292
+ tags, customFields, parentId, createdAt, updatedAt
293
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
294
+ `);
295
+ stmt.run(newTask.id, newTask.projectId, newTask.title, newTask.description || null, newTask.status, newTask.priority, newTask.assigneeId || null, newTask.reporterId || null, newTask.reviewerId || null, newTask.iterationId || null, newTask.teamId || null, newTask.containerId || null, newTask.plannedStartDate || null, newTask.actualStartDate || null, newTask.actualEndDate || null, newTask.dueDate || null, newTask.estimatedHours ?? null, newTask.loggedHours ?? null, newTask.actualHours ?? null, newTask.billableHours ?? null, newTask.estimatedDurationMinutes ?? null, newTask.actualDurationMinutes ?? null, newTask.billableDurationMinutes ?? null, newTask.progress ?? null, JSON.stringify(newTask.tags || []), JSON.stringify(newTask.customFields || {}), newTask.parentId || null, newTask.createdAt, newTask.updatedAt);
296
+ return newTask;
297
+ }
298
+ async updateTask(id, updates) {
299
+ const existing = await this.getTask(id);
300
+ if (!existing)
301
+ return null;
302
+ const updated = {
303
+ ...existing,
304
+ ...updates,
305
+ updatedAt: new Date().toISOString()
306
+ };
307
+ const stmt = this.db.prepare(`
308
+ UPDATE tasks SET
309
+ projectId = ?, title = ?, description = ?, status = ?, priority = ?,
310
+ assigneeId = ?, reporterId = ?, reviewerId = ?, iterationId = ?, teamId = ?, containerId = ?,
311
+ plannedStartDate = ?, actualStartDate = ?, actualEndDate = ?, dueDate = ?,
312
+ estimatedHours = ?, loggedHours = ?, actualHours = ?, billableHours = ?,
313
+ estimatedDurationMinutes = ?, actualDurationMinutes = ?, billableDurationMinutes = ?, progress = ?,
314
+ tags = ?, customFields = ?, parentId = ?, updatedAt = ?
315
+ WHERE id = ?
316
+ `);
317
+ stmt.run(updated.projectId, updated.title, updated.description || null, updated.status, updated.priority, updated.assigneeId || null, updated.reporterId || null, updated.reviewerId || null, updated.iterationId || null, updated.teamId || null, updated.containerId || null, updated.plannedStartDate || null, updated.actualStartDate || null, updated.actualEndDate || null, updated.dueDate || null, updated.estimatedHours ?? null, updated.loggedHours ?? null, updated.actualHours ?? null, updated.billableHours ?? null, updated.estimatedDurationMinutes ?? null, updated.actualDurationMinutes ?? null, updated.billableDurationMinutes ?? null, updated.progress ?? null, JSON.stringify(updated.tags || []), JSON.stringify(updated.customFields || {}), updated.parentId || null, updated.updatedAt, id);
318
+ return updated;
319
+ }
320
+ async deleteTask(id) {
321
+ const stmt = this.db.prepare('DELETE FROM tasks WHERE id = ?');
322
+ const result = stmt.run(id);
323
+ return (result.changes ?? 0) > 0;
324
+ }
325
+ // --- Iterations ---
326
+ async getIterations(projectId) {
327
+ const stmt = this.db.prepare('SELECT * FROM iterations WHERE projectId = ?');
328
+ const rows = stmt.all(projectId);
329
+ return rows;
330
+ }
331
+ async getIteration(id) {
332
+ const stmt = this.db.prepare('SELECT * FROM iterations WHERE id = ?');
333
+ const row = stmt.get(id);
334
+ return row || null;
335
+ }
336
+ async createIteration(iteration) {
337
+ const id = `iter_${Math.random().toString(36).substring(2, 9)}`;
338
+ const now = new Date().toISOString();
339
+ const newIteration = { ...iteration, id, createdAt: now };
340
+ const stmt = this.db.prepare(`
341
+ INSERT INTO iterations (id, projectId, name, goal, type, startDate, endDate, status, createdAt)
342
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
343
+ `);
344
+ stmt.run(newIteration.id, newIteration.projectId, newIteration.name, newIteration.goal || null, newIteration.type || null, newIteration.startDate || null, newIteration.endDate || null, newIteration.status, newIteration.createdAt);
345
+ return newIteration;
346
+ }
347
+ async updateIteration(id, updates) {
348
+ const existing = await this.getIteration(id);
349
+ if (!existing)
350
+ return null;
351
+ const updated = { ...existing, ...updates };
352
+ const updateStmt = this.db.prepare(`
353
+ UPDATE iterations SET name = ?, goal = ?, type = ?, startDate = ?, endDate = ?, status = ?
354
+ WHERE id = ?
355
+ `);
356
+ updateStmt.run(updated.name, updated.goal || null, updated.type || null, updated.startDate || null, updated.endDate || null, updated.status, id);
357
+ return updated;
358
+ }
359
+ async deleteIteration(id) {
360
+ const stmt = this.db.prepare('DELETE FROM iterations WHERE id = ?');
361
+ const result = stmt.run(id);
362
+ return (result.changes ?? 0) > 0;
363
+ }
364
+ // --- Comments & Activity ---
365
+ async getComments(taskId) {
366
+ const stmt = this.db.prepare('SELECT * FROM comments WHERE taskId = ?');
367
+ return stmt.all(taskId);
368
+ }
369
+ async addComment(comment) {
370
+ const id = `cmt_${Math.random().toString(36).substring(2, 9)}`;
371
+ const now = new Date().toISOString();
372
+ const newComment = { ...comment, id, createdAt: now, updatedAt: now };
373
+ const stmt = this.db.prepare(`
374
+ INSERT INTO comments (id, taskId, authorId, content, createdAt, updatedAt)
375
+ VALUES (?, ?, ?, ?, ?, ?)
376
+ `);
377
+ stmt.run(newComment.id, newComment.taskId, newComment.authorId, newComment.content, newComment.createdAt, newComment.updatedAt);
378
+ return newComment;
379
+ }
380
+ async getActivities(filter) {
381
+ let sql = 'SELECT * FROM activities';
382
+ const params = [];
383
+ const conditions = [];
384
+ if (filter?.projectId) {
385
+ conditions.push('projectId = ?');
386
+ params.push(filter.projectId);
387
+ }
388
+ if (filter?.taskId) {
389
+ conditions.push('taskId = ?');
390
+ params.push(filter.taskId);
391
+ }
392
+ if (conditions.length > 0) {
393
+ sql += ' WHERE ' + conditions.join(' AND ');
394
+ }
395
+ sql += ' ORDER BY createdAt DESC';
396
+ const stmt = this.db.prepare(sql);
397
+ const rows = stmt.all(...params);
398
+ return rows.map((r) => ({
399
+ ...r,
400
+ details: r.details ? JSON.parse(r.details) : undefined
401
+ }));
402
+ }
403
+ async logActivity(activity) {
404
+ const id = `act_${Math.random().toString(36).substring(2, 9)}`;
405
+ const now = new Date().toISOString();
406
+ const newAct = { ...activity, id, createdAt: now };
407
+ const stmt = this.db.prepare(`
408
+ INSERT INTO activities (id, projectId, taskId, actorId, action, details, createdAt)
409
+ VALUES (?, ?, ?, ?, ?, ?, ?)
410
+ `);
411
+ stmt.run(newAct.id, newAct.projectId || null, newAct.taskId || null, newAct.actorId, newAct.action, newAct.details ? JSON.stringify(newAct.details) : null, newAct.createdAt);
412
+ return newAct;
413
+ }
414
+ // --- Time Tracking ---
415
+ async getTimeEntries(taskId) {
416
+ const stmt = this.db.prepare('SELECT * FROM time_entries WHERE taskId = ?');
417
+ const rows = stmt.all(taskId);
418
+ return rows.map((r) => ({ ...r, isBillable: r.isBillable !== null ? Boolean(r.isBillable) : undefined }));
419
+ }
420
+ async logTime(entry) {
421
+ const id = `time_${Math.random().toString(36).substring(2, 9)}`;
422
+ const now = new Date().toISOString();
423
+ const newEntry = { ...entry, id, loggedAt: now };
424
+ const stmt = this.db.prepare(`
425
+ INSERT INTO time_entries (id, taskId, userId, hours, isBillable, description, loggedAt)
426
+ VALUES (?, ?, ?, ?, ?, ?, ?)
427
+ `);
428
+ stmt.run(newEntry.id, newEntry.taskId, newEntry.userId, newEntry.hours, newEntry.isBillable !== undefined ? (newEntry.isBillable ? 1 : 0) : null, newEntry.description || null, newEntry.loggedAt);
429
+ return newEntry;
430
+ }
431
+ // --- Dependencies ---
432
+ async getDependencies(taskId) {
433
+ const stmt = this.db.prepare('SELECT * FROM dependencies WHERE taskId = ? OR dependsOnTaskId = ?');
434
+ return stmt.all(taskId, taskId);
435
+ }
436
+ async addDependency(dep) {
437
+ const id = `dep_${Math.random().toString(36).substring(2, 9)}`;
438
+ const newDep = { ...dep, id };
439
+ const stmt = this.db.prepare(`
440
+ INSERT INTO dependencies (id, taskId, dependsOnTaskId, type)
441
+ VALUES (?, ?, ?, ?)
442
+ `);
443
+ stmt.run(newDep.id, newDep.taskId, newDep.dependsOnTaskId, newDep.type);
444
+ return newDep;
445
+ }
446
+ // --- Webhooks ---
447
+ async getWebhooks() {
448
+ const stmt = this.db.prepare('SELECT * FROM webhooks');
449
+ const rows = stmt.all();
450
+ return rows.map((r) => ({
451
+ ...r,
452
+ events: JSON.parse(r.events),
453
+ active: Boolean(r.active)
454
+ }));
455
+ }
456
+ async addWebhook(webhook) {
457
+ const id = `wh_${Math.random().toString(36).substring(2, 9)}`;
458
+ const now = new Date().toISOString();
459
+ const newWh = { ...webhook, id, createdAt: now };
460
+ const stmt = this.db.prepare(`
461
+ INSERT INTO webhooks (id, url, events, secret, active, createdAt)
462
+ VALUES (?, ?, ?, ?, ?, ?)
463
+ `);
464
+ stmt.run(newWh.id, newWh.url, JSON.stringify(newWh.events), newWh.secret || null, newWh.active ? 1 : 0, newWh.createdAt);
465
+ return newWh;
466
+ }
467
+ // Helper mappers
468
+ mapProject(row) {
469
+ return {
470
+ ...row,
471
+ members: row.members ? JSON.parse(row.members) : [],
472
+ teamIds: row.teamIds ? JSON.parse(row.teamIds) : [],
473
+ statusDefinitions: row.statusDefinitions ? JSON.parse(row.statusDefinitions) : [],
474
+ priorityDefinitions: row.priorityDefinitions ? JSON.parse(row.priorityDefinitions) : [],
475
+ customFieldDefinitions: row.customFieldDefinitions ? JSON.parse(row.customFieldDefinitions) : []
476
+ };
477
+ }
478
+ mapTeam(row) {
479
+ return {
480
+ ...row,
481
+ memberIds: row.memberIds ? JSON.parse(row.memberIds) : []
482
+ };
483
+ }
484
+ mapTask(row) {
485
+ return {
486
+ ...row,
487
+ tags: row.tags ? JSON.parse(row.tags) : [],
488
+ customFields: row.customFields ? JSON.parse(row.customFields) : {}
489
+ };
490
+ }
491
+ }
492
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/store/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sqlite.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.test.d.ts","sourceRoot":"","sources":["../../src/store/sqlite.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { SQLiteStore } from './sqlite.js';
3
+ describe('SQLiteStore', () => {
4
+ let store;
5
+ beforeEach(() => {
6
+ store = new SQLiteStore({ filename: ':memory:' });
7
+ });
8
+ it('should create and retrieve projects', async () => {
9
+ const project = await store.createProject({
10
+ key: 'SQLITE',
11
+ name: 'SQLite Test Project',
12
+ description: 'Testing SQLite adapter'
13
+ });
14
+ expect(project.id).toMatch(/^proj_/);
15
+ expect(project.name).toBe('SQLite Test Project');
16
+ const fetched = await store.getProject(project.id);
17
+ expect(fetched).not.toBeNull();
18
+ expect(fetched?.key).toBe('SQLITE');
19
+ const all = await store.getProjects();
20
+ expect(all).toHaveLength(1);
21
+ });
22
+ it('should create, update, filter, and delete tasks', async () => {
23
+ const project = await store.createProject({ key: 'P1', name: 'Proj 1' });
24
+ const task = await store.createTask({
25
+ projectId: project.id,
26
+ title: 'SQLite Task 1',
27
+ status: 'todo',
28
+ priority: 'high',
29
+ tags: ['sqlite', 'db']
30
+ });
31
+ expect(task.id).toMatch(/^task_/);
32
+ expect(task.priority).toBe('high');
33
+ expect(task.tags).toContain('sqlite');
34
+ const updated = await store.updateTask(task.id, { status: 'in_progress' });
35
+ expect(updated?.status).toBe('in_progress');
36
+ const projectTasks = await store.getTasks(project.id);
37
+ expect(projectTasks).toHaveLength(1);
38
+ const deleted = await store.deleteTask(task.id);
39
+ expect(deleted).toBe(true);
40
+ const remaining = await store.getTasks(project.id);
41
+ expect(remaining).toHaveLength(0);
42
+ });
43
+ it('should handle comments, activities, and time tracking', async () => {
44
+ const comment = await store.addComment({
45
+ taskId: 'task_1',
46
+ authorId: 'user_1',
47
+ content: 'Great work!'
48
+ });
49
+ expect(comment.id).toMatch(/^cmt_/);
50
+ const comments = await store.getComments('task_1');
51
+ expect(comments).toHaveLength(1);
52
+ const timeEntry = await store.logTime({
53
+ taskId: 'task_1',
54
+ userId: 'user_1',
55
+ hours: 2.5,
56
+ description: 'Code review'
57
+ });
58
+ expect(timeEntry.hours).toBe(2.5);
59
+ const entries = await store.getTimeEntries('task_1');
60
+ expect(entries).toHaveLength(1);
61
+ });
62
+ });
63
+ //# sourceMappingURL=sqlite.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.test.js","sourceRoot":"","sources":["../../src/store/sqlite.test.ts"],"names":[],"mappings":"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"}