@j0hanz/todokit-mcp 1.0.1 → 1.0.3
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.md +309 -28
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -18
- package/dist/index.js.map +1 -1
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +14 -29
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/resolve.d.ts +52 -0
- package/dist/lib/resolve.d.ts.map +1 -0
- package/dist/lib/resolve.js +13 -12
- package/dist/lib/resolve.js.map +1 -1
- package/dist/lib/storage.d.ts +10 -1
- package/dist/lib/storage.d.ts.map +1 -1
- package/dist/lib/storage.js +11 -259
- package/dist/lib/storage.js.map +1 -1
- package/dist/lib/storage_filters.d.ts.map +1 -1
- package/dist/lib/storage_filters.js +0 -4
- package/dist/lib/storage_filters.js.map +1 -1
- package/dist/lib/storage_mutations.d.ts +11 -0
- package/dist/lib/storage_mutations.d.ts.map +1 -0
- package/dist/lib/storage_mutations.js +66 -0
- package/dist/lib/storage_mutations.js.map +1 -0
- package/dist/lib/storage_state.d.ts +6 -0
- package/dist/lib/storage_state.d.ts.map +1 -0
- package/dist/lib/storage_state.js +161 -0
- package/dist/lib/storage_state.js.map +1 -0
- package/dist/lib/types.d.ts +2 -2
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +4 -4
- package/dist/lib/types.js.map +1 -1
- package/dist/schemas/inputs.d.ts +47 -3
- package/dist/schemas/inputs.d.ts.map +1 -1
- package/dist/schemas/inputs.js.map +1 -1
- package/dist/schemas/iso_date.d.ts +4 -0
- package/dist/schemas/iso_date.d.ts.map +1 -0
- package/dist/schemas/iso_date.js +1 -0
- package/dist/schemas/iso_date.js.map +1 -1
- package/dist/tools/add_todo.d.ts.map +1 -1
- package/dist/tools/add_todo.js +2 -3
- package/dist/tools/add_todo.js.map +1 -1
- package/dist/tools/add_todos.d.ts.map +1 -1
- package/dist/tools/add_todos.js +2 -3
- package/dist/tools/add_todos.js.map +1 -1
- package/dist/tools/complete_todo.d.ts.map +1 -1
- package/dist/tools/complete_todo.js +20 -28
- package/dist/tools/complete_todo.js.map +1 -1
- package/dist/tools/delete_todo.d.ts.map +1 -1
- package/dist/tools/delete_todo.js +8 -28
- package/dist/tools/delete_todo.js.map +1 -1
- package/dist/tools/list_todos.d.ts.map +1 -1
- package/dist/tools/list_todos.js +4 -9
- package/dist/tools/list_todos.js.map +1 -1
- package/dist/tools/update_todo.d.ts.map +1 -1
- package/dist/tools/update_todo.js +24 -12
- package/dist/tools/update_todo.js.map +1 -1
- package/package.json +1 -2
package/dist/lib/storage.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { type MatchOutcome, type ResolveTodoInput } from './resolve.js';
|
|
1
2
|
import { normalizeTags, type TodoFilters } from './storage_filters.js';
|
|
3
|
+
import { type CompleteTodoOutcome, type TodoUpdate } from './storage_mutations.js';
|
|
2
4
|
import { type Todo } from './types.js';
|
|
3
5
|
export { normalizeTags };
|
|
4
|
-
export declare function getTodos(filters?: TodoFilters): Promise<Todo[]>;
|
|
5
6
|
interface NewTodoInput {
|
|
6
7
|
title: string;
|
|
7
8
|
description?: string;
|
|
@@ -9,8 +10,16 @@ interface NewTodoInput {
|
|
|
9
10
|
dueDate?: string;
|
|
10
11
|
tags?: string[];
|
|
11
12
|
}
|
|
13
|
+
export declare function getTodos(filters?: TodoFilters): Promise<Todo[]>;
|
|
12
14
|
export declare function addTodo(title: string, description?: string, priority?: 'low' | 'normal' | 'high', dueDate?: string, tags?: string[]): Promise<Todo>;
|
|
13
15
|
export declare function addTodos(items: NewTodoInput[]): Promise<Todo[]>;
|
|
14
16
|
export declare function updateTodo(id: string, updates: Partial<Omit<Todo, 'id' | 'createdAt'>>): Promise<Todo | null>;
|
|
15
17
|
export declare function deleteTodo(id: string): Promise<boolean>;
|
|
18
|
+
export type UpdateTodoOutcome = MatchOutcome | {
|
|
19
|
+
kind: 'no_updates';
|
|
20
|
+
};
|
|
21
|
+
export declare function updateTodoBySelector(input: ResolveTodoInput, buildUpdates: (todo: Todo) => TodoUpdate | null): Promise<UpdateTodoOutcome>;
|
|
22
|
+
export declare function deleteTodoBySelector(input: ResolveTodoInput): Promise<MatchOutcome>;
|
|
23
|
+
export type { CompleteTodoOutcome };
|
|
24
|
+
export declare function completeTodoBySelector(input: ResolveTodoInput, completed: boolean): Promise<CompleteTodoOutcome>;
|
|
16
25
|
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/lib/storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/lib/storage.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAGtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,aAAa,EACb,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,mBAAmB,EAExB,KAAK,UAAU,EAEhB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAIrE;AAED,wBAAsB,OAAO,CAC3B,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,GAAE,KAAK,GAAG,QAAQ,GAAG,MAAiB,EAC9C,OAAO,CAAC,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,EAAO,GAClB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAoBrE;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GAC/C,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAStB;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU7D;AAED,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAEtE,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,gBAAgB,EACvB,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,UAAU,GAAG,IAAI,GAC9C,OAAO,CAAC,iBAAiB,CAAC,CAkB5B;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,YAAY,CAAC,CAmBvB;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,mBAAmB,CAAC,CAY9B"}
|
package/dist/lib/storage.js
CHANGED
|
@@ -1,180 +1,12 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { mkdir, mkdtemp, readFile, rename, rm, stat, writeFile, } from 'node:fs/promises';
|
|
3
|
-
import { basename, dirname, join, resolve } from 'node:path';
|
|
4
|
-
import { fileURLToPath } from 'node:url';
|
|
5
|
-
import { createErrorResponse } from './errors.js';
|
|
6
2
|
import { resolveTodoTargetFromTodos, unwrapResolution, } from './resolve.js';
|
|
7
3
|
import { filterTodos, normalizeTags, } from './storage_filters.js';
|
|
8
|
-
import {
|
|
4
|
+
import { completeTodoInList, createNotFoundOutcome, updateTodoInList, } from './storage_mutations.js';
|
|
5
|
+
import { persistTodos, queueWrite, readTodosFromDisk, waitForWrites, } from './storage_state.js';
|
|
6
|
+
import {} from './types.js';
|
|
9
7
|
export { normalizeTags };
|
|
10
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
|
-
const DEFAULT_TODO_FILE = join(__dirname, '../../todos.json');
|
|
12
|
-
const FILE_TIMEOUT_MS = 5000;
|
|
13
|
-
const FILE_ENCODING = 'utf-8';
|
|
14
|
-
const TEMP_DIR_PREFIX = '.tmp-';
|
|
15
|
-
function withTimeout(promise, timeoutMs, label) {
|
|
16
|
-
let timer;
|
|
17
|
-
const timeout = new Promise((_, reject) => {
|
|
18
|
-
timer = setTimeout(() => {
|
|
19
|
-
reject(new Error(`${label} timed out after ${String(timeoutMs)}ms`));
|
|
20
|
-
}, timeoutMs);
|
|
21
|
-
});
|
|
22
|
-
return Promise.race([promise, timeout]).finally(() => {
|
|
23
|
-
if (timer) {
|
|
24
|
-
clearTimeout(timer);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
function getTodoFilePath() {
|
|
29
|
-
const override = process.env.TODOKIT_TODO_FILE?.trim();
|
|
30
|
-
if (override) {
|
|
31
|
-
return resolve(override);
|
|
32
|
-
}
|
|
33
|
-
return DEFAULT_TODO_FILE;
|
|
34
|
-
}
|
|
35
|
-
let writeChain = Promise.resolve();
|
|
36
|
-
let cachedTodos = null;
|
|
37
|
-
let cachedMtimeMs = null;
|
|
38
|
-
let cachedPath = null;
|
|
39
|
-
let inFlightRead = null;
|
|
40
|
-
let inFlightPath = null;
|
|
41
|
-
function clearCacheForPath(path) {
|
|
42
|
-
if (cachedPath === path) {
|
|
43
|
-
cachedTodos = null;
|
|
44
|
-
cachedMtimeMs = null;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
function getCachedTodos(path, mtimeMs) {
|
|
48
|
-
if (cachedTodos && cachedPath === path && cachedMtimeMs === mtimeMs) {
|
|
49
|
-
return cachedTodos;
|
|
50
|
-
}
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
function updateCache(path, todos, mtimeMs) {
|
|
54
|
-
cachedTodos = todos;
|
|
55
|
-
cachedMtimeMs = mtimeMs;
|
|
56
|
-
cachedPath = path;
|
|
57
|
-
}
|
|
58
|
-
function parseTodos(rawJson) {
|
|
59
|
-
const raw = JSON.parse(rawJson);
|
|
60
|
-
const parsed = TodosSchema.safeParse(raw);
|
|
61
|
-
if (!parsed.success) {
|
|
62
|
-
throw new Error(`Invalid todos.json: ${parsed.error.message}`);
|
|
63
|
-
}
|
|
64
|
-
return parsed.data;
|
|
65
|
-
}
|
|
66
|
-
function isFileNotFound(error) {
|
|
67
|
-
if (!error || typeof error !== 'object')
|
|
68
|
-
return false;
|
|
69
|
-
if (!('code' in error))
|
|
70
|
-
return false;
|
|
71
|
-
return error.code === 'ENOENT';
|
|
72
|
-
}
|
|
73
|
-
async function statTodoFile(path) {
|
|
74
|
-
try {
|
|
75
|
-
const stats = await withTimeout(stat(path), FILE_TIMEOUT_MS, 'stat todo file');
|
|
76
|
-
if (!stats.isFile()) {
|
|
77
|
-
throw new Error(`Todo storage path is not a file: ${path}`);
|
|
78
|
-
}
|
|
79
|
-
return stats;
|
|
80
|
-
}
|
|
81
|
-
catch (error) {
|
|
82
|
-
if (isFileNotFound(error)) {
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
throw error;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
async function readTodosFile(path) {
|
|
89
|
-
const data = await readFile(path, {
|
|
90
|
-
encoding: FILE_ENCODING,
|
|
91
|
-
signal: AbortSignal.timeout(FILE_TIMEOUT_MS),
|
|
92
|
-
});
|
|
93
|
-
return parseTodos(data);
|
|
94
|
-
}
|
|
95
|
-
async function readTodosWithCache(path) {
|
|
96
|
-
try {
|
|
97
|
-
const stats = await statTodoFile(path);
|
|
98
|
-
if (!stats) {
|
|
99
|
-
clearCacheForPath(path);
|
|
100
|
-
return [];
|
|
101
|
-
}
|
|
102
|
-
const cached = getCachedTodos(path, stats.mtimeMs);
|
|
103
|
-
if (cached) {
|
|
104
|
-
return cached;
|
|
105
|
-
}
|
|
106
|
-
const parsed = await readTodosFile(path);
|
|
107
|
-
updateCache(path, parsed, stats.mtimeMs);
|
|
108
|
-
return parsed;
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
if (isFileNotFound(error)) {
|
|
112
|
-
clearCacheForPath(path);
|
|
113
|
-
return [];
|
|
114
|
-
}
|
|
115
|
-
throw error;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
async function readTodosFromDisk() {
|
|
119
|
-
const path = getTodoFilePath();
|
|
120
|
-
if (inFlightRead && inFlightPath === path) {
|
|
121
|
-
return inFlightRead;
|
|
122
|
-
}
|
|
123
|
-
const readPromise = readTodosWithCache(path);
|
|
124
|
-
inFlightRead = readPromise;
|
|
125
|
-
inFlightPath = path;
|
|
126
|
-
try {
|
|
127
|
-
return await readPromise;
|
|
128
|
-
}
|
|
129
|
-
finally {
|
|
130
|
-
if (inFlightRead === readPromise) {
|
|
131
|
-
inFlightRead = null;
|
|
132
|
-
inFlightPath = null;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
async function writeFileAtomically(path, data) {
|
|
137
|
-
const targetDir = dirname(path);
|
|
138
|
-
await withTimeout(mkdir(targetDir, { recursive: true }), FILE_TIMEOUT_MS, 'mkdir todo directory');
|
|
139
|
-
const tempDir = await withTimeout(mkdtemp(join(targetDir, TEMP_DIR_PREFIX)), FILE_TIMEOUT_MS, 'mkdtemp todo directory');
|
|
140
|
-
const tempPath = join(tempDir, basename(path));
|
|
141
|
-
try {
|
|
142
|
-
await writeFile(tempPath, data, {
|
|
143
|
-
encoding: FILE_ENCODING,
|
|
144
|
-
signal: AbortSignal.timeout(FILE_TIMEOUT_MS),
|
|
145
|
-
flush: true,
|
|
146
|
-
});
|
|
147
|
-
await withTimeout(rename(tempPath, path), FILE_TIMEOUT_MS, 'rename todo file');
|
|
148
|
-
}
|
|
149
|
-
finally {
|
|
150
|
-
try {
|
|
151
|
-
await withTimeout(rm(tempDir, { recursive: true, force: true }), FILE_TIMEOUT_MS, 'cleanup temp dir');
|
|
152
|
-
}
|
|
153
|
-
catch {
|
|
154
|
-
// Best-effort cleanup of temp artifacts.
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
function queueWrite(task) {
|
|
159
|
-
const next = writeChain.then(task, task);
|
|
160
|
-
writeChain = next.then(() => undefined, () => undefined);
|
|
161
|
-
return next;
|
|
162
|
-
}
|
|
163
|
-
async function persistTodos(todos) {
|
|
164
|
-
const path = getTodoFilePath();
|
|
165
|
-
await writeFileAtomically(path, JSON.stringify(todos, null, 2));
|
|
166
|
-
cachedTodos = todos;
|
|
167
|
-
cachedPath = path;
|
|
168
|
-
try {
|
|
169
|
-
const stats = await withTimeout(stat(path), FILE_TIMEOUT_MS, 'stat todo file');
|
|
170
|
-
cachedMtimeMs = stats.mtimeMs;
|
|
171
|
-
}
|
|
172
|
-
catch {
|
|
173
|
-
cachedMtimeMs = null;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
8
|
export async function getTodos(filters) {
|
|
177
|
-
await
|
|
9
|
+
await waitForWrites();
|
|
178
10
|
const todos = await readTodosFromDisk();
|
|
179
11
|
return filters ? filterTodos(todos, filters) : todos;
|
|
180
12
|
}
|
|
@@ -208,71 +40,6 @@ export async function addTodos(items) {
|
|
|
208
40
|
return newTodos;
|
|
209
41
|
});
|
|
210
42
|
}
|
|
211
|
-
function normalizeUpdateTags(updates) {
|
|
212
|
-
const normalizedUpdates = { ...updates };
|
|
213
|
-
if (normalizedUpdates.tags) {
|
|
214
|
-
normalizedUpdates.tags = normalizeTags(normalizedUpdates.tags);
|
|
215
|
-
}
|
|
216
|
-
return normalizedUpdates;
|
|
217
|
-
}
|
|
218
|
-
function resolveCompletedChange(completed, updates, now) {
|
|
219
|
-
return {
|
|
220
|
-
completed,
|
|
221
|
-
completedAt: completed ? (updates.completedAt ?? now) : undefined,
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
function resolveCompletedAtChange(completed, updates) {
|
|
225
|
-
return {
|
|
226
|
-
completed,
|
|
227
|
-
completedAt: updates.completedAt,
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
function resolveCompletionUpdate(currentTodo, updates, now) {
|
|
231
|
-
const completed = updates.completed ?? currentTodo.completed;
|
|
232
|
-
if (updates.completed !== undefined) {
|
|
233
|
-
return resolveCompletedChange(completed, updates, now);
|
|
234
|
-
}
|
|
235
|
-
if (updates.completedAt !== undefined) {
|
|
236
|
-
return resolveCompletedAtChange(completed, updates);
|
|
237
|
-
}
|
|
238
|
-
return { completed, completedAt: currentTodo.completedAt };
|
|
239
|
-
}
|
|
240
|
-
function buildUpdatedTodo(currentTodo, updates) {
|
|
241
|
-
const now = new Date().toISOString();
|
|
242
|
-
const { completed, completedAt } = resolveCompletionUpdate(currentTodo, updates, now);
|
|
243
|
-
return {
|
|
244
|
-
...currentTodo,
|
|
245
|
-
...updates,
|
|
246
|
-
completed,
|
|
247
|
-
completedAt,
|
|
248
|
-
updatedAt: now,
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
function updateTodoInList(todos, id, updates) {
|
|
252
|
-
const index = todos.findIndex((todo) => todo.id === id);
|
|
253
|
-
if (index === -1)
|
|
254
|
-
return null;
|
|
255
|
-
const currentTodo = todos[index];
|
|
256
|
-
if (!currentTodo)
|
|
257
|
-
return null;
|
|
258
|
-
const normalizedUpdates = normalizeUpdateTags(updates);
|
|
259
|
-
const updatedTodo = buildUpdatedTodo(currentTodo, normalizedUpdates);
|
|
260
|
-
todos[index] = updatedTodo;
|
|
261
|
-
return updatedTodo;
|
|
262
|
-
}
|
|
263
|
-
function createNotFoundOutcome(id) {
|
|
264
|
-
return {
|
|
265
|
-
kind: 'error',
|
|
266
|
-
response: createErrorResponse('E_NOT_FOUND', `Todo with ID ${id} not found`),
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
function findTodoById(todos, id) {
|
|
270
|
-
const match = todos.find((todo) => todo.id === id);
|
|
271
|
-
return match ?? null;
|
|
272
|
-
}
|
|
273
|
-
function getCompletionTimestamp(completed) {
|
|
274
|
-
return completed ? new Date().toISOString() : undefined;
|
|
275
|
-
}
|
|
276
43
|
export async function updateTodo(id, updates) {
|
|
277
44
|
return queueWrite(async () => {
|
|
278
45
|
const todos = await readTodosFromDisk();
|
|
@@ -298,13 +65,14 @@ export async function updateTodoBySelector(input, buildUpdates) {
|
|
|
298
65
|
return queueWrite(async () => {
|
|
299
66
|
const todos = await readTodosFromDisk();
|
|
300
67
|
const outcome = unwrapResolution(resolveTodoTargetFromTodos(todos, input));
|
|
301
|
-
if (outcome.kind !== 'match')
|
|
68
|
+
if (outcome.kind !== 'match') {
|
|
302
69
|
return outcome;
|
|
303
|
-
|
|
304
|
-
|
|
70
|
+
}
|
|
71
|
+
const updates = buildUpdates(outcome.todo);
|
|
72
|
+
if (!updates || Object.keys(updates).length === 0) {
|
|
305
73
|
return { kind: 'no_updates' };
|
|
306
74
|
}
|
|
307
|
-
const updatedTodo = updateTodoInList(todos, outcome.todo.id,
|
|
75
|
+
const updatedTodo = updateTodoInList(todos, outcome.todo.id, updates);
|
|
308
76
|
if (!updatedTodo) {
|
|
309
77
|
return createNotFoundOutcome(outcome.todo.id);
|
|
310
78
|
}
|
|
@@ -322,31 +90,15 @@ export async function deleteTodoBySelector(input) {
|
|
|
322
90
|
if (index === -1) {
|
|
323
91
|
return createNotFoundOutcome(outcome.todo.id);
|
|
324
92
|
}
|
|
325
|
-
const
|
|
93
|
+
const removed = todos[index];
|
|
326
94
|
if (!removed) {
|
|
327
95
|
return createNotFoundOutcome(outcome.todo.id);
|
|
328
96
|
}
|
|
97
|
+
todos.splice(index, 1);
|
|
329
98
|
await persistTodos(todos);
|
|
330
99
|
return { kind: 'match', todo: removed };
|
|
331
100
|
});
|
|
332
101
|
}
|
|
333
|
-
function completeTodoInList(todos, id, completed) {
|
|
334
|
-
const currentTodo = findTodoById(todos, id);
|
|
335
|
-
if (!currentTodo) {
|
|
336
|
-
return createNotFoundOutcome(id);
|
|
337
|
-
}
|
|
338
|
-
if (currentTodo.completed === completed) {
|
|
339
|
-
return { kind: 'already', todo: currentTodo };
|
|
340
|
-
}
|
|
341
|
-
const updatedTodo = updateTodoInList(todos, id, {
|
|
342
|
-
completed,
|
|
343
|
-
completedAt: getCompletionTimestamp(completed),
|
|
344
|
-
});
|
|
345
|
-
if (!updatedTodo) {
|
|
346
|
-
return createNotFoundOutcome(id);
|
|
347
|
-
}
|
|
348
|
-
return { kind: 'match', todo: updatedTodo };
|
|
349
|
-
}
|
|
350
102
|
export async function completeTodoBySelector(input, completed) {
|
|
351
103
|
return queueWrite(async () => {
|
|
352
104
|
const todos = await readTodosFromDisk();
|
package/dist/lib/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/lib/storage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/lib/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage_filters.d.ts","sourceRoot":"","sources":["../../src/lib/storage_filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"storage_filters.d.ts","sourceRoot":"","sources":["../../src/lib/storage_filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAKtD;AA8ED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,CAGvE"}
|
|
@@ -2,8 +2,6 @@ function normalizeTag(tag) {
|
|
|
2
2
|
return tag.trim().toLowerCase();
|
|
3
3
|
}
|
|
4
4
|
export function normalizeTags(tags) {
|
|
5
|
-
if (tags.length === 0)
|
|
6
|
-
return [];
|
|
7
5
|
const normalized = tags
|
|
8
6
|
.map((tag) => normalizeTag(tag))
|
|
9
7
|
.filter((tag) => tag.length > 0);
|
|
@@ -62,8 +60,6 @@ function todoMatches(todo, filters) {
|
|
|
62
60
|
return true;
|
|
63
61
|
}
|
|
64
62
|
export function filterTodos(todos, filters) {
|
|
65
|
-
if (todos.length === 0)
|
|
66
|
-
return [];
|
|
67
63
|
const normalized = normalizeFilters(filters);
|
|
68
64
|
return todos.filter((todo) => todoMatches(todo, normalized));
|
|
69
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage_filters.js","sourceRoot":"","sources":["../../src/lib/storage_filters.ts"],"names":[],"mappings":"AAWA,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,
|
|
1
|
+
{"version":3,"file":"storage_filters.js","sourceRoot":"","sources":["../../src/lib/storage_filters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MatchOutcome } from './resolve.js';
|
|
2
|
+
import type { Todo } from './types.js';
|
|
3
|
+
export type TodoUpdate = Partial<Omit<Todo, 'id' | 'createdAt'>>;
|
|
4
|
+
export declare function updateTodoInList(todos: Todo[], id: string, updates: TodoUpdate): Todo | null;
|
|
5
|
+
export declare function createNotFoundOutcome(id: string): MatchOutcome;
|
|
6
|
+
export type CompleteTodoOutcome = MatchOutcome | {
|
|
7
|
+
kind: 'already';
|
|
8
|
+
todo: Todo;
|
|
9
|
+
};
|
|
10
|
+
export declare function completeTodoInList(todos: Todo[], id: string, completed: boolean): CompleteTodoOutcome;
|
|
11
|
+
//# sourceMappingURL=storage_mutations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage_mutations.d.ts","sourceRoot":"","sources":["../../src/lib/storage_mutations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC;AA0CjE,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,IAAI,EAAE,EACb,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,UAAU,GAClB,IAAI,GAAG,IAAI,CAYb;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAQ9D;AAED,MAAM,MAAM,mBAAmB,GAC3B,YAAY,GACZ;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAEpC,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,EAAE,EACb,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,OAAO,GACjB,mBAAmB,CAiBrB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createErrorResponse } from './errors.js';
|
|
2
|
+
import { normalizeTags } from './storage_filters.js';
|
|
3
|
+
function normalizeUpdateTags(updates) {
|
|
4
|
+
const normalizedUpdates = { ...updates };
|
|
5
|
+
if (normalizedUpdates.tags) {
|
|
6
|
+
normalizedUpdates.tags = normalizeTags(normalizedUpdates.tags);
|
|
7
|
+
}
|
|
8
|
+
return normalizedUpdates;
|
|
9
|
+
}
|
|
10
|
+
function resolveCompletionUpdate(currentTodo, updates, now) {
|
|
11
|
+
const completed = updates.completed ?? currentTodo.completed;
|
|
12
|
+
const completedAt = updates.completedAt ??
|
|
13
|
+
(updates.completed !== undefined
|
|
14
|
+
? completed
|
|
15
|
+
? now
|
|
16
|
+
: undefined
|
|
17
|
+
: currentTodo.completedAt);
|
|
18
|
+
return { completed, completedAt };
|
|
19
|
+
}
|
|
20
|
+
function buildUpdatedTodo(currentTodo, updates) {
|
|
21
|
+
const now = new Date().toISOString();
|
|
22
|
+
const { completed, completedAt } = resolveCompletionUpdate(currentTodo, updates, now);
|
|
23
|
+
return {
|
|
24
|
+
...currentTodo,
|
|
25
|
+
...updates,
|
|
26
|
+
completed,
|
|
27
|
+
completedAt,
|
|
28
|
+
updatedAt: now,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function updateTodoInList(todos, id, updates) {
|
|
32
|
+
const index = todos.findIndex((todo) => todo.id === id);
|
|
33
|
+
if (index === -1)
|
|
34
|
+
return null;
|
|
35
|
+
const currentTodo = todos[index];
|
|
36
|
+
if (!currentTodo)
|
|
37
|
+
return null;
|
|
38
|
+
const normalizedUpdates = normalizeUpdateTags(updates);
|
|
39
|
+
const updatedTodo = buildUpdatedTodo(currentTodo, normalizedUpdates);
|
|
40
|
+
todos[index] = updatedTodo;
|
|
41
|
+
return updatedTodo;
|
|
42
|
+
}
|
|
43
|
+
export function createNotFoundOutcome(id) {
|
|
44
|
+
return {
|
|
45
|
+
kind: 'error',
|
|
46
|
+
response: createErrorResponse('E_NOT_FOUND', `Todo with ID ${id} not found`),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function completeTodoInList(todos, id, completed) {
|
|
50
|
+
const currentTodo = todos.find((todo) => todo.id === id);
|
|
51
|
+
if (!currentTodo) {
|
|
52
|
+
return createNotFoundOutcome(id);
|
|
53
|
+
}
|
|
54
|
+
if (currentTodo.completed === completed) {
|
|
55
|
+
return { kind: 'already', todo: currentTodo };
|
|
56
|
+
}
|
|
57
|
+
const updatedTodo = updateTodoInList(todos, id, {
|
|
58
|
+
completed,
|
|
59
|
+
completedAt: completed ? new Date().toISOString() : undefined,
|
|
60
|
+
});
|
|
61
|
+
if (!updatedTodo) {
|
|
62
|
+
return createNotFoundOutcome(id);
|
|
63
|
+
}
|
|
64
|
+
return { kind: 'match', todo: updatedTodo };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=storage_mutations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage_mutations.js","sourceRoot":"","sources":["../../src/lib/storage_mutations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Todo } from './types.js';
|
|
2
|
+
export declare function readTodosFromDisk(): Promise<Todo[]>;
|
|
3
|
+
export declare function queueWrite<T>(task: () => Promise<T>): Promise<T>;
|
|
4
|
+
export declare function waitForWrites(): Promise<void>;
|
|
5
|
+
export declare function persistTodos(todos: Todo[]): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=storage_state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage_state.d.ts","sourceRoot":"","sources":["../../src/lib/storage_state.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,IAAI,EAAe,MAAM,YAAY,CAAC;AAmGpD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAczD;AA+ED,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOhE;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D"}
|