kiru 1.2.1 → 1.3.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.
- package/dist/components/derive.d.ts +7 -6
- package/dist/components/derive.d.ts.map +1 -1
- package/dist/components/derive.js +9 -10
- package/dist/components/derive.js.map +1 -1
- package/dist/components/errorBoundary.d.ts +1 -1
- package/dist/components/errorBoundary.d.ts.map +1 -1
- package/dist/components/errorBoundary.js.map +1 -1
- package/dist/components/transition.d.ts +1 -2
- package/dist/components/transition.d.ts.map +1 -1
- package/dist/components/transition.js +26 -15
- package/dist/components/transition.js.map +1 -1
- package/dist/error.d.ts +0 -2
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +11 -14
- package/dist/error.js.map +1 -1
- package/dist/headlessRender.d.ts +2 -2
- package/dist/headlessRender.d.ts.map +1 -1
- package/dist/headlessRender.js +2 -3
- package/dist/headlessRender.js.map +1 -1
- package/dist/hmr.d.ts +1 -0
- package/dist/hmr.d.ts.map +1 -1
- package/dist/hmr.js +6 -2
- package/dist/hmr.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/renderToString.js +1 -1
- package/dist/renderToString.js.map +1 -1
- package/dist/resource.d.ts +19 -0
- package/dist/resource.d.ts.map +1 -0
- package/dist/resource.js +167 -0
- package/dist/resource.js.map +1 -0
- package/dist/scheduler.js +13 -8
- package/dist/scheduler.js.map +1 -1
- package/dist/signals/base.d.ts +3 -5
- package/dist/signals/base.d.ts.map +1 -1
- package/dist/signals/base.js +12 -54
- package/dist/signals/base.js.map +1 -1
- package/dist/signals/computed.d.ts.map +1 -1
- package/dist/signals/computed.js +5 -11
- package/dist/signals/computed.js.map +1 -1
- package/dist/signals/globals.d.ts +0 -2
- package/dist/signals/globals.d.ts.map +1 -1
- package/dist/signals/globals.js +0 -1
- package/dist/signals/globals.js.map +1 -1
- package/dist/signals/types.d.ts +1 -4
- package/dist/signals/types.d.ts.map +1 -1
- package/dist/ssr/server.d.ts +4 -4
- package/dist/ssr/server.d.ts.map +1 -1
- package/dist/ssr/server.js +11 -7
- package/dist/ssr/server.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/stream.d.ts +12 -0
- package/dist/utils/stream.d.ts.map +1 -0
- package/dist/utils/stream.js +8 -0
- package/dist/utils/stream.js.map +1 -0
- package/package.json +1 -13
- package/src/components/derive.ts +29 -36
- package/src/components/errorBoundary.ts +3 -1
- package/src/components/transition.ts +29 -16
- package/src/error.ts +11 -19
- package/src/headlessRender.ts +5 -5
- package/src/hmr.ts +13 -3
- package/src/index.ts +1 -1
- package/src/renderToString.ts +1 -1
- package/src/resource.ts +207 -0
- package/src/scheduler.ts +14 -8
- package/src/signals/base.ts +18 -57
- package/src/signals/computed.ts +4 -8
- package/src/signals/globals.ts +0 -3
- package/src/signals/types.ts +1 -4
- package/src/ssr/server.ts +18 -11
- package/src/types.ts +6 -6
- package/src/utils/index.ts +2 -1
- package/src/utils/stream.ts +17 -0
- package/dist/statefulPromise.d.ts +0 -22
- package/dist/statefulPromise.d.ts.map +0 -1
- package/dist/statefulPromise.js +0 -94
- package/dist/statefulPromise.js.map +0 -1
- package/src/statefulPromise.ts +0 -136
package/dist/statefulPromise.js
DELETED
|
@@ -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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"}
|
package/src/statefulPromise.ts
DELETED
|
@@ -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
|
-
}
|