@critical-path/client 0.20.5 → 0.20.7

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.
@@ -1,359 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { CriticalPathClient } from './index.js';
3
- describe('@critical-path/client Tests', () => {
4
- it('instantiates client and accepts custom mock fetch', async () => {
5
- const mockFetch = async (url, init) => {
6
- const urlStr = url.toString();
7
- if (urlStr.endsWith('/projects') && (!init?.method || init.method.toUpperCase() === 'GET')) {
8
- return new Response(JSON.stringify({ projects: [{ id: 'p1', key: 'TEST', name: 'Mock Proj' }] }), { status: 200 });
9
- }
10
- return new Response(JSON.stringify({ error: 'Not found' }), { status: 404 });
11
- };
12
- const client = new CriticalPathClient({
13
- baseUrl: 'http://localhost:3000/api/critical-path',
14
- fetch: mockFetch
15
- });
16
- const projects = await client.getProjects();
17
- expect(projects.length).toBe(1);
18
- expect(projects[0].name).toBe('Mock Proj');
19
- });
20
- it('fetches workflows and task allowed transitions via client SDK', async () => {
21
- const mockFetch = async (url, init) => {
22
- const urlStr = url.toString();
23
- if (urlStr.endsWith('/workflows')) {
24
- return new Response(JSON.stringify({ workflows: [{ id: 'wf1', name: 'SDK Workflow' }] }), { status: 200 });
25
- }
26
- if (urlStr.endsWith('/tasks/t1/transitions')) {
27
- return new Response(JSON.stringify({
28
- allowedNextStatuses: ['in_progress', 'canceled'],
29
- allowedPreviousStatuses: ['backlog']
30
- }), { status: 200 });
31
- }
32
- return new Response(JSON.stringify({ error: 'Not found' }), { status: 404 });
33
- };
34
- const client = new CriticalPathClient({
35
- baseUrl: 'http://localhost:3000/api/critical-path',
36
- fetch: mockFetch
37
- });
38
- const workflows = await client.getWorkflows();
39
- expect(workflows).toHaveLength(1);
40
- expect(workflows[0].name).toBe('SDK Workflow');
41
- const transitions = await client.getAllowedTaskTransitions('t1');
42
- expect(transitions).toEqual(['in_progress', 'canceled']);
43
- const previousTransitions = await client.getAllowedPreviousTaskTransitions('t1');
44
- expect(previousTransitions).toEqual(['backlog']);
45
- });
46
- it('handles comments and attachments through client SDK methods', async () => {
47
- const mockFetch = async (url, init) => {
48
- const urlStr = url.toString();
49
- const method = init?.method?.toUpperCase() || 'GET';
50
- if (urlStr.includes('/comments?taskId=t1') && method === 'GET') {
51
- return new Response(JSON.stringify({ comments: [{ id: 'c1', taskId: 't1', content: 'SDK Comment', authorId: 'u1', authorType: 'user' }] }), { status: 200 });
52
- }
53
- if (urlStr.endsWith('/comments') && method === 'POST') {
54
- const body = JSON.parse(init?.body);
55
- return new Response(JSON.stringify({ comment: { id: 'c2', ...body } }), { status: 201 });
56
- }
57
- if (urlStr.endsWith('/comments/c1') && method === 'PATCH') {
58
- const body = JSON.parse(init?.body);
59
- return new Response(JSON.stringify({ comment: { id: 'c1', content: body.content } }), { status: 200 });
60
- }
61
- if (urlStr.endsWith('/comments/c1/reactions') && method === 'POST') {
62
- const body = JSON.parse(init?.body);
63
- return new Response(JSON.stringify({ comment: { id: 'c1', reactions: [body] } }), { status: 200 });
64
- }
65
- if (urlStr.split('?')[0].endsWith('/comments/c1/reactions') && method === 'DELETE') {
66
- return new Response(JSON.stringify({ comment: { id: 'c1', reactions: [] } }), { status: 200 });
67
- }
68
- if (urlStr.endsWith('/comments/c1') && method === 'DELETE') {
69
- return new Response(JSON.stringify({ success: true }), { status: 200 });
70
- }
71
- if (urlStr.includes('/attachments?taskId=t1') && method === 'GET') {
72
- return new Response(JSON.stringify({ attachments: [{ id: 'a1', filename: 'SDK Doc', mimeType: 'text/plain', sizeBytes: 50, url: 'https://cdn.example.com/a1' }] }), { status: 200 });
73
- }
74
- if (urlStr.endsWith('/attachments') && method === 'POST') {
75
- const body = JSON.parse(init?.body);
76
- return new Response(JSON.stringify({ attachment: { id: 'a2', ...body } }), { status: 201 });
77
- }
78
- if (urlStr.endsWith('/attachments/upload') && method === 'POST') {
79
- const body = JSON.parse(init?.body);
80
- return new Response(JSON.stringify({ attachment: { id: 'a_up', ...body, url: 'https://cdn.example.com/uploaded.png' } }), { status: 201 });
81
- }
82
- if (urlStr.endsWith('/attachments/a1') && method === 'DELETE') {
83
- return new Response(JSON.stringify({ success: true }), { status: 200 });
84
- }
85
- return new Response(JSON.stringify({ error: 'Not found' }), { status: 404 });
86
- };
87
- const client = new CriticalPathClient({
88
- baseUrl: 'http://localhost:3000/api/critical-path',
89
- fetch: mockFetch
90
- });
91
- const comments = await client.getComments('t1');
92
- expect(comments).toHaveLength(1);
93
- expect(comments[0].content).toBe('SDK Comment');
94
- const createdComment = await client.addComment({ taskId: 't1', content: 'New comment' });
95
- expect(createdComment.id).toBe('c2');
96
- const updatedComment = await client.updateComment('c1', { content: 'Updated' });
97
- expect(updatedComment.content).toBe('Updated');
98
- const reacted = await client.addCommentReaction('c1', { emoji: '🙌' });
99
- expect(reacted.reactions).toHaveLength(1);
100
- expect(reacted.reactions?.[0].emoji).toBe('🙌');
101
- const unreacted = await client.removeCommentReaction('c1', { emoji: '🙌' });
102
- expect(unreacted.reactions).toHaveLength(0);
103
- const deletedComment = await client.deleteComment('c1');
104
- expect(deletedComment).toBe(true);
105
- const attachments = await client.getAttachments({ taskId: 't1' });
106
- expect(attachments).toHaveLength(1);
107
- expect(attachments[0].filename).toBe('SDK Doc');
108
- const createdAtt = await client.createAttachment({ filename: 'file.txt', mimeType: 'text/plain', sizeBytes: 12, url: 'https://example.com/file.txt' });
109
- expect(createdAtt.id).toBe('a2');
110
- const uploadedAtt = await client.uploadAttachmentFile({ filename: 'uploaded.png', data: 'base64data' });
111
- expect(uploadedAtt.id).toBe('a_up');
112
- expect(uploadedAtt.url).toBe('https://cdn.example.com/uploaded.png');
113
- const deletedAtt = await client.deleteAttachment('a1');
114
- expect(deletedAtt).toBe(true);
115
- });
116
- it('handles deliverables CRUD and summary rollups via client SDK', async () => {
117
- const mockDeliverable = {
118
- id: 'd1',
119
- projectId: 'p1',
120
- title: 'Hero Cut 30s',
121
- status: 'planned',
122
- format: 'ProRes 422',
123
- outputUrls: [],
124
- createdAt: '2026-09-04T00:00:00Z',
125
- updatedAt: '2026-09-04T00:00:00Z'
126
- };
127
- const mockSummary = {
128
- deliverable: mockDeliverable,
129
- totalTasks: 4,
130
- completedTasks: 2,
131
- activeTasks: 2,
132
- progressPercentage: 50,
133
- estimatedHours: 20,
134
- loggedHours: 12
135
- };
136
- const mockFetch = async (url, init) => {
137
- const urlStr = url.toString();
138
- const method = init?.method?.toUpperCase() || 'GET';
139
- if (urlStr.includes('/deliverables?projectId=p1') && method === 'GET') {
140
- return new Response(JSON.stringify({ deliverables: [mockDeliverable] }), { status: 200 });
141
- }
142
- if (urlStr.endsWith('/deliverables/d1/summary') && method === 'GET') {
143
- return new Response(JSON.stringify({ summary: mockSummary }), { status: 200 });
144
- }
145
- if (urlStr.endsWith('/deliverables/d1') && method === 'GET') {
146
- return new Response(JSON.stringify({ deliverable: mockDeliverable }), { status: 200 });
147
- }
148
- if (urlStr.endsWith('/deliverables') && method === 'POST') {
149
- const body = JSON.parse(init?.body);
150
- return new Response(JSON.stringify({ deliverable: { id: 'd2', ...body } }), { status: 201 });
151
- }
152
- if (urlStr.endsWith('/deliverables/d1') && method === 'PATCH') {
153
- const body = JSON.parse(init?.body);
154
- return new Response(JSON.stringify({ deliverable: { ...mockDeliverable, ...body } }), { status: 200 });
155
- }
156
- if (urlStr.endsWith('/deliverables/d1') && method === 'DELETE') {
157
- return new Response(JSON.stringify({ success: true }), { status: 200 });
158
- }
159
- return new Response(JSON.stringify({ error: 'Not found' }), { status: 404 });
160
- };
161
- const client = new CriticalPathClient({
162
- baseUrl: 'http://localhost:3000/api/critical-path',
163
- fetch: mockFetch
164
- });
165
- const list = await client.getDeliverables('p1');
166
- expect(list).toHaveLength(1);
167
- expect(list[0].title).toBe('Hero Cut 30s');
168
- const single = await client.getDeliverable('d1');
169
- expect(single.id).toBe('d1');
170
- const summary = await client.getDeliverableSummary('d1');
171
- expect(summary.totalTasks).toBe(4);
172
- expect(summary.progressPercentage).toBe(50);
173
- const created = await client.createDeliverable({
174
- projectId: 'p1',
175
- title: 'Hero Cut 15s',
176
- format: 'ProRes 422'
177
- });
178
- expect(created.id).toBe('d2');
179
- const updated = await client.updateDeliverable('d1', { status: 'delivered' });
180
- expect(updated.status).toBe('delivered');
181
- const deleted = await client.deleteDeliverable('d1');
182
- expect(deleted).toBe(true);
183
- });
184
- it('retrieves task lifecycle state and dependencies via client SDK', async () => {
185
- const mockState = {
186
- semanticStatus: 'not_started',
187
- isReady: false,
188
- isBlocked: true,
189
- blockingTaskIds: ['task_upstream'],
190
- isOverdue: false,
191
- isUpcoming: false,
192
- isUnplanned: true,
193
- isUnassigned: false,
194
- isStalled: false,
195
- isOverEstimate: false,
196
- isPaceWarning: false,
197
- isDone: false,
198
- isActive: false,
199
- isCancelled: false
200
- };
201
- const mockFetch = async (url) => {
202
- const urlStr = url.toString();
203
- if (urlStr.endsWith('/tasks/t1/lifecycle')) {
204
- return new Response(JSON.stringify({ state: mockState }), { status: 200 });
205
- }
206
- if (urlStr.endsWith('/tasks/t1/dependencies')) {
207
- return new Response(JSON.stringify({
208
- graph: {
209
- taskId: 't1',
210
- upstreamTasks: [{ id: 'task_upstream', title: 'API', status: 'in_progress' }],
211
- downstreamTasks: [],
212
- dependencies: [{ id: 'dep1', taskId: 't1', dependsOnTaskId: 'task_upstream', type: 'blocking' }]
213
- }
214
- }), { status: 200 });
215
- }
216
- return new Response(JSON.stringify({ error: 'Not found' }), { status: 404 });
217
- };
218
- const client = new CriticalPathClient({
219
- baseUrl: 'http://localhost:3000/api/critical-path',
220
- fetch: mockFetch
221
- });
222
- const lifecycle = await client.getTaskLifecycleState('t1');
223
- expect(lifecycle.isBlocked).toBe(true);
224
- expect(lifecycle.isReady).toBe(false);
225
- expect(lifecycle.blockingTaskIds).toEqual(['task_upstream']);
226
- const deps = await client.getTaskDependencies('t1');
227
- expect(deps.upstreamTasks).toHaveLength(1);
228
- expect(deps.upstreamTasks[0].id).toBe('task_upstream');
229
- expect(deps.dependencies).toHaveLength(1);
230
- });
231
- it('fetches critical path and timeline ladder through client SDK', async () => {
232
- const mockFetch = async (url) => {
233
- const urlStr = url.toString();
234
- if (urlStr.endsWith('/projects/p1/critical-path')) {
235
- return new Response(JSON.stringify({
236
- analysis: {
237
- projectId: 'p1',
238
- calculatedAt: '2026-09-11T10:00:00Z',
239
- totalDurationHours: 18,
240
- criticalTaskIds: ['t1', 't2'],
241
- tasks: []
242
- }
243
- }), { status: 200 });
244
- }
245
- if (urlStr.includes('/projects/p1/ladder?level=macro')) {
246
- return new Response(JSON.stringify({
247
- ladder: {
248
- projectId: 'p1',
249
- generatedAt: '2026-09-11T10:00:00Z',
250
- level: 'macro',
251
- macro: {
252
- projectId: 'p1',
253
- projectName: 'Client Project',
254
- totalDurationHours: 18,
255
- criticalPathDurationHours: 18,
256
- overallProgressPercentage: 50,
257
- health: 'on_track',
258
- totalTasks: 2,
259
- completedTasks: 1,
260
- inProgressTasks: 1,
261
- blockedTasks: 0,
262
- totalEstimatedHours: 18,
263
- totalLoggedHours: 9,
264
- phases: []
265
- }
266
- }
267
- }), { status: 200 });
268
- }
269
- if (urlStr.endsWith('/tasks/t2/ladder')) {
270
- return new Response(JSON.stringify({
271
- taskLadder: {
272
- taskId: 't2',
273
- standard: { id: 't2', title: 'Task 2', status: 'in_progress', priority: 'high' },
274
- concrete: { taskId: 't2', attachments: [], deliverables: [], todos: [], timeEntries: [], dailyEffortDistribution: [], activities: [] }
275
- }
276
- }), { status: 200 });
277
- }
278
- if (urlStr.includes('/projects/p1/workload')) {
279
- return new Response(JSON.stringify({
280
- workload: {
281
- projectId: 'p1',
282
- startDate: '2026-09-01',
283
- endDate: '2026-09-14',
284
- interval: 'week',
285
- groupBy: 'assignee',
286
- metric: 'blended',
287
- seriesKeys: ['u1', 'u2'],
288
- seriesLabels: { u1: 'Alice', u2: 'Bob' },
289
- buckets: [
290
- { date: '2026-09-01', timestamp: 1788220800000, totalHours: 20, values: { u1: 12, u2: 8 } }
291
- ],
292
- totalHours: 20
293
- }
294
- }), { status: 200 });
295
- }
296
- return new Response(JSON.stringify({ error: 'Not found' }), { status: 404 });
297
- };
298
- const client = new CriticalPathClient({
299
- baseUrl: 'http://localhost:3000/api/critical-path',
300
- fetch: mockFetch
301
- });
302
- const cpm = await client.calculateCriticalPath('p1');
303
- expect(cpm.totalDurationHours).toBe(18);
304
- expect(cpm.criticalTaskIds).toEqual(['t1', 't2']);
305
- const ladder = await client.getTimelineLadder('p1', { level: 'macro' });
306
- expect(ladder.macro?.projectName).toBe('Client Project');
307
- expect(ladder.level).toBe('macro');
308
- const taskLadder = await client.getTaskLadder('t2');
309
- expect(taskLadder.taskId).toBe('t2');
310
- expect(taskLadder.standard.title).toBe('Task 2');
311
- const workload = await client.getWorkloadDistribution('p1', { interval: 'week', metric: 'blended' });
312
- expect(workload.projectId).toBe('p1');
313
- expect(workload.totalHours).toBe(20);
314
- expect(workload.seriesKeys).toEqual(['u1', 'u2']);
315
- expect(workload.buckets[0].values.u1).toBe(12);
316
- });
317
- it('posts agent status updates via client.updateStatus', async () => {
318
- let capturedBody = null;
319
- const mockFetch = async (url, init) => {
320
- const urlStr = url.toString();
321
- if (urlStr.endsWith('/status') && init?.method === 'POST') {
322
- capturedBody = JSON.parse(init.body);
323
- return new Response(JSON.stringify({ success: true, status: capturedBody.status, timestamp: 123456789 }), { status: 200 });
324
- }
325
- return new Response(JSON.stringify({ error: 'Not found' }), { status: 404 });
326
- };
327
- const client = new CriticalPathClient({
328
- baseUrl: 'http://localhost:3000/api/critical-path',
329
- fetch: mockFetch
330
- });
331
- const result = await client.updateStatus('Running unit tests', {
332
- taskId: 't1',
333
- projectId: 'p1',
334
- details: 'vitest run 15 passed'
335
- });
336
- expect(result.success).toBe(true);
337
- expect(result.status).toBe('Running unit tests');
338
- expect(capturedBody).toEqual({
339
- status: 'Running unit tests',
340
- taskId: 't1',
341
- projectId: 'p1',
342
- details: 'vitest run 15 passed',
343
- isEngaged: true
344
- });
345
- });
346
- it('resolves delete methods to false on 404 and still throws other errors', async () => {
347
- let status = 404;
348
- const mockFetch = async () => new Response(JSON.stringify({ error: status === 404 ? 'Not found' : 'Internal Server Error' }), {
349
- status,
350
- headers: { 'Content-Type': 'application/json' }
351
- });
352
- const client = new CriticalPathClient({ baseUrl: 'http://localhost/api', fetch: mockFetch });
353
- expect(await client.deleteTask('missing')).toBe(false);
354
- expect(await client.deleteComment('missing')).toBe(false);
355
- status = 500;
356
- await expect(client.deleteTask('t1')).rejects.toThrow('Internal Server Error');
357
- });
358
- });
359
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=routes.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes.test.d.ts","sourceRoot":"","sources":["../src/routes.test.ts"],"names":[],"mappings":""}
@@ -1,95 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { ROUTES } from '@critical-path/server';
3
- import { CriticalPathClient } from './index.js';
4
- /**
5
- * Every server route must be reachable through the SDK. When a route is added to the router (and
6
- * its OpenAPI `ROUTES` table), add the client method that calls it here.
7
- */
8
- const CLIENT_METHOD_FOR_ROUTE = {
9
- 'GET /webhooks': 'getWebhooks',
10
- 'POST /webhooks': 'createWebhook',
11
- 'GET /webhooks/{webhookId}': 'getWebhook',
12
- 'PATCH /webhooks/{webhookId}': 'updateWebhook',
13
- 'DELETE /webhooks/{webhookId}': 'deleteWebhook',
14
- 'GET /workflows': 'getWorkflows',
15
- 'POST /workflows': 'createWorkflow',
16
- 'GET /workflows/{workflowId}': 'getWorkflow',
17
- 'PATCH /workflows/{workflowId}': 'updateWorkflow',
18
- 'DELETE /workflows/{workflowId}': 'deleteWorkflow',
19
- 'GET /projects': 'getProjects',
20
- 'POST /projects': 'createProject',
21
- 'GET /projects/{projectId}': 'getProject',
22
- 'PATCH /projects/{projectId}': 'updateProject',
23
- 'DELETE /projects/{projectId}': 'deleteProject',
24
- 'GET /projects/{projectId}/critical-path': 'calculateCriticalPath',
25
- 'GET /projects/{projectId}/ladder': 'getTimelineLadder',
26
- 'GET /projects/{projectId}/workload': 'getWorkloadDistribution',
27
- 'GET /tasks': 'queryTasks',
28
- 'POST /tasks': 'createTask',
29
- 'GET /tasks/{taskId}': 'getTask',
30
- 'PATCH /tasks/{taskId}': 'updateTask',
31
- 'DELETE /tasks/{taskId}': 'deleteTask',
32
- // Task-scoped aliases of the comment and attachment collections
33
- 'GET /tasks/{taskId}/comments': 'getComments',
34
- 'POST /tasks/{taskId}/comments': 'addComment',
35
- 'GET /tasks/{taskId}/attachments': 'getAttachments',
36
- 'POST /tasks/{taskId}/attachments': 'createAttachment',
37
- 'GET /tasks/{taskId}/dependencies': 'getTaskDependencies',
38
- 'POST /tasks/{taskId}/dependencies': 'addDependency',
39
- 'DELETE /tasks/{taskId}/dependencies/{dependencyId}': 'removeDependency',
40
- 'GET /tasks/{taskId}/lifecycle': 'getTaskLifecycleState',
41
- 'GET /tasks/{taskId}/transitions': 'getAllowedTaskTransitions',
42
- 'GET /tasks/{taskId}/ladder': 'getTaskLadder',
43
- 'GET /tasks/{taskId}/metrics': 'getTaskMetrics',
44
- 'GET /tasks/{taskId}/progress-history': 'getTaskProgressHistory',
45
- 'GET /teams': 'getTeams',
46
- 'POST /teams': 'createTeam',
47
- 'GET /teams/{teamId}': 'getTeam',
48
- 'PATCH /teams/{teamId}': 'updateTeam',
49
- 'DELETE /teams/{teamId}': 'deleteTeam',
50
- 'GET /containers': 'getContainers',
51
- 'POST /containers': 'createContainer',
52
- 'GET /containers/{containerId}': 'getContainer',
53
- 'PATCH /containers/{containerId}': 'updateContainer',
54
- 'DELETE /containers/{containerId}': 'deleteContainer',
55
- 'GET /deliverables': 'getDeliverables',
56
- 'POST /deliverables': 'createDeliverable',
57
- 'GET /deliverables/{deliverableId}': 'getDeliverable',
58
- 'GET /deliverables/{deliverableId}/summary': 'getDeliverableSummary',
59
- 'PATCH /deliverables/{deliverableId}': 'updateDeliverable',
60
- 'DELETE /deliverables/{deliverableId}': 'deleteDeliverable',
61
- 'GET /iterations': 'getIterations',
62
- 'POST /iterations': 'createIteration',
63
- 'GET /iterations/{iterationId}': 'getIteration',
64
- 'PATCH /iterations/{iterationId}': 'updateIteration',
65
- 'DELETE /iterations/{iterationId}': 'deleteIteration',
66
- 'GET /activities': 'queryActivities',
67
- 'GET /comments': 'getComments',
68
- 'POST /comments': 'addComment',
69
- 'GET /comments/{commentId}': 'getComment',
70
- 'PATCH /comments/{commentId}': 'updateComment',
71
- 'DELETE /comments/{commentId}': 'deleteComment',
72
- 'POST /comments/{commentId}/reactions': 'addCommentReaction',
73
- 'DELETE /comments/{commentId}/reactions': 'removeCommentReaction',
74
- 'GET /attachments': 'getAttachments',
75
- 'POST /attachments': 'createAttachment',
76
- 'POST /attachments/upload': 'uploadAttachmentFile',
77
- 'POST /attachments/presign': 'getPresignedAttachmentUploadUrl',
78
- 'GET /attachments/{attachmentId}': 'getAttachment',
79
- 'DELETE /attachments/{attachmentId}': 'deleteAttachment',
80
- 'GET /time-entries': 'getTimeEntries',
81
- 'POST /time-entries': 'logTime',
82
- 'GET /workload': 'getWorkloadDistribution',
83
- 'POST /status': 'updateStatus'
84
- };
85
- describe('client route coverage', () => {
86
- it('has a client method for every server route', () => {
87
- const client = new CriticalPathClient({ baseUrl: 'http://localhost' });
88
- const missing = ROUTES.map((r) => `${r.method.toUpperCase()} ${r.path}`).filter((key) => {
89
- const method = CLIENT_METHOD_FOR_ROUTE[key];
90
- return !method || typeof client[method] !== 'function';
91
- });
92
- expect(missing).toEqual([]);
93
- });
94
- });
95
- //# sourceMappingURL=routes.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes.test.js","sourceRoot":"","sources":["../src/routes.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD;;;GAGG;AACH,MAAM,uBAAuB,GAA6C;IACxE,eAAe,EAAE,aAAa;IAC9B,gBAAgB,EAAE,eAAe;IACjC,2BAA2B,EAAE,YAAY;IACzC,6BAA6B,EAAE,eAAe;IAC9C,8BAA8B,EAAE,eAAe;IAC/C,gBAAgB,EAAE,cAAc;IAChC,iBAAiB,EAAE,gBAAgB;IACnC,6BAA6B,EAAE,aAAa;IAC5C,+BAA+B,EAAE,gBAAgB;IACjD,gCAAgC,EAAE,gBAAgB;IAClD,eAAe,EAAE,aAAa;IAC9B,gBAAgB,EAAE,eAAe;IACjC,2BAA2B,EAAE,YAAY;IACzC,6BAA6B,EAAE,eAAe;IAC9C,8BAA8B,EAAE,eAAe;IAC/C,yCAAyC,EAAE,uBAAuB;IAClE,kCAAkC,EAAE,mBAAmB;IACvD,oCAAoC,EAAE,yBAAyB;IAC/D,YAAY,EAAE,YAAY;IAC1B,aAAa,EAAE,YAAY;IAC3B,qBAAqB,EAAE,SAAS;IAChC,uBAAuB,EAAE,YAAY;IACrC,wBAAwB,EAAE,YAAY;IACtC,gEAAgE;IAChE,8BAA8B,EAAE,aAAa;IAC7C,+BAA+B,EAAE,YAAY;IAC7C,iCAAiC,EAAE,gBAAgB;IACnD,kCAAkC,EAAE,kBAAkB;IACtD,kCAAkC,EAAE,qBAAqB;IACzD,mCAAmC,EAAE,eAAe;IACpD,oDAAoD,EAAE,kBAAkB;IACxE,+BAA+B,EAAE,uBAAuB;IACxD,iCAAiC,EAAE,2BAA2B;IAC9D,4BAA4B,EAAE,eAAe;IAC7C,6BAA6B,EAAE,gBAAgB;IAC/C,sCAAsC,EAAE,wBAAwB;IAChE,YAAY,EAAE,UAAU;IACxB,aAAa,EAAE,YAAY;IAC3B,qBAAqB,EAAE,SAAS;IAChC,uBAAuB,EAAE,YAAY;IACrC,wBAAwB,EAAE,YAAY;IACtC,iBAAiB,EAAE,eAAe;IAClC,kBAAkB,EAAE,iBAAiB;IACrC,+BAA+B,EAAE,cAAc;IAC/C,iCAAiC,EAAE,iBAAiB;IACpD,kCAAkC,EAAE,iBAAiB;IACrD,mBAAmB,EAAE,iBAAiB;IACtC,oBAAoB,EAAE,mBAAmB;IACzC,mCAAmC,EAAE,gBAAgB;IACrD,2CAA2C,EAAE,uBAAuB;IACpE,qCAAqC,EAAE,mBAAmB;IAC1D,sCAAsC,EAAE,mBAAmB;IAC3D,iBAAiB,EAAE,eAAe;IAClC,kBAAkB,EAAE,iBAAiB;IACrC,+BAA+B,EAAE,cAAc;IAC/C,iCAAiC,EAAE,iBAAiB;IACpD,kCAAkC,EAAE,iBAAiB;IACrD,iBAAiB,EAAE,iBAAiB;IACpC,eAAe,EAAE,aAAa;IAC9B,gBAAgB,EAAE,YAAY;IAC9B,2BAA2B,EAAE,YAAY;IACzC,6BAA6B,EAAE,eAAe;IAC9C,8BAA8B,EAAE,eAAe;IAC/C,sCAAsC,EAAE,oBAAoB;IAC5D,wCAAwC,EAAE,uBAAuB;IACjE,kBAAkB,EAAE,gBAAgB;IACpC,mBAAmB,EAAE,kBAAkB;IACvC,0BAA0B,EAAE,sBAAsB;IAClD,2BAA2B,EAAE,iCAAiC;IAC9D,iCAAiC,EAAE,eAAe;IAClD,oCAAoC,EAAE,kBAAkB;IACxD,mBAAmB,EAAE,gBAAgB;IACrC,oBAAoB,EAAE,SAAS;IAC/B,eAAe,EAAE,yBAAyB;IAC1C,cAAc,EAAE,cAAc;CAC/B,CAAC;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACtF,MAAM,MAAM,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAC5C,OAAO,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC;QACzD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=transport.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transport.test.d.ts","sourceRoot":"","sources":["../src/transport.test.ts"],"names":[],"mappings":""}
@@ -1,89 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { CriticalPathRouter } from '@critical-path/server';
3
- import { CriticalPathClient, CriticalPathError } from './index.js';
4
- function recordingFetch(respond) {
5
- const calls = [];
6
- const fetchImpl = (async (url, init) => {
7
- const call = { url, method: init.method ?? 'GET', headers: init.headers };
8
- calls.push(call);
9
- return respond(call, calls.length);
10
- });
11
- return { calls, fetchImpl };
12
- }
13
- const ok = (body) => Response.json(body);
14
- describe('client transport', () => {
15
- it('throws CriticalPathError with status and server details', async () => {
16
- const router = new CriticalPathRouter();
17
- const client = new CriticalPathClient({
18
- baseUrl: 'http://localhost/api/critical-path',
19
- fetch: ((input, init) => router.handleRequest(new Request(input, init)))
20
- });
21
- const project = await client.createProject({ name: 'Errors' });
22
- const a = await client.createTask({ projectId: project.id, title: 'A' });
23
- const b = await client.createTask({ projectId: project.id, title: 'B' });
24
- await client.addDependency(a.id, { dependsOnTaskId: b.id });
25
- const cycle = await client.addDependency(b.id, { dependsOnTaskId: a.id }).catch((e) => e);
26
- expect(cycle).toBeInstanceOf(CriticalPathError);
27
- expect(cycle.status).toBe(409);
28
- expect(cycle.body.cyclePath).toBeDefined();
29
- const invalid = await client.createTask({ projectId: project.id, title: '' }).catch((e) => e);
30
- expect(invalid.status).toBe(400);
31
- expect(invalid.issues?.[0].path).toBe('title');
32
- const missing = await client.getTask('nope').catch((e) => e);
33
- expect(missing.isNotFound).toBe(true);
34
- });
35
- it('resolves the headers provider for every request and sends Content-Type only with a body', async () => {
36
- let token = 0;
37
- const { calls, fetchImpl } = recordingFetch(() => ok({ projects: [], project: { id: 'p' } }));
38
- const client = new CriticalPathClient({
39
- baseUrl: 'http://api.test',
40
- fetch: fetchImpl,
41
- headers: async () => ({ Authorization: `Bearer t${++token}` })
42
- });
43
- await client.getProjects();
44
- await client.createProject({ name: 'x' });
45
- expect(calls.map((c) => c.headers.Authorization)).toEqual(['Bearer t1', 'Bearer t2']);
46
- expect(calls[0].headers['Content-Type']).toBeUndefined();
47
- expect(calls[1].headers['Content-Type']).toBe('application/json');
48
- });
49
- it('encodes ids in paths', async () => {
50
- const { calls, fetchImpl } = recordingFetch(() => ok({ task: {} }));
51
- await new CriticalPathClient({ baseUrl: 'http://api.test', fetch: fetchImpl }).getTask('../projects/p1');
52
- expect(calls[0].url).toBe('http://api.test/tasks/..%2Fprojects%2Fp1');
53
- });
54
- it('times out hung requests', async () => {
55
- const hanging = ((_url, init) => new Promise((_resolve, reject) => init.signal.addEventListener('abort', () => reject(init.signal.reason))));
56
- const client = new CriticalPathClient({ baseUrl: 'http://api.test', fetch: hanging, timeoutMs: 10 });
57
- await expect(client.getProjects()).rejects.toMatchObject({ name: 'TimeoutError' });
58
- });
59
- it('scopes signals and headers with with(), leaving the original client untouched', async () => {
60
- const { calls, fetchImpl } = recordingFetch(() => ok({ projects: [] }));
61
- const client = new CriticalPathClient({ baseUrl: 'http://api.test', fetch: fetchImpl, headers: { 'X-App': 'web' } });
62
- const controller = new AbortController();
63
- controller.abort();
64
- const aborting = ((_url, init) => Promise.reject(init.signal?.reason));
65
- const cancelled = new CriticalPathClient({ baseUrl: 'http://api.test', fetch: aborting }).with({ signal: controller.signal });
66
- await expect(cancelled.getProjects()).rejects.toMatchObject({ name: 'AbortError' });
67
- await client.with({ headers: { 'X-Trace': 'abc' } }).getProjects();
68
- await client.getProjects();
69
- expect(calls[0].headers).toMatchObject({ 'X-App': 'web', 'X-Trace': 'abc' });
70
- expect(calls[1].headers['X-Trace']).toBeUndefined();
71
- });
72
- it('retries GET requests on retryable failures but never writes', async () => {
73
- const { calls, fetchImpl } = recordingFetch((_call, n) => (n < 3 ? new Response(null, { status: 503 }) : ok({ projects: [] })));
74
- const client = new CriticalPathClient({ baseUrl: 'http://api.test', fetch: fetchImpl, retry: { retries: 2, baseDelayMs: 1 } });
75
- await expect(client.getProjects()).resolves.toEqual([]);
76
- expect(calls).toHaveLength(3);
77
- const { calls: writes, fetchImpl: failingWrites } = recordingFetch(() => new Response(null, { status: 503 }));
78
- const writer = new CriticalPathClient({ baseUrl: 'http://api.test', fetch: failingWrites, retry: { retries: 2, baseDelayMs: 1 } });
79
- await expect(writer.createProject({ name: 'x' })).rejects.toBeInstanceOf(CriticalPathError);
80
- expect(writes).toHaveLength(1);
81
- });
82
- it('does not retry client errors', async () => {
83
- const fetchSpy = vi.fn(async () => Response.json({ error: 'nope' }, { status: 400 }));
84
- const client = new CriticalPathClient({ baseUrl: 'http://api.test', fetch: fetchSpy, retry: { retries: 3 } });
85
- await expect(client.getProjects()).rejects.toMatchObject({ status: 400 });
86
- expect(fetchSpy).toHaveBeenCalledTimes(1);
87
- });
88
- });
89
- //# sourceMappingURL=transport.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../src/transport.test.ts"],"names":[],"mappings":"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"}