@critical-path/react 0.13.10 โ†’ 0.14.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/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @critical-path/react
2
2
 
3
+ ## 0.14.0
4
+
5
+ ### Minor Changes
6
+
7
+ - dbe7073: Cancel stale requests in UI data hooks.
8
+
9
+ - **@critical-path/react:** data hooks abort their in-flight request when inputs change or the component unmounts, and ignore any response that arrives afterwards. Previously, switching from project A to project B could show A's tasks if A's request finished last. The package now ships with a `'use client'` directive, for Next.js App Router.
10
+ - **@critical-path/svelte:** state classes abort the previous request when a fetch method is called again, and gain `destroy()` to cancel in-flight requests (call it from `onDestroy`). Duck-typed clients without `with()` keep working; their requests just aren't cancelled.
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies [810d8d1]
15
+ - @critical-path/core@0.36.0
16
+ - @critical-path/client@0.20.5
17
+ - @critical-path/mcp@0.11.7
18
+
19
+ ## 0.13.11
20
+
21
+ ### Patch Changes
22
+
23
+ - Updated dependencies [b13f7c4]
24
+ - @critical-path/core@0.35.0
25
+ - @critical-path/client@0.20.4
26
+ - @critical-path/mcp@0.11.6
27
+
3
28
  ## 0.13.10
4
29
 
5
30
  ### Patch Changes
package/README.md CHANGED
@@ -178,6 +178,11 @@ export function ProjectTimelineView({ projectId }: { projectId: string }) {
178
178
 
179
179
  ---
180
180
 
181
+ ## ๐Ÿงน Stale Requests & Server Components
182
+
183
+ Data hooks (`useTasks`, `useProjects`, `useTaskActivity`, `useTimelineLadder`, ...) abort their in-flight request when their inputs change or the component unmounts, so a slow response for a previous project or task can never overwrite newer data. The package is marked `'use client'`, so you can import the hooks from files used by Next.js server components and render them in client components.
184
+
185
+
181
186
  ## ๐Ÿ“„ License
182
187
 
183
188
  MIT ยฉ [Critical Path](https://github.com/Pixerate/Critical-Path)
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cancellation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.test.d.ts","sourceRoot":"","sources":["../src/cancellation.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.test.js","sourceRoot":"","sources":["../src/cancellation.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQ5D,0FAA0F;AAC1F,SAAS,iBAAiB;IACxB,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAW,EAAE,IAAiB,EAAE,EAAE,CACpD,IAAI,OAAO,CAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC,CAAC,CAA4B,CAAC;IACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,iBAAiB,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC/D,KAAC,oBAAoB,IAAC,OAAO,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,YAAG,QAAQ,GAAwB,CACnH,CAAC;QACF,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAC9E,OAAO;YACP,YAAY,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;SACjC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7B,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAErD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QAE1E,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,iBAAiB,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC/D,KAAC,oBAAoB,IAAC,OAAO,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,YAAG,QAAQ,GAAwB,CACnH,CAAC;QACF,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,EAAE,CAAC;QACV,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}