agkan 2.14.3 → 2.15.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/README.ja.md +13 -13
- package/README.md +13 -13
- package/dist/board/boardFavicon.d.ts +2 -0
- package/dist/board/boardFavicon.d.ts.map +1 -0
- package/dist/board/boardFavicon.js +5 -0
- package/dist/board/boardFavicon.js.map +1 -0
- package/dist/board/boardRenderer.d.ts +22 -6
- package/dist/board/boardRenderer.d.ts.map +1 -1
- package/dist/board/boardRenderer.js +40 -24
- package/dist/board/boardRenderer.js.map +1 -1
- package/dist/board/boardRoutes.d.ts +2 -2
- package/dist/board/boardRoutes.d.ts.map +1 -1
- package/dist/board/boardRoutes.js +18 -3
- package/dist/board/boardRoutes.js.map +1 -1
- package/dist/board/boardStyles.d.ts +1 -1
- package/dist/board/boardStyles.d.ts.map +1 -1
- package/dist/board/boardStyles.js +14 -6
- package/dist/board/boardStyles.js.map +1 -1
- package/dist/board/client/board.js +369 -13
- package/dist/board/server.d.ts +2 -2
- package/dist/board/server.d.ts.map +1 -1
- package/dist/board/server.js +5 -5
- package/dist/board/server.js.map +1 -1
- package/dist/cli/commands/agent-guide.d.ts.map +1 -1
- package/dist/cli/commands/agent-guide.js +6 -0
- package/dist/cli/commands/agent-guide.js.map +1 -1
- package/dist/cli/commands/board.d.ts.map +1 -1
- package/dist/cli/commands/board.js +202 -15
- package/dist/cli/commands/board.js.map +1 -1
- package/dist/cli/commands/ps.d.ts +7 -0
- package/dist/cli/commands/ps.d.ts.map +1 -0
- package/dist/cli/commands/ps.js +83 -0
- package/dist/cli/commands/ps.js.map +1 -0
- package/dist/cli/commands/task/add.js +1 -1
- package/dist/cli/commands/task/add.js.map +1 -1
- package/dist/cli/commands/task/copy.d.ts +6 -0
- package/dist/cli/commands/task/copy.d.ts.map +1 -0
- package/dist/cli/commands/task/copy.js +118 -0
- package/dist/cli/commands/task/copy.js.map +1 -0
- package/dist/cli/commands/task/list.d.ts.map +1 -1
- package/dist/cli/commands/task/list.js +37 -17
- package/dist/cli/commands/task/list.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/board-daemon.d.ts +7 -0
- package/dist/cli/utils/board-daemon.d.ts.map +1 -0
- package/dist/cli/utils/board-daemon.js +77 -0
- package/dist/cli/utils/board-daemon.js.map +1 -0
- package/dist/db/adapters/sqlite-storage-backend.d.ts +26 -0
- package/dist/db/adapters/sqlite-storage-backend.d.ts.map +1 -0
- package/dist/db/adapters/sqlite-storage-backend.js +447 -0
- package/dist/db/adapters/sqlite-storage-backend.js.map +1 -0
- package/dist/db/connection.d.ts +14 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +28 -2
- package/dist/db/connection.js.map +1 -1
- package/dist/db/migrations/20260328000000_initial_schema.d.ts +3 -0
- package/dist/db/migrations/20260328000000_initial_schema.d.ts.map +1 -0
- package/dist/db/migrations/20260328000000_initial_schema.js +218 -0
- package/dist/db/migrations/20260328000000_initial_schema.js.map +1 -0
- package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.d.ts +3 -0
- package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.d.ts.map +1 -0
- package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.js +7 -0
- package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.js.map +1 -0
- package/dist/db/migrations/index.d.ts +4 -0
- package/dist/db/migrations/index.d.ts.map +1 -0
- package/dist/db/migrations/index.js +18 -0
- package/dist/db/migrations/index.js.map +1 -0
- package/dist/db/migrations/types.d.ts +17 -0
- package/dist/db/migrations/types.d.ts.map +1 -0
- package/dist/{board/client → db/migrations}/types.js +0 -1
- package/dist/db/migrations/types.js.map +1 -0
- package/dist/db/reset.d.ts.map +1 -1
- package/dist/db/reset.js +8 -3
- package/dist/db/reset.js.map +1 -1
- package/dist/db/schema.d.ts +4 -4
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +22 -207
- package/dist/db/schema.js.map +1 -1
- package/dist/db/types/repository.d.ts +192 -0
- package/dist/db/types/repository.d.ts.map +1 -0
- package/dist/db/types/repository.js +15 -0
- package/dist/db/types/repository.js.map +1 -0
- package/dist/models/Attachment.d.ts +25 -0
- package/dist/models/Attachment.d.ts.map +1 -0
- package/dist/models/Attachment.js +7 -0
- package/dist/models/Attachment.js.map +1 -0
- package/dist/services/AttachmentService.d.ts +62 -0
- package/dist/services/AttachmentService.d.ts.map +1 -0
- package/dist/services/AttachmentService.js +95 -0
- package/dist/services/AttachmentService.js.map +1 -0
- package/dist/services/ClaudeProcessService.d.ts +100 -0
- package/dist/services/ClaudeProcessService.d.ts.map +1 -0
- package/dist/services/ClaudeProcessService.js +278 -0
- package/dist/services/ClaudeProcessService.js.map +1 -0
- package/dist/services/CommentService.d.ts +3 -3
- package/dist/services/CommentService.d.ts.map +1 -1
- package/dist/services/CommentService.js +10 -70
- package/dist/services/CommentService.js.map +1 -1
- package/dist/services/ExportImportService.d.ts +3 -3
- package/dist/services/ExportImportService.d.ts.map +1 -1
- package/dist/services/ExportImportService.js +12 -16
- package/dist/services/ExportImportService.js.map +1 -1
- package/dist/services/MetadataService.d.ts +3 -3
- package/dist/services/MetadataService.d.ts.map +1 -1
- package/dist/services/MetadataService.js +9 -69
- package/dist/services/MetadataService.js.map +1 -1
- package/dist/services/TagService.d.ts +3 -3
- package/dist/services/TagService.d.ts.map +1 -1
- package/dist/services/TagService.js +9 -35
- package/dist/services/TagService.js.map +1 -1
- package/dist/services/TaskBlockService.d.ts +3 -3
- package/dist/services/TaskBlockService.d.ts.map +1 -1
- package/dist/services/TaskBlockService.js +9 -36
- package/dist/services/TaskBlockService.js.map +1 -1
- package/dist/services/TaskService.d.ts +3 -23
- package/dist/services/TaskService.d.ts.map +1 -1
- package/dist/services/TaskService.js +34 -186
- package/dist/services/TaskService.js.map +1 -1
- package/dist/services/TaskTagService.d.ts +3 -3
- package/dist/services/TaskTagService.d.ts.map +1 -1
- package/dist/services/TaskTagService.js +19 -83
- package/dist/services/TaskTagService.js.map +1 -1
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +18 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +12 -5
- package/dist/board/boardScript.d.ts +0 -2
- package/dist/board/boardScript.d.ts.map +0 -1
- package/dist/board/boardScript.js +0 -1202
- package/dist/board/boardScript.js.map +0 -1
- package/dist/board/client/addTaskModal.d.ts +0 -2
- package/dist/board/client/addTaskModal.d.ts.map +0 -1
- package/dist/board/client/addTaskModal.js +0 -64
- package/dist/board/client/addTaskModal.js.map +0 -1
- package/dist/board/client/autoScroll.d.ts +0 -4
- package/dist/board/client/autoScroll.d.ts.map +0 -1
- package/dist/board/client/autoScroll.js +0 -59
- package/dist/board/client/autoScroll.js.map +0 -1
- package/dist/board/client/boardPolling.d.ts +0 -15
- package/dist/board/client/boardPolling.d.ts.map +0 -1
- package/dist/board/client/boardPolling.js +0 -144
- package/dist/board/client/boardPolling.js.map +0 -1
- package/dist/board/client/burgerMenu.d.ts +0 -2
- package/dist/board/client/burgerMenu.d.ts.map +0 -1
- package/dist/board/client/burgerMenu.js +0 -80
- package/dist/board/client/burgerMenu.js.map +0 -1
- package/dist/board/client/contextMenu.d.ts +0 -2
- package/dist/board/client/contextMenu.d.ts.map +0 -1
- package/dist/board/client/contextMenu.js +0 -52
- package/dist/board/client/contextMenu.js.map +0 -1
- package/dist/board/client/detailPanel.d.ts +0 -8
- package/dist/board/client/detailPanel.d.ts.map +0 -1
- package/dist/board/client/detailPanel.js +0 -565
- package/dist/board/client/detailPanel.js.map +0 -1
- package/dist/board/client/dragDrop.d.ts +0 -6
- package/dist/board/client/dragDrop.d.ts.map +0 -1
- package/dist/board/client/dragDrop.js +0 -82
- package/dist/board/client/dragDrop.js.map +0 -1
- package/dist/board/client/filters.d.ts +0 -6
- package/dist/board/client/filters.d.ts.map +0 -1
- package/dist/board/client/filters.js +0 -167
- package/dist/board/client/filters.js.map +0 -1
- package/dist/board/client/main.d.ts +0 -2
- package/dist/board/client/main.d.ts.map +0 -1
- package/dist/board/client/main.js +0 -20
- package/dist/board/client/main.js.map +0 -1
- package/dist/board/client/tags.d.ts +0 -6
- package/dist/board/client/tags.d.ts.map +0 -1
- package/dist/board/client/tags.js +0 -198
- package/dist/board/client/tags.js.map +0 -1
- package/dist/board/client/types.d.ts +0 -48
- package/dist/board/client/types.d.ts.map +0 -1
- package/dist/board/client/types.js.map +0 -1
- package/dist/board/client/utils.d.ts +0 -4
- package/dist/board/client/utils.d.ts.map +0 -1
- package/dist/board/client/utils.js +0 -44
- package/dist/board/client/utils.js.map +0 -1
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SQLite Storage Backend
|
|
4
|
+
*
|
|
5
|
+
* Implements the StorageBackend interface using better-sqlite3.
|
|
6
|
+
* All SQL logic is encapsulated here, keeping services SQL-independent.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SQLiteStorageBackend = void 0;
|
|
10
|
+
/** SQL CASE expression for priority ordering */
|
|
11
|
+
const PRIORITY_ORDER_EXPR = `CASE priority WHEN 'critical' THEN 4 WHEN 'high' THEN 3 WHEN 'medium' THEN 2 WHEN 'low' THEN 1 ELSE 0 END`;
|
|
12
|
+
class SQLiteTaskRepository {
|
|
13
|
+
db;
|
|
14
|
+
constructor(db) {
|
|
15
|
+
this.db = db;
|
|
16
|
+
}
|
|
17
|
+
findById(id) {
|
|
18
|
+
const row = this.db.prepare('SELECT * FROM tasks WHERE id = ?').get(id);
|
|
19
|
+
return row ?? null;
|
|
20
|
+
}
|
|
21
|
+
findAll(filter, sort) {
|
|
22
|
+
const { query, params } = this.buildFindAllQuery(filter, sort);
|
|
23
|
+
return this.db.prepare(query).all(...params);
|
|
24
|
+
}
|
|
25
|
+
buildFindAllQuery(filter, sort) {
|
|
26
|
+
const params = [];
|
|
27
|
+
const hasTagFilter = !!(filter?.tagIds && filter.tagIds.length > 0);
|
|
28
|
+
const tablePrefix = hasTagFilter ? 'tasks.' : '';
|
|
29
|
+
let query = this.buildBaseQuery(filter, params);
|
|
30
|
+
query += this.buildFilterClauses(filter, tablePrefix, params);
|
|
31
|
+
query += this.buildOrderClause(sort, tablePrefix);
|
|
32
|
+
return { query, params };
|
|
33
|
+
}
|
|
34
|
+
buildBaseQuery(filter, params) {
|
|
35
|
+
if (filter?.tagIds && filter.tagIds.length > 0) {
|
|
36
|
+
const placeholders = filter.tagIds.map(() => '?').join(', ');
|
|
37
|
+
params.push(...filter.tagIds);
|
|
38
|
+
return `SELECT DISTINCT tasks.* FROM tasks INNER JOIN task_tags ON tasks.id = task_tags.task_id WHERE task_tags.tag_id IN (${placeholders})`;
|
|
39
|
+
}
|
|
40
|
+
return 'SELECT * FROM tasks WHERE 1=1';
|
|
41
|
+
}
|
|
42
|
+
buildFilterClauses(filter, tablePrefix, params) {
|
|
43
|
+
let clause = '';
|
|
44
|
+
if (filter?.status) {
|
|
45
|
+
const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
|
|
46
|
+
if (statuses.length > 0) {
|
|
47
|
+
clause += ` AND ${tablePrefix}status IN (${statuses.map(() => '?').join(', ')})`;
|
|
48
|
+
params.push(...statuses);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (filter?.author) {
|
|
52
|
+
clause += ` AND ${tablePrefix}author = ?`;
|
|
53
|
+
params.push(filter.author);
|
|
54
|
+
}
|
|
55
|
+
if (filter?.assignees) {
|
|
56
|
+
clause += ` AND ${tablePrefix}assignees LIKE ?`;
|
|
57
|
+
params.push(`%${filter.assignees}%`);
|
|
58
|
+
}
|
|
59
|
+
if (filter?.priority) {
|
|
60
|
+
const priorities = Array.isArray(filter.priority) ? filter.priority : [filter.priority];
|
|
61
|
+
if (priorities.length > 0) {
|
|
62
|
+
clause += ` AND ${tablePrefix}priority IN (${priorities.map(() => '?').join(', ')})`;
|
|
63
|
+
params.push(...priorities);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (filter?.search) {
|
|
67
|
+
clause += ` AND (${tablePrefix}title LIKE ? OR ${tablePrefix}body LIKE ?)`;
|
|
68
|
+
const pattern = `%${filter.search}%`;
|
|
69
|
+
params.push(pattern, pattern);
|
|
70
|
+
}
|
|
71
|
+
return clause;
|
|
72
|
+
}
|
|
73
|
+
buildOrderClause(sort, tablePrefix) {
|
|
74
|
+
const sortField = sort?.field ?? 'created_at';
|
|
75
|
+
const sortOrder = sort?.order === 'asc' ? 'ASC' : 'DESC';
|
|
76
|
+
if (sortField === 'priority') {
|
|
77
|
+
return ` ORDER BY ${PRIORITY_ORDER_EXPR} ${sortOrder}, ${tablePrefix}id ${sortOrder}`;
|
|
78
|
+
}
|
|
79
|
+
return ` ORDER BY ${tablePrefix}${sortField} ${sortOrder}, ${tablePrefix}id ${sortOrder}`;
|
|
80
|
+
}
|
|
81
|
+
create(input) {
|
|
82
|
+
const result = this.db
|
|
83
|
+
.prepare(`INSERT INTO tasks (title, body, author, assignees, status, priority, parent_id, created_at, updated_at)
|
|
84
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
85
|
+
.run(input.title, input.body ?? null, input.author ?? null, input.assignees ?? null, input.status, input.priority !== undefined ? input.priority : null, input.parent_id !== undefined ? input.parent_id : null, input.created_at, input.updated_at);
|
|
86
|
+
return this.findById(result.lastInsertRowid);
|
|
87
|
+
}
|
|
88
|
+
update(id, input) {
|
|
89
|
+
const { updates, params } = this.buildUpdateClauses(input);
|
|
90
|
+
if (updates.length === 0) {
|
|
91
|
+
return this.findById(id);
|
|
92
|
+
}
|
|
93
|
+
params.push(id);
|
|
94
|
+
this.db.prepare(`UPDATE tasks SET ${updates.join(', ')} WHERE id = ?`).run(...params);
|
|
95
|
+
return this.findById(id);
|
|
96
|
+
}
|
|
97
|
+
buildUpdateClauses(input) {
|
|
98
|
+
const fields = [
|
|
99
|
+
['title', 'title', (v) => v],
|
|
100
|
+
['body', 'body', (v) => v],
|
|
101
|
+
['author', 'author', (v) => v],
|
|
102
|
+
['assignees', 'assignees', (v) => v || null],
|
|
103
|
+
['status', 'status', (v) => v],
|
|
104
|
+
['priority', 'priority', (v) => v],
|
|
105
|
+
['parent_id', 'parent_id', (v) => v],
|
|
106
|
+
['updated_at', 'updated_at', (v) => v],
|
|
107
|
+
];
|
|
108
|
+
const updates = [];
|
|
109
|
+
const params = [];
|
|
110
|
+
for (const [col, key, transform] of fields) {
|
|
111
|
+
if (input[key] !== undefined) {
|
|
112
|
+
updates.push(`${col} = ?`);
|
|
113
|
+
params.push(transform(input[key]));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return { updates, params };
|
|
117
|
+
}
|
|
118
|
+
delete(id) {
|
|
119
|
+
const result = this.db.prepare('DELETE FROM tasks WHERE id = ?').run(id);
|
|
120
|
+
return result.changes > 0;
|
|
121
|
+
}
|
|
122
|
+
findChildren(parentId) {
|
|
123
|
+
return this.db
|
|
124
|
+
.prepare('SELECT * FROM tasks WHERE parent_id = ? ORDER BY created_at ASC')
|
|
125
|
+
.all(parentId);
|
|
126
|
+
}
|
|
127
|
+
countByStatus() {
|
|
128
|
+
const results = this.db.prepare('SELECT status, COUNT(*) as count FROM tasks GROUP BY status').all();
|
|
129
|
+
const countMap = {
|
|
130
|
+
icebox: 0,
|
|
131
|
+
backlog: 0,
|
|
132
|
+
ready: 0,
|
|
133
|
+
in_progress: 0,
|
|
134
|
+
review: 0,
|
|
135
|
+
done: 0,
|
|
136
|
+
closed: 0,
|
|
137
|
+
};
|
|
138
|
+
for (const row of results) {
|
|
139
|
+
countMap[row.status] = row.count;
|
|
140
|
+
}
|
|
141
|
+
return countMap;
|
|
142
|
+
}
|
|
143
|
+
findForPurge(beforeDate, statuses) {
|
|
144
|
+
if (statuses.length === 0)
|
|
145
|
+
return [];
|
|
146
|
+
const placeholders = statuses.map(() => '?').join(', ');
|
|
147
|
+
const query = `SELECT * FROM tasks WHERE status IN (${placeholders}) AND updated_at < ? ORDER BY updated_at ASC`;
|
|
148
|
+
return this.db.prepare(query).all(...statuses, beforeDate);
|
|
149
|
+
}
|
|
150
|
+
deleteMany(ids) {
|
|
151
|
+
if (ids.length === 0)
|
|
152
|
+
return 0;
|
|
153
|
+
const placeholders = ids.map(() => '?').join(', ');
|
|
154
|
+
const result = this.db.prepare(`DELETE FROM tasks WHERE id IN (${placeholders})`).run(...ids);
|
|
155
|
+
return result.changes;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
class SQLiteTagRepository {
|
|
159
|
+
db;
|
|
160
|
+
constructor(db) {
|
|
161
|
+
this.db = db;
|
|
162
|
+
}
|
|
163
|
+
findById(id) {
|
|
164
|
+
const row = this.db.prepare('SELECT * FROM tags WHERE id = ?').get(id);
|
|
165
|
+
return row ?? null;
|
|
166
|
+
}
|
|
167
|
+
findByName(name) {
|
|
168
|
+
const row = this.db.prepare('SELECT * FROM tags WHERE name = ?').get(name);
|
|
169
|
+
return row ?? null;
|
|
170
|
+
}
|
|
171
|
+
findAll() {
|
|
172
|
+
return this.db.prepare('SELECT * FROM tags ORDER BY created_at DESC, id DESC').all();
|
|
173
|
+
}
|
|
174
|
+
create(input) {
|
|
175
|
+
const result = this.db
|
|
176
|
+
.prepare('INSERT INTO tags (name, created_at) VALUES (?, ?)')
|
|
177
|
+
.run(input.name, input.created_at);
|
|
178
|
+
return this.findById(result.lastInsertRowid);
|
|
179
|
+
}
|
|
180
|
+
update(id, input) {
|
|
181
|
+
this.db.prepare('UPDATE tags SET name = COALESCE(?, name) WHERE id = ?').run(input.name ?? null, id);
|
|
182
|
+
return this.findById(id);
|
|
183
|
+
}
|
|
184
|
+
delete(id) {
|
|
185
|
+
const result = this.db.prepare('DELETE FROM tags WHERE id = ?').run(id);
|
|
186
|
+
return result.changes > 0;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
class SQLiteTaskBlockRepository {
|
|
190
|
+
db;
|
|
191
|
+
constructor(db) {
|
|
192
|
+
this.db = db;
|
|
193
|
+
}
|
|
194
|
+
create(input) {
|
|
195
|
+
const result = this.db
|
|
196
|
+
.prepare('INSERT INTO task_blocks (blocker_task_id, blocked_task_id, created_at) VALUES (?, ?, ?)')
|
|
197
|
+
.run(input.blocker_task_id, input.blocked_task_id, input.created_at);
|
|
198
|
+
return this.db
|
|
199
|
+
.prepare('SELECT * FROM task_blocks WHERE id = ?')
|
|
200
|
+
.get(result.lastInsertRowid);
|
|
201
|
+
}
|
|
202
|
+
delete(blockerId, blockedId) {
|
|
203
|
+
const result = this.db
|
|
204
|
+
.prepare('DELETE FROM task_blocks WHERE blocker_task_id = ? AND blocked_task_id = ?')
|
|
205
|
+
.run(blockerId, blockedId);
|
|
206
|
+
return result.changes > 0;
|
|
207
|
+
}
|
|
208
|
+
findBlockedTaskIds(blockerId) {
|
|
209
|
+
const rows = this.db
|
|
210
|
+
.prepare('SELECT blocked_task_id FROM task_blocks WHERE blocker_task_id = ?')
|
|
211
|
+
.all(blockerId);
|
|
212
|
+
return rows.map((r) => r.blocked_task_id);
|
|
213
|
+
}
|
|
214
|
+
findBlockerTaskIds(blockedId) {
|
|
215
|
+
const rows = this.db
|
|
216
|
+
.prepare('SELECT blocker_task_id FROM task_blocks WHERE blocked_task_id = ?')
|
|
217
|
+
.all(blockedId);
|
|
218
|
+
return rows.map((r) => r.blocker_task_id);
|
|
219
|
+
}
|
|
220
|
+
findAll() {
|
|
221
|
+
return this.db.prepare('SELECT blocker_task_id, blocked_task_id FROM task_blocks').all();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
class SQLiteTaskTagRepository {
|
|
225
|
+
db;
|
|
226
|
+
constructor(db) {
|
|
227
|
+
this.db = db;
|
|
228
|
+
}
|
|
229
|
+
create(input) {
|
|
230
|
+
const result = this.db
|
|
231
|
+
.prepare('INSERT INTO task_tags (task_id, tag_id, created_at) VALUES (?, ?, ?)')
|
|
232
|
+
.run(input.task_id, input.tag_id, input.created_at);
|
|
233
|
+
return this.db
|
|
234
|
+
.prepare('SELECT * FROM task_tags WHERE id = ?')
|
|
235
|
+
.get(result.lastInsertRowid);
|
|
236
|
+
}
|
|
237
|
+
delete(taskId, tagId) {
|
|
238
|
+
const result = this.db.prepare('DELETE FROM task_tags WHERE task_id = ? AND tag_id = ?').run(taskId, tagId);
|
|
239
|
+
return result.changes > 0;
|
|
240
|
+
}
|
|
241
|
+
exists(taskId, tagId) {
|
|
242
|
+
const row = this.db
|
|
243
|
+
.prepare('SELECT COUNT(*) as count FROM task_tags WHERE task_id = ? AND tag_id = ?')
|
|
244
|
+
.get(taskId, tagId);
|
|
245
|
+
return row.count > 0;
|
|
246
|
+
}
|
|
247
|
+
findTagIdsByTaskId(taskId) {
|
|
248
|
+
const rows = this.db
|
|
249
|
+
.prepare('SELECT tag_id FROM task_tags WHERE task_id = ? ORDER BY created_at ASC')
|
|
250
|
+
.all(taskId);
|
|
251
|
+
return rows.map((r) => r.tag_id);
|
|
252
|
+
}
|
|
253
|
+
findTagsByTaskId(taskId) {
|
|
254
|
+
return this.db
|
|
255
|
+
.prepare(`SELECT t.* FROM tags t
|
|
256
|
+
INNER JOIN task_tags tt ON t.id = tt.tag_id
|
|
257
|
+
WHERE tt.task_id = ?
|
|
258
|
+
ORDER BY tt.created_at ASC`)
|
|
259
|
+
.all(taskId);
|
|
260
|
+
}
|
|
261
|
+
findTaskIdsByTagId(tagId) {
|
|
262
|
+
const rows = this.db
|
|
263
|
+
.prepare('SELECT task_id FROM task_tags WHERE tag_id = ? ORDER BY created_at ASC')
|
|
264
|
+
.all(tagId);
|
|
265
|
+
return rows.map((r) => r.task_id);
|
|
266
|
+
}
|
|
267
|
+
findTasksByTagId(tagId) {
|
|
268
|
+
return this.db
|
|
269
|
+
.prepare(`SELECT t.* FROM tasks t
|
|
270
|
+
INNER JOIN task_tags tt ON t.id = tt.task_id
|
|
271
|
+
WHERE tt.tag_id = ?
|
|
272
|
+
ORDER BY tt.created_at ASC`)
|
|
273
|
+
.all(tagId);
|
|
274
|
+
}
|
|
275
|
+
findAllGroupedByTaskId() {
|
|
276
|
+
const rows = this.db
|
|
277
|
+
.prepare(`SELECT tt.task_id, t.*
|
|
278
|
+
FROM tags t
|
|
279
|
+
INNER JOIN task_tags tt ON t.id = tt.tag_id
|
|
280
|
+
ORDER BY tt.task_id, tt.created_at ASC`)
|
|
281
|
+
.all();
|
|
282
|
+
const result = new Map();
|
|
283
|
+
for (const row of rows) {
|
|
284
|
+
const taskId = row.task_id;
|
|
285
|
+
const tag = { id: row.id, name: row.name, created_at: row.created_at };
|
|
286
|
+
if (!result.has(taskId))
|
|
287
|
+
result.set(taskId, []);
|
|
288
|
+
result.get(taskId).push(tag);
|
|
289
|
+
}
|
|
290
|
+
return result;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
class SQLiteMetadataRepository {
|
|
294
|
+
db;
|
|
295
|
+
constructor(db) {
|
|
296
|
+
this.db = db;
|
|
297
|
+
}
|
|
298
|
+
set(input) {
|
|
299
|
+
const existing = this.findByKey(input.task_id, input.key);
|
|
300
|
+
if (existing) {
|
|
301
|
+
return this.update(input.task_id, input.key, input.value, input.updated_at);
|
|
302
|
+
}
|
|
303
|
+
this.db
|
|
304
|
+
.prepare('INSERT INTO task_metadata (task_id, key, value, created_at, updated_at) VALUES (?, ?, ?, ?, ?)')
|
|
305
|
+
.run(input.task_id, input.key, input.value, input.created_at, input.updated_at);
|
|
306
|
+
return this.findByKey(input.task_id, input.key);
|
|
307
|
+
}
|
|
308
|
+
findByKey(taskId, key) {
|
|
309
|
+
const row = this.db.prepare('SELECT * FROM task_metadata WHERE task_id = ? AND key = ?').get(taskId, key);
|
|
310
|
+
return row ?? null;
|
|
311
|
+
}
|
|
312
|
+
findByTaskId(taskId) {
|
|
313
|
+
return this.db
|
|
314
|
+
.prepare('SELECT * FROM task_metadata WHERE task_id = ? ORDER BY created_at DESC, id DESC')
|
|
315
|
+
.all(taskId);
|
|
316
|
+
}
|
|
317
|
+
delete(taskId, key) {
|
|
318
|
+
const result = this.db.prepare('DELETE FROM task_metadata WHERE task_id = ? AND key = ?').run(taskId, key);
|
|
319
|
+
return result.changes > 0;
|
|
320
|
+
}
|
|
321
|
+
deleteAllForTask(taskId) {
|
|
322
|
+
const result = this.db.prepare('DELETE FROM task_metadata WHERE task_id = ?').run(taskId);
|
|
323
|
+
return result.changes;
|
|
324
|
+
}
|
|
325
|
+
findAllGroupedByTaskId() {
|
|
326
|
+
const rows = this.db
|
|
327
|
+
.prepare('SELECT * FROM task_metadata ORDER BY task_id, created_at DESC, id DESC')
|
|
328
|
+
.all();
|
|
329
|
+
const result = new Map();
|
|
330
|
+
for (const row of rows) {
|
|
331
|
+
const taskId = row.task_id;
|
|
332
|
+
if (!result.has(taskId))
|
|
333
|
+
result.set(taskId, []);
|
|
334
|
+
result.get(taskId).push(row);
|
|
335
|
+
}
|
|
336
|
+
return result;
|
|
337
|
+
}
|
|
338
|
+
update(taskId, key, value, updatedAt) {
|
|
339
|
+
this.db
|
|
340
|
+
.prepare('UPDATE task_metadata SET value = ?, updated_at = ? WHERE task_id = ? AND key = ?')
|
|
341
|
+
.run(value, updatedAt, taskId, key);
|
|
342
|
+
return this.findByKey(taskId, key);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
class SQLiteCommentRepository {
|
|
346
|
+
db;
|
|
347
|
+
constructor(db) {
|
|
348
|
+
this.db = db;
|
|
349
|
+
}
|
|
350
|
+
create(input) {
|
|
351
|
+
const result = this.db
|
|
352
|
+
.prepare('INSERT INTO task_comments (task_id, author, content, created_at, updated_at) VALUES (?, ?, ?, ?, ?)')
|
|
353
|
+
.run(input.task_id, input.author ?? null, input.content, input.created_at, input.updated_at);
|
|
354
|
+
return this.findById(result.lastInsertRowid);
|
|
355
|
+
}
|
|
356
|
+
findById(id) {
|
|
357
|
+
const row = this.db.prepare('SELECT * FROM task_comments WHERE id = ?').get(id);
|
|
358
|
+
return row ?? null;
|
|
359
|
+
}
|
|
360
|
+
findByTaskId(taskId) {
|
|
361
|
+
return this.db
|
|
362
|
+
.prepare('SELECT * FROM task_comments WHERE task_id = ? ORDER BY created_at ASC')
|
|
363
|
+
.all(taskId);
|
|
364
|
+
}
|
|
365
|
+
delete(id) {
|
|
366
|
+
const result = this.db.prepare('DELETE FROM task_comments WHERE id = ?').run(id);
|
|
367
|
+
return result.changes > 0;
|
|
368
|
+
}
|
|
369
|
+
deleteAllForTask(taskId) {
|
|
370
|
+
const result = this.db.prepare('DELETE FROM task_comments WHERE task_id = ?').run(taskId);
|
|
371
|
+
return result.changes;
|
|
372
|
+
}
|
|
373
|
+
update(id, content, updatedAt) {
|
|
374
|
+
const result = this.db
|
|
375
|
+
.prepare('UPDATE task_comments SET content = ?, updated_at = ? WHERE id = ?')
|
|
376
|
+
.run(content, updatedAt, id);
|
|
377
|
+
if (result.changes === 0)
|
|
378
|
+
return null;
|
|
379
|
+
return this.findById(id);
|
|
380
|
+
}
|
|
381
|
+
findByTaskIds(taskIds) {
|
|
382
|
+
if (taskIds.length === 0)
|
|
383
|
+
return new Map();
|
|
384
|
+
const placeholders = taskIds.map(() => '?').join(', ');
|
|
385
|
+
const rows = this.db
|
|
386
|
+
.prepare(`SELECT * FROM task_comments WHERE task_id IN (${placeholders}) ORDER BY task_id, created_at ASC`)
|
|
387
|
+
.all(...taskIds);
|
|
388
|
+
const result = new Map();
|
|
389
|
+
for (const row of rows) {
|
|
390
|
+
const taskId = row.task_id;
|
|
391
|
+
if (!result.has(taskId))
|
|
392
|
+
result.set(taskId, []);
|
|
393
|
+
result.get(taskId).push(row);
|
|
394
|
+
}
|
|
395
|
+
return result;
|
|
396
|
+
}
|
|
397
|
+
updateTimestamps(id, createdAt, updatedAt) {
|
|
398
|
+
this.db
|
|
399
|
+
.prepare('UPDATE task_comments SET created_at = ?, updated_at = ? WHERE id = ?')
|
|
400
|
+
.run(createdAt, updatedAt, id);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* SQLite implementation of StorageBackend
|
|
405
|
+
*/
|
|
406
|
+
class SQLiteStorageBackend {
|
|
407
|
+
db;
|
|
408
|
+
tasks;
|
|
409
|
+
tags;
|
|
410
|
+
blocks;
|
|
411
|
+
taskTags;
|
|
412
|
+
metadata;
|
|
413
|
+
comments;
|
|
414
|
+
constructor(db) {
|
|
415
|
+
this.db = db;
|
|
416
|
+
this.tasks = new SQLiteTaskRepository(db);
|
|
417
|
+
this.tags = new SQLiteTagRepository(db);
|
|
418
|
+
this.blocks = new SQLiteTaskBlockRepository(db);
|
|
419
|
+
this.taskTags = new SQLiteTaskTagRepository(db);
|
|
420
|
+
this.metadata = new SQLiteMetadataRepository(db);
|
|
421
|
+
this.comments = new SQLiteCommentRepository(db);
|
|
422
|
+
}
|
|
423
|
+
transaction(fn) {
|
|
424
|
+
return this.db.transaction(fn)();
|
|
425
|
+
}
|
|
426
|
+
updateTaskTimestamps(id, createdAt, updatedAt) {
|
|
427
|
+
this.db.prepare('UPDATE tasks SET created_at = ?, updated_at = ? WHERE id = ?').run(createdAt, updatedAt, id);
|
|
428
|
+
}
|
|
429
|
+
getBoardUpdatedAtSignature() {
|
|
430
|
+
const baseRow = this.db
|
|
431
|
+
.prepare(`SELECT MAX(updated_at) as max_updated_at FROM (
|
|
432
|
+
SELECT updated_at FROM tasks UNION ALL SELECT updated_at FROM task_metadata
|
|
433
|
+
)`)
|
|
434
|
+
.get();
|
|
435
|
+
const tagsRow = this.db
|
|
436
|
+
.prepare('SELECT MAX(created_at) as max_created_at, COUNT(*) as count FROM task_tags')
|
|
437
|
+
.get();
|
|
438
|
+
if (baseRow.max_updated_at === null && tagsRow.max_created_at === null)
|
|
439
|
+
return null;
|
|
440
|
+
return `${baseRow.max_updated_at}|${tagsRow.max_created_at}|${tagsRow.count}`;
|
|
441
|
+
}
|
|
442
|
+
close() {
|
|
443
|
+
this.db.close();
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
exports.SQLiteStorageBackend = SQLiteStorageBackend;
|
|
447
|
+
//# sourceMappingURL=sqlite-storage-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-storage-backend.js","sourceRoot":"","sources":["../../../src/db/adapters/sqlite-storage-backend.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAgCH,gDAAgD;AAChD,MAAM,mBAAmB,GAAG,2GAA2G,CAAC;AAExI,MAAM,oBAAoB;IACJ;IAApB,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAE7C,QAAQ,CAAC,EAAU;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAqB,CAAC;QAC5F,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,MAAmB,EAAE,IAAsB;QACjD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAsB,CAAC;IACpE,CAAC;IAEO,iBAAiB,CACvB,MAAmB,EACnB,IAAsB;QAEtB,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAC9D,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;IAEO,cAAc,CAAC,MAA8B,EAAE,MAA2B;QAChF,IAAI,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9B,OAAO,sHAAsH,YAAY,GAAG,CAAC;QAC/I,CAAC;QACD,OAAO,+BAA+B,CAAC;IACzC,CAAC;IAEO,kBAAkB,CAAC,MAA8B,EAAE,WAAmB,EAAE,MAA2B;QACzG,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAChF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,QAAQ,WAAW,cAAc,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBACjF,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,QAAQ,WAAW,YAAY,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,QAAQ,WAAW,kBAAkB,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,QAAQ,WAAW,gBAAgB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBACrF,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,SAAS,WAAW,mBAAmB,WAAW,cAAc,CAAC;YAC3E,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,gBAAgB,CAAC,IAAiC,EAAE,WAAmB;QAC7E,MAAM,SAAS,GAAG,IAAI,EAAE,KAAK,IAAI,YAAY,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACzD,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,aAAa,mBAAmB,IAAI,SAAS,KAAK,WAAW,MAAM,SAAS,EAAE,CAAC;QACxF,CAAC;QACD,OAAO,aAAa,WAAW,GAAG,SAAS,IAAI,SAAS,KAAK,WAAW,MAAM,SAAS,EAAE,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,KAAuF;QAC5F,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CACN;4CACoC,CACrC;aACA,GAAG,CACF,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,IAAI,IAAI,EAClB,KAAK,CAAC,MAAM,IAAI,IAAI,EACpB,KAAK,CAAC,SAAS,IAAI,IAAI,EACvB,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EACpD,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EACtD,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,UAAU,CACjB,CAAC;QAEJ,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAyB,CAAE,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,KAAwD;QACzE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEO,kBAAkB,CAAC,KAAwD;QAIjF,MAAM,MAAM,GAAgF;YAC1F,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAW,CAAC;YACtC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAkB,CAAC;YAC3C,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAkB,CAAC;YAC/C,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAE,CAAY,IAAI,IAAI,CAAC;YACxD,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAW,CAAC;YACxC,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAkB,CAAC;YACnD,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAkB,CAAC;YACrD,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAW,CAAC;SACjD,CAAC;QACF,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,MAAM,GAA+B,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,EAAE,CAAC;YAC3C,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,YAAY,CAAC,QAAgB;QAC3B,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CAAC,iEAAiE,CAAC;aAC1E,GAAG,CAAC,QAAQ,CAAsB,CAAC;IACxC,CAAC;IAED,aAAa;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC,GAAG,EAGhG,CAAC;QAEH,MAAM,QAAQ,GAA+B;YAC3C,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,CAAC;YACR,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;SACV,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QACnC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,YAAY,CAAC,UAAkB,EAAE,QAAsB;QACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,wCAAwC,YAAY,8CAA8C,CAAC;QACjH,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,EAAE,UAAU,CAAsB,CAAC;IAClF,CAAC;IAED,UAAU,CAAC,GAAa;QACtB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kCAAkC,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QAC9F,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;CACF;AAED,MAAM,mBAAmB;IACH;IAApB,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAE7C,QAAQ,CAAC,EAAU;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAoB,CAAC;QAC1F,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAoB,CAAC;QAC9F,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,EAAsB,CAAC;IAC3G,CAAC;IAED,MAAM,CAAC,KAA8C;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CAAC,mDAAmD,CAAC;aAC5D,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAyB,CAAE,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,KAAqB;QACtC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACrG,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,yBAAyB;IACT;IAApB,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAE7C,MAAM,CAAC,KAAoD;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CAAC,yFAAyF,CAAC;aAClG,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CAAC,wCAAwC,CAAC;aACjD,GAAG,CAAC,MAAM,CAAC,eAAyB,CAAyB,CAAC;IACnE,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,SAAiB;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CAAC,2EAA2E,CAAC;aACpF,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,kBAAkB,CAAC,SAAiB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,mEAAmE,CAAC;aAC5E,GAAG,CAAC,SAAS,CAAuC,CAAC;QACxD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;IAED,kBAAkB,CAAC,SAAiB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,mEAAmE,CAAC;aAC5E,GAAG,CAAC,SAAS,CAAuC,CAAC;QACxD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,EAGpF,CAAC;IACL,CAAC;CACF;AAED,MAAM,uBAAuB;IACP;IAApB,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAE7C,MAAM,CAAC,KAAkD;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CAAC,sEAAsE,CAAC;aAC/E,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CAAC,sCAAsC,CAAC;aAC/C,GAAG,CAAC,MAAM,CAAC,eAAyB,CAAuB,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,MAAc,EAAE,KAAa;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5G,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,MAAc,EAAE,KAAa;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,0EAA0E,CAAC;aACnF,GAAG,CAAC,MAAM,EAAE,KAAK,CAAsB,CAAC;QAC3C,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,kBAAkB,CAAC,MAAc;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,wEAAwE,CAAC;aACjF,GAAG,CAAC,MAAM,CAA8B,CAAC;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CACN;;;oCAG4B,CAC7B;aACA,GAAG,CAAC,MAAM,CAAqB,CAAC;IACrC,CAAC;IAED,kBAAkB,CAAC,KAAa;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,wEAAwE,CAAC;aACjF,GAAG,CAAC,KAAK,CAA+B,CAAC;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CACN;;;oCAG4B,CAC7B;aACA,GAAG,CAAC,KAAK,CAAsB,CAAC;IACrC,CAAC;IAED,sBAAsB;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;gDAGwC,CACzC;aACA,GAAG,EAAiD,CAAC;QAExD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;YAC3B,MAAM,GAAG,GAAQ,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;YAC5E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,wBAAwB;IACR;IAApB,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAE7C,GAAG,CAAC,KAA2E;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAE,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,EAAE;aACJ,OAAO,CAAC,gGAAgG,CAAC;aACzG,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAE,CAAC;IACnD,CAAC;IAED,SAAS,CAAC,MAAc,EAAE,GAAW;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAE3F,CAAC;QACd,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CAAC,iFAAiF,CAAC;aAC1F,GAAG,CAAC,MAAM,CAA8B,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,MAAc,EAAE,GAAW;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3G,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1F,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,sBAAsB;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,wEAAwE,CAAC;aACjF,GAAG,EAA+B,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;QACjD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,MAAc,EAAE,GAAW,EAAE,KAAa,EAAE,SAAiB;QAClE,IAAI,CAAC,EAAE;aACJ,OAAO,CAAC,kFAAkF,CAAC;aAC3F,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;CACF;AAED,MAAM,uBAAuB;IACP;IAApB,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAE7C,MAAM,CAAC,KAA0E;QAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CAAC,qGAAqG,CAAC;aAC9G,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/F,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAyB,CAAE,CAAC;IAC1D,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,CAAC,EAAE,CAA4B,CAAC;QAC3G,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CAAC,uEAAuE,CAAC;aAChF,GAAG,CAAC,MAAM,CAA6B,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1F,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,OAAe,EAAE,SAAiB;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CAAC,mEAAmE,CAAC;aAC5E,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,aAAa,CAAC,OAAiB;QAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,GAAG,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,iDAAiD,YAAY,oCAAoC,CAAC;aAC1G,GAAG,CAAC,GAAG,OAAO,CAA6B,CAAC;QAE/C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;QAChD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gBAAgB,CAAC,EAAU,EAAE,SAAiB,EAAE,SAAiB;QAC/D,IAAI,CAAC,EAAE;aACJ,OAAO,CAAC,sEAAsE,CAAC;aAC/E,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAa,oBAAoB;IAQX;IAPX,KAAK,CAAiB;IACtB,IAAI,CAAgB;IACpB,MAAM,CAAsB;IAC5B,QAAQ,CAAoB;IAC5B,QAAQ,CAAqB;IAC7B,QAAQ,CAAoB;IAErC,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,wBAAwB,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,WAAW,CAAI,EAAW;QACxB,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;IACnC,CAAC;IAED,oBAAoB,CAAC,EAAU,EAAE,SAAiB,EAAE,SAAiB;QACnE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8DAA8D,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAChH,CAAC;IAED,0BAA0B;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;aACpB,OAAO,CACN;;UAEE,CACH;aACA,GAAG,EAAuC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;aACpB,OAAO,CAAC,4EAA4E,CAAC;aACrF,GAAG,EAAsD,CAAC;QAE7D,IAAI,OAAO,CAAC,cAAc,KAAK,IAAI,IAAI,OAAO,CAAC,cAAc,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACpF,OAAO,GAAG,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAChF,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AA5CD,oDA4CC"}
|
package/dist/db/connection.d.ts
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import { StorageProvider } from './types/storage';
|
|
2
|
+
import { StorageBackend } from './types/repository';
|
|
2
3
|
/**
|
|
3
4
|
* Singleton management of database connection
|
|
4
5
|
*/
|
|
5
6
|
export declare class DatabaseConnection {
|
|
6
7
|
private static instance;
|
|
8
|
+
private static backendInstance;
|
|
7
9
|
private static rawDatabase;
|
|
8
10
|
/**
|
|
9
11
|
* Get database instance (singleton)
|
|
10
12
|
* @returns StorageProvider instance
|
|
13
|
+
* @deprecated Use getStorageBackend() instead
|
|
11
14
|
*/
|
|
12
15
|
static getInstance(): StorageProvider;
|
|
16
|
+
/**
|
|
17
|
+
* Get StorageBackend instance (singleton)
|
|
18
|
+
* @returns StorageBackend instance
|
|
19
|
+
*/
|
|
20
|
+
static getBackendInstance(): StorageBackend;
|
|
13
21
|
/**
|
|
14
22
|
* Initialize the database
|
|
15
23
|
*/
|
|
@@ -22,6 +30,12 @@ export declare class DatabaseConnection {
|
|
|
22
30
|
/**
|
|
23
31
|
* Convenience function to get database instance
|
|
24
32
|
* @returns StorageProvider instance
|
|
33
|
+
* @deprecated Use getStorageBackend() instead
|
|
25
34
|
*/
|
|
26
35
|
export declare function getDatabase(): StorageProvider;
|
|
36
|
+
/**
|
|
37
|
+
* Convenience function to get StorageBackend instance
|
|
38
|
+
* @returns StorageBackend instance
|
|
39
|
+
*/
|
|
40
|
+
export declare function getStorageBackend(): StorageBackend;
|
|
27
41
|
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgC;IACvD,OAAO,CAAC,MAAM,CAAC,eAAe,CAA+B;IAC7D,OAAO,CAAC,MAAM,CAAC,WAAW,CAAkC;IAE5D;;;;OAIG;WACW,WAAW,IAAI,eAAe;IAO5C;;;OAGG;WACW,kBAAkB,IAAI,cAAc;IAOlD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IA0BzB;;OAEG;WACW,KAAK,IAAI,IAAI;CAY5B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,eAAe,CAE7C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAElD"}
|
package/dist/db/connection.js
CHANGED
|
@@ -5,21 +5,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.DatabaseConnection = void 0;
|
|
7
7
|
exports.getDatabase = getDatabase;
|
|
8
|
+
exports.getStorageBackend = getStorageBackend;
|
|
8
9
|
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
9
10
|
const path_1 = __importDefault(require("path"));
|
|
10
11
|
const fs_1 = __importDefault(require("fs"));
|
|
11
12
|
const config_1 = require("./config");
|
|
12
13
|
const schema_1 = require("./schema");
|
|
13
14
|
const storage_factory_1 = require("./storage-factory");
|
|
15
|
+
const sqlite_storage_backend_1 = require("./adapters/sqlite-storage-backend");
|
|
14
16
|
/**
|
|
15
17
|
* Singleton management of database connection
|
|
16
18
|
*/
|
|
17
19
|
class DatabaseConnection {
|
|
18
20
|
static instance = null;
|
|
21
|
+
static backendInstance = null;
|
|
19
22
|
static rawDatabase = null;
|
|
20
23
|
/**
|
|
21
24
|
* Get database instance (singleton)
|
|
22
25
|
* @returns StorageProvider instance
|
|
26
|
+
* @deprecated Use getStorageBackend() instead
|
|
23
27
|
*/
|
|
24
28
|
static getInstance() {
|
|
25
29
|
if (!this.instance) {
|
|
@@ -27,6 +31,16 @@ class DatabaseConnection {
|
|
|
27
31
|
}
|
|
28
32
|
return this.instance;
|
|
29
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Get StorageBackend instance (singleton)
|
|
36
|
+
* @returns StorageBackend instance
|
|
37
|
+
*/
|
|
38
|
+
static getBackendInstance() {
|
|
39
|
+
if (!this.backendInstance) {
|
|
40
|
+
this.initialize();
|
|
41
|
+
}
|
|
42
|
+
return this.backendInstance;
|
|
43
|
+
}
|
|
30
44
|
/**
|
|
31
45
|
* Initialize the database
|
|
32
46
|
*/
|
|
@@ -44,17 +58,21 @@ class DatabaseConnection {
|
|
|
44
58
|
this.rawDatabase.pragma('foreign_keys = ON');
|
|
45
59
|
// Run migrations
|
|
46
60
|
(0, schema_1.runMigrations)(this.rawDatabase);
|
|
47
|
-
// Wrap with storage provider
|
|
61
|
+
// Wrap with storage provider (legacy)
|
|
48
62
|
this.instance = (0, storage_factory_1.getStorageProvider)(this.rawDatabase);
|
|
63
|
+
// Create StorageBackend
|
|
64
|
+
this.backendInstance = new sqlite_storage_backend_1.SQLiteStorageBackend(this.rawDatabase);
|
|
49
65
|
}
|
|
50
66
|
/**
|
|
51
67
|
* Close database connection
|
|
52
68
|
*/
|
|
53
69
|
static close() {
|
|
54
70
|
if (this.instance) {
|
|
55
|
-
this.instance.close();
|
|
56
71
|
this.instance = null;
|
|
57
72
|
}
|
|
73
|
+
if (this.backendInstance) {
|
|
74
|
+
this.backendInstance = null;
|
|
75
|
+
}
|
|
58
76
|
if (this.rawDatabase) {
|
|
59
77
|
this.rawDatabase.close();
|
|
60
78
|
this.rawDatabase = null;
|
|
@@ -65,8 +83,16 @@ exports.DatabaseConnection = DatabaseConnection;
|
|
|
65
83
|
/**
|
|
66
84
|
* Convenience function to get database instance
|
|
67
85
|
* @returns StorageProvider instance
|
|
86
|
+
* @deprecated Use getStorageBackend() instead
|
|
68
87
|
*/
|
|
69
88
|
function getDatabase() {
|
|
70
89
|
return DatabaseConnection.getInstance();
|
|
71
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Convenience function to get StorageBackend instance
|
|
93
|
+
* @returns StorageBackend instance
|
|
94
|
+
*/
|
|
95
|
+
function getStorageBackend() {
|
|
96
|
+
return DatabaseConnection.getBackendInstance();
|
|
97
|
+
}
|
|
72
98
|
//# sourceMappingURL=connection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":";;;;;;AA4FA,kCAEC;AAMD,8CAEC;AAtGD,oEAAsC;AACtC,gDAAwB;AACxB,4CAAoB;AACpB,qCAA+C;AAC/C,qCAAyC;AAGzC,uDAAuD;AACvD,8EAAyE;AAEzE;;GAEG;AACH,MAAa,kBAAkB;IACrB,MAAM,CAAC,QAAQ,GAA2B,IAAI,CAAC;IAC/C,MAAM,CAAC,eAAe,GAA0B,IAAI,CAAC;IACrD,MAAM,CAAC,WAAW,GAA6B,IAAI,CAAC;IAE5D;;;;OAIG;IACI,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC,QAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kBAAkB;QAC9B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC,eAAgB,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,UAAU;QACvB,4CAA4C;QAC5C,MAAM,MAAM,GAAG,IAAA,4BAAmB,GAAE,CAAC;QAErC,wBAAwB;QACxB,MAAM,OAAO,GAAG,cAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,YAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;QAExC,iCAAiC;QACjC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAE7C,iBAAiB;QACjB,IAAA,sBAAa,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEhC,sCAAsC;QACtC,IAAI,CAAC,QAAQ,GAAG,IAAA,oCAAkB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAErD,wBAAwB;QACxB,IAAI,CAAC,eAAe,GAAG,IAAI,6CAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;;AAvEH,gDAwEC;AAED;;;;GAIG;AACH,SAAgB,WAAW;IACzB,OAAO,kBAAkB,CAAC,WAAW,EAAE,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB;IAC/B,OAAO,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260328000000_initial_schema.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/20260328000000_initial_schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AA2BlD,wBAAgB,EAAE,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI,CA+N/C"}
|