@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 +25 -0
- package/README.md +5 -0
- package/dist/cancellation.test.d.ts +2 -0
- package/dist/cancellation.test.d.ts.map +1 -0
- package/dist/cancellation.test.js +42 -0
- package/dist/cancellation.test.js.map +1 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +213 -72
- package/dist/hooks.js.map +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +1 -0
- package/dist/provider.js.map +1 -1
- package/package.json +8 -4
- package/src/cancellation.test.tsx +58 -0
- package/src/hooks.ts +172 -72
- package/src/provider.tsx +2 -0
- package/tsconfig.tsbuildinfo +1 -1
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 @@
|
|
|
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"}
|
package/dist/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|