kiru 0.49.2 → 0.50.0-preview.1

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 (143) hide show
  1. package/dist/components/errorBoundary.d.ts +7 -0
  2. package/dist/components/errorBoundary.d.ts.map +1 -0
  3. package/dist/components/errorBoundary.js +6 -0
  4. package/dist/components/errorBoundary.js.map +1 -0
  5. package/dist/components/index.d.ts +2 -0
  6. package/dist/components/index.d.ts.map +1 -1
  7. package/dist/components/index.js +2 -0
  8. package/dist/components/index.js.map +1 -1
  9. package/dist/components/lazy.d.ts.map +1 -1
  10. package/dist/components/lazy.js +11 -136
  11. package/dist/components/lazy.js.map +1 -1
  12. package/dist/components/suspense.d.ts +34 -0
  13. package/dist/components/suspense.d.ts.map +1 -0
  14. package/dist/components/suspense.js +110 -0
  15. package/dist/components/suspense.js.map +1 -0
  16. package/dist/constants.d.ts +4 -2
  17. package/dist/constants.d.ts.map +1 -1
  18. package/dist/constants.js +4 -2
  19. package/dist/constants.js.map +1 -1
  20. package/dist/hmr.d.ts +1 -0
  21. package/dist/hmr.d.ts.map +1 -1
  22. package/dist/hmr.js +7 -0
  23. package/dist/hmr.js.map +1 -1
  24. package/dist/index.d.ts +1 -0
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +1 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/recursiveRender.d.ts +6 -0
  29. package/dist/recursiveRender.d.ts.map +1 -0
  30. package/dist/recursiveRender.js +109 -0
  31. package/dist/recursiveRender.js.map +1 -0
  32. package/dist/renderToString.d.ts.map +1 -1
  33. package/dist/renderToString.js +10 -59
  34. package/dist/renderToString.js.map +1 -1
  35. package/dist/router/config.d.ts +3 -0
  36. package/dist/router/config.d.ts.map +1 -0
  37. package/dist/router/config.js +13 -0
  38. package/dist/router/config.js.map +1 -0
  39. package/dist/router/context.d.ts +15 -0
  40. package/dist/router/context.d.ts.map +1 -0
  41. package/dist/router/context.js +11 -0
  42. package/dist/router/context.js.map +1 -0
  43. package/dist/router/errors.d.ts +4 -0
  44. package/dist/router/errors.d.ts.map +1 -0
  45. package/dist/router/errors.js +7 -0
  46. package/dist/router/errors.js.map +1 -0
  47. package/dist/router/fileRouter.d.ts +48 -0
  48. package/dist/router/fileRouter.d.ts.map +1 -0
  49. package/dist/router/fileRouter.js +311 -0
  50. package/dist/router/fileRouter.js.map +1 -0
  51. package/dist/router/globals.d.ts +5 -0
  52. package/dist/router/globals.d.ts.map +1 -0
  53. package/dist/router/globals.js +4 -0
  54. package/dist/router/globals.js.map +1 -0
  55. package/dist/router/index.d.ts +7 -0
  56. package/dist/router/index.d.ts.map +1 -0
  57. package/dist/router/index.js +7 -0
  58. package/dist/router/index.js.map +1 -0
  59. package/dist/router/link.d.ts +8 -0
  60. package/dist/router/link.d.ts.map +1 -0
  61. package/dist/router/link.js +15 -0
  62. package/dist/router/link.js.map +1 -0
  63. package/dist/router/types.d.ts +63 -0
  64. package/dist/router/types.d.ts.map +1 -0
  65. package/dist/router/types.internal.d.ts +12 -0
  66. package/dist/router/types.internal.d.ts.map +1 -0
  67. package/dist/router/types.internal.js +2 -0
  68. package/dist/router/types.internal.js.map +1 -0
  69. package/dist/router/types.js +2 -0
  70. package/dist/router/types.js.map +1 -0
  71. package/dist/scheduler.d.ts.map +1 -1
  72. package/dist/scheduler.js +35 -10
  73. package/dist/scheduler.js.map +1 -1
  74. package/dist/ssr/server.d.ts +4 -1
  75. package/dist/ssr/server.d.ts.map +1 -1
  76. package/dist/ssr/server.js +50 -82
  77. package/dist/ssr/server.js.map +1 -1
  78. package/dist/types.d.ts +10 -2
  79. package/dist/types.d.ts.map +1 -1
  80. package/dist/types.utils.d.ts +6 -7
  81. package/dist/types.utils.d.ts.map +1 -1
  82. package/dist/utils/runtime.d.ts +1 -1
  83. package/dist/utils/runtime.d.ts.map +1 -1
  84. package/dist/utils/runtime.js.map +1 -1
  85. package/dist/utils/vdom.d.ts +3 -1
  86. package/dist/utils/vdom.d.ts.map +1 -1
  87. package/dist/utils/vdom.js +6 -5
  88. package/dist/utils/vdom.js.map +1 -1
  89. package/package.json +4 -8
  90. package/src/components/errorBoundary.ts +16 -0
  91. package/src/components/index.ts +2 -0
  92. package/src/components/lazy.ts +12 -169
  93. package/src/components/suspense.ts +191 -0
  94. package/src/constants.ts +6 -2
  95. package/src/hmr.ts +8 -0
  96. package/src/index.ts +1 -0
  97. package/src/recursiveRender.ts +127 -0
  98. package/src/renderToString.ts +10 -73
  99. package/src/router/config.ts +15 -0
  100. package/src/router/context.ts +23 -0
  101. package/src/router/errors.ts +6 -0
  102. package/src/router/fileRouter.ts +475 -0
  103. package/src/router/globals.ts +5 -0
  104. package/src/router/index.ts +6 -0
  105. package/src/router/link.ts +32 -0
  106. package/src/router/types.internal.ts +14 -0
  107. package/src/router/types.ts +81 -0
  108. package/src/scheduler.ts +45 -12
  109. package/src/ssr/server.ts +58 -95
  110. package/src/types.ts +11 -2
  111. package/src/types.utils.ts +6 -11
  112. package/src/utils/runtime.ts +1 -1
  113. package/src/utils/vdom.ts +11 -4
  114. package/dist/components/router/index.d.ts +0 -3
  115. package/dist/components/router/index.d.ts.map +0 -1
  116. package/dist/components/router/index.js +0 -3
  117. package/dist/components/router/index.js.map +0 -1
  118. package/dist/components/router/route.d.ts +0 -46
  119. package/dist/components/router/route.d.ts.map +0 -1
  120. package/dist/components/router/route.js +0 -8
  121. package/dist/components/router/route.js.map +0 -1
  122. package/dist/components/router/router.d.ts +0 -62
  123. package/dist/components/router/router.d.ts.map +0 -1
  124. package/dist/components/router/router.js +0 -181
  125. package/dist/components/router/router.js.map +0 -1
  126. package/dist/components/router/routerUtils.d.ts +0 -5
  127. package/dist/components/router/routerUtils.d.ts.map +0 -1
  128. package/dist/components/router/routerUtils.js +0 -39
  129. package/dist/components/router/routerUtils.js.map +0 -1
  130. package/dist/ssr/hydrationBoundary.d.ts +0 -27
  131. package/dist/ssr/hydrationBoundary.d.ts.map +0 -1
  132. package/dist/ssr/hydrationBoundary.js +0 -30
  133. package/dist/ssr/hydrationBoundary.js.map +0 -1
  134. package/dist/ssr/index.d.ts +0 -2
  135. package/dist/ssr/index.d.ts.map +0 -1
  136. package/dist/ssr/index.js +0 -2
  137. package/dist/ssr/index.js.map +0 -1
  138. package/src/components/router/index.ts +0 -2
  139. package/src/components/router/route.ts +0 -51
  140. package/src/components/router/router.ts +0 -280
  141. package/src/components/router/routerUtils.ts +0 -49
  142. package/src/ssr/hydrationBoundary.ts +0 -63
  143. package/src/ssr/index.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.utils.d.ts","sourceRoot":"","sources":["../src/types.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,SAAS,EACT,mBAAmB,EACpB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAEvC,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,CAAA;AAClD,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,IAAI,CAAA;AACrD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,SAAS,CAAA;AAClD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;AAE1C,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,KAAK;IAC/C,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,OAAO,CAAA;CACpC;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,KAAK;IAC9C,GAAG,EAAE,WAAW,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AACD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,KAAK;IAC1C,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,CAAE,SAAQ,IAAI,CAAC,KAAK;IACxD,IAAI,EAAE,OAAO,iBAAiB,CAAA;IAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;QAC3B,KAAK,EAAE,CAAC,CAAA;QACR,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACpB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;KAC5B,CAAA;CACF;AAED,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,KAAK;IACvD,IAAI,EAAE,OAAO,mBAAmB,CAAA;IAChC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;QAC3B,IAAI,EAAE,qBAAqB,CAAA;KAC5B,CAAA;CACF;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,KAAK;IAC9C,IAAI,EAAE,OAAO,SAAS,CAAA;CACvB;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KACvB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,GAAG,EAAE,CAAA;AAEN,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;AAEzC,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,GAAG,KAAK,IACjD;IACE,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,IAAI,CAAA;IACX,OAAO,EAAE,IAAI,CAAA;CACd,GACD;IACE,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,IAAI,CAAA;IACX,OAAO,EAAE,KAAK,CAAA;CACf,GACD;IACE,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,CAAC,CAAA;IACR,OAAO,EAAE,KAAK,CAAA;CACf,CAAA"}
1
+ {"version":3,"file":"types.utils.d.ts","sourceRoot":"","sources":["../src/types.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAChF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAEpE,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,CAAA;AAClD,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,IAAI,CAAA;AACrD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,SAAS,CAAA;AAClD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;AAE1C,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,KAAK;IAC/C,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,OAAO,CAAA;CACpC;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,KAAK;IAC9C,GAAG,EAAE,WAAW,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AACD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,KAAK;IAC1C,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,CAAE,SAAQ,IAAI,CAAC,KAAK;IACxD,IAAI,EAAE,OAAO,iBAAiB,CAAA;IAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;QAC3B,KAAK,EAAE,CAAC,CAAA;QACR,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACpB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;KAC5B,CAAA;CACF;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,KAAK;IACnD,IAAI,EAAE,OAAO,eAAe,CAAA;IAC5B,KAAK,EAAE,kBAAkB,CAAA;IACzB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,KAAK;IAC9C,IAAI,EAAE,OAAO,SAAS,CAAA;CACvB;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KACvB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,GAAG,EAAE,CAAA;AAEN,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;AAEzC,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,GAAG,KAAK,IACjD;IACE,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,IAAI,CAAA;IACX,OAAO,EAAE,IAAI,CAAA;CACd,GACD;IACE,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,IAAI,CAAA;IACX,OAAO,EAAE,KAAK,CAAA;CACf,GACD;IACE,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,CAAC,CAAA;IACR,OAAO,EAAE,KAAK,CAAA;CACf,CAAA"}
@@ -3,7 +3,7 @@ export { latest, sideEffectsEnabled };
3
3
  * This is a no-op in production. It is used to get the latest
4
4
  * iteration of a component or signal after HMR has happened.
5
5
  */
6
- declare function latest<T>(thing: T): T;
6
+ declare function latest<T extends Exclude<object, null>>(thing: T): T;
7
7
  /**
8
8
  * Returns false if called during "stream" or "string" render modes.
9
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;AAErC;;;GAGG;AACH,iBAAS,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAQ9B;AAED;;GAEG;AACH,iBAAS,kBAAkB,IAAI,OAAO,CAErC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;AAErC;;;GAGG;AACH,iBAAS,MAAM,CAAC,CAAC,SAAS,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAQ5D;AAED;;GAEG;AACH,iBAAS,kBAAkB,IAAI,OAAO,CAErC"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;AAErC;;;GAGG;AACH,SAAS,MAAM,CAAI,KAAQ;IACzB,IAAI,GAAG,GAAQ,KAAK,CAAA;IACpB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,QAAQ,IAAI,GAAG,EAAE,CAAC;YACvB,GAAG,GAAG,GAAG,CAAC,MAAoB,CAAA;QAChC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,OAAO,UAAU,CAAC,OAAO,KAAK,KAAK,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,CAAA;AACzE,CAAC"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;AAErC;;;GAGG;AACH,SAAS,MAAM,CAAkC,KAAQ;IACvD,IAAI,GAAG,GAAQ,KAAK,CAAA;IACpB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,QAAQ,IAAI,GAAG,EAAE,CAAC;YACvB,GAAG,GAAG,GAAG,CAAC,MAAoB,CAAA;QAChC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,OAAO,UAAU,CAAC,OAAO,KAAK,KAAK,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,CAAA;AACzE,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { $FRAGMENT, $CONTEXT_PROVIDER } from "../constants.js";
2
2
  import type { AppContext } from "../appContext.js";
3
- export { cloneVNode, isVNodeDeleted, isVNode, isExoticType, isFragment, isLazy, isMemo, isContextProvider, vNodeContains, getCurrentVNode, getVNodeAppContext, commitSnapshot, traverseApply, findParent, assertValidElementProps, isValidElementKeyProp, isValidElementRefProp, };
3
+ import type { ErrorBoundaryNode } from "../types.utils.js";
4
+ export { cloneVNode, isVNodeDeleted, isVNode, isExoticType, isFragment, isLazy, isMemo, isContextProvider, vNodeContains, getCurrentVNode, getVNodeAppContext, commitSnapshot, traverseApply, findParent, findParentErrorBoundary, assertValidElementProps, isValidElementKeyProp, isValidElementRefProp, };
4
5
  declare function cloneVNode(vNode: Kiru.VNode): Kiru.VNode;
5
6
  declare function isVNodeDeleted(vNode: Kiru.VNode): boolean;
6
7
  declare function isVNode(thing: unknown): thing is Kiru.VNode;
@@ -19,6 +20,7 @@ declare function commitSnapshot(vNode: Kiru.VNode): void;
19
20
  declare function vNodeContains(haystack: Kiru.VNode, needle: Kiru.VNode): boolean;
20
21
  declare function traverseApply(vNode: Kiru.VNode, func: (node: Kiru.VNode) => void): void;
21
22
  declare function findParent(vNode: Kiru.VNode, predicate: (n: Kiru.VNode) => boolean): Kiru.VNode | null;
23
+ declare function findParentErrorBoundary(vNode: Kiru.VNode): ErrorBoundaryNode | null;
22
24
  declare function assertValidElementProps(vNode: Kiru.VNode): void;
23
25
  declare function isValidElementKeyProp(thing: unknown): thing is string | number;
24
26
  declare function isValidElementRefProp(thing: unknown): thing is Kiru.Ref<any>;
@@ -1 +1 @@
1
- {"version":3,"file":"vdom.d.ts","sourceRoot":"","sources":["../../src/utils/vdom.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,SAAS,EACT,iBAAiB,EAIlB,MAAM,iBAAiB,CAAA;AAIxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EACL,UAAU,EACV,cAAc,EACd,OAAO,EACP,YAAY,EACZ,UAAU,EACV,MAAM,EACN,MAAM,EACN,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,UAAU,EACV,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,CAAA;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAUjD;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAElD;AAED,iBAAS,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAEpD;AAED,iBAAS,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,YAAY,CAMzE;AAED,iBAAS,UAAU,CACjB,KAAK,EAAE,IAAI,CAAC,KAAK,GAChB,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG;IAAE,IAAI,EAAE,OAAO,SAAS,CAAA;CAAE,CAElD;AAED,iBAAS,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAM1C;AAED,iBAAS,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAM1C;AAED,iBAAS,iBAAiB,CACxB,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG;IAAE,IAAI,EAAE,OAAO,iBAAiB,CAAA;CAAE,CAE1D;AAED,iBAAS,eAAe,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAE5C;AAED,iBAAS,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,UAAU,GAAG,IAAI,CAUhE;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAQ/C;AAED,iBAAS,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAaxE;AAED,iBAAS,aAAa,CACpB,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,GAC/B,IAAI,CAUN;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,KAAK,OAAO,qBAO3E;AAED,iBAAS,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,QAgBjD;AAED,iBAAS,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,GAAG,MAAM,CAEvE;AAED,iBAAS,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAMrE"}
1
+ {"version":3,"file":"vdom.d.ts","sourceRoot":"","sources":["../../src/utils/vdom.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,SAAS,EACT,iBAAiB,EAIlB,MAAM,iBAAiB,CAAA;AAIxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE1D,OAAO,EACL,UAAU,EACV,cAAc,EACd,OAAO,EACP,YAAY,EACZ,UAAU,EACV,MAAM,EACN,MAAM,EACN,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,UAAU,EACV,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,CAAA;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAUjD;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAElD;AAED,iBAAS,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAEpD;AAED,iBAAS,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,YAAY,CAIzE;AAED,iBAAS,UAAU,CACjB,KAAK,EAAE,IAAI,CAAC,KAAK,GAChB,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG;IAAE,IAAI,EAAE,OAAO,SAAS,CAAA;CAAE,CAElD;AAED,iBAAS,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAM1C;AAED,iBAAS,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAM1C;AAED,iBAAS,iBAAiB,CACxB,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG;IAAE,IAAI,EAAE,OAAO,iBAAiB,CAAA;CAAE,CAE1D;AAED,iBAAS,eAAe,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAE5C;AAED,iBAAS,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,UAAU,GAAG,IAAI,CAUhE;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAQ/C;AAED,iBAAS,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAaxE;AAED,iBAAS,aAAa,CACpB,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,GAC/B,IAAI,CAUN;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,KAAK,OAAO,qBAO3E;AAED,iBAAS,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,iBAAiB,GAAG,IAAI,CAK5E;AAED,iBAAS,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,QAgBjD;AAED,iBAAS,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,GAAG,MAAM,CAEvE;AAED,iBAAS,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAMrE"}
@@ -1,9 +1,9 @@
1
1
  import { Signal } from "../signals/index.js";
2
- import { FLAG_DELETION, $FRAGMENT, $CONTEXT_PROVIDER, $HYDRATION_BOUNDARY, FLAG_PLACEMENT, FLAG_UPDATE, } from "../constants.js";
2
+ import { FLAG_DELETION, $FRAGMENT, $CONTEXT_PROVIDER, FLAG_PLACEMENT, FLAG_UPDATE, $ERROR_BOUNDARY, } from "../constants.js";
3
3
  import { createElement } from "../index.js";
4
4
  import { KiruError } from "../error.js";
5
5
  import { node } from "../globals.js";
6
- export { cloneVNode, isVNodeDeleted, isVNode, isExoticType, isFragment, isLazy, isMemo, isContextProvider, vNodeContains, getCurrentVNode, getVNodeAppContext, commitSnapshot, traverseApply, findParent, assertValidElementProps, isValidElementKeyProp, isValidElementRefProp, };
6
+ export { cloneVNode, isVNodeDeleted, isVNode, isExoticType, isFragment, isLazy, isMemo, isContextProvider, vNodeContains, getCurrentVNode, getVNodeAppContext, commitSnapshot, traverseApply, findParent, findParentErrorBoundary, assertValidElementProps, isValidElementKeyProp, isValidElementRefProp, };
7
7
  function cloneVNode(vNode) {
8
8
  const children = vNode.props.children;
9
9
  let clonedChildren;
@@ -22,9 +22,7 @@ function isVNode(thing) {
22
22
  return typeof thing === "object" && thing !== null && "type" in thing;
23
23
  }
24
24
  function isExoticType(type) {
25
- return (type === $FRAGMENT ||
26
- type === $CONTEXT_PROVIDER ||
27
- type === $HYDRATION_BOUNDARY);
25
+ return (type === $FRAGMENT || type === $CONTEXT_PROVIDER || type === $ERROR_BOUNDARY);
28
26
  }
29
27
  function isFragment(vNode) {
30
28
  return vNode.type === $FRAGMENT;
@@ -97,6 +95,9 @@ function findParent(vNode, predicate) {
97
95
  }
98
96
  return null;
99
97
  }
98
+ function findParentErrorBoundary(vNode) {
99
+ return findParent(vNode, (n) => n.type === $ERROR_BOUNDARY);
100
+ }
100
101
  function assertValidElementProps(vNode) {
101
102
  if ("children" in vNode.props && vNode.props.innerHTML) {
102
103
  throw new KiruError({
@@ -1 +1 @@
1
- {"version":3,"file":"vdom.js","sourceRoot":"","sources":["../../src/utils/vdom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vdom.js","sourceRoot":"","sources":["../../src/utils/vdom.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kiru",
3
- "version": "0.49.2",
3
+ "version": "0.50.0-preview.1",
4
4
  "description": "A batteries-included, easy-to-use rendering library with a tiny footprint",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -14,10 +14,6 @@
14
14
  "types": "./dist/form/index.d.ts",
15
15
  "default": "./dist/form/index.js"
16
16
  },
17
- "./router": {
18
- "types": "./dist/components/router/index.d.ts",
19
- "default": "./dist/components/router/index.js"
20
- },
21
17
  "./swr": {
22
18
  "types": "./dist/swr.d.ts",
23
19
  "default": "./dist/swr.js"
@@ -26,9 +22,9 @@
26
22
  "types": "./dist/utils/index.d.ts",
27
23
  "default": "./dist/utils/index.js"
28
24
  },
29
- "./ssr": {
30
- "types": "./dist/ssr/index.d.ts",
31
- "default": "./dist/ssr/index.js"
25
+ "./router": {
26
+ "types": "./dist/router/index.d.ts",
27
+ "default": "./dist/router/index.js"
32
28
  },
33
29
  "./ssr/client": {
34
30
  "types": "./dist/ssr/client.d.ts",
@@ -0,0 +1,16 @@
1
+ import { $ERROR_BOUNDARY } from "../constants.js"
2
+ import { createElement } from "../index.js"
3
+
4
+ export interface ErrorBoundaryProps {
5
+ children?: JSX.Children
6
+ fallback?: JSX.Element | ((error: Error) => JSX.Element)
7
+ onError?: (error: Error) => void
8
+ }
9
+
10
+ export function ErrorBoundary({
11
+ children,
12
+ fallback,
13
+ onError,
14
+ }: ErrorBoundaryProps) {
15
+ return createElement($ERROR_BOUNDARY, { children, fallback, onError })
16
+ }
@@ -1,4 +1,6 @@
1
+ export { ErrorBoundary, type ErrorBoundaryProps } from "./errorBoundary.js"
1
2
  export * from "./lazy.js"
2
3
  export { memo } from "./memo.js"
3
4
  export * from "./portal.js"
5
+ export * from "./suspense.js"
4
6
  export * from "./transition.js"
@@ -1,18 +1,7 @@
1
1
  import { createElement } from "../element.js"
2
2
  import { __DEV__ } from "../env.js"
3
- import { KiruError } from "../error.js"
4
- import { node, renderMode } from "../globals.js"
5
- import { useContext } from "../hooks/useContext.js"
6
- import { useRef } from "../hooks/useRef.js"
3
+ import { renderMode } from "../globals.js"
7
4
  import { useRequestUpdate } from "../hooks/utils.js"
8
- import { hydrationStack } from "../hydration.js"
9
- import { flushSync, nextIdle } from "../scheduler.js"
10
- import {
11
- HYDRATION_BOUNDARY_MARKER,
12
- HydrationBoundaryContext,
13
- } from "../ssr/hydrationBoundary.js"
14
- import { noop } from "../utils/index.js"
15
- import type { SomeDom } from "../types.utils"
16
5
 
17
6
  interface FCModule {
18
7
  default: Kiru.FC<any>
@@ -25,7 +14,6 @@ type InferLazyImportProps<T extends LazyImportValue> = T extends FCModule
25
14
  : Kiru.InferProps<T>
26
15
 
27
16
  interface LazyState {
28
- fn: string
29
17
  promise: Promise<LazyImportValue>
30
18
  result: Kiru.FC | null
31
19
  }
@@ -40,191 +28,46 @@ const lazyCache: Map<string, LazyState> =
40
28
  (window.__KIRU_LAZY_CACHE ??= new Map<string, LazyState>())
41
29
  : new Map<string, LazyState>()
42
30
 
43
- function consumeHydrationBoundaryChildren(parentNode: Kiru.VNode): {
44
- parent: HTMLElement
45
- childNodes: Node[]
46
- startIndex: number
47
- } {
48
- const boundaryStart = hydrationStack.currentChild()
49
- if (
50
- boundaryStart?.nodeType !== Node.COMMENT_NODE ||
51
- boundaryStart.nodeValue !== HYDRATION_BOUNDARY_MARKER
52
- ) {
53
- throw new KiruError({
54
- message: "Invalid HydrationBoundary node. This is likely a bug in Kiru.",
55
- fatal: true,
56
- vNode: parentNode,
57
- })
58
- }
59
- const parent = boundaryStart.parentElement!
60
- const childNodes: Node[] = []
61
- const isBoundaryEnd = (n: Node) => {
62
- return (
63
- n.nodeType === Node.COMMENT_NODE &&
64
- n.nodeValue === "/" + HYDRATION_BOUNDARY_MARKER
65
- )
66
- }
67
- let n = boundaryStart.nextSibling
68
- boundaryStart.remove()
69
- const startIndex =
70
- hydrationStack.childIdxStack[hydrationStack.childIdxStack.length - 1]
71
- while (n && !isBoundaryEnd(n)) {
72
- childNodes.push(n)
73
- hydrationStack.bumpChildIndex()
74
- n = n.nextSibling
75
- }
76
- const boundaryEnd = hydrationStack.currentChild()
77
- if (!isBoundaryEnd(boundaryEnd)) {
78
- throw new KiruError({
79
- message: "Invalid HydrationBoundary node. This is likely a bug in Kiru.",
80
- fatal: true,
81
- vNode: parentNode,
82
- })
83
- }
84
- boundaryEnd.remove()
85
- return { parent, childNodes, startIndex }
86
- }
87
-
88
31
  export function lazy<T extends LazyImportValue>(
89
32
  componentPromiseFn: () => Promise<T>
90
33
  ): Kiru.FC<LazyComponentProps<T>> {
91
34
  function LazyComponent(props: LazyComponentProps<T>) {
92
35
  const { fallback = null, ...rest } = props
93
- const hydrationCtx = useContext(HydrationBoundaryContext, false)
94
- const needsHydration = useRef(
95
- hydrationCtx && renderMode.current === "hydrate"
96
- )
97
- const abortHydration = useRef(noop)
98
36
  const requestUpdate = useRequestUpdate()
99
37
  if (renderMode.current === "string" || renderMode.current === "stream") {
100
38
  return fallback
101
39
  }
102
40
 
103
- const fn = componentPromiseFn.toString()
104
- const withoutQuery = removeQueryString(fn)
105
- const cachedState = lazyCache.get(withoutQuery)
106
- if (!cachedState || cachedState.fn !== fn) {
41
+ const fn = removeQueryString(componentPromiseFn.toString())
42
+ const cachedState = lazyCache.get(fn)
43
+
44
+ if (!cachedState) {
107
45
  const promise = componentPromiseFn()
108
46
  const state: LazyState = {
109
- fn,
110
47
  promise,
111
48
  result: null,
112
49
  }
113
- lazyCache.set(withoutQuery, state)
114
-
115
- const ready = promise.then((componentOrModule) => {
50
+ lazyCache.set(fn, state)
51
+ promise.then((componentOrModule) => {
116
52
  state.result =
117
53
  typeof componentOrModule === "function"
118
54
  ? componentOrModule
119
55
  : componentOrModule.default
56
+ requestUpdate()
120
57
  })
121
-
122
- if (!needsHydration.current) {
123
- ready.then(() => requestUpdate())
124
- return fallback
125
- }
126
-
127
- const thisNode = node.current!
128
-
129
- abortHydration.current = () => {
130
- for (const child of childNodes) {
131
- if (child instanceof Element) {
132
- hydrationStack.resetEvents(child)
133
- }
134
- child.parentNode?.removeChild(child)
135
- }
136
- needsHydration.current = false
137
- delete thisNode.lastChildDom
138
- }
139
-
140
- if (__DEV__) {
141
- window.__kiru?.HMRContext?.onHmr(() => {
142
- if (needsHydration.current) {
143
- abortHydration.current()
144
- }
145
- })
146
- }
147
-
148
- const { parent, childNodes, startIndex } =
149
- consumeHydrationBoundaryChildren(thisNode)
150
-
151
- thisNode.lastChildDom = childNodes[childNodes.length - 1] as SomeDom
152
-
153
- for (const child of childNodes) {
154
- if (child instanceof Element) {
155
- hydrationStack.captureEvents(child)
156
- }
157
- }
158
- const hydrate = () => {
159
- if (needsHydration.current === false) return
160
-
161
- nextIdle(() => {
162
- delete thisNode.lastChildDom
163
- needsHydration.current = false
164
- hydrationStack.push(parent)
165
- hydrationStack.childIdxStack[
166
- hydrationStack.childIdxStack.length - 1
167
- ] = startIndex
168
- const prev = renderMode.current
169
- /**
170
- * must call requestUpdate before setting renderMode
171
- * to hydrate, otherwise the update will be postponed
172
- * and flushSync will have no effect
173
- */
174
- requestUpdate()
175
- renderMode.current = "hydrate"
176
- flushSync()
177
- renderMode.current = prev
178
- for (const child of childNodes) {
179
- if (child instanceof Element) {
180
- hydrationStack.releaseEvents(child)
181
- }
182
- }
183
- })
184
- }
185
-
186
- /**
187
- * once the promise resolves, we need to act according
188
- * to the HydrationBoundaryContext 'mode'.
189
- *
190
- * - with 'eager', we just hydrate the children immediately
191
- * - with 'lazy', we'll wait for user interaction before hydrating
192
- */
193
-
194
- if (hydrationCtx.mode === "eager") {
195
- ready.then(hydrate)
196
- return null
197
- }
198
- const interactionEvents = hydrationCtx.events
199
- const onInteraction = (e: Event) => {
200
- const tgt = e.target
201
- if (
202
- tgt instanceof Element &&
203
- childNodes.some((child) => child.contains(tgt))
204
- ) {
205
- interactionEvents.forEach((evtName) => {
206
- window.removeEventListener(evtName, onInteraction)
207
- })
208
- ready.then(hydrate)
209
- }
210
- }
211
- interactionEvents.forEach((evtName) => {
212
- window.addEventListener(evtName, onInteraction)
213
- })
214
-
215
- return null
58
+ return fallback
216
59
  }
217
60
 
218
61
  if (cachedState.result === null) {
219
62
  cachedState.promise.then(requestUpdate)
220
63
  return fallback
221
64
  }
222
- if (needsHydration.current) {
223
- abortHydration.current()
65
+ if (__DEV__) {
66
+ return createElement(cachedState.result, rest)
224
67
  }
225
68
  return createElement(cachedState.result, rest)
226
69
  }
227
- LazyComponent.displayName = "Kiru.lazy"
70
+ LazyComponent.displayName = "Kaioken.lazy"
228
71
  return LazyComponent
229
72
  }
230
73
 
@@ -0,0 +1,191 @@
1
+ import { requestUpdate } from "../scheduler.js"
2
+ import { renderMode } from "../globals.js"
3
+ import {
4
+ cleanupHook,
5
+ depsRequireChange,
6
+ useHook,
7
+ useId,
8
+ } from "../hooks/index.js"
9
+ import { __DEV__ } from "../env.js"
10
+ import { getCurrentVNode } from "../utils/index.js"
11
+ import { $SUSPENSE_THROW, PREFETCHED_DATA_EVENT } from "../constants.js"
12
+ import { Signal, useSignal } from "../signals/index.js"
13
+
14
+ export type { SuspenseProps, UsePromiseCallbackContext, UsePromiseState }
15
+ export { Suspense, isSuspenseThrowValue, usePromise }
16
+
17
+ type StatefulPromiseValues<T extends readonly Kiru.StatefulPromise<unknown>[]> =
18
+ {
19
+ [I in keyof T]: T[I] extends Kiru.StatefulPromise<infer V> ? V : never
20
+ }
21
+
22
+ type SuspenseChildrenArgs<
23
+ T extends Kiru.StatefulPromise<any> | Kiru.StatefulPromise<any>[]
24
+ > = T extends Kiru.StatefulPromise<any>[]
25
+ ? StatefulPromiseValues<T>
26
+ : [T extends Kiru.StatefulPromise<infer V> ? V : never]
27
+
28
+ interface SuspenseProps<
29
+ T extends Kiru.StatefulPromise<any> | Kiru.StatefulPromise<any>[]
30
+ > {
31
+ data: T
32
+ children: (...data: SuspenseChildrenArgs<T>) => JSX.Element
33
+ fallback?: JSX.Element
34
+ }
35
+
36
+ function Suspense<
37
+ const T extends
38
+ | Kiru.StatefulPromise<unknown>
39
+ | Kiru.StatefulPromise<unknown>[]
40
+ >({ data, children, fallback }: SuspenseProps<T>) {
41
+ const promiseArray: Kiru.StatefulPromise<unknown>[] = Array.isArray(data)
42
+ ? data
43
+ : [data]
44
+
45
+ switch (renderMode.current) {
46
+ case "stream":
47
+ case "string":
48
+ throw {
49
+ [$SUSPENSE_THROW]: { fallback, pending: promiseArray },
50
+ } satisfies SuspenseThrowValue
51
+
52
+ case "dom":
53
+ case "hydrate":
54
+ for (const p of promiseArray) {
55
+ if (p.state === "rejected") throw p.error
56
+ if (p.state === "pending") {
57
+ const n = getCurrentVNode()!
58
+ Promise.allSettled(promiseArray).then(() => requestUpdate(n))
59
+ return fallback
60
+ }
61
+ }
62
+ const values = promiseArray.map((p) => p.value) as SuspenseChildrenArgs<T>
63
+
64
+ return children(...values)
65
+ }
66
+ }
67
+
68
+ interface SuspenseThrowValue {
69
+ [$SUSPENSE_THROW]: {
70
+ fallback?: JSX.Element
71
+ pending: Kiru.StatefulPromise<unknown>[]
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Returns true if the value was thrown by a Suspense component.
77
+ */
78
+ function isSuspenseThrowValue(value: unknown): value is SuspenseThrowValue {
79
+ return typeof value === "object" && !!value && $SUSPENSE_THROW in value
80
+ }
81
+
82
+ interface PromiseResolveEventDetail<T> {
83
+ id: string
84
+ data?: T
85
+ error?: string
86
+ }
87
+
88
+ function resolveHydrationPromise<T>(
89
+ id: string,
90
+ signal: AbortSignal
91
+ ): Promise<T> {
92
+ return new Promise<T>((resolve, reject) => {
93
+ const prefetchCache: Map<string, { data?: T; error?: string }> = // @ts-ignore
94
+ (window[PREFETCHED_DATA_EVENT] ??= new Map())
95
+
96
+ const existing = prefetchCache.get(id)
97
+ if (existing) {
98
+ const { data, error } = existing
99
+ prefetchCache.delete(id)
100
+ if (error) return reject(error)
101
+ return resolve(data!)
102
+ }
103
+
104
+ const onDataEvent = (event: Event) => {
105
+ const { detail } = event as CustomEvent<PromiseResolveEventDetail<T>>
106
+ if (detail.id === id) {
107
+ prefetchCache.delete(id)
108
+ window.removeEventListener(PREFETCHED_DATA_EVENT, onDataEvent)
109
+ const { data, error } = detail
110
+ if (error) return reject(error)
111
+ resolve(data!)
112
+ }
113
+ }
114
+
115
+ window.addEventListener(PREFETCHED_DATA_EVENT, onDataEvent)
116
+ signal.addEventListener("abort", () => {
117
+ window.removeEventListener(PREFETCHED_DATA_EVENT, onDataEvent)
118
+ reject()
119
+ })
120
+ })
121
+ }
122
+
123
+ const nodeToPromiseIndex = new WeakMap<Kiru.VNode, number>()
124
+
125
+ interface UsePromiseCallbackContext {
126
+ signal: AbortSignal
127
+ }
128
+
129
+ interface UsePromiseState<T> {
130
+ data: Kiru.StatefulPromise<T>
131
+ refresh: () => void
132
+ pending: Signal<boolean>
133
+ }
134
+
135
+ function usePromise<T>(
136
+ callback: (ctx: UsePromiseCallbackContext) => Promise<T>,
137
+ deps: unknown[]
138
+ ): UsePromiseState<T> {
139
+ const id = useId()
140
+ const pending = useSignal(true)
141
+
142
+ return useHook(
143
+ "usePromise",
144
+ {} as {
145
+ promise: Kiru.StatefulPromise<T>
146
+ abortController?: AbortController
147
+ deps?: unknown[]
148
+ },
149
+ ({ hook, isInit, vNode }) => {
150
+ if (isInit || depsRequireChange(deps, hook.deps)) {
151
+ pending.value = true
152
+ hook.deps = deps
153
+ cleanupHook(hook)
154
+
155
+ const controller = (hook.abortController = new AbortController())
156
+ hook.cleanup = () => controller.abort()
157
+
158
+ const index = nodeToPromiseIndex.get(vNode) ?? 0
159
+ nodeToPromiseIndex.set(vNode, index + 1)
160
+
161
+ const promiseId = `${id}:data:${index}`
162
+ const state: Kiru.PromiseState<T> = { id: promiseId, state: "pending" }
163
+ const promise =
164
+ renderMode.current === "hydrate"
165
+ ? resolveHydrationPromise<T>(promiseId, controller.signal)
166
+ : callback({ signal: controller.signal })
167
+
168
+ const p = (hook.promise = Object.assign(promise, state))
169
+ p.then((value) => {
170
+ p.state = "fulfilled"
171
+ p.value = value
172
+ })
173
+ .catch((error) => {
174
+ p.state = "rejected"
175
+ p.error = error instanceof Error ? error : new Error(error)
176
+ })
177
+ .finally(() => {
178
+ pending.value = false
179
+ })
180
+ }
181
+ return {
182
+ data: hook.promise,
183
+ refresh: () => {
184
+ hook.deps = undefined
185
+ requestUpdate(vNode)
186
+ },
187
+ pending,
188
+ }
189
+ }
190
+ )
191
+ }
package/src/constants.ts CHANGED
@@ -6,8 +6,10 @@ export {
6
6
  $KIRU_ERROR,
7
7
  $HMR_ACCEPT,
8
8
  $MEMO,
9
- $HYDRATION_BOUNDARY,
9
+ $ERROR_BOUNDARY,
10
+ $SUSPENSE_THROW,
10
11
  CONSECUTIVE_DIRTY_LIMIT,
12
+ PREFETCHED_DATA_EVENT,
11
13
  EVENT_PREFIX_REGEX,
12
14
  FLAG_UPDATE,
13
15
  FLAG_PLACEMENT,
@@ -27,9 +29,11 @@ const $FRAGMENT = Symbol.for("kiru.fragment")
27
29
  const $KIRU_ERROR = Symbol.for("kiru.error")
28
30
  const $HMR_ACCEPT = Symbol.for("kiru.hmrAccept")
29
31
  const $MEMO = Symbol.for("kiru.memo")
30
- const $HYDRATION_BOUNDARY = Symbol.for("kiru.hydrationBoundary")
32
+ const $ERROR_BOUNDARY = Symbol.for("kiru.errorBoundary")
33
+ const $SUSPENSE_THROW = Symbol.for("kiru.suspenseThrow")
31
34
 
32
35
  const CONSECUTIVE_DIRTY_LIMIT = 50
36
+ const PREFETCHED_DATA_EVENT = "kiru:prefetched"
33
37
 
34
38
  const FLAG_UPDATE = 1 << 1
35
39
  const FLAG_PLACEMENT = 1 << 2
package/src/hmr.ts CHANGED
@@ -51,6 +51,7 @@ type HotVarRegistrationEntry = {
51
51
  export function createHMRContext() {
52
52
  type FilePath = string
53
53
  const moduleMap = new Map<FilePath, ModuleMemory>()
54
+ let currentModuleFilePath: string | null = null
54
55
  let currentModuleMemory: ModuleMemory | null = null
55
56
  let isModuleReplacementExecution = false
56
57
  const isReplacement = () => isModuleReplacementExecution
@@ -75,6 +76,7 @@ export function createHMRContext() {
75
76
  while (onHmrCallbacks.length) onHmrCallbacks.shift()!()
76
77
  }
77
78
  currentModuleMemory = mod!
79
+ currentModuleFilePath = filePath
78
80
  }
79
81
 
80
82
  const register = (
@@ -150,6 +152,9 @@ export function createHMRContext() {
150
152
  currentModuleMemory.unnamedWatchers.length = tmpUnnamedWatchers.length
151
153
  tmpUnnamedWatchers.length = 0
152
154
  }
155
+
156
+ currentModuleMemory = null
157
+ currentModuleFilePath = null
153
158
  }
154
159
 
155
160
  const signals = {
@@ -171,5 +176,8 @@ export function createHMRContext() {
171
176
  isReplacement,
172
177
  signals,
173
178
  onHmr,
179
+ getCurrentFilePath() {
180
+ return currentModuleFilePath
181
+ },
174
182
  }
175
183
  }
package/src/index.ts CHANGED
@@ -8,6 +8,7 @@ export * from "./appContext.js"
8
8
  export * from "./context.js"
9
9
  export * from "./customEvents.js"
10
10
  export * from "./element.js"
11
+ export * from "./error.js"
11
12
  export * from "./hooks/index.js"
12
13
  export * from "./components/index.js"
13
14
  export * from "./renderToString.js"