kiru 1.2.1 → 1.3.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 (85) hide show
  1. package/dist/components/derive.d.ts +7 -6
  2. package/dist/components/derive.d.ts.map +1 -1
  3. package/dist/components/derive.js +9 -10
  4. package/dist/components/derive.js.map +1 -1
  5. package/dist/components/errorBoundary.d.ts +1 -1
  6. package/dist/components/errorBoundary.d.ts.map +1 -1
  7. package/dist/components/errorBoundary.js.map +1 -1
  8. package/dist/components/transition.d.ts.map +1 -1
  9. package/dist/components/transition.js +14 -11
  10. package/dist/components/transition.js.map +1 -1
  11. package/dist/error.d.ts +0 -2
  12. package/dist/error.d.ts.map +1 -1
  13. package/dist/error.js +11 -14
  14. package/dist/error.js.map +1 -1
  15. package/dist/headlessRender.d.ts +2 -2
  16. package/dist/headlessRender.d.ts.map +1 -1
  17. package/dist/headlessRender.js +2 -3
  18. package/dist/headlessRender.js.map +1 -1
  19. package/dist/hmr.d.ts +1 -0
  20. package/dist/hmr.d.ts.map +1 -1
  21. package/dist/hmr.js +6 -2
  22. package/dist/hmr.js.map +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/renderToString.js +1 -1
  28. package/dist/renderToString.js.map +1 -1
  29. package/dist/resource.d.ts +19 -0
  30. package/dist/resource.d.ts.map +1 -0
  31. package/dist/resource.js +167 -0
  32. package/dist/resource.js.map +1 -0
  33. package/dist/scheduler.js +13 -8
  34. package/dist/scheduler.js.map +1 -1
  35. package/dist/signals/base.d.ts +3 -5
  36. package/dist/signals/base.d.ts.map +1 -1
  37. package/dist/signals/base.js +12 -54
  38. package/dist/signals/base.js.map +1 -1
  39. package/dist/signals/computed.d.ts.map +1 -1
  40. package/dist/signals/computed.js +5 -11
  41. package/dist/signals/computed.js.map +1 -1
  42. package/dist/signals/globals.d.ts +0 -2
  43. package/dist/signals/globals.d.ts.map +1 -1
  44. package/dist/signals/globals.js +0 -1
  45. package/dist/signals/globals.js.map +1 -1
  46. package/dist/signals/types.d.ts +1 -1
  47. package/dist/signals/types.d.ts.map +1 -1
  48. package/dist/ssr/server.d.ts +4 -4
  49. package/dist/ssr/server.d.ts.map +1 -1
  50. package/dist/ssr/server.js +11 -7
  51. package/dist/ssr/server.js.map +1 -1
  52. package/dist/types.d.ts +1 -1
  53. package/dist/types.d.ts.map +1 -1
  54. package/dist/utils/index.d.ts +2 -1
  55. package/dist/utils/index.d.ts.map +1 -1
  56. package/dist/utils/index.js +2 -1
  57. package/dist/utils/index.js.map +1 -1
  58. package/dist/utils/stream.d.ts +12 -0
  59. package/dist/utils/stream.d.ts.map +1 -0
  60. package/dist/utils/stream.js +8 -0
  61. package/dist/utils/stream.js.map +1 -0
  62. package/package.json +1 -13
  63. package/src/components/derive.ts +29 -36
  64. package/src/components/errorBoundary.ts +3 -1
  65. package/src/components/transition.ts +15 -10
  66. package/src/error.ts +11 -19
  67. package/src/headlessRender.ts +5 -5
  68. package/src/hmr.ts +13 -3
  69. package/src/index.ts +1 -1
  70. package/src/renderToString.ts +1 -1
  71. package/src/resource.ts +207 -0
  72. package/src/scheduler.ts +14 -8
  73. package/src/signals/base.ts +18 -57
  74. package/src/signals/computed.ts +4 -8
  75. package/src/signals/globals.ts +0 -3
  76. package/src/signals/types.ts +1 -1
  77. package/src/ssr/server.ts +18 -11
  78. package/src/types.ts +4 -4
  79. package/src/utils/index.ts +2 -1
  80. package/src/utils/stream.ts +17 -0
  81. package/dist/statefulPromise.d.ts +0 -22
  82. package/dist/statefulPromise.d.ts.map +0 -1
  83. package/dist/statefulPromise.js +0 -94
  84. package/dist/statefulPromise.js.map +0 -1
  85. package/src/statefulPromise.ts +0 -136
@@ -1,94 +0,0 @@
1
- import { $STREAM_DATA, STREAMED_DATA_EVENT } from "./constants.js";
2
- import { hydrationMode, node, renderMode } from "./globals.js";
3
- import { signal } from "./signals/base.js";
4
- import { createVNodeId } from "./utils/vdom.js";
5
- import { onCleanup } from "./hooks/onCleanup.js";
6
- /**
7
- * Returns true if the value is a {@link StreamDataThrowValue}
8
- */
9
- export function isStreamDataThrowValue(value) {
10
- return typeof value === "object" && !!value && $STREAM_DATA in value;
11
- }
12
- /**
13
- * Returns true if the value is a {@link Kiru.StatefulPromiseBase}
14
- */
15
- export function isStatefulPromise(thing) {
16
- return thing instanceof Promise && "id" in thing && "state" in thing;
17
- }
18
- const nodeToPromiseIndex = new WeakMap();
19
- export function statefulPromise(callback) {
20
- const vNode = node.current;
21
- if (!vNode) {
22
- throw new Error("statefulPromise must be called inside a Kiru component");
23
- }
24
- const id = createVNodeId(vNode);
25
- const isPending = signal(true);
26
- isPending.value = true;
27
- const controller = new AbortController();
28
- onCleanup(() => controller.abort());
29
- const index = nodeToPromiseIndex.get(vNode) ?? 0;
30
- nodeToPromiseIndex.set(vNode, index + 1);
31
- const promiseId = `${id}:data:${index}`;
32
- let promise;
33
- if (renderMode.current === "string") {
34
- // if we're rendering to a string, there's no need to fire the callback
35
- promise = Promise.resolve();
36
- }
37
- else if (renderMode.current === "hydrate" &&
38
- hydrationMode.current === "dynamic") {
39
- // if we're hydrating and the hydration mode is not static,
40
- // we need to resolve the promise from cache/event
41
- promise = resolveDeferredPromise(promiseId, controller.signal);
42
- }
43
- else {
44
- // dom / stream / (hydrate + static)
45
- promise = callback(controller.signal);
46
- }
47
- const state = {
48
- id: promiseId,
49
- state: "pending",
50
- };
51
- const statefulPromise = Object.assign(promise, state);
52
- statefulPromise
53
- .then((value) => {
54
- statefulPromise.state = "fulfilled";
55
- statefulPromise.value = value;
56
- isPending.value = false;
57
- })
58
- .catch((error) => {
59
- statefulPromise.state = "rejected";
60
- statefulPromise.error = error instanceof Error ? error : new Error(error);
61
- });
62
- return Object.assign(statefulPromise, { isPending });
63
- }
64
- function resolveDeferredPromise(id, signal) {
65
- return new Promise((resolve, reject) => {
66
- const deferralCache = // @ts-ignore
67
- (window[STREAMED_DATA_EVENT] ?? (window[STREAMED_DATA_EVENT] = new Map()));
68
- const existing = deferralCache.get(id);
69
- if (existing) {
70
- const { data, error } = existing;
71
- deferralCache.delete(id);
72
- if (error)
73
- return reject(error);
74
- return resolve(data);
75
- }
76
- const onDataEvent = (event) => {
77
- const { detail } = event;
78
- if (detail.id === id) {
79
- deferralCache.delete(id);
80
- window.removeEventListener(STREAMED_DATA_EVENT, onDataEvent);
81
- const { data, error } = detail;
82
- if (error)
83
- return reject(error);
84
- resolve(data);
85
- }
86
- };
87
- window.addEventListener(STREAMED_DATA_EVENT, onDataEvent);
88
- signal.addEventListener("abort", () => {
89
- window.removeEventListener(STREAMED_DATA_EVENT, onDataEvent);
90
- reject();
91
- });
92
- });
93
- }
94
- //# sourceMappingURL=statefulPromise.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"statefulPromise.js","sourceRoot":"","sources":["../src/statefulPromise.ts"],"names":[],"mappings":"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"}
@@ -1,136 +0,0 @@
1
- import { $STREAM_DATA, STREAMED_DATA_EVENT } from "./constants.js"
2
- import { hydrationMode, node, renderMode } from "./globals.js"
3
- import { Signal, signal } from "./signals/base.js"
4
- import { createVNodeId } from "./utils/vdom.js"
5
- import { onCleanup } from "./hooks/onCleanup.js"
6
-
7
- export interface StreamDataThrowValue {
8
- [$STREAM_DATA]: {
9
- fallback?: JSX.Element
10
- data: Kiru.StatefulPromiseBase<unknown>[]
11
- }
12
- }
13
-
14
- /**
15
- * Returns true if the value is a {@link StreamDataThrowValue}
16
- */
17
- export function isStreamDataThrowValue(
18
- value: unknown
19
- ): value is StreamDataThrowValue {
20
- return typeof value === "object" && !!value && $STREAM_DATA in value
21
- }
22
-
23
- /**
24
- * Returns true if the value is a {@link Kiru.StatefulPromiseBase}
25
- */
26
- export function isStatefulPromise(
27
- thing: unknown
28
- ): thing is Kiru.StatefulPromiseBase<unknown> {
29
- return thing instanceof Promise && "id" in thing && "state" in thing
30
- }
31
-
32
- const nodeToPromiseIndex = new WeakMap<Kiru.VNode, number>()
33
-
34
- type StatefulPromise<T> = Kiru.StatefulPromiseBase<T> & {
35
- isPending: Signal<boolean>
36
- }
37
-
38
- export function statefulPromise<T>(
39
- callback: (signal: AbortSignal) => Promise<T>
40
- ): StatefulPromise<T> {
41
- const vNode = node.current!
42
- if (!vNode) {
43
- throw new Error("statefulPromise must be called inside a Kiru component")
44
- }
45
- const id = createVNodeId(vNode)
46
- const isPending = signal(true)
47
-
48
- isPending.value = true
49
-
50
- const controller = new AbortController()
51
- onCleanup(() => controller.abort())
52
-
53
- const index = nodeToPromiseIndex.get(vNode) ?? 0
54
- nodeToPromiseIndex.set(vNode, index + 1)
55
-
56
- const promiseId = `${id}:data:${index}`
57
-
58
- let promise: Promise<T>
59
- if (renderMode.current === "string") {
60
- // if we're rendering to a string, there's no need to fire the callback
61
- promise = Promise.resolve() as Promise<T>
62
- } else if (
63
- renderMode.current === "hydrate" &&
64
- hydrationMode.current === "dynamic"
65
- ) {
66
- // if we're hydrating and the hydration mode is not static,
67
- // we need to resolve the promise from cache/event
68
- promise = resolveDeferredPromise<T>(promiseId, controller.signal)
69
- } else {
70
- // dom / stream / (hydrate + static)
71
- promise = callback(controller.signal)
72
- }
73
-
74
- const state: Kiru.PromiseState<T> = {
75
- id: promiseId,
76
- state: "pending",
77
- }
78
- const statefulPromise: Kiru.StatefulPromiseBase<T> = Object.assign(
79
- promise,
80
- state
81
- )
82
-
83
- statefulPromise
84
- .then((value) => {
85
- statefulPromise.state = "fulfilled"
86
- statefulPromise.value = value
87
- isPending.value = false
88
- })
89
- .catch((error) => {
90
- statefulPromise.state = "rejected"
91
- statefulPromise.error = error instanceof Error ? error : new Error(error)
92
- })
93
-
94
- return Object.assign(statefulPromise, { isPending })
95
- }
96
-
97
- interface DeferredPromiseEventDetail<T> {
98
- id: string
99
- data?: T
100
- error?: string
101
- }
102
-
103
- function resolveDeferredPromise<T>(
104
- id: string,
105
- signal: AbortSignal
106
- ): Promise<T> {
107
- return new Promise<T>((resolve, reject) => {
108
- const deferralCache: Map<string, { data?: T; error?: string }> = // @ts-ignore
109
- (window[STREAMED_DATA_EVENT] ??= new Map())
110
-
111
- const existing = deferralCache.get(id)
112
- if (existing) {
113
- const { data, error } = existing
114
- deferralCache.delete(id)
115
- if (error) return reject(error)
116
- return resolve(data!)
117
- }
118
-
119
- const onDataEvent = (event: Event) => {
120
- const { detail } = event as CustomEvent<DeferredPromiseEventDetail<T>>
121
- if (detail.id === id) {
122
- deferralCache.delete(id)
123
- window.removeEventListener(STREAMED_DATA_EVENT, onDataEvent)
124
- const { data, error } = detail
125
- if (error) return reject(error)
126
- resolve(data!)
127
- }
128
- }
129
-
130
- window.addEventListener(STREAMED_DATA_EVENT, onDataEvent)
131
- signal.addEventListener("abort", () => {
132
- window.removeEventListener(STREAMED_DATA_EVENT, onDataEvent)
133
- reject()
134
- })
135
- })
136
- }