@assistant-ui/tap 0.3.4 → 0.3.5

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 (107) hide show
  1. package/dist/core/ResourceFiber.d.ts +1 -1
  2. package/dist/core/ResourceFiber.d.ts.map +1 -1
  3. package/dist/core/ResourceFiber.js +35 -40
  4. package/dist/core/ResourceFiber.js.map +1 -1
  5. package/dist/core/callResourceFn.js +15 -12
  6. package/dist/core/callResourceFn.js.map +1 -1
  7. package/dist/core/commit.d.ts +1 -1
  8. package/dist/core/commit.d.ts.map +1 -1
  9. package/dist/core/commit.js +57 -54
  10. package/dist/core/commit.js.map +1 -1
  11. package/dist/core/context.js +16 -21
  12. package/dist/core/context.js.map +1 -1
  13. package/dist/core/createResource.d.ts +1 -1
  14. package/dist/core/createResource.d.ts.map +1 -1
  15. package/dist/core/createResource.js +54 -67
  16. package/dist/core/createResource.js.map +1 -1
  17. package/dist/core/execution-context.d.ts +1 -1
  18. package/dist/core/execution-context.d.ts.map +1 -1
  19. package/dist/core/execution-context.js +21 -25
  20. package/dist/core/execution-context.js.map +1 -1
  21. package/dist/core/resource.d.ts +1 -1
  22. package/dist/core/resource.d.ts.map +1 -1
  23. package/dist/core/resource.js +8 -12
  24. package/dist/core/resource.js.map +1 -1
  25. package/dist/core/scheduler.js +73 -72
  26. package/dist/core/scheduler.js.map +1 -1
  27. package/dist/core/types.d.ts +3 -3
  28. package/dist/core/types.d.ts.map +1 -1
  29. package/dist/core/types.js +1 -0
  30. package/dist/core/types.js.map +1 -1
  31. package/dist/hooks/depsShallowEqual.js +8 -10
  32. package/dist/hooks/depsShallowEqual.js.map +1 -1
  33. package/dist/hooks/tap-callback.js +2 -6
  34. package/dist/hooks/tap-callback.js.map +1 -1
  35. package/dist/hooks/tap-effect-event.js +21 -10
  36. package/dist/hooks/tap-effect-event.js.map +1 -1
  37. package/dist/hooks/tap-effect.js +30 -31
  38. package/dist/hooks/tap-effect.js.map +1 -1
  39. package/dist/hooks/tap-inline-resource.d.ts +1 -1
  40. package/dist/hooks/tap-inline-resource.d.ts.map +1 -1
  41. package/dist/hooks/tap-inline-resource.js +2 -6
  42. package/dist/hooks/tap-inline-resource.js.map +1 -1
  43. package/dist/hooks/tap-memo.js +10 -14
  44. package/dist/hooks/tap-memo.js.map +1 -1
  45. package/dist/hooks/tap-ref.js +5 -9
  46. package/dist/hooks/tap-ref.js.map +1 -1
  47. package/dist/hooks/tap-resource.d.ts +1 -1
  48. package/dist/hooks/tap-resource.d.ts.map +1 -1
  49. package/dist/hooks/tap-resource.js +13 -28
  50. package/dist/hooks/tap-resource.js.map +1 -1
  51. package/dist/hooks/tap-resources.d.ts +1 -1
  52. package/dist/hooks/tap-resources.d.ts.map +1 -1
  53. package/dist/hooks/tap-resources.js +63 -64
  54. package/dist/hooks/tap-resources.js.map +1 -1
  55. package/dist/hooks/tap-state.js +47 -44
  56. package/dist/hooks/tap-state.js.map +1 -1
  57. package/dist/index.d.ts +14 -14
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +18 -31
  60. package/dist/index.js.map +1 -1
  61. package/dist/react/index.d.ts +1 -1
  62. package/dist/react/index.d.ts.map +1 -1
  63. package/dist/react/index.js +1 -5
  64. package/dist/react/index.js.map +1 -1
  65. package/dist/react/use-resource.d.ts +1 -1
  66. package/dist/react/use-resource.d.ts.map +1 -1
  67. package/dist/react/use-resource.js +16 -26
  68. package/dist/react/use-resource.js.map +1 -1
  69. package/package.json +44 -30
  70. package/react/package.json +5 -0
  71. package/src/__tests__/basic/resourceHandle.test.ts +56 -0
  72. package/src/__tests__/basic/tapEffect.basic.test.ts +247 -0
  73. package/src/__tests__/basic/tapResources.basic.test.ts +222 -0
  74. package/src/__tests__/basic/tapState.basic.test.ts +240 -0
  75. package/src/__tests__/errors/errors.effect-errors.test.ts +222 -0
  76. package/src/__tests__/errors/errors.render-errors.test.ts +190 -0
  77. package/src/__tests__/lifecycle/lifecycle.dependencies.test.ts +241 -0
  78. package/src/__tests__/lifecycle/lifecycle.mount-unmount.test.ts +211 -0
  79. package/src/__tests__/rules/rules.hook-count.test.ts +200 -0
  80. package/src/__tests__/rules/rules.hook-order.test.ts +192 -0
  81. package/src/__tests__/test-utils.ts +219 -0
  82. package/src/core/ResourceFiber.ts +58 -0
  83. package/src/core/callResourceFn.ts +21 -0
  84. package/src/core/commit.ts +73 -0
  85. package/src/core/context.ts +28 -0
  86. package/src/core/createResource.ts +116 -0
  87. package/src/core/execution-context.ts +34 -0
  88. package/src/core/resource.ts +16 -0
  89. package/src/core/scheduler.ts +95 -0
  90. package/src/core/types.ts +59 -0
  91. package/src/hooks/depsShallowEqual.ts +10 -0
  92. package/src/hooks/tap-callback.ts +8 -0
  93. package/src/hooks/tap-effect-event.ts +29 -0
  94. package/src/hooks/tap-effect.ts +59 -0
  95. package/src/hooks/tap-inline-resource.ts +8 -0
  96. package/src/hooks/tap-memo.ts +16 -0
  97. package/src/hooks/tap-ref.ts +16 -0
  98. package/src/hooks/tap-resource.ts +44 -0
  99. package/src/hooks/tap-resources.ts +112 -0
  100. package/src/hooks/tap-state.ts +83 -0
  101. package/src/index.ts +31 -0
  102. package/src/react/index.ts +1 -0
  103. package/src/react/use-resource.ts +35 -0
  104. package/dist/__tests__/test-utils.d.ts +0 -79
  105. package/dist/__tests__/test-utils.d.ts.map +0 -1
  106. package/dist/__tests__/test-utils.js +0 -138
  107. package/dist/__tests__/test-utils.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { ResourceFiber, RenderResult, Resource } from "./types";
1
+ import { ResourceFiber, RenderResult, Resource } from "./types.js";
2
2
  export declare function createResourceFiber<R, P>(resource: Resource<R, P>, scheduleRerender: () => void): ResourceFiber<R, P>;
3
3
  export declare function unmountResourceFiber<R, P>(fiber: ResourceFiber<R, P>): void;
4
4
  export declare function renderResourceFiber<R, P>(fiber: ResourceFiber<R, P>, props: P): RenderResult;
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceFiber.d.ts","sourceRoot":"","sources":["../../src/core/ResourceFiber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKhE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACtC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EACxB,gBAAgB,EAAE,MAAM,IAAI,GAC3B,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAWrB;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAI3E;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACtC,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,KAAK,EAAE,CAAC,GACP,YAAY,CAiBd;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACtC,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,MAAM,EAAE,YAAY,GACnB,IAAI,CAKN"}
1
+ {"version":3,"file":"ResourceFiber.d.ts","sourceRoot":"","sources":["../../src/core/ResourceFiber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAgB;AAKhE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACtC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EACxB,gBAAgB,EAAE,MAAM,IAAI,GAC3B,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAWrB;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAI3E;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACtC,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,KAAK,EAAE,CAAC,GACP,YAAY,CAiBd;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACtC,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,MAAM,EAAE,YAAY,GACnB,IAAI,CAKN"}
@@ -1,48 +1,43 @@
1
- // src/core/ResourceFiber.ts
2
1
  import { commitRender, cleanupAllEffects } from "./commit.js";
3
2
  import { withResourceFiber } from "./execution-context.js";
4
3
  import { callResourceFn } from "./callResourceFn.js";
5
- function createResourceFiber(resource, scheduleRerender) {
6
- return {
7
- resource,
8
- scheduleRerender,
9
- cells: [],
10
- currentIndex: 0,
11
- renderContext: void 0,
12
- isFirstRender: true,
13
- isMounted: false,
14
- isNeverMounted: true
15
- };
4
+ export function createResourceFiber(resource, scheduleRerender) {
5
+ return {
6
+ resource,
7
+ scheduleRerender,
8
+ cells: [],
9
+ currentIndex: 0,
10
+ renderContext: undefined,
11
+ isFirstRender: true,
12
+ isMounted: false,
13
+ isNeverMounted: true,
14
+ };
16
15
  }
17
- function unmountResourceFiber(fiber) {
18
- fiber.isMounted = false;
19
- cleanupAllEffects(fiber);
16
+ export function unmountResourceFiber(fiber) {
17
+ // Clean up all effects
18
+ fiber.isMounted = false;
19
+ cleanupAllEffects(fiber);
20
20
  }
21
- function renderResourceFiber(fiber, props) {
22
- const result = {
23
- commitTasks: [],
24
- props,
25
- state: void 0
26
- };
27
- withResourceFiber(fiber, () => {
28
- fiber.renderContext = result;
29
- try {
30
- result.state = callResourceFn(fiber.resource, props);
31
- } finally {
32
- fiber.renderContext = void 0;
33
- }
34
- });
35
- return result;
21
+ export function renderResourceFiber(fiber, props) {
22
+ const result = {
23
+ commitTasks: [],
24
+ props,
25
+ state: undefined,
26
+ };
27
+ withResourceFiber(fiber, () => {
28
+ fiber.renderContext = result;
29
+ try {
30
+ result.state = callResourceFn(fiber.resource, props);
31
+ }
32
+ finally {
33
+ fiber.renderContext = undefined;
34
+ }
35
+ });
36
+ return result;
36
37
  }
37
- function commitResourceFiber(fiber, result) {
38
- fiber.isMounted = true;
39
- fiber.isNeverMounted = false;
40
- commitRender(result, fiber);
38
+ export function commitResourceFiber(fiber, result) {
39
+ fiber.isMounted = true;
40
+ fiber.isNeverMounted = false;
41
+ commitRender(result, fiber);
41
42
  }
42
- export {
43
- commitResourceFiber,
44
- createResourceFiber,
45
- renderResourceFiber,
46
- unmountResourceFiber
47
- };
48
43
  //# sourceMappingURL=ResourceFiber.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/ResourceFiber.ts"],"sourcesContent":["import { ResourceFiber, RenderResult, Resource } from \"./types\";\nimport { commitRender, cleanupAllEffects } from \"./commit\";\nimport { withResourceFiber } from \"./execution-context\";\nimport { callResourceFn } from \"./callResourceFn\";\n\nexport function createResourceFiber<R, P>(\n resource: Resource<R, P>,\n scheduleRerender: () => void,\n): ResourceFiber<R, P> {\n return {\n resource,\n scheduleRerender,\n cells: [],\n currentIndex: 0,\n renderContext: undefined,\n isFirstRender: true,\n isMounted: false,\n isNeverMounted: true,\n };\n}\n\nexport function unmountResourceFiber<R, P>(fiber: ResourceFiber<R, P>): void {\n // Clean up all effects\n fiber.isMounted = false;\n cleanupAllEffects(fiber);\n}\n\nexport function renderResourceFiber<R, P>(\n fiber: ResourceFiber<R, P>,\n props: P,\n): RenderResult {\n const result: RenderResult = {\n commitTasks: [],\n props,\n state: undefined,\n };\n\n withResourceFiber(fiber, () => {\n fiber.renderContext = result;\n try {\n result.state = callResourceFn(fiber.resource, props);\n } finally {\n fiber.renderContext = undefined;\n }\n });\n\n return result;\n}\n\nexport function commitResourceFiber<R, P>(\n fiber: ResourceFiber<R, P>,\n result: RenderResult,\n): void {\n fiber.isMounted = true;\n fiber.isNeverMounted = false;\n\n commitRender(result, fiber);\n}\n"],"mappings":";AACA,SAAS,cAAc,yBAAyB;AAChD,SAAS,yBAAyB;AAClC,SAAS,sBAAsB;AAExB,SAAS,oBACd,UACA,kBACqB;AACrB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,CAAC;AAAA,IACR,cAAc;AAAA,IACd,eAAe;AAAA,IACf,eAAe;AAAA,IACf,WAAW;AAAA,IACX,gBAAgB;AAAA,EAClB;AACF;AAEO,SAAS,qBAA2B,OAAkC;AAE3E,QAAM,YAAY;AAClB,oBAAkB,KAAK;AACzB;AAEO,SAAS,oBACd,OACA,OACc;AACd,QAAM,SAAuB;AAAA,IAC3B,aAAa,CAAC;AAAA,IACd;AAAA,IACA,OAAO;AAAA,EACT;AAEA,oBAAkB,OAAO,MAAM;AAC7B,UAAM,gBAAgB;AACtB,QAAI;AACF,aAAO,QAAQ,eAAe,MAAM,UAAU,KAAK;AAAA,IACrD,UAAE;AACA,YAAM,gBAAgB;AAAA,IACxB;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,SAAS,oBACd,OACA,QACM;AACN,QAAM,YAAY;AAClB,QAAM,iBAAiB;AAEvB,eAAa,QAAQ,KAAK;AAC5B;","names":[]}
1
+ {"version":3,"file":"ResourceFiber.js","sourceRoot":"","sources":["../../src/core/ResourceFiber.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,oBAAiB;AAC3D,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AACxD,OAAO,EAAE,cAAc,EAAE,4BAAyB;AAElD,MAAM,UAAU,mBAAmB,CACjC,QAAwB,EACxB,gBAA4B;IAE5B,OAAO;QACL,QAAQ;QACR,gBAAgB;QAChB,KAAK,EAAE,EAAE;QACT,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,SAAS;QACxB,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAO,KAA0B;IACnE,uBAAuB;IACvB,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;IACxB,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAA0B,EAC1B,KAAQ;IAER,MAAM,MAAM,GAAiB;QAC3B,WAAW,EAAE,EAAE;QACf,KAAK;QACL,KAAK,EAAE,SAAS;KACjB,CAAC;IAEF,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE;QAC5B,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAA0B,EAC1B,MAAoB;IAEpB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC;IAE7B,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC"}
@@ -1,14 +1,17 @@
1
- // src/core/callResourceFn.ts
2
- function callResourceFn(resource, props) {
3
- const fn = resource[fnSymbol];
4
- if (!fn) {
5
- throw new Error("ResourceElement.type is not a valid Resource");
6
- }
7
- return fn(props);
1
+ /**
2
+ * Renders a resource with the given props.
3
+ * @internal This is for internal use only.
4
+ */
5
+ export function callResourceFn(resource, props) {
6
+ const fn = resource[fnSymbol];
7
+ if (!fn) {
8
+ throw new Error("ResourceElement.type is not a valid Resource");
9
+ }
10
+ return fn(props);
8
11
  }
9
- var fnSymbol = /* @__PURE__ */ Symbol("fnSymbol");
10
- export {
11
- callResourceFn,
12
- fnSymbol
13
- };
12
+ /**
13
+ * Symbol used to store the ResourceFn in the Resource constructor.
14
+ * @internal This is for internal use only.
15
+ */
16
+ export const fnSymbol = Symbol("fnSymbol");
14
17
  //# sourceMappingURL=callResourceFn.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/callResourceFn.ts"],"sourcesContent":["import { Resource } from \"./types\";\n\n/**\n * Renders a resource with the given props.\n * @internal This is for internal use only.\n */\nexport function callResourceFn<R, P>(resource: Resource<R, P>, props: P): R {\n const fn = (resource as unknown as { [fnSymbol]?: (props: P) => R })[\n fnSymbol\n ];\n if (!fn) {\n throw new Error(\"ResourceElement.type is not a valid Resource\");\n }\n return fn(props);\n}\n\n/**\n * Symbol used to store the ResourceFn in the Resource constructor.\n * @internal This is for internal use only.\n */\nexport const fnSymbol = Symbol(\"fnSymbol\");\n"],"mappings":";AAMO,SAAS,eAAqB,UAA0B,OAAa;AAC1E,QAAM,KAAM,SACV,QACF;AACA,MAAI,CAAC,IAAI;AACP,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,SAAO,GAAG,KAAK;AACjB;AAMO,IAAM,WAAW,uBAAO,UAAU;","names":[]}
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 +1,4 @@
1
- import { ResourceFiber, RenderResult } from "./types";
1
+ import { ResourceFiber, RenderResult } from "./types.js";
2
2
  export declare function commitRender<R, P>(renderResult: RenderResult, fiber: ResourceFiber<R, P>): void;
3
3
  export declare function cleanupAllEffects<R, P>(executionContext: ResourceFiber<R, P>): void;
4
4
  //# sourceMappingURL=commit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/core/commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEtD,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAC/B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GACzB,IAAI,CAiDN;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,QAgB5E"}
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,CAAC,EAAE,CAAC,EAC/B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GACzB,IAAI,CAiDN;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,QAgB5E"}
@@ -1,60 +1,63 @@
1
- // src/core/commit.ts
2
- function commitRender(renderResult, fiber) {
3
- renderResult.commitTasks.forEach((task) => {
4
- const cellIndex = task.cellIndex;
5
- const effectCell = fiber.cells[cellIndex];
6
- if (effectCell.type !== "effect") {
7
- throw new Error("Cannot find effect cell");
8
- }
9
- let shouldRunEffect = true;
10
- if (effectCell.deps !== void 0 && task.deps !== void 0) {
11
- shouldRunEffect = effectCell.deps.length !== task.deps.length || effectCell.deps.some((dep, j) => !Object.is(dep, task.deps[j]));
12
- }
13
- if (shouldRunEffect) {
14
- if (effectCell.mounted) {
15
- if (typeof effectCell.deps !== typeof task.deps) {
16
- throw new Error(
17
- "tapEffect called with and without dependencies across re-renders"
18
- );
1
+ export function commitRender(renderResult, fiber) {
2
+ // Process all tasks collected during render
3
+ renderResult.commitTasks.forEach((task) => {
4
+ const cellIndex = task.cellIndex;
5
+ const effectCell = fiber.cells[cellIndex];
6
+ if (effectCell.type !== "effect") {
7
+ throw new Error("Cannot find effect cell");
19
8
  }
20
- try {
21
- if (effectCell.mounted && effectCell.cleanup) {
22
- effectCell.cleanup();
23
- }
24
- } finally {
25
- effectCell.mounted = false;
9
+ // Check if deps changed
10
+ let shouldRunEffect = true;
11
+ if (effectCell.deps !== undefined && task.deps !== undefined) {
12
+ shouldRunEffect =
13
+ effectCell.deps.length !== task.deps.length ||
14
+ effectCell.deps.some((dep, j) => !Object.is(dep, task.deps[j]));
26
15
  }
27
- }
28
- const cleanup = task.effect();
29
- if (cleanup !== void 0 && typeof cleanup !== "function") {
30
- throw new Error(
31
- `An effect function must either return a cleanup function or nothing. Received: ${typeof cleanup}`
32
- );
33
- }
34
- effectCell.mounted = true;
35
- effectCell.cleanup = typeof cleanup === "function" ? cleanup : void 0;
36
- effectCell.deps = task.deps;
37
- }
38
- });
16
+ // Run cleanup if effect will re-run
17
+ if (shouldRunEffect) {
18
+ if (effectCell.mounted) {
19
+ if (typeof effectCell.deps !== typeof task.deps) {
20
+ throw new Error("tapEffect called with and without dependencies across re-renders");
21
+ }
22
+ try {
23
+ if (effectCell.mounted && effectCell.cleanup) {
24
+ effectCell.cleanup();
25
+ }
26
+ }
27
+ finally {
28
+ effectCell.mounted = false;
29
+ }
30
+ }
31
+ const cleanup = task.effect();
32
+ if (cleanup !== undefined && typeof cleanup !== "function") {
33
+ throw new Error("An effect function must either return a cleanup function or nothing. " +
34
+ `Received: ${typeof cleanup}`);
35
+ }
36
+ effectCell.mounted = true;
37
+ effectCell.cleanup = typeof cleanup === "function" ? cleanup : undefined;
38
+ effectCell.deps = task.deps;
39
+ }
40
+ });
39
41
  }
40
- function cleanupAllEffects(executionContext) {
41
- let firstError = null;
42
- for (let i = executionContext.cells.length - 1; i >= 0; i--) {
43
- const cell = executionContext.cells[i];
44
- if (cell?.type === "effect" && cell.mounted && cell.cleanup) {
45
- try {
46
- cell.cleanup();
47
- } catch (e) {
48
- if (firstError == null) firstError = e;
49
- } finally {
50
- cell.mounted = false;
51
- }
42
+ export function cleanupAllEffects(executionContext) {
43
+ let firstError = null;
44
+ // Run cleanups in reverse order
45
+ for (let i = executionContext.cells.length - 1; i >= 0; i--) {
46
+ const cell = executionContext.cells[i];
47
+ if (cell?.type === "effect" && cell.mounted && cell.cleanup) {
48
+ try {
49
+ cell.cleanup();
50
+ }
51
+ catch (e) {
52
+ if (firstError == null)
53
+ firstError = e;
54
+ }
55
+ finally {
56
+ cell.mounted = false;
57
+ }
58
+ }
52
59
  }
53
- }
54
- if (firstError != null) throw firstError;
60
+ if (firstError != null)
61
+ throw firstError;
55
62
  }
56
- export {
57
- cleanupAllEffects,
58
- commitRender
59
- };
60
63
  //# sourceMappingURL=commit.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/commit.ts"],"sourcesContent":["import { ResourceFiber, RenderResult } from \"./types\";\n\nexport function commitRender<R, P>(\n renderResult: RenderResult,\n fiber: ResourceFiber<R, P>,\n): void {\n // Process all tasks collected during render\n renderResult.commitTasks.forEach((task) => {\n const cellIndex = task.cellIndex;\n const effectCell = fiber.cells[cellIndex]!;\n if (effectCell.type !== \"effect\") {\n throw new Error(\"Cannot find effect cell\");\n }\n\n // Check if deps changed\n let shouldRunEffect = true;\n\n if (effectCell.deps !== undefined && task.deps !== undefined) {\n shouldRunEffect =\n effectCell.deps.length !== task.deps.length ||\n effectCell.deps.some((dep, j) => !Object.is(dep, task.deps![j]));\n }\n\n // Run cleanup if effect will re-run\n if (shouldRunEffect) {\n if (effectCell.mounted) {\n if (typeof effectCell.deps !== typeof task.deps) {\n throw new Error(\n \"tapEffect called with and without dependencies across re-renders\",\n );\n }\n\n try {\n if (effectCell.mounted && effectCell.cleanup) {\n effectCell.cleanup();\n }\n } finally {\n effectCell.mounted = false;\n }\n }\n const cleanup = task.effect();\n\n if (cleanup !== undefined && typeof cleanup !== \"function\") {\n throw new Error(\n \"An effect function must either return a cleanup function or nothing. \" +\n `Received: ${typeof cleanup}`,\n );\n }\n\n effectCell.mounted = true;\n effectCell.cleanup = typeof cleanup === \"function\" ? cleanup : undefined;\n effectCell.deps = task.deps;\n }\n });\n}\n\nexport function cleanupAllEffects<R, P>(executionContext: ResourceFiber<R, P>) {\n let firstError: unknown | null = null;\n // Run cleanups in reverse order\n for (let i = executionContext.cells.length - 1; i >= 0; i--) {\n const cell = executionContext.cells[i];\n if (cell?.type === \"effect\" && cell.mounted && cell.cleanup) {\n try {\n cell.cleanup();\n } catch (e) {\n if (firstError == null) firstError = e;\n } finally {\n cell.mounted = false;\n }\n }\n }\n if (firstError != null) throw firstError;\n}\n"],"mappings":";AAEO,SAAS,aACd,cACA,OACM;AAEN,eAAa,YAAY,QAAQ,CAAC,SAAS;AACzC,UAAM,YAAY,KAAK;AACvB,UAAM,aAAa,MAAM,MAAM,SAAS;AACxC,QAAI,WAAW,SAAS,UAAU;AAChC,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAGA,QAAI,kBAAkB;AAEtB,QAAI,WAAW,SAAS,UAAa,KAAK,SAAS,QAAW;AAC5D,wBACE,WAAW,KAAK,WAAW,KAAK,KAAK,UACrC,WAAW,KAAK,KAAK,CAAC,KAAK,MAAM,CAAC,OAAO,GAAG,KAAK,KAAK,KAAM,CAAC,CAAC,CAAC;AAAA,IACnE;AAGA,QAAI,iBAAiB;AACnB,UAAI,WAAW,SAAS;AACtB,YAAI,OAAO,WAAW,SAAS,OAAO,KAAK,MAAM;AAC/C,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,YAAI;AACF,cAAI,WAAW,WAAW,WAAW,SAAS;AAC5C,uBAAW,QAAQ;AAAA,UACrB;AAAA,QACF,UAAE;AACA,qBAAW,UAAU;AAAA,QACvB;AAAA,MACF;AACA,YAAM,UAAU,KAAK,OAAO;AAE5B,UAAI,YAAY,UAAa,OAAO,YAAY,YAAY;AAC1D,cAAM,IAAI;AAAA,UACR,kFACe,OAAO,OAAO;AAAA,QAC/B;AAAA,MACF;AAEA,iBAAW,UAAU;AACrB,iBAAW,UAAU,OAAO,YAAY,aAAa,UAAU;AAC/D,iBAAW,OAAO,KAAK;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAEO,SAAS,kBAAwB,kBAAuC;AAC7E,MAAI,aAA6B;AAEjC,WAAS,IAAI,iBAAiB,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3D,UAAM,OAAO,iBAAiB,MAAM,CAAC;AACrC,QAAI,MAAM,SAAS,YAAY,KAAK,WAAW,KAAK,SAAS;AAC3D,UAAI;AACF,aAAK,QAAQ;AAAA,MACf,SAAS,GAAG;AACV,YAAI,cAAc,KAAM,cAAa;AAAA,MACvC,UAAE;AACA,aAAK,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACA,MAAI,cAAc,KAAM,OAAM;AAChC;","names":[]}
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/core/commit.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAC1B,YAA0B,EAC1B,KAA0B;IAE1B,4CAA4C;IAC5C,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC;QAC3C,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,wBAAwB;QACxB,IAAI,eAAe,GAAG,IAAI,CAAC;QAE3B,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7D,eAAe;gBACb,UAAU,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;oBAC3C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,oCAAoC;QACpC,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;oBAChD,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC;oBACH,IAAI,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;wBAC7C,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvB,CAAC;gBACH,CAAC;wBAAS,CAAC;oBACT,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;gBAC7B,CAAC;YACH,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAE9B,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,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1B,UAAU,CAAC,OAAO,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YACzE,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAO,gBAAqC;IAC3E,IAAI,UAAU,GAAmB,IAAI,CAAC;IACtC,gCAAgC;IAChC,KAAK,IAAI,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5D,IAAI,CAAC;gBACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,UAAU,IAAI,IAAI;oBAAE,UAAU,GAAG,CAAC,CAAC;YACzC,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,UAAU,IAAI,IAAI;QAAE,MAAM,UAAU,CAAC;AAC3C,CAAC"}
@@ -1,25 +1,20 @@
1
- // src/core/context.ts
2
- var contextValue = /* @__PURE__ */ Symbol("tap.Context");
3
- var createContext = (defaultValue) => {
4
- return {
5
- [contextValue]: defaultValue
6
- };
1
+ const contextValue = Symbol("tap.Context");
2
+ export const createContext = (defaultValue) => {
3
+ return {
4
+ [contextValue]: defaultValue,
5
+ };
7
6
  };
8
- var withContextProvider = (context, value, fn) => {
9
- const previousValue = context[contextValue];
10
- context[contextValue] = value;
11
- try {
12
- return fn();
13
- } finally {
14
- context[contextValue] = previousValue;
15
- }
7
+ export const withContextProvider = (context, value, fn) => {
8
+ const previousValue = context[contextValue];
9
+ context[contextValue] = value;
10
+ try {
11
+ return fn();
12
+ }
13
+ finally {
14
+ context[contextValue] = previousValue;
15
+ }
16
16
  };
17
- var tapContext = (context) => {
18
- return context[contextValue];
19
- };
20
- export {
21
- createContext,
22
- tapContext,
23
- withContextProvider
17
+ export const tapContext = (context) => {
18
+ return context[contextValue];
24
19
  };
25
20
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/context.ts"],"sourcesContent":["const contextValue: unique symbol = Symbol(\"tap.Context\");\ntype Context<T> = {\n [contextValue]: T;\n};\n\nexport const createContext = <T>(defaultValue: T): Context<T> => {\n return {\n [contextValue]: defaultValue,\n };\n};\n\nexport const withContextProvider = <T, TResult>(\n context: Context<T>,\n value: T,\n fn: () => TResult,\n) => {\n const previousValue = context[contextValue];\n context[contextValue] = value;\n try {\n return fn();\n } finally {\n context[contextValue] = previousValue;\n }\n};\n\nexport const tapContext = <T>(context: Context<T>) => {\n return context[contextValue];\n};\n"],"mappings":";AAAA,IAAM,eAA8B,uBAAO,aAAa;AAKjD,IAAM,gBAAgB,CAAI,iBAAgC;AAC/D,SAAO;AAAA,IACL,CAAC,YAAY,GAAG;AAAA,EAClB;AACF;AAEO,IAAM,sBAAsB,CACjC,SACA,OACA,OACG;AACH,QAAM,gBAAgB,QAAQ,YAAY;AAC1C,UAAQ,YAAY,IAAI;AACxB,MAAI;AACF,WAAO,GAAG;AAAA,EACZ,UAAE;AACA,YAAQ,YAAY,IAAI;AAAA,EAC1B;AACF;AAEO,IAAM,aAAa,CAAI,YAAwB;AACpD,SAAO,QAAQ,YAAY;AAC7B;","names":[]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAkB,MAAM,CAAC,aAAa,CAAC,CAAC;AAK1D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAI,YAAe,EAAc,EAAE;IAC9D,OAAO;QACL,CAAC,YAAY,CAAC,EAAE,YAAY;KAC7B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAAmB,EACnB,KAAQ,EACR,EAAiB,EACjB,EAAE;IACF,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,YAAY,CAAC,GAAG,aAAa,CAAC;IACxC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAI,OAAmB,EAAE,EAAE;IACnD,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC;AAC/B,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { ResourceElement } from "./types";
1
+ import { ResourceElement } from "./types.js";
2
2
  export declare namespace createResource {
3
3
  type Unsubscribe = () => void;
4
4
  interface Handle<R, P> {
@@ -1 +1 @@
1
- {"version":3,"file":"createResource.d.ts","sourceRoot":"","sources":["../../src/core/createResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,eAAe,EAAE,MAAM,SAAS,CAAC;AAexD,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;AA4CD,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,EACjC,SAAS,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9B,YAAkB;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,KACzC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CA4C5B,CAAC"}
1
+ {"version":3,"file":"createResource.d.ts","sourceRoot":"","sources":["../../src/core/createResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,eAAe,EAAE,mBAAgB;AAexD,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;AA4CD,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,EACjC,SAAS,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9B,YAAkB;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,KACzC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CA4C5B,CAAC"}
@@ -1,10 +1,4 @@
1
- // src/core/createResource.ts
2
- import {
3
- createResourceFiber,
4
- unmountResourceFiber,
5
- renderResourceFiber,
6
- commitResourceFiber
7
- } from "./ResourceFiber.js";
1
+ import { createResourceFiber, unmountResourceFiber, renderResourceFiber, commitResourceFiber, } from "./ResourceFiber.js";
8
2
  import { flushSync, UpdateScheduler } from "./scheduler.js";
9
3
  import { tapRef } from "../hooks/tap-ref.js";
10
4
  import { tapState } from "../hooks/tap-state.js";
@@ -12,77 +6,70 @@ import { tapMemo } from "../hooks/tap-memo.js";
12
6
  import { tapEffect } from "../hooks/tap-effect.js";
13
7
  import { resource } from "./resource.js";
14
8
  import { tapResource } from "../hooks/tap-resource.js";
15
- var HandleWrapperResource = resource(
16
- (state) => {
9
+ const HandleWrapperResource = resource((state) => {
17
10
  const [, setElement] = tapState(state.element);
18
11
  const value = tapResource(state.element);
19
- const subscribers = tapRef(/* @__PURE__ */ new Set()).current;
12
+ const subscribers = tapRef(new Set()).current;
20
13
  const valueRef = tapRef(value);
21
14
  tapEffect(() => {
22
- if (value !== valueRef.current) {
23
- valueRef.current = value;
24
- subscribers.forEach((callback) => callback());
25
- }
15
+ if (value !== valueRef.current) {
16
+ valueRef.current = value;
17
+ subscribers.forEach((callback) => callback());
18
+ }
26
19
  });
27
- const handle = tapMemo(
28
- () => ({
20
+ const handle = tapMemo(() => ({
29
21
  getState: () => valueRef.current,
30
22
  subscribe: (callback) => {
31
- subscribers.add(callback);
32
- return () => subscribers.delete(callback);
23
+ subscribers.add(callback);
24
+ return () => subscribers.delete(callback);
33
25
  },
34
26
  render: (element) => {
35
- const changed = state.element !== element;
36
- state.element = element;
37
- if (state.onRender(changed)) {
38
- setElement(element);
39
- }
27
+ const changed = state.element !== element;
28
+ state.element = element;
29
+ if (state.onRender(changed)) {
30
+ setElement(element);
31
+ }
40
32
  },
41
- unmount: state.onUnmount
42
- }),
43
- []
44
- );
33
+ unmount: state.onUnmount,
34
+ }), []);
45
35
  return handle;
46
- }
47
- );
48
- var createResource = (element, { mount = true } = {}) => {
49
- let isMounted = mount;
50
- let render;
51
- const props = {
52
- element,
53
- onRender: (changed) => {
54
- if (isMounted) return changed;
55
- isMounted = true;
56
- flushSync(() => {
57
- if (changed) {
58
- render = renderResourceFiber(fiber, props);
59
- }
60
- if (scheduler.isDirty) return;
36
+ });
37
+ export const createResource = (element, { mount = true } = {}) => {
38
+ let isMounted = mount;
39
+ let render;
40
+ const props = {
41
+ element,
42
+ onRender: (changed) => {
43
+ if (isMounted)
44
+ return changed;
45
+ isMounted = true;
46
+ flushSync(() => {
47
+ if (changed) {
48
+ render = renderResourceFiber(fiber, props);
49
+ }
50
+ if (scheduler.isDirty)
51
+ return;
52
+ commitResourceFiber(fiber, render);
53
+ });
54
+ return false;
55
+ },
56
+ onUnmount: () => {
57
+ if (!isMounted)
58
+ throw new Error("Resource not mounted");
59
+ isMounted = false;
60
+ unmountResourceFiber(fiber);
61
+ },
62
+ };
63
+ const scheduler = new UpdateScheduler(() => {
64
+ render = renderResourceFiber(fiber, props);
65
+ if (scheduler.isDirty || !isMounted)
66
+ return;
61
67
  commitResourceFiber(fiber, render);
62
- });
63
- return false;
64
- },
65
- onUnmount: () => {
66
- if (!isMounted) throw new Error("Resource not mounted");
67
- isMounted = false;
68
- unmountResourceFiber(fiber);
69
- }
70
- };
71
- const scheduler = new UpdateScheduler(() => {
72
- render = renderResourceFiber(fiber, props);
73
- if (scheduler.isDirty || !isMounted) return;
74
- commitResourceFiber(fiber, render);
75
- });
76
- const fiber = createResourceFiber(
77
- HandleWrapperResource,
78
- () => scheduler.markDirty()
79
- );
80
- flushSync(() => {
81
- scheduler.markDirty();
82
- });
83
- return render.state;
84
- };
85
- export {
86
- createResource
68
+ });
69
+ const fiber = createResourceFiber((HandleWrapperResource), () => scheduler.markDirty());
70
+ flushSync(() => {
71
+ scheduler.markDirty();
72
+ });
73
+ return render.state;
87
74
  };
88
75
  //# sourceMappingURL=createResource.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/createResource.ts"],"sourcesContent":["import { RenderResult, ResourceElement } from \"./types\";\nimport {\n createResourceFiber,\n unmountResourceFiber,\n renderResourceFiber,\n commitResourceFiber,\n} from \"./ResourceFiber\";\nimport { flushSync, UpdateScheduler } from \"./scheduler\";\nimport { tapRef } from \"../hooks/tap-ref\";\nimport { tapState } from \"../hooks/tap-state\";\nimport { tapMemo } from \"../hooks/tap-memo\";\nimport { tapEffect } from \"../hooks/tap-effect\";\nimport { resource } from \"./resource\";\nimport { tapResource } from \"../hooks/tap-resource\";\n\nexport namespace createResource {\n export type Unsubscribe = () => void;\n\n export interface Handle<R, P> {\n getState(): R;\n subscribe(callback: () => void): Unsubscribe;\n render(element: ResourceElement<R, P>): void;\n unmount(): void;\n }\n}\n\nconst HandleWrapperResource = resource(\n <R, P>(state: {\n element: ResourceElement<R, P>;\n onRender: (changed: boolean) => boolean;\n onUnmount: () => void;\n }): createResource.Handle<R, P> => {\n const [, setElement] = tapState(state.element);\n const value = tapResource(state.element);\n const subscribers = tapRef(new Set<() => void>()).current;\n const valueRef = tapRef(value);\n\n tapEffect(() => {\n if (value !== valueRef.current) {\n valueRef.current = value;\n subscribers.forEach((callback) => callback());\n }\n });\n\n const handle = tapMemo(\n () => ({\n getState: () => valueRef.current,\n subscribe: (callback: () => void) => {\n subscribers.add(callback);\n return () => subscribers.delete(callback);\n },\n render: (element: ResourceElement<R, P>) => {\n const changed = state.element !== element;\n state.element = element;\n\n if (state.onRender(changed)) {\n setElement(element);\n }\n },\n unmount: state.onUnmount,\n }),\n [],\n );\n\n return handle;\n },\n);\n\nexport const createResource = <R, P>(\n element: ResourceElement<R, P>,\n { mount = true }: { mount?: boolean } = {},\n): createResource.Handle<R, P> => {\n let isMounted = mount;\n let render: RenderResult;\n const props = {\n element,\n onRender: (changed: boolean) => {\n if (isMounted) return changed;\n isMounted = true;\n\n flushSync(() => {\n if (changed) {\n render = renderResourceFiber(fiber, props);\n }\n\n if (scheduler.isDirty) return;\n commitResourceFiber(fiber, render!);\n });\n\n return false;\n },\n onUnmount: () => {\n if (!isMounted) throw new Error(\"Resource not mounted\");\n isMounted = false;\n\n unmountResourceFiber(fiber);\n },\n };\n\n const scheduler = new UpdateScheduler(() => {\n render = renderResourceFiber(fiber, props);\n\n if (scheduler.isDirty || !isMounted) return;\n commitResourceFiber(fiber, render);\n });\n\n const fiber = createResourceFiber(HandleWrapperResource<R, P>, () =>\n scheduler.markDirty(),\n );\n\n flushSync(() => {\n scheduler.markDirty();\n });\n\n return render!.state;\n};\n"],"mappings":";AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,WAAW,uBAAuB;AAC3C,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAa5B,IAAM,wBAAwB;AAAA,EAC5B,CAAO,UAI4B;AACjC,UAAM,CAAC,EAAE,UAAU,IAAI,SAAS,MAAM,OAAO;AAC7C,UAAM,QAAQ,YAAY,MAAM,OAAO;AACvC,UAAM,cAAc,OAAO,oBAAI,IAAgB,CAAC,EAAE;AAClD,UAAM,WAAW,OAAO,KAAK;AAE7B,cAAU,MAAM;AACd,UAAI,UAAU,SAAS,SAAS;AAC9B,iBAAS,UAAU;AACnB,oBAAY,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,UAAM,SAAS;AAAA,MACb,OAAO;AAAA,QACL,UAAU,MAAM,SAAS;AAAA,QACzB,WAAW,CAAC,aAAyB;AACnC,sBAAY,IAAI,QAAQ;AACxB,iBAAO,MAAM,YAAY,OAAO,QAAQ;AAAA,QAC1C;AAAA,QACA,QAAQ,CAAC,YAAmC;AAC1C,gBAAM,UAAU,MAAM,YAAY;AAClC,gBAAM,UAAU;AAEhB,cAAI,MAAM,SAAS,OAAO,GAAG;AAC3B,uBAAW,OAAO;AAAA,UACpB;AAAA,QACF;AAAA,QACA,SAAS,MAAM;AAAA,MACjB;AAAA,MACA,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,iBAAiB,CAC5B,SACA,EAAE,QAAQ,KAAK,IAAyB,CAAC,MACT;AAChC,MAAI,YAAY;AAChB,MAAI;AACJ,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,UAAU,CAAC,YAAqB;AAC9B,UAAI,UAAW,QAAO;AACtB,kBAAY;AAEZ,gBAAU,MAAM;AACd,YAAI,SAAS;AACX,mBAAS,oBAAoB,OAAO,KAAK;AAAA,QAC3C;AAEA,YAAI,UAAU,QAAS;AACvB,4BAAoB,OAAO,MAAO;AAAA,MACpC,CAAC;AAED,aAAO;AAAA,IACT;AAAA,IACA,WAAW,MAAM;AACf,UAAI,CAAC,UAAW,OAAM,IAAI,MAAM,sBAAsB;AACtD,kBAAY;AAEZ,2BAAqB,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,YAAY,IAAI,gBAAgB,MAAM;AAC1C,aAAS,oBAAoB,OAAO,KAAK;AAEzC,QAAI,UAAU,WAAW,CAAC,UAAW;AACrC,wBAAoB,OAAO,MAAM;AAAA,EACnC,CAAC;AAED,QAAM,QAAQ;AAAA,IAAoB;AAAA,IAA6B,MAC7D,UAAU,UAAU;AAAA,EACtB;AAEA,YAAU,MAAM;AACd,cAAU,UAAU;AAAA,EACtB,CAAC;AAED,SAAO,OAAQ;AACjB;","names":[]}
1
+ {"version":3,"file":"createResource.js","sourceRoot":"","sources":["../../src/core/createResource.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ResourceFiber } from "./types";
1
+ import { ResourceFiber } from "./types.js";
2
2
  export declare function withResourceFiber<R, P>(fiber: ResourceFiber<R, P>, fn: () => void): void;
3
3
  export declare function getCurrentResourceFiber(): ResourceFiber<unknown, unknown>;
4
4
  //# sourceMappingURL=execution-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"execution-context.d.ts","sourceRoot":"","sources":["../../src/core/execution-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;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"}
1
+ {"version":3,"file":"execution-context.d.ts","sourceRoot":"","sources":["../../src/core/execution-context.ts"],"names":[],"mappings":"AAAA,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"}
@@ -1,29 +1,25 @@
1
- // src/core/execution-context.ts
2
- var currentResourceFiber = null;
3
- function withResourceFiber(fiber, fn) {
4
- fiber.currentIndex = 0;
5
- const previousContext = currentResourceFiber;
6
- currentResourceFiber = fiber;
7
- try {
8
- fn();
9
- fiber.isFirstRender = false;
10
- if (fiber.cells.length !== fiber.currentIndex) {
11
- throw new Error(
12
- `Rendered ${fiber.currentIndex} hooks but expected ${fiber.cells.length}. Hooks must be called in the exact same order in every render.`
13
- );
1
+ let currentResourceFiber = null;
2
+ export function withResourceFiber(fiber, fn) {
3
+ fiber.currentIndex = 0;
4
+ const previousContext = currentResourceFiber;
5
+ currentResourceFiber = fiber;
6
+ try {
7
+ fn();
8
+ fiber.isFirstRender = false;
9
+ // ensure hook count matches
10
+ if (fiber.cells.length !== fiber.currentIndex) {
11
+ throw new Error(`Rendered ${fiber.currentIndex} hooks but expected ${fiber.cells.length}. ` +
12
+ "Hooks must be called in the exact same order in every render.");
13
+ }
14
+ }
15
+ finally {
16
+ currentResourceFiber = previousContext;
14
17
  }
15
- } finally {
16
- currentResourceFiber = previousContext;
17
- }
18
18
  }
19
- function getCurrentResourceFiber() {
20
- if (!currentResourceFiber) {
21
- throw new Error("No resource fiber available");
22
- }
23
- return currentResourceFiber;
19
+ export function getCurrentResourceFiber() {
20
+ if (!currentResourceFiber) {
21
+ throw new Error("No resource fiber available");
22
+ }
23
+ return currentResourceFiber;
24
24
  }
25
- export {
26
- getCurrentResourceFiber,
27
- withResourceFiber
28
- };
29
25
  //# sourceMappingURL=execution-context.js.map