@critical-path/react 0.14.0 → 0.14.1

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,42 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- // @vitest-environment happy-dom
3
- import { describe, it, expect } from 'vitest';
4
- import { renderHook, waitFor } from '@testing-library/react';
5
- import { CriticalPathProvider, useTasks } from './index.js';
6
- /** A fetch whose responses are released manually, to control the order they arrive in. */
7
- function controllableFetch() {
8
- const pending = [];
9
- const fetchImpl = ((url, init) => new Promise((resolve, reject) => {
10
- init.signal?.addEventListener('abort', () => reject(init.signal.reason));
11
- pending.push({ url, signal: init.signal, resolve: (tasks) => resolve(Response.json({ tasks })) });
12
- }));
13
- return { pending, fetchImpl };
14
- }
15
- describe('React hooks request cancellation', () => {
16
- it('ignores a slow response for the previous project after switching projects', async () => {
17
- const { pending, fetchImpl } = controllableFetch();
18
- const wrapper = ({ children }) => (_jsx(CriticalPathProvider, { options: { baseUrl: 'http://api.test', fetch: fetchImpl }, children: children }));
19
- const { result, rerender } = renderHook(({ projectId }) => useTasks(projectId), {
20
- wrapper,
21
- initialProps: { projectId: 'A' }
22
- });
23
- await waitFor(() => expect(pending).toHaveLength(1));
24
- rerender({ projectId: 'B' });
25
- await waitFor(() => expect(pending).toHaveLength(2));
26
- expect(pending[0].signal?.aborted).toBe(true);
27
- pending[1].resolve([{ id: 'b1', projectId: 'B', title: 'B task' }]);
28
- pending[0].resolve([{ id: 'a1', projectId: 'A', title: 'Stale A task' }]);
29
- await waitFor(() => expect(result.current.loading).toBe(false));
30
- expect(result.current.tasks.map((t) => t.id)).toEqual(['b1']);
31
- expect(result.current.error).toBeNull();
32
- });
33
- it('aborts the in-flight request on unmount', async () => {
34
- const { pending, fetchImpl } = controllableFetch();
35
- const wrapper = ({ children }) => (_jsx(CriticalPathProvider, { options: { baseUrl: 'http://api.test', fetch: fetchImpl }, children: children }));
36
- const { unmount } = renderHook(() => useTasks('A'), { wrapper });
37
- await waitFor(() => expect(pending).toHaveLength(1));
38
- unmount();
39
- expect(pending[0].signal?.aborted).toBe(true);
40
- });
41
- });
42
- //# sourceMappingURL=cancellation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cancellation.test.js","sourceRoot":"","sources":["../src/cancellation.test.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -1,25 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { CriticalPathProvider, useCriticalPathClient, useProjects, useTasks, useKanban, useWorkflows, useTaskTransitions, useComments, useAttachments, useTaskActivity, useDeliverables, useDeliverableSummary, useWebMCP, useCriticalPath, useTimelineLadder, useTaskLadder, useTaskMetrics, useWorkloadDistribution } from './index.js';
3
- describe('@critical-path/react Exports Test', () => {
4
- it('exports Provider and Hooks', () => {
5
- expect(CriticalPathProvider).toBeDefined();
6
- expect(useCriticalPathClient).toBeDefined();
7
- expect(useProjects).toBeDefined();
8
- expect(useTasks).toBeDefined();
9
- expect(useKanban).toBeDefined();
10
- expect(useWorkflows).toBeDefined();
11
- expect(useTaskTransitions).toBeDefined();
12
- expect(useComments).toBeDefined();
13
- expect(useAttachments).toBeDefined();
14
- expect(useTaskActivity).toBeDefined();
15
- expect(useDeliverables).toBeDefined();
16
- expect(useDeliverableSummary).toBeDefined();
17
- expect(useWebMCP).toBeDefined();
18
- expect(useCriticalPath).toBeDefined();
19
- expect(useTimelineLadder).toBeDefined();
20
- expect(useTaskLadder).toBeDefined();
21
- expect(useTaskMetrics).toBeDefined();
22
- expect(useWorkloadDistribution).toBeDefined();
23
- });
24
- });
25
- //# sourceMappingURL=index.test.js.map
@@ -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,EACL,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,EACX,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,oBAAoB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,qBAAqB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,qBAAqB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,uBAAuB,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,58 +0,0 @@
1
- // @vitest-environment happy-dom
2
- import { describe, it, expect } from 'vitest';
3
- import React from 'react';
4
- import { renderHook, waitFor } from '@testing-library/react';
5
- import { CriticalPathProvider, useTasks } from './index.js';
6
-
7
- interface Pending {
8
- url: string;
9
- signal?: AbortSignal | null;
10
- resolve: (tasks: unknown[]) => void;
11
- }
12
-
13
- /** A fetch whose responses are released manually, to control the order they arrive in. */
14
- function controllableFetch() {
15
- const pending: Pending[] = [];
16
- const fetchImpl = ((url: string, init: RequestInit) =>
17
- new Promise<Response>((resolve, reject) => {
18
- init.signal?.addEventListener('abort', () => reject(init.signal!.reason));
19
- pending.push({ url, signal: init.signal, resolve: (tasks) => resolve(Response.json({ tasks })) });
20
- })) as unknown as typeof fetch;
21
- return { pending, fetchImpl };
22
- }
23
-
24
- describe('React hooks request cancellation', () => {
25
- it('ignores a slow response for the previous project after switching projects', async () => {
26
- const { pending, fetchImpl } = controllableFetch();
27
- const wrapper = ({ children }: { children: React.ReactNode }) => (
28
- <CriticalPathProvider options={{ baseUrl: 'http://api.test', fetch: fetchImpl }}>{children}</CriticalPathProvider>
29
- );
30
- const { result, rerender } = renderHook(({ projectId }) => useTasks(projectId), {
31
- wrapper,
32
- initialProps: { projectId: 'A' }
33
- });
34
-
35
- await waitFor(() => expect(pending).toHaveLength(1));
36
- rerender({ projectId: 'B' });
37
- await waitFor(() => expect(pending).toHaveLength(2));
38
-
39
- expect(pending[0].signal?.aborted).toBe(true);
40
- pending[1].resolve([{ id: 'b1', projectId: 'B', title: 'B task' }]);
41
- pending[0].resolve([{ id: 'a1', projectId: 'A', title: 'Stale A task' }]);
42
-
43
- await waitFor(() => expect(result.current.loading).toBe(false));
44
- expect(result.current.tasks.map((t) => t.id)).toEqual(['b1']);
45
- expect(result.current.error).toBeNull();
46
- });
47
-
48
- it('aborts the in-flight request on unmount', async () => {
49
- const { pending, fetchImpl } = controllableFetch();
50
- const wrapper = ({ children }: { children: React.ReactNode }) => (
51
- <CriticalPathProvider options={{ baseUrl: 'http://api.test', fetch: fetchImpl }}>{children}</CriticalPathProvider>
52
- );
53
- const { unmount } = renderHook(() => useTasks('A'), { wrapper });
54
- await waitFor(() => expect(pending).toHaveLength(1));
55
- unmount();
56
- expect(pending[0].signal?.aborted).toBe(true);
57
- });
58
- });