@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
package/dist/index.test.js
DELETED
|
@@ -1,429 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { CriticalPathEngine, DEFAULT_VFX_WORKFLOW } from './index.js';
|
|
3
|
-
describe('CriticalPathEngine Core Tests', () => {
|
|
4
|
-
it('deletes a project with its tasks and publishes deletion events', async () => {
|
|
5
|
-
const engine = new CriticalPathEngine();
|
|
6
|
-
const proj = await engine.createProject({ key: 'DEL', name: 'Doomed Project' });
|
|
7
|
-
const keep = await engine.createProject({ key: 'KEEP', name: 'Survivor' });
|
|
8
|
-
const t1 = await engine.createTask({ projectId: proj.id, title: 'One' });
|
|
9
|
-
const t2 = await engine.createTask({ projectId: proj.id, title: 'Two' });
|
|
10
|
-
const other = await engine.createTask({ projectId: keep.id, title: 'Other' });
|
|
11
|
-
const published = [];
|
|
12
|
-
engine.events.subscribe('*', (event) => {
|
|
13
|
-
published.push(event.name);
|
|
14
|
-
});
|
|
15
|
-
expect(await engine.deleteProject(proj.id)).toBe(true);
|
|
16
|
-
expect(await engine.getProject(proj.id)).toBeNull();
|
|
17
|
-
expect(await engine.getTask(t1.id)).toBeNull();
|
|
18
|
-
expect(await engine.getTask(t2.id)).toBeNull();
|
|
19
|
-
expect(await engine.getTask(other.id)).not.toBeNull();
|
|
20
|
-
expect(published.filter((n) => n === 'task.deleted')).toHaveLength(2);
|
|
21
|
-
expect(published.at(-1)).toBe('project.deleted');
|
|
22
|
-
expect(await engine.deleteProject(proj.id)).toBe(false);
|
|
23
|
-
});
|
|
24
|
-
it('creates projects and tasks with activity logs', async () => {
|
|
25
|
-
const engine = new CriticalPathEngine();
|
|
26
|
-
const proj = await engine.createProject({
|
|
27
|
-
key: 'TEST',
|
|
28
|
-
name: 'Test Project',
|
|
29
|
-
description: 'A test project'
|
|
30
|
-
});
|
|
31
|
-
expect(proj.id).toBeDefined();
|
|
32
|
-
expect(proj.key).toBe('TEST');
|
|
33
|
-
const task = await engine.createTask({
|
|
34
|
-
projectId: proj.id,
|
|
35
|
-
title: 'First Task',
|
|
36
|
-
status: 'todo',
|
|
37
|
-
priority: 'high'
|
|
38
|
-
});
|
|
39
|
-
expect(task.id).toBeDefined();
|
|
40
|
-
expect(task.title).toBe('First Task');
|
|
41
|
-
const activities = await engine.store.getActivities({ projectId: proj.id });
|
|
42
|
-
expect(activities.length).toBeGreaterThanOrEqual(2);
|
|
43
|
-
});
|
|
44
|
-
it('runs plugin hooks on task lifecycle', async () => {
|
|
45
|
-
let hookExecuted = false;
|
|
46
|
-
const testPlugin = {
|
|
47
|
-
id: 'auto-tag-plugin',
|
|
48
|
-
name: 'Auto Tag Plugin',
|
|
49
|
-
version: '1.0.0',
|
|
50
|
-
hooks: {
|
|
51
|
-
beforeTaskCreate: (task) => {
|
|
52
|
-
hookExecuted = true;
|
|
53
|
-
return {
|
|
54
|
-
...task,
|
|
55
|
-
tags: [...(task.tags || []), 'auto-tagged']
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
const engine = new CriticalPathEngine({ plugins: [testPlugin] });
|
|
61
|
-
const proj = await engine.createProject({ key: 'PLUG', name: 'Plugin Proj' });
|
|
62
|
-
const task = await engine.createTask({
|
|
63
|
-
projectId: proj.id,
|
|
64
|
-
title: 'Plugin Task',
|
|
65
|
-
status: 'todo',
|
|
66
|
-
priority: 'medium'
|
|
67
|
-
});
|
|
68
|
-
expect(hookExecuted).toBe(true);
|
|
69
|
-
expect(task.tags).toContain('auto-tagged');
|
|
70
|
-
});
|
|
71
|
-
it('handles teams, containers, and iterations', async () => {
|
|
72
|
-
const engine = new CriticalPathEngine();
|
|
73
|
-
const team = await engine.createTeam({
|
|
74
|
-
name: 'Engineering',
|
|
75
|
-
memberIds: ['user_1', 'user_2']
|
|
76
|
-
});
|
|
77
|
-
const proj = await engine.createProject({
|
|
78
|
-
key: 'ENG',
|
|
79
|
-
name: 'Engineering Project',
|
|
80
|
-
teamIds: [team.id]
|
|
81
|
-
});
|
|
82
|
-
const container = await engine.createContainer({
|
|
83
|
-
projectId: proj.id,
|
|
84
|
-
name: 'Core Platform Epic',
|
|
85
|
-
type: 'epic'
|
|
86
|
-
});
|
|
87
|
-
const iteration = await engine.createIteration({
|
|
88
|
-
projectId: proj.id,
|
|
89
|
-
name: 'Sprint 1',
|
|
90
|
-
type: 'sprint',
|
|
91
|
-
status: 'active'
|
|
92
|
-
});
|
|
93
|
-
const task = await engine.createTask({
|
|
94
|
-
projectId: proj.id,
|
|
95
|
-
title: 'Setup Database Schema',
|
|
96
|
-
status: 'in_progress',
|
|
97
|
-
priority: 'urgent',
|
|
98
|
-
reviewerId: 'user_2',
|
|
99
|
-
teamId: team.id,
|
|
100
|
-
containerId: container.id,
|
|
101
|
-
iterationId: iteration.id,
|
|
102
|
-
plannedStartDate: '2026-09-01T00:00:00.000Z',
|
|
103
|
-
dueDate: '2026-09-15T00:00:00.000Z',
|
|
104
|
-
estimatedHours: 10,
|
|
105
|
-
actualHours: 8,
|
|
106
|
-
billableHours: 8,
|
|
107
|
-
estimatedDurationMinutes: 600,
|
|
108
|
-
actualDurationMinutes: 480,
|
|
109
|
-
billableDurationMinutes: 480,
|
|
110
|
-
progress: 80
|
|
111
|
-
});
|
|
112
|
-
expect(task.reviewerId).toBe('user_2');
|
|
113
|
-
expect(task.teamId).toBe(team.id);
|
|
114
|
-
expect(task.containerId).toBe(container.id);
|
|
115
|
-
expect(task.iterationId).toBe(iteration.id);
|
|
116
|
-
expect(task.estimatedHours).toBe(10);
|
|
117
|
-
expect(task.actualHours).toBe(8);
|
|
118
|
-
expect(task.billableHours).toBe(8);
|
|
119
|
-
expect(task.estimatedDurationMinutes).toBe(600);
|
|
120
|
-
expect(task.actualDurationMinutes).toBe(480);
|
|
121
|
-
expect(task.billableDurationMinutes).toBe(480);
|
|
122
|
-
expect(task.progress).toBe(80);
|
|
123
|
-
});
|
|
124
|
-
it('evaluates status definitions and task lifecycle state', async () => {
|
|
125
|
-
const engine = new CriticalPathEngine();
|
|
126
|
-
const proj = await engine.createProject({
|
|
127
|
-
key: 'CUST',
|
|
128
|
-
name: 'Custom Workflow Project',
|
|
129
|
-
statusDefinitions: [
|
|
130
|
-
{ key: 'draft', label: 'Draft', category: 'not_started' },
|
|
131
|
-
{ key: 'active_work', label: 'Active Work', category: 'in_progress' },
|
|
132
|
-
{ key: 'finished', label: 'Finished', category: 'completed' }
|
|
133
|
-
]
|
|
134
|
-
});
|
|
135
|
-
const task = await engine.createTask({
|
|
136
|
-
projectId: proj.id,
|
|
137
|
-
title: 'Workflow Task',
|
|
138
|
-
status: 'active_work',
|
|
139
|
-
priority: 'medium',
|
|
140
|
-
plannedStartDate: '2026-08-01T00:00:00.000Z',
|
|
141
|
-
dueDate: '2026-08-10T00:00:00.000Z'
|
|
142
|
-
});
|
|
143
|
-
const state = await engine.getTaskLifecycleState(task.id);
|
|
144
|
-
expect(state).not.toBeNull();
|
|
145
|
-
expect(state?.semanticStatus).toBe('in_progress');
|
|
146
|
-
expect(state?.isActive).toBe(true);
|
|
147
|
-
expect(state?.isDone).toBe(false);
|
|
148
|
-
expect(state?.isBlocked).toBe(false);
|
|
149
|
-
});
|
|
150
|
-
it('builds task dependency graph with upstream and downstream tasks', async () => {
|
|
151
|
-
const engine = new CriticalPathEngine();
|
|
152
|
-
const proj = await engine.createProject({ key: 'DEP', name: 'Dependency Project' });
|
|
153
|
-
const taskA = await engine.createTask({ projectId: proj.id, title: 'Task A', status: 'todo', priority: 'medium' });
|
|
154
|
-
const taskB = await engine.createTask({ projectId: proj.id, title: 'Task B', status: 'todo', priority: 'medium' });
|
|
155
|
-
// Task B depends on Task A
|
|
156
|
-
await engine.store.addDependency({
|
|
157
|
-
taskId: taskB.id,
|
|
158
|
-
dependsOnTaskId: taskA.id,
|
|
159
|
-
type: 'blocking'
|
|
160
|
-
});
|
|
161
|
-
const graphA = await engine.getTaskDependencyGraph(taskA.id);
|
|
162
|
-
expect(graphA.downstreamTasks.map((t) => t.id)).toContain(taskB.id);
|
|
163
|
-
const graphB = await engine.getTaskDependencyGraph(taskB.id);
|
|
164
|
-
expect(graphB.upstreamTasks.map((t) => t.id)).toContain(taskA.id);
|
|
165
|
-
});
|
|
166
|
-
it('manages workflows and enforces status transitions', async () => {
|
|
167
|
-
const engine = new CriticalPathEngine();
|
|
168
|
-
// Create a strict workflow
|
|
169
|
-
const workflow = await engine.createWorkflow({
|
|
170
|
-
name: 'Strict Software Workflow',
|
|
171
|
-
defaultStatusKey: 'backlog',
|
|
172
|
-
statuses: [
|
|
173
|
-
{ key: 'backlog', label: 'Backlog', category: 'not_started' },
|
|
174
|
-
{ key: 'in_progress', label: 'In Progress', category: 'in_progress' },
|
|
175
|
-
{ key: 'done', label: 'Done', category: 'completed' }
|
|
176
|
-
],
|
|
177
|
-
transitions: [
|
|
178
|
-
{ id: 't1', fromStatusKey: 'backlog', toStatusKey: 'in_progress', name: 'Start Work' },
|
|
179
|
-
{ id: 't2', fromStatusKey: 'in_progress', toStatusKey: 'done', name: 'Complete Work' }
|
|
180
|
-
]
|
|
181
|
-
});
|
|
182
|
-
expect(workflow.id).toBeDefined();
|
|
183
|
-
// Create project tied to workflow
|
|
184
|
-
const proj = await engine.createProject({
|
|
185
|
-
key: 'WF',
|
|
186
|
-
name: 'Workflow Project',
|
|
187
|
-
workflowId: workflow.id
|
|
188
|
-
});
|
|
189
|
-
// Create task
|
|
190
|
-
const task = await engine.createTask({
|
|
191
|
-
projectId: proj.id,
|
|
192
|
-
title: 'Workflow Task',
|
|
193
|
-
status: 'backlog',
|
|
194
|
-
priority: 'high'
|
|
195
|
-
});
|
|
196
|
-
expect(task.status).toBe('backlog');
|
|
197
|
-
expect(task.taskType).toBe('task');
|
|
198
|
-
// Check allowed transitions
|
|
199
|
-
const allowed = await engine.getAllowedTaskTransitions(task.id);
|
|
200
|
-
expect(allowed).toEqual(['in_progress']);
|
|
201
|
-
// Valid transition: backlog -> in_progress
|
|
202
|
-
const updated = await engine.updateTask(task.id, { status: 'in_progress' });
|
|
203
|
-
expect(updated?.status).toBe('in_progress');
|
|
204
|
-
// Invalid transition: in_progress -> backlog (not allowed in strict workflow)
|
|
205
|
-
await expect(engine.updateTask(task.id, { status: 'backlog' })).rejects.toThrow();
|
|
206
|
-
// Valid transition: in_progress -> done
|
|
207
|
-
const doneTask = await engine.updateTask(task.id, { status: 'done' });
|
|
208
|
-
expect(doneTask?.status).toBe('done');
|
|
209
|
-
});
|
|
210
|
-
it('validates attachment URLs to prevent massive data URIs', async () => {
|
|
211
|
-
const engine = new CriticalPathEngine();
|
|
212
|
-
const proj = await engine.createProject({ key: 'ATT', name: 'Attachment Project' });
|
|
213
|
-
const task = await engine.createTask({ projectId: proj.id, title: 'Task with attachment', status: 'todo' });
|
|
214
|
-
// Valid HTTPS URL
|
|
215
|
-
const validAtt = await engine.createAttachment({
|
|
216
|
-
taskId: task.id,
|
|
217
|
-
uploaderId: 'user_1',
|
|
218
|
-
filename: 'spec.pdf',
|
|
219
|
-
mimeType: 'application/pdf',
|
|
220
|
-
sizeBytes: 1024,
|
|
221
|
-
url: 'https://storage.googleapis.com/bucket/spec.pdf'
|
|
222
|
-
});
|
|
223
|
-
expect(validAtt.id).toBeDefined();
|
|
224
|
-
expect(validAtt.url).toBe('https://storage.googleapis.com/bucket/spec.pdf');
|
|
225
|
-
// Invalid large data URI (>2048 chars)
|
|
226
|
-
const largeDataUri = `data:application/pdf;base64,${'A'.repeat(3000)}`;
|
|
227
|
-
await expect(engine.createAttachment({
|
|
228
|
-
taskId: task.id,
|
|
229
|
-
uploaderId: 'user_1',
|
|
230
|
-
filename: 'huge.pdf',
|
|
231
|
-
mimeType: 'application/pdf',
|
|
232
|
-
sizeBytes: 3000,
|
|
233
|
-
url: largeDataUri
|
|
234
|
-
})).rejects.toThrow('Attachment URL cannot be a large data URI');
|
|
235
|
-
});
|
|
236
|
-
it('supports adding and removing emoji reactions on comments with events and deduplication', async () => {
|
|
237
|
-
const engine = new CriticalPathEngine();
|
|
238
|
-
const proj = await engine.createProject({ key: 'CMT', name: 'Comment Project' });
|
|
239
|
-
const task = await engine.createTask({ projectId: proj.id, title: 'Comment Task', status: 'todo' });
|
|
240
|
-
const comment = await engine.addComment({
|
|
241
|
-
taskId: task.id,
|
|
242
|
-
authorId: 'user_1',
|
|
243
|
-
content: 'Great progress!'
|
|
244
|
-
});
|
|
245
|
-
const receivedEvents = [];
|
|
246
|
-
engine.events.subscribe('*', (event) => {
|
|
247
|
-
receivedEvents.push(event.name);
|
|
248
|
-
});
|
|
249
|
-
// Add reaction 👍
|
|
250
|
-
const withReaction = await engine.addCommentReaction(comment.id, {
|
|
251
|
-
emoji: '👍',
|
|
252
|
-
userId: 'user_2'
|
|
253
|
-
});
|
|
254
|
-
expect(withReaction?.reactions).toHaveLength(1);
|
|
255
|
-
expect(withReaction?.reactions?.[0]).toMatchObject({
|
|
256
|
-
emoji: '👍',
|
|
257
|
-
userId: 'user_2'
|
|
258
|
-
});
|
|
259
|
-
expect(withReaction?.reactions?.[0].createdAt).toBeDefined();
|
|
260
|
-
expect(receivedEvents).toContain('comment.reaction.added');
|
|
261
|
-
// Add duplicate reaction from same user (should deduplicate)
|
|
262
|
-
const duplicateReaction = await engine.addCommentReaction(comment.id, {
|
|
263
|
-
emoji: '👍',
|
|
264
|
-
userId: 'user_2'
|
|
265
|
-
});
|
|
266
|
-
expect(duplicateReaction?.reactions).toHaveLength(1);
|
|
267
|
-
// Add different reaction from another user
|
|
268
|
-
const secondReaction = await engine.addCommentReaction(comment.id, {
|
|
269
|
-
emoji: '🚀',
|
|
270
|
-
userId: 'user_3'
|
|
271
|
-
});
|
|
272
|
-
expect(secondReaction?.reactions).toHaveLength(2);
|
|
273
|
-
// Remove reaction 👍
|
|
274
|
-
const afterRemoval = await engine.removeCommentReaction(comment.id, {
|
|
275
|
-
emoji: '👍',
|
|
276
|
-
userId: 'user_2'
|
|
277
|
-
});
|
|
278
|
-
expect(afterRemoval?.reactions).toHaveLength(1);
|
|
279
|
-
expect(afterRemoval?.reactions?.[0].emoji).toBe('🚀');
|
|
280
|
-
expect(receivedEvents).toContain('comment.reaction.removed');
|
|
281
|
-
});
|
|
282
|
-
it('supports mentions in comments with auto-extraction and explicit override', async () => {
|
|
283
|
-
const engine = new CriticalPathEngine();
|
|
284
|
-
const proj = await engine.createProject({ key: 'MNT', name: 'Mentions Project' });
|
|
285
|
-
const task = await engine.createTask({ projectId: proj.id, title: 'Mentions Task', status: 'todo' });
|
|
286
|
-
// Auto-extracted mentions
|
|
287
|
-
const comment1 = await engine.addComment({
|
|
288
|
-
taskId: task.id,
|
|
289
|
-
authorId: 'user_1',
|
|
290
|
-
content: 'Hey @planner and @user_2, please check with @"Supervisor Agent"!'
|
|
291
|
-
});
|
|
292
|
-
expect(comment1.mentions).toEqual(['planner', 'user_2', 'Supervisor Agent']);
|
|
293
|
-
// Explicit mentions passed
|
|
294
|
-
const comment2 = await engine.addComment({
|
|
295
|
-
taskId: task.id,
|
|
296
|
-
authorId: 'user_1',
|
|
297
|
-
content: 'Custom mention assignment',
|
|
298
|
-
mentions: ['custom_agent_id']
|
|
299
|
-
});
|
|
300
|
-
expect(comment2.mentions).toEqual(['custom_agent_id']);
|
|
301
|
-
// Update comment content updates mentions
|
|
302
|
-
const updated = await engine.updateComment(comment1.id, {
|
|
303
|
-
content: 'Now calling only @coordinator'
|
|
304
|
-
});
|
|
305
|
-
expect(updated?.mentions).toEqual(['coordinator']);
|
|
306
|
-
});
|
|
307
|
-
it('supports multi-assignees and backward status transitions', async () => {
|
|
308
|
-
const engine = new CriticalPathEngine();
|
|
309
|
-
const proj = await engine.createProject({ key: 'TRN', name: 'Transitions Project' });
|
|
310
|
-
// Task with multi-assignees
|
|
311
|
-
const task = await engine.createTask({
|
|
312
|
-
projectId: proj.id,
|
|
313
|
-
title: 'Multi-assignee Task',
|
|
314
|
-
status: 'in_progress',
|
|
315
|
-
assignees: [
|
|
316
|
-
{ id: 'agent_1', name: 'Agent Alpha', role: 'Planner', type: 'agent' },
|
|
317
|
-
{ id: 'user_1', name: 'Alice Developer', role: 'Developer', type: 'user', avatarUrl: 'https://example.com/alice.png' }
|
|
318
|
-
]
|
|
319
|
-
});
|
|
320
|
-
expect(task.assignees).toHaveLength(2);
|
|
321
|
-
expect(task.assignees?.[0].type).toBe('agent');
|
|
322
|
-
expect(task.assignees?.[1].avatarUrl).toBe('https://example.com/alice.png');
|
|
323
|
-
// Backward transitions
|
|
324
|
-
const previousStatuses = await engine.getAllowedPreviousTaskTransitions(task.id);
|
|
325
|
-
expect(previousStatuses).toContain('todo');
|
|
326
|
-
// First status (backlog) should have no previous status
|
|
327
|
-
const backlogTask = await engine.createTask({
|
|
328
|
-
projectId: proj.id,
|
|
329
|
-
title: 'Backlog Task',
|
|
330
|
-
status: 'backlog'
|
|
331
|
-
});
|
|
332
|
-
const backlogPrev = await engine.getAllowedPreviousTaskTransitions(backlogTask.id);
|
|
333
|
-
expect(backlogPrev).toEqual([]);
|
|
334
|
-
});
|
|
335
|
-
it('automatically unblocks downstream tasks and publishes task.unblocked event when upstream task completes', async () => {
|
|
336
|
-
const engine = new CriticalPathEngine();
|
|
337
|
-
const proj = await engine.createProject({ key: 'UNBLK', name: 'Auto-Unblock Project' });
|
|
338
|
-
const upstream = await engine.createTask({
|
|
339
|
-
projectId: proj.id,
|
|
340
|
-
title: 'Upstream Task',
|
|
341
|
-
status: 'in_progress'
|
|
342
|
-
});
|
|
343
|
-
const downstream = await engine.createTask({
|
|
344
|
-
projectId: proj.id,
|
|
345
|
-
title: 'Downstream Task',
|
|
346
|
-
status: 'todo',
|
|
347
|
-
isBlocked: true,
|
|
348
|
-
blockedReason: 'Waiting on upstream'
|
|
349
|
-
});
|
|
350
|
-
await engine.addDependency({
|
|
351
|
-
taskId: downstream.id,
|
|
352
|
-
dependsOnTaskId: upstream.id,
|
|
353
|
-
type: 'blocking'
|
|
354
|
-
});
|
|
355
|
-
const unblockedEvents = [];
|
|
356
|
-
engine.events.subscribe('task.unblocked', async (evt) => {
|
|
357
|
-
unblockedEvents.push(evt);
|
|
358
|
-
});
|
|
359
|
-
// Complete upstream task
|
|
360
|
-
const completedUpstream = await engine.updateTask(upstream.id, { status: 'done' });
|
|
361
|
-
expect(completedUpstream?.status).toBe('done');
|
|
362
|
-
// Downstream task should now be unblocked
|
|
363
|
-
expect(unblockedEvents).toHaveLength(1);
|
|
364
|
-
expect(unblockedEvents[0].payload.task.id).toBe(downstream.id);
|
|
365
|
-
expect(unblockedEvents[0].payload.upstreamTaskId).toBe(upstream.id);
|
|
366
|
-
const refreshedDownstream = await engine.getTask(downstream.id);
|
|
367
|
-
expect(refreshedDownstream?.status).toBe('todo');
|
|
368
|
-
expect(refreshedDownstream?.isBlocked).toBe(false);
|
|
369
|
-
});
|
|
370
|
-
it('allows VFX workflow transitions from revision_requested to in_production', async () => {
|
|
371
|
-
const engine = new CriticalPathEngine();
|
|
372
|
-
const vfxWorkflow = await engine.createWorkflow(DEFAULT_VFX_WORKFLOW);
|
|
373
|
-
const proj = await engine.createProject({
|
|
374
|
-
key: 'VFX',
|
|
375
|
-
name: 'VFX Film Project',
|
|
376
|
-
workflowId: vfxWorkflow.id
|
|
377
|
-
});
|
|
378
|
-
const task = await engine.createTask({
|
|
379
|
-
projectId: proj.id,
|
|
380
|
-
title: 'Compositing Shot 010',
|
|
381
|
-
status: 'revision_requested'
|
|
382
|
-
});
|
|
383
|
-
const allowed = await engine.getAllowedTaskTransitions(task.id);
|
|
384
|
-
expect(allowed).toContain('in_production');
|
|
385
|
-
expect(allowed).toContain('internal_review');
|
|
386
|
-
const allowedPrevious = await engine.getAllowedPreviousTaskTransitions(task.id);
|
|
387
|
-
expect(allowedPrevious).toContain('in_production');
|
|
388
|
-
const updated = await engine.updateTask(task.id, { status: 'in_production' });
|
|
389
|
-
expect(updated?.status).toBe('in_production');
|
|
390
|
-
});
|
|
391
|
-
it('attributes activities and domain events to the real actor rather than the assignee', async () => {
|
|
392
|
-
const engine = new CriticalPathEngine();
|
|
393
|
-
const proj = await engine.createProject({ key: 'ACT', name: 'Actor Attribution Project' });
|
|
394
|
-
const task = await engine.createTask({
|
|
395
|
-
projectId: proj.id,
|
|
396
|
-
title: 'Assigned Task',
|
|
397
|
-
status: 'todo',
|
|
398
|
-
assigneeId: 'agent_worker_1'
|
|
399
|
-
});
|
|
400
|
-
const receivedEvents = [];
|
|
401
|
-
engine.events.subscribe('task.status_changed', async (evt) => {
|
|
402
|
-
receivedEvents.push(evt);
|
|
403
|
-
});
|
|
404
|
-
engine.events.subscribe('task.updated', async (evt) => {
|
|
405
|
-
receivedEvents.push(evt);
|
|
406
|
-
});
|
|
407
|
-
// Update with explicit actor (e.g. human user updating an assigned agent task)
|
|
408
|
-
await engine.updateTask(task.id, { status: 'in_progress' }, { actorId: 'user_human_42', actorName: 'Jack James' });
|
|
409
|
-
const activities = await engine.store.getActivities({ taskId: task.id });
|
|
410
|
-
const statusActivity = activities.find((a) => a.action === 'task.status_changed');
|
|
411
|
-
expect(statusActivity).toBeDefined();
|
|
412
|
-
expect(statusActivity?.actorId).toBe('user_human_42');
|
|
413
|
-
expect(statusActivity?.details?.actorName).toBe('Jack James');
|
|
414
|
-
expect(statusActivity?.actorId).not.toBe('agent_worker_1');
|
|
415
|
-
expect(receivedEvents).toHaveLength(1);
|
|
416
|
-
expect(receivedEvents[0].payload.actorId).toBe('user_human_42');
|
|
417
|
-
expect(receivedEvents[0].payload.actorName).toBe('Jack James');
|
|
418
|
-
// Update without explicit actor - should fall back to 'system', NEVER task.assigneeId
|
|
419
|
-
await engine.updateTask(task.id, {
|
|
420
|
-
title: 'Updated title'
|
|
421
|
-
});
|
|
422
|
-
const updatedActivities = await engine.store.getActivities({ taskId: task.id });
|
|
423
|
-
const updateActivity = updatedActivities.find((a) => a.action === 'task.updated');
|
|
424
|
-
expect(updateActivity).toBeDefined();
|
|
425
|
-
expect(updateActivity?.actorId).toBe('system');
|
|
426
|
-
expect(updateActivity?.actorId).not.toBe('agent_worker_1');
|
|
427
|
-
});
|
|
428
|
-
});
|
|
429
|
-
//# sourceMappingURL=index.test.js.map
|
package/dist/index.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAA4B,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGhG,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAChF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC3E,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAE9E,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;YACrC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpD,MAAM,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/C,MAAM,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/C,MAAM,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACtD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEjD,MAAM,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAExC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACtC,GAAG,EAAE,MAAM;YACX,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,gBAAgB;SAC9B,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEtC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,MAAM,UAAU,GAAuB;YACrC,EAAE,EAAE,iBAAiB;YACrB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE;gBACL,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE;oBACzB,YAAY,GAAG,IAAI,CAAC;oBACpB,OAAO;wBACL,GAAG,IAAI;wBACP,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC;qBAC5C,CAAC;gBACJ,CAAC;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEjE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,aAAa;YACpB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAExC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACnC,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;SAChC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACtC,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SACnB,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;YAC7C,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;YAC7C,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,uBAAuB;YAC9B,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,WAAW,EAAE,SAAS,CAAC,EAAE;YACzB,WAAW,EAAE,SAAS,CAAC,EAAE;YACzB,gBAAgB,EAAE,0BAA0B;YAC5C,OAAO,EAAE,0BAA0B;YACnC,cAAc,EAAE,EAAE;YAClB,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,CAAC;YAChB,wBAAwB,EAAE,GAAG;YAC7B,qBAAqB,EAAE,GAAG;YAC1B,uBAAuB,EAAE,GAAG;YAC5B,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAExC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACtC,GAAG,EAAE,MAAM;YACX,IAAI,EAAE,yBAAyB;YAC/B,iBAAiB,EAAE;gBACjB,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE;gBACzD,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE;gBACrE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE;aAC9D;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,QAAQ;YAClB,gBAAgB,EAAE,0BAA0B;YAC5C,OAAO,EAAE,0BAA0B;SACpC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAExC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAEpF,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnH,2BAA2B;QAC3B,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;YAC/B,MAAM,EAAE,KAAK,CAAC,EAAE;YAChB,eAAe,EAAE,KAAK,CAAC,EAAE;YACzB,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAExC,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC;YAC3C,IAAI,EAAE,0BAA0B;YAChC,gBAAgB,EAAE,SAAS;YAC3B,QAAQ,EAAE;gBACR,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE;gBAC7D,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE;gBACrE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE;aACtD;YACD,WAAW,EAAE;gBACX,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE;gBACtF,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE;aACvF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAElC,kCAAkC;QAClC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACtC,GAAG,EAAE,IAAI;YACT,IAAI,EAAE,kBAAkB;YACxB,UAAU,EAAE,QAAQ,CAAC,EAAE;SACxB,CAAC,CAAC;QAEH,cAAc;QACd,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEnC,4BAA4B;QAC5B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QAEzC,2CAA2C;QAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE5C,8EAA8E;QAC9E,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAElF,wCAAwC;QACxC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACpF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAE5G,kBAAkB;QAClB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;YAC7C,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,iBAAiB;YAC3B,SAAS,EAAE,IAAI;YACf,GAAG,EAAE,gDAAgD;SACtD,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAE5E,uCAAuC;QACvC,MAAM,YAAY,GAAG,+BAA+B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,MAAM,CACV,MAAM,CAAC,gBAAgB,CAAC;YACtB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,iBAAiB;YAC3B,SAAS,EAAE,IAAI;YACf,GAAG,EAAE,YAAY;SAClB,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACtG,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAEpG,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACtC,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,iBAAiB;SAC3B,CAAC,CAAC;QAEH,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;YACrC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,kBAAkB;QAClB,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE;YAC/D,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YACjD,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7D,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAE3D,6DAA6D;QAC7D,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE;YACpE,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAErD,2CAA2C;QAC3C,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE;YACjE,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAElD,qBAAqB;QACrB,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,EAAE;YAClE,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAErG,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACvC,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,kEAAkE;SAC5E,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAE7E,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACvC,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,2BAA2B;YACpC,QAAQ,EAAE,CAAC,iBAAiB,CAAC;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAEvD,0CAA0C;QAC1C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE;YACtD,OAAO,EAAE,+BAA+B;SACzC,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAErF,4BAA4B;QAC5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,aAAa;YACrB,SAAS,EAAE;gBACT,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;gBACtE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,+BAA+B,EAAE;aACvH;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAE5E,uBAAuB;QACvB,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAE3C,wDAAwD;QACxD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YAC1C,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,cAAc;YACrB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yGAAyG,EAAE,KAAK,IAAI,EAAE;QACvH,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAExF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACvC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACzC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,iBAAiB;YACxB,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,qBAAqB;SACrC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,aAAa,CAAC;YACzB,MAAM,EAAE,UAAU,CAAC,EAAE;YACrB,eAAe,EAAE,QAAQ,CAAC,EAAE;YAC5B,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QAEH,MAAM,eAAe,GAAU,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACtD,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,yBAAyB;QACzB,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE/C,0CAA0C;QAC1C,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEpE,MAAM,mBAAmB,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACtC,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,kBAAkB;YACxB,UAAU,EAAE,WAAW,CAAC,EAAE;SAC3B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,sBAAsB;YAC7B,MAAM,EAAE,oBAAoB;SAC7B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAE7C,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC,CAAC;QAC3F,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,gBAAgB;SAC7B,CAAC,CAAC;QAEH,MAAM,cAAc,GAAU,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3D,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACpD,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,+EAA+E;QAC/E,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAEnH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,qBAAqB,CAAC,CAAC;QAClF,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACtD,MAAM,CAAE,cAAc,EAAE,OAAe,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvE,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAE3D,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAChE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE/D,sFAAsF;QACtF,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE;YAC/B,KAAK,EAAE,eAAe;SACvB,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC;QAClF,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.test.d.ts","sourceRoot":"","sources":["../../src/plugins/plugins.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { CriticalPathEngine, CustomFieldValidationError, ValidationError, WorkflowValidationError } from '../index.js';
|
|
3
|
-
const strictWorkflow = {
|
|
4
|
-
name: 'Strict',
|
|
5
|
-
defaultStatusKey: 'todo',
|
|
6
|
-
statuses: [
|
|
7
|
-
{ key: 'todo', label: 'To Do', category: 'not_started' },
|
|
8
|
-
{ key: 'doing', label: 'Doing', category: 'in_progress' },
|
|
9
|
-
{ key: 'done', label: 'Done', category: 'completed' }
|
|
10
|
-
],
|
|
11
|
-
transitions: [
|
|
12
|
-
{ fromStatusKey: 'todo', toStatusKey: 'doing' },
|
|
13
|
-
{ fromStatusKey: 'doing', toStatusKey: 'done' }
|
|
14
|
-
]
|
|
15
|
-
};
|
|
16
|
-
describe('plugin system', () => {
|
|
17
|
-
it('runs init once with the engine before ready resolves', async () => {
|
|
18
|
-
const init = vi.fn(async (engine) => {
|
|
19
|
-
await engine.createProject({ name: 'Seeded by plugin' });
|
|
20
|
-
});
|
|
21
|
-
const engine = new CriticalPathEngine({ plugins: [{ id: 'seed', name: 'Seed', version: '1', init }] });
|
|
22
|
-
await engine.ready;
|
|
23
|
-
expect(init).toHaveBeenCalledTimes(1);
|
|
24
|
-
expect(init).toHaveBeenCalledWith(engine);
|
|
25
|
-
expect(await engine.getProjects()).toHaveLength(1);
|
|
26
|
-
});
|
|
27
|
-
it('surfaces init failures through ready without unhandled rejections', async () => {
|
|
28
|
-
const engine = new CriticalPathEngine({
|
|
29
|
-
plugins: [{ id: 'bad', name: 'Bad', version: '1', init: () => Promise.reject(new Error('boom')) }]
|
|
30
|
-
});
|
|
31
|
-
await expect(engine.ready).rejects.toThrow('boom');
|
|
32
|
-
});
|
|
33
|
-
it('validates values of plugin-registered custom field types and rejects unknown types', async () => {
|
|
34
|
-
const urlField = {
|
|
35
|
-
id: 'url-field',
|
|
36
|
-
name: 'URL field',
|
|
37
|
-
version: '1',
|
|
38
|
-
customFieldTypes: [
|
|
39
|
-
{ type: 'url', validate: (value) => (typeof value === 'string' && /^https?:\/\//.test(value) ? null : 'must be an http(s) URL') }
|
|
40
|
-
]
|
|
41
|
-
};
|
|
42
|
-
const engine = new CriticalPathEngine({ plugins: [urlField] });
|
|
43
|
-
const project = await engine.createProject({
|
|
44
|
-
name: 'Links',
|
|
45
|
-
customFieldDefinitions: [{ id: 'f1', key: 'spec', label: 'Spec', type: 'url' }]
|
|
46
|
-
});
|
|
47
|
-
await engine.createTask({ projectId: project.id, title: 'ok', customFields: { spec: 'https://example.com' } });
|
|
48
|
-
await expect(engine.createTask({ projectId: project.id, title: 'bad', customFields: { spec: 'ftp://x' } })).rejects.toThrow(/must be an http\(s\) URL/);
|
|
49
|
-
await expect(engine.createProject({ name: 'Unknown', customFieldDefinitions: [{ id: 'f', key: 'x', label: 'X', type: 'nope' }] })).rejects.toThrow(CustomFieldValidationError);
|
|
50
|
-
});
|
|
51
|
-
it('refuses custom field types that clash with built-in or already registered types', () => {
|
|
52
|
-
const clash = (type) => ({
|
|
53
|
-
id: `p-${type}-${Math.random()}`,
|
|
54
|
-
name: 'Clash',
|
|
55
|
-
version: '1',
|
|
56
|
-
customFieldTypes: [{ type, validate: () => null }]
|
|
57
|
-
});
|
|
58
|
-
expect(() => new CriticalPathEngine({ plugins: [clash('number')] })).toThrow(/already exists/);
|
|
59
|
-
expect(() => new CriticalPathEngine({ plugins: [clash('money'), clash('money')] })).toThrow(/already exists/);
|
|
60
|
-
});
|
|
61
|
-
it('validates the output of before-hooks, so plugins cannot bypass workflow rules', async () => {
|
|
62
|
-
const skipAhead = {
|
|
63
|
-
id: 'skip',
|
|
64
|
-
name: 'Skip ahead',
|
|
65
|
-
version: '1',
|
|
66
|
-
hooks: { beforeTaskUpdate: (_id, updates) => ({ ...updates, status: 'done' }) }
|
|
67
|
-
};
|
|
68
|
-
const engine = new CriticalPathEngine({ plugins: [skipAhead] });
|
|
69
|
-
const workflow = await engine.createWorkflow(strictWorkflow);
|
|
70
|
-
const project = await engine.createProject({ name: 'Strict', workflowId: workflow.id });
|
|
71
|
-
const task = await engine.createTask({ projectId: project.id, title: 'T' });
|
|
72
|
-
await expect(engine.updateTask(task.id, { title: 'renamed' })).rejects.toThrow(WorkflowValidationError);
|
|
73
|
-
expect((await engine.getTask(task.id))?.status).toBe('todo');
|
|
74
|
-
});
|
|
75
|
-
it('prevents before-hooks from moving tasks between projects', async () => {
|
|
76
|
-
let otherProjectId = '';
|
|
77
|
-
const mover = {
|
|
78
|
-
id: 'mover',
|
|
79
|
-
name: 'Mover',
|
|
80
|
-
version: '1',
|
|
81
|
-
hooks: {
|
|
82
|
-
beforeTaskCreate: (task) => (task.title === 'move me' ? { ...task, projectId: otherProjectId } : task),
|
|
83
|
-
beforeTaskUpdate: (_id, updates) => ({ ...updates, projectId: otherProjectId })
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
const engine = new CriticalPathEngine({ plugins: [mover] });
|
|
87
|
-
const home = await engine.createProject({ name: 'Home' });
|
|
88
|
-
otherProjectId = (await engine.createProject({ name: 'Other' })).id;
|
|
89
|
-
await expect(engine.createTask({ projectId: home.id, title: 'move me' })).rejects.toThrow(ValidationError);
|
|
90
|
-
const task = await engine.createTask({ projectId: home.id, title: 'stay' });
|
|
91
|
-
await engine.updateTask(task.id, { title: 'still here' });
|
|
92
|
-
expect((await engine.getTask(task.id))?.projectId).toBe(home.id);
|
|
93
|
-
});
|
|
94
|
-
it('enforces required custom fields even when none are supplied', async () => {
|
|
95
|
-
const engine = new CriticalPathEngine();
|
|
96
|
-
const project = await engine.createProject({
|
|
97
|
-
name: 'Required',
|
|
98
|
-
customFieldDefinitions: [{ id: 'f', key: 'client', label: 'Client', type: 'text', required: true }]
|
|
99
|
-
});
|
|
100
|
-
await expect(engine.createTask({ projectId: project.id, title: 'missing' })).rejects.toThrow(/required/);
|
|
101
|
-
});
|
|
102
|
-
it('logs after-hook failures without failing the write or skipping events', async () => {
|
|
103
|
-
const consoleError = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
104
|
-
const engine = new CriticalPathEngine({
|
|
105
|
-
plugins: [{ id: 'flaky', name: 'Flaky', version: '1', hooks: { afterTaskCreate: () => { throw new Error('downstream'); } } }]
|
|
106
|
-
});
|
|
107
|
-
const published = [];
|
|
108
|
-
engine.events.subscribe('task.created', (e) => void published.push(e.name));
|
|
109
|
-
const project = await engine.createProject({ name: 'After' });
|
|
110
|
-
const task = await engine.createTask({ projectId: project.id, title: 'stored' });
|
|
111
|
-
expect(await engine.getTask(task.id)).not.toBeNull();
|
|
112
|
-
expect(published).toEqual(['task.created']);
|
|
113
|
-
expect(consoleError).toHaveBeenCalledWith(expect.stringContaining('"flaky" afterTaskCreate'), expect.any(Error));
|
|
114
|
-
consoleError.mockRestore();
|
|
115
|
-
});
|
|
116
|
-
it('passes the deleted task to delete hooks', async () => {
|
|
117
|
-
const seen = [];
|
|
118
|
-
const engine = new CriticalPathEngine({
|
|
119
|
-
plugins: [
|
|
120
|
-
{
|
|
121
|
-
id: 'audit',
|
|
122
|
-
name: 'Audit',
|
|
123
|
-
version: '1',
|
|
124
|
-
hooks: {
|
|
125
|
-
beforeTaskDelete: (_id, task) => void seen.push(`before:${task.title}`),
|
|
126
|
-
afterTaskDelete: (_id, task) => void seen.push(`after:${task.title}`)
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
]
|
|
130
|
-
});
|
|
131
|
-
const project = await engine.createProject({ name: 'Del' });
|
|
132
|
-
const task = await engine.createTask({ projectId: project.id, title: 'gone' });
|
|
133
|
-
await engine.deleteTask(task.id);
|
|
134
|
-
expect(seen).toEqual(['before:gone', 'after:gone']);
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
//# sourceMappingURL=plugins.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.test.js","sourceRoot":"","sources":["../../src/plugins/plugins.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,eAAe,EACf,uBAAuB,EAExB,MAAM,aAAa,CAAC;AAErB,MAAM,cAAc,GAAG;IACrB,IAAI,EAAE,QAAQ;IACd,gBAAgB,EAAE,MAAM;IACxB,QAAQ,EAAE;QACR,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAsB,EAAE;QACjE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAsB,EAAE;QAClE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAoB,EAAE;KAC/D;IACD,WAAW,EAAE;QACX,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE;QAC/C,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE;KAChD;CACF,CAAC;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,MAA0B,EAAE,EAAE;YACtD,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACvG,MAAM,MAAM,CAAC,KAAK,CAAC;QAEnB,MAAM,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YACpC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;SACnG,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,QAAQ,GAAuB;YACnC,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,GAAG;YACZ,gBAAgB,EAAE;gBAChB,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,EAAE;aAClI;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACzC,IAAI,EAAE,OAAO;YACb,sBAAsB,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;SAChF,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC/G,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACzH,0BAA0B,CAC3B,CAAC;QACF,MAAM,MAAM,CACV,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CACrH,CAAC,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,KAAK,GAAG,CAAC,IAAY,EAAsB,EAAE,CAAC,CAAC;YACnD,EAAE,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YAChC,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,GAAG;YACZ,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;SACnD,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC/F,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,SAAS,GAAuB;YACpC,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,EAAE,gBAAgB,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE;SAChF,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACxF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAE5E,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACxG,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,MAAM,KAAK,GAAuB;YAChC,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE;gBACL,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACtG,gBAAgB,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;aAChF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,cAAc,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpE,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC3G,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACzC,IAAI,EAAE,UAAU;YAChB,sBAAsB,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;SACpG,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YACpC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;SAC9H,CAAC,CAAC;QACH,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAE5E,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACjH,YAAY,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YACpC,OAAO,EAAE;gBACP;oBACE,EAAE,EAAE,OAAO;oBACX,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,GAAG;oBACZ,KAAK,EAAE;wBACL,gBAAgB,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;wBACvE,eAAe,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;qBACtE;iBACF;aACF;SACF,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.test.d.ts","sourceRoot":"","sources":["../../src/schemas/schemas.test.ts"],"names":[],"mappings":""}
|