kiru 0.45.2 → 0.46.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.
- package/dist/appContext.d.ts +0 -13
- package/dist/appContext.d.ts.map +1 -1
- package/dist/appContext.js +15 -55
- package/dist/appContext.js.map +1 -1
- package/dist/constants.d.ts +5 -7
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +5 -7
- package/dist/constants.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +2 -4
- package/dist/context.js.map +1 -1
- package/dist/dom.d.ts +2 -2
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +36 -32
- package/dist/dom.js.map +1 -1
- package/dist/form/index.d.ts.map +1 -1
- package/dist/form/index.js +17 -3
- package/dist/form/index.js.map +1 -1
- package/dist/form/types.d.ts +1 -0
- package/dist/form/types.d.ts.map +1 -1
- package/dist/globals.d.ts +1 -6
- package/dist/globals.d.ts.map +1 -1
- package/dist/globals.js +1 -5
- package/dist/globals.js.map +1 -1
- package/dist/hmr.d.ts +1 -1
- package/dist/hmr.d.ts.map +1 -1
- package/dist/hmr.js +2 -4
- package/dist/hmr.js.map +1 -1
- package/dist/hooks/useViewTransition.d.ts.map +1 -1
- package/dist/hooks/useViewTransition.js +3 -3
- package/dist/hooks/useViewTransition.js.map +1 -1
- package/dist/hooks/utils.d.ts +1 -5
- package/dist/hooks/utils.d.ts.map +1 -1
- package/dist/hooks/utils.js +8 -20
- package/dist/hooks/utils.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/lazy.d.ts.map +1 -1
- package/dist/lazy.js +4 -4
- package/dist/lazy.js.map +1 -1
- package/dist/portal.d.ts.map +1 -1
- package/dist/portal.js +2 -3
- package/dist/portal.js.map +1 -1
- package/dist/props.js +1 -1
- package/dist/props.js.map +1 -1
- package/dist/reconciler.d.ts.map +1 -1
- package/dist/reconciler.js +105 -79
- package/dist/reconciler.js.map +1 -1
- package/dist/renderToString.d.ts.map +1 -1
- package/dist/renderToString.js +5 -8
- package/dist/renderToString.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +5 -6
- package/dist/router/router.js.map +1 -1
- package/dist/scheduler.d.ts +4 -11
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +365 -390
- package/dist/scheduler.js.map +1 -1
- package/dist/signals/base.d.ts +4 -4
- package/dist/signals/base.d.ts.map +1 -1
- package/dist/signals/base.js +38 -24
- package/dist/signals/base.js.map +1 -1
- package/dist/signals/computed.d.ts +2 -2
- package/dist/signals/computed.d.ts.map +1 -1
- package/dist/signals/computed.js +11 -3
- package/dist/signals/computed.js.map +1 -1
- package/dist/signals/effect.d.ts +1 -1
- package/dist/signals/effect.d.ts.map +1 -1
- package/dist/signals/globals.d.ts +2 -2
- package/dist/signals/globals.d.ts.map +1 -1
- package/dist/signals/globals.js.map +1 -1
- package/dist/signals/jsx.d.ts +4 -3
- package/dist/signals/jsx.d.ts.map +1 -1
- package/dist/signals/jsx.js +1 -1
- package/dist/signals/jsx.js.map +1 -1
- package/dist/signals/types.d.ts +2 -2
- package/dist/signals/types.d.ts.map +1 -1
- package/dist/signals/utils.d.ts +1 -1
- package/dist/signals/utils.d.ts.map +1 -1
- package/dist/signals/utils.js +1 -1
- package/dist/signals/utils.js.map +1 -1
- package/dist/ssr/server.d.ts.map +1 -1
- package/dist/ssr/server.js +1 -5
- package/dist/ssr/server.js.map +1 -1
- package/dist/types.d.ts +9 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +17 -17
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/appContext.ts +21 -67
- package/src/constants.ts +8 -7
- package/src/context.ts +2 -4
- package/src/dom.ts +50 -29
- package/src/env.ts +6 -6
- package/src/form/index.ts +17 -3
- package/src/form/types.ts +1 -0
- package/src/globals.ts +1 -9
- package/src/hmr.ts +3 -5
- package/src/hooks/useViewTransition.ts +3 -3
- package/src/hooks/utils.ts +7 -22
- package/src/index.ts +3 -3
- package/src/lazy.ts +4 -4
- package/src/portal.ts +2 -3
- package/src/props.ts +1 -1
- package/src/reconciler.ts +116 -90
- package/src/renderToString.ts +5 -8
- package/src/router/router.ts +4 -6
- package/src/scheduler.ts +369 -407
- package/src/signals/base.ts +40 -33
- package/src/signals/computed.ts +8 -3
- package/src/signals/effect.ts +1 -1
- package/src/signals/globals.ts +2 -2
- package/src/signals/jsx.ts +12 -11
- package/src/signals/types.ts +2 -2
- package/src/signals/utils.ts +1 -1
- package/src/ssr/server.ts +1 -5
- package/src/types.ts +9 -2
- package/src/utils.ts +26 -21
- package/dist/flags.d.ts +0 -6
- package/dist/flags.d.ts.map +0 -1
- package/dist/flags.js +0 -16
- package/dist/flags.js.map +0 -1
- package/src/flags.ts +0 -15
package/src/signals/base.ts
CHANGED
|
@@ -1,36 +1,34 @@
|
|
|
1
1
|
import { $HMR_ACCEPT, $SIGNAL } from "../constants.js"
|
|
2
2
|
import { __DEV__ } from "../env.js"
|
|
3
3
|
import type { HMRAccept } from "../hmr.js"
|
|
4
|
-
import {
|
|
5
|
-
getVNodeAppContext,
|
|
6
|
-
latest,
|
|
7
|
-
safeStringify,
|
|
8
|
-
sideEffectsEnabled,
|
|
9
|
-
} from "../utils.js"
|
|
4
|
+
import { latest, safeStringify, sideEffectsEnabled } from "../utils.js"
|
|
10
5
|
import { tracking, signalSubsMap } from "./globals.js"
|
|
11
6
|
import { type SignalSubscriber, ReadonlySignal } from "./types.js"
|
|
12
7
|
import { node } from "../globals.js"
|
|
13
8
|
import { useHook } from "../hooks/utils.js"
|
|
14
9
|
import { generateRandomID } from "../generateId.js"
|
|
10
|
+
import { requestUpdate } from "../scheduler.js"
|
|
15
11
|
|
|
16
12
|
export class Signal<T> {
|
|
17
13
|
[$SIGNAL] = true;
|
|
18
14
|
[$HMR_ACCEPT]?: HMRAccept<Signal<any>>
|
|
19
15
|
displayName?: string
|
|
20
16
|
private onBeforeRead?: () => void
|
|
17
|
+
protected $subs?: Set<SignalSubscriber<any>>
|
|
21
18
|
protected $id: string
|
|
22
19
|
protected $value: T
|
|
20
|
+
protected $prevValue?: T
|
|
23
21
|
protected $initialValue?: string
|
|
24
22
|
protected __next?: Signal<T>
|
|
25
23
|
protected $isDisposed?: boolean
|
|
26
24
|
|
|
27
25
|
constructor(initial: T, displayName?: string) {
|
|
28
26
|
this.$id = generateRandomID()
|
|
29
|
-
signalSubsMap.set(this.$id, new Set())
|
|
30
|
-
|
|
31
27
|
this.$value = initial
|
|
32
28
|
if (displayName) this.displayName = displayName
|
|
29
|
+
|
|
33
30
|
if (__DEV__) {
|
|
31
|
+
signalSubsMap.set(this.$id, new Set())
|
|
34
32
|
this.$initialValue = safeStringify(initial)
|
|
35
33
|
this[$HMR_ACCEPT] = {
|
|
36
34
|
provide: () => {
|
|
@@ -50,6 +48,8 @@ export class Signal<T> {
|
|
|
50
48
|
},
|
|
51
49
|
destroy: () => {},
|
|
52
50
|
} satisfies HMRAccept<Signal<any>>
|
|
51
|
+
} else {
|
|
52
|
+
this.$subs = new Set()
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
|
|
@@ -68,11 +68,13 @@ export class Signal<T> {
|
|
|
68
68
|
if (__DEV__) {
|
|
69
69
|
const tgt = latest(this)
|
|
70
70
|
if (Object.is(tgt.$value, next)) return
|
|
71
|
+
tgt.$prevValue = tgt.$value
|
|
71
72
|
tgt.$value = next
|
|
72
73
|
tgt.notify()
|
|
73
74
|
return
|
|
74
75
|
}
|
|
75
76
|
if (Object.is(this.$value, next)) return
|
|
77
|
+
this.$prevValue = this.$value
|
|
76
78
|
this.$value = next
|
|
77
79
|
this.notify()
|
|
78
80
|
}
|
|
@@ -88,9 +90,11 @@ export class Signal<T> {
|
|
|
88
90
|
sneak(newValue: T) {
|
|
89
91
|
if (__DEV__) {
|
|
90
92
|
const tgt = latest(this)
|
|
93
|
+
tgt.$prevValue = tgt.$value
|
|
91
94
|
tgt.$value = newValue
|
|
92
95
|
return
|
|
93
96
|
}
|
|
97
|
+
this.$prevValue = this.$value
|
|
94
98
|
this.$value = newValue
|
|
95
99
|
}
|
|
96
100
|
|
|
@@ -105,23 +109,27 @@ export class Signal<T> {
|
|
|
105
109
|
return `${this.$value}`
|
|
106
110
|
}
|
|
107
111
|
|
|
108
|
-
subscribe(cb: (state: T) => void): () => void {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
+
subscribe(cb: (state: T, prevState?: T) => void): () => void {
|
|
113
|
+
if (__DEV__) {
|
|
114
|
+
const subs = signalSubsMap.get(this.$id)!
|
|
115
|
+
subs!.add(cb)
|
|
116
|
+
return () => signalSubsMap.get(this.$id)?.delete(cb)
|
|
117
|
+
}
|
|
118
|
+
this.$subs!.add(cb)
|
|
119
|
+
return () => this.$subs!.delete(cb)
|
|
112
120
|
}
|
|
113
121
|
|
|
114
122
|
notify(options?: { filter?: (sub: Function | Kiru.VNode) => boolean }) {
|
|
115
|
-
|
|
123
|
+
if (__DEV__) {
|
|
124
|
+
return signalSubsMap.get(this.$id)?.forEach((sub) => {
|
|
125
|
+
if (options?.filter && !options.filter(sub)) return
|
|
126
|
+
const { $value, $prevValue } = latest(this)
|
|
127
|
+
return sub($value, $prevValue)
|
|
128
|
+
})
|
|
129
|
+
}
|
|
130
|
+
this.$subs!.forEach((sub) => {
|
|
116
131
|
if (options?.filter && !options.filter(sub)) return
|
|
117
|
-
|
|
118
|
-
if (__DEV__) {
|
|
119
|
-
const value = latest(this).$value
|
|
120
|
-
return sub(value)
|
|
121
|
-
}
|
|
122
|
-
return sub(this.$value)
|
|
123
|
-
}
|
|
124
|
-
getVNodeAppContext(sub).requestUpdate(sub)
|
|
132
|
+
return sub(this.$value, this.$prevValue)
|
|
125
133
|
})
|
|
126
134
|
}
|
|
127
135
|
|
|
@@ -129,12 +137,11 @@ export class Signal<T> {
|
|
|
129
137
|
return typeof x === "object" && !!x && $SIGNAL in x
|
|
130
138
|
}
|
|
131
139
|
|
|
132
|
-
static unsubscribe(sub: SignalSubscriber, id: string) {
|
|
133
|
-
signalSubsMap.get(id)?.delete(sub)
|
|
134
|
-
}
|
|
135
|
-
|
|
136
140
|
static subscribers(signal: Signal<any>) {
|
|
137
|
-
|
|
141
|
+
if (__DEV__) {
|
|
142
|
+
return signalSubsMap.get(signal.$id)!
|
|
143
|
+
}
|
|
144
|
+
return signal.$subs
|
|
138
145
|
}
|
|
139
146
|
|
|
140
147
|
static makeReadonly<T>(signal: Signal<T>): ReadonlySignal<T> {
|
|
@@ -165,10 +172,6 @@ export class Signal<T> {
|
|
|
165
172
|
})
|
|
166
173
|
}
|
|
167
174
|
|
|
168
|
-
static getId<T>(signal: Signal<T>) {
|
|
169
|
-
return signal.$id
|
|
170
|
-
}
|
|
171
|
-
|
|
172
175
|
static entangle<T>(signal: Signal<T>) {
|
|
173
176
|
const vNode = node.current
|
|
174
177
|
const trackedSignalObservations = tracking.current()
|
|
@@ -179,8 +182,8 @@ export class Signal<T> {
|
|
|
179
182
|
return
|
|
180
183
|
}
|
|
181
184
|
if (!vNode || !sideEffectsEnabled()) return
|
|
182
|
-
|
|
183
|
-
|
|
185
|
+
const unsub = signal.subscribe(() => requestUpdate(vNode))
|
|
186
|
+
;(vNode.subs ??= new Set()).add(unsub)
|
|
184
187
|
}
|
|
185
188
|
|
|
186
189
|
static configure(signal: Signal<any>, onBeforeRead?: () => void) {
|
|
@@ -189,7 +192,11 @@ export class Signal<T> {
|
|
|
189
192
|
|
|
190
193
|
static dispose(signal: Signal<any>) {
|
|
191
194
|
signal.$isDisposed = true
|
|
192
|
-
|
|
195
|
+
if (__DEV__) {
|
|
196
|
+
signalSubsMap.delete(signal.$id)
|
|
197
|
+
return
|
|
198
|
+
}
|
|
199
|
+
signal.$subs!.clear()
|
|
193
200
|
}
|
|
194
201
|
}
|
|
195
202
|
|
package/src/signals/computed.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __DEV__ } from "../env.js"
|
|
2
|
-
import { Signal } from "./
|
|
2
|
+
import { Signal } from "./index.js"
|
|
3
3
|
import { effectQueue, signalSubsMap } from "./globals.js"
|
|
4
4
|
import { $HMR_ACCEPT } from "../constants.js"
|
|
5
5
|
import type { HMRAccept } from "../hmr.js"
|
|
@@ -57,7 +57,7 @@ export class ComputedSignal<T> extends Signal<T> {
|
|
|
57
57
|
// @ts-expect-error
|
|
58
58
|
set value(next: T) {}
|
|
59
59
|
|
|
60
|
-
subscribe(cb: (state: T) => void): () => void {
|
|
60
|
+
subscribe(cb: (state: T, prevState?: T) => void): () => void {
|
|
61
61
|
if (this.$isDirty) {
|
|
62
62
|
ComputedSignal.run(this)
|
|
63
63
|
}
|
|
@@ -88,8 +88,13 @@ export class ComputedSignal<T> extends Signal<T> {
|
|
|
88
88
|
fn: () => $getter($computed.$value),
|
|
89
89
|
onDepChanged: () => {
|
|
90
90
|
$computed.$isDirty = true
|
|
91
|
-
if (
|
|
91
|
+
if (__DEV__) {
|
|
92
|
+
if (!signalSubsMap?.get(id)?.size) return
|
|
93
|
+
} else {
|
|
94
|
+
if (!computed.$subs!.size) return
|
|
95
|
+
}
|
|
92
96
|
ComputedSignal.run($computed)
|
|
97
|
+
if (Object.is($computed.$value, $computed.$prevValue)) return
|
|
93
98
|
$computed.notify()
|
|
94
99
|
},
|
|
95
100
|
})
|
package/src/signals/effect.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { node } from "../globals.js"
|
|
2
2
|
import { sideEffectsEnabled } from "../utils.js"
|
|
3
3
|
import { tracking, effectQueue } from "./globals.js"
|
|
4
|
-
import type { Signal } from "./
|
|
4
|
+
import type { Signal } from "./index.js"
|
|
5
5
|
import type { SignalValues } from "./types.js"
|
|
6
6
|
|
|
7
7
|
type TrackedExecutionContext<T, Deps extends readonly Signal<unknown>[]> = {
|
package/src/signals/globals.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Signal } from "./
|
|
1
|
+
import type { Signal } from "./index.js"
|
|
2
2
|
import type { SignalSubscriber } from "./types.js"
|
|
3
3
|
|
|
4
4
|
export const tracking = {
|
|
@@ -8,4 +8,4 @@ export const tracking = {
|
|
|
8
8
|
},
|
|
9
9
|
}
|
|
10
10
|
export const effectQueue = new Map<string, Function>()
|
|
11
|
-
export const signalSubsMap: Map<string, Set<SignalSubscriber
|
|
11
|
+
export const signalSubsMap: Map<string, Set<SignalSubscriber<any>>> = new Map()
|
package/src/signals/jsx.ts
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import type { Signal } from "./
|
|
1
|
+
import type { Signal } from "./index.js"
|
|
2
2
|
import type { SignalValues } from "./types.js"
|
|
3
3
|
|
|
4
|
-
type
|
|
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>> = {
|
|
5
13
|
each: T
|
|
6
14
|
fallback?: JSX.Element
|
|
7
|
-
children: (
|
|
8
|
-
value: T extends Signal<infer U>
|
|
9
|
-
? U extends Array<infer V>
|
|
10
|
-
? V
|
|
11
|
-
: never
|
|
12
|
-
: never,
|
|
13
|
-
index: number
|
|
14
|
-
) => JSX.Element
|
|
15
|
+
children: (value: U, index: number, array: U[]) => JSX.Element
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
export function For<T extends Signal<any[]>>({
|
|
@@ -21,7 +22,7 @@ export function For<T extends Signal<any[]>>({
|
|
|
21
22
|
}: ForProps<T>) {
|
|
22
23
|
const items = each.value
|
|
23
24
|
if (items.length === 0) return fallback
|
|
24
|
-
return items.map(
|
|
25
|
+
return items.map(children)
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
type DeriveChildrenArgs<T extends Signal<any> | Signal<any>[]> =
|
package/src/signals/types.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { type Signal } from "./
|
|
1
|
+
import { type Signal } from "./index.js"
|
|
2
2
|
|
|
3
3
|
export type ReadonlySignal<T> = Signal<T> & {
|
|
4
4
|
readonly value: T
|
|
5
5
|
}
|
|
6
|
-
export type SignalSubscriber =
|
|
6
|
+
export type SignalSubscriber<T = unknown> = (value: T, prevValue?: T) => void
|
|
7
7
|
|
|
8
8
|
export type SignalValues<T extends readonly Signal<unknown>[]> = {
|
|
9
9
|
[I in keyof T]: T[I] extends Signal<infer V> ? V : never
|
package/src/signals/utils.ts
CHANGED
package/src/ssr/server.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Readable } from "node:stream"
|
|
2
2
|
import { Fragment } from "../element.js"
|
|
3
3
|
import { AppContext, createAppContext } from "../appContext.js"
|
|
4
|
-
import { renderMode,
|
|
4
|
+
import { renderMode, node } from "../globals.js"
|
|
5
5
|
import {
|
|
6
6
|
isVNode,
|
|
7
7
|
encodeHtmlEntities,
|
|
@@ -29,12 +29,9 @@ export function renderToReadableStream<T extends Record<string, unknown>>(
|
|
|
29
29
|
stream: new Readable(),
|
|
30
30
|
ctx: createAppContext(appFunc, appProps, { rootType: Fragment }),
|
|
31
31
|
}
|
|
32
|
-
const prevCtx = ctx.current
|
|
33
|
-
ctx.current = state.ctx
|
|
34
32
|
renderToStream_internal(state, state.ctx.rootNode, null, 0)
|
|
35
33
|
state.stream.push(null)
|
|
36
34
|
renderMode.current = prev
|
|
37
|
-
ctx.current = prevCtx
|
|
38
35
|
|
|
39
36
|
return state.stream
|
|
40
37
|
}
|
|
@@ -89,7 +86,6 @@ function renderToStream_internal(
|
|
|
89
86
|
}
|
|
90
87
|
|
|
91
88
|
if (typeof type !== "string") {
|
|
92
|
-
nodeToCtxMap.set(el, state.ctx)
|
|
93
89
|
node.current = el
|
|
94
90
|
const res = type(props)
|
|
95
91
|
node.current = null
|
package/src/types.ts
CHANGED
|
@@ -17,6 +17,7 @@ import type {
|
|
|
17
17
|
SVGTagToElement,
|
|
18
18
|
} from "./types.dom"
|
|
19
19
|
import { Signalable, SomeDom } from "./types.utils"
|
|
20
|
+
import type { AppContext } from "./appContext"
|
|
20
21
|
|
|
21
22
|
export type { ElementProps, StyleObject }
|
|
22
23
|
|
|
@@ -169,6 +170,7 @@ declare global {
|
|
|
169
170
|
| typeof $HYDRATION_BOUNDARY
|
|
170
171
|
|
|
171
172
|
type VNode = {
|
|
173
|
+
app?: AppContext
|
|
172
174
|
dom?: SomeDom
|
|
173
175
|
lastChildDom?: SomeDom
|
|
174
176
|
type: Function | ExoticSymbol | "#text" | (string & {})
|
|
@@ -183,11 +185,11 @@ declare global {
|
|
|
183
185
|
parent: VNode | null
|
|
184
186
|
child: VNode | null
|
|
185
187
|
sibling: VNode | null
|
|
186
|
-
prev:
|
|
188
|
+
prev: VNodeSnapshot | null
|
|
187
189
|
deletions: VNode[] | null
|
|
188
190
|
flags: number
|
|
189
191
|
hooks?: Hook<unknown>[]
|
|
190
|
-
subs?: Set<
|
|
192
|
+
subs?: Set<Function>
|
|
191
193
|
cleanups?: Record<string, Function>
|
|
192
194
|
effects?: Array<Function>
|
|
193
195
|
immediateEffects?: Array<Function>
|
|
@@ -202,6 +204,11 @@ declare global {
|
|
|
202
204
|
hmrUpdated?: boolean
|
|
203
205
|
}
|
|
204
206
|
}
|
|
207
|
+
type VNodeSnapshot = {
|
|
208
|
+
props: Kiru.VNode["props"]
|
|
209
|
+
memoizedProps: Kiru.VNode["memoizedProps"]
|
|
210
|
+
index: number
|
|
211
|
+
}
|
|
205
212
|
|
|
206
213
|
interface Element {
|
|
207
214
|
__kiruNode?: Kiru.VNode
|
package/src/utils.ts
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import { node,
|
|
1
|
+
import { node, renderMode } from "./globals.js"
|
|
2
2
|
import {
|
|
3
3
|
$CONTEXT_PROVIDER,
|
|
4
4
|
$FRAGMENT,
|
|
5
5
|
$HYDRATION_BOUNDARY,
|
|
6
6
|
booleanAttributes,
|
|
7
|
-
|
|
7
|
+
FLAG_DELETION,
|
|
8
|
+
FLAG_HAS_MEMO_ANCESTOR,
|
|
9
|
+
FLAG_PLACEMENT,
|
|
10
|
+
FLAG_UPDATE,
|
|
8
11
|
REGEX_UNIT,
|
|
9
12
|
} from "./constants.js"
|
|
10
13
|
import { unwrap } from "./signals/utils.js"
|
|
11
|
-
import { KiruError } from "./error.js"
|
|
12
|
-
import type { AppContext } from "./appContext"
|
|
13
14
|
import { __DEV__ } from "./env.js"
|
|
14
|
-
import {
|
|
15
|
+
import type { AppContext } from "./appContext"
|
|
15
16
|
|
|
16
17
|
export {
|
|
17
18
|
isVNode,
|
|
@@ -74,7 +75,7 @@ function sideEffectsEnabled(): boolean {
|
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
function isVNodeDeleted(vNode: VNode): boolean {
|
|
77
|
-
return
|
|
78
|
+
return (vNode.flags & FLAG_DELETION) !== 0
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
function isVNode(thing: unknown): thing is VNode {
|
|
@@ -119,22 +120,30 @@ function getCurrentVNode(): VNode | null {
|
|
|
119
120
|
return node.current
|
|
120
121
|
}
|
|
121
122
|
|
|
122
|
-
function getVNodeAppContext(vNode: VNode): AppContext {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
123
|
+
function getVNodeAppContext(vNode: VNode): AppContext | null {
|
|
124
|
+
let n: VNode | null = vNode
|
|
125
|
+
while (n) {
|
|
126
|
+
if (n.app) {
|
|
127
|
+
return (vNode.app = n.app)
|
|
128
|
+
}
|
|
129
|
+
n = n.parent
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return null
|
|
130
133
|
}
|
|
131
134
|
|
|
132
135
|
function commitSnapshot(vNode: VNode): void {
|
|
133
|
-
|
|
134
|
-
|
|
136
|
+
const {
|
|
137
|
+
props: { children, ...props },
|
|
138
|
+
memoizedProps,
|
|
139
|
+
index,
|
|
140
|
+
} = vNode
|
|
141
|
+
vNode.prev = { props, memoizedProps, index }
|
|
142
|
+
vNode.flags &= ~(FLAG_UPDATE | FLAG_PLACEMENT | FLAG_DELETION)
|
|
135
143
|
}
|
|
136
144
|
|
|
137
145
|
function vNodeContains(haystack: VNode, needle: VNode): boolean {
|
|
146
|
+
if (needle.depth < haystack.depth) return false
|
|
138
147
|
if (haystack === needle) return true
|
|
139
148
|
let checkSiblings = false
|
|
140
149
|
const stack: VNode[] = [haystack]
|
|
@@ -151,11 +160,7 @@ function vNodeContains(haystack: VNode, needle: VNode): boolean {
|
|
|
151
160
|
function willMemoBlockUpdate(root: VNode, target: VNode): boolean {
|
|
152
161
|
let node: VNode | null = target
|
|
153
162
|
|
|
154
|
-
while (
|
|
155
|
-
node &&
|
|
156
|
-
node !== root &&
|
|
157
|
-
flags.get(node.flags, FLAG.HAS_MEMO_ANCESTOR)
|
|
158
|
-
) {
|
|
163
|
+
while (node && node !== root && node.flags & FLAG_HAS_MEMO_ANCESTOR) {
|
|
159
164
|
const parent = node.parent
|
|
160
165
|
if (
|
|
161
166
|
parent?.isMemoized &&
|
package/dist/flags.d.ts
DELETED
package/dist/flags.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK;0BAEL,MAAM,QAAQ,MAAM,KAAG,MAAM;0BAI7B,MAAM,KAAK,MAAM,KAAG,OAAO;iCAIpB,MAAM,SAAS,MAAM,OAAO,MAAM,KAAG,MAAM;CAIrD,CAAA"}
|
package/dist/flags.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export const flags = {
|
|
2
|
-
// Set the flag at position `n` (0-based index)
|
|
3
|
-
set(field, flag) {
|
|
4
|
-
return (field |= 1 << flag);
|
|
5
|
-
},
|
|
6
|
-
// Check if the flag at position `n` is set (true) or not (false)
|
|
7
|
-
get(field, n) {
|
|
8
|
-
return (field & (1 << n)) !== 0;
|
|
9
|
-
},
|
|
10
|
-
// Unset all flags between `start` and `end`
|
|
11
|
-
unsetRange(field, start, end) {
|
|
12
|
-
const mask = ((1 << (end - start + 1)) - 1) << start;
|
|
13
|
-
return field & ~mask;
|
|
14
|
-
},
|
|
15
|
-
};
|
|
16
|
-
//# sourceMappingURL=flags.js.map
|
package/dist/flags.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,+CAA+C;IAC/C,GAAG,CAAC,KAAa,EAAE,IAAY;QAC7B,OAAO,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAA;IAC7B,CAAC;IACD,iEAAiE;IACjE,GAAG,CAAC,KAAa,EAAE,CAAS;QAC1B,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;IACD,4CAA4C;IAC5C,UAAU,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW;QAClD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAA;QACpD,OAAO,KAAK,GAAG,CAAC,IAAI,CAAA;IACtB,CAAC;CACO,CAAA"}
|
package/src/flags.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export const flags = {
|
|
2
|
-
// Set the flag at position `n` (0-based index)
|
|
3
|
-
set(field: number, flag: number): number {
|
|
4
|
-
return (field |= 1 << flag)
|
|
5
|
-
},
|
|
6
|
-
// Check if the flag at position `n` is set (true) or not (false)
|
|
7
|
-
get(field: number, n: number): boolean {
|
|
8
|
-
return (field & (1 << n)) !== 0
|
|
9
|
-
},
|
|
10
|
-
// Unset all flags between `start` and `end`
|
|
11
|
-
unsetRange(field: number, start: number, end: number): number {
|
|
12
|
-
const mask = ((1 << (end - start + 1)) - 1) << start
|
|
13
|
-
return field & ~mask
|
|
14
|
-
},
|
|
15
|
-
} as const
|