@assistant-ui/tap 0.4.6 → 0.5.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.
Files changed (122) hide show
  1. package/README.md +20 -17
  2. package/dist/core/ResourceFiber.d.ts +2 -2
  3. package/dist/core/ResourceFiber.d.ts.map +1 -1
  4. package/dist/core/ResourceFiber.js +11 -9
  5. package/dist/core/ResourceFiber.js.map +1 -1
  6. package/dist/core/createResourceRoot.d.ts +6 -0
  7. package/dist/core/createResourceRoot.d.ts.map +1 -0
  8. package/dist/core/createResourceRoot.js +32 -0
  9. package/dist/core/createResourceRoot.js.map +1 -0
  10. package/dist/core/helpers/callResourceFn.d.ts.map +1 -0
  11. package/dist/core/helpers/callResourceFn.js.map +1 -0
  12. package/dist/core/helpers/commit.d.ts +4 -0
  13. package/dist/core/helpers/commit.d.ts.map +1 -0
  14. package/dist/core/{commit.js → helpers/commit.js} +2 -2
  15. package/dist/core/helpers/commit.js.map +1 -0
  16. package/dist/core/helpers/env.d.ts.map +1 -0
  17. package/dist/core/helpers/env.js.map +1 -0
  18. package/dist/core/{execution-context.d.ts → helpers/execution-context.d.ts} +1 -1
  19. package/dist/core/helpers/execution-context.d.ts.map +1 -0
  20. package/dist/core/helpers/execution-context.js.map +1 -0
  21. package/dist/core/helpers/root.d.ts +8 -0
  22. package/dist/core/helpers/root.d.ts.map +1 -0
  23. package/dist/core/helpers/root.js +52 -0
  24. package/dist/core/helpers/root.js.map +1 -0
  25. package/dist/core/resource.js +1 -1
  26. package/dist/core/resource.js.map +1 -1
  27. package/dist/core/scheduler.d.ts.map +1 -1
  28. package/dist/core/scheduler.js +12 -1
  29. package/dist/core/scheduler.js.map +1 -1
  30. package/dist/core/types.d.ts +25 -7
  31. package/dist/core/types.d.ts.map +1 -1
  32. package/dist/hooks/tap-effect-event.d.ts.map +1 -1
  33. package/dist/hooks/tap-effect-event.js +3 -2
  34. package/dist/hooks/tap-effect-event.js.map +1 -1
  35. package/dist/hooks/tap-memo.d.ts.map +1 -1
  36. package/dist/hooks/tap-memo.js +16 -17
  37. package/dist/hooks/tap-memo.js.map +1 -1
  38. package/dist/hooks/tap-reducer.d.ts +7 -0
  39. package/dist/hooks/tap-reducer.d.ts.map +1 -0
  40. package/dist/hooks/tap-reducer.js +87 -0
  41. package/dist/hooks/tap-reducer.js.map +1 -0
  42. package/dist/hooks/tap-resource.js +9 -9
  43. package/dist/hooks/tap-resource.js.map +1 -1
  44. package/dist/hooks/tap-resources.d.ts.map +1 -1
  45. package/dist/hooks/tap-resources.js +11 -11
  46. package/dist/hooks/tap-resources.js.map +1 -1
  47. package/dist/hooks/tap-state.d.ts.map +1 -1
  48. package/dist/hooks/tap-state.js +6 -63
  49. package/dist/hooks/tap-state.js.map +1 -1
  50. package/dist/hooks/utils/tapHook.d.ts +1 -1
  51. package/dist/hooks/utils/tapHook.d.ts.map +1 -1
  52. package/dist/hooks/utils/tapHook.js +2 -2
  53. package/dist/hooks/utils/tapHook.js.map +1 -1
  54. package/dist/index.d.ts +3 -3
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +3 -3
  57. package/dist/index.js.map +1 -1
  58. package/dist/react/use-resource.d.ts +1 -1
  59. package/dist/react/use-resource.d.ts.map +1 -1
  60. package/dist/react/use-resource.js +14 -8
  61. package/dist/react/use-resource.js.map +1 -1
  62. package/dist/{tapSubscribableResource.d.ts → tapResourceRoot.d.ts} +3 -3
  63. package/dist/tapResourceRoot.d.ts.map +1 -0
  64. package/dist/tapResourceRoot.js +80 -0
  65. package/dist/tapResourceRoot.js.map +1 -0
  66. package/package.json +1 -1
  67. package/src/__tests__/basic/resourceHandle.test.ts +17 -14
  68. package/src/__tests__/basic/tapReducer.basic.test.ts +200 -0
  69. package/src/__tests__/react/concurrent-mode.test.tsx +1 -4
  70. package/src/__tests__/strictmode/react-strictmode-behavior.test.tsx +215 -2
  71. package/src/__tests__/strictmode/react-strictmode-rerender-sources.test.tsx +77 -0
  72. package/src/__tests__/strictmode/strictmode.test.ts +82 -21
  73. package/src/__tests__/strictmode/tap-strictmode-rerender-sources.test.ts +67 -110
  74. package/src/__tests__/test-utils.ts +5 -1
  75. package/src/core/ResourceFiber.ts +22 -10
  76. package/src/core/createResourceRoot.ts +53 -0
  77. package/src/core/{callResourceFn.ts → helpers/callResourceFn.ts} +1 -1
  78. package/src/core/{commit.ts → helpers/commit.ts} +3 -3
  79. package/src/core/{execution-context.ts → helpers/execution-context.ts} +1 -1
  80. package/src/core/helpers/root.ts +67 -0
  81. package/src/core/resource.ts +1 -1
  82. package/src/core/scheduler.ts +13 -1
  83. package/src/core/types.ts +27 -7
  84. package/src/hooks/tap-effect-event.ts +3 -2
  85. package/src/hooks/tap-memo.ts +24 -19
  86. package/src/hooks/tap-reducer.ts +148 -0
  87. package/src/hooks/tap-resource.ts +9 -9
  88. package/src/hooks/tap-resources.ts +23 -10
  89. package/src/hooks/tap-state.ts +11 -88
  90. package/src/hooks/utils/tapHook.ts +3 -3
  91. package/src/index.ts +3 -3
  92. package/src/react/use-resource.ts +24 -11
  93. package/src/tapResourceRoot.ts +131 -0
  94. package/dist/core/callResourceFn.d.ts.map +0 -1
  95. package/dist/core/callResourceFn.js.map +0 -1
  96. package/dist/core/commit.d.ts +0 -4
  97. package/dist/core/commit.d.ts.map +0 -1
  98. package/dist/core/commit.js.map +0 -1
  99. package/dist/core/createResource.d.ts +0 -15
  100. package/dist/core/createResource.d.ts.map +0 -1
  101. package/dist/core/createResource.js +0 -101
  102. package/dist/core/createResource.js.map +0 -1
  103. package/dist/core/env.d.ts.map +0 -1
  104. package/dist/core/env.js.map +0 -1
  105. package/dist/core/execution-context.d.ts.map +0 -1
  106. package/dist/core/execution-context.js.map +0 -1
  107. package/dist/hooks/tap-inline-resource.d.ts +0 -3
  108. package/dist/hooks/tap-inline-resource.d.ts.map +0 -1
  109. package/dist/hooks/tap-inline-resource.js +0 -5
  110. package/dist/hooks/tap-inline-resource.js.map +0 -1
  111. package/dist/tapSubscribableResource.d.ts.map +0 -1
  112. package/dist/tapSubscribableResource.js +0 -60
  113. package/dist/tapSubscribableResource.js.map +0 -1
  114. package/src/core/createResource.ts +0 -155
  115. package/src/hooks/tap-inline-resource.ts +0 -8
  116. package/src/tapSubscribableResource.ts +0 -101
  117. /package/dist/core/{callResourceFn.d.ts → helpers/callResourceFn.d.ts} +0 -0
  118. /package/dist/core/{callResourceFn.js → helpers/callResourceFn.js} +0 -0
  119. /package/dist/core/{env.d.ts → helpers/env.d.ts} +0 -0
  120. /package/dist/core/{env.js → helpers/env.js} +0 -0
  121. /package/dist/core/{execution-context.js → helpers/execution-context.js} +0 -0
  122. /package/src/core/{env.ts → helpers/env.ts} +0 -0
@@ -1,12 +1,21 @@
1
1
  import { useLayoutEffect, useMemo, useReducer, useRef, useState } from "react";
2
- import type { ExtractResourceReturnType, ResourceElement } from "../core/types";
2
+ import {
3
+ ResourceFiberRoot,
4
+ type ExtractResourceReturnType,
5
+ type ResourceElement,
6
+ } from "../core/types";
3
7
  import {
4
8
  createResourceFiber,
5
9
  unmountResourceFiber,
6
10
  renderResourceFiber,
7
11
  commitResourceFiber,
8
12
  } from "../core/ResourceFiber";
9
- import { isDevelopment } from "../core/env";
13
+ import { isDevelopment } from "../core/helpers/env";
14
+ import {
15
+ commitRoot,
16
+ createResourceFiberRoot,
17
+ setRootVersion,
18
+ } from "../core/helpers/root";
10
19
 
11
20
  const useDevStrictMode = () => {
12
21
  if (!isDevelopment) return null;
@@ -18,27 +27,31 @@ const useDevStrictMode = () => {
18
27
  return isFirstRender ? ("child" as const) : ("root" as const);
19
28
  };
20
29
 
21
- const resourceReducer = (version: number, callback: () => boolean) => {
22
- return version + (callback() ? 1 : 0);
23
- };
24
-
25
30
  export function useResource<E extends ResourceElement<any, any>>(
26
31
  element: E,
27
32
  ): ExtractResourceReturnType<E> {
28
- const [, dispatch] = useReducer(resourceReducer, 0);
33
+ const root = useMemo<ResourceFiberRoot>(() => {
34
+ return createResourceFiberRoot((cb) => dispatch(cb));
35
+ }, []);
29
36
 
30
- const devStrictMode = useDevStrictMode();
37
+ const [version, dispatch] = useReducer((v: number, cb: () => boolean) => {
38
+ setRootVersion(root, v);
39
+ return v + (cb() ? 1 : 0);
40
+ }, 0);
41
+ setRootVersion(root, version);
31
42
 
32
- // biome-ignore lint/correctness/useExhaustiveDependencies: user provided deps instead of prop identity
43
+ const devStrictMode = useDevStrictMode();
33
44
  const fiber = useMemo(() => {
34
- return createResourceFiber(element.type, dispatch, devStrictMode);
35
- }, [element.type, element.key]);
45
+ void element.key;
46
+ return createResourceFiber(element.type, root, undefined, devStrictMode);
47
+ }, [element.type, element.key, root, devStrictMode]);
36
48
 
37
49
  const result = renderResourceFiber(fiber, element.props);
38
50
  useLayoutEffect(() => {
39
51
  return () => unmountResourceFiber(fiber);
40
52
  }, [fiber]);
41
53
  useLayoutEffect(() => {
54
+ commitRoot(root);
42
55
  commitResourceFiber(fiber, result);
43
56
  });
44
57
 
@@ -0,0 +1,131 @@
1
+ import {
2
+ commitResourceFiber,
3
+ createResourceFiber,
4
+ renderResourceFiber,
5
+ unmountResourceFiber,
6
+ } from "./core/ResourceFiber";
7
+ import { UpdateScheduler } from "./core/scheduler";
8
+ import { tapConst } from "./hooks/tap-const";
9
+ import { tapMemo } from "./hooks/tap-memo";
10
+ import { tapEffect } from "./hooks/tap-effect";
11
+ import { tapEffectEvent } from "./hooks/tap-effect-event";
12
+ import { tapRef } from "./hooks/tap-ref";
13
+ import { RenderResult, ResourceElement } from "./core/types";
14
+ import { isDevelopment } from "./core/helpers/env";
15
+ import {
16
+ commitRoot,
17
+ createResourceFiberRoot,
18
+ setRootVersion,
19
+ } from "./core/helpers/root";
20
+
21
+ export namespace tapResourceRoot {
22
+ export type Unsubscribe = () => void;
23
+
24
+ export interface SubscribableResource<TState> {
25
+ /**
26
+ * Get the current state of the store.
27
+ */
28
+ getValue(): TState;
29
+
30
+ /**
31
+ * Subscribe to the store.
32
+ */
33
+ subscribe(listener: () => void): Unsubscribe;
34
+ }
35
+ }
36
+
37
+ // currently we never reset the root, because rollbakcs are not supported in tapResourceRoot
38
+
39
+ export const tapResourceRoot = <TState>(
40
+ element: ResourceElement<TState>,
41
+ ): tapResourceRoot.SubscribableResource<TState> => {
42
+ const scheduler = tapConst(
43
+ () => new UpdateScheduler(() => handleUpdate(null)),
44
+ [],
45
+ );
46
+ const queue = tapConst(() => [] as (() => void)[], []);
47
+
48
+ const fiber = tapMemo(() => {
49
+ void element.key;
50
+
51
+ return createResourceFiber(
52
+ element.type,
53
+ createResourceFiberRoot((callback) => {
54
+ if (!scheduler.isDirty && !callback()) return;
55
+ queue.push(callback);
56
+ scheduler.markDirty();
57
+ }),
58
+ );
59
+ }, [element.type, element.key]);
60
+
61
+ setRootVersion(fiber.root, fiber.root.committedVersion);
62
+ const render = renderResourceFiber(fiber, element.props);
63
+
64
+ const isMountedRef = tapRef(false);
65
+ const committedPropsRef = tapRef(element.props);
66
+ const valueRef = tapRef<TState>(render.output);
67
+ const subscribers = tapConst(() => new Set<() => void>(), []);
68
+ const handleUpdate = tapEffectEvent((render: RenderResult | null) => {
69
+ if (render === null) {
70
+ setRootVersion(fiber.root, 2);
71
+ setRootVersion(fiber.root, 1);
72
+
73
+ queue.forEach((callback) => {
74
+ if (isDevelopment && fiber.devStrictMode) {
75
+ callback();
76
+ }
77
+
78
+ callback();
79
+ });
80
+
81
+ if (isDevelopment && fiber.devStrictMode) {
82
+ void renderResourceFiber(fiber, committedPropsRef.current);
83
+ }
84
+
85
+ render = renderResourceFiber(fiber, committedPropsRef.current);
86
+ }
87
+
88
+ if (scheduler.isDirty)
89
+ throw new Error("Scheduler is dirty, this should never happen");
90
+
91
+ commitRoot(fiber.root);
92
+ queue.length = 0;
93
+
94
+ if (isMountedRef.current) {
95
+ commitResourceFiber(fiber, render);
96
+ }
97
+
98
+ if (scheduler.isDirty || valueRef.current === render.output) return;
99
+ valueRef.current = render.output;
100
+ subscribers.forEach((callback) => callback());
101
+ });
102
+
103
+ tapEffect(() => {
104
+ isMountedRef.current = true;
105
+ return () => {
106
+ isMountedRef.current = false;
107
+ unmountResourceFiber(fiber);
108
+ };
109
+ }, [fiber]);
110
+
111
+ tapEffect(() => {
112
+ committedPropsRef.current = render.props;
113
+ commitRoot(fiber.root);
114
+ commitResourceFiber(fiber, render);
115
+
116
+ if (scheduler.isDirty || valueRef.current === render.output) return;
117
+ valueRef.current = render.output;
118
+ subscribers.forEach((callback) => callback());
119
+ });
120
+
121
+ return tapMemo(
122
+ () => ({
123
+ getValue: () => valueRef.current,
124
+ subscribe: (listener: () => void) => {
125
+ subscribers.add(listener);
126
+ return () => subscribers.delete(listener);
127
+ },
128
+ }),
129
+ [],
130
+ );
131
+ };
@@ -1 +0,0 @@
1
- {"version":3,"file":"callResourceFn.d.ts","sourceRoot":"","sources":["../../src/core/callResourceFn.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"callResourceFn.js","sourceRoot":"","sources":["../../src/core/callResourceFn.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAO,QAAwB,EAAE,KAAQ;IACrE,MAAM,EAAE,GAAI,QAAwD,CAClE,QAAQ,CACT,CAAC;IACF,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC"}
@@ -1,4 +0,0 @@
1
- import { ResourceFiber, RenderResult } from "./types.js";
2
- export declare function commitRender(renderResult: RenderResult): void;
3
- export declare function cleanupAllEffects<R, P>(executionContext: ResourceFiber<R, P>): void;
4
- //# sourceMappingURL=commit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/core/commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAgB;AAEtD,wBAAgB,YAAY,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,CAqB7D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,QA2B5E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/core/commit.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,YAA0B;IACrD,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YACD,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAO,gBAAqC;IAC3E,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC1C,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,gDAAgD;YAElE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACjB,CAAC;wBAAS,CAAC;oBACT,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YACD,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,15 +0,0 @@
1
- import { ResourceElement } from "./types.js";
2
- export declare namespace createResource {
3
- type Unsubscribe = () => void;
4
- interface Handle<R, P> {
5
- getValue(): R;
6
- subscribe(callback: () => void): Unsubscribe;
7
- render(element: ResourceElement<R, P>): void;
8
- unmount(): void;
9
- }
10
- }
11
- export declare const createResource: <R, P>(element: ResourceElement<R, P>, { mount, devStrictMode, }?: {
12
- mount?: boolean;
13
- devStrictMode?: boolean;
14
- }) => createResource.Handle<R, P>;
15
- //# sourceMappingURL=createResource.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createResource.d.ts","sourceRoot":"","sources":["../../src/core/createResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,eAAe,EAAE,mBAAgB;AAkBxD,yBAAiB,cAAc,CAAC;IAC9B,KAAY,WAAW,GAAG,MAAM,IAAI,CAAC;IAErC,UAAiB,MAAM,CAAC,CAAC,EAAE,CAAC;QAC1B,QAAQ,IAAI,CAAC,CAAC;QACd,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;QAC7C,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;QAC7C,OAAO,IAAI,IAAI,CAAC;KACjB;CACF;AAgDD,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,EACjC,SAAS,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9B,4BAGG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,KACnD,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAyE5B,CAAC"}
@@ -1,101 +0,0 @@
1
- import { createResourceFiber, unmountResourceFiber, renderResourceFiber, commitResourceFiber, } from "./ResourceFiber.js";
2
- import { flushResourcesSync, UpdateScheduler } from "./scheduler.js";
3
- import { tapRef } from "../hooks/tap-ref.js";
4
- import { tapState } from "../hooks/tap-state.js";
5
- import { tapMemo } from "../hooks/tap-memo.js";
6
- import { tapEffect } from "../hooks/tap-effect.js";
7
- import { resource } from "./resource.js";
8
- import { tapResource } from "../hooks/tap-resource.js";
9
- import { tapConst } from "../hooks/tap-const.js";
10
- import { getDevStrictMode } from "./execution-context.js";
11
- import { isDevelopment } from "./env.js";
12
- const HandleWrapperResource = resource((state) => {
13
- const [, setElement] = tapState(state.elementRef.current);
14
- const output = tapResource(state.elementRef.current);
15
- const subscribers = tapConst(() => new Set(), []);
16
- const valueRef = tapRef(output);
17
- tapEffect(() => {
18
- if (output !== valueRef.current) {
19
- valueRef.current = output;
20
- subscribers.forEach((callback) => callback());
21
- }
22
- });
23
- const handle = tapMemo(() => ({
24
- getValue: () => valueRef.current,
25
- subscribe: (callback) => {
26
- subscribers.add(callback);
27
- return () => subscribers.delete(callback);
28
- },
29
- render: (el) => {
30
- const changed = state.elementRef.current !== el;
31
- state.elementRef.current = el;
32
- if (state.onRender(changed)) {
33
- setElement(el);
34
- }
35
- },
36
- unmount: state.onUnmount,
37
- }), [state]);
38
- return handle;
39
- });
40
- export const createResource = (element, { mount = true, devStrictMode = false, } = {}) => {
41
- let isMounted = mount;
42
- let render;
43
- const props = {
44
- elementRef: { current: element },
45
- onRender: (changed) => {
46
- if (isMounted)
47
- return changed;
48
- isMounted = true;
49
- if (isDevelopment &&
50
- fiber.isNeverMounted &&
51
- fiber.devStrictMode === "child") {
52
- if (changed) {
53
- render = renderResourceFiber(fiber, props);
54
- }
55
- commitResourceFiber(fiber, render);
56
- }
57
- else {
58
- flushResourcesSync(() => {
59
- if (changed) {
60
- // In strict mode, render twice to detect side effects
61
- if (isDevelopment && fiber.devStrictMode === "root") {
62
- void renderResourceFiber(fiber, props);
63
- }
64
- render = renderResourceFiber(fiber, props);
65
- }
66
- if (scheduler.isDirty)
67
- return;
68
- commitResourceFiber(fiber, render);
69
- });
70
- }
71
- return false;
72
- },
73
- onUnmount: () => {
74
- if (!isMounted)
75
- throw new Error("Resource not mounted");
76
- isMounted = false;
77
- unmountResourceFiber(fiber);
78
- },
79
- };
80
- const scheduler = new UpdateScheduler(() => {
81
- // In strict mode, render twice to detect side effects
82
- if (isDevelopment &&
83
- (fiber.devStrictMode === "root" ||
84
- (fiber.devStrictMode && !fiber.isFirstRender))) {
85
- void renderResourceFiber(fiber, props);
86
- }
87
- render = renderResourceFiber(fiber, props);
88
- if (scheduler.isDirty || !isMounted)
89
- return;
90
- commitResourceFiber(fiber, render);
91
- });
92
- const fiber = createResourceFiber((HandleWrapperResource), (callback) => {
93
- if (callback())
94
- scheduler.markDirty();
95
- }, getDevStrictMode(devStrictMode));
96
- flushResourcesSync(() => {
97
- scheduler.markDirty();
98
- });
99
- return render.output;
100
- };
101
- //# sourceMappingURL=createResource.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createResource.js","sourceRoot":"","sources":["../../src/core/createResource.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,SAEmD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GACxB,OAAO,OAAO,KAAK,WAAW;IAC9B,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"execution-context.d.ts","sourceRoot":"","sources":["../../src/core/execution-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,mBAAgB;AAIxC,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EACpC,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,EAAE,EAAE,MAAM,IAAI,GACb,IAAI,CAoBN;AACD,wBAAgB,uBAAuB,IAAI,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAKzE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,2BAM/C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"execution-context.js","sourceRoot":"","sources":["../../src/core/execution-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAc;AAGtC,IAAI,oBAAoB,GAAmC,IAAI,CAAC;AAEhE,MAAM,UAAU,iBAAiB,CAC/B,KAA0B,EAC1B,EAAc;IAEd,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;IAEvB,MAAM,eAAe,GAAG,oBAAoB,CAAC;IAC7C,oBAAoB,GAAG,KAAK,CAAC;IAC7B,IAAI,CAAC;QACH,EAAE,EAAE,CAAC;QAEL,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;QAE5B,4BAA4B;QAC5B,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,YAAY,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,YAAY,KAAK,CAAC,YAAY,uBAAuB,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI;gBACzE,+DAA+D,CAClE,CAAC;QACJ,CAAC;IACH,CAAC;YAAS,CAAC;QACT,oBAAoB,GAAG,eAAe,CAAC;IACzC,CAAC;AACH,CAAC;AACD,MAAM,UAAU,uBAAuB;IACrC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,oBAAoB,EAAE,aAAa;QACrC,OAAO,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAE/D,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAChC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { ExtractResourceReturnType, ResourceElement } from "../core/types.js";
2
- export declare function tapInlineResource<E extends ResourceElement<any, any>>(element: E): ExtractResourceReturnType<E>;
3
- //# sourceMappingURL=tap-inline-resource.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tap-inline-resource.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-inline-resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,yBAAsB;AAG3E,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EACnE,OAAO,EAAE,CAAC,GACT,yBAAyB,CAAC,CAAC,CAAC,CAE9B"}
@@ -1,5 +0,0 @@
1
- import { callResourceFn } from "../core/callResourceFn.js";
2
- export function tapInlineResource(element) {
3
- return callResourceFn(element.type, element.props);
4
- }
5
- //# sourceMappingURL=tap-inline-resource.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tap-inline-resource.js","sourceRoot":"","sources":["../../src/hooks/tap-inline-resource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAA+B;AAExD,MAAM,UAAU,iBAAiB,CAC/B,OAAU;IAEV,OAAO,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tapSubscribableResource.d.ts","sourceRoot":"","sources":["../src/tapSubscribableResource.ts"],"names":[],"mappings":"AAYA,OAAO,EAAgB,eAAe,EAAE,wBAAqB;AAE7D,yBAAiB,uBAAuB,CAAC;IACvC,KAAY,WAAW,GAAG,MAAM,IAAI,CAAC;IAErC,UAAiB,oBAAoB,CAAC,MAAM;QAC1C;;WAEG;QACH,QAAQ,IAAI,MAAM,CAAC;QAEnB;;WAEG;QACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;KAC9C;CACF;AAED,eAAO,MAAM,uBAAuB,GAAI,MAAM,EAC5C,SAAS,eAAe,CAAC,MAAM,CAAC,KAC/B,uBAAuB,CAAC,oBAAoB,CAAC,MAAM,CAoErD,CAAC"}
@@ -1,60 +0,0 @@
1
- import { commitResourceFiber, createResourceFiber, renderResourceFiber, unmountResourceFiber, } from "./core/ResourceFiber.js";
2
- import { flushResourcesSync, UpdateScheduler } from "./core/scheduler.js";
3
- import { tapConst } from "./hooks/tap-const.js";
4
- import { tapMemo } from "./hooks/tap-memo.js";
5
- import { tapEffect } from "./hooks/tap-effect.js";
6
- import { tapEffectEvent } from "./hooks/tap-effect-event.js";
7
- import { tapRef } from "./hooks/tap-ref.js";
8
- export const tapSubscribableResource = (element) => {
9
- const scheduler = tapConst(() => new UpdateScheduler(() => {
10
- lastRenderRef.current = null;
11
- handleUpdate();
12
- }), []);
13
- const fiber = tapMemo(() => {
14
- void element.key;
15
- return createResourceFiber(element.type, (callback) => {
16
- if (callback()) {
17
- scheduler.markDirty();
18
- }
19
- });
20
- }, [element.type, element.key]);
21
- const lastRenderRef = tapRef(null);
22
- lastRenderRef.current = renderResourceFiber(fiber, element.props);
23
- const isMountedRef = tapRef(false);
24
- const committedPropsRef = tapRef(element.props);
25
- const valueRef = tapRef(lastRenderRef.current.output);
26
- const subscribers = tapConst(() => new Set(), []);
27
- const handleUpdate = tapEffectEvent(() => {
28
- if (!isMountedRef.current)
29
- return; // skip update if not mounted
30
- if (lastRenderRef.current === null) {
31
- lastRenderRef.current = renderResourceFiber(fiber, committedPropsRef.current);
32
- }
33
- if (scheduler.isDirty)
34
- return;
35
- committedPropsRef.current = lastRenderRef.current.props;
36
- commitResourceFiber(fiber, lastRenderRef.current);
37
- if (scheduler.isDirty || valueRef.current === lastRenderRef.current.output)
38
- return;
39
- valueRef.current = lastRenderRef.current.output;
40
- subscribers.forEach((callback) => callback());
41
- });
42
- tapEffect(() => {
43
- isMountedRef.current = true;
44
- return () => {
45
- isMountedRef.current = false;
46
- unmountResourceFiber(fiber);
47
- };
48
- }, [fiber]);
49
- tapEffect(() => {
50
- flushResourcesSync(handleUpdate);
51
- });
52
- return tapMemo(() => ({
53
- getValue: () => valueRef.current,
54
- subscribe: (listener) => {
55
- subscribers.add(listener);
56
- return () => subscribers.delete(listener);
57
- },
58
- }), []);
59
- };
60
- //# sourceMappingURL=tapSubscribableResource.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tapSubscribableResource.js","sourceRoot":"","sources":["../src/tapSubscribableResource.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,GACrB,gCAA6B;AAC9B,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,4BAAyB;AACvE,OAAO,EAAE,QAAQ,EAAE,6BAA0B;AAC7C,OAAO,EAAE,OAAO,EAAE,4BAAyB;AAC3C,OAAO,EAAE,SAAS,EAAE,8BAA2B;AAC/C,OAAO,EAAE,cAAc,EAAE,oCAAiC;AAC1D,OAAO,EAAE,MAAM,EAAE,2BAAwB;AAmBzC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,OAAgC,EACsB,EAAE;IACxD,MAAM,SAAS,GAAG,QAAQ,CACxB,GAAG,EAAE,CACH,IAAI,eAAe,CAAC,GAAG,EAAE;QACvB,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC7B,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC,EACJ,EAAE,CACH,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,KAAK,OAAO,CAAC,GAAG,CAAC;QAEjB,OAAO,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE;YACpD,IAAI,QAAQ,EAAE,EAAE,CAAC;gBACf,SAAS,CAAC,SAAS,EAAE,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhC,MAAM,aAAa,GAAG,MAAM,CAAsB,IAAI,CAAC,CAAC;IACxD,aAAa,CAAC,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAElE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAS,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,EAAc,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,cAAc,CAAC,GAAG,EAAE;QACvC,IAAI,CAAC,YAAY,CAAC,OAAO;YAAE,OAAO,CAAC,6BAA6B;QAEhE,IAAI,aAAa,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACnC,aAAa,CAAC,OAAO,GAAG,mBAAmB,CACzC,KAAK,EACL,iBAAiB,CAAC,OAAO,CAC1B,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,CAAC,OAAO;YAAE,OAAO;QAC9B,iBAAiB,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;QACxD,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,SAAS,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,KAAK,aAAa,CAAC,OAAO,CAAC,MAAM;YACxE,OAAO;QACT,QAAQ,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;QAChD,WAAW,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QAC5B,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;YAC7B,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,SAAS,CAAC,GAAG,EAAE;QACb,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO;QAChC,SAAS,EAAE,CAAC,QAAoB,EAAE,EAAE;YAClC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC,EACF,EAAE,CACH,CAAC;AACJ,CAAC,CAAC"}
@@ -1,155 +0,0 @@
1
- import { RenderResult, ResourceElement } from "./types";
2
- import {
3
- createResourceFiber,
4
- unmountResourceFiber,
5
- renderResourceFiber,
6
- commitResourceFiber,
7
- } from "./ResourceFiber";
8
- import { flushResourcesSync, UpdateScheduler } from "./scheduler";
9
- import { tapRef } from "../hooks/tap-ref";
10
- import { tapState } from "../hooks/tap-state";
11
- import { tapMemo } from "../hooks/tap-memo";
12
- import { tapEffect } from "../hooks/tap-effect";
13
- import { resource } from "./resource";
14
- import { tapResource } from "../hooks/tap-resource";
15
- import { tapConst } from "../hooks/tap-const";
16
- import { getDevStrictMode } from "./execution-context";
17
- import { isDevelopment } from "./env";
18
-
19
- export namespace createResource {
20
- export type Unsubscribe = () => void;
21
-
22
- export interface Handle<R, P> {
23
- getValue(): R;
24
- subscribe(callback: () => void): Unsubscribe;
25
- render(element: ResourceElement<R, P>): void;
26
- unmount(): void;
27
- }
28
- }
29
-
30
- const HandleWrapperResource = resource(
31
- <R, P>(state: {
32
- elementRef: {
33
- current: ResourceElement<R, P>;
34
- };
35
- onRender: (changed: boolean) => boolean;
36
- onUnmount: () => void;
37
- }): createResource.Handle<R, P> => {
38
- const [, setElement] = tapState(state.elementRef.current);
39
- const output = tapResource(state.elementRef.current);
40
-
41
- const subscribers = tapConst(() => new Set<() => void>(), []);
42
- const valueRef = tapRef(output);
43
-
44
- tapEffect(() => {
45
- if (output !== valueRef.current) {
46
- valueRef.current = output;
47
- subscribers.forEach((callback) => callback());
48
- }
49
- });
50
-
51
- const handle = tapMemo(
52
- () => ({
53
- getValue: () => valueRef.current,
54
- subscribe: (callback: () => void) => {
55
- subscribers.add(callback);
56
- return () => subscribers.delete(callback);
57
- },
58
-
59
- render: (el: ResourceElement<R, P>) => {
60
- const changed = state.elementRef.current !== el;
61
- state.elementRef.current = el;
62
-
63
- if (state.onRender(changed)) {
64
- setElement(el);
65
- }
66
- },
67
- unmount: state.onUnmount,
68
- }),
69
- [state],
70
- );
71
-
72
- return handle;
73
- },
74
- );
75
-
76
- export const createResource = <R, P>(
77
- element: ResourceElement<R, P>,
78
- {
79
- mount = true,
80
- devStrictMode = false,
81
- }: { mount?: boolean; devStrictMode?: boolean } = {},
82
- ): createResource.Handle<R, P> => {
83
- let isMounted = mount;
84
- let render: RenderResult;
85
- const props = {
86
- elementRef: { current: element },
87
- onRender: (changed: boolean) => {
88
- if (isMounted) return changed;
89
- isMounted = true;
90
-
91
- if (
92
- isDevelopment &&
93
- fiber.isNeverMounted &&
94
- fiber.devStrictMode === "child"
95
- ) {
96
- if (changed) {
97
- render = renderResourceFiber(fiber, props);
98
- }
99
- commitResourceFiber(fiber, render);
100
- } else {
101
- flushResourcesSync(() => {
102
- if (changed) {
103
- // In strict mode, render twice to detect side effects
104
- if (isDevelopment && fiber.devStrictMode === "root") {
105
- void renderResourceFiber(fiber, props);
106
- }
107
-
108
- render = renderResourceFiber(fiber, props);
109
- }
110
-
111
- if (scheduler.isDirty) return;
112
- commitResourceFiber(fiber, render!);
113
- });
114
- }
115
-
116
- return false;
117
- },
118
- onUnmount: () => {
119
- if (!isMounted) throw new Error("Resource not mounted");
120
- isMounted = false;
121
-
122
- unmountResourceFiber(fiber);
123
- },
124
- };
125
-
126
- const scheduler = new UpdateScheduler(() => {
127
- // In strict mode, render twice to detect side effects
128
- if (
129
- isDevelopment &&
130
- (fiber.devStrictMode === "root" ||
131
- (fiber.devStrictMode && !fiber.isFirstRender))
132
- ) {
133
- void renderResourceFiber(fiber, props);
134
- }
135
-
136
- render = renderResourceFiber(fiber, props);
137
-
138
- if (scheduler.isDirty || !isMounted) return;
139
- commitResourceFiber(fiber, render);
140
- });
141
-
142
- const fiber = createResourceFiber(
143
- HandleWrapperResource<R, P>,
144
- (callback) => {
145
- if (callback()) scheduler.markDirty();
146
- },
147
- getDevStrictMode(devStrictMode),
148
- );
149
-
150
- flushResourcesSync(() => {
151
- scheduler.markDirty();
152
- });
153
-
154
- return render!.output;
155
- };
@@ -1,8 +0,0 @@
1
- import { ExtractResourceReturnType, ResourceElement } from "../core/types";
2
- import { callResourceFn } from "../core/callResourceFn";
3
-
4
- export function tapInlineResource<E extends ResourceElement<any, any>>(
5
- element: E,
6
- ): ExtractResourceReturnType<E> {
7
- return callResourceFn(element.type, element.props);
8
- }