kiru 0.52.3 → 0.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/appContext.d.ts.map +1 -1
  2. package/dist/appContext.js +14 -11
  3. package/dist/appContext.js.map +1 -1
  4. package/dist/components/derive.d.ts +20 -0
  5. package/dist/components/derive.d.ts.map +1 -0
  6. package/dist/components/derive.js +57 -0
  7. package/dist/components/derive.js.map +1 -0
  8. package/dist/components/errorBoundary.d.ts +1 -1
  9. package/dist/components/errorBoundary.d.ts.map +1 -1
  10. package/dist/components/index.d.ts +1 -1
  11. package/dist/components/index.d.ts.map +1 -1
  12. package/dist/components/index.js +1 -1
  13. package/dist/components/index.js.map +1 -1
  14. package/dist/components/memo.d.ts +6 -3
  15. package/dist/components/memo.d.ts.map +1 -1
  16. package/dist/components/memo.js.map +1 -1
  17. package/dist/constants.d.ts +3 -3
  18. package/dist/constants.d.ts.map +1 -1
  19. package/dist/constants.js +3 -3
  20. package/dist/constants.js.map +1 -1
  21. package/dist/dom.d.ts.map +1 -1
  22. package/dist/dom.js +69 -66
  23. package/dist/dom.js.map +1 -1
  24. package/dist/element.d.ts +2 -2
  25. package/dist/element.d.ts.map +1 -1
  26. package/dist/element.js +20 -32
  27. package/dist/element.js.map +1 -1
  28. package/dist/globalContext.d.ts +6 -1
  29. package/dist/globalContext.d.ts.map +1 -1
  30. package/dist/globalContext.js +14 -2
  31. package/dist/globalContext.js.map +1 -1
  32. package/dist/hooks/usePromise.d.ts +4 -9
  33. package/dist/hooks/usePromise.d.ts.map +1 -1
  34. package/dist/hooks/usePromise.js +25 -28
  35. package/dist/hooks/usePromise.js.map +1 -1
  36. package/dist/hooks/useRef.d.ts +2 -2
  37. package/dist/hooks/useRef.d.ts.map +1 -1
  38. package/dist/jsx.d.ts +1 -1
  39. package/dist/jsx.d.ts.map +1 -1
  40. package/dist/reconciler.d.ts +1 -1
  41. package/dist/reconciler.d.ts.map +1 -1
  42. package/dist/reconciler.js +57 -117
  43. package/dist/reconciler.js.map +1 -1
  44. package/dist/recursiveRender.d.ts +4 -3
  45. package/dist/recursiveRender.d.ts.map +1 -1
  46. package/dist/recursiveRender.js +20 -19
  47. package/dist/recursiveRender.js.map +1 -1
  48. package/dist/renderToString.js +2 -2
  49. package/dist/renderToString.js.map +1 -1
  50. package/dist/router/fileRouterController.d.ts +1 -1
  51. package/dist/router/fileRouterController.d.ts.map +1 -1
  52. package/dist/router/fileRouterController.js +11 -9
  53. package/dist/router/fileRouterController.js.map +1 -1
  54. package/dist/router/index.d.ts +1 -1
  55. package/dist/router/index.d.ts.map +1 -1
  56. package/dist/router/scrollStack.d.ts +0 -1
  57. package/dist/router/scrollStack.d.ts.map +1 -1
  58. package/dist/router/scrollStack.js +0 -3
  59. package/dist/router/scrollStack.js.map +1 -1
  60. package/dist/router/utils/index.d.ts +1 -1
  61. package/dist/router/utils/index.d.ts.map +1 -1
  62. package/dist/signals/base.d.ts +1 -3
  63. package/dist/signals/base.d.ts.map +1 -1
  64. package/dist/signals/base.js +3 -3
  65. package/dist/signals/base.js.map +1 -1
  66. package/dist/signals/computed.d.ts +4 -2
  67. package/dist/signals/computed.d.ts.map +1 -1
  68. package/dist/signals/computed.js +29 -6
  69. package/dist/signals/computed.js.map +1 -1
  70. package/dist/signals/for.d.ts +10 -0
  71. package/dist/signals/for.d.ts.map +1 -0
  72. package/dist/signals/for.js +7 -0
  73. package/dist/signals/for.js.map +1 -0
  74. package/dist/signals/index.d.ts +1 -1
  75. package/dist/signals/index.js +1 -1
  76. package/dist/signals/types.d.ts +1 -1
  77. package/dist/signals/types.d.ts.map +1 -1
  78. package/dist/ssr/server.js +13 -13
  79. package/dist/ssr/server.js.map +1 -1
  80. package/dist/types.d.ts +10 -11
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/types.dom.d.ts +33 -32
  83. package/dist/types.dom.d.ts.map +1 -1
  84. package/dist/types.utils.d.ts +5 -1
  85. package/dist/types.utils.d.ts.map +1 -1
  86. package/dist/utils/format.d.ts +2 -2
  87. package/dist/utils/format.d.ts.map +1 -1
  88. package/dist/utils/format.js +4 -3
  89. package/dist/utils/format.js.map +1 -1
  90. package/dist/utils/index.d.ts +0 -1
  91. package/dist/utils/index.d.ts.map +1 -1
  92. package/dist/utils/index.js +0 -1
  93. package/dist/utils/index.js.map +1 -1
  94. package/dist/utils/promise.d.ts +16 -0
  95. package/dist/utils/promise.d.ts.map +1 -0
  96. package/dist/utils/promise.js +14 -0
  97. package/dist/utils/promise.js.map +1 -0
  98. package/dist/utils/runtime.d.ts +10 -1
  99. package/dist/utils/runtime.d.ts.map +1 -1
  100. package/dist/utils/runtime.js +25 -1
  101. package/dist/utils/runtime.js.map +1 -1
  102. package/dist/utils/vdom.d.ts +4 -4
  103. package/dist/utils/vdom.d.ts.map +1 -1
  104. package/dist/utils/vdom.js +18 -17
  105. package/dist/utils/vdom.js.map +1 -1
  106. package/dist/vNode.d.ts +4 -0
  107. package/dist/vNode.d.ts.map +1 -0
  108. package/dist/vNode.js +22 -0
  109. package/dist/vNode.js.map +1 -0
  110. package/package.json +1 -1
  111. package/src/appContext.ts +15 -13
  112. package/src/components/derive.ts +121 -0
  113. package/src/components/index.ts +1 -1
  114. package/src/components/memo.ts +3 -2
  115. package/src/constants.ts +4 -4
  116. package/src/dom.ts +71 -66
  117. package/src/element.ts +22 -35
  118. package/src/globalContext.ts +24 -3
  119. package/src/hooks/usePromise.ts +32 -41
  120. package/src/hooks/useRef.ts +2 -2
  121. package/src/reconciler.ts +87 -125
  122. package/src/recursiveRender.ts +25 -23
  123. package/src/renderToString.ts +3 -3
  124. package/src/router/fileRouterController.ts +19 -9
  125. package/src/router/scrollStack.ts +23 -26
  126. package/src/signals/base.ts +3 -3
  127. package/src/signals/computed.ts +43 -6
  128. package/src/signals/for.ts +25 -0
  129. package/src/signals/index.ts +1 -1
  130. package/src/signals/types.ts +5 -1
  131. package/src/ssr/server.ts +15 -15
  132. package/src/types.dom.ts +40 -40
  133. package/src/types.ts +11 -11
  134. package/src/types.utils.ts +11 -1
  135. package/src/utils/format.ts +7 -4
  136. package/src/utils/index.ts +0 -2
  137. package/src/utils/promise.ts +26 -0
  138. package/src/utils/runtime.ts +29 -1
  139. package/src/utils/vdom.ts +20 -23
  140. package/src/vNode.ts +30 -0
  141. package/dist/components/suspense.d.ts +0 -24
  142. package/dist/components/suspense.d.ts.map +0 -1
  143. package/dist/components/suspense.js +0 -36
  144. package/dist/components/suspense.js.map +0 -1
  145. package/dist/signals/jsx.d.ts +0 -17
  146. package/dist/signals/jsx.d.ts.map +0 -1
  147. package/dist/signals/jsx.js +0 -11
  148. package/dist/signals/jsx.js.map +0 -1
  149. package/src/components/suspense.ts +0 -72
  150. package/src/signals/jsx.ts +0 -46
package/src/vNode.ts ADDED
@@ -0,0 +1,30 @@
1
+ import { $FRAGMENT } from "./constants.js"
2
+ import { Fragment } from "./element.js"
3
+
4
+ type VNode = Kiru.VNode
5
+
6
+ export function createVNode(
7
+ type: VNode["type"],
8
+ parent: VNode | null = null,
9
+ props: VNode["props"] = {},
10
+ key: VNode["key"] = null,
11
+ index = 0
12
+ ): VNode {
13
+ if ((type as any) === Fragment) {
14
+ type = $FRAGMENT
15
+ }
16
+ const depth = parent ? parent.depth + 1 : 0
17
+ return {
18
+ type,
19
+ key,
20
+ props,
21
+ parent,
22
+ index,
23
+ depth,
24
+ flags: 0,
25
+ child: null,
26
+ sibling: null,
27
+ prev: null,
28
+ deletions: null,
29
+ }
30
+ }
@@ -1,24 +0,0 @@
1
- import { $SUSPENSE_THROW } from "../constants.js";
2
- export { Suspense, isSuspenseThrowValue };
3
- export type { SuspenseProps };
4
- type StatefulPromiseValues<T extends readonly Kiru.StatefulPromise<unknown>[]> = {
5
- [I in keyof T]: T[I] extends Kiru.StatefulPromise<infer V> ? V : never;
6
- };
7
- type SuspenseChildrenArgs<T extends Kiru.StatefulPromise<any> | Kiru.StatefulPromise<any>[]> = T extends Kiru.StatefulPromise<any>[] ? StatefulPromiseValues<T> : [T extends Kiru.StatefulPromise<infer V> ? V : never];
8
- interface SuspenseProps<T extends Kiru.StatefulPromise<any> | Kiru.StatefulPromise<any>[]> {
9
- data: T;
10
- children: (...data: SuspenseChildrenArgs<T>) => JSX.Element;
11
- fallback?: JSX.Element;
12
- }
13
- declare function Suspense<const T extends Kiru.StatefulPromise<unknown> | Kiru.StatefulPromise<unknown>[]>({ data, children, fallback }: SuspenseProps<T>): JSX.Element;
14
- interface SuspenseThrowValue {
15
- [$SUSPENSE_THROW]: {
16
- fallback?: JSX.Element;
17
- pending: Kiru.StatefulPromise<unknown>[];
18
- };
19
- }
20
- /**
21
- * Returns true if the value was thrown by a Suspense component.
22
- */
23
- declare function isSuspenseThrowValue(value: unknown): value is SuspenseThrowValue;
24
- //# sourceMappingURL=suspense.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"suspense.d.ts","sourceRoot":"","sources":["../../src/components/suspense.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAKjD,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAA;AACzC,YAAY,EAAE,aAAa,EAAE,CAAA;AAE7B,KAAK,qBAAqB,CAAC,CAAC,SAAS,SAAS,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,IAC3E;KACG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CACvE,CAAA;AAEH,KAAK,oBAAoB,CACvB,CAAC,SAAS,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAC/D,CAAC,SAAS,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,GACrC,qBAAqB,CAAC,CAAC,CAAC,GACxB,CAAC,CAAC,SAAS,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;AAEzD,UAAU,aAAa,CACrB,CAAC,SAAS,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE;IAEjE,IAAI,EAAE,CAAC,CAAA;IACP,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,CAAA;IAC3D,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB;AAED,iBAAS,QAAQ,CACf,KAAK,CAAC,CAAC,SACH,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAC7B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,EACnC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,eA0B/C;AAED,UAAU,kBAAkB;IAC1B,CAAC,eAAe,CAAC,EAAE;QACjB,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;QACtB,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAA;KACzC,CAAA;CACF;AAED;;GAEG;AACH,iBAAS,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEzE"}
@@ -1,36 +0,0 @@
1
- import { $SUSPENSE_THROW } from "../constants.js";
2
- import { renderMode, node } from "../globals.js";
3
- import { requestUpdate } from "../scheduler.js";
4
- export { Suspense, isSuspenseThrowValue };
5
- function Suspense({ data, children, fallback }) {
6
- const promiseArray = Array.isArray(data)
7
- ? data
8
- : [data];
9
- switch (renderMode.current) {
10
- case "stream":
11
- case "string":
12
- throw {
13
- [$SUSPENSE_THROW]: { fallback, pending: promiseArray },
14
- };
15
- case "dom":
16
- case "hydrate":
17
- for (const p of promiseArray) {
18
- if (p.state === "rejected")
19
- throw p.error;
20
- if (p.state === "pending") {
21
- const n = node.current;
22
- Promise.allSettled(promiseArray).then(() => requestUpdate(n));
23
- return fallback;
24
- }
25
- }
26
- const values = promiseArray.map((p) => p.value);
27
- return children(...values);
28
- }
29
- }
30
- /**
31
- * Returns true if the value was thrown by a Suspense component.
32
- */
33
- function isSuspenseThrowValue(value) {
34
- return typeof value === "object" && !!value && $SUSPENSE_THROW in value;
35
- }
36
- //# sourceMappingURL=suspense.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"suspense.js","sourceRoot":"","sources":["../../src/components/suspense.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAA;AAsBzC,SAAS,QAAQ,CAIf,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAoB;IAC9C,MAAM,YAAY,GAAoC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACvE,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAEV,QAAQ,UAAU,CAAC,OAAO,EAAE,CAAC;QAC3B,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACX,MAAM;gBACJ,CAAC,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;aAC1B,CAAA;QAEhC,KAAK,KAAK,CAAC;QACX,KAAK,SAAS;YACZ,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;gBAC7B,IAAI,CAAC,CAAC,KAAK,KAAK,UAAU;oBAAE,MAAM,CAAC,CAAC,KAAK,CAAA;gBACzC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAQ,CAAA;oBACvB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;oBAC7D,OAAO,QAAQ,CAAA;gBACjB,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAA4B,CAAA;YAE1E,OAAO,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAA;IAC9B,CAAC;AACH,CAAC;AASD;;GAEG;AACH,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,eAAe,IAAI,KAAK,CAAA;AACzE,CAAC"}
@@ -1,17 +0,0 @@
1
- import type { Signal } from "./base.js";
2
- import type { SignalValues } from "./types.js";
3
- type InferArraySignalItemType<T extends Signal<any[]>> = T extends Signal<infer V> ? V extends Array<infer W> ? W : never : never;
4
- type ForProps<T extends Signal<any[]>, U = InferArraySignalItemType<T>> = {
5
- each: T;
6
- fallback?: JSX.Element;
7
- children: (value: U, index: number, array: U[]) => JSX.Element;
8
- };
9
- export declare function For<T extends Signal<any[]>>({ each, fallback, children, }: ForProps<T>): JSX.Element;
10
- type DeriveChildrenArgs<T extends Signal<any> | Signal<any>[]> = T extends Signal<any>[] ? SignalValues<T> : [T extends Signal<infer V> ? V : never];
11
- export type DeriveProps<T extends Signal<any> | Signal<any>[]> = {
12
- from: T;
13
- children: (...values: DeriveChildrenArgs<T>) => JSX.Children;
14
- };
15
- export declare function Derive<const T extends Signal<any> | Signal<any>[]>({ from, children, }: DeriveProps<T>): JSX.Children;
16
- export {};
17
- //# sourceMappingURL=jsx.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsx.d.ts","sourceRoot":"","sources":["../../src/signals/jsx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,KAAK,wBAAwB,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,MAAM,CACvE,MAAM,CAAC,CACR,GACG,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACtB,CAAC,GACD,KAAK,GACP,KAAK,CAAA;AAET,KAAK,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,IAAI;IACxE,IAAI,EAAE,CAAC,CAAA;IACP,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,OAAO,CAAA;CAC/D,CAAA;AAED,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,EAC3C,IAAI,EACJ,QAAQ,EACR,QAAQ,GACT,EAAE,QAAQ,CAAC,CAAC,CAAC,eAIb;AAED,KAAK,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,IAC3D,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,EAAE,GACnB,YAAY,CAAC,CAAC,CAAC,GACf,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;AAE7C,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI;IAC/D,IAAI,EAAE,CAAC,CAAA;IACP,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAA;CAC7D,CAAA;AAED,wBAAgB,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAClE,IAAI,EACJ,QAAQ,GACT,EAAE,WAAW,CAAC,CAAC,CAAC,gBAKhB"}
@@ -1,11 +0,0 @@
1
- export function For({ each, fallback, children, }) {
2
- const items = each.value;
3
- if (items.length === 0)
4
- return fallback;
5
- return items.map(children);
6
- }
7
- export function Derive({ from, children, }) {
8
- const args = (Array.isArray(from) ? from : [from]).map((s) => s.value);
9
- return children(...args);
10
- }
11
- //# sourceMappingURL=jsx.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsx.js","sourceRoot":"","sources":["../../src/signals/jsx.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,GAAG,CAA0B,EAC3C,IAAI,EACJ,QAAQ,EACR,QAAQ,GACI;IACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IACxB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAA;IACvC,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AAC5B,CAAC;AAYD,MAAM,UAAU,MAAM,CAA8C,EAClE,IAAI,EACJ,QAAQ,GACO;IACf,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CACpD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CACU,CAAA;IAC1B,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAA;AAC1B,CAAC"}
@@ -1,72 +0,0 @@
1
- import { $SUSPENSE_THROW } from "../constants.js"
2
- import { __DEV__ } from "../env.js"
3
- import { renderMode, node } from "../globals.js"
4
- import { requestUpdate } from "../scheduler.js"
5
-
6
- export { Suspense, isSuspenseThrowValue }
7
- export type { SuspenseProps }
8
-
9
- type StatefulPromiseValues<T extends readonly Kiru.StatefulPromise<unknown>[]> =
10
- {
11
- [I in keyof T]: T[I] extends Kiru.StatefulPromise<infer V> ? V : never
12
- }
13
-
14
- type SuspenseChildrenArgs<
15
- T extends Kiru.StatefulPromise<any> | Kiru.StatefulPromise<any>[]
16
- > = T extends Kiru.StatefulPromise<any>[]
17
- ? StatefulPromiseValues<T>
18
- : [T extends Kiru.StatefulPromise<infer V> ? V : never]
19
-
20
- interface SuspenseProps<
21
- T extends Kiru.StatefulPromise<any> | Kiru.StatefulPromise<any>[]
22
- > {
23
- data: T
24
- children: (...data: SuspenseChildrenArgs<T>) => JSX.Element
25
- fallback?: JSX.Element
26
- }
27
-
28
- function Suspense<
29
- const T extends
30
- | Kiru.StatefulPromise<unknown>
31
- | Kiru.StatefulPromise<unknown>[]
32
- >({ data, children, fallback }: SuspenseProps<T>) {
33
- const promiseArray: Kiru.StatefulPromise<unknown>[] = Array.isArray(data)
34
- ? data
35
- : [data]
36
-
37
- switch (renderMode.current) {
38
- case "stream":
39
- case "string":
40
- throw {
41
- [$SUSPENSE_THROW]: { fallback, pending: promiseArray },
42
- } satisfies SuspenseThrowValue
43
-
44
- case "dom":
45
- case "hydrate":
46
- for (const p of promiseArray) {
47
- if (p.state === "rejected") throw p.error
48
- if (p.state === "pending") {
49
- const n = node.current!
50
- Promise.allSettled(promiseArray).then(() => requestUpdate(n))
51
- return fallback
52
- }
53
- }
54
- const values = promiseArray.map((p) => p.value) as SuspenseChildrenArgs<T>
55
-
56
- return children(...values)
57
- }
58
- }
59
-
60
- interface SuspenseThrowValue {
61
- [$SUSPENSE_THROW]: {
62
- fallback?: JSX.Element
63
- pending: Kiru.StatefulPromise<unknown>[]
64
- }
65
- }
66
-
67
- /**
68
- * Returns true if the value was thrown by a Suspense component.
69
- */
70
- function isSuspenseThrowValue(value: unknown): value is SuspenseThrowValue {
71
- return typeof value === "object" && !!value && $SUSPENSE_THROW in value
72
- }
@@ -1,46 +0,0 @@
1
- import type { Signal } from "./base.js"
2
- import type { SignalValues } from "./types.js"
3
-
4
- type InferArraySignalItemType<T extends Signal<any[]>> = T extends Signal<
5
- infer V
6
- >
7
- ? V extends Array<infer W>
8
- ? W
9
- : never
10
- : never
11
-
12
- type ForProps<T extends Signal<any[]>, U = InferArraySignalItemType<T>> = {
13
- each: T
14
- fallback?: JSX.Element
15
- children: (value: U, index: number, array: U[]) => JSX.Element
16
- }
17
-
18
- export function For<T extends Signal<any[]>>({
19
- each,
20
- fallback,
21
- children,
22
- }: ForProps<T>) {
23
- const items = each.value
24
- if (items.length === 0) return fallback
25
- return items.map(children)
26
- }
27
-
28
- type DeriveChildrenArgs<T extends Signal<any> | Signal<any>[]> =
29
- T extends Signal<any>[]
30
- ? SignalValues<T>
31
- : [T extends Signal<infer V> ? V : never]
32
-
33
- export type DeriveProps<T extends Signal<any> | Signal<any>[]> = {
34
- from: T
35
- children: (...values: DeriveChildrenArgs<T>) => JSX.Children
36
- }
37
-
38
- export function Derive<const T extends Signal<any> | Signal<any>[]>({
39
- from,
40
- children,
41
- }: DeriveProps<T>) {
42
- const args = (Array.isArray(from) ? from : [from]).map(
43
- (s) => s.value
44
- ) as DeriveChildrenArgs<T>
45
- return children(...args)
46
- }