@alistigo/list-document 0.4.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/LICENSE +21 -0
- package/README.md +151 -0
- package/dist/__tests__/projection.test.d.ts +2 -0
- package/dist/__tests__/projection.test.d.ts.map +1 -0
- package/dist/__tests__/projection.test.js +318 -0
- package/dist/__tests__/projection.test.js.map +1 -0
- package/dist/application/__tests__/list-application-service.test.d.ts +2 -0
- package/dist/application/__tests__/list-application-service.test.d.ts.map +1 -0
- package/dist/application/__tests__/list-application-service.test.js +281 -0
- package/dist/application/__tests__/list-application-service.test.js.map +1 -0
- package/dist/application/list-application-service.d.ts +59 -0
- package/dist/application/list-application-service.d.ts.map +1 -0
- package/dist/application/list-application-service.js +138 -0
- package/dist/application/list-application-service.js.map +1 -0
- package/dist/index.d.ts +135 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/__tests__/list-markdown.test.d.ts +2 -0
- package/dist/markdown/__tests__/list-markdown.test.d.ts.map +1 -0
- package/dist/markdown/__tests__/list-markdown.test.js +133 -0
- package/dist/markdown/__tests__/list-markdown.test.js.map +1 -0
- package/dist/markdown/list-markdown.d.ts +13 -0
- package/dist/markdown/list-markdown.d.ts.map +1 -0
- package/dist/markdown/list-markdown.js +50 -0
- package/dist/markdown/list-markdown.js.map +1 -0
- package/dist/package.json +58 -0
- package/dist/projection.d.ts +32 -0
- package/dist/projection.d.ts.map +1 -0
- package/dist/projection.js +59 -0
- package/dist/projection.js.map +1 -0
- package/dist/projector/list-projector.d.ts +27 -0
- package/dist/projector/list-projector.d.ts.map +1 -0
- package/dist/projector/list-projector.js +36 -0
- package/dist/projector/list-projector.js.map +1 -0
- package/dist/result.d.ts +10 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +7 -0
- package/dist/result.js.map +1 -0
- package/dist/schemas/alistigo-document.json +117 -0
- package/dist/schemas/document.json +83 -0
- package/dist/serializer/__tests__/list-document-serializer.test.d.ts +2 -0
- package/dist/serializer/__tests__/list-document-serializer.test.d.ts.map +1 -0
- package/dist/serializer/__tests__/list-document-serializer.test.js +282 -0
- package/dist/serializer/__tests__/list-document-serializer.test.js.map +1 -0
- package/dist/serializer/list-document-serializer.d.ts +11 -0
- package/dist/serializer/list-document-serializer.d.ts.map +1 -0
- package/dist/serializer/list-document-serializer.js +160 -0
- package/dist/serializer/list-document-serializer.js.map +1 -0
- package/dist/types/list.d.ts +53 -0
- package/dist/types/list.d.ts.map +1 -0
- package/dist/types/list.js +2 -0
- package/dist/types/list.js.map +1 -0
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +12 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +39 -0
- package/dist/validate.js.map +1 -0
- package/package.json +57 -0
- package/src/schemas/alistigo-document.json +117 -0
- package/src/schemas/document.json +83 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { generateActorId, generateListId, parseListElementId, } from "@alistigo/list-domain";
|
|
3
|
+
import { ListDocumentSerializer } from "../../serializer/list-document-serializer.js";
|
|
4
|
+
import { ListApplicationService } from "../list-application-service.js";
|
|
5
|
+
class InMemoryStore {
|
|
6
|
+
docs = new Map();
|
|
7
|
+
async load(id) {
|
|
8
|
+
const doc = this.docs.get(id.toString());
|
|
9
|
+
return doc ? ListDocumentSerializer.deserialize(doc) : undefined;
|
|
10
|
+
}
|
|
11
|
+
async save(list) {
|
|
12
|
+
const prev = this.docs.get(list.id.toString());
|
|
13
|
+
this.docs.set(list.id.toString(), ListDocumentSerializer.serialize(list, prev));
|
|
14
|
+
}
|
|
15
|
+
async loadDocument(id) {
|
|
16
|
+
return this.docs.get(id.toString());
|
|
17
|
+
}
|
|
18
|
+
async saveDocument(doc) {
|
|
19
|
+
this.docs.set(doc["@id"], doc);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const actorId = generateActorId();
|
|
23
|
+
describe("ListApplicationService", () => {
|
|
24
|
+
test("createList returns a valid AlistigoDocument", async () => {
|
|
25
|
+
const store = new InMemoryStore();
|
|
26
|
+
const service = new ListApplicationService(store);
|
|
27
|
+
const listId = generateListId();
|
|
28
|
+
const result = await service.createList(actorId, "My List", listId);
|
|
29
|
+
expect(result.ok).toBe(true);
|
|
30
|
+
if (!result.ok)
|
|
31
|
+
return;
|
|
32
|
+
const doc = result.value;
|
|
33
|
+
expect(doc["@type"]).toBe("ItemList");
|
|
34
|
+
expect(doc["@id"]).toBe(listId.toString());
|
|
35
|
+
expect(doc.name).toBe("My List");
|
|
36
|
+
expect(doc.itemListElement).toHaveLength(0);
|
|
37
|
+
expect(doc["alistigo:eventLog"]).toHaveLength(1);
|
|
38
|
+
expect(doc["alistigo:eventLog"][0]?.["alistigo:eventType"]).toBe("ListCreated");
|
|
39
|
+
});
|
|
40
|
+
test("createList generates a listId when none is provided", async () => {
|
|
41
|
+
const store = new InMemoryStore();
|
|
42
|
+
const service = new ListApplicationService(store);
|
|
43
|
+
const result = await service.createList(actorId);
|
|
44
|
+
expect(result.ok).toBe(true);
|
|
45
|
+
if (!result.ok)
|
|
46
|
+
return;
|
|
47
|
+
expect(result.value["@id"]).toMatch(/^lst_/);
|
|
48
|
+
});
|
|
49
|
+
// fallow-ignore-next-line complexity
|
|
50
|
+
test("addListElement appends an element and grows the event log", async () => {
|
|
51
|
+
const store = new InMemoryStore();
|
|
52
|
+
const service = new ListApplicationService(store);
|
|
53
|
+
const listId = generateListId();
|
|
54
|
+
await service.createList(actorId, undefined, listId);
|
|
55
|
+
const result = await service.addListElement(listId, "Buy bread", actorId);
|
|
56
|
+
expect(result.ok).toBe(true);
|
|
57
|
+
if (!result.ok)
|
|
58
|
+
return;
|
|
59
|
+
const doc = result.value;
|
|
60
|
+
expect(doc.itemListElement).toHaveLength(1);
|
|
61
|
+
expect(doc.itemListElement[0]?.name).toBe("Buy bread");
|
|
62
|
+
expect(doc.itemListElement[0]?.position).toBe(1);
|
|
63
|
+
expect(doc["alistigo:eventLog"]).toHaveLength(2); // ListCreated + ListElementAdded
|
|
64
|
+
expect(doc["alistigo:eventLog"][1]?.["alistigo:eventType"]).toBe("ListElementAdded");
|
|
65
|
+
});
|
|
66
|
+
test("addListElement persists so a subsequent load sees the element", async () => {
|
|
67
|
+
const store = new InMemoryStore();
|
|
68
|
+
const service = new ListApplicationService(store);
|
|
69
|
+
const listId = generateListId();
|
|
70
|
+
await service.createList(actorId, undefined, listId);
|
|
71
|
+
await service.addListElement(listId, "Buy bread", actorId);
|
|
72
|
+
const loaded = await store.load(listId);
|
|
73
|
+
if (loaded == null)
|
|
74
|
+
throw new Error("expected list to be loaded");
|
|
75
|
+
expect(loaded.elements).toHaveLength(1);
|
|
76
|
+
expect(String(loaded.elements[0]?.content)).toBe("Buy bread");
|
|
77
|
+
});
|
|
78
|
+
test("deleteListElement removes the element from the document", async () => {
|
|
79
|
+
const store = new InMemoryStore();
|
|
80
|
+
const service = new ListApplicationService(store);
|
|
81
|
+
const listId = generateListId();
|
|
82
|
+
await service.createList(actorId, undefined, listId);
|
|
83
|
+
const addResult = await service.addListElement(listId, "Buy bread", actorId);
|
|
84
|
+
expect(addResult.ok).toBe(true);
|
|
85
|
+
if (!addResult.ok)
|
|
86
|
+
return;
|
|
87
|
+
const firstItem = addResult.value.itemListElement[0];
|
|
88
|
+
if (firstItem == null)
|
|
89
|
+
throw new Error("expected first item");
|
|
90
|
+
const elementId = parseListElementId(firstItem["alistigo:listElementId"]);
|
|
91
|
+
const deleteResult = await service.deleteListElement(listId, elementId, actorId);
|
|
92
|
+
expect(deleteResult.ok).toBe(true);
|
|
93
|
+
if (!deleteResult.ok)
|
|
94
|
+
return;
|
|
95
|
+
expect(deleteResult.value.itemListElement).toHaveLength(0);
|
|
96
|
+
expect(deleteResult.value["alistigo:eventLog"]).toHaveLength(3); // Created + Added + Deleted
|
|
97
|
+
});
|
|
98
|
+
test("loadDocument is read-only and adds no events", async () => {
|
|
99
|
+
const store = new InMemoryStore();
|
|
100
|
+
const service = new ListApplicationService(store);
|
|
101
|
+
const listId = generateListId();
|
|
102
|
+
await service.createList(actorId, undefined, listId);
|
|
103
|
+
const doc = await service.loadDocument(listId);
|
|
104
|
+
if (doc == null)
|
|
105
|
+
throw new Error("expected doc to be defined");
|
|
106
|
+
expect(doc["alistigo:eventLog"]).toHaveLength(1); // still just ListCreated
|
|
107
|
+
});
|
|
108
|
+
test("loadDocument returns undefined for an unknown listId", async () => {
|
|
109
|
+
const service = new ListApplicationService(new InMemoryStore());
|
|
110
|
+
const doc = await service.loadDocument(generateListId());
|
|
111
|
+
expect(doc).toBeUndefined();
|
|
112
|
+
});
|
|
113
|
+
test("exportListDocument emits a ListExported audit event", async () => {
|
|
114
|
+
const store = new InMemoryStore();
|
|
115
|
+
const service = new ListApplicationService(store);
|
|
116
|
+
const listId = generateListId();
|
|
117
|
+
await service.createList(actorId, undefined, listId);
|
|
118
|
+
const result = await service.exportListDocument(listId, actorId);
|
|
119
|
+
expect(result.ok).toBe(true);
|
|
120
|
+
if (!result.ok)
|
|
121
|
+
return;
|
|
122
|
+
const lastEvent = result.value["alistigo:eventLog"].at(-1);
|
|
123
|
+
expect(lastEvent?.["alistigo:eventType"]).toBe("ListExported");
|
|
124
|
+
// Export is audit-only — no element changes
|
|
125
|
+
expect(result.value.itemListElement).toHaveLength(0);
|
|
126
|
+
});
|
|
127
|
+
test("addListElement on unknown listId returns err", async () => {
|
|
128
|
+
const service = new ListApplicationService(new InMemoryStore());
|
|
129
|
+
const result = await service.addListElement(generateListId(), "Buy bread", actorId);
|
|
130
|
+
expect(result.ok).toBe(false);
|
|
131
|
+
});
|
|
132
|
+
test("addListElement with empty content returns err", async () => {
|
|
133
|
+
const store = new InMemoryStore();
|
|
134
|
+
const service = new ListApplicationService(store);
|
|
135
|
+
const listId = generateListId();
|
|
136
|
+
await service.createList(actorId, undefined, listId);
|
|
137
|
+
const result = await service.addListElement(listId, " ", actorId);
|
|
138
|
+
expect(result.ok).toBe(false);
|
|
139
|
+
});
|
|
140
|
+
test("deleteListElement on unknown element returns err", async () => {
|
|
141
|
+
const store = new InMemoryStore();
|
|
142
|
+
const service = new ListApplicationService(store);
|
|
143
|
+
const listId = generateListId();
|
|
144
|
+
await service.createList(actorId, undefined, listId);
|
|
145
|
+
const unknownElementId = parseListElementId(generateListId().toString().replace("lst_", "lse_"));
|
|
146
|
+
const result = await service.deleteListElement(listId, unknownElementId, actorId);
|
|
147
|
+
expect(result.ok).toBe(false);
|
|
148
|
+
});
|
|
149
|
+
test("round-trip: serialize/deserialize preserves state across reloads", async () => {
|
|
150
|
+
const store = new InMemoryStore();
|
|
151
|
+
const service = new ListApplicationService(store);
|
|
152
|
+
const listId = generateListId();
|
|
153
|
+
await service.createList(actorId, "Shopping", listId);
|
|
154
|
+
await service.addListElement(listId, "Apples", actorId);
|
|
155
|
+
await service.addListElement(listId, "Bananas", actorId);
|
|
156
|
+
const doc = await service.loadDocument(listId);
|
|
157
|
+
if (doc == null)
|
|
158
|
+
throw new Error("expected doc to be defined");
|
|
159
|
+
expect(doc.itemListElement.map((i) => i.name)).toEqual(["Apples", "Bananas"]);
|
|
160
|
+
expect(doc.name).toBe("Shopping");
|
|
161
|
+
expect(doc["alistigo:eventLog"]).toHaveLength(3); // Created + 2 Added
|
|
162
|
+
});
|
|
163
|
+
// fallow-ignore-next-line complexity
|
|
164
|
+
test("applyAiInitialInput: groceries list — title and items parsed correctly", async () => {
|
|
165
|
+
const store = new InMemoryStore();
|
|
166
|
+
const service = new ListApplicationService(store);
|
|
167
|
+
const markdown = "Groceries:\n- Buy bread\n- Buy milk\n- Buy eggs";
|
|
168
|
+
const result = await service.applyAiInitialInput(markdown, actorId);
|
|
169
|
+
expect(result.ok).toBe(true);
|
|
170
|
+
if (!result.ok)
|
|
171
|
+
return;
|
|
172
|
+
const doc = result.value;
|
|
173
|
+
expect(doc["@type"]).toBe("ItemList");
|
|
174
|
+
expect(doc.name).toBe("Groceries");
|
|
175
|
+
expect(doc.itemListElement).toHaveLength(3);
|
|
176
|
+
expect(doc.itemListElement[0]?.name).toBe("Buy bread");
|
|
177
|
+
expect(doc.itemListElement[1]?.name).toBe("Buy milk");
|
|
178
|
+
expect(doc.itemListElement[2]?.name).toBe("Buy eggs");
|
|
179
|
+
expect(doc["alistigo:eventLog"]).toHaveLength(4); // Created + 3 Added
|
|
180
|
+
});
|
|
181
|
+
test("applyAiInitialInput: items only — no title, no name on doc", async () => {
|
|
182
|
+
const store = new InMemoryStore();
|
|
183
|
+
const service = new ListApplicationService(store);
|
|
184
|
+
const markdown = "- Item one\n- Item two\n- Item three";
|
|
185
|
+
const result = await service.applyAiInitialInput(markdown, actorId);
|
|
186
|
+
expect(result.ok).toBe(true);
|
|
187
|
+
if (!result.ok)
|
|
188
|
+
return;
|
|
189
|
+
expect(result.value.name).toBeUndefined();
|
|
190
|
+
expect(result.value.itemListElement.map((i) => i.name)).toEqual([
|
|
191
|
+
"Item one",
|
|
192
|
+
"Item two",
|
|
193
|
+
"Item three",
|
|
194
|
+
]);
|
|
195
|
+
});
|
|
196
|
+
test("applyAiInitialInput: ordered list markers are supported", async () => {
|
|
197
|
+
const store = new InMemoryStore();
|
|
198
|
+
const service = new ListApplicationService(store);
|
|
199
|
+
const markdown = "Steps:\n1. First step\n2. Second step\n3. Third step";
|
|
200
|
+
const result = await service.applyAiInitialInput(markdown, actorId);
|
|
201
|
+
expect(result.ok).toBe(true);
|
|
202
|
+
if (!result.ok)
|
|
203
|
+
return;
|
|
204
|
+
expect(result.value.name).toBe("Steps");
|
|
205
|
+
expect(result.value.itemListElement.map((i) => i.name)).toEqual([
|
|
206
|
+
"First step",
|
|
207
|
+
"Second step",
|
|
208
|
+
"Third step",
|
|
209
|
+
]);
|
|
210
|
+
});
|
|
211
|
+
test("applyAiInitialInput: asterisk list markers are supported", async () => {
|
|
212
|
+
const store = new InMemoryStore();
|
|
213
|
+
const service = new ListApplicationService(store);
|
|
214
|
+
const markdown = "Shopping:\n* Apples\n* Bananas";
|
|
215
|
+
const result = await service.applyAiInitialInput(markdown, actorId);
|
|
216
|
+
expect(result.ok).toBe(true);
|
|
217
|
+
if (!result.ok)
|
|
218
|
+
return;
|
|
219
|
+
expect(result.value.name).toBe("Shopping");
|
|
220
|
+
expect(result.value.itemListElement.map((i) => i.name)).toEqual(["Apples", "Bananas"]);
|
|
221
|
+
});
|
|
222
|
+
test("applyAiInitialInput: title-only markdown creates an empty list", async () => {
|
|
223
|
+
const store = new InMemoryStore();
|
|
224
|
+
const service = new ListApplicationService(store);
|
|
225
|
+
const markdown = "Empty list:";
|
|
226
|
+
const result = await service.applyAiInitialInput(markdown, actorId);
|
|
227
|
+
expect(result.ok).toBe(true);
|
|
228
|
+
if (!result.ok)
|
|
229
|
+
return;
|
|
230
|
+
expect(result.value.name).toBe("Empty list");
|
|
231
|
+
expect(result.value.itemListElement).toHaveLength(0);
|
|
232
|
+
});
|
|
233
|
+
test("applyAiInitialInput: duplicates are preserved", async () => {
|
|
234
|
+
const store = new InMemoryStore();
|
|
235
|
+
const service = new ListApplicationService(store);
|
|
236
|
+
const markdown = "Duplicates allowed:\n- Buy bread\n- Buy bread\n- Buy milk";
|
|
237
|
+
const result = await service.applyAiInitialInput(markdown, actorId);
|
|
238
|
+
expect(result.ok).toBe(true);
|
|
239
|
+
if (!result.ok)
|
|
240
|
+
return;
|
|
241
|
+
expect(result.value.itemListElement).toHaveLength(3);
|
|
242
|
+
expect(result.value.itemListElement[0]?.name).toBe("Buy bread");
|
|
243
|
+
expect(result.value.itemListElement[1]?.name).toBe("Buy bread");
|
|
244
|
+
});
|
|
245
|
+
test("applyAiInitialInput: persists so subsequent load sees all elements", async () => {
|
|
246
|
+
const store = new InMemoryStore();
|
|
247
|
+
const service = new ListApplicationService(store);
|
|
248
|
+
const markdown = "My List:\n- Alpha\n- Beta";
|
|
249
|
+
const listId = generateListId();
|
|
250
|
+
await service.applyAiInitialInput(markdown, actorId, listId);
|
|
251
|
+
const loaded = await store.load(listId);
|
|
252
|
+
if (loaded == null)
|
|
253
|
+
throw new Error("expected list to be loaded");
|
|
254
|
+
expect(loaded.elements).toHaveLength(2);
|
|
255
|
+
expect(String(loaded.elements[0]?.content)).toBe("Alpha");
|
|
256
|
+
expect(String(loaded.elements[1]?.content)).toBe("Beta");
|
|
257
|
+
});
|
|
258
|
+
test("applyAiInitialInput: uses provided listId", async () => {
|
|
259
|
+
const store = new InMemoryStore();
|
|
260
|
+
const service = new ListApplicationService(store);
|
|
261
|
+
const listId = generateListId();
|
|
262
|
+
const markdown = "List:\n- Item";
|
|
263
|
+
const result = await service.applyAiInitialInput(markdown, actorId, listId);
|
|
264
|
+
expect(result.ok).toBe(true);
|
|
265
|
+
if (!result.ok)
|
|
266
|
+
return;
|
|
267
|
+
expect(result.value["@id"]).toBe(listId.toString());
|
|
268
|
+
});
|
|
269
|
+
test("applyAiInitialInput: bullet with no text is silently ignored (empty list created)", async () => {
|
|
270
|
+
const store = new InMemoryStore();
|
|
271
|
+
const service = new ListApplicationService(store);
|
|
272
|
+
const markdown = "List:\n- ";
|
|
273
|
+
const result = await service.applyAiInitialInput(markdown, actorId);
|
|
274
|
+
expect(result.ok).toBe(true);
|
|
275
|
+
if (!result.ok)
|
|
276
|
+
return;
|
|
277
|
+
expect(result.value.name).toBe("List");
|
|
278
|
+
expect(result.value.itemListElement).toHaveLength(0);
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
//# sourceMappingURL=list-application-service.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-application-service.test.js","sourceRoot":"","sources":["../../../src/application/__tests__/list-application-service.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ActorId, ListElementId, ListId, ListRepository } from "@alistigo/list-domain";
|
|
2
|
+
import { ListError } from "@alistigo/list-domain";
|
|
3
|
+
import { type Result } from "../result.js";
|
|
4
|
+
import type { AlistigoDocument } from "../types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Extended repository interface that adds raw-document access on top of the
|
|
7
|
+
* standard ListRepository port. Infrastructure implementations (e.g.
|
|
8
|
+
* LocalStorageListRepository) must implement all three methods.
|
|
9
|
+
*/
|
|
10
|
+
export interface AlistigoListStore extends ListRepository {
|
|
11
|
+
loadDocument(id: ListId): Promise<AlistigoDocument | undefined>;
|
|
12
|
+
/**
|
|
13
|
+
* Persists a fully-formed document directly, bypassing the domain layer.
|
|
14
|
+
* Use when a mutation (e.g. a plugin command) is applied at the document
|
|
15
|
+
* level rather than through the aggregate.
|
|
16
|
+
*/
|
|
17
|
+
saveDocument(doc: AlistigoDocument): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Application service for the Core List context.
|
|
21
|
+
*
|
|
22
|
+
* Orchestrates commands through the List aggregate, persists via
|
|
23
|
+
* AlistigoListStore, and returns AlistigoDocument on success or a typed
|
|
24
|
+
* ListError on failure.
|
|
25
|
+
*/
|
|
26
|
+
export declare class ListApplicationService {
|
|
27
|
+
#private;
|
|
28
|
+
private readonly store;
|
|
29
|
+
constructor(store: AlistigoListStore);
|
|
30
|
+
/**
|
|
31
|
+
* Creates a new list and persists it.
|
|
32
|
+
* Returns the initial AlistigoDocument on success.
|
|
33
|
+
*/
|
|
34
|
+
createList(actorId: ActorId, title?: string, listId?: ListId): Promise<Result<AlistigoDocument, ListError>>;
|
|
35
|
+
/**
|
|
36
|
+
* Appends a new element to the list identified by listId.
|
|
37
|
+
* Returns the updated AlistigoDocument on success.
|
|
38
|
+
*/
|
|
39
|
+
addListElement(listId: ListId, content: string, actorId: ActorId): Promise<Result<AlistigoDocument, ListError>>;
|
|
40
|
+
/**
|
|
41
|
+
* Removes a list element by its stable ListElementId.
|
|
42
|
+
* Returns the updated AlistigoDocument on success.
|
|
43
|
+
*/
|
|
44
|
+
deleteListElement(listId: ListId, listElementId: ListElementId, actorId: ActorId): Promise<Result<AlistigoDocument, ListError>>;
|
|
45
|
+
/**
|
|
46
|
+
* Read-only: returns the persisted AlistigoDocument for display or export.
|
|
47
|
+
*/
|
|
48
|
+
loadDocument(listId: ListId): Promise<AlistigoDocument | undefined>;
|
|
49
|
+
/**
|
|
50
|
+
* Emits a ListExported audit event and returns the document.
|
|
51
|
+
*/
|
|
52
|
+
exportListDocument(listId: ListId, actorId: ActorId): Promise<Result<AlistigoDocument, ListError>>;
|
|
53
|
+
/**
|
|
54
|
+
* Bootstraps a list from an AiInitialInput markdown block.
|
|
55
|
+
* Parses title and items, creates the aggregate, persists it, and returns the document.
|
|
56
|
+
*/
|
|
57
|
+
applyAiInitialInput(markdown: string, actorId: ActorId, listId?: ListId): Promise<Result<AlistigoDocument, ListError>>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=list-application-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-application-service.d.ts","sourceRoot":"","sources":["../../src/application/list-application-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAKL,SAAS,EACV,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD;;;;GAIG;AACH,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAChE;;;;OAIG;IACH,YAAY,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED;;;;;;GAMG;AACH,qBAAa,sBAAsB;;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,iBAAiB;IAErD;;;OAGG;IAEG,UAAU,CACd,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAgB/C;;;OAGG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAc/C;;;OAGG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAgB/C;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAIzE;;OAEG;IACG,kBAAkB,CACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAY/C;;;OAGG;IAEG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;CAmChD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { createListElementContent, generateListId, List, ListElementNotFoundError, ListError, } from "@alistigo/list-domain";
|
|
2
|
+
import { createLogger } from "@alistigo/logger";
|
|
3
|
+
import { parseListMarkdown } from "../markdown/list-markdown.js";
|
|
4
|
+
import { err, ok } from "../result.js";
|
|
5
|
+
const log = createLogger("alistigo:service");
|
|
6
|
+
/**
|
|
7
|
+
* Application service for the Core List context.
|
|
8
|
+
*
|
|
9
|
+
* Orchestrates commands through the List aggregate, persists via
|
|
10
|
+
* AlistigoListStore, and returns AlistigoDocument on success or a typed
|
|
11
|
+
* ListError on failure.
|
|
12
|
+
*/
|
|
13
|
+
export class ListApplicationService {
|
|
14
|
+
store;
|
|
15
|
+
constructor(store) {
|
|
16
|
+
this.store = store;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Creates a new list and persists it.
|
|
20
|
+
* Returns the initial AlistigoDocument on success.
|
|
21
|
+
*/
|
|
22
|
+
// fallow-ignore-next-line complexity
|
|
23
|
+
async createList(actorId, title, listId) {
|
|
24
|
+
try {
|
|
25
|
+
const resolvedListId = listId ?? generateListId();
|
|
26
|
+
log.debug({ listId: resolvedListId.toString(), title }, "createList");
|
|
27
|
+
const { list } = List.create({
|
|
28
|
+
actorId,
|
|
29
|
+
listId: resolvedListId,
|
|
30
|
+
...(title !== undefined ? { title } : {}),
|
|
31
|
+
});
|
|
32
|
+
return await this.#saveAndReturn(list, resolvedListId);
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
if (e instanceof ListError)
|
|
36
|
+
return err(e);
|
|
37
|
+
throw e;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Appends a new element to the list identified by listId.
|
|
42
|
+
* Returns the updated AlistigoDocument on success.
|
|
43
|
+
*/
|
|
44
|
+
async addListElement(listId, content, actorId) {
|
|
45
|
+
try {
|
|
46
|
+
log.debug({ listId: listId.toString(), content }, "addListElement");
|
|
47
|
+
const list = await this.store.load(listId);
|
|
48
|
+
if (!list)
|
|
49
|
+
return err(new ListElementNotFoundError(listId.toString()));
|
|
50
|
+
const listContent = createListElementContent(content);
|
|
51
|
+
list.addListElement({ actorId, listId, content: listContent });
|
|
52
|
+
return await this.#saveAndReturn(list, listId);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
if (e instanceof ListError)
|
|
56
|
+
return err(e);
|
|
57
|
+
throw e;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Removes a list element by its stable ListElementId.
|
|
62
|
+
* Returns the updated AlistigoDocument on success.
|
|
63
|
+
*/
|
|
64
|
+
async deleteListElement(listId, listElementId, actorId) {
|
|
65
|
+
try {
|
|
66
|
+
log.debug({ listId: listId.toString(), elementId: listElementId.toString() }, "deleteListElement");
|
|
67
|
+
const list = await this.store.load(listId);
|
|
68
|
+
if (!list)
|
|
69
|
+
return err(new ListElementNotFoundError(listId.toString()));
|
|
70
|
+
list.deleteListElement({ actorId, listId, listElementId });
|
|
71
|
+
return await this.#saveAndReturn(list, listId);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
if (e instanceof ListError)
|
|
75
|
+
return err(e);
|
|
76
|
+
throw e;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Read-only: returns the persisted AlistigoDocument for display or export.
|
|
81
|
+
*/
|
|
82
|
+
async loadDocument(listId) {
|
|
83
|
+
return this.store.loadDocument(listId);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Emits a ListExported audit event and returns the document.
|
|
87
|
+
*/
|
|
88
|
+
async exportListDocument(listId, actorId) {
|
|
89
|
+
try {
|
|
90
|
+
const list = await this.store.load(listId);
|
|
91
|
+
if (!list)
|
|
92
|
+
return err(new ListElementNotFoundError(listId.toString()));
|
|
93
|
+
list.exportListDocument({ actorId, listId });
|
|
94
|
+
return await this.#saveAndReturn(list, listId);
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
if (e instanceof ListError)
|
|
98
|
+
return err(e);
|
|
99
|
+
throw e;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Bootstraps a list from an AiInitialInput markdown block.
|
|
104
|
+
* Parses title and items, creates the aggregate, persists it, and returns the document.
|
|
105
|
+
*/
|
|
106
|
+
// fallow-ignore-next-line complexity
|
|
107
|
+
async applyAiInitialInput(markdown, actorId, listId) {
|
|
108
|
+
try {
|
|
109
|
+
const { title, items } = parseListMarkdown(markdown);
|
|
110
|
+
const resolvedListId = listId ?? generateListId();
|
|
111
|
+
log.debug({ listId: resolvedListId.toString(), itemCount: items.length }, "applyAiInitialInput");
|
|
112
|
+
const { list } = List.create({
|
|
113
|
+
actorId,
|
|
114
|
+
listId: resolvedListId,
|
|
115
|
+
...(title !== undefined ? { title } : {}),
|
|
116
|
+
});
|
|
117
|
+
for (const item of items) {
|
|
118
|
+
const content = createListElementContent(item);
|
|
119
|
+
list.addListElement({ actorId, listId: resolvedListId, content });
|
|
120
|
+
}
|
|
121
|
+
return await this.#saveAndReturn(list, resolvedListId);
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
if (e instanceof ListError)
|
|
125
|
+
return err(e);
|
|
126
|
+
throw e;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async #saveAndReturn(list, listId) {
|
|
130
|
+
await this.store.save(list);
|
|
131
|
+
list.markEventsAsCommitted();
|
|
132
|
+
const doc = await this.store.loadDocument(listId);
|
|
133
|
+
log.debug({ listId: listId.toString(), elementCount: doc?.itemListElement.length }, "document saved");
|
|
134
|
+
// biome-ignore lint/style/noNonNullAssertion: just saved, must exist
|
|
135
|
+
return ok(doc);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=list-application-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-application-service.js","sourceRoot":"","sources":["../../src/application/list-application-service.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
export { buildListDocumentFromMarkdown, isValidListMarkdown, type MarkdownParseResult, parseListMarkdown, } from "./markdown/list-markdown.js";
|
|
2
|
+
export { type AlistigoItemAttribution, type AlistigoProjection, type AlistigoProjectionItem, buildAttributionMap, buildProjection, } from "./projection.js";
|
|
3
|
+
export { ListDocumentSerializer } from "./serializer/list-document-serializer.js";
|
|
4
|
+
export * from "./types.js";
|
|
5
|
+
export { validateDocument } from "./validate.js";
|
|
6
|
+
export declare const documentSchema: {
|
|
7
|
+
$schema: string;
|
|
8
|
+
$id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
description: string;
|
|
11
|
+
type: string;
|
|
12
|
+
allOf: {
|
|
13
|
+
$ref: string;
|
|
14
|
+
}[];
|
|
15
|
+
required: string[];
|
|
16
|
+
properties: {
|
|
17
|
+
"@context": {
|
|
18
|
+
type: string;
|
|
19
|
+
required: string[];
|
|
20
|
+
properties: {
|
|
21
|
+
"@vocab": {
|
|
22
|
+
type: string;
|
|
23
|
+
const: string;
|
|
24
|
+
};
|
|
25
|
+
alistigo: {
|
|
26
|
+
type: string;
|
|
27
|
+
const: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
"@type": {
|
|
32
|
+
type: string;
|
|
33
|
+
const: string;
|
|
34
|
+
};
|
|
35
|
+
"@id": {
|
|
36
|
+
type: string;
|
|
37
|
+
pattern: string;
|
|
38
|
+
};
|
|
39
|
+
name: {
|
|
40
|
+
type: string;
|
|
41
|
+
};
|
|
42
|
+
itemListElement: {
|
|
43
|
+
type: string;
|
|
44
|
+
items: {
|
|
45
|
+
$ref: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
"alistigo:eventLog": {
|
|
49
|
+
type: string;
|
|
50
|
+
items: {
|
|
51
|
+
$ref: string;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
$defs: {
|
|
56
|
+
Reference: {
|
|
57
|
+
type: string;
|
|
58
|
+
required: string[];
|
|
59
|
+
properties: {
|
|
60
|
+
"@id": {
|
|
61
|
+
type: string;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
ListItem: {
|
|
66
|
+
allOf: ({
|
|
67
|
+
$ref: string;
|
|
68
|
+
type?: never;
|
|
69
|
+
required?: never;
|
|
70
|
+
properties?: never;
|
|
71
|
+
} | {
|
|
72
|
+
type: string;
|
|
73
|
+
required: string[];
|
|
74
|
+
properties: {
|
|
75
|
+
"@type": {
|
|
76
|
+
type: string;
|
|
77
|
+
const: string;
|
|
78
|
+
};
|
|
79
|
+
"alistigo:listElementId": {
|
|
80
|
+
type: string;
|
|
81
|
+
pattern: string;
|
|
82
|
+
};
|
|
83
|
+
position: {
|
|
84
|
+
type: string;
|
|
85
|
+
minimum: number;
|
|
86
|
+
};
|
|
87
|
+
name: {
|
|
88
|
+
type: string;
|
|
89
|
+
minLength: number;
|
|
90
|
+
};
|
|
91
|
+
"alistigo:metadatas": {
|
|
92
|
+
type: string;
|
|
93
|
+
additionalProperties: {
|
|
94
|
+
type: string;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
$ref?: never;
|
|
99
|
+
})[];
|
|
100
|
+
};
|
|
101
|
+
ListEventRecord: {
|
|
102
|
+
type: string;
|
|
103
|
+
required: string[];
|
|
104
|
+
properties: {
|
|
105
|
+
"@id": {
|
|
106
|
+
type: string;
|
|
107
|
+
};
|
|
108
|
+
"alistigo:eventType": {
|
|
109
|
+
type: string;
|
|
110
|
+
enum: string[];
|
|
111
|
+
};
|
|
112
|
+
list: {
|
|
113
|
+
$ref: string;
|
|
114
|
+
};
|
|
115
|
+
agent: {
|
|
116
|
+
$ref: string;
|
|
117
|
+
};
|
|
118
|
+
startTime: {
|
|
119
|
+
type: string;
|
|
120
|
+
format: string;
|
|
121
|
+
};
|
|
122
|
+
listItem: {
|
|
123
|
+
$ref: string;
|
|
124
|
+
};
|
|
125
|
+
checked: {
|
|
126
|
+
type: string;
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
export { type AlistigoListStore, ListApplicationService, } from "./application/list-application-service.js";
|
|
133
|
+
export { type ListProjection, ListProjector, projectList, } from "./projector/list-projector.js";
|
|
134
|
+
export { err, ok, type Result } from "./result.js";
|
|
135
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,mBAAmB,EACnB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAqB,CAAC;AAEjD,OAAO,EACL,KAAK,iBAAiB,EACtB,sBAAsB,GACvB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,KAAK,cAAc,EACnB,aAAa,EACb,WAAW,GACZ,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC"}
|