@assistant-ui/tap 0.3.6 → 0.4.2

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 (124) hide show
  1. package/README.md +24 -23
  2. package/dist/core/ResourceFiber.d.ts +1 -1
  3. package/dist/core/ResourceFiber.d.ts.map +1 -1
  4. package/dist/core/ResourceFiber.js +15 -8
  5. package/dist/core/ResourceFiber.js.map +1 -1
  6. package/dist/core/commit.d.ts +1 -1
  7. package/dist/core/commit.d.ts.map +1 -1
  8. package/dist/core/commit.js +40 -50
  9. package/dist/core/commit.js.map +1 -1
  10. package/dist/core/context.d.ts +2 -2
  11. package/dist/core/context.d.ts.map +1 -1
  12. package/dist/core/context.js +2 -2
  13. package/dist/core/context.js.map +1 -1
  14. package/dist/core/createResource.d.ts +3 -2
  15. package/dist/core/createResource.d.ts.map +1 -1
  16. package/dist/core/createResource.js +48 -22
  17. package/dist/core/createResource.js.map +1 -1
  18. package/dist/core/env.d.ts +2 -0
  19. package/dist/core/env.d.ts.map +1 -0
  20. package/dist/core/env.js +3 -0
  21. package/dist/core/env.js.map +1 -0
  22. package/dist/core/execution-context.d.ts +1 -0
  23. package/dist/core/execution-context.d.ts.map +1 -1
  24. package/dist/core/execution-context.js +8 -0
  25. package/dist/core/execution-context.js.map +1 -1
  26. package/dist/core/resource.d.ts +4 -3
  27. package/dist/core/resource.d.ts.map +1 -1
  28. package/dist/core/resource.js.map +1 -1
  29. package/dist/core/scheduler.d.ts +1 -1
  30. package/dist/core/scheduler.d.ts.map +1 -1
  31. package/dist/core/scheduler.js +4 -1
  32. package/dist/core/scheduler.js.map +1 -1
  33. package/dist/core/types.d.ts +22 -21
  34. package/dist/core/types.d.ts.map +1 -1
  35. package/dist/core/types.js +1 -1
  36. package/dist/core/types.js.map +1 -1
  37. package/dist/core/withKey.d.ts +3 -0
  38. package/dist/core/withKey.d.ts.map +1 -0
  39. package/dist/core/withKey.js +4 -0
  40. package/dist/core/withKey.js.map +1 -0
  41. package/dist/hooks/tap-callback.d.ts.map +1 -1
  42. package/dist/hooks/tap-callback.js +1 -0
  43. package/dist/hooks/tap-callback.js.map +1 -1
  44. package/dist/hooks/tap-const.d.ts +2 -0
  45. package/dist/hooks/tap-const.d.ts.map +1 -0
  46. package/dist/hooks/tap-const.js +6 -0
  47. package/dist/hooks/tap-const.js.map +1 -0
  48. package/dist/hooks/tap-effect-event.d.ts.map +1 -1
  49. package/dist/hooks/tap-effect-event.js +11 -0
  50. package/dist/hooks/tap-effect-event.js.map +1 -1
  51. package/dist/hooks/tap-effect.d.ts.map +1 -1
  52. package/dist/hooks/tap-effect.js +46 -31
  53. package/dist/hooks/tap-effect.js.map +1 -1
  54. package/dist/hooks/tap-inline-resource.d.ts +2 -2
  55. package/dist/hooks/tap-inline-resource.d.ts.map +1 -1
  56. package/dist/hooks/tap-memo.d.ts.map +1 -1
  57. package/dist/hooks/tap-memo.js +9 -1
  58. package/dist/hooks/tap-memo.js.map +1 -1
  59. package/dist/hooks/tap-resource.d.ts +3 -3
  60. package/dist/hooks/tap-resource.d.ts.map +1 -1
  61. package/dist/hooks/tap-resource.js +17 -9
  62. package/dist/hooks/tap-resource.js.map +1 -1
  63. package/dist/hooks/tap-resources.d.ts +2 -10
  64. package/dist/hooks/tap-resources.d.ts.map +1 -1
  65. package/dist/hooks/tap-resources.js +74 -43
  66. package/dist/hooks/tap-resources.js.map +1 -1
  67. package/dist/hooks/tap-state.d.ts.map +1 -1
  68. package/dist/hooks/tap-state.js +37 -24
  69. package/dist/hooks/tap-state.js.map +1 -1
  70. package/dist/hooks/utils/depsShallowEqual.d.ts.map +1 -0
  71. package/dist/hooks/utils/depsShallowEqual.js.map +1 -0
  72. package/dist/hooks/utils/tapHook.d.ts +6 -0
  73. package/dist/hooks/utils/tapHook.d.ts.map +1 -0
  74. package/dist/hooks/utils/tapHook.js +24 -0
  75. package/dist/hooks/utils/tapHook.js.map +1 -0
  76. package/dist/index.d.ts +5 -3
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +4 -2
  79. package/dist/index.js.map +1 -1
  80. package/dist/react/use-resource.d.ts +2 -2
  81. package/dist/react/use-resource.d.ts.map +1 -1
  82. package/dist/react/use-resource.js +24 -10
  83. package/dist/react/use-resource.js.map +1 -1
  84. package/package.json +10 -3
  85. package/src/__tests__/basic/resourceHandle.test.ts +4 -4
  86. package/src/__tests__/basic/tapEffect.basic.test.ts +3 -2
  87. package/src/__tests__/basic/tapResources.basic.test.ts +84 -64
  88. package/src/__tests__/basic/tapState.basic.test.ts +8 -8
  89. package/src/__tests__/errors/errors.effect-errors.test.ts +8 -3
  90. package/src/__tests__/lifecycle/lifecycle.dependencies.test.ts +3 -2
  91. package/src/__tests__/lifecycle/lifecycle.mount-unmount.test.ts +2 -2
  92. package/src/__tests__/react/concurrent-mode.test.tsx +243 -0
  93. package/src/__tests__/strictmode/react-strictmode-behavior.test.tsx +709 -0
  94. package/src/__tests__/strictmode/react-strictmode-rerender-sources.test.tsx +392 -0
  95. package/src/__tests__/strictmode/strictmode.test.ts +274 -0
  96. package/src/__tests__/strictmode/tap-strictmode-rerender-sources.test.ts +723 -0
  97. package/src/__tests__/test-utils.ts +8 -6
  98. package/src/core/ResourceFiber.ts +21 -11
  99. package/src/core/commit.ts +37 -57
  100. package/src/core/context.ts +2 -2
  101. package/src/core/createResource.ts +64 -25
  102. package/src/core/env.ts +3 -0
  103. package/src/core/execution-context.ts +9 -0
  104. package/src/core/resource.ts +9 -3
  105. package/src/core/scheduler.ts +4 -1
  106. package/src/core/types.ts +25 -26
  107. package/src/core/withKey.ts +8 -0
  108. package/src/hooks/tap-callback.ts +1 -0
  109. package/src/hooks/tap-const.ts +6 -0
  110. package/src/hooks/tap-effect-event.ts +15 -0
  111. package/src/hooks/tap-effect.ts +51 -38
  112. package/src/hooks/tap-inline-resource.ts +2 -2
  113. package/src/hooks/tap-memo.ts +10 -1
  114. package/src/hooks/tap-resource.ts +24 -20
  115. package/src/hooks/tap-resources.ts +86 -63
  116. package/src/hooks/tap-state.ts +49 -26
  117. package/src/hooks/utils/tapHook.ts +35 -0
  118. package/src/index.ts +8 -3
  119. package/src/react/use-resource.ts +27 -16
  120. package/dist/hooks/depsShallowEqual.d.ts.map +0 -1
  121. package/dist/hooks/depsShallowEqual.js.map +0 -1
  122. /package/dist/hooks/{depsShallowEqual.d.ts → utils/depsShallowEqual.d.ts} +0 -0
  123. /package/dist/hooks/{depsShallowEqual.js → utils/depsShallowEqual.js} +0 -0
  124. /package/src/hooks/{depsShallowEqual.ts → utils/depsShallowEqual.ts} +0 -0
@@ -53,6 +53,9 @@ const flushScheduled = () => {
53
53
  throw errors[0];
54
54
  }
55
55
  else {
56
+ for (const error of errors) {
57
+ console.error(error);
58
+ }
56
59
  throw new AggregateError(errors, "Errors occurred during flushSync");
57
60
  }
58
61
  }
@@ -62,7 +65,7 @@ const flushScheduled = () => {
62
65
  flushState.isScheduled = false;
63
66
  }
64
67
  };
65
- export const flushSync = (callback) => {
68
+ export const flushResourcesSync = (callback) => {
66
69
  const prev = flushState;
67
70
  flushState = {
68
71
  schedulers: new Set([]),
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/core/scheduler.ts"],"names":[],"mappings":"AAOA,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,IAAI,UAAU,GAAqB;IACjC,UAAU,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;IACvB,WAAW,EAAE,KAAK;CACnB,CAAC;AAEF,MAAM,OAAO,eAAe;IAGG;IAFrB,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAA6B,KAAW;QAAX,UAAK,GAAL,KAAK,CAAM;IAAG,CAAC;IAE5C,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,SAAS;QACP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,aAAa,EAAE,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF;AAED,MAAM,aAAa,GAAG,GAAG,EAAE;IACzB,IAAI,UAAU,CAAC,WAAW;QAAE,OAAO;IACnC,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC;IAC9B,cAAc,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,GAAG,EAAE;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9C,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,SAAS;YAEjC,UAAU,EAAE,CAAC;YAEb,IAAI,UAAU,GAAG,eAAe,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CACb,iEAAiE;oBAC/D,6CAA6C,CAChD,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC9B,UAAU,CAAC,WAAW,GAAG,KAAK,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAI,QAAiB,EAAK,EAAE;IACnD,MAAM,IAAI,GAAG,UAAU,CAAC;IACxB,UAAU,GAAG;QACX,UAAU,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;QACvB,WAAW,EAAE,IAAI;KAClB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC1B,cAAc,EAAE,CAAC;QAEjB,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/core/scheduler.ts"],"names":[],"mappings":"AAOA,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,IAAI,UAAU,GAAqB;IACjC,UAAU,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;IACvB,WAAW,EAAE,KAAK;CACnB,CAAC;AAEF,MAAM,OAAO,eAAe;IAGG;IAFrB,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAA6B,KAAW;QAAX,UAAK,GAAL,KAAK,CAAM;IAAG,CAAC;IAE5C,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,SAAS;QACP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,aAAa,EAAE,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF;AAED,MAAM,aAAa,GAAG,GAAG,EAAE;IACzB,IAAI,UAAU,CAAC,WAAW;QAAE,OAAO;IACnC,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC;IAC9B,cAAc,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,GAAG,EAAE;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9C,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,SAAS;YAEjC,UAAU,EAAE,CAAC;YAEb,IAAI,UAAU,GAAG,eAAe,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CACb,iEAAiE;oBAC/D,6CAA6C,CAChD,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;gBACD,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC9B,UAAU,CAAC,WAAW,GAAG,KAAK,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAI,QAAiB,EAAK,EAAE;IAC5D,MAAM,IAAI,GAAG,UAAU,CAAC;IACxB,UAAU,GAAG;QACX,UAAU,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;QACvB,WAAW,EAAE,IAAI;KAClB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC1B,cAAc,EAAE,CAAC;QAEjB,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;AACH,CAAC,CAAC"}
@@ -1,39 +1,41 @@
1
1
  import type { tapEffect } from "../hooks/tap-effect.js";
2
2
  import type { tapState } from "../hooks/tap-state.js";
3
- import { fnSymbol } from "./callResourceFn.js";
3
+ import type { fnSymbol } from "./callResourceFn.js";
4
4
  export type ResourceElement<R, P = any> = {
5
- type: Resource<R, P> & {
5
+ readonly type: Resource<R, P> & {
6
6
  [fnSymbol]: (props: P) => R;
7
7
  };
8
- props: P;
8
+ readonly props: P;
9
+ readonly key?: string | number;
9
10
  };
10
- type ResourceArgs<P> = undefined extends P ? [props?: P] : [props: P];
11
- export type Resource<R, P> = (...args: ResourceArgs<P>) => ResourceElement<R, P>;
12
- export type ContravariantResource<R, P> = (...args: ResourceArgs<P>) => ResourceElement<R>;
13
- export type ExtractResourceOutput<T> = T extends ResourceElement<infer R, any> ? R : never;
11
+ export type Resource<R, P> = (props: P) => ResourceElement<R, P>;
12
+ export type ContravariantResource<R, P> = (props: P) => ResourceElement<R>;
13
+ export type ExtractResourceReturnType<T> = T extends ResourceElement<infer R, any> ? R : T extends Resource<infer R, any> ? R : never;
14
14
  export type Cell = {
15
- type: "state";
15
+ readonly type: "state";
16
16
  value: any;
17
17
  set: (updater: tapState.StateUpdater<any>) => void;
18
18
  } | {
19
- type: "effect";
20
- mounted: boolean;
21
- cleanup?: tapEffect.Destructor | undefined;
22
- deps?: readonly unknown[] | undefined;
19
+ readonly type: "effect";
20
+ cleanup: tapEffect.Destructor | void;
21
+ deps: readonly unknown[] | null | undefined;
23
22
  };
24
23
  export interface EffectTask {
25
- effect: tapEffect.EffectCallback;
26
- deps?: readonly unknown[] | undefined;
27
- cellIndex: number;
24
+ readonly effect: tapEffect.EffectCallback;
25
+ readonly deps: readonly unknown[] | undefined;
26
+ readonly cell: Cell & {
27
+ type: "effect";
28
+ };
28
29
  }
29
30
  export interface RenderResult {
30
- state: any;
31
- props: any;
32
- commitTasks: EffectTask[];
31
+ readonly output: any;
32
+ readonly props: any;
33
+ readonly commitTasks: (() => void)[];
33
34
  }
34
35
  export interface ResourceFiber<R, P> {
35
- readonly scheduleRerender: () => void;
36
- readonly resource: Resource<R, P>;
36
+ readonly dispatchUpdate: (callback: () => boolean) => void;
37
+ readonly type: Resource<R, P>;
38
+ readonly devStrictMode: "root" | "child" | null;
37
39
  cells: Cell[];
38
40
  currentIndex: number;
39
41
  renderContext: RenderResult | undefined;
@@ -41,5 +43,4 @@ export interface ResourceFiber<R, P> {
41
43
  isFirstRender: boolean;
42
44
  isNeverMounted: boolean;
43
45
  }
44
- export {};
45
46
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,+BAA4B;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,8BAA2B;AACnD,OAAO,EAAE,QAAQ,EAAE,4BAAyB;AAE5C,MAAM,MAAM,eAAe,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI;IACxC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;KAAE,CAAC;IACvD,KAAK,EAAE,CAAC,CAAC;CACV,CAAC;AAEF,KAAK,YAAY,CAAC,CAAC,IAAI,SAAS,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACtE,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAC3B,GAAG,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KACrB,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE3B,MAAM,MAAM,qBAAqB,CAAC,CAAC,EAAE,CAAC,IAAI,CACxC,GAAG,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KACrB,eAAe,CAAC,CAAC,CAAC,CAAC;AAExB,MAAM,MAAM,qBAAqB,CAAC,CAAC,IACjC,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEtD,MAAM,MAAM,IAAI,GACZ;IACE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,GAAG,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;CACpD,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC;IAC3C,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;CACvC,CAAC;AAEN,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC;IACjC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,GAAG,CAAC;IACX,KAAK,EAAE,GAAG,CAAC;IACX,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,EAAE,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAElC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IAErB,aAAa,EAAE,YAAY,GAAG,SAAS,CAAC;IAExC,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,+BAA4B;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,8BAA2B;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,4BAAyB;AAEjD,MAAM,MAAM,eAAe,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI;IACxC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;KAAE,CAAC;IAChE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjE,MAAM,MAAM,qBAAqB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC;AAE3E,MAAM,MAAM,yBAAyB,CAAC,CAAC,IACrC,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GACnC,CAAC,GACD,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAC9B,CAAC,GACD,KAAK,CAAC;AAEd,MAAM,MAAM,IAAI,GACZ;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,GAAG,CAAC;IACX,GAAG,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;CACpD,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,OAAO,EAAE,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC;IACrC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;CAC7C,CAAC;AAEN,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,EAAE,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAEhD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IAErB,aAAa,EAAE,YAAY,GAAG,SAAS,CAAC;IAExC,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB"}
@@ -1,2 +1,2 @@
1
- import { fnSymbol } from "./callResourceFn.js";
1
+ export {};
2
2
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,4BAAyB"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { ResourceElement } from "./types.js";
2
+ export declare function withKey<E extends ResourceElement<any, any>>(key: string | number, element: E): E;
3
+ //# sourceMappingURL=withKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withKey.d.ts","sourceRoot":"","sources":["../../src/core/withKey.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAgB;AAE1C,wBAAgB,OAAO,CAAC,CAAC,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EACzD,GAAG,EAAE,MAAM,GAAG,MAAM,EACpB,OAAO,EAAE,CAAC,GACT,CAAC,CAEH"}
@@ -0,0 +1,4 @@
1
+ export function withKey(key, element) {
2
+ return { ...element, key };
3
+ }
4
+ //# sourceMappingURL=withKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withKey.js","sourceRoot":"","sources":["../../src/core/withKey.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,OAAO,CACrB,GAAoB,EACpB,OAAU;IAEV,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC;AAC7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tap-callback.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-callback.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC3D,IAAI,CAAC,EACL,MAAM,SAAS,OAAO,EAAE,KACvB,CAEF,CAAC"}
1
+ {"version":3,"file":"tap-callback.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-callback.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC3D,IAAI,CAAC,EACL,MAAM,SAAS,OAAO,EAAE,KACvB,CAGF,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { tapMemo } from "./tap-memo.js";
2
2
  export const tapCallback = (fn, deps) => {
3
+ // biome-ignore lint/correctness/useExhaustiveDependencies: user provided deps instead of callback identity
3
4
  return tapMemo(() => fn, deps);
4
5
  };
5
6
  //# sourceMappingURL=tap-callback.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tap-callback.js","sourceRoot":"","sources":["../../src/hooks/tap-callback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,sBAAmB;AAErC,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,EAAK,EACL,IAAwB,EACrB,EAAE;IACL,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC,CAAC"}
1
+ {"version":3,"file":"tap-callback.js","sourceRoot":"","sources":["../../src/hooks/tap-callback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,sBAAmB;AAErC,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,EAAK,EACL,IAAwB,EACrB,EAAE;IACL,2GAA2G;IAC3G,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function tapConst<T>(getValue: () => T, _deps: readonly never[]): T;
2
+ //# sourceMappingURL=tap-const.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tap-const.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-const.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,KAAK,EAAE,GAAG,CAAC,CAGzE"}
@@ -0,0 +1,6 @@
1
+ import { tapState } from "./tap-state.js";
2
+ export function tapConst(getValue, _deps) {
3
+ const [state] = tapState(getValue);
4
+ return state;
5
+ }
6
+ //# sourceMappingURL=tap-const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tap-const.js","sourceRoot":"","sources":["../../src/hooks/tap-const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,uBAAoB;AAEvC,MAAM,UAAU,QAAQ,CAAI,QAAiB,EAAE,KAAuB;IACpE,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tap-effect-event.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-effect-event.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC9D,QAAQ,EAAE,CAAC,GACV,CAAC,CAQH"}
1
+ {"version":3,"file":"tap-effect-event.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-effect-event.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC9D,QAAQ,EAAE,CAAC,GACV,CAAC,CAoBH"}
@@ -1,5 +1,8 @@
1
1
  import { tapRef } from "./tap-ref.js";
2
2
  import { tapEffect } from "./tap-effect.js";
3
+ import { isDevelopment } from "../core/env.js";
4
+ import { tapCallback } from "./tap-callback.js";
5
+ import { getCurrentResourceFiber } from "../core/execution-context.js";
3
6
  /**
4
7
  * Creates a stable function reference that always calls the most recent version of the callback.
5
8
  * Similar to React's useEffectEvent hook.
@@ -20,6 +23,14 @@ export function tapEffectEvent(callback) {
20
23
  tapEffect(() => {
21
24
  callbackRef.current = callback;
22
25
  });
26
+ if (isDevelopment) {
27
+ const fiber = getCurrentResourceFiber();
28
+ return tapCallback(((...args) => {
29
+ if (fiber.renderContext)
30
+ throw new Error("tapEffectEvent cannot be called during render");
31
+ return callbackRef.current(...args);
32
+ }), [fiber]);
33
+ }
23
34
  return callbackRef.current;
24
35
  }
25
36
  //# sourceMappingURL=tap-effect-event.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tap-effect-event.js","sourceRoot":"","sources":["../../src/hooks/tap-effect-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAkB;AACnC,OAAO,EAAE,SAAS,EAAE,wBAAqB;AAEzC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAW;IAEX,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,OAAO,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"tap-effect-event.js","sourceRoot":"","sources":["../../src/hooks/tap-effect-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAkB;AACnC,OAAO,EAAE,SAAS,EAAE,wBAAqB;AACzC,OAAO,EAAE,aAAa,EAAE,uBAAoB;AAC5C,OAAO,EAAE,WAAW,EAAE,0BAAuB;AAC7C,OAAO,EAAE,uBAAuB,EAAE,qCAAkC;AAEpE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAW;IAEX,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAC;QACxC,OAAO,WAAW,CAChB,CAAC,CAAC,GAAG,IAAmB,EAAE,EAAE;YAC1B,IAAI,KAAK,CAAC,aAAa;gBACrB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,OAAO,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QACtC,CAAC,CAAM,EACP,CAAC,KAAK,CAAC,CACR,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC,OAAO,CAAC;AAC7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tap-effect.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-effect.ts"],"names":[],"mappings":"AAiCA,yBAAiB,SAAS,CAAC;IACzB,KAAY,UAAU,GAAG,MAAM,IAAI,CAAC;IACpC,KAAY,cAAc,GAAG,MAAM,IAAI,GAAG,UAAU,CAAC;CACtD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC;AAClE,wBAAgB,SAAS,CACvB,MAAM,EAAE,SAAS,CAAC,cAAc,EAChC,IAAI,EAAE,SAAS,OAAO,EAAE,GACvB,IAAI,CAAC"}
1
+ {"version":3,"file":"tap-effect.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-effect.ts"],"names":[],"mappings":"AAUA,yBAAiB,SAAS,CAAC;IACzB,KAAY,UAAU,GAAG,MAAM,IAAI,CAAC;IACpC,KAAY,cAAc,GAAG,MAAM,IAAI,GAAG,UAAU,CAAC;CACtD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC;AAClE,wBAAgB,SAAS,CACvB,MAAM,EAAE,SAAS,CAAC,cAAc,EAChC,IAAI,EAAE,SAAS,OAAO,EAAE,GACvB,IAAI,CAAC"}
@@ -1,35 +1,50 @@
1
- import { getCurrentResourceFiber } from "../core/execution-context.js";
2
- function getEffectCell() {
3
- const fiber = getCurrentResourceFiber();
4
- const index = fiber.currentIndex++;
5
- // Check if we're trying to use more hooks than in previous renders
6
- if (!fiber.isFirstRender && index >= fiber.cells.length) {
7
- throw new Error("Rendered more hooks than during the previous render. " +
8
- "Hooks must be called in the exact same order in every render.");
9
- }
10
- if (!fiber.cells[index]) {
11
- // Create the effect cell
12
- const cell = {
13
- type: "effect",
14
- mounted: false,
15
- };
16
- fiber.cells[index] = cell;
17
- }
18
- const cell = fiber.cells[index];
19
- if (cell.type !== "effect") {
20
- throw new Error("Hook order changed between renders");
21
- }
22
- return index;
23
- }
1
+ import { depsShallowEqual } from "./utils/depsShallowEqual.js";
2
+ import { tapHook, registerRenderMountTask } from "./utils/tapHook.js";
3
+ const newEffect = () => ({
4
+ type: "effect",
5
+ cleanup: undefined,
6
+ deps: null, // null means the effect has never been run
7
+ });
24
8
  export function tapEffect(effect, deps) {
25
- const fiber = getCurrentResourceFiber();
26
- // Reserve a spot for the effect cell and get its index
27
- const cellIndex = getEffectCell();
28
- // Add task to render context for execution in commit phase
29
- fiber.renderContext.commitTasks.push({
30
- effect,
31
- deps,
32
- cellIndex,
9
+ const cell = tapHook("effect", newEffect);
10
+ if (deps && cell.deps && depsShallowEqual(cell.deps, deps))
11
+ return;
12
+ if (cell.deps !== null && !!deps !== !!cell.deps)
13
+ throw new Error("tapEffect called with and without dependencies across re-renders");
14
+ registerRenderMountTask(() => {
15
+ const errors = [];
16
+ try {
17
+ cell.cleanup?.();
18
+ }
19
+ catch (error) {
20
+ errors.push(error);
21
+ }
22
+ finally {
23
+ cell.cleanup = undefined;
24
+ }
25
+ try {
26
+ const cleanup = effect();
27
+ if (cleanup !== undefined && typeof cleanup !== "function") {
28
+ throw new Error("An effect function must either return a cleanup function or nothing. " +
29
+ `Received: ${typeof cleanup}`);
30
+ }
31
+ cell.cleanup = cleanup;
32
+ }
33
+ catch (error) {
34
+ errors.push(error);
35
+ }
36
+ cell.deps = deps;
37
+ if (errors.length > 0) {
38
+ if (errors.length === 1) {
39
+ throw errors[0];
40
+ }
41
+ else {
42
+ for (const error of errors) {
43
+ console.error(error);
44
+ }
45
+ throw new AggregateError(errors, "Errors during commit");
46
+ }
47
+ }
33
48
  });
34
49
  }
35
50
  //# sourceMappingURL=tap-effect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tap-effect.js","sourceRoot":"","sources":["../../src/hooks/tap-effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,qCAAkC;AAGpE,SAAS,aAAa;IACpB,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IAEnC,mEAAmE;IACnE,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,uDAAuD;YACrD,+DAA+D,CAClE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,yBAAyB;QACzB,MAAM,IAAI,GAA8B;YACtC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAYD,MAAM,UAAU,SAAS,CACvB,MAAgC,EAChC,IAAyB;IAEzB,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAC;IAExC,uDAAuD;IACvD,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAElC,2DAA2D;IAC3D,KAAK,CAAC,aAAc,CAAC,WAAW,CAAC,IAAI,CAAC;QACpC,MAAM;QACN,IAAI;QACJ,SAAS;KACV,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"tap-effect.js","sourceRoot":"","sources":["../../src/hooks/tap-effect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,oCAAiC;AAC5D,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,2BAAwB;AAEnE,MAAM,SAAS,GAAG,GAA8B,EAAE,CAAC,CAAC;IAClD,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,IAAI,EAAE,2CAA2C;CACxD,CAAC,CAAC;AAYH,MAAM,UAAU,SAAS,CACvB,MAAgC,EAChC,IAAyB;IAEzB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE1C,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO;IACnE,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI;QAC9C,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;IAEJ,uBAAuB,CAAC,GAAG,EAAE;QAC3B,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;YAEzB,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CACb,uEAAuE;oBACrE,aAAa,OAAO,OAAO,EAAE,CAChC,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;gBACD,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,3 +1,3 @@
1
- import { ExtractResourceOutput, ResourceElement } from "../core/types.js";
2
- export declare function tapInlineResource<E extends ResourceElement<any, any>>(element: E): ExtractResourceOutput<E>;
1
+ import { ExtractResourceReturnType, ResourceElement } from "../core/types.js";
2
+ export declare function tapInlineResource<E extends ResourceElement<any, any>>(element: E): ExtractResourceReturnType<E>;
3
3
  //# sourceMappingURL=tap-inline-resource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tap-inline-resource.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-inline-resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,yBAAsB;AAGvE,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EACnE,OAAO,EAAE,CAAC,GACT,qBAAqB,CAAC,CAAC,CAAC,CAE1B"}
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 +1 @@
1
- {"version":3,"file":"tap-memo.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-memo.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,MAAM,SAAS,OAAO,EAAE,MAY/D,CAAC"}
1
+ {"version":3,"file":"tap-memo.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-memo.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,MAAM,SAAS,OAAO,EAAE,MAmB/D,CAAC"}
@@ -1,8 +1,16 @@
1
+ import { isDevelopment } from "../core/env.js";
2
+ import { getCurrentResourceFiber } from "../core/execution-context.js";
1
3
  import { tapRef } from "./tap-ref.js";
2
- import { depsShallowEqual } from "./depsShallowEqual.js";
4
+ import { depsShallowEqual } from "./utils/depsShallowEqual.js";
3
5
  export const tapMemo = (fn, deps) => {
4
6
  const dataRef = tapRef();
5
7
  if (!dataRef.current) {
8
+ if (isDevelopment) {
9
+ const fiber = getCurrentResourceFiber();
10
+ if (fiber.devStrictMode) {
11
+ void fn();
12
+ }
13
+ }
6
14
  dataRef.current = { value: fn(), deps };
7
15
  }
8
16
  if (!depsShallowEqual(dataRef.current.deps, deps)) {
@@ -1 +1 @@
1
- {"version":3,"file":"tap-memo.js","sourceRoot":"","sources":["../../src/hooks/tap-memo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAkB;AACnC,OAAO,EAAE,gBAAgB,EAAE,8BAA2B;AAEtD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAI,EAAW,EAAE,IAAwB,EAAE,EAAE;IAClE,MAAM,OAAO,GAAG,MAAM,EAA0C,CAAC;IACjE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;QAC7B,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;AAC/B,CAAC,CAAC"}
1
+ {"version":3,"file":"tap-memo.js","sourceRoot":"","sources":["../../src/hooks/tap-memo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,uBAAoB;AAC5C,OAAO,EAAE,uBAAuB,EAAE,qCAAkC;AACpE,OAAO,EAAE,MAAM,EAAE,qBAAkB;AACnC,OAAO,EAAE,gBAAgB,EAAE,oCAAiC;AAE5D,MAAM,CAAC,MAAM,OAAO,GAAG,CAAI,EAAW,EAAE,IAAwB,EAAE,EAAE;IAClE,MAAM,OAAO,GAAG,MAAM,EAA0C,CAAC;IACjE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;gBACxB,KAAK,EAAE,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,OAAO,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;QAC7B,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;AAC/B,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { ExtractResourceOutput, ResourceElement } from "../core/types.js";
2
- export declare function tapResource<E extends ResourceElement<any, any>>(element: E): ExtractResourceOutput<E>;
3
- export declare function tapResource<E extends ResourceElement<any, any>>(element: E, deps: readonly unknown[]): ExtractResourceOutput<E>;
1
+ import { ExtractResourceReturnType, ResourceElement } from "../core/types.js";
2
+ export declare function tapResource<E extends ResourceElement<any, any>>(element: E): ExtractResourceReturnType<E>;
3
+ export declare function tapResource<E extends ResourceElement<any, any>>(element: E, propsDeps: readonly unknown[]): ExtractResourceReturnType<E>;
4
4
  //# sourceMappingURL=tap-resource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tap-resource.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,yBAAsB;AAWvE,wBAAgB,WAAW,CAAC,CAAC,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAC7D,OAAO,EAAE,CAAC,GACT,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAC5B,wBAAgB,WAAW,CAAC,CAAC,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAC7D,OAAO,EAAE,CAAC,EACV,IAAI,EAAE,SAAS,OAAO,EAAE,GACvB,qBAAqB,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"tap-resource.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,yBAAsB;AAY3E,wBAAgB,WAAW,CAAC,CAAC,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAC7D,OAAO,EAAE,CAAC,GACT,yBAAyB,CAAC,CAAC,CAAC,CAAC;AAChC,wBAAgB,WAAW,CAAC,CAAC,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAC7D,OAAO,EAAE,CAAC,EACV,SAAS,EAAE,SAAS,OAAO,EAAE,GAC5B,yBAAyB,CAAC,CAAC,CAAC,CAAC"}
@@ -2,17 +2,25 @@ import { tapEffect } from "./tap-effect.js";
2
2
  import { createResourceFiber, unmountResourceFiber, renderResourceFiber, commitResourceFiber, } from "../core/ResourceFiber.js";
3
3
  import { tapMemo } from "./tap-memo.js";
4
4
  import { tapState } from "./tap-state.js";
5
- export function tapResource(element, deps) {
6
- const [stateVersion, rerender] = tapState({});
7
- const fiber = tapMemo(() => createResourceFiber(element.type, () => rerender({})), [element.type]);
8
- const props = deps ? tapMemo(() => element.props, deps) : element.props;
9
- const result = tapMemo(() => renderResourceFiber(fiber, props), [fiber, props, stateVersion]);
10
- tapEffect(() => {
11
- return () => unmountResourceFiber(fiber);
12
- }, [fiber]);
5
+ import { tapConst } from "./tap-const.js";
6
+ export function tapResource(element, propsDeps) {
7
+ const [version, setVersion] = tapState(0);
8
+ const rerender = tapConst(() => () => setVersion((v) => v + 1), []);
9
+ const fiber = tapMemo(() => {
10
+ void element.key;
11
+ return createResourceFiber(element.type, (callback) => {
12
+ if (callback())
13
+ rerender();
14
+ });
15
+ }, [element.type, element.key]);
16
+ const result = propsDeps
17
+ ? // biome-ignore lint/correctness/useExhaustiveDependencies: user provided deps instead of prop identity
18
+ tapMemo(() => renderResourceFiber(fiber, element.props), [fiber, ...propsDeps, version])
19
+ : renderResourceFiber(fiber, element.props);
20
+ tapEffect(() => () => unmountResourceFiber(fiber), [fiber]);
13
21
  tapEffect(() => {
14
22
  commitResourceFiber(fiber, result);
15
23
  }, [fiber, result]);
16
- return result.state;
24
+ return result.output;
17
25
  }
18
26
  //# sourceMappingURL=tap-resource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tap-resource.js","sourceRoot":"","sources":["../../src/hooks/tap-resource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,wBAAqB;AACzC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,iCAA8B;AAC/B,OAAO,EAAE,OAAO,EAAE,sBAAmB;AACrC,OAAO,EAAE,QAAQ,EAAE,uBAAoB;AASvC,MAAM,UAAU,WAAW,CACzB,OAAU,EACV,IAAyB;IAEzB,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAC3D,CAAC,OAAO,CAAC,IAAI,CAAC,CACf,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACxE,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAC7B,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,SAAS,CAAC,GAAG,EAAE;QACb,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpB,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"tap-resource.js","sourceRoot":"","sources":["../../src/hooks/tap-resource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,wBAAqB;AACzC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,iCAA8B;AAC/B,OAAO,EAAE,OAAO,EAAE,sBAAmB;AACrC,OAAO,EAAE,QAAQ,EAAE,uBAAoB;AACvC,OAAO,EAAE,QAAQ,EAAE,uBAAoB;AASvC,MAAM,UAAU,WAAW,CACzB,OAAU,EACV,SAA8B;IAE9B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,KAAK,OAAO,CAAC,GAAG,CAAC;QACjB,OAAO,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE;YACpD,IAAI,QAAQ,EAAE;gBAAE,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,SAAS;QACtB,CAAC,CAAC,uGAAuG;YACvG,OAAO,CACL,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,EAC/C,CAAC,KAAK,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,CAC/B;QACH,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,SAAS,CAAC,GAAG,EAAE;QACb,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpB,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC"}
@@ -1,11 +1,3 @@
1
- import { ExtractResourceOutput, RenderResult, ResourceElement, ResourceFiber } from "../core/types.js";
2
- export type TapResourcesRenderResult<R, K extends string | number | symbol> = {
3
- add: [K, ResourceFiber<R, any>][];
4
- remove: K[];
5
- commit: [K, RenderResult][];
6
- return: Record<K, R>;
7
- };
8
- export declare function tapResources<M extends Record<string | number | symbol, any>, E extends ResourceElement<any, any>>(map: M, getElement: (t: M[keyof M], key: keyof M) => E, getElementDeps: any[]): {
9
- [K in keyof M]: ExtractResourceOutput<E>;
10
- };
1
+ import { ExtractResourceReturnType, ResourceElement } from "../core/types.js";
2
+ export declare function tapResources<E extends ResourceElement<any, any>>(getElements: () => readonly E[], getElementsDeps?: readonly unknown[]): ExtractResourceReturnType<E>[];
11
3
  //# sourceMappingURL=tap-resources.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tap-resources.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-resources.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,eAAe,EACf,aAAa,EACd,yBAAsB;AAYvB,MAAM,MAAM,wBAAwB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,IAAI;IAC5E,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;IAClC,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,MAAM,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACtB,CAAC;AAEF,wBAAgB,YAAY,CAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,EAC/C,CAAC,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAEnC,GAAG,EAAE,CAAC,EACN,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAC9C,cAAc,EAAE,GAAG,EAAE,GACpB;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;CAAE,CAgF9C"}
1
+ {"version":3,"file":"tap-resources.d.ts","sourceRoot":"","sources":["../../src/hooks/tap-resources.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EAEzB,eAAe,EAEhB,yBAAsB;AAqBvB,wBAAgB,YAAY,CAAC,CAAC,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAC9D,WAAW,EAAE,MAAM,SAAS,CAAC,EAAE,EAC/B,eAAe,CAAC,EAAE,SAAS,OAAO,EAAE,GACnC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAyGhC"}
@@ -3,68 +3,99 @@ import { tapMemo } from "./tap-memo.js";
3
3
  import { tapState } from "./tap-state.js";
4
4
  import { tapCallback } from "./tap-callback.js";
5
5
  import { createResourceFiber, unmountResourceFiber, renderResourceFiber, commitResourceFiber, } from "../core/ResourceFiber.js";
6
- export function tapResources(map, getElement, getElementDeps) {
6
+ import { tapConst } from "./tap-const.js";
7
+ export function tapResources(getElements, getElementsDeps) {
7
8
  const [version, setVersion] = tapState(0);
8
- const rerender = tapCallback(() => setVersion((v) => v + 1), []);
9
- const [fibers] = tapState(() => new Map());
10
- const getElementMemo = tapMemo(() => getElement, getElementDeps);
9
+ const rerender = tapConst(() => () => setVersion((v) => v + 1), []);
10
+ const fibers = tapConst(() => new Map(), []);
11
+ const getElementsMemo = getElementsDeps
12
+ ? // biome-ignore lint/correctness/useExhaustiveDependencies: library code
13
+ tapCallback(getElements, getElementsDeps)
14
+ : getElements;
11
15
  // Process each element
12
- const results = tapMemo(() => {
13
- const results = {
14
- remove: [],
15
- add: [],
16
- commit: [],
17
- return: {},
18
- };
16
+ const res = tapMemo(() => {
17
+ void version;
18
+ const elementsArray = getElementsMemo();
19
+ const seenKeys = new Set();
20
+ const results = [];
21
+ let newCount = 0;
19
22
  // Create/update fibers and render
20
- for (const key in map) {
21
- const value = map[key];
22
- const element = getElementMemo(value, key);
23
- let fiber = fibers.get(key);
24
- // Create new fiber if needed or type changed
25
- if (!fiber || fiber.resource !== element.type) {
26
- if (fiber)
27
- results.remove.push(key);
28
- fiber = createResourceFiber(element.type, rerender);
29
- results.add.push([key, fiber]);
23
+ for (let i = 0; i < elementsArray.length; i++) {
24
+ const element = elementsArray[i];
25
+ const elementKey = element.key;
26
+ if (elementKey === undefined) {
27
+ throw new Error(`tapResources did not provide a key for array at index ${i}`);
28
+ }
29
+ if (seenKeys.has(elementKey))
30
+ throw new Error(`Duplicate key ${elementKey} in tapResources`);
31
+ seenKeys.add(elementKey);
32
+ let state = fibers.get(elementKey);
33
+ if (!state) {
34
+ const fiber = createResourceFiber(element.type, (callback) => {
35
+ if (callback())
36
+ rerender();
37
+ });
38
+ const result = renderResourceFiber(fiber, element.props);
39
+ state = {
40
+ fiber,
41
+ next: result,
42
+ };
43
+ newCount++;
44
+ fibers.set(elementKey, state);
45
+ results.push(result.output);
46
+ }
47
+ else if (state.fiber.type !== element.type) {
48
+ const fiber = createResourceFiber(element.type, (callback) => {
49
+ if (callback())
50
+ rerender();
51
+ });
52
+ const result = renderResourceFiber(fiber, element.props);
53
+ state.next = [fiber, result];
54
+ results.push(result.output);
55
+ }
56
+ else {
57
+ state.next = renderResourceFiber(state.fiber, element.props);
58
+ results.push(state.next.output);
30
59
  }
31
- // Render with current props
32
- const renderResult = renderResourceFiber(fiber, element.props);
33
- results.commit.push([key, renderResult]);
34
- results.return[key] = renderResult.state;
35
60
  }
36
61
  // Clean up removed fibers (only if there might be stale ones)
37
- if (fibers.size >
38
- results.commit.length - results.add.length + results.remove.length) {
62
+ if (fibers.size > results.length - newCount) {
39
63
  for (const key of fibers.keys()) {
40
- if (!(key in map)) {
41
- results.remove.push(key);
64
+ if (!seenKeys.has(key)) {
65
+ fibers.get(key).next = "delete";
42
66
  }
43
67
  }
44
68
  }
45
69
  return results;
46
- }, [map, getElementMemo, version]);
70
+ }, [getElementsMemo, version]);
47
71
  // Cleanup on unmount
48
72
  tapEffect(() => {
49
73
  return () => {
50
74
  for (const key of fibers.keys()) {
51
- unmountResourceFiber(fibers.get(key));
52
- fibers.delete(key);
75
+ const fiber = fibers.get(key).fiber;
76
+ unmountResourceFiber(fiber);
53
77
  }
54
78
  };
55
79
  }, []);
56
80
  tapEffect(() => {
57
- for (const key of results.remove) {
58
- unmountResourceFiber(fibers.get(key));
59
- fibers.delete(key);
60
- }
61
- for (const [key, fiber] of results.add) {
62
- fibers.set(key, fiber);
63
- }
64
- for (const [key, result] of results.commit) {
65
- commitResourceFiber(fibers.get(key), result);
81
+ res; // as a performance optimization, we only run if the results have changed
82
+ for (const [key, state] of fibers.entries()) {
83
+ if (state.next === "delete") {
84
+ if (state.fiber.isMounted) {
85
+ unmountResourceFiber(state.fiber);
86
+ }
87
+ fibers.delete(key);
88
+ }
89
+ else if (Array.isArray(state.next)) {
90
+ unmountResourceFiber(state.fiber);
91
+ state.fiber = state.next[0];
92
+ commitResourceFiber(state.fiber, state.next[1]);
93
+ }
94
+ else {
95
+ commitResourceFiber(state.fiber, state.next);
96
+ }
66
97
  }
67
- }, [results]);
68
- return results.return;
98
+ }, [res]);
99
+ return res;
69
100
  }
70
101
  //# sourceMappingURL=tap-resources.js.map