@critical-path/core 0.36.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/domain/authorization.d.ts.map +1 -1
- package/dist/domain/authorization.js +10 -7
- package/dist/domain/authorization.js.map +1 -1
- package/dist/engine/index.d.ts +6 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +28 -2
- package/dist/engine/index.js.map +1 -1
- package/dist/schemas/index.d.ts +42 -12
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +4 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/store/firebase.d.ts +2 -2
- package/dist/store/firebase.d.ts.map +1 -1
- package/dist/store/firebase.js +4 -2
- package/dist/store/firebase.js.map +1 -1
- package/dist/store/index.d.ts +7 -2
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +3 -2
- package/dist/store/index.js.map +1 -1
- package/dist/store/sqlite.d.ts +2 -2
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +5 -3
- package/dist/store/sqlite.js.map +1 -1
- package/dist/testing/conformance.d.ts.map +1 -1
- package/dist/testing/conformance.js +9 -0
- package/dist/testing/conformance.js.map +1 -1
- package/dist/types/index.d.ts +13 -2
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +5 -1
- package/CHANGELOG.md +0 -593
- package/dist/deliverables.test.d.ts +0 -2
- package/dist/deliverables.test.d.ts.map +0 -1
- package/dist/deliverables.test.js +0 -232
- package/dist/deliverables.test.js.map +0 -1
- package/dist/domain/calendar.test.d.ts +0 -2
- package/dist/domain/calendar.test.d.ts.map +0 -1
- package/dist/domain/calendar.test.js +0 -181
- package/dist/domain/calendar.test.js.map +0 -1
- package/dist/domain/cpm.test.d.ts +0 -2
- package/dist/domain/cpm.test.d.ts.map +0 -1
- package/dist/domain/cpm.test.js +0 -166
- package/dist/domain/cpm.test.js.map +0 -1
- package/dist/domain/ddd.test.d.ts +0 -2
- package/dist/domain/ddd.test.d.ts.map +0 -1
- package/dist/domain/ddd.test.js +0 -349
- package/dist/domain/ddd.test.js.map +0 -1
- package/dist/domain/ladder.test.d.ts +0 -2
- package/dist/domain/ladder.test.d.ts.map +0 -1
- package/dist/domain/ladder.test.js +0 -213
- package/dist/domain/ladder.test.js.map +0 -1
- package/dist/domain/metrics.test.d.ts +0 -2
- package/dist/domain/metrics.test.d.ts.map +0 -1
- package/dist/domain/metrics.test.js +0 -252
- package/dist/domain/metrics.test.js.map +0 -1
- package/dist/domain/task-duration.test.d.ts +0 -2
- package/dist/domain/task-duration.test.d.ts.map +0 -1
- package/dist/domain/task-duration.test.js +0 -307
- package/dist/domain/task-duration.test.js.map +0 -1
- package/dist/domain/workload.test.d.ts +0 -2
- package/dist/domain/workload.test.d.ts.map +0 -1
- package/dist/domain/workload.test.js +0 -261
- package/dist/domain/workload.test.js.map +0 -1
- package/dist/engine/actor.test.d.ts +0 -2
- package/dist/engine/actor.test.d.ts.map +0 -1
- package/dist/engine/actor.test.js +0 -54
- package/dist/engine/actor.test.js.map +0 -1
- package/dist/engine/authorization.test.d.ts +0 -2
- package/dist/engine/authorization.test.d.ts.map +0 -1
- package/dist/engine/authorization.test.js +0 -154
- package/dist/engine/authorization.test.js.map +0 -1
- package/dist/engine/cascade.test.d.ts +0 -2
- package/dist/engine/cascade.test.d.ts.map +0 -1
- package/dist/engine/cascade.test.js +0 -99
- package/dist/engine/cascade.test.js.map +0 -1
- package/dist/engine/config.test.d.ts +0 -2
- package/dist/engine/config.test.d.ts.map +0 -1
- package/dist/engine/config.test.js +0 -46
- package/dist/engine/config.test.js.map +0 -1
- package/dist/engine/entity-events.test.d.ts +0 -2
- package/dist/engine/entity-events.test.d.ts.map +0 -1
- package/dist/engine/entity-events.test.js +0 -61
- package/dist/engine/entity-events.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -429
- package/dist/index.test.js.map +0 -1
- package/dist/plugins/plugins.test.d.ts +0 -2
- package/dist/plugins/plugins.test.d.ts.map +0 -1
- package/dist/plugins/plugins.test.js +0 -137
- package/dist/plugins/plugins.test.js.map +0 -1
- package/dist/schemas/schemas.test.d.ts +0 -2
- package/dist/schemas/schemas.test.d.ts.map +0 -1
- package/dist/schemas/schemas.test.js +0 -58
- package/dist/schemas/schemas.test.js.map +0 -1
- package/dist/status.test.d.ts +0 -2
- package/dist/status.test.d.ts.map +0 -1
- package/dist/status.test.js +0 -295
- package/dist/status.test.js.map +0 -1
- package/dist/storage/storage.test.d.ts +0 -2
- package/dist/storage/storage.test.d.ts.map +0 -1
- package/dist/storage/storage.test.js +0 -236
- package/dist/storage/storage.test.js.map +0 -1
- package/dist/storage/upload-limits.test.d.ts +0 -2
- package/dist/storage/upload-limits.test.d.ts.map +0 -1
- package/dist/storage/upload-limits.test.js +0 -31
- package/dist/storage/upload-limits.test.js.map +0 -1
- package/dist/store/conformance.test.d.ts +0 -2
- package/dist/store/conformance.test.d.ts.map +0 -1
- package/dist/store/conformance.test.js +0 -15
- package/dist/store/conformance.test.js.map +0 -1
- package/dist/store/firebase.test.d.ts +0 -2
- package/dist/store/firebase.test.d.ts.map +0 -1
- package/dist/store/firebase.test.js +0 -103
- package/dist/store/firebase.test.js.map +0 -1
- package/dist/store/query.test.d.ts +0 -2
- package/dist/store/query.test.d.ts.map +0 -1
- package/dist/store/query.test.js +0 -89
- package/dist/store/query.test.js.map +0 -1
- package/dist/store/sqlite.test.d.ts +0 -2
- package/dist/store/sqlite.test.d.ts.map +0 -1
- package/dist/store/sqlite.test.js +0 -177
- package/dist/store/sqlite.test.js.map +0 -1
- package/dist/task-state.test.d.ts +0 -2
- package/dist/task-state.test.d.ts.map +0 -1
- package/dist/task-state.test.js +0 -423
- package/dist/task-state.test.js.map +0 -1
- package/dist/use-case-validation.test.d.ts +0 -2
- package/dist/use-case-validation.test.d.ts.map +0 -1
- package/dist/use-case-validation.test.js +0 -281
- package/dist/use-case-validation.test.js.map +0 -1
- package/dist/utils/fractional-index.test.d.ts +0 -2
- package/dist/utils/fractional-index.test.d.ts.map +0 -1
- package/dist/utils/fractional-index.test.js +0 -182
- package/dist/utils/fractional-index.test.js.map +0 -1
- package/dist/utils/key.test.d.ts +0 -2
- package/dist/utils/key.test.d.ts.map +0 -1
- package/dist/utils/key.test.js +0 -65
- package/dist/utils/key.test.js.map +0 -1
- package/dist/utils/mentions.test.d.ts +0 -2
- package/dist/utils/mentions.test.d.ts.map +0 -1
- package/dist/utils/mentions.test.js +0 -114
- package/dist/utils/mentions.test.js.map +0 -1
- package/dist/webhooks/webhooks.test.d.ts +0 -2
- package/dist/webhooks/webhooks.test.d.ts.map +0 -1
- package/dist/webhooks/webhooks.test.js +0 -154
- package/dist/webhooks/webhooks.test.js.map +0 -1
- package/src/deliverables.test.ts +0 -284
- package/src/domain/authorization.ts +0 -82
- package/src/domain/calendar.test.ts +0 -216
- package/src/domain/calendar.ts +0 -502
- package/src/domain/cpm.test.ts +0 -189
- package/src/domain/cpm.ts +0 -258
- package/src/domain/custom-fields.ts +0 -172
- package/src/domain/ddd.test.ts +0 -442
- package/src/domain/entities.ts +0 -798
- package/src/domain/errors.ts +0 -38
- package/src/domain/events.ts +0 -369
- package/src/domain/graph.ts +0 -70
- package/src/domain/index.ts +0 -12
- package/src/domain/ladder.test.ts +0 -251
- package/src/domain/ladder.ts +0 -474
- package/src/domain/metrics.test.ts +0 -288
- package/src/domain/metrics.ts +0 -497
- package/src/domain/task-duration.test.ts +0 -354
- package/src/domain/workload.test.ts +0 -311
- package/src/domain/workload.ts +0 -457
- package/src/engine/actor.test.ts +0 -63
- package/src/engine/authorization.test.ts +0 -199
- package/src/engine/cascade.test.ts +0 -121
- package/src/engine/config.test.ts +0 -51
- package/src/engine/entity-events.test.ts +0 -67
- package/src/engine/index.ts +0 -2495
- package/src/index.test.ts +0 -514
- package/src/index.ts +0 -9
- package/src/plugins/index.ts +0 -103
- package/src/plugins/plugins.test.ts +0 -161
- package/src/schemas/index.ts +0 -402
- package/src/schemas/schemas.test.ts +0 -116
- package/src/status.test.ts +0 -354
- package/src/storage/file-storage.ts +0 -200
- package/src/storage/firebase-storage.ts +0 -209
- package/src/storage/index.ts +0 -3
- package/src/storage/s3.ts +0 -151
- package/src/storage/storage.test.ts +0 -274
- package/src/storage/upload-limits.test.ts +0 -41
- package/src/store/conformance.test.ts +0 -15
- package/src/store/firebase.test.ts +0 -131
- package/src/store/firebase.ts +0 -658
- package/src/store/index.ts +0 -623
- package/src/store/query.test.ts +0 -110
- package/src/store/query.ts +0 -113
- package/src/store/sqlite.test.ts +0 -218
- package/src/store/sqlite.ts +0 -1480
- package/src/task-state.test.ts +0 -506
- package/src/testing/conformance.ts +0 -319
- package/src/testing/index.ts +0 -1
- package/src/types/index.ts +0 -871
- package/src/use-case-validation.test.ts +0 -324
- package/src/utils/fractional-index.test.ts +0 -228
- package/src/utils/fractional-index.ts +0 -254
- package/src/utils/index.ts +0 -7
- package/src/utils/key.test.ts +0 -76
- package/src/utils/key.ts +0 -62
- package/src/utils/mentions.test.ts +0 -132
- package/src/utils/mentions.ts +0 -131
- package/src/utils/status.ts +0 -419
- package/src/utils/workflow.ts +0 -306
- package/src/webhooks/dispatcher.ts +0 -190
- package/src/webhooks/index.ts +0 -2
- package/src/webhooks/signature.ts +0 -57
- package/src/webhooks/webhooks.test.ts +0 -201
- package/tsconfig.json +0 -8
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { CriticalPathEngine, InMemoryStore, SQLiteStore, FirebaseStore, InMemoryFirestoreMock, InMemoryFileStore, createRolePolicy, ForbiddenError } from '../index.js';
|
|
3
|
-
const stores = [
|
|
4
|
-
['InMemoryStore', () => new InMemoryStore()],
|
|
5
|
-
['SQLiteStore', () => new SQLiteStore({ filename: ':memory:' })],
|
|
6
|
-
['FirebaseStore', () => new FirebaseStore({ db: new InMemoryFirestoreMock() })]
|
|
7
|
-
];
|
|
8
|
-
describe.each(stores)('cascading deletes (%s)', (_name, makeStore) => {
|
|
9
|
-
async function setup() {
|
|
10
|
-
const fileStorage = new InMemoryFileStore();
|
|
11
|
-
const engine = new CriticalPathEngine({ store: makeStore(), fileStorage });
|
|
12
|
-
const project = await engine.createProject({ name: 'Cascade' });
|
|
13
|
-
const parent = await engine.createTask({ projectId: project.id, title: 'Parent' });
|
|
14
|
-
const child = await engine.createTask({ projectId: project.id, title: 'Child', parentId: parent.id });
|
|
15
|
-
const grandchild = await engine.createTask({ projectId: project.id, title: 'Grandchild', parentId: child.id });
|
|
16
|
-
const other = await engine.createTask({ projectId: project.id, title: 'Other' });
|
|
17
|
-
return { engine, fileStorage, project, parent, child, grandchild, other };
|
|
18
|
-
}
|
|
19
|
-
it('removes subtasks, dependencies, comments, attachments with files, and time entries', async () => {
|
|
20
|
-
const { engine, fileStorage, parent, child, grandchild, other } = await setup();
|
|
21
|
-
const dependency = await engine.addDependency({ taskId: other.id, dependsOnTaskId: parent.id, type: 'blocking' });
|
|
22
|
-
const comment = await engine.addComment({ taskId: parent.id, content: 'note', authorId: 'u1' });
|
|
23
|
-
const upload = await engine.uploadAttachmentFile({ taskId: parent.id, filename: 'spec.txt', data: 'hello', uploaderId: 'u1' });
|
|
24
|
-
const onComment = await engine.createAttachment({ commentId: comment.id, filename: 'c.png', url: 'https://example.com/c.png', uploaderId: 'u1', mimeType: 'image/png', sizeBytes: 1 });
|
|
25
|
-
const entry = await engine.logTime({ taskId: parent.id, hours: 2 });
|
|
26
|
-
expect(await engine.deleteTask(parent.id)).toBe(true);
|
|
27
|
-
for (const id of [parent.id, child.id, grandchild.id])
|
|
28
|
-
expect(await engine.getTask(id)).toBeNull();
|
|
29
|
-
expect(await engine.getTask(other.id)).not.toBeNull();
|
|
30
|
-
expect(await engine.store.getDependency(dependency.id)).toBeNull();
|
|
31
|
-
expect(await engine.store.getComment(comment.id)).toBeNull();
|
|
32
|
-
expect(await engine.store.getAttachment(upload.id)).toBeNull();
|
|
33
|
-
expect(await engine.store.getAttachment(onComment.id)).toBeNull();
|
|
34
|
-
expect(await fileStorage.download(upload.storageKey).catch(() => null)).toBeNull();
|
|
35
|
-
expect((await engine.store.getTimeEntries(parent.id)).map((e) => e.id)).not.toContain(entry.id);
|
|
36
|
-
});
|
|
37
|
-
it('can detach subtasks instead of deleting them', async () => {
|
|
38
|
-
const { engine, parent, child } = await setup();
|
|
39
|
-
await engine.deleteTask(parent.id, { subtasks: 'detach' });
|
|
40
|
-
const kept = await engine.getTask(child.id);
|
|
41
|
-
expect(kept).not.toBeNull();
|
|
42
|
-
expect(kept?.parentId).toBeUndefined();
|
|
43
|
-
});
|
|
44
|
-
it('deletes a project with all its planning records and reports every deleted task', async () => {
|
|
45
|
-
const { engine, project, parent, child, grandchild, other } = await setup();
|
|
46
|
-
const container = await engine.createContainer({ projectId: project.id, name: 'Epic' });
|
|
47
|
-
const iteration = await engine.createIteration({ projectId: project.id, name: 'S1', status: 'planning' });
|
|
48
|
-
const deliverable = await engine.createDeliverable({ projectId: project.id, title: 'Cut' });
|
|
49
|
-
const projectFile = await engine.createAttachment({ projectId: project.id, filename: 'brief.pdf', url: 'https://example.com/b.pdf', uploaderId: 'u1', mimeType: 'application/pdf', sizeBytes: 1 });
|
|
50
|
-
let deletedTaskIds = [];
|
|
51
|
-
engine.events.subscribe('project.deleted', (e) => {
|
|
52
|
-
deletedTaskIds = e.payload.deletedTaskIds;
|
|
53
|
-
});
|
|
54
|
-
expect(await engine.deleteProject(project.id)).toBe(true);
|
|
55
|
-
expect(deletedTaskIds.sort()).toEqual([parent.id, child.id, grandchild.id, other.id].sort());
|
|
56
|
-
expect(await engine.store.getContainer(container.id)).toBeNull();
|
|
57
|
-
expect(await engine.store.getIteration(iteration.id)).toBeNull();
|
|
58
|
-
expect(await engine.store.getDeliverable(deliverable.id)).toBeNull();
|
|
59
|
-
expect(await engine.store.getAttachment(projectFile.id)).toBeNull();
|
|
60
|
-
});
|
|
61
|
-
it('clears task references when containers, iterations and deliverables are deleted', async () => {
|
|
62
|
-
const { engine, project, other } = await setup();
|
|
63
|
-
const epic = await engine.createContainer({ projectId: project.id, name: 'Epic' });
|
|
64
|
-
const nested = await engine.createContainer({ projectId: project.id, name: 'Nested', parentId: epic.id });
|
|
65
|
-
const sprint = await engine.createIteration({ projectId: project.id, name: 'S1', status: 'planning' });
|
|
66
|
-
const cut = await engine.createDeliverable({ projectId: project.id, title: 'Cut' });
|
|
67
|
-
await engine.updateTask(other.id, { containerId: epic.id, iterationId: sprint.id, deliverableId: cut.id });
|
|
68
|
-
await engine.deleteContainer(epic.id);
|
|
69
|
-
await engine.deleteIteration(sprint.id);
|
|
70
|
-
await engine.deleteDeliverable(cut.id);
|
|
71
|
-
const task = await engine.getTask(other.id);
|
|
72
|
-
expect(task?.containerId).toBeUndefined();
|
|
73
|
-
expect(task?.iterationId).toBeUndefined();
|
|
74
|
-
expect(task?.deliverableId).toBeUndefined();
|
|
75
|
-
expect((await engine.getContainer(nested.id))?.parentId).toBeUndefined();
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
describe('removeDependency', () => {
|
|
79
|
-
it('removes a dependency, publishes dependency.removed, and requires task.update', async () => {
|
|
80
|
-
const engine = new CriticalPathEngine({ authorize: createRolePolicy() });
|
|
81
|
-
const project = await engine.createProject({
|
|
82
|
-
name: 'Deps',
|
|
83
|
-
members: [
|
|
84
|
-
{ userId: 'cora', role: 'contributor' },
|
|
85
|
-
{ userId: 'vic', role: 'viewer' }
|
|
86
|
-
]
|
|
87
|
-
});
|
|
88
|
-
const a = await engine.createTask({ projectId: project.id, title: 'A' });
|
|
89
|
-
const b = await engine.createTask({ projectId: project.id, title: 'B' });
|
|
90
|
-
const dependency = await engine.addDependency({ taskId: a.id, dependsOnTaskId: b.id, type: 'blocking' });
|
|
91
|
-
const events = [];
|
|
92
|
-
engine.events.subscribe('dependency.removed', (e) => void events.push(e.name));
|
|
93
|
-
await expect(engine.withActor({ userId: 'vic' }).removeDependency(dependency.id)).rejects.toThrow(ForbiddenError);
|
|
94
|
-
expect(await engine.withActor({ userId: 'cora' }).removeDependency(dependency.id)).toBe(true);
|
|
95
|
-
expect(await engine.removeDependency(dependency.id)).toBe(false);
|
|
96
|
-
expect(events).toEqual(['dependency.removed']);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
//# sourceMappingURL=cascade.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cascade.test.js","sourceRoot":"","sources":["../../src/engine/cascade.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/engine/config.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { CriticalPathEngine, SQLiteStore } from '../index.js';
|
|
3
|
-
const ana = { id: 'ana', name: 'Ana', email: 'ana@example.com', role: 'contributor', weeklyCapacityHours: 20, createdAt: '2026-01-01T00:00:00.000Z' };
|
|
4
|
-
describe('engine configuration', () => {
|
|
5
|
-
it('rejects store strings instead of silently using memory', () => {
|
|
6
|
-
expect(() => new CriticalPathEngine({ store: 'sqlite' })).toThrow(/storage adapter instance/);
|
|
7
|
-
expect(new CriticalPathEngine({ store: new SQLiteStore({ filename: ':memory:' }) }).store).toBeInstanceOf(SQLiteStore);
|
|
8
|
-
});
|
|
9
|
-
it('merges initialData.users with the configured user directory', async () => {
|
|
10
|
-
const engine = new CriticalPathEngine({
|
|
11
|
-
initialData: { users: [ana, { ...ana, id: 'old', name: 'Seeded' }] },
|
|
12
|
-
users: [{ ...ana, name: 'Ana (directory)' }]
|
|
13
|
-
});
|
|
14
|
-
const users = await engine.getUsers();
|
|
15
|
-
expect(users.map((u) => u.name).sort()).toEqual(['Ana (directory)', 'Seeded']);
|
|
16
|
-
});
|
|
17
|
-
it('calls a user directory function with the calling actor', async () => {
|
|
18
|
-
const directory = vi.fn(async () => [ana]);
|
|
19
|
-
const engine = new CriticalPathEngine({ users: directory });
|
|
20
|
-
await engine.withActor({ userId: 'x', tenantId: 'acme' }).getUsers();
|
|
21
|
-
expect(directory).toHaveBeenCalledWith(expect.objectContaining({ userId: 'x', tenantId: 'acme' }));
|
|
22
|
-
});
|
|
23
|
-
it('uses user capacity and names in workload distribution', async () => {
|
|
24
|
-
const engine = new CriticalPathEngine({ users: [ana] });
|
|
25
|
-
const project = await engine.createProject({ name: 'Capacity' });
|
|
26
|
-
await engine.createTask({
|
|
27
|
-
projectId: project.id,
|
|
28
|
-
title: 'Work',
|
|
29
|
-
assigneeId: 'ana',
|
|
30
|
-
estimatedHours: 10,
|
|
31
|
-
plannedStartDate: '2026-10-05',
|
|
32
|
-
dueDate: '2026-10-09'
|
|
33
|
-
});
|
|
34
|
-
const workload = await engine.getWorkloadDistribution(project.id, {
|
|
35
|
-
startDate: '2026-10-05',
|
|
36
|
-
endDate: '2026-10-11',
|
|
37
|
-
interval: 'week',
|
|
38
|
-
groupBy: 'assignee'
|
|
39
|
-
});
|
|
40
|
-
expect(workload.seriesLabels.ana).toBe('Ana');
|
|
41
|
-
// Ana's 20h/week capacity is used instead of the 40h default
|
|
42
|
-
const capacity = workload.buckets.map((b) => b.capacity?.ana ?? 0);
|
|
43
|
-
expect(Math.max(...capacity)).toBe(20);
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
//# sourceMappingURL=config.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/engine/config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entity-events.test.d.ts","sourceRoot":"","sources":["../../src/engine/entity-events.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { CriticalPathEngine } from '../index.js';
|
|
3
|
-
function record(engine) {
|
|
4
|
-
const events = [];
|
|
5
|
-
engine.events.subscribe('*', (e) => void events.push(e));
|
|
6
|
-
return events;
|
|
7
|
-
}
|
|
8
|
-
describe('team, container and iteration events', () => {
|
|
9
|
-
it('publishes updated and deleted events with the previous state', async () => {
|
|
10
|
-
const engine = new CriticalPathEngine();
|
|
11
|
-
const project = await engine.createProject({ name: 'Events' });
|
|
12
|
-
const team = await engine.createTeam({ name: 'Core', memberIds: [] });
|
|
13
|
-
const container = await engine.createContainer({ projectId: project.id, name: 'Epic' });
|
|
14
|
-
const events = record(engine);
|
|
15
|
-
const iteration = await engine.createIteration({ projectId: project.id, name: 'S1', status: 'planning' });
|
|
16
|
-
await engine.updateTeam(team.id, { name: 'Platform' });
|
|
17
|
-
await engine.updateContainer(container.id, { name: 'Epic 2' });
|
|
18
|
-
await engine.updateIteration(iteration.id, { goal: 'Ship' });
|
|
19
|
-
await engine.deleteTeam(team.id);
|
|
20
|
-
await engine.deleteContainer(container.id);
|
|
21
|
-
await engine.deleteIteration(iteration.id);
|
|
22
|
-
expect(events.map((e) => e.name)).toEqual([
|
|
23
|
-
'iteration.created',
|
|
24
|
-
'team.updated',
|
|
25
|
-
'container.updated',
|
|
26
|
-
'iteration.updated',
|
|
27
|
-
'team.deleted',
|
|
28
|
-
'container.deleted',
|
|
29
|
-
'iteration.deleted'
|
|
30
|
-
]);
|
|
31
|
-
const teamUpdated = events.find((e) => e.name === 'team.updated').payload;
|
|
32
|
-
expect(teamUpdated.previous.name).toBe('Core');
|
|
33
|
-
expect(teamUpdated.team.name).toBe('Platform');
|
|
34
|
-
expect(events.find((e) => e.name === 'iteration.deleted').payload).toMatchObject({ projectId: project.id, name: 'S1' });
|
|
35
|
-
expect(new Set(events.map((e) => e.id)).size).toBe(events.length);
|
|
36
|
-
});
|
|
37
|
-
it('routes deletion webhooks to the owning tenant', async () => {
|
|
38
|
-
const delivered = [];
|
|
39
|
-
const engine = new CriticalPathEngine({
|
|
40
|
-
webhookDelivery: {
|
|
41
|
-
fetch: (async (url, init) => {
|
|
42
|
-
delivered.push({ url, event: JSON.parse(init.body).event });
|
|
43
|
-
return new Response(null, { status: 204 });
|
|
44
|
-
})
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
const acme = engine.withActor({ userId: 'a', tenantId: 'acme' });
|
|
48
|
-
const globex = engine.withActor({ userId: 'g', tenantId: 'globex' });
|
|
49
|
-
await acme.createWebhook({ name: 'Acme', url: 'https://hooks.example.com/acme', events: ['team.deleted', 'container.deleted'] });
|
|
50
|
-
await globex.createWebhook({ name: 'Globex', url: 'https://hooks.example.com/globex', events: ['*'] });
|
|
51
|
-
const project = await acme.createProject({ name: 'Acme' });
|
|
52
|
-
const team = await acme.createTeam({ name: 'Team', memberIds: [] });
|
|
53
|
-
const container = await acme.createContainer({ projectId: project.id, name: 'C' });
|
|
54
|
-
await acme.deleteTeam(team.id);
|
|
55
|
-
await acme.deleteContainer(container.id);
|
|
56
|
-
await engine.webhooks.idle();
|
|
57
|
-
expect(delivered.map((d) => d.event).sort()).toEqual(['container.deleted', 'team.deleted']);
|
|
58
|
-
expect(delivered.every((d) => d.url.endsWith('/acme'))).toBe(true);
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
//# sourceMappingURL=entity-events.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entity-events.test.js","sourceRoot":"","sources":["../../src/engine/entity-events.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.test.d.ts
DELETED
package/dist/index.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
|