kiru 0.47.1 → 0.48.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.
Files changed (75) hide show
  1. package/dist/appContext.d.ts.map +1 -1
  2. package/dist/appContext.js +3 -5
  3. package/dist/appContext.js.map +1 -1
  4. package/dist/constants.d.ts +4 -2
  5. package/dist/constants.d.ts.map +1 -1
  6. package/dist/constants.js +6 -4
  7. package/dist/constants.js.map +1 -1
  8. package/dist/customEvents.d.ts +6 -0
  9. package/dist/customEvents.d.ts.map +1 -0
  10. package/dist/customEvents.js +12 -0
  11. package/dist/customEvents.js.map +1 -0
  12. package/dist/dom.d.ts +3 -1
  13. package/dist/dom.d.ts.map +1 -1
  14. package/dist/dom.js +102 -102
  15. package/dist/dom.js.map +1 -1
  16. package/dist/globalContext.d.ts +4 -3
  17. package/dist/globalContext.d.ts.map +1 -1
  18. package/dist/globalContext.js +0 -2
  19. package/dist/globalContext.js.map +1 -1
  20. package/dist/hooks/useAsync.d.ts +2 -13
  21. package/dist/hooks/useAsync.d.ts.map +1 -1
  22. package/dist/hooks/useAsync.js.map +1 -1
  23. package/dist/index.d.ts +2 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +7 -3
  26. package/dist/index.js.map +1 -1
  27. package/dist/lazy.d.ts +2 -2
  28. package/dist/lazy.d.ts.map +1 -1
  29. package/dist/lazy.js.map +1 -1
  30. package/dist/portal.d.ts +2 -2
  31. package/dist/portal.d.ts.map +1 -1
  32. package/dist/profiling.d.ts +2 -2
  33. package/dist/profiling.d.ts.map +1 -1
  34. package/dist/reconciler.d.ts.map +1 -1
  35. package/dist/reconciler.js +13 -10
  36. package/dist/reconciler.js.map +1 -1
  37. package/dist/scheduler.d.ts +1 -0
  38. package/dist/scheduler.d.ts.map +1 -1
  39. package/dist/scheduler.js +51 -156
  40. package/dist/scheduler.js.map +1 -1
  41. package/dist/swr.d.ts +6 -17
  42. package/dist/swr.d.ts.map +1 -1
  43. package/dist/swr.js +26 -18
  44. package/dist/swr.js.map +1 -1
  45. package/dist/transition.d.ts +2 -2
  46. package/dist/transition.d.ts.map +1 -1
  47. package/dist/types.d.ts +20 -18
  48. package/dist/types.d.ts.map +1 -1
  49. package/dist/types.dom.d.ts +57 -38
  50. package/dist/types.dom.d.ts.map +1 -1
  51. package/dist/types.utils.d.ts +31 -19
  52. package/dist/types.utils.d.ts.map +1 -1
  53. package/dist/utils.d.ts +1 -10
  54. package/dist/utils.d.ts.map +1 -1
  55. package/dist/utils.js +9 -56
  56. package/dist/utils.js.map +1 -1
  57. package/package.json +1 -1
  58. package/src/appContext.ts +3 -5
  59. package/src/constants.ts +9 -4
  60. package/src/customEvents.ts +22 -0
  61. package/src/dom.ts +124 -113
  62. package/src/globalContext.ts +4 -6
  63. package/src/hooks/useAsync.ts +7 -24
  64. package/src/index.ts +7 -4
  65. package/src/lazy.ts +6 -2
  66. package/src/portal.ts +1 -1
  67. package/src/profiling.ts +1 -1
  68. package/src/reconciler.ts +13 -16
  69. package/src/scheduler.ts +69 -158
  70. package/src/swr.ts +28 -37
  71. package/src/transition.ts +1 -1
  72. package/src/types.dom.ts +98 -36
  73. package/src/types.ts +12 -10
  74. package/src/types.utils.ts +43 -14
  75. package/src/utils.ts +7 -74
package/src/types.dom.ts CHANGED
@@ -164,7 +164,7 @@ type ListOfUrlsOrPaths = string
164
164
  type FileName = string
165
165
 
166
166
  type MediaPreload = "none" | "metadata" | "auto" | ""
167
- type HTMLMediaElementAttrs = {
167
+ interface HTMLMediaElementAttrs {
168
168
  autoplay?: boolean
169
169
  controls?: boolean
170
170
  crossOrigin?: string
@@ -298,7 +298,7 @@ type FormMethod = "get" | "post" | "dialog"
298
298
 
299
299
  type Direction = "ltr" | "rtl" | "auto"
300
300
 
301
- type GlobalAttributes = {
301
+ interface GlobalAttributes {
302
302
  accessKey?: string
303
303
  autocapitalize?: "on" | "off" | "none" | "sentences" | "words" | "characters"
304
304
  className?: string
@@ -364,41 +364,103 @@ declare global {
364
364
  bivarianceHack(event: E): void
365
365
  }["bivarianceHack"]
366
366
 
367
- type BaseEventHandler<T = Element> = EventHandler<DOMEvent<Event, T>>
368
- type AnimationEvent<T = Element> = DOMEvent<NativeAnimationEvent, T>
369
- type ClipboardEvent<T = Element> = DOMEvent<NativeClipboardEvent, T>
370
- type CompositionEvent<T = Element> = DOMEvent<NativeCompositionEvent, T>
371
- type DragEvent<T = Element> = DOMEvent<NativeDragEvent, T>
372
- type FocusEvent<T = Element> = DOMEvent<NativeFocusEvent, T>
373
- type FormEvent<T = Element> = DOMEvent<Event, T>
374
- type KeyboardEvent<T = Element> = DOMEvent<NativeKeyboardEvent, T>
375
- type MouseEvent<T = Element> = DOMEvent<NativeMouseEvent, T>
376
- type PointerEvent<T = Element> = DOMEvent<NativePointerEvent, T>
377
- type SubmitEvent<T = Element> = DOMEvent<NativeSubmitEvent, T>
378
- type TouchEvent<T = Element> = DOMEvent<NativeTouchEvent, T>
379
- type ToggleEvent<T = Element> = DOMEvent<NativeToggleEvent, T>
380
- type TransitionEvent<T = Element> = DOMEvent<NativeTransitionEvent, T>
381
- type UIEvent<T = Element> = DOMEvent<NativeUIEvent, T>
382
- type WheelEvent<T = Element> = DOMEvent<NativeWheelEvent, T>
383
-
384
- type ClipboardEventHandler<T = Element> = EventHandler<ClipboardEvent<T>>
385
- type CompositionEventHandler<T = Element> = EventHandler<
367
+ interface BaseEventHandler<T extends Element = Element>
368
+ extends DOMEvent<Event, T> {}
369
+
370
+ interface AnimationEvent<T extends Element = Element>
371
+ extends DOMEvent<NativeAnimationEvent, T> {}
372
+
373
+ interface ClipboardEvent<T extends Element = Element>
374
+ extends DOMEvent<NativeClipboardEvent, T> {}
375
+
376
+ interface CompositionEvent<T extends Element = Element>
377
+ extends DOMEvent<NativeCompositionEvent, T> {}
378
+
379
+ interface DragEvent<T extends Element = Element>
380
+ extends DOMEvent<NativeDragEvent, T> {}
381
+
382
+ interface FocusEvent<T extends Element = Element>
383
+ extends DOMEvent<NativeFocusEvent, T> {}
384
+
385
+ interface FormEvent<T extends Element = Element>
386
+ extends DOMEvent<Event, T> {}
387
+
388
+ interface KeyboardEvent<T extends Element = Element>
389
+ extends DOMEvent<NativeKeyboardEvent, T> {}
390
+
391
+ interface MouseEvent<T extends Element = Element>
392
+ extends DOMEvent<NativeMouseEvent, T> {}
393
+
394
+ interface PointerEvent<T extends Element = Element>
395
+ extends DOMEvent<NativePointerEvent, T> {}
396
+
397
+ interface SubmitEvent<T extends Element = Element>
398
+ extends DOMEvent<NativeSubmitEvent, T> {}
399
+
400
+ interface TouchEvent<T extends Element = Element>
401
+ extends DOMEvent<NativeTouchEvent, T> {}
402
+
403
+ interface ToggleEvent<T extends Element = Element>
404
+ extends DOMEvent<NativeToggleEvent, T> {}
405
+
406
+ interface TransitionEvent<T extends Element = Element>
407
+ extends DOMEvent<NativeTransitionEvent, T> {}
408
+
409
+ interface UIEvent<T extends Element = Element>
410
+ extends DOMEvent<NativeUIEvent, T> {}
411
+
412
+ interface WheelEvent<T extends Element = Element>
413
+ extends DOMEvent<NativeWheelEvent, T> {}
414
+
415
+ type ClipboardEventHandler<T extends Element = Element> = EventHandler<
416
+ ClipboardEvent<T>
417
+ >
418
+ type CompositionEventHandler<T extends Element = Element> = EventHandler<
386
419
  CompositionEvent<T>
387
420
  >
388
- type DragEventHandler<T = Element> = EventHandler<DragEvent<T>>
389
- type FocusEventHandler<T = Element> = EventHandler<FocusEvent<T>>
390
- type FormEventHandler<T = Element> = EventHandler<FormEvent<T>>
391
- type KeyboardEventHandler<T = Element> = EventHandler<KeyboardEvent<T>>
392
- type MouseEventHandler<T = Element> = EventHandler<MouseEvent<T>>
393
- type TouchEventHandler<T = Element> = EventHandler<TouchEvent<T>>
394
- type PointerEventHandler<T = Element> = EventHandler<PointerEvent<T>>
395
- type UIEventHandler<T = Element> = EventHandler<UIEvent<T>>
396
- type WheelEventHandler<T = Element> = EventHandler<WheelEvent<T>>
397
- type AnimationEventHandler<T = Element> = EventHandler<AnimationEvent<T>>
398
- type ToggleEventHandler<T = Element> = EventHandler<ToggleEvent<T>>
399
- type TransitionEventHandler<T = Element> = EventHandler<TransitionEvent<T>>
400
-
401
- type EventAttributes<T = Element> = {
421
+ type DragEventHandler<T extends Element = Element> = EventHandler<
422
+ DragEvent<T>
423
+ >
424
+ type FocusEventHandler<T extends Element = Element> = EventHandler<
425
+ FocusEvent<T>
426
+ >
427
+ type FormEventHandler<T extends Element = Element> = EventHandler<
428
+ FormEvent<T>
429
+ >
430
+ type KeyboardEventHandler<T extends Element = Element> = EventHandler<
431
+ KeyboardEvent<T>
432
+ >
433
+ type MouseEventHandler<T extends Element = Element> = EventHandler<
434
+ MouseEvent<T>
435
+ >
436
+ type TouchEventHandler<T extends Element = Element> = EventHandler<
437
+ TouchEvent<T>
438
+ >
439
+ type PointerEventHandler<T extends Element = Element> = EventHandler<
440
+ PointerEvent<T>
441
+ >
442
+ type UIEventHandler<T extends Element = Element> = EventHandler<UIEvent<T>>
443
+ type WheelEventHandler<T extends Element = Element> = EventHandler<
444
+ WheelEvent<T>
445
+ >
446
+ type AnimationEventHandler<T extends Element = Element> = EventHandler<
447
+ AnimationEvent<T>
448
+ >
449
+ type ToggleEventHandler<T extends Element = Element> = EventHandler<
450
+ ToggleEvent<T>
451
+ >
452
+ type TransitionEventHandler<T extends Element = Element> = EventHandler<
453
+ TransitionEvent<T>
454
+ >
455
+
456
+ type CustomEventAttributes = {
457
+ [Key in keyof Kiru.CustomEvents as `on:${Key}`]?: (
458
+ event: CustomEvent<Kiru.CustomEvents[Key]>
459
+ ) => void
460
+ }
461
+
462
+ interface EventAttributes<T extends Element = Element>
463
+ extends CustomEventAttributes {
402
464
  // Clipboard Events
403
465
  oncopy?: ClipboardEventHandler<T> | undefined
404
466
  oncut?: ClipboardEventHandler<T> | undefined
@@ -524,7 +586,7 @@ declare global {
524
586
 
525
587
  type ElementReference<T extends HTMLElement> = T | null | string
526
588
 
527
- type PopoverControlAttributes = {
589
+ interface PopoverControlAttributes {
528
590
  popoverTarget?: string
529
591
  popoverTargetAction?: "show" | "hide" | "toggle"
530
592
  }
package/src/types.ts CHANGED
@@ -16,10 +16,10 @@ import type {
16
16
  HTMLTagToElement,
17
17
  SVGTagToElement,
18
18
  } from "./types.dom"
19
- import { Signalable, SomeDom } from "./types.utils"
19
+ import { AsyncTaskState, Prettify, Signalable, SomeDom } from "./types.utils"
20
20
  import type { AppContext } from "./appContext"
21
21
 
22
- export type { ElementProps, StyleObject }
22
+ export type { AsyncTaskState, ElementProps, Prettify, Signalable, StyleObject }
23
23
 
24
24
  type ElementProps<T extends keyof JSX.IntrinsicElements> =
25
25
  JSX.IntrinsicElements[T]
@@ -102,7 +102,7 @@ declare global {
102
102
  | PrimitiveChild
103
103
  | Kiru.Signal<PrimitiveChild>
104
104
 
105
- type ElementAttributes = {
105
+ interface ElementAttributes {
106
106
  key?: JSX.ElementKey
107
107
  children?: JSX.Children
108
108
  innerHTML?:
@@ -112,11 +112,13 @@ declare global {
112
112
  }
113
113
  }
114
114
  namespace Kiru {
115
- type ProviderProps<T> = {
115
+ interface CustomEvents {}
116
+
117
+ interface ProviderProps<T> {
116
118
  value: T
117
119
  children?: JSX.Children | ((value: T) => JSX.Element)
118
120
  }
119
- type Context<T> = {
121
+ interface Context<T> {
120
122
  [$CONTEXT]: true
121
123
  Provider: (({ value, children }: ProviderProps<T>) => JSX.Element) & {
122
124
  displayName?: string
@@ -133,7 +135,7 @@ declare global {
133
135
  type FCProps<T = {}> = T & { children?: JSX.Children }
134
136
  type InferProps<T> = T extends Kiru.FC<infer P> ? P : never
135
137
 
136
- type HookDevtoolsProvisions<T extends Record<string, any>> = {
138
+ interface HookDevtoolsProvisions<T extends Record<string, any>> {
137
139
  get: () => T
138
140
  set?: (value: T) => void
139
141
  }
@@ -146,10 +148,10 @@ declare global {
146
148
  devtools?: HookDevtoolsProvisions<any>
147
149
  }
148
150
  }
149
- type RefObject<T> = {
151
+ interface RefObject<T> {
150
152
  readonly current: T | null
151
153
  }
152
- type MutableRefObject<T> = {
154
+ interface MutableRefObject<T> {
153
155
  current: T
154
156
  }
155
157
  type RefCallback<T> = {
@@ -169,7 +171,7 @@ declare global {
169
171
  | typeof $CONTEXT_PROVIDER
170
172
  | typeof $HYDRATION_BOUNDARY
171
173
 
172
- type VNode = {
174
+ interface VNode {
173
175
  app?: AppContext
174
176
  dom?: SomeDom
175
177
  lastChildDom?: SomeDom
@@ -203,7 +205,7 @@ declare global {
203
205
  hmrUpdated?: boolean
204
206
  }
205
207
  }
206
- type VNodeSnapshot = {
208
+ interface VNodeSnapshot {
207
209
  props: Kiru.VNode["props"]
208
210
  memoizedProps: Kiru.VNode["memoizedProps"]
209
211
  index: number
@@ -1,35 +1,47 @@
1
- import type { $CONTEXT_PROVIDER, $HYDRATION_BOUNDARY } from "./constants"
1
+ import type {
2
+ $CONTEXT_PROVIDER,
3
+ $FRAGMENT,
4
+ $HYDRATION_BOUNDARY,
5
+ } from "./constants"
2
6
  import type { HydrationBoundaryMode } from "./ssr/hydrationBoundary"
3
7
  import type { Signal } from "./signals"
4
8
 
5
9
  export type SomeElement = HTMLElement | SVGElement
6
10
  export type SomeDom = HTMLElement | SVGElement | Text
11
+ export type MaybeElement = SomeElement | undefined
7
12
  export type MaybeDom = SomeDom | undefined
8
13
 
9
- type VNode = Kiru.VNode
10
-
11
- export type FunctionVNode = Omit<VNode, "type"> & {
12
- type: (...args: any) => any
13
- }
14
- export type ExoticVNode = Omit<VNode, "type"> & {
15
- type: Kiru.ExoticSymbol
14
+ export interface FunctionVNode extends Kiru.VNode {
15
+ type: (...args: any) => JSX.Element
16
16
  }
17
- export type ElementVNode = Omit<VNode, "dom" | "type"> & {
17
+
18
+ export interface ElementVNode extends Kiru.VNode {
18
19
  dom: SomeElement
19
20
  type: string
20
21
  }
21
- export type DomVNode = Omit<VNode, "dom" | "type"> & {
22
+ export interface DomVNode extends Kiru.VNode {
22
23
  dom: SomeDom
23
24
  type: "#text" | (string & {})
24
25
  }
25
26
 
26
- export type ContextProviderNode<T> = Kiru.VNode & {
27
+ export interface ContextProviderNode<T> extends Kiru.VNode {
27
28
  type: typeof $CONTEXT_PROVIDER
28
- props: { value: T; ctx: Kiru.Context<T>; dependents: Set<Kiru.VNode> }
29
+ props: Kiru.VNode["props"] & {
30
+ value: T
31
+ ctx: Kiru.Context<T>
32
+ dependents: Set<Kiru.VNode>
33
+ }
29
34
  }
30
- export type HydrationBoundaryNode = Kiru.VNode & {
35
+
36
+ export interface HydrationBoundaryNode extends Kiru.VNode {
31
37
  type: typeof $HYDRATION_BOUNDARY
32
- props: { mode: HydrationBoundaryMode }
38
+ props: Kiru.VNode["props"] & {
39
+ mode: HydrationBoundaryMode
40
+ }
41
+ }
42
+
43
+ export interface FragmentNode extends Kiru.VNode {
44
+ type: typeof $FRAGMENT
33
45
  }
34
46
 
35
47
  export type Prettify<T> = {
@@ -37,3 +49,20 @@ export type Prettify<T> = {
37
49
  } & {}
38
50
 
39
51
  export type Signalable<T> = T | Signal<T>
52
+
53
+ export type AsyncTaskState<T, E extends Error = Error> =
54
+ | {
55
+ data: null
56
+ error: null
57
+ loading: true
58
+ }
59
+ | {
60
+ data: T
61
+ error: null
62
+ loading: false
63
+ }
64
+ | {
65
+ data: null
66
+ error: E
67
+ loading: false
68
+ }
package/src/utils.ts CHANGED
@@ -5,10 +5,8 @@ import {
5
5
  $HYDRATION_BOUNDARY,
6
6
  booleanAttributes,
7
7
  FLAG_DELETION,
8
- FLAG_HAS_MEMO_ANCESTOR,
9
8
  FLAG_PLACEMENT,
10
9
  FLAG_UPDATE,
11
- FLAG_MEMO,
12
10
  REGEX_UNIT,
13
11
  } from "./constants.js"
14
12
  import { unwrap } from "./signals/utils.js"
@@ -25,12 +23,10 @@ export {
25
23
  isExoticType,
26
24
  isVNodeDeleted,
27
25
  vNodeContains,
28
- willMemoBlockUpdate,
29
26
  getCurrentVNode,
30
27
  getVNodeAppContext,
31
28
  commitSnapshot,
32
29
  traverseApply,
33
- postOrderApply,
34
30
  findParent,
35
31
  propToHtmlAttr,
36
32
  propValueToHtmlAttrValue,
@@ -158,79 +154,16 @@ function vNodeContains(haystack: VNode, needle: VNode): boolean {
158
154
  return false
159
155
  }
160
156
 
161
- function willMemoBlockUpdate(root: VNode, target: VNode): boolean {
162
- let node: VNode | null = target
163
-
164
- while (node && node !== root && node.flags & FLAG_HAS_MEMO_ANCESTOR) {
165
- const parent = node.parent
166
- if (!parent) return false
167
- if (
168
- parent.flags & FLAG_MEMO &&
169
- parent.prev?.memoizedProps &&
170
- parent.arePropsEqual!(parent.prev.memoizedProps, parent.props)
171
- ) {
172
- return true
173
- }
174
-
175
- node = node.parent
176
- }
177
-
178
- return false
179
- }
180
-
181
157
  function traverseApply(vNode: VNode, func: (node: VNode) => void): void {
182
- let applyToSiblings = false
183
- const nodes: VNode[] = [vNode]
184
- const apply = (node: VNode) => {
185
- func(node)
186
- node.child && nodes.push(node.child)
187
- applyToSiblings && node.sibling && nodes.push(node.sibling)
188
- applyToSiblings = true
189
- }
190
- while (nodes.length) apply(nodes.shift()!)
191
- }
192
-
193
- function postOrderApply(
194
- tree: VNode,
195
- callbacks: {
196
- /** called upon traversing to the next parent, and on the root */
197
- onAscent: (vNode: VNode) => void
198
- /** called before traversing to the next parent */
199
- onBeforeAscent?: (vNode: VNode) => void
200
- /** called before traversing to the next child */
201
- onDescent?: (vNode: VNode) => void
202
- }
203
- ): void {
204
- const root = tree
205
- const rootChild = root.child
206
- if (!rootChild) {
207
- callbacks.onAscent(root)
208
- return
209
- }
210
-
211
- callbacks.onDescent?.(root)
212
- let branch = rootChild
213
- while (branch) {
214
- let c = branch
215
- while (c) {
216
- if (!c.child) break
217
- callbacks.onDescent?.(c)
218
- c = c.child
158
+ func(vNode)
159
+ let child = vNode.child
160
+ while (child) {
161
+ func(child)
162
+ if (child.child) {
163
+ traverseApply(child, func)
219
164
  }
220
-
221
- while (c && c !== root) {
222
- callbacks.onAscent(c)
223
- if (c.sibling) {
224
- branch = c.sibling
225
- break
226
- }
227
- callbacks.onBeforeAscent?.(c)
228
- c = c.parent!
229
- }
230
- if (c === root) break
165
+ child = child.sibling
231
166
  }
232
-
233
- callbacks.onAscent(root)
234
167
  }
235
168
 
236
169
  function findParent(vNode: Kiru.VNode, predicate: (n: Kiru.VNode) => boolean) {