kiru 0.54.3 → 1.0.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/{appContext.d.ts → appHandle.d.ts} +4 -4
- package/dist/appHandle.d.ts.map +1 -0
- package/dist/{appContext.js → appHandle.js} +12 -9
- package/dist/appHandle.js.map +1 -0
- package/dist/components/derive.d.ts +10 -8
- package/dist/components/derive.d.ts.map +1 -1
- package/dist/components/derive.js +50 -47
- package/dist/components/derive.js.map +1 -1
- package/dist/components/index.d.ts +0 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +0 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/lazy.d.ts.map +1 -1
- package/dist/components/lazy.js +5 -4
- package/dist/components/lazy.js.map +1 -1
- package/dist/components/portal.d.ts.map +1 -1
- package/dist/components/portal.js +2 -3
- package/dist/components/portal.js.map +1 -1
- package/dist/components/transition.d.ts +3 -2
- package/dist/components/transition.d.ts.map +1 -1
- package/dist/components/transition.js +29 -26
- package/dist/components/transition.js.map +1 -1
- package/dist/constants.d.ts +1 -5
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +1 -5
- package/dist/constants.js.map +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +25 -19
- package/dist/context.js.map +1 -1
- package/dist/devtools.d.ts +7 -0
- package/dist/devtools.d.ts.map +1 -0
- package/dist/devtools.js +15 -0
- package/dist/devtools.js.map +1 -0
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +25 -58
- package/dist/dom.js.map +1 -1
- package/dist/globalContext.d.ts +15 -16
- package/dist/globalContext.d.ts.map +1 -1
- package/dist/globalContext.js +36 -46
- package/dist/globalContext.js.map +1 -1
- package/dist/globals.d.ts +1 -4
- package/dist/globals.d.ts.map +1 -1
- package/dist/globals.js +1 -4
- package/dist/globals.js.map +1 -1
- package/dist/headlessRender.d.ts +6 -0
- package/dist/headlessRender.d.ts.map +1 -0
- package/dist/{recursiveRender.js → headlessRender.js} +17 -16
- package/dist/headlessRender.js.map +1 -0
- package/dist/hmr.d.ts +5 -7
- package/dist/hmr.d.ts.map +1 -1
- package/dist/hmr.js +27 -32
- package/dist/hmr.js.map +1 -1
- package/dist/hooks/index.d.ts +3 -14
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -14
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/onBeforeMount.d.ts +9 -0
- package/dist/hooks/onBeforeMount.d.ts.map +1 -0
- package/dist/hooks/onBeforeMount.js +12 -0
- package/dist/hooks/onBeforeMount.js.map +1 -0
- package/dist/hooks/onCleanup.d.ts +8 -0
- package/dist/hooks/onCleanup.d.ts.map +1 -0
- package/dist/hooks/onCleanup.js +15 -0
- package/dist/hooks/onCleanup.js.map +1 -0
- package/dist/hooks/onMount.d.ts +9 -0
- package/dist/hooks/onMount.d.ts.map +1 -0
- package/dist/hooks/onMount.js +12 -0
- package/dist/hooks/onMount.js.map +1 -0
- package/dist/hooks/utils.d.ts +2 -62
- package/dist/hooks/utils.d.ts.map +1 -1
- package/dist/hooks/utils.js +22 -144
- package/dist/hooks/utils.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/profiling.d.ts +15 -14
- package/dist/profiling.d.ts.map +1 -1
- package/dist/profiling.js +9 -4
- package/dist/profiling.js.map +1 -1
- package/dist/reconciler.d.ts.map +1 -1
- package/dist/reconciler.js +12 -25
- package/dist/reconciler.js.map +1 -1
- package/dist/ref.d.ts +4 -0
- package/dist/ref.d.ts.map +1 -0
- package/dist/ref.js +4 -0
- package/dist/ref.js.map +1 -0
- package/dist/renderToString.js +1 -1
- package/dist/renderToString.js.map +1 -1
- package/dist/router/context.d.ts.map +1 -1
- package/dist/router/context.js +1 -2
- package/dist/router/context.js.map +1 -1
- package/dist/router/fileRouter.d.ts +1 -1
- package/dist/router/fileRouter.d.ts.map +1 -1
- package/dist/router/fileRouter.js +17 -11
- package/dist/router/fileRouter.js.map +1 -1
- package/dist/router/fileRouterController.d.ts.map +1 -1
- package/dist/router/fileRouterController.js +68 -55
- package/dist/router/fileRouterController.js.map +1 -1
- package/dist/router/link.d.ts.map +1 -1
- package/dist/router/link.js +19 -23
- package/dist/router/link.js.map +1 -1
- package/dist/router/server/index.d.ts.map +1 -1
- package/dist/router/server/index.js +14 -11
- package/dist/router/server/index.js.map +1 -1
- package/dist/router/types.d.ts +11 -6
- package/dist/router/types.d.ts.map +1 -1
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +65 -52
- package/dist/scheduler.js.map +1 -1
- package/dist/signals/base.d.ts +0 -1
- package/dist/signals/base.d.ts.map +1 -1
- package/dist/signals/base.js +13 -36
- package/dist/signals/base.js.map +1 -1
- package/dist/signals/computed.d.ts +0 -2
- package/dist/signals/computed.d.ts.map +1 -1
- package/dist/signals/computed.js +1 -40
- package/dist/signals/computed.js.map +1 -1
- package/dist/signals/effect.d.ts +15 -14
- package/dist/signals/effect.d.ts.map +1 -1
- package/dist/signals/effect.js +65 -37
- package/dist/signals/effect.js.map +1 -1
- package/dist/signals/globals.d.ts +0 -5
- package/dist/signals/globals.d.ts.map +1 -1
- package/dist/signals/globals.js +0 -6
- package/dist/signals/globals.js.map +1 -1
- package/dist/signals/index.d.ts +4 -4
- package/dist/signals/index.d.ts.map +1 -1
- package/dist/signals/index.js +4 -4
- package/dist/signals/index.js.map +1 -1
- package/dist/signals/{for.d.ts → jsx.d.ts} +8 -1
- package/dist/signals/jsx.d.ts.map +1 -0
- package/dist/signals/{for.js → jsx.js} +4 -1
- package/dist/signals/jsx.js.map +1 -0
- package/dist/signals/tracking.d.ts +23 -0
- package/dist/signals/tracking.d.ts.map +1 -0
- package/dist/signals/tracking.js +51 -0
- package/dist/signals/tracking.js.map +1 -0
- package/dist/signals/types.d.ts +1 -1
- package/dist/signals/types.d.ts.map +1 -1
- package/dist/signals/utils.d.ts +2 -1
- package/dist/signals/utils.d.ts.map +1 -1
- package/dist/signals/utils.js +9 -2
- package/dist/signals/utils.js.map +1 -1
- package/dist/ssr/client.d.ts +3 -3
- package/dist/ssr/client.d.ts.map +1 -1
- package/dist/ssr/client.js.map +1 -1
- package/dist/ssr/server.js +1 -1
- package/dist/ssr/server.js.map +1 -1
- package/dist/statefulPromise.d.ts +22 -0
- package/dist/statefulPromise.d.ts.map +1 -0
- package/dist/statefulPromise.js +94 -0
- package/dist/statefulPromise.js.map +1 -0
- package/dist/types.d.ts +36 -50
- package/dist/types.d.ts.map +1 -1
- package/dist/types.dom.d.ts +4 -7
- package/dist/types.dom.d.ts.map +1 -1
- package/dist/types.utils.d.ts +3 -4
- package/dist/types.utils.d.ts.map +1 -1
- package/dist/utils/vdom.d.ts +8 -6
- package/dist/utils/vdom.d.ts.map +1 -1
- package/dist/utils/vdom.js +32 -9
- package/dist/utils/vdom.js.map +1 -1
- package/dist/viewTransitions.d.ts +7 -0
- package/dist/viewTransitions.d.ts.map +1 -0
- package/dist/viewTransitions.js +71 -0
- package/dist/viewTransitions.js.map +1 -0
- package/package.json +1 -1
- package/src/{appContext.ts → appHandle.ts} +21 -16
- package/src/components/derive.ts +74 -69
- package/src/components/index.ts +0 -1
- package/src/components/lazy.ts +5 -4
- package/src/components/portal.ts +2 -3
- package/src/components/transition.ts +33 -35
- package/src/constants.ts +0 -8
- package/src/context.ts +30 -23
- package/src/devtools.ts +16 -0
- package/src/dom.ts +29 -63
- package/src/globalContext.ts +57 -74
- package/src/globals.ts +1 -5
- package/src/{recursiveRender.ts → headlessRender.ts} +18 -18
- package/src/hmr.ts +29 -38
- package/src/hooks/index.ts +3 -14
- package/src/hooks/onBeforeMount.ts +12 -0
- package/src/hooks/onCleanup.ts +15 -0
- package/src/hooks/onMount.ts +12 -0
- package/src/hooks/utils.ts +28 -238
- package/src/index.ts +14 -6
- package/src/profiling.ts +22 -20
- package/src/reconciler.ts +18 -30
- package/src/ref.ts +6 -0
- package/src/renderToString.ts +1 -1
- package/src/router/context.ts +1 -2
- package/src/router/fileRouter.ts +23 -13
- package/src/router/fileRouterController.ts +72 -64
- package/src/router/link.ts +11 -25
- package/src/router/server/index.ts +24 -13
- package/src/router/types.ts +15 -8
- package/src/scheduler.ts +74 -71
- package/src/signals/base.ts +12 -41
- package/src/signals/computed.ts +1 -62
- package/src/signals/effect.ts +95 -48
- package/src/signals/globals.ts +0 -7
- package/src/signals/index.ts +4 -4
- package/src/signals/{for.ts → jsx.ts} +10 -0
- package/src/signals/tracking.ts +69 -0
- package/src/signals/types.ts +1 -1
- package/src/signals/utils.ts +9 -1
- package/src/ssr/client.ts +4 -4
- package/src/ssr/server.ts +2 -2
- package/src/statefulPromise.ts +136 -0
- package/src/types.dom.ts +4 -8
- package/src/types.ts +45 -58
- package/src/types.utils.ts +3 -4
- package/src/utils/vdom.ts +44 -15
- package/src/viewTransitions.ts +88 -0
- package/dist/appContext.d.ts.map +0 -1
- package/dist/appContext.js.map +0 -1
- package/dist/components/memo.d.ts +0 -10
- package/dist/components/memo.d.ts.map +0 -1
- package/dist/components/memo.js +0 -23
- package/dist/components/memo.js.map +0 -1
- package/dist/form/index.d.ts +0 -4
- package/dist/form/index.d.ts.map +0 -1
- package/dist/form/index.js +0 -518
- package/dist/form/index.js.map +0 -1
- package/dist/form/types.d.ts +0 -122
- package/dist/form/types.d.ts.map +0 -1
- package/dist/form/types.js +0 -2
- package/dist/form/types.js.map +0 -1
- package/dist/form/utils.d.ts +0 -3
- package/dist/form/utils.d.ts.map +0 -1
- package/dist/form/utils.js +0 -16
- package/dist/form/utils.js.map +0 -1
- package/dist/hooks/useAsync.d.ts +0 -18
- package/dist/hooks/useAsync.d.ts.map +0 -1
- package/dist/hooks/useAsync.js +0 -96
- package/dist/hooks/useAsync.js.map +0 -1
- package/dist/hooks/useCallback.d.ts +0 -7
- package/dist/hooks/useCallback.d.ts.map +0 -1
- package/dist/hooks/useCallback.js +0 -30
- package/dist/hooks/useCallback.js.map +0 -1
- package/dist/hooks/useContext.d.ts +0 -7
- package/dist/hooks/useContext.d.ts.map +0 -1
- package/dist/hooks/useContext.js +0 -59
- package/dist/hooks/useContext.js.map +0 -1
- package/dist/hooks/useEffect.d.ts +0 -8
- package/dist/hooks/useEffect.d.ts.map +0 -1
- package/dist/hooks/useEffect.js +0 -34
- package/dist/hooks/useEffect.js.map +0 -1
- package/dist/hooks/useEffectEvent.d.ts +0 -8
- package/dist/hooks/useEffectEvent.d.ts.map +0 -1
- package/dist/hooks/useEffectEvent.js +0 -23
- package/dist/hooks/useEffectEvent.js.map +0 -1
- package/dist/hooks/useId.d.ts +0 -8
- package/dist/hooks/useId.d.ts.map +0 -1
- package/dist/hooks/useId.js +0 -35
- package/dist/hooks/useId.js.map +0 -1
- package/dist/hooks/useLayoutEffect.d.ts +0 -8
- package/dist/hooks/useLayoutEffect.d.ts.map +0 -1
- package/dist/hooks/useLayoutEffect.js +0 -34
- package/dist/hooks/useLayoutEffect.js.map +0 -1
- package/dist/hooks/useMemo.d.ts +0 -8
- package/dist/hooks/useMemo.d.ts.map +0 -1
- package/dist/hooks/useMemo.js +0 -31
- package/dist/hooks/useMemo.js.map +0 -1
- package/dist/hooks/usePromise.d.ts +0 -8
- package/dist/hooks/usePromise.d.ts.map +0 -1
- package/dist/hooks/usePromise.js +0 -90
- package/dist/hooks/usePromise.js.map +0 -1
- package/dist/hooks/useReducer.d.ts +0 -7
- package/dist/hooks/useReducer.d.ts.map +0 -1
- package/dist/hooks/useReducer.js +0 -44
- package/dist/hooks/useReducer.js.map +0 -1
- package/dist/hooks/useRef.d.ts +0 -10
- package/dist/hooks/useRef.d.ts.map +0 -1
- package/dist/hooks/useRef.js +0 -29
- package/dist/hooks/useRef.js.map +0 -1
- package/dist/hooks/useState.d.ts +0 -7
- package/dist/hooks/useState.d.ts.map +0 -1
- package/dist/hooks/useState.js +0 -54
- package/dist/hooks/useState.js.map +0 -1
- package/dist/hooks/useSyncExternalStore.d.ts +0 -8
- package/dist/hooks/useSyncExternalStore.d.ts.map +0 -1
- package/dist/hooks/useSyncExternalStore.js +0 -50
- package/dist/hooks/useSyncExternalStore.js.map +0 -1
- package/dist/hooks/useViewTransition.d.ts +0 -10
- package/dist/hooks/useViewTransition.d.ts.map +0 -1
- package/dist/hooks/useViewTransition.js +0 -27
- package/dist/hooks/useViewTransition.js.map +0 -1
- package/dist/recursiveRender.d.ts +0 -7
- package/dist/recursiveRender.d.ts.map +0 -1
- package/dist/recursiveRender.js.map +0 -1
- package/dist/signals/for.d.ts.map +0 -1
- package/dist/signals/for.js.map +0 -1
- package/dist/signals/watch.d.ts +0 -21
- package/dist/signals/watch.d.ts.map +0 -1
- package/dist/signals/watch.js +0 -86
- package/dist/signals/watch.js.map +0 -1
- package/dist/store.d.ts +0 -28
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -166
- package/dist/store.js.map +0 -1
- package/dist/swr.d.ts +0 -63
- package/dist/swr.d.ts.map +0 -1
- package/dist/swr.js +0 -236
- package/dist/swr.js.map +0 -1
- package/dist/utils/promise.d.ts +0 -16
- package/dist/utils/promise.d.ts.map +0 -1
- package/dist/utils/promise.js +0 -14
- package/dist/utils/promise.js.map +0 -1
- package/src/components/memo.ts +0 -39
- package/src/form/index.ts +0 -676
- package/src/form/types.ts +0 -262
- package/src/form/utils.ts +0 -19
- package/src/hooks/useAsync.ts +0 -121
- package/src/hooks/useCallback.ts +0 -32
- package/src/hooks/useContext.ts +0 -79
- package/src/hooks/useEffect.ts +0 -40
- package/src/hooks/useEffectEvent.ts +0 -24
- package/src/hooks/useId.ts +0 -42
- package/src/hooks/useLayoutEffect.ts +0 -43
- package/src/hooks/useMemo.ts +0 -34
- package/src/hooks/usePromise.ts +0 -126
- package/src/hooks/useReducer.ts +0 -50
- package/src/hooks/useRef.ts +0 -41
- package/src/hooks/useState.ts +0 -62
- package/src/hooks/useSyncExternalStore.ts +0 -59
- package/src/hooks/useViewTransition.ts +0 -25
- package/src/signals/watch.ts +0 -139
- package/src/store.ts +0 -245
- package/src/swr.ts +0 -351
- package/src/utils/promise.ts +0 -26
package/src/dom.ts
CHANGED
|
@@ -3,9 +3,11 @@ import {
|
|
|
3
3
|
commitSnapshot,
|
|
4
4
|
propFilters,
|
|
5
5
|
propToHtmlAttr,
|
|
6
|
-
|
|
6
|
+
getVNodeApp,
|
|
7
7
|
setRef,
|
|
8
8
|
isValidTextChild,
|
|
9
|
+
registerVNodeCleanup,
|
|
10
|
+
call,
|
|
9
11
|
} from "./utils/index.js"
|
|
10
12
|
import {
|
|
11
13
|
booleanAttributes,
|
|
@@ -13,7 +15,6 @@ import {
|
|
|
13
15
|
FLAG_UPDATE,
|
|
14
16
|
FLAG_STATIC_DOM,
|
|
15
17
|
svgTags,
|
|
16
|
-
FLAG_NOOP,
|
|
17
18
|
EVENT_PREFIX_REGEX,
|
|
18
19
|
} from "./constants.js"
|
|
19
20
|
import { Signal } from "./signals/base.js"
|
|
@@ -30,7 +31,7 @@ import type {
|
|
|
30
31
|
SomeDom,
|
|
31
32
|
SomeElement,
|
|
32
33
|
} from "./types.utils"
|
|
33
|
-
import type {
|
|
34
|
+
import type { AppHandle } from "./appHandle.js"
|
|
34
35
|
|
|
35
36
|
export {
|
|
36
37
|
commitWork,
|
|
@@ -49,6 +50,8 @@ type HostNode = {
|
|
|
49
50
|
|
|
50
51
|
let persistingFocus = false
|
|
51
52
|
let didBlurActiveElement = false
|
|
53
|
+
const postHookCleanups: (() => void)[] = []
|
|
54
|
+
|
|
52
55
|
const placementBlurHandler = (event: Event) => {
|
|
53
56
|
event.preventDefault()
|
|
54
57
|
event.stopPropagation()
|
|
@@ -73,6 +76,10 @@ function onAfterFlushDomChanges() {
|
|
|
73
76
|
didBlurActiveElement = false
|
|
74
77
|
}
|
|
75
78
|
persistingFocus = false
|
|
79
|
+
queueMicrotask(() => {
|
|
80
|
+
postHookCleanups.forEach(call)
|
|
81
|
+
postHookCleanups.length = 0
|
|
82
|
+
})
|
|
76
83
|
}
|
|
77
84
|
|
|
78
85
|
function createDom(vNode: DomVNode): SomeDom {
|
|
@@ -243,15 +250,15 @@ function setSignalProp(
|
|
|
243
250
|
prevValue: unknown
|
|
244
251
|
) {
|
|
245
252
|
const [modifier, attr] = key.split(":")
|
|
246
|
-
const cleanups = (vNode.cleanups ??= {})
|
|
247
253
|
if (modifier !== "bind") {
|
|
248
|
-
|
|
254
|
+
const unsub = signal.subscribe((value, prev) => {
|
|
249
255
|
if (value === prev) return
|
|
250
256
|
setProp(dom, key, value, prev)
|
|
251
257
|
if (__DEV__) {
|
|
252
258
|
emitSignalAttrUpdate(vNode)
|
|
253
259
|
}
|
|
254
260
|
})
|
|
261
|
+
registerVNodeCleanup(vNode, key, unsub)
|
|
255
262
|
} else {
|
|
256
263
|
const evtName = bindAttrToEventMap[attr]
|
|
257
264
|
if (!evtName) {
|
|
@@ -262,7 +269,8 @@ function setSignalProp(
|
|
|
262
269
|
}
|
|
263
270
|
return
|
|
264
271
|
}
|
|
265
|
-
|
|
272
|
+
const cleanup = bindElementProp(vNode, dom, attr, evtName, signal)
|
|
273
|
+
registerVNodeCleanup(vNode, key, cleanup)
|
|
266
274
|
}
|
|
267
275
|
|
|
268
276
|
const value = signal.peek()
|
|
@@ -355,23 +363,21 @@ function createInputValueReader(
|
|
|
355
363
|
}
|
|
356
364
|
|
|
357
365
|
function emitSignalAttrUpdate(vNode: VNode) {
|
|
358
|
-
window.__kiru.profilingContext?.emit(
|
|
359
|
-
"signalAttrUpdate",
|
|
360
|
-
getVNodeAppContext(vNode)!
|
|
361
|
-
)
|
|
366
|
+
window.__kiru.profilingContext?.emit("signalAttrUpdate", getVNodeApp(vNode)!)
|
|
362
367
|
}
|
|
363
368
|
|
|
364
369
|
function subTextNode(vNode: VNode, textNode: Text, signal: Signal<string>) {
|
|
365
|
-
|
|
370
|
+
const cleanup = signal.subscribe((value, prev) => {
|
|
366
371
|
if (value === prev) return
|
|
367
372
|
textNode.nodeValue = value
|
|
368
373
|
if (__DEV__) {
|
|
369
374
|
window.__kiru.profilingContext?.emit(
|
|
370
375
|
"signalTextUpdate",
|
|
371
|
-
|
|
376
|
+
getVNodeApp(vNode)!
|
|
372
377
|
)
|
|
373
378
|
}
|
|
374
379
|
})
|
|
380
|
+
registerVNodeCleanup(vNode, "nodeValue", cleanup)
|
|
375
381
|
}
|
|
376
382
|
|
|
377
383
|
/**
|
|
@@ -684,15 +690,6 @@ function commitWork_impl(
|
|
|
684
690
|
) {
|
|
685
691
|
let child: VNode | null = vNode.child
|
|
686
692
|
while (child) {
|
|
687
|
-
if (child.flags & FLAG_NOOP) {
|
|
688
|
-
if (child.flags & FLAG_PLACEMENT) {
|
|
689
|
-
placeAndCommitNoopChildren(child, currentHostNode)
|
|
690
|
-
}
|
|
691
|
-
commitSnapshot(child)
|
|
692
|
-
child = child.sibling
|
|
693
|
-
continue
|
|
694
|
-
}
|
|
695
|
-
|
|
696
693
|
if (child.dom) {
|
|
697
694
|
commitWork_impl(child, { node: child as ElementVNode }, false)
|
|
698
695
|
if (!(child.flags & FLAG_STATIC_DOM)) {
|
|
@@ -733,25 +730,31 @@ function commitDeletion(vNode: VNode) {
|
|
|
733
730
|
if (vNode === vNode.parent?.child) {
|
|
734
731
|
vNode.parent.child = vNode.sibling
|
|
735
732
|
}
|
|
736
|
-
let
|
|
733
|
+
let app: AppHandle
|
|
737
734
|
if (__DEV__) {
|
|
738
|
-
|
|
735
|
+
app = getVNodeApp(vNode)!
|
|
739
736
|
}
|
|
740
737
|
traverseApply(vNode, (node) => {
|
|
741
738
|
const {
|
|
742
|
-
hooks,
|
|
743
739
|
subs,
|
|
744
740
|
cleanups,
|
|
745
741
|
dom,
|
|
746
742
|
props: { ref },
|
|
743
|
+
hooks,
|
|
747
744
|
} = node
|
|
748
745
|
|
|
749
746
|
subs?.forEach((unsub) => unsub())
|
|
750
747
|
if (cleanups) Object.values(cleanups).forEach((c) => c())
|
|
751
|
-
|
|
748
|
+
if (hooks) {
|
|
749
|
+
const { preCleanups, postCleanups } = hooks
|
|
750
|
+
|
|
751
|
+
preCleanups.forEach(call)
|
|
752
|
+
postHookCleanups.push(...postCleanups)
|
|
753
|
+
preCleanups.length = postCleanups.length = 0
|
|
754
|
+
}
|
|
752
755
|
|
|
753
756
|
if (__DEV__) {
|
|
754
|
-
window.__kiru.profilingContext?.emit("removeNode",
|
|
757
|
+
window.__kiru.profilingContext?.emit("removeNode", app)
|
|
755
758
|
if (dom instanceof Element) {
|
|
756
759
|
delete dom.__kiruNode
|
|
757
760
|
}
|
|
@@ -770,40 +773,3 @@ function commitDeletion(vNode: VNode) {
|
|
|
770
773
|
|
|
771
774
|
vNode.parent = null
|
|
772
775
|
}
|
|
773
|
-
|
|
774
|
-
function placeAndCommitNoopChildren(
|
|
775
|
-
parent: VNode,
|
|
776
|
-
currentHostNode: HostNode
|
|
777
|
-
): void {
|
|
778
|
-
if (!parent.child) return
|
|
779
|
-
|
|
780
|
-
const domChildren: SomeDom[] = []
|
|
781
|
-
collectDomNodes(parent.child, domChildren)
|
|
782
|
-
if (domChildren.length === 0) return
|
|
783
|
-
|
|
784
|
-
const { node, lastChild } = currentHostNode
|
|
785
|
-
if (lastChild) {
|
|
786
|
-
lastChild.after(...domChildren)
|
|
787
|
-
} else {
|
|
788
|
-
const nextSiblingDom = getNextSiblingDom(parent, node)
|
|
789
|
-
const parentDom = node.dom
|
|
790
|
-
if (nextSiblingDom) {
|
|
791
|
-
nextSiblingDom.before(...domChildren)
|
|
792
|
-
} else {
|
|
793
|
-
parentDom.append(...domChildren)
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
currentHostNode.lastChild = domChildren[domChildren.length - 1]
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
function collectDomNodes(firstChild: VNode, children: SomeDom[]): void {
|
|
800
|
-
let child: VNode | null = firstChild
|
|
801
|
-
while (child) {
|
|
802
|
-
if (child.dom) {
|
|
803
|
-
children.push(child.dom)
|
|
804
|
-
} else if (child.child) {
|
|
805
|
-
collectDomNodes(child.child, children)
|
|
806
|
-
}
|
|
807
|
-
child = child.sibling
|
|
808
|
-
}
|
|
809
|
-
}
|
package/src/globalContext.ts
CHANGED
|
@@ -3,57 +3,11 @@ import { createHMRContext } from "./hmr.js"
|
|
|
3
3
|
import { createProfilingContext } from "./profiling.js"
|
|
4
4
|
import { fileRouterInstance } from "./router/globals.js"
|
|
5
5
|
import type { FileRouterController } from "./router/fileRouterController"
|
|
6
|
-
import type {
|
|
7
|
-
import type { Store } from "./store"
|
|
8
|
-
import type { SWRCache } from "./swr"
|
|
6
|
+
import type { AppHandle } from "./appHandle"
|
|
9
7
|
import type { requestUpdate } from "./index.js"
|
|
10
8
|
|
|
11
9
|
export { createKiruGlobalContext, type GlobalKiruEvent, type KiruGlobalContext }
|
|
12
10
|
|
|
13
|
-
interface ReactiveMap<V> {
|
|
14
|
-
add(key: string, value: V): void
|
|
15
|
-
delete(key: string): void
|
|
16
|
-
subscribe(cb: (value: Record<string, V>) => void): () => void
|
|
17
|
-
readonly size: number
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function createReactiveMap<V>(): ReactiveMap<V> {
|
|
21
|
-
const map = new Map<string, V>()
|
|
22
|
-
const listeners = new Set<(value: Record<string, V>) => void>()
|
|
23
|
-
|
|
24
|
-
function add(key: string, value: V): void {
|
|
25
|
-
if (map.has(key)) return
|
|
26
|
-
map.set(key, value)
|
|
27
|
-
notify()
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function deleteKey(key: string): void {
|
|
31
|
-
if (!map.has(key)) return
|
|
32
|
-
map.delete(key)
|
|
33
|
-
notify()
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function notify(): void {
|
|
37
|
-
const val = Object.fromEntries(map)
|
|
38
|
-
listeners.forEach((cb) => cb(val))
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function subscribe(cb: (value: Record<string, V>) => void): () => void {
|
|
42
|
-
listeners.add(cb)
|
|
43
|
-
cb(Object.fromEntries(map))
|
|
44
|
-
return () => listeners.delete(cb)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return {
|
|
48
|
-
add,
|
|
49
|
-
delete: deleteKey,
|
|
50
|
-
subscribe,
|
|
51
|
-
get size() {
|
|
52
|
-
return map.size
|
|
53
|
-
},
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
11
|
type Evt =
|
|
58
12
|
| {
|
|
59
13
|
name: "mount"
|
|
@@ -78,48 +32,53 @@ interface SchedulerInterface {
|
|
|
78
32
|
requestUpdate: (vNode: Kiru.VNode) => void
|
|
79
33
|
}
|
|
80
34
|
|
|
35
|
+
export type DebuggerEntry = {
|
|
36
|
+
label: string
|
|
37
|
+
signal: Kiru.Signal<unknown>
|
|
38
|
+
}
|
|
39
|
+
|
|
81
40
|
interface KiruGlobalContext {
|
|
82
|
-
readonly apps:
|
|
83
|
-
emit<T extends Evt>(event: T["name"],
|
|
41
|
+
readonly apps: AppHandle[]
|
|
42
|
+
emit<T extends Evt>(event: T["name"], app: AppHandle, data?: T["data"]): void
|
|
84
43
|
on<T extends Evt>(
|
|
85
44
|
event: T["name"],
|
|
86
|
-
callback: (
|
|
45
|
+
callback: (app: AppHandle, data: T["data"]) => void
|
|
87
46
|
): void
|
|
88
47
|
off<T extends Evt>(
|
|
89
48
|
event: T["name"],
|
|
90
|
-
callback: (
|
|
49
|
+
callback: (app: AppHandle, data?: T["data"]) => void
|
|
91
50
|
): void
|
|
92
|
-
|
|
51
|
+
devtools?: {
|
|
52
|
+
track: (signal: Kiru.Signal<unknown>, label?: string) => void
|
|
53
|
+
untrack: (signal: Kiru.Signal<unknown>) => void
|
|
54
|
+
subscribe: (callback: (entries: Set<DebuggerEntry>) => void) => () => void
|
|
55
|
+
}
|
|
93
56
|
HMRContext?: ReturnType<typeof createHMRContext>
|
|
94
57
|
profilingContext?: ReturnType<typeof createProfilingContext>
|
|
95
|
-
SWRGlobalCache?: SWRCache
|
|
96
58
|
fileRouterInstance?: {
|
|
97
59
|
current: FileRouterController | null
|
|
98
60
|
}
|
|
99
|
-
getSchedulerInterface?: (app:
|
|
61
|
+
getSchedulerInterface?: (app: AppHandle) => SchedulerInterface | null
|
|
100
62
|
}
|
|
101
63
|
|
|
102
64
|
function createKiruGlobalContext(): KiruGlobalContext {
|
|
103
|
-
const
|
|
104
|
-
const
|
|
105
|
-
AppContext,
|
|
106
|
-
SchedulerInterface
|
|
107
|
-
>()
|
|
65
|
+
const apps = new Set<AppHandle>()
|
|
66
|
+
const appToSchedulerInterface = new WeakMap<AppHandle, SchedulerInterface>()
|
|
108
67
|
const listeners = new Map<
|
|
109
68
|
GlobalKiruEvent,
|
|
110
|
-
Set<(
|
|
69
|
+
Set<(app: AppHandle, data?: Evt["data"]) => void>
|
|
111
70
|
>()
|
|
112
71
|
function emit<T extends Evt>(
|
|
113
72
|
event: T["name"],
|
|
114
|
-
|
|
73
|
+
app: AppHandle,
|
|
115
74
|
data?: T["data"]
|
|
116
75
|
): void {
|
|
117
|
-
listeners.get(event)?.forEach((cb) => cb(
|
|
76
|
+
listeners.get(event)?.forEach((cb) => cb(app, data))
|
|
118
77
|
}
|
|
119
78
|
|
|
120
79
|
function on<T extends Evt>(
|
|
121
80
|
event: T["name"],
|
|
122
|
-
callback: (
|
|
81
|
+
callback: (app: AppHandle, data: T["data"]) => void
|
|
123
82
|
): void {
|
|
124
83
|
if (!listeners.has(event)) {
|
|
125
84
|
listeners.set(event, new Set())
|
|
@@ -129,14 +88,14 @@ function createKiruGlobalContext(): KiruGlobalContext {
|
|
|
129
88
|
|
|
130
89
|
function off<T extends Evt>(
|
|
131
90
|
event: T["name"],
|
|
132
|
-
callback: (ctx:
|
|
91
|
+
callback: (ctx: AppHandle, data?: T["data"]) => void
|
|
133
92
|
): void {
|
|
134
93
|
listeners.get(event)?.delete(callback)
|
|
135
94
|
}
|
|
136
95
|
|
|
137
96
|
const globalContext: KiruGlobalContext = {
|
|
138
97
|
get apps() {
|
|
139
|
-
return Array.from(
|
|
98
|
+
return Array.from(apps)
|
|
140
99
|
},
|
|
141
100
|
emit,
|
|
142
101
|
on,
|
|
@@ -144,24 +103,48 @@ function createKiruGlobalContext(): KiruGlobalContext {
|
|
|
144
103
|
}
|
|
145
104
|
|
|
146
105
|
// Initialize event listeners
|
|
147
|
-
on("mount", (
|
|
148
|
-
|
|
106
|
+
on("mount", (app, requestUpdate) => {
|
|
107
|
+
apps.add(app)
|
|
149
108
|
if (requestUpdate && typeof requestUpdate === "function") {
|
|
150
|
-
|
|
109
|
+
appToSchedulerInterface.set(app, { requestUpdate })
|
|
151
110
|
}
|
|
152
111
|
})
|
|
153
|
-
on("unmount", (
|
|
154
|
-
|
|
155
|
-
|
|
112
|
+
on("unmount", (app) => {
|
|
113
|
+
apps.delete(app)
|
|
114
|
+
appToSchedulerInterface.delete(app)
|
|
156
115
|
})
|
|
157
|
-
|
|
158
116
|
if (__DEV__) {
|
|
159
117
|
globalContext.HMRContext = createHMRContext()
|
|
160
118
|
globalContext.profilingContext = createProfilingContext()
|
|
161
|
-
globalContext.stores = createReactiveMap()
|
|
162
119
|
globalContext.fileRouterInstance = fileRouterInstance
|
|
163
120
|
globalContext.getSchedulerInterface = (app) => {
|
|
164
|
-
return
|
|
121
|
+
return appToSchedulerInterface.get(app) ?? null
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const debuggerEntries = new Set<DebuggerEntry>()
|
|
125
|
+
const subscribers = new Set<(debuggerEntries: Set<DebuggerEntry>) => void>()
|
|
126
|
+
|
|
127
|
+
globalContext.devtools = {
|
|
128
|
+
track: (signal, label) => {
|
|
129
|
+
debuggerEntries.add({
|
|
130
|
+
label: label ?? signal.displayName ?? "Unnamed Signal",
|
|
131
|
+
signal,
|
|
132
|
+
})
|
|
133
|
+
subscribers.forEach((cb) => cb(debuggerEntries))
|
|
134
|
+
},
|
|
135
|
+
untrack: (signal) => {
|
|
136
|
+
debuggerEntries.forEach((entry) => {
|
|
137
|
+
if (entry.signal === signal) {
|
|
138
|
+
debuggerEntries.delete(entry)
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
subscribers.forEach((cb) => cb(debuggerEntries))
|
|
142
|
+
},
|
|
143
|
+
subscribe: (cb) => {
|
|
144
|
+
subscribers.add(cb)
|
|
145
|
+
cb(debuggerEntries)
|
|
146
|
+
return () => subscribers.delete(cb)
|
|
147
|
+
},
|
|
165
148
|
}
|
|
166
149
|
}
|
|
167
150
|
|
package/src/globals.ts
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
export { node,
|
|
1
|
+
export { node, renderMode, hydrationMode }
|
|
2
2
|
|
|
3
3
|
const node = {
|
|
4
4
|
current: null as Kiru.VNode | null,
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
const hookIndex = {
|
|
8
|
-
current: 0,
|
|
9
|
-
}
|
|
10
|
-
|
|
11
7
|
const renderMode = {
|
|
12
8
|
current: ("window" in globalThis ? "dom" : "string") as Kiru.RenderMode,
|
|
13
9
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { node
|
|
1
|
+
import { node } from "./globals.js"
|
|
2
2
|
import {
|
|
3
3
|
isVNode,
|
|
4
4
|
encodeHtmlEntities,
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
isPrimitiveChild,
|
|
9
9
|
isValidTextChild,
|
|
10
10
|
} from "./utils/index.js"
|
|
11
|
-
import { isStreamDataThrowValue } from "./
|
|
11
|
+
import { isStreamDataThrowValue } from "./statefulPromise.js"
|
|
12
12
|
import { Signal } from "./signals/base.js"
|
|
13
13
|
import { $ERROR_BOUNDARY, voidElements, $STREAM_DATA } from "./constants.js"
|
|
14
14
|
import { __DEV__ } from "./env.js"
|
|
@@ -16,12 +16,10 @@ import type { ErrorBoundaryNode } from "./types.utils"
|
|
|
16
16
|
|
|
17
17
|
export interface HeadlessRenderContext {
|
|
18
18
|
write(chunk: string): void
|
|
19
|
-
onStreamData?: (data: Kiru.
|
|
19
|
+
onStreamData?: (data: Kiru.StatefulPromiseBase<unknown>[]) => void
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export
|
|
23
|
-
|
|
24
|
-
function render(
|
|
22
|
+
export function headlessRender(
|
|
25
23
|
ctx: HeadlessRenderContext,
|
|
26
24
|
el: unknown,
|
|
27
25
|
parent: Kiru.VNode | null,
|
|
@@ -37,7 +35,7 @@ function render(
|
|
|
37
35
|
return ctx.write(el.toString())
|
|
38
36
|
}
|
|
39
37
|
if (el instanceof Array) {
|
|
40
|
-
return el.forEach((c, i) =>
|
|
38
|
+
return el.forEach((c, i) => headlessRender(ctx, c, parent, i))
|
|
41
39
|
}
|
|
42
40
|
if (Signal.isSignal(el)) {
|
|
43
41
|
const value = el.peek()
|
|
@@ -68,7 +66,7 @@ function render(
|
|
|
68
66
|
if (isExoticType(type)) {
|
|
69
67
|
if (type === $ERROR_BOUNDARY) {
|
|
70
68
|
let boundaryBuffer = ""
|
|
71
|
-
const streamPromises = new Set<Kiru.
|
|
69
|
+
const streamPromises = new Set<Kiru.StatefulPromiseBase<unknown>>()
|
|
72
70
|
const boundaryCtx: HeadlessRenderContext = {
|
|
73
71
|
write(chunk) {
|
|
74
72
|
boundaryBuffer += chunk
|
|
@@ -78,7 +76,7 @@ function render(
|
|
|
78
76
|
},
|
|
79
77
|
}
|
|
80
78
|
try {
|
|
81
|
-
|
|
79
|
+
headlessRender(boundaryCtx, children, el, idx)
|
|
82
80
|
// flush successful render
|
|
83
81
|
ctx.write(boundaryBuffer)
|
|
84
82
|
ctx.onStreamData?.([...streamPromises])
|
|
@@ -91,27 +89,29 @@ function render(
|
|
|
91
89
|
onError?.(e)
|
|
92
90
|
const fallbackContent =
|
|
93
91
|
typeof fallback === "function" ? fallback(e) : fallback
|
|
94
|
-
|
|
92
|
+
headlessRender(ctx, fallbackContent, el, 0)
|
|
95
93
|
}
|
|
96
94
|
return
|
|
97
95
|
}
|
|
98
96
|
|
|
99
|
-
|
|
97
|
+
headlessRender(ctx, children, el, idx)
|
|
100
98
|
return
|
|
101
99
|
}
|
|
102
100
|
|
|
103
|
-
if (typeof type
|
|
101
|
+
if (typeof type === "function") {
|
|
104
102
|
try {
|
|
105
|
-
hookIndex.current = 0
|
|
106
103
|
node.current = el
|
|
107
|
-
|
|
108
|
-
|
|
104
|
+
let children = type(props)
|
|
105
|
+
if (typeof children === "function") {
|
|
106
|
+
children = children(props)
|
|
107
|
+
}
|
|
108
|
+
headlessRender(ctx, children, el, idx)
|
|
109
109
|
return
|
|
110
110
|
} catch (error) {
|
|
111
111
|
if (isStreamDataThrowValue(error)) {
|
|
112
112
|
const { fallback, data } = error[$STREAM_DATA]
|
|
113
113
|
ctx.onStreamData?.(data)
|
|
114
|
-
return
|
|
114
|
+
return headlessRender(ctx, fallback, el, 0)
|
|
115
115
|
}
|
|
116
116
|
throw error
|
|
117
117
|
} finally {
|
|
@@ -134,9 +134,9 @@ function render(
|
|
|
134
134
|
)
|
|
135
135
|
)
|
|
136
136
|
} else if (Array.isArray(children)) {
|
|
137
|
-
children.forEach((c, i) =>
|
|
137
|
+
children.forEach((c, i) => headlessRender(ctx, c, el, i))
|
|
138
138
|
} else {
|
|
139
|
-
|
|
139
|
+
headlessRender(ctx, children, el, 0)
|
|
140
140
|
}
|
|
141
141
|
ctx.write(`</${type}>`)
|
|
142
142
|
}
|
package/src/hmr.ts
CHANGED
|
@@ -2,9 +2,7 @@ import { $HMR_ACCEPT, $DEV_FILE_LINK } from "./constants.js"
|
|
|
2
2
|
import { traverseApply } from "./utils/index.js"
|
|
3
3
|
import { flushSync, requestUpdate } from "./scheduler.js"
|
|
4
4
|
import { Signal } from "./signals/base.js"
|
|
5
|
-
import type {
|
|
6
|
-
import type { Store } from "./store.js"
|
|
7
|
-
import type { AppContext } from "./appContext.js"
|
|
5
|
+
import type { Effect } from "./signals/effect.js"
|
|
8
6
|
|
|
9
7
|
export type HMRAccept<T = {}> = {
|
|
10
8
|
provide: () => T
|
|
@@ -15,7 +13,7 @@ export type HMRAccept<T = {}> = {
|
|
|
15
13
|
export type GenericHMRAcceptor<T = {}> = {
|
|
16
14
|
[$HMR_ACCEPT]: HMRAccept<T>
|
|
17
15
|
}
|
|
18
|
-
type HotVar = Kiru.FC |
|
|
16
|
+
type HotVar = Kiru.FC | Signal<any> | Kiru.ContextBase<any>
|
|
19
17
|
|
|
20
18
|
type HotVarDesc = {
|
|
21
19
|
type: string
|
|
@@ -43,7 +41,7 @@ export function isGenericHmrAcceptor(
|
|
|
43
41
|
|
|
44
42
|
type ModuleMemory = {
|
|
45
43
|
hotVars: Map<string, HotVarDesc>
|
|
46
|
-
|
|
44
|
+
unnamedEffects: Array<Effect>
|
|
47
45
|
}
|
|
48
46
|
|
|
49
47
|
type HotVarRegistrationEntry = {
|
|
@@ -59,7 +57,7 @@ export function createHMRContext() {
|
|
|
59
57
|
let currentModuleMemory: ModuleMemory | null = null
|
|
60
58
|
let isModuleReplacementExecution = false
|
|
61
59
|
const isReplacement = () => isModuleReplacementExecution
|
|
62
|
-
let
|
|
60
|
+
let isWaitingForNextEffect = false
|
|
63
61
|
|
|
64
62
|
const onHmrCallbacks: Array<() => void> = []
|
|
65
63
|
const onHmr = (callback: () => void) => {
|
|
@@ -72,14 +70,15 @@ export function createHMRContext() {
|
|
|
72
70
|
if (!mod) {
|
|
73
71
|
mod = {
|
|
74
72
|
hotVars: new Map(),
|
|
75
|
-
|
|
73
|
+
unnamedEffects: [],
|
|
76
74
|
}
|
|
77
75
|
moduleMap.set(filePath, mod)
|
|
78
76
|
} else {
|
|
79
77
|
while (onHmrCallbacks.length) onHmrCallbacks.shift()!()
|
|
80
|
-
for (const
|
|
81
|
-
|
|
78
|
+
for (const effect of mod.unnamedEffects) {
|
|
79
|
+
effect.stop()
|
|
82
80
|
}
|
|
81
|
+
mod.unnamedEffects.length = 0
|
|
83
82
|
}
|
|
84
83
|
|
|
85
84
|
currentModuleMemory = mod!
|
|
@@ -92,26 +91,20 @@ export function createHMRContext() {
|
|
|
92
91
|
if (currentModuleMemory === null)
|
|
93
92
|
throw new Error("[kiru]: HMR could not register: No active module")
|
|
94
93
|
|
|
95
|
-
let
|
|
94
|
+
let dirtyNodes = new Set<Kiru.VNode>()
|
|
96
95
|
for (const [name, newEntry] of Object.entries(hotVarRegistrationEntries)) {
|
|
97
96
|
const oldEntry = currentModuleMemory.hotVars.get(name)
|
|
98
97
|
|
|
99
98
|
// @ts-ignore - this is how we tell devtools what file the hotvar is from
|
|
100
99
|
newEntry.value[$DEV_FILE_LINK] = newEntry.link
|
|
101
100
|
|
|
102
|
-
if (
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
oldEntry.value.__next = newEntry.value
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (newEntry.type === "createStore") {
|
|
114
|
-
window.__kiru.stores!.add(name, newEntry.value as Store<any, any>)
|
|
101
|
+
if (oldEntry?.value) {
|
|
102
|
+
/**
|
|
103
|
+
* this is how, when the previous value has been stored somewhere else (eg. in a Map, or by Vike),
|
|
104
|
+
* we can trace it to its current version by using latest(value)
|
|
105
|
+
*/
|
|
106
|
+
// @ts-ignore
|
|
107
|
+
oldEntry.value.__next = newEntry.value
|
|
115
108
|
}
|
|
116
109
|
|
|
117
110
|
currentModuleMemory.hotVars.set(name, newEntry)
|
|
@@ -127,20 +120,20 @@ export function createHMRContext() {
|
|
|
127
120
|
continue
|
|
128
121
|
}
|
|
129
122
|
if (oldEntry.type === "component" && newEntry.type === "component") {
|
|
130
|
-
window.__kiru.apps.forEach((
|
|
131
|
-
traverseApply(
|
|
123
|
+
window.__kiru.apps.forEach((app) => {
|
|
124
|
+
traverseApply(app.rootNode, (vNode) => {
|
|
132
125
|
if (vNode.type === oldEntry.value) {
|
|
133
126
|
vNode.type = newEntry.value as any
|
|
134
|
-
|
|
127
|
+
dirtyNodes.add(vNode)
|
|
135
128
|
}
|
|
136
129
|
})
|
|
137
130
|
})
|
|
138
131
|
}
|
|
139
132
|
}
|
|
140
133
|
|
|
141
|
-
if (
|
|
134
|
+
if (dirtyNodes.size) {
|
|
142
135
|
_isHmrUpdate = true
|
|
143
|
-
|
|
136
|
+
dirtyNodes.forEach((n) => requestUpdate(n))
|
|
144
137
|
flushSync()
|
|
145
138
|
_isHmrUpdate = false
|
|
146
139
|
}
|
|
@@ -150,16 +143,14 @@ export function createHMRContext() {
|
|
|
150
143
|
currentModuleFilePath = null
|
|
151
144
|
}
|
|
152
145
|
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
},
|
|
157
|
-
isWaitingForNextWatchCall() {
|
|
158
|
-
return isWaitingForNextWatchCall
|
|
146
|
+
const moduleEffects = {
|
|
147
|
+
registerNext() {
|
|
148
|
+
isWaitingForNextEffect = true
|
|
159
149
|
},
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
150
|
+
push(effect: Effect<any>) {
|
|
151
|
+
if (!isWaitingForNextEffect) return
|
|
152
|
+
currentModuleMemory!.unnamedEffects.push(effect)
|
|
153
|
+
isWaitingForNextEffect = false
|
|
163
154
|
},
|
|
164
155
|
}
|
|
165
156
|
|
|
@@ -167,7 +158,7 @@ export function createHMRContext() {
|
|
|
167
158
|
register,
|
|
168
159
|
prepare,
|
|
169
160
|
isReplacement,
|
|
170
|
-
|
|
161
|
+
moduleEffects,
|
|
171
162
|
onHmr,
|
|
172
163
|
getCurrentFilePath() {
|
|
173
164
|
return currentModuleFilePath
|
package/src/hooks/index.ts
CHANGED
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
export * from "./
|
|
3
|
-
export * from "./
|
|
4
|
-
export * from "./useEffect.js"
|
|
5
|
-
export * from "./useEffectEvent.js"
|
|
6
|
-
export * from "./useId.js"
|
|
7
|
-
export * from "./useLayoutEffect.js"
|
|
8
|
-
export * from "./useMemo.js"
|
|
9
|
-
export * from "./usePromise.js"
|
|
10
|
-
export * from "./useReducer.js"
|
|
11
|
-
export * from "./useRef.js"
|
|
12
|
-
export * from "./useState.js"
|
|
13
|
-
export * from "./useSyncExternalStore.js"
|
|
14
|
-
export * from "./useViewTransition.js"
|
|
1
|
+
export * from "./onCleanup.js"
|
|
2
|
+
export * from "./onMount.js"
|
|
3
|
+
export * from "./onBeforeMount.js"
|
|
15
4
|
export * from "./utils.js"
|