@alistigo/domain 0.2.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.
Files changed (107) hide show
  1. package/README.md +15 -0
  2. package/dist/__tests__/list-aggregate.test.d.ts +2 -0
  3. package/dist/__tests__/list-aggregate.test.d.ts.map +1 -0
  4. package/dist/__tests__/list-aggregate.test.js +213 -0
  5. package/dist/__tests__/list-aggregate.test.js.map +1 -0
  6. package/dist/__tests__/value-objects.test.d.ts +2 -0
  7. package/dist/__tests__/value-objects.test.d.ts.map +1 -0
  8. package/dist/__tests__/value-objects.test.js +77 -0
  9. package/dist/__tests__/value-objects.test.js.map +1 -0
  10. package/dist/aggregates/list.d.ts +59 -0
  11. package/dist/aggregates/list.d.ts.map +1 -0
  12. package/dist/aggregates/list.js +157 -0
  13. package/dist/aggregates/list.js.map +1 -0
  14. package/dist/commands/actor-command.d.ts +6 -0
  15. package/dist/commands/actor-command.d.ts.map +1 -0
  16. package/dist/commands/actor-command.js +2 -0
  17. package/dist/commands/actor-command.js.map +1 -0
  18. package/dist/commands/actor-list-command.d.ts +7 -0
  19. package/dist/commands/actor-list-command.d.ts.map +1 -0
  20. package/dist/commands/actor-list-command.js +2 -0
  21. package/dist/commands/actor-list-command.js.map +1 -0
  22. package/dist/commands/add-list-element.d.ts +7 -0
  23. package/dist/commands/add-list-element.d.ts.map +1 -0
  24. package/dist/commands/add-list-element.js +2 -0
  25. package/dist/commands/add-list-element.js.map +1 -0
  26. package/dist/commands/create-list.d.ts +12 -0
  27. package/dist/commands/create-list.d.ts.map +1 -0
  28. package/dist/commands/create-list.js +2 -0
  29. package/dist/commands/create-list.js.map +1 -0
  30. package/dist/commands/delete-list-element.d.ts +7 -0
  31. package/dist/commands/delete-list-element.d.ts.map +1 -0
  32. package/dist/commands/delete-list-element.js +2 -0
  33. package/dist/commands/delete-list-element.js.map +1 -0
  34. package/dist/commands/export-list-document.d.ts +4 -0
  35. package/dist/commands/export-list-document.d.ts.map +1 -0
  36. package/dist/commands/export-list-document.js +2 -0
  37. package/dist/commands/export-list-document.js.map +1 -0
  38. package/dist/entities/list-element.d.ts +13 -0
  39. package/dist/entities/list-element.d.ts.map +1 -0
  40. package/dist/entities/list-element.js +2 -0
  41. package/dist/entities/list-element.js.map +1 -0
  42. package/dist/errors/list-error.d.ts +20 -0
  43. package/dist/errors/list-error.d.ts.map +1 -0
  44. package/dist/errors/list-error.js +32 -0
  45. package/dist/errors/list-error.js.map +1 -0
  46. package/dist/events/list-created.d.ts +2 -0
  47. package/dist/events/list-created.d.ts.map +1 -0
  48. package/dist/events/list-created.js +2 -0
  49. package/dist/events/list-created.js.map +1 -0
  50. package/dist/events/list-element-added.d.ts +2 -0
  51. package/dist/events/list-element-added.d.ts.map +1 -0
  52. package/dist/events/list-element-added.js +2 -0
  53. package/dist/events/list-element-added.js.map +1 -0
  54. package/dist/events/list-element-deleted.d.ts +2 -0
  55. package/dist/events/list-element-deleted.d.ts.map +1 -0
  56. package/dist/events/list-element-deleted.js +2 -0
  57. package/dist/events/list-element-deleted.js.map +1 -0
  58. package/dist/events/list-event.d.ts +32 -0
  59. package/dist/events/list-event.d.ts.map +1 -0
  60. package/dist/events/list-event.js +2 -0
  61. package/dist/events/list-event.js.map +1 -0
  62. package/dist/events/list-exported.d.ts +2 -0
  63. package/dist/events/list-exported.d.ts.map +1 -0
  64. package/dist/events/list-exported.js +2 -0
  65. package/dist/events/list-exported.js.map +1 -0
  66. package/dist/index.d.ts +27 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +13 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/package.json +24 -0
  71. package/dist/repositories/list-repository.d.ts +11 -0
  72. package/dist/repositories/list-repository.d.ts.map +1 -0
  73. package/dist/repositories/list-repository.js +2 -0
  74. package/dist/repositories/list-repository.js.map +1 -0
  75. package/dist/value-objects/actor-id.d.ts +5 -0
  76. package/dist/value-objects/actor-id.d.ts.map +1 -0
  77. package/dist/value-objects/actor-id.js +8 -0
  78. package/dist/value-objects/actor-id.js.map +1 -0
  79. package/dist/value-objects/actor.d.ts +9 -0
  80. package/dist/value-objects/actor.d.ts.map +1 -0
  81. package/dist/value-objects/actor.js +2 -0
  82. package/dist/value-objects/actor.js.map +1 -0
  83. package/dist/value-objects/list-element-content.d.ts +10 -0
  84. package/dist/value-objects/list-element-content.d.ts.map +1 -0
  85. package/dist/value-objects/list-element-content.js +17 -0
  86. package/dist/value-objects/list-element-content.js.map +1 -0
  87. package/dist/value-objects/list-element-id.d.ts +5 -0
  88. package/dist/value-objects/list-element-id.d.ts.map +1 -0
  89. package/dist/value-objects/list-element-id.js +8 -0
  90. package/dist/value-objects/list-element-id.js.map +1 -0
  91. package/dist/value-objects/list-event-id.d.ts +5 -0
  92. package/dist/value-objects/list-event-id.d.ts.map +1 -0
  93. package/dist/value-objects/list-event-id.js +8 -0
  94. package/dist/value-objects/list-event-id.js.map +1 -0
  95. package/dist/value-objects/list-id.d.ts +5 -0
  96. package/dist/value-objects/list-id.d.ts.map +1 -0
  97. package/dist/value-objects/list-id.js +8 -0
  98. package/dist/value-objects/list-id.js.map +1 -0
  99. package/dist/value-objects/schema-version.d.ts +6 -0
  100. package/dist/value-objects/schema-version.d.ts.map +1 -0
  101. package/dist/value-objects/schema-version.js +11 -0
  102. package/dist/value-objects/schema-version.js.map +1 -0
  103. package/dist/value-objects/timestamp.d.ts +11 -0
  104. package/dist/value-objects/timestamp.d.ts.map +1 -0
  105. package/dist/value-objects/timestamp.js +16 -0
  106. package/dist/value-objects/timestamp.js.map +1 -0
  107. package/package.json +23 -0
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # @alistigo/domain
2
+
3
+ > TODO: describe this package.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ pnpm add @alistigo/domain
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```ts
14
+ import {} from "@alistigo/domain";
15
+ ```
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list-aggregate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-aggregate.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/list-aggregate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,213 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { List } from "../aggregates/list.js";
3
+ import { ListElementNotFoundError, ListError } from "../errors/list-error.js";
4
+ import { generateActorId } from "../value-objects/actor-id.js";
5
+ import { createListElementContent } from "../value-objects/list-element-content.js";
6
+ import { generateListId } from "../value-objects/list-id.js";
7
+ // Helper: create a minimal actor id for tests
8
+ const actorId = generateActorId();
9
+ describe("List.create", () => {
10
+ it("creates a List with generated ListId when none provided", () => {
11
+ const { list, event } = List.create({ actorId });
12
+ expect(list.id).toBeDefined();
13
+ expect(list.id.getType()).toBe("lst");
14
+ expect(event.type).toBe("ListCreated");
15
+ expect(event.listId).toBe(list.id);
16
+ expect(event.actorId).toBe(actorId);
17
+ });
18
+ it("creates a List with the provided ListId", () => {
19
+ const listId = generateListId();
20
+ const { list, event } = List.create({ actorId, listId });
21
+ expect(list.id).toBe(listId);
22
+ expect(event.listId).toBe(listId);
23
+ });
24
+ it("creates a List with title when provided", () => {
25
+ const { list, event } = List.create({ actorId, title: "My List" });
26
+ expect(list.title).toBe("My List");
27
+ expect(event.title).toBe("My List");
28
+ });
29
+ it("creates a List with no title when none provided", () => {
30
+ const { list } = List.create({ actorId });
31
+ expect(list.title).toBeUndefined();
32
+ });
33
+ it("starts with an empty elements array", () => {
34
+ const { list } = List.create({ actorId });
35
+ expect(list.elements).toHaveLength(0);
36
+ });
37
+ it("has one uncommitted event after creation", () => {
38
+ const { list } = List.create({ actorId });
39
+ const events = list.getUncommittedEvents();
40
+ expect(events).toHaveLength(1);
41
+ expect(events[0]?.type).toBe("ListCreated");
42
+ });
43
+ });
44
+ describe("List.addListElement", () => {
45
+ it("appends a new element and emits ListElementAdded", () => {
46
+ const { list } = List.create({ actorId });
47
+ const content = createListElementContent("Buy milk");
48
+ const event = list.addListElement({ actorId, listId: list.id, content });
49
+ expect(event.type).toBe("ListElementAdded");
50
+ expect(event.content).toBe(content);
51
+ expect(event.listElementId.getType()).toBe("lse");
52
+ expect(list.elements).toHaveLength(1);
53
+ });
54
+ it("each element gets a unique ListElementId", () => {
55
+ const { list } = List.create({ actorId });
56
+ const content = createListElementContent("Item");
57
+ const e1 = list.addListElement({ actorId, listId: list.id, content });
58
+ const e2 = list.addListElement({ actorId, listId: list.id, content });
59
+ expect(e1.listElementId.toString()).not.toBe(e2.listElementId.toString());
60
+ });
61
+ it("allows duplicate content (identity is not content-based)", () => {
62
+ const { list } = List.create({ actorId });
63
+ const content = createListElementContent("Duplicate");
64
+ list.addListElement({ actorId, listId: list.id, content });
65
+ list.addListElement({ actorId, listId: list.id, content });
66
+ expect(list.elements).toHaveLength(2);
67
+ });
68
+ it("preserves insertion order", () => {
69
+ const { list } = List.create({ actorId });
70
+ const c1 = createListElementContent("First");
71
+ const c2 = createListElementContent("Second");
72
+ const c3 = createListElementContent("Third");
73
+ list.addListElement({ actorId, listId: list.id, content: c1 });
74
+ list.addListElement({ actorId, listId: list.id, content: c2 });
75
+ list.addListElement({ actorId, listId: list.id, content: c3 });
76
+ const elements = list.elements;
77
+ expect(elements[0]?.content).toBe("First");
78
+ expect(elements[1]?.content).toBe("Second");
79
+ expect(elements[2]?.content).toBe("Third");
80
+ });
81
+ it("records addedAt timestamp on the element", () => {
82
+ const { list } = List.create({ actorId });
83
+ const content = createListElementContent("Item");
84
+ const event = list.addListElement({ actorId, listId: list.id, content });
85
+ const element = list.elements[0];
86
+ expect(element?.addedAt).toBe(event.timestamp);
87
+ });
88
+ });
89
+ describe("List.deleteListElement", () => {
90
+ it("removes an element and emits ListElementDeleted", () => {
91
+ const { list } = List.create({ actorId });
92
+ const content = createListElementContent("To delete");
93
+ const addEvent = list.addListElement({ actorId, listId: list.id, content });
94
+ const deleteEvent = list.deleteListElement({
95
+ actorId,
96
+ listId: list.id,
97
+ listElementId: addEvent.listElementId,
98
+ });
99
+ expect(deleteEvent.type).toBe("ListElementDeleted");
100
+ expect(deleteEvent.listElementId).toBe(addEvent.listElementId);
101
+ expect(list.elements).toHaveLength(0);
102
+ });
103
+ it("throws ListElementNotFoundError when listElementId does not exist", () => {
104
+ const { list } = List.create({ actorId });
105
+ const foreignId = generateListId();
106
+ // Use a foreign TypeID cast as lse — the element simply won't exist
107
+ const { list: list2 } = List.create({ actorId });
108
+ const content = createListElementContent("Other");
109
+ const addEvent = list2.addListElement({ actorId, listId: list2.id, content });
110
+ // addEvent.listElementId is valid but belongs to list2, not list
111
+ expect(() => list.deleteListElement({
112
+ actorId,
113
+ listId: list.id,
114
+ listElementId: addEvent.listElementId,
115
+ })).toThrow(ListElementNotFoundError);
116
+ // foreignId is ListId type, suppress lint; test just verifies error type above
117
+ void foreignId;
118
+ });
119
+ it("does not allow reuse of a deleted ListElementId", () => {
120
+ const { list } = List.create({ actorId });
121
+ const content = createListElementContent("To delete");
122
+ const addEvent = list.addListElement({ actorId, listId: list.id, content });
123
+ list.deleteListElement({
124
+ actorId,
125
+ listId: list.id,
126
+ listElementId: addEvent.listElementId,
127
+ });
128
+ // Trying to delete the same element again should throw
129
+ expect(() => list.deleteListElement({
130
+ actorId,
131
+ listId: list.id,
132
+ listElementId: addEvent.listElementId,
133
+ })).toThrow(ListElementNotFoundError);
134
+ });
135
+ });
136
+ describe("List.exportListDocument", () => {
137
+ it("emits ListExported event with json-ld format", () => {
138
+ const { list } = List.create({ actorId });
139
+ const event = list.exportListDocument({ actorId, listId: list.id });
140
+ expect(event.type).toBe("ListExported");
141
+ expect(event.format).toBe("json-ld");
142
+ expect(event.actorId).toBe(actorId);
143
+ });
144
+ it("export is always valid even on an empty list", () => {
145
+ const { list } = List.create({ actorId });
146
+ expect(() => list.exportListDocument({ actorId, listId: list.id })).not.toThrow();
147
+ });
148
+ });
149
+ describe("List.getUncommittedEvents", () => {
150
+ it("tracks all events since creation", () => {
151
+ const { list } = List.create({ actorId });
152
+ const content = createListElementContent("Item");
153
+ const addEvent = list.addListElement({ actorId, listId: list.id, content });
154
+ list.deleteListElement({ actorId, listId: list.id, listElementId: addEvent.listElementId });
155
+ const events = list.getUncommittedEvents();
156
+ expect(events).toHaveLength(3); // ListCreated + ListElementAdded + ListElementDeleted
157
+ expect(events[0]?.type).toBe("ListCreated");
158
+ expect(events[1]?.type).toBe("ListElementAdded");
159
+ expect(events[2]?.type).toBe("ListElementDeleted");
160
+ });
161
+ it("clears after markEventsAsCommitted", () => {
162
+ const { list } = List.create({ actorId });
163
+ list.markEventsAsCommitted();
164
+ expect(list.getUncommittedEvents()).toHaveLength(0);
165
+ });
166
+ });
167
+ describe("List.rehydrate", () => {
168
+ it("reconstructs state from event log", () => {
169
+ const { list } = List.create({ actorId });
170
+ const content1 = createListElementContent("First");
171
+ const content2 = createListElementContent("Second");
172
+ const addEvent1 = list.addListElement({ actorId, listId: list.id, content: content1 });
173
+ list.addListElement({ actorId, listId: list.id, content: content2 });
174
+ list.deleteListElement({ actorId, listId: list.id, listElementId: addEvent1.listElementId });
175
+ const events = list.getUncommittedEvents();
176
+ const rehydrated = List.rehydrate(list.id, [...events]);
177
+ expect(rehydrated.elements).toHaveLength(1);
178
+ expect(rehydrated.elements[0]?.content).toBe("Second");
179
+ });
180
+ it("rehydrated list has no uncommitted events", () => {
181
+ const { list } = List.create({ actorId });
182
+ const events = list.getUncommittedEvents();
183
+ const rehydrated = List.rehydrate(list.id, [...events]);
184
+ expect(rehydrated.getUncommittedEvents()).toHaveLength(0);
185
+ });
186
+ it("rehydrates title from ListCreated event", () => {
187
+ const { list } = List.create({ actorId, title: "My List" });
188
+ const events = list.getUncommittedEvents();
189
+ const rehydrated = List.rehydrate(list.id, [...events]);
190
+ expect(rehydrated.title).toBe("My List");
191
+ });
192
+ it("ListExported is an audit-only event — no state change on rehydrate", () => {
193
+ const { list } = List.create({ actorId });
194
+ list.exportListDocument({ actorId, listId: list.id });
195
+ const events = list.getUncommittedEvents();
196
+ const rehydrated = List.rehydrate(list.id, [...events]);
197
+ expect(rehydrated.elements).toHaveLength(0);
198
+ });
199
+ });
200
+ describe("Errors", () => {
201
+ it("ListError is instanceof Error", () => {
202
+ const err = new ListError("test");
203
+ expect(err).toBeInstanceOf(Error);
204
+ expect(err).toBeInstanceOf(ListError);
205
+ expect(err.message).toBe("test");
206
+ });
207
+ it("ListElementNotFoundError is instanceof ListError", () => {
208
+ const err = new ListElementNotFoundError("lse_abc");
209
+ expect(err).toBeInstanceOf(ListError);
210
+ expect(err).toBeInstanceOf(ListElementNotFoundError);
211
+ });
212
+ });
213
+ //# sourceMappingURL=list-aggregate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-aggregate.test.js","sourceRoot":"","sources":["../../src/__tests__/list-aggregate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=value-objects.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-objects.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/value-objects.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { ListError } from "../errors/list-error.js";
3
+ import { parseActorId } from "../value-objects/actor-id.js";
4
+ import { createListElementContent } from "../value-objects/list-element-content.js";
5
+ import { parseListElementId } from "../value-objects/list-element-id.js";
6
+ import { parseListEventId } from "../value-objects/list-event-id.js";
7
+ import { parseListId } from "../value-objects/list-id.js";
8
+ import { CURRENT_SCHEMA_VERSION, createSchemaVersion } from "../value-objects/schema-version.js";
9
+ import { createTimestamp } from "../value-objects/timestamp.js";
10
+ describe("ListElementContent", () => {
11
+ it("accepts non-empty trimmed string", () => {
12
+ const content = createListElementContent("Buy milk");
13
+ expect(content).toBe("Buy milk");
14
+ });
15
+ it("trims surrounding whitespace", () => {
16
+ const content = createListElementContent(" Buy milk ");
17
+ expect(content).toBe("Buy milk");
18
+ });
19
+ it("throws ListError on empty string", () => {
20
+ expect(() => createListElementContent("")).toThrow(ListError);
21
+ });
22
+ it("throws ListError on whitespace-only string", () => {
23
+ expect(() => createListElementContent(" ")).toThrow(ListError);
24
+ });
25
+ it("throws ListError when exceeding 2000 characters", () => {
26
+ const long = "a".repeat(2001);
27
+ expect(() => createListElementContent(long)).toThrow(ListError);
28
+ });
29
+ it("accepts a string of exactly 2000 characters", () => {
30
+ const exact = "a".repeat(2000);
31
+ expect(() => createListElementContent(exact)).not.toThrow();
32
+ });
33
+ });
34
+ describe("Timestamp", () => {
35
+ it("accepts a valid ISO 8601 UTC string", () => {
36
+ const ts = createTimestamp("2026-05-14T10:00:00Z");
37
+ expect(ts).toBe("2026-05-14T10:00:00Z");
38
+ });
39
+ it("throws ListError on invalid date string", () => {
40
+ expect(() => createTimestamp("not-a-date")).toThrow(ListError);
41
+ });
42
+ });
43
+ describe("SchemaVersion", () => {
44
+ it("accepts a valid semver string", () => {
45
+ const v = createSchemaVersion("1.0.0");
46
+ expect(v).toBe("1.0.0");
47
+ });
48
+ it("throws ListError on non-semver string", () => {
49
+ expect(() => createSchemaVersion("1.0")).toThrow(ListError);
50
+ expect(() => createSchemaVersion("v1.0.0")).toThrow(ListError);
51
+ });
52
+ it("exports the correct M1 version", () => {
53
+ expect(CURRENT_SCHEMA_VERSION).toBe("1.0.0");
54
+ });
55
+ });
56
+ describe("TypeID value objects", () => {
57
+ it("parseListId parses a valid lst TypeID string", () => {
58
+ const id = parseListId("lst_00000000000000000000000001");
59
+ expect(id.getType()).toBe("lst");
60
+ });
61
+ it("parseListId throws on wrong prefix", () => {
62
+ expect(() => parseListId("lse_00000000000000000000000001")).toThrow();
63
+ });
64
+ it("parseListElementId parses a valid lse TypeID string", () => {
65
+ const id = parseListElementId("lse_00000000000000000000000001");
66
+ expect(id.getType()).toBe("lse");
67
+ });
68
+ it("parseListEventId parses a valid lev TypeID string", () => {
69
+ const id = parseListEventId("lev_00000000000000000000000001");
70
+ expect(id.getType()).toBe("lev");
71
+ });
72
+ it("parseActorId parses a valid act TypeID string", () => {
73
+ const id = parseActorId("act_00000000000000000000000001");
74
+ expect(id.getType()).toBe("act");
75
+ });
76
+ });
77
+ //# sourceMappingURL=value-objects.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-objects.test.js","sourceRoot":"","sources":["../../src/__tests__/value-objects.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { AddListElement } from "../commands/add-list-element.js";
2
+ import type { CreateList } from "../commands/create-list.js";
3
+ import type { DeleteListElement } from "../commands/delete-list-element.js";
4
+ import type { ExportListDocument } from "../commands/export-list-document.js";
5
+ import type { ListElement } from "../entities/list-element.js";
6
+ import type { ListCreated } from "../events/list-created.js";
7
+ import type { ListElementAdded } from "../events/list-element-added.js";
8
+ import type { ListElementDeleted } from "../events/list-element-deleted.js";
9
+ import type { ListEvent } from "../events/list-event.js";
10
+ import type { ListExported } from "../events/list-exported.js";
11
+ import type { ListId } from "../value-objects/list-id.js";
12
+ /**
13
+ * List aggregate root.
14
+ *
15
+ * - Private constructor: use List.create() or List.rehydrate().
16
+ * - All state changes flow through command handlers which emit events.
17
+ * - applyEvent() is the only method that mutates internal state.
18
+ */
19
+ export declare class List {
20
+ #private;
21
+ private constructor();
22
+ get id(): ListId;
23
+ get title(): string | undefined;
24
+ get elements(): ReadonlyArray<ListElement>;
25
+ /**
26
+ * Creates a new List aggregate and emits ListCreated.
27
+ * Generates a ListId if not provided in the command.
28
+ */
29
+ static create(cmd: CreateList): {
30
+ list: List;
31
+ event: ListCreated;
32
+ };
33
+ /**
34
+ * Reconstructs a List from its full event log.
35
+ * The resulting List has no uncommitted events.
36
+ */
37
+ static rehydrate(id: ListId, events: ListEvent[]): List;
38
+ /**
39
+ * Appends a new ListElement to the List.
40
+ * Invariant: content must be non-empty after trimming (enforced at ListElementContent creation).
41
+ */
42
+ addListElement(cmd: AddListElement): ListElementAdded;
43
+ /**
44
+ * Removes a ListElement from the List by its stable identity.
45
+ * Invariant: the ListElementId must exist in the current elements.
46
+ * Throws ListElementNotFoundError if not found.
47
+ */
48
+ deleteListElement(cmd: DeleteListElement): ListElementDeleted;
49
+ /**
50
+ * Emits a ListExported audit event.
51
+ * Export is always valid — no invariants to check.
52
+ */
53
+ exportListDocument(cmd: ExportListDocument): ListExported;
54
+ /** Returns all events emitted since the last load/save. */
55
+ getUncommittedEvents(): ReadonlyArray<ListEvent>;
56
+ /** Clears uncommitted events after they have been persisted. */
57
+ markEventsAsCommitted(): void;
58
+ }
59
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/aggregates/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAI1D;;;;;;GAMG;AACH,qBAAa,IAAI;;IAMf,OAAO;IAOP,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED,IAAI,QAAQ,IAAI,aAAa,CAAC,WAAW,CAAC,CAEzC;IAID;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,WAAW,CAAA;KAAE;IAoBlE;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI;IAUvD;;;OAGG;IACH,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,gBAAgB;IAkBrD;;;;OAIG;IACH,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,GAAG,kBAAkB;IAoB7D;;;OAGG;IACH,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,YAAY;IAiBzD,2DAA2D;IAC3D,oBAAoB,IAAI,aAAa,CAAC,SAAS,CAAC;IAIhD,gEAAgE;IAChE,qBAAqB,IAAI,IAAI;CA4B9B"}
@@ -0,0 +1,157 @@
1
+ import { ListElementNotFoundError } from "../errors/list-error.js";
2
+ import { generateListElementId } from "../value-objects/list-element-id.js";
3
+ import { generateListEventId } from "../value-objects/list-event-id.js";
4
+ import { generateListId } from "../value-objects/list-id.js";
5
+ import { nowTimestamp } from "../value-objects/timestamp.js";
6
+ /**
7
+ * List aggregate root.
8
+ *
9
+ * - Private constructor: use List.create() or List.rehydrate().
10
+ * - All state changes flow through command handlers which emit events.
11
+ * - applyEvent() is the only method that mutates internal state.
12
+ */
13
+ export class List {
14
+ #id;
15
+ #title;
16
+ #elements;
17
+ #uncommittedEvents;
18
+ constructor(id) {
19
+ this.#id = id;
20
+ this.#title = undefined;
21
+ this.#elements = new Map();
22
+ this.#uncommittedEvents = [];
23
+ }
24
+ get id() {
25
+ return this.#id;
26
+ }
27
+ get title() {
28
+ return this.#title;
29
+ }
30
+ get elements() {
31
+ return [...this.#elements.values()];
32
+ }
33
+ // ─────────────────────────────────────────────── Factory
34
+ /**
35
+ * Creates a new List aggregate and emits ListCreated.
36
+ * Generates a ListId if not provided in the command.
37
+ */
38
+ static create(cmd) {
39
+ const listId = cmd.listId ?? generateListId();
40
+ const list = new List(listId);
41
+ const event = {
42
+ type: "ListCreated",
43
+ listEventId: generateListEventId(),
44
+ listId,
45
+ actorId: cmd.actorId,
46
+ timestamp: nowTimestamp(),
47
+ ...(cmd.title !== undefined ? { title: cmd.title } : {}),
48
+ };
49
+ list.#applyEvent(event);
50
+ list.#uncommittedEvents.push(event);
51
+ return { list, event };
52
+ }
53
+ // ─────────────────────────────────────────────── Rehydration
54
+ /**
55
+ * Reconstructs a List from its full event log.
56
+ * The resulting List has no uncommitted events.
57
+ */
58
+ static rehydrate(id, events) {
59
+ const list = new List(id);
60
+ for (const event of events) {
61
+ list.#applyEvent(event);
62
+ }
63
+ return list;
64
+ }
65
+ // ─────────────────────────────────────────────── Command Handlers
66
+ /**
67
+ * Appends a new ListElement to the List.
68
+ * Invariant: content must be non-empty after trimming (enforced at ListElementContent creation).
69
+ */
70
+ addListElement(cmd) {
71
+ const listElementId = generateListElementId();
72
+ const event = {
73
+ type: "ListElementAdded",
74
+ listEventId: generateListEventId(),
75
+ listId: this.#id,
76
+ actorId: cmd.actorId,
77
+ timestamp: nowTimestamp(),
78
+ listElementId,
79
+ content: cmd.content,
80
+ };
81
+ this.#applyEvent(event);
82
+ this.#uncommittedEvents.push(event);
83
+ return event;
84
+ }
85
+ /**
86
+ * Removes a ListElement from the List by its stable identity.
87
+ * Invariant: the ListElementId must exist in the current elements.
88
+ * Throws ListElementNotFoundError if not found.
89
+ */
90
+ deleteListElement(cmd) {
91
+ const idStr = cmd.listElementId.toString();
92
+ if (!this.#elements.has(idStr)) {
93
+ throw new ListElementNotFoundError(idStr);
94
+ }
95
+ const event = {
96
+ type: "ListElementDeleted",
97
+ listEventId: generateListEventId(),
98
+ listId: this.#id,
99
+ actorId: cmd.actorId,
100
+ timestamp: nowTimestamp(),
101
+ listElementId: cmd.listElementId,
102
+ };
103
+ this.#applyEvent(event);
104
+ this.#uncommittedEvents.push(event);
105
+ return event;
106
+ }
107
+ /**
108
+ * Emits a ListExported audit event.
109
+ * Export is always valid — no invariants to check.
110
+ */
111
+ exportListDocument(cmd) {
112
+ const event = {
113
+ type: "ListExported",
114
+ listEventId: generateListEventId(),
115
+ listId: this.#id,
116
+ actorId: cmd.actorId,
117
+ timestamp: nowTimestamp(),
118
+ format: "json-ld",
119
+ };
120
+ this.#applyEvent(event);
121
+ this.#uncommittedEvents.push(event);
122
+ return event;
123
+ }
124
+ // ─────────────────────────────────────────────── Uncommitted Events
125
+ /** Returns all events emitted since the last load/save. */
126
+ getUncommittedEvents() {
127
+ return [...this.#uncommittedEvents];
128
+ }
129
+ /** Clears uncommitted events after they have been persisted. */
130
+ markEventsAsCommitted() {
131
+ this.#uncommittedEvents.length = 0;
132
+ }
133
+ // ─────────────────────────────────────────────── Private State Mutation
134
+ /** Mutates state from a single event. Used by both command handlers and rehydration. */
135
+ #applyEvent(event) {
136
+ const handlers = {
137
+ ListCreated: (e) => {
138
+ this.#title = e.title;
139
+ },
140
+ ListElementAdded: (e) => {
141
+ this.#elements.set(e.listElementId.toString(), {
142
+ id: e.listElementId,
143
+ content: e.content,
144
+ addedAt: e.timestamp,
145
+ });
146
+ },
147
+ ListElementDeleted: (e) => {
148
+ this.#elements.delete(e.listElementId.toString());
149
+ },
150
+ // Audit-only event — no state change
151
+ ListExported: (_e) => { },
152
+ };
153
+ // biome-ignore lint/suspicious/noExplicitAny: safe — handler key is narrowed by event.type
154
+ handlers[event.type](event);
155
+ }
156
+ }
157
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/aggregates/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ActorId } from "../value-objects/actor-id.js";
2
+ /** Abstract base for all commands. Carries actorId — who is issuing the command. */
3
+ export interface ActorCommand {
4
+ readonly actorId: ActorId;
5
+ }
6
+ //# sourceMappingURL=actor-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor-command.d.ts","sourceRoot":"","sources":["../../src/commands/actor-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAE5D,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=actor-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor-command.js","sourceRoot":"","sources":["../../src/commands/actor-command.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { ListId } from "../value-objects/list-id.js";
2
+ import type { ActorCommand } from "./actor-command.js";
3
+ /** Abstract base for all commands that operate on an existing List. */
4
+ export interface ActorListCommand extends ActorCommand {
5
+ readonly listId: ListId;
6
+ }
7
+ //# sourceMappingURL=actor-list-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor-list-command.d.ts","sourceRoot":"","sources":["../../src/commands/actor-list-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,uEAAuE;AACvE,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=actor-list-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor-list-command.js","sourceRoot":"","sources":["../../src/commands/actor-list-command.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { ListElementContent } from "../value-objects/list-element-content.js";
2
+ import type { ActorListCommand } from "./actor-list-command.js";
3
+ /** Command to append a new ListElement to a List. */
4
+ export interface AddListElement extends ActorListCommand {
5
+ readonly content: ListElementContent;
6
+ }
7
+ //# sourceMappingURL=add-list-element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-list-element.d.ts","sourceRoot":"","sources":["../../src/commands/add-list-element.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,qDAAqD;AACrD,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;CACtC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=add-list-element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-list-element.js","sourceRoot":"","sources":["../../src/commands/add-list-element.ts"],"names":[],"mappings":""}