@sudocode-ai/cli 0.1.0 → 0.1.2
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/cli/feedback-commands.d.ts.map +1 -0
- package/dist/cli/feedback-commands.js +274 -0
- package/dist/cli/feedback-commands.js.map +1 -0
- package/dist/cli/init-commands.d.ts.map +1 -0
- package/dist/cli/init-commands.js +148 -0
- package/dist/cli/init-commands.js.map +1 -0
- package/dist/cli/issue-commands.d.ts.map +1 -0
- package/dist/cli/issue-commands.js +310 -0
- package/dist/cli/issue-commands.js.map +1 -0
- package/dist/cli/query-commands.d.ts.map +1 -0
- package/dist/cli/query-commands.js +61 -0
- package/dist/cli/query-commands.js.map +1 -0
- package/dist/cli/reference-commands.d.ts.map +1 -0
- package/dist/cli/reference-commands.js +136 -0
- package/dist/cli/reference-commands.js.map +1 -0
- package/dist/cli/relationship-commands.d.ts.map +1 -0
- package/dist/cli/relationship-commands.js +76 -0
- package/dist/cli/relationship-commands.js.map +1 -0
- package/dist/cli/server-commands.d.ts.map +1 -0
- package/dist/cli/server-commands.js +99 -0
- package/dist/cli/server-commands.js.map +1 -0
- package/dist/cli/spec-commands.d.ts.map +1 -0
- package/dist/cli/spec-commands.js +321 -0
- package/dist/cli/spec-commands.js.map +1 -0
- package/dist/cli/status-commands.d.ts.map +1 -0
- package/dist/cli/status-commands.js +131 -0
- package/dist/cli/status-commands.js.map +1 -0
- package/dist/cli/sync-commands.d.ts.map +1 -0
- package/dist/cli/sync-commands.js +416 -0
- package/dist/cli/sync-commands.js.map +1 -0
- package/dist/cli/update-commands.d.ts.map +1 -0
- package/dist/cli/update-commands.js +78 -0
- package/dist/cli/update-commands.js.map +1 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +425 -195
- package/dist/cli.js.map +1 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +54 -0
- package/dist/db.js.map +1 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +195 -0
- package/dist/export.js.map +1 -0
- package/dist/filename-generator.d.ts.map +1 -0
- package/dist/filename-generator.js +93 -0
- package/dist/filename-generator.js.map +1 -0
- package/dist/id-generator.d.ts.map +1 -0
- package/dist/id-generator.js +123 -0
- package/dist/id-generator.js.map +1 -0
- package/dist/import.d.ts.map +1 -0
- package/dist/import.js +608 -0
- package/dist/import.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -189
- package/dist/index.js.map +1 -0
- package/dist/jsonl.d.ts.map +1 -0
- package/dist/jsonl.js +333 -0
- package/dist/jsonl.js.map +1 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +357 -0
- package/dist/markdown.js.map +1 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +57 -0
- package/dist/migrations.js.map +1 -0
- package/dist/operations/events.d.ts.map +1 -0
- package/dist/operations/events.js +108 -0
- package/dist/operations/events.js.map +1 -0
- package/dist/operations/feedback-anchors.d.ts.map +1 -0
- package/dist/operations/feedback-anchors.js +444 -0
- package/dist/operations/feedback-anchors.js.map +1 -0
- package/dist/operations/feedback.d.ts.map +1 -0
- package/dist/operations/feedback.js +234 -0
- package/dist/operations/feedback.js.map +1 -0
- package/dist/operations/index.d.ts.map +1 -0
- package/dist/operations/index.js +10 -0
- package/dist/operations/index.js.map +1 -0
- package/dist/operations/issues.d.ts.map +1 -0
- package/dist/operations/issues.js +411 -0
- package/dist/operations/issues.js.map +1 -0
- package/dist/operations/references.d.ts.map +1 -0
- package/dist/operations/references.js +117 -0
- package/dist/operations/references.js.map +1 -0
- package/dist/operations/relationships.d.ts.map +1 -0
- package/dist/operations/relationships.js +236 -0
- package/dist/operations/relationships.js.map +1 -0
- package/dist/operations/specs.d.ts.map +1 -0
- package/dist/operations/specs.js +290 -0
- package/dist/operations/specs.js.map +1 -0
- package/dist/operations/tags.d.ts.map +1 -0
- package/dist/operations/tags.js +127 -0
- package/dist/operations/tags.js.map +1 -0
- package/dist/operations/transactions.d.ts.map +1 -0
- package/dist/operations/transactions.js +111 -0
- package/dist/operations/transactions.js.map +1 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +442 -0
- package/dist/sync.js.map +1 -0
- package/dist/test-schema.d.ts.map +1 -0
- package/dist/test-schema.js +46 -0
- package/dist/test-schema.js.map +1 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/update-checker.d.ts.map +1 -0
- package/dist/update-checker.js +151 -0
- package/dist/update-checker.js.map +1 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +23 -0
- package/dist/version.js.map +1 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +438 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +4 -7
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRUD operations for Specs
|
|
3
|
+
*/
|
|
4
|
+
import { generateUUID } from "../id-generator.js";
|
|
5
|
+
/**
|
|
6
|
+
* Create a new spec
|
|
7
|
+
*/
|
|
8
|
+
export function createSpec(db, input) {
|
|
9
|
+
// Validate parent_id exists if provided and get parent_uuid
|
|
10
|
+
let parent_uuid = null;
|
|
11
|
+
if (input.parent_id) {
|
|
12
|
+
const parent = getSpec(db, input.parent_id);
|
|
13
|
+
if (!parent) {
|
|
14
|
+
throw new Error(`Parent spec not found: ${input.parent_id}`);
|
|
15
|
+
}
|
|
16
|
+
parent_uuid = parent.uuid;
|
|
17
|
+
}
|
|
18
|
+
const uuid = input.uuid || generateUUID();
|
|
19
|
+
// Build INSERT statement with optional timestamp fields
|
|
20
|
+
const columns = [
|
|
21
|
+
"id",
|
|
22
|
+
"uuid",
|
|
23
|
+
"title",
|
|
24
|
+
"file_path",
|
|
25
|
+
"content",
|
|
26
|
+
"priority",
|
|
27
|
+
"parent_id",
|
|
28
|
+
"parent_uuid",
|
|
29
|
+
"archived",
|
|
30
|
+
];
|
|
31
|
+
const values = [
|
|
32
|
+
"@id",
|
|
33
|
+
"@uuid",
|
|
34
|
+
"@title",
|
|
35
|
+
"@file_path",
|
|
36
|
+
"@content",
|
|
37
|
+
"@priority",
|
|
38
|
+
"@parent_id",
|
|
39
|
+
"@parent_uuid",
|
|
40
|
+
"@archived",
|
|
41
|
+
];
|
|
42
|
+
if (input.created_at) {
|
|
43
|
+
columns.push("created_at");
|
|
44
|
+
values.push("@created_at");
|
|
45
|
+
}
|
|
46
|
+
if (input.updated_at) {
|
|
47
|
+
columns.push("updated_at");
|
|
48
|
+
values.push("@updated_at");
|
|
49
|
+
}
|
|
50
|
+
if (input.archived_at !== undefined) {
|
|
51
|
+
columns.push("archived_at");
|
|
52
|
+
values.push("@archived_at");
|
|
53
|
+
}
|
|
54
|
+
const stmt = db.prepare(`
|
|
55
|
+
INSERT INTO specs (
|
|
56
|
+
${columns.join(", ")}
|
|
57
|
+
) VALUES (
|
|
58
|
+
${values.join(", ")}
|
|
59
|
+
)
|
|
60
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
61
|
+
uuid = excluded.uuid,
|
|
62
|
+
title = excluded.title,
|
|
63
|
+
file_path = excluded.file_path,
|
|
64
|
+
content = excluded.content,
|
|
65
|
+
priority = excluded.priority,
|
|
66
|
+
parent_id = excluded.parent_id,
|
|
67
|
+
parent_uuid = excluded.parent_uuid,
|
|
68
|
+
archived = excluded.archived,
|
|
69
|
+
archived_at = excluded.archived_at,
|
|
70
|
+
${input.created_at ? "created_at = excluded.created_at," : ""}
|
|
71
|
+
${input.updated_at ? "updated_at = excluded.updated_at" : "updated_at = CURRENT_TIMESTAMP"}
|
|
72
|
+
`);
|
|
73
|
+
try {
|
|
74
|
+
const params = {
|
|
75
|
+
id: input.id,
|
|
76
|
+
uuid: uuid,
|
|
77
|
+
title: input.title,
|
|
78
|
+
file_path: input.file_path,
|
|
79
|
+
content: input.content || "",
|
|
80
|
+
priority: input.priority ?? 2,
|
|
81
|
+
parent_id: input.parent_id ?? null,
|
|
82
|
+
parent_uuid: parent_uuid,
|
|
83
|
+
archived: input.archived ? 1 : 0,
|
|
84
|
+
};
|
|
85
|
+
// Add optional timestamp parameters
|
|
86
|
+
if (input.created_at) {
|
|
87
|
+
params.created_at = input.created_at;
|
|
88
|
+
}
|
|
89
|
+
if (input.updated_at) {
|
|
90
|
+
params.updated_at = input.updated_at;
|
|
91
|
+
}
|
|
92
|
+
if (input.archived_at !== undefined) {
|
|
93
|
+
params.archived_at = input.archived_at;
|
|
94
|
+
}
|
|
95
|
+
stmt.run(params);
|
|
96
|
+
const spec = getSpec(db, input.id);
|
|
97
|
+
if (!spec) {
|
|
98
|
+
throw new Error(`Failed to create spec ${input.id}`);
|
|
99
|
+
}
|
|
100
|
+
return spec;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (error.code && error.code.startsWith("SQLITE_CONSTRAINT")) {
|
|
104
|
+
throw new Error(`Constraint violation: ${error.message}`);
|
|
105
|
+
}
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get a spec by ID
|
|
111
|
+
*/
|
|
112
|
+
export function getSpec(db, id) {
|
|
113
|
+
const stmt = db.prepare(`
|
|
114
|
+
SELECT * FROM specs WHERE id = ?
|
|
115
|
+
`);
|
|
116
|
+
return stmt.get(id) ?? null;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get a spec by file path
|
|
120
|
+
*/
|
|
121
|
+
export function getSpecByFilePath(db, filePath) {
|
|
122
|
+
const stmt = db.prepare(`
|
|
123
|
+
SELECT * FROM specs WHERE file_path = ?
|
|
124
|
+
`);
|
|
125
|
+
return stmt.get(filePath) ?? null;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Update a spec
|
|
129
|
+
*/
|
|
130
|
+
export function updateSpec(db, id, input) {
|
|
131
|
+
const existing = getSpec(db, id);
|
|
132
|
+
if (!existing) {
|
|
133
|
+
throw new Error(`Spec not found: ${id}`);
|
|
134
|
+
}
|
|
135
|
+
// Validate parent_id exists if provided
|
|
136
|
+
if (input.parent_id) {
|
|
137
|
+
const parent = getSpec(db, input.parent_id);
|
|
138
|
+
if (!parent) {
|
|
139
|
+
throw new Error(`Parent spec not found: ${input.parent_id}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const updates = [];
|
|
143
|
+
const params = { id };
|
|
144
|
+
if (input.title !== undefined && input.title !== existing.title) {
|
|
145
|
+
updates.push("title = @title");
|
|
146
|
+
params.title = input.title;
|
|
147
|
+
}
|
|
148
|
+
if (input.file_path !== undefined && input.file_path !== existing.file_path) {
|
|
149
|
+
updates.push("file_path = @file_path");
|
|
150
|
+
params.file_path = input.file_path;
|
|
151
|
+
}
|
|
152
|
+
if (input.content !== undefined && input.content !== existing.content) {
|
|
153
|
+
updates.push("content = @content");
|
|
154
|
+
params.content = input.content;
|
|
155
|
+
}
|
|
156
|
+
if (input.priority !== undefined && input.priority !== existing.priority) {
|
|
157
|
+
updates.push("priority = @priority");
|
|
158
|
+
params.priority = input.priority;
|
|
159
|
+
}
|
|
160
|
+
if (input.parent_id !== undefined && input.parent_id !== existing.parent_id) {
|
|
161
|
+
updates.push("parent_id = @parent_id");
|
|
162
|
+
params.parent_id = input.parent_id;
|
|
163
|
+
}
|
|
164
|
+
if (input.archived !== undefined && input.archived !== existing.archived) {
|
|
165
|
+
updates.push("archived = @archived");
|
|
166
|
+
params.archived = input.archived ? 1 : 0;
|
|
167
|
+
// Handle archived_at based on archived changes
|
|
168
|
+
// Use input.archived_at if provided, otherwise auto-set based on archived
|
|
169
|
+
if (input.archived_at !== undefined) {
|
|
170
|
+
// Explicit archived_at provided - use it
|
|
171
|
+
updates.push("archived_at = @archived_at");
|
|
172
|
+
params.archived_at = input.archived_at;
|
|
173
|
+
}
|
|
174
|
+
else if (input.archived && !existing.archived) {
|
|
175
|
+
// Archiving - set timestamp
|
|
176
|
+
updates.push("archived_at = CURRENT_TIMESTAMP");
|
|
177
|
+
}
|
|
178
|
+
else if (!input.archived && existing.archived) {
|
|
179
|
+
// Unarchiving - clear timestamp
|
|
180
|
+
updates.push("archived_at = NULL");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else if (input.archived_at !== undefined &&
|
|
184
|
+
input.archived_at !== existing.archived_at) {
|
|
185
|
+
// archived_at provided without archived change
|
|
186
|
+
updates.push("archived_at = @archived_at");
|
|
187
|
+
params.archived_at = input.archived_at;
|
|
188
|
+
}
|
|
189
|
+
// Handle updated_at - use provided value or set to current timestamp
|
|
190
|
+
if (input.updated_at !== undefined) {
|
|
191
|
+
updates.push("updated_at = @updated_at");
|
|
192
|
+
params.updated_at = input.updated_at;
|
|
193
|
+
}
|
|
194
|
+
else if (updates.length > 0) {
|
|
195
|
+
// Only update timestamp if there are actual changes
|
|
196
|
+
updates.push("updated_at = CURRENT_TIMESTAMP");
|
|
197
|
+
}
|
|
198
|
+
if (updates.length === 0) {
|
|
199
|
+
return existing;
|
|
200
|
+
}
|
|
201
|
+
const stmt = db.prepare(`
|
|
202
|
+
UPDATE specs SET ${updates.join(", ")} WHERE id = @id
|
|
203
|
+
`);
|
|
204
|
+
try {
|
|
205
|
+
stmt.run(params);
|
|
206
|
+
const updated = getSpec(db, id);
|
|
207
|
+
if (!updated) {
|
|
208
|
+
throw new Error(`Failed to update spec ${id}`);
|
|
209
|
+
}
|
|
210
|
+
return updated;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
if (error.code && error.code.startsWith("SQLITE_CONSTRAINT")) {
|
|
214
|
+
throw new Error(`Constraint violation: ${error.message}`);
|
|
215
|
+
}
|
|
216
|
+
throw error;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Delete a spec
|
|
221
|
+
*/
|
|
222
|
+
export function deleteSpec(db, id) {
|
|
223
|
+
const stmt = db.prepare(`DELETE FROM specs WHERE id = ?`);
|
|
224
|
+
const result = stmt.run(id);
|
|
225
|
+
return result.changes > 0;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* List specs with optional filters
|
|
229
|
+
*/
|
|
230
|
+
export function listSpecs(db, options = {}) {
|
|
231
|
+
const conditions = [];
|
|
232
|
+
const params = {};
|
|
233
|
+
if (options.priority !== undefined) {
|
|
234
|
+
conditions.push("priority = @priority");
|
|
235
|
+
params.priority = options.priority;
|
|
236
|
+
}
|
|
237
|
+
if (options.parent_id !== undefined) {
|
|
238
|
+
conditions.push("parent_id = @parent_id");
|
|
239
|
+
params.parent_id = options.parent_id;
|
|
240
|
+
}
|
|
241
|
+
if (options.archived !== undefined) {
|
|
242
|
+
conditions.push("archived = @archived");
|
|
243
|
+
params.archived = options.archived ? 1 : 0;
|
|
244
|
+
}
|
|
245
|
+
let query = "SELECT * FROM specs";
|
|
246
|
+
if (conditions.length > 0) {
|
|
247
|
+
query += " WHERE " + conditions.join(" AND ");
|
|
248
|
+
}
|
|
249
|
+
query += " ORDER BY priority DESC, created_at DESC";
|
|
250
|
+
if (options.limit !== undefined) {
|
|
251
|
+
query += " LIMIT @limit";
|
|
252
|
+
params.limit = options.limit;
|
|
253
|
+
}
|
|
254
|
+
if (options.offset !== undefined) {
|
|
255
|
+
query += " OFFSET @offset";
|
|
256
|
+
params.offset = options.offset;
|
|
257
|
+
}
|
|
258
|
+
const stmt = db.prepare(query);
|
|
259
|
+
return stmt.all(params);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Search specs by title or content
|
|
263
|
+
*/
|
|
264
|
+
export function searchSpecs(db, query, options = {}) {
|
|
265
|
+
const conditions = ["(title LIKE @query OR content LIKE @query)"];
|
|
266
|
+
const params = { query: `%${query}%` };
|
|
267
|
+
if (options.priority !== undefined) {
|
|
268
|
+
conditions.push("priority = @priority");
|
|
269
|
+
params.priority = options.priority;
|
|
270
|
+
}
|
|
271
|
+
if (options.parent_id !== undefined) {
|
|
272
|
+
conditions.push("parent_id = @parent_id");
|
|
273
|
+
params.parent_id = options.parent_id;
|
|
274
|
+
}
|
|
275
|
+
if (options.archived !== undefined) {
|
|
276
|
+
conditions.push("archived = @archived");
|
|
277
|
+
params.archived = options.archived ? 1 : 0;
|
|
278
|
+
}
|
|
279
|
+
let sql = `SELECT * FROM specs WHERE ${conditions.join(" AND ")} ORDER BY priority DESC, created_at DESC`;
|
|
280
|
+
if (options.limit !== undefined) {
|
|
281
|
+
sql += " LIMIT @limit";
|
|
282
|
+
params.limit = options.limit;
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
sql += " LIMIT 50";
|
|
286
|
+
}
|
|
287
|
+
const stmt = db.prepare(sql);
|
|
288
|
+
return stmt.all(params);
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=specs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specs.js","sourceRoot":"","sources":["../../src/operations/specs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/operations/tags.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,wBAAgB,MAAM,CACpB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EACvB,GAAG,EAAE,MAAM,GACV,GAAG,CA6BL;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EACvB,IAAI,EAAE,MAAM,EAAE,GACb,GAAG,EAAE,CAQP;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EACvB,GAAG,EAAE,MAAM,GACV,OAAO,CAQT;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,GACtB,MAAM,EAAE,CASV;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,UAAU,GACvB,GAAG,EAAE,CAaP;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,GACtB,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,MAAM,CACpB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EACvB,GAAG,EAAE,MAAM,GACV,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,CAAC,EAAE,UAAU,GACvB,MAAM,EAAE,CAcV;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EACvB,IAAI,EAAE,MAAM,EAAE,GACb,MAAM,EAAE,CAUV"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations for Tags
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Add a tag to an entity
|
|
6
|
+
*/
|
|
7
|
+
export function addTag(db, entity_id, entity_type, tag) {
|
|
8
|
+
// Get entity UUID
|
|
9
|
+
const table = entity_type === "spec" ? "specs" : "issues";
|
|
10
|
+
const entity = db
|
|
11
|
+
.prepare(`SELECT uuid FROM ${table} WHERE id = ?`)
|
|
12
|
+
.get(entity_id);
|
|
13
|
+
if (!entity) {
|
|
14
|
+
throw new Error(`${entity_type === "spec" ? "Spec" : "Issue"} not found: ${entity_id}`);
|
|
15
|
+
}
|
|
16
|
+
const stmt = db.prepare(`
|
|
17
|
+
INSERT INTO tags (entity_id, entity_uuid, entity_type, tag)
|
|
18
|
+
VALUES (@entity_id, @entity_uuid, @entity_type, @tag)
|
|
19
|
+
`);
|
|
20
|
+
try {
|
|
21
|
+
stmt.run({ entity_id, entity_uuid: entity.uuid, entity_type, tag });
|
|
22
|
+
return { entity_id, entity_uuid: entity.uuid, entity_type, tag };
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error.code && error.code.startsWith("SQLITE_CONSTRAINT")) {
|
|
26
|
+
// Tag already exists, return it
|
|
27
|
+
return { entity_id, entity_uuid: entity.uuid, entity_type, tag };
|
|
28
|
+
}
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Add multiple tags to an entity
|
|
34
|
+
*/
|
|
35
|
+
export function addTags(db, entity_id, entity_type, tags) {
|
|
36
|
+
const results = [];
|
|
37
|
+
for (const tag of tags) {
|
|
38
|
+
results.push(addTag(db, entity_id, entity_type, tag));
|
|
39
|
+
}
|
|
40
|
+
return results;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Remove a tag from an entity
|
|
44
|
+
*/
|
|
45
|
+
export function removeTag(db, entity_id, entity_type, tag) {
|
|
46
|
+
const stmt = db.prepare(`
|
|
47
|
+
DELETE FROM tags
|
|
48
|
+
WHERE entity_id = ? AND entity_type = ? AND tag = ?
|
|
49
|
+
`);
|
|
50
|
+
const result = stmt.run(entity_id, entity_type, tag);
|
|
51
|
+
return result.changes > 0;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get all tags for an entity
|
|
55
|
+
*/
|
|
56
|
+
export function getTags(db, entity_id, entity_type) {
|
|
57
|
+
const stmt = db.prepare(`
|
|
58
|
+
SELECT tag FROM tags
|
|
59
|
+
WHERE entity_id = ? AND entity_type = ?
|
|
60
|
+
ORDER BY tag
|
|
61
|
+
`);
|
|
62
|
+
const rows = stmt.all(entity_id, entity_type);
|
|
63
|
+
return rows.map((row) => row.tag);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get all entities with a specific tag
|
|
67
|
+
*/
|
|
68
|
+
export function getEntitiesByTag(db, tag, entity_type) {
|
|
69
|
+
let query = "SELECT * FROM tags WHERE tag = @tag";
|
|
70
|
+
const params = { tag };
|
|
71
|
+
if (entity_type !== undefined) {
|
|
72
|
+
query += " AND entity_type = @entity_type";
|
|
73
|
+
params.entity_type = entity_type;
|
|
74
|
+
}
|
|
75
|
+
query += " ORDER BY entity_id";
|
|
76
|
+
const stmt = db.prepare(query);
|
|
77
|
+
return stmt.all(params);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Remove all tags from an entity
|
|
81
|
+
*/
|
|
82
|
+
export function removeAllTags(db, entity_id, entity_type) {
|
|
83
|
+
const stmt = db.prepare(`
|
|
84
|
+
DELETE FROM tags
|
|
85
|
+
WHERE entity_id = ? AND entity_type = ?
|
|
86
|
+
`);
|
|
87
|
+
const result = stmt.run(entity_id, entity_type);
|
|
88
|
+
return result.changes;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if an entity has a specific tag
|
|
92
|
+
*/
|
|
93
|
+
export function hasTag(db, entity_id, entity_type, tag) {
|
|
94
|
+
const stmt = db.prepare(`
|
|
95
|
+
SELECT 1 FROM tags
|
|
96
|
+
WHERE entity_id = ? AND entity_type = ? AND tag = ?
|
|
97
|
+
`);
|
|
98
|
+
return stmt.get(entity_id, entity_type, tag) !== undefined;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get all unique tags in the system
|
|
102
|
+
*/
|
|
103
|
+
export function getAllTags(db, entity_type) {
|
|
104
|
+
let query = "SELECT DISTINCT tag FROM tags";
|
|
105
|
+
const params = {};
|
|
106
|
+
if (entity_type !== undefined) {
|
|
107
|
+
query += " WHERE entity_type = @entity_type";
|
|
108
|
+
params.entity_type = entity_type;
|
|
109
|
+
}
|
|
110
|
+
query += " ORDER BY tag";
|
|
111
|
+
const stmt = db.prepare(query);
|
|
112
|
+
const rows = stmt.all(params);
|
|
113
|
+
return rows.map((row) => row.tag);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Replace all tags for an entity
|
|
117
|
+
*/
|
|
118
|
+
export function setTags(db, entity_id, entity_type, tags) {
|
|
119
|
+
// Remove existing tags
|
|
120
|
+
removeAllTags(db, entity_id, entity_type);
|
|
121
|
+
// Add new tags
|
|
122
|
+
if (tags.length > 0) {
|
|
123
|
+
addTags(db, entity_id, entity_type, tags);
|
|
124
|
+
}
|
|
125
|
+
return tags;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/operations/tags.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,UAAU,MAAM,CACpB,EAAqB,EACrB,SAAiB,EACjB,WAAuB,EACvB,GAAW;IAEX,kBAAkB;IAClB,MAAM,KAAK,GAAG,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1D,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CAAC,oBAAoB,KAAK,eAAe,CAAC;SACjD,GAAG,CAAC,SAAS,CAAiC,CAAC;IAElD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,GAAG,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,eAAe,SAAS,EAAE,CACvE,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;QAEpE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;IACnE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC7D,gCAAgC;YAChC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;QACnE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,EAAqB,EACrB,SAAiB,EACjB,WAAuB,EACvB,IAAc;IAEd,MAAM,OAAO,GAAU,EAAE,CAAC;IAE1B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,EAAqB,EACrB,SAAiB,EACjB,WAAuB,EACvB,GAAW;IAEX,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,EAAqB,EACrB,SAAiB,EACjB,WAAuB;IAEvB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;GAIvB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAA2B,CAAC;IACxE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAqB,EACrB,GAAW,EACX,WAAwB;IAExB,IAAI,KAAK,GAAG,qCAAqC,CAAC;IAClD,MAAM,MAAM,GAAwB,EAAE,GAAG,EAAE,CAAC;IAE5C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,KAAK,IAAI,iCAAiC,CAAC;QAC3C,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED,KAAK,IAAI,qBAAqB,CAAC;IAE/B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAU,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,EAAqB,EACrB,SAAiB,EACjB,WAAuB;IAEvB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CACpB,EAAqB,EACrB,SAAiB,EACjB,WAAuB,EACvB,GAAW;IAEX,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,KAAK,SAAS,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,EAAqB,EACrB,WAAwB;IAExB,IAAI,KAAK,GAAG,+BAA+B,CAAC;IAC5C,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,KAAK,IAAI,mCAAmC,CAAC;QAC7C,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED,KAAK,IAAI,eAAe,CAAC;IAEzB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAA2B,CAAC;IACxD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,EAAqB,EACrB,SAAiB,EACjB,WAAuB,EACvB,IAAc;IAEd,uBAAuB;IACvB,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAE1C,eAAe;IACf,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../src/operations/transactions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,KAAK,CAAC,CAAC;AAElE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC/B,CAAC,CAYH;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GACzB,CAAC,EAAE,CAQL;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACjC,UAAU,GAAE,MAAU,EACtB,OAAO,GAAE,MAAY,GACpB,CAAC,CA2BH;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAK7B,OAAO,CAAC,EAAE;IAJZ,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAkB;gBAGxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAC7B,IAAI,CAAC,EAAE,MAAM;IAMf;;OAEG;IACH,MAAM,IAAI,IAAI;IAQd;;OAEG;IACH,QAAQ,IAAI,IAAI;IAShB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,EACd,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,CAAC,EAAE,EAAE,oBAAoB,KAAK,CAAC,GACxC,CAAC;CAeL"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transaction support with proper error handling
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Execute a function within a transaction
|
|
6
|
+
* Automatically commits on success, rolls back on error
|
|
7
|
+
*/
|
|
8
|
+
export function transaction(db, callback) {
|
|
9
|
+
// Check if we're already in a transaction
|
|
10
|
+
const inTransaction = db.inTransaction;
|
|
11
|
+
if (inTransaction) {
|
|
12
|
+
// Already in a transaction, just execute the callback
|
|
13
|
+
return callback(db);
|
|
14
|
+
}
|
|
15
|
+
// Start a new transaction
|
|
16
|
+
const txn = db.transaction(callback);
|
|
17
|
+
return txn(db);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Execute multiple operations in a transaction
|
|
21
|
+
* This is a convenience wrapper that handles common patterns
|
|
22
|
+
*/
|
|
23
|
+
export function batchTransaction(db, operations) {
|
|
24
|
+
return transaction(db, () => {
|
|
25
|
+
const results = [];
|
|
26
|
+
for (const operation of operations) {
|
|
27
|
+
results.push(operation());
|
|
28
|
+
}
|
|
29
|
+
return results;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Execute an operation with automatic retry on busy/locked errors
|
|
34
|
+
*/
|
|
35
|
+
export function withRetry(db, operation, maxRetries = 3, delayMs = 100) {
|
|
36
|
+
let lastError = null;
|
|
37
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
38
|
+
try {
|
|
39
|
+
return operation(db);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
lastError = error;
|
|
43
|
+
// Retry on SQLITE_BUSY or SQLITE_LOCKED
|
|
44
|
+
if ((error.code === 'SQLITE_BUSY' || error.code === 'SQLITE_LOCKED') &&
|
|
45
|
+
attempt < maxRetries) {
|
|
46
|
+
// Wait before retrying (with exponential backoff)
|
|
47
|
+
const delay = delayMs * Math.pow(2, attempt);
|
|
48
|
+
const sleep = new Promise((resolve) => setTimeout(resolve, delay));
|
|
49
|
+
// Block until sleep completes
|
|
50
|
+
sleep.then(() => { });
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
throw lastError || new Error('Transaction failed after retries');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Savepoint-based nested transaction support
|
|
60
|
+
*/
|
|
61
|
+
export class SavepointTransaction {
|
|
62
|
+
db;
|
|
63
|
+
savepointId;
|
|
64
|
+
released = false;
|
|
65
|
+
constructor(db, name) {
|
|
66
|
+
this.db = db;
|
|
67
|
+
this.savepointId = name || `sp_${Date.now()}_${Math.random().toString().replace('.', '')}`;
|
|
68
|
+
this.db.prepare(`SAVEPOINT ${this.savepointId}`).run();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Commit the savepoint
|
|
72
|
+
*/
|
|
73
|
+
commit() {
|
|
74
|
+
if (this.released) {
|
|
75
|
+
throw new Error('Savepoint already released');
|
|
76
|
+
}
|
|
77
|
+
this.db.prepare(`RELEASE ${this.savepointId}`).run();
|
|
78
|
+
this.released = true;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Rollback the savepoint
|
|
82
|
+
*/
|
|
83
|
+
rollback() {
|
|
84
|
+
if (this.released) {
|
|
85
|
+
throw new Error('Savepoint already released');
|
|
86
|
+
}
|
|
87
|
+
this.db.prepare(`ROLLBACK TO ${this.savepointId}`).run();
|
|
88
|
+
this.db.prepare(`RELEASE ${this.savepointId}`).run();
|
|
89
|
+
this.released = true;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Execute a callback with automatic commit/rollback
|
|
93
|
+
*/
|
|
94
|
+
static execute(db, callback) {
|
|
95
|
+
const sp = new SavepointTransaction(db);
|
|
96
|
+
try {
|
|
97
|
+
const result = callback(sp);
|
|
98
|
+
if (!sp.released) {
|
|
99
|
+
sp.commit();
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (!sp.released) {
|
|
105
|
+
sp.rollback();
|
|
106
|
+
}
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=transactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.js","sourceRoot":"","sources":["../../src/operations/transactions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,EAAqB,EACrB,QAAgC;IAEhC,0CAA0C;IAC1C,MAAM,aAAa,GAAG,EAAE,CAAC,aAAa,CAAC;IAEvC,IAAI,aAAa,EAAE,CAAC;QAClB,sDAAsD;QACtD,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IAED,0BAA0B;IAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAqB,EACrB,UAA0B;IAE1B,OAAO,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE;QAC1B,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,EAAqB,EACrB,SAAiC,EACjC,aAAqB,CAAC,EACtB,UAAkB,GAAG;IAErB,IAAI,SAAS,GAAiB,IAAI,CAAC;IAEnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,SAAS,GAAG,KAAK,CAAC;YAElB,wCAAwC;YACxC,IACE,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC;gBAChE,OAAO,GAAG,UAAU,EACpB,CAAC;gBACD,kDAAkD;gBAClD,MAAM,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC7C,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBACnE,8BAA8B;gBAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACrB,SAAS;YACX,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAKrB;IAJF,WAAW,CAAS;IACpB,QAAQ,GAAY,KAAK,CAAC;IAElC,YACU,EAAqB,EAC7B,IAAa;QADL,OAAE,GAAF,EAAE,CAAmB;QAG7B,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3F,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,CACZ,EAAqB,EACrB,QAAyC;QAEzC,MAAM,EAAE,GAAG,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;gBACjB,EAAE,CAAC,MAAM,EAAE,CAAC;YACd,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;gBACjB,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAsB3C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAkED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAoKrB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,OAAO,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CA0DrB"}
|