@ktjs/core 0.37.9 → 0.38.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/README.md +9 -6
- package/dist/index.d.ts +49 -30
- package/dist/index.mjs +196 -157
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,17 +17,20 @@
|
|
|
17
17
|
|
|
18
18
|
## Recent Updates
|
|
19
19
|
|
|
20
|
-
1. 0.
|
|
20
|
+
1. 0.38.x - reactive helper additions
|
|
21
|
+
1. `reactive.is(target)`: create a boolean computed based on `Object.is` comparison.
|
|
22
|
+
2. `reactive.match(pattern)`: create a boolean computed using deep object/array pattern matching.
|
|
23
|
+
2. 0.37.x - fixes and refactors
|
|
21
24
|
1. fix schedulers clear issue. Which would occur when some handler throws an error.
|
|
22
25
|
2. `Fragment` is refactored. Fixes memory leak issues and makes it more robust.
|
|
23
|
-
|
|
26
|
+
3. 0.36.x - override 0.35.x. Now refs and computeds have 2 new apis:
|
|
24
27
|
1. `get(...keys)`: create a `KTSubComputed` object. It is a light version of computed, used to bind values
|
|
25
28
|
2. `subref(...keys)`: create a `KTSubRef` object. It is a light version of ref, used to bind values and also support two-way binding with `k-model`.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
4. 0.34.x - `ref.notify()` no-longer has an optional argument.
|
|
30
|
+
5. 0.33.x - `ref.value` remains the standard read API, and it can also replace the whole outer value with `ref.value = nextValue`.
|
|
31
|
+
6. 0.33.x - `ref.draft` is the deep-mutation entry for literally any objects. Just use `someRef.draft.a = someValue`, and kt.js will add it to microqueue and redraw it on the next tick. Works for `Map`, `Set`, `Array`, `Date` and your custom objects.
|
|
29
32
|
1. `ref.draft` itself is **not assignable**.
|
|
30
|
-
|
|
33
|
+
7. `addOnChange((newValue, oldValue) => ...)` keeps `oldValue` as the previous reference, not a deep snapshot.
|
|
31
34
|
|
|
32
35
|
## Community
|
|
33
36
|
|
package/dist/index.d.ts
CHANGED
|
@@ -3,50 +3,48 @@ export { HTMLTag, InputElementTag, MathMLTag, SVGTag } from '@ktjs/shared';
|
|
|
3
3
|
|
|
4
4
|
declare class KTComputed<T> extends KTReactive<T> {
|
|
5
5
|
readonly ktype = KTReactiveType.Computed;
|
|
6
|
-
private readonly _calculator;
|
|
7
|
-
private readonly _dependencies;
|
|
8
|
-
private readonly _recalculateListener;
|
|
9
6
|
private _disposed;
|
|
10
7
|
private _recalculate;
|
|
11
8
|
constructor(calculator: () => T, dependencies: Array<KTReactiveLike<any>>);
|
|
12
9
|
notify(): this;
|
|
13
|
-
dispose():
|
|
10
|
+
dispose(): void;
|
|
14
11
|
}
|
|
15
|
-
declare class KTSubComputed<T> extends KTSubReactive<T> {
|
|
16
|
-
readonly ktype = KTReactiveType.SubComputed;
|
|
17
|
-
}
|
|
18
|
-
type KTComputedLike<T> = KTComputed<T> | KTSubComputed<T>;
|
|
19
12
|
/**
|
|
20
13
|
* Create a computed value that automatically updates when its dependencies change.
|
|
21
14
|
* @param calculator synchronous function that calculates the value of the computed. It should not have side effects.
|
|
22
15
|
* @param dependencies an array of reactive dependencies that the computed value depends on. The computed value will automatically update when any of these dependencies change.
|
|
23
16
|
*/
|
|
24
17
|
declare const computed: <T>(calculator: () => T, dependencies: Array<KTReactiveLike<any>>) => KTComputed<T>;
|
|
18
|
+
declare class KTSubComputed<T> extends KTSubReactive<T> {
|
|
19
|
+
readonly ktype = KTReactiveType.SubComputed;
|
|
20
|
+
constructor(source: KTReactive<any>, getter: (sv: KTReactive<any>['value']) => T, dependency?: KTReactive<any>);
|
|
21
|
+
get value(): T;
|
|
22
|
+
dispose(): void;
|
|
23
|
+
}
|
|
24
|
+
type KTComputedLike<T> = KTComputed<T> | KTSubComputed<T>;
|
|
25
25
|
|
|
26
26
|
type ChangeHandler<T> = (newValue: T, oldValue: T) => void;
|
|
27
27
|
declare const enum KTReactiveType {
|
|
28
|
-
|
|
28
|
+
Pseudo = 1,
|
|
29
29
|
Ref = 2,
|
|
30
30
|
SubRef = 4,
|
|
31
31
|
RefLike = 6,
|
|
32
32
|
Computed = 8,
|
|
33
33
|
SubComputed = 16,
|
|
34
34
|
ComputedLike = 24,
|
|
35
|
-
Reactive = 10
|
|
35
|
+
Reactive = 10,
|
|
36
|
+
SubReactive = 20,
|
|
37
|
+
ReactiveLike = 31
|
|
36
38
|
}
|
|
39
|
+
declare const nextKid: () => number;
|
|
40
|
+
declare const nextHandlerId: (kid: number) => string;
|
|
37
41
|
declare abstract class KTReactiveLike<T> {
|
|
38
42
|
readonly kid: number;
|
|
39
43
|
abstract readonly ktype: KTReactiveType;
|
|
40
44
|
abstract get value(): T;
|
|
41
45
|
abstract addOnChange(handler: ChangeHandler<T>, key?: any): this;
|
|
42
46
|
abstract removeOnChange(key: any): this;
|
|
43
|
-
|
|
44
|
-
* Create a computed value via current reactive value.
|
|
45
|
-
* - No matter `this` is added to `dependencies` or not, it is always listened.
|
|
46
|
-
* @param calculator A function that generates a new value based on current value.
|
|
47
|
-
* @param dependencies optional other dependencies that the computed value depends on.
|
|
48
|
-
*/
|
|
49
|
-
map<U>(calculator: (value: T) => U, dependencies?: Array<KTReactiveLike<any>>): KTComputed<U>;
|
|
47
|
+
abstract dispose(): void;
|
|
50
48
|
}
|
|
51
49
|
declare abstract class KTReactive<T> extends KTReactiveLike<T> {
|
|
52
50
|
constructor(value: T);
|
|
@@ -56,6 +54,25 @@ declare abstract class KTReactive<T> extends KTReactiveLike<T> {
|
|
|
56
54
|
removeOnChange(key: any): this;
|
|
57
55
|
clearOnChange(): this;
|
|
58
56
|
notify(): this;
|
|
57
|
+
/**
|
|
58
|
+
* Create a computed value via current reactive value.
|
|
59
|
+
* - No matter `this` is added to `dependencies` or not, it is always listened.
|
|
60
|
+
* @param calculator A function that generates a new value based on current value.
|
|
61
|
+
* @param dependencies optional other dependencies that the computed value depends on.
|
|
62
|
+
*/
|
|
63
|
+
map<U>(calculator: (value: T) => U, dependencies?: Array<KTReactiveLike<any>>): KTComputed<U>;
|
|
64
|
+
/**
|
|
65
|
+
* Make a computed value that checks if the reactive value is strictly equal to a specific value.
|
|
66
|
+
* - Use `Object.is` for comparison.
|
|
67
|
+
* - if `o` is reactive-like, it will be added to dependencies
|
|
68
|
+
*/
|
|
69
|
+
is(o: T | KTReactiveLike<T>): KTSubComputed<boolean>;
|
|
70
|
+
/**
|
|
71
|
+
* Make a computed value that checks if the reactive value matches a specific object structure.
|
|
72
|
+
* - Deeply match.
|
|
73
|
+
* - if `o` is reactive-like, it will be added to dependencies
|
|
74
|
+
*/
|
|
75
|
+
match(o: object | KTReactiveLike<object>): KTSubComputed<boolean>;
|
|
59
76
|
/**
|
|
60
77
|
* Generate a sub-computed value based on this reactive, using keys to access nested properties.
|
|
61
78
|
* - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.
|
|
@@ -89,11 +106,10 @@ declare abstract class KTReactive<T> extends KTReactiveLike<T> {
|
|
|
89
106
|
}
|
|
90
107
|
declare abstract class KTSubReactive<T> extends KTReactiveLike<T> {
|
|
91
108
|
readonly source: KTReactive<any>;
|
|
92
|
-
constructor(source: KTReactive<any>,
|
|
93
|
-
get value(): T;
|
|
109
|
+
constructor(source: KTReactive<any>, getter: (sv: KTReactive<any>['value']) => T);
|
|
94
110
|
addOnChange(handler: ChangeHandler<T>, key?: any): this;
|
|
95
111
|
removeOnChange(key: any): this;
|
|
96
|
-
|
|
112
|
+
dispose(): void;
|
|
97
113
|
}
|
|
98
114
|
|
|
99
115
|
declare class KTRef<T> extends KTReactive<T> {
|
|
@@ -137,15 +153,7 @@ declare class KTRef<T> extends KTReactive<T> {
|
|
|
137
153
|
* - `KTSubRef` is lighter than `KTRef`.
|
|
138
154
|
*/
|
|
139
155
|
subref<K0 extends keyof T>(key0: K0): KTSubRef<T[K0]>;
|
|
140
|
-
|
|
141
|
-
declare class KTSubRef<T> extends KTSubReactive<T> {
|
|
142
|
-
readonly ktype = KTReactiveType.SubRef;
|
|
143
|
-
readonly source: KTRef<any>;
|
|
144
|
-
constructor(source: KTRef<any>, paths: Array<string | number>);
|
|
145
|
-
get value(): T;
|
|
146
|
-
set value(newValue: T);
|
|
147
|
-
get draft(): T;
|
|
148
|
-
notify(): this;
|
|
156
|
+
dispose(): void;
|
|
149
157
|
}
|
|
150
158
|
/**
|
|
151
159
|
* Create a reactive reference to a value. The returned object has a single property `value` that holds the internal value.
|
|
@@ -157,6 +165,17 @@ declare const ref: <T>(value?: T) => KTRef<T>;
|
|
|
157
165
|
*/
|
|
158
166
|
declare const assertModel: <T = any>(props: any, defaultValue?: T) => KTRefLike<T>;
|
|
159
167
|
type KTRefLike<T> = KTRef<T> | KTSubRef<T>;
|
|
168
|
+
declare class KTSubRef<T> extends KTSubReactive<T> {
|
|
169
|
+
readonly ktype = KTReactiveType.SubRef;
|
|
170
|
+
readonly source: KTRef<any>;
|
|
171
|
+
constructor(source: KTRef<any>, getter: (sv: KTReactive<any>['value']) => T, setter: (s: object, newValue: T) => void);
|
|
172
|
+
get value(): T;
|
|
173
|
+
set value(newValue: T);
|
|
174
|
+
/**
|
|
175
|
+
* Only use it for object's nested properties.
|
|
176
|
+
*/
|
|
177
|
+
get draft(): T;
|
|
178
|
+
}
|
|
160
179
|
|
|
161
180
|
/**
|
|
162
181
|
* Makes `KTReactify<'a' | 'b'> to be KTReactiveLike<'a'> | KTReactiveLike<'b'>`
|
|
@@ -1555,5 +1574,5 @@ declare function KTFor<T>(props: KTForProps<T>): KTForElement;
|
|
|
1555
1574
|
|
|
1556
1575
|
declare function KTConditional(condition: any | KTReactiveLike<any>, tagIf: JSXTag, propsIf: KTAttribute, tagElse?: JSXTag, propsElse?: KTAttribute): Element;
|
|
1557
1576
|
|
|
1558
|
-
export { Fragment, JSX, KTAsync, KTComputed, KTConditional, KTFor, KTReactive, KTReactiveLike, KTReactiveType, KTRef, KTSubComputed, KTSubReactive, KTSubRef, applyAttr, assertModel, computed, h as createElement, mathml$1 as createMathMLElement, svg$1 as createSVGElement, dereactive, effect, h, isComputed, isComputedLike, isKT, isReactive, isReactiveLike, isRef, isRefLike, isSubComputed, isSubRef, jsx, jsxDEV, jsxs, mathml, mathml as mathmlRuntime, ref, svg, svg as svgRuntime, toReactive };
|
|
1577
|
+
export { Fragment, JSX, KTAsync, KTComputed, KTConditional, KTFor, KTReactive, KTReactiveLike, KTReactiveType, KTRef, KTSubComputed, KTSubReactive, KTSubRef, applyAttr, assertModel, computed, h as createElement, mathml$1 as createMathMLElement, svg$1 as createSVGElement, dereactive, effect, h, isComputed, isComputedLike, isKT, isReactive, isReactiveLike, isRef, isRefLike, isSubComputed, isSubRef, jsx, jsxDEV, jsxs, mathml, mathml as mathmlRuntime, nextHandlerId, nextKid, ref, svg, svg as svgRuntime, toReactive };
|
|
1559
1578
|
export type { AliasElement, ChangeHandler, EventHandler, HTML, KTAttribute, KTComputedLike, KTForElement, KTForProps, KTMaybeReactive, KTMaybeReactiveProps, KTPrefixedEventAttribute, KTRawAttr, KTRawContent, KTRawContents, KTReactify, KTReactifyObject, KTReactifyProps, KTReactifySplit, KTRefLike };
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $isArray, $isThenable, $isNode, $
|
|
1
|
+
import { $stringify, $isArray, $isThenable, $isNode, $is, $emptyFn, $deepMatch, $forEach, $identity } from "@ktjs/shared";
|
|
2
2
|
|
|
3
3
|
function isKT(obj) {
|
|
4
4
|
return "number" == typeof obj?.kid;
|
|
@@ -36,6 +36,109 @@ function isReactive(obj) {
|
|
|
36
36
|
return "number" == typeof obj?.ktype && !!(10 & obj.ktype);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
function isSubReactive(obj) {
|
|
40
|
+
return "number" == typeof obj?.ktype && !!(20 & obj.ktype);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const $createSubGetter = path => {
|
|
44
|
+
switch (path.length) {
|
|
45
|
+
case 1:
|
|
46
|
+
return s => s[path[0]];
|
|
47
|
+
|
|
48
|
+
case 2:
|
|
49
|
+
return s => s[path[0]][path[1]];
|
|
50
|
+
|
|
51
|
+
case 3:
|
|
52
|
+
return s => s[path[0]][path[1]][path[2]];
|
|
53
|
+
|
|
54
|
+
case 4:
|
|
55
|
+
return s => s[path[0]][path[1]][path[2]][path[3]];
|
|
56
|
+
|
|
57
|
+
case 5:
|
|
58
|
+
return s => s[path[0]][path[1]][path[2]][path[3]][path[4]];
|
|
59
|
+
|
|
60
|
+
default:
|
|
61
|
+
return s => {
|
|
62
|
+
let r = s[path[0]][path[1]][path[2]][path[3]][path[4]];
|
|
63
|
+
for (let i = 5; i < path.length; i++) r = r[path[i]];
|
|
64
|
+
return r;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
let kid = 1, handlerId = 1;
|
|
70
|
+
|
|
71
|
+
const nextHandlerId = kid => `@@k-handler-${kid}-${handlerId++}`;
|
|
72
|
+
|
|
73
|
+
class KTReactiveLike {
|
|
74
|
+
kid=(() => kid++)();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
class KTReactive extends KTReactiveLike {
|
|
78
|
+
_value;
|
|
79
|
+
_changeHandlers=new Map;
|
|
80
|
+
constructor(value) {
|
|
81
|
+
super(), this._value = value;
|
|
82
|
+
}
|
|
83
|
+
get value() {
|
|
84
|
+
return this._value;
|
|
85
|
+
}
|
|
86
|
+
set value(_newValue) {
|
|
87
|
+
console.warn("[kt.js warn]", "Setting value to a non-ref instance takes no effect.");
|
|
88
|
+
}
|
|
89
|
+
_emit(newValue, oldValue) {
|
|
90
|
+
return this._changeHandlers.forEach(handler => handler(newValue, oldValue)), this;
|
|
91
|
+
}
|
|
92
|
+
addOnChange(handler, key = nextHandlerId(this.kid)) {
|
|
93
|
+
if (this._changeHandlers.has(key)) throw new Error(`[kt.js error] Overriding existing change handler with key ${$stringify(key)}.`);
|
|
94
|
+
return this._changeHandlers.set(key, handler), this;
|
|
95
|
+
}
|
|
96
|
+
removeOnChange(key) {
|
|
97
|
+
return this._changeHandlers.delete(key), this;
|
|
98
|
+
}
|
|
99
|
+
clearOnChange() {
|
|
100
|
+
return this._changeHandlers.clear(), this;
|
|
101
|
+
}
|
|
102
|
+
notify() {
|
|
103
|
+
return this._emit(this._value, this._value);
|
|
104
|
+
}
|
|
105
|
+
map(calculator, dependencies) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
is(o) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
match(o) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
get(..._keys) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
class KTSubReactive extends KTReactiveLike {
|
|
120
|
+
source;
|
|
121
|
+
_value;
|
|
122
|
+
_getter;
|
|
123
|
+
_handler;
|
|
124
|
+
_handlerKeys;
|
|
125
|
+
constructor(source, getter) {
|
|
126
|
+
super(), this.source = source, this._getter = getter, this._handlerKeys = [], this._value = this._getter(source._value),
|
|
127
|
+
this._handler = () => this._value = getter(source._value), this._handlerKeys.push(nextHandlerId(this.kid)),
|
|
128
|
+
source.addOnChange(this._handler, this._handlerKeys[0]);
|
|
129
|
+
}
|
|
130
|
+
addOnChange(handler, key = nextHandlerId(this.kid)) {
|
|
131
|
+
return this._handlerKeys.push(key), this.source.addOnChange((newValue, oldValue) => handler(this._getter(newValue), this._getter(oldValue)), key),
|
|
132
|
+
this;
|
|
133
|
+
}
|
|
134
|
+
removeOnChange(key) {
|
|
135
|
+
return this.source.removeOnChange(key), this;
|
|
136
|
+
}
|
|
137
|
+
dispose() {
|
|
138
|
+
this._handlerKeys.forEach(key => this.source.removeOnChange(key));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
39
142
|
class KTAnchor extends Comment {
|
|
40
143
|
isKTAnchor=!0;
|
|
41
144
|
list=[];
|
|
@@ -90,15 +193,11 @@ const $cleanupRemovedNode = node => {
|
|
|
90
193
|
for (let i = cleanups.length - 1; i >= 0; i--) try {
|
|
91
194
|
cleanups[i]();
|
|
92
195
|
} catch (error) {
|
|
93
|
-
console.error("[
|
|
196
|
+
console.error("[kt.js error]", "KTNodeCleanup:", error);
|
|
94
197
|
}
|
|
95
198
|
}
|
|
96
|
-
}, $addNodeCleanup = (node, cleanup) =>
|
|
97
|
-
|
|
98
|
-
const cleanups = nodeToCleanups.get(node);
|
|
99
|
-
return cleanups ? cleanups.push(cleanup) : nodeToCleanups.set(node, [ cleanup ]),
|
|
100
|
-
cleanup;
|
|
101
|
-
}, $removeNodeCleanup = (node, cleanup) => {
|
|
199
|
+
}, $addNodeCleanup = (node, cleanup) => ($ensureAnchorObserver(), nodeToCleanups.getOrInsert(node, []).push(cleanup),
|
|
200
|
+
cleanup), $removeNodeCleanup = (node, cleanup) => {
|
|
102
201
|
const cleanups = nodeToCleanups.get(node);
|
|
103
202
|
if (!cleanups) return;
|
|
104
203
|
const index = cleanups.indexOf(cleanup);
|
|
@@ -144,7 +243,7 @@ const $cleanupRemovedNode = node => {
|
|
|
144
243
|
|
|
145
244
|
function applyAttr(element, attr) {
|
|
146
245
|
if (attr) {
|
|
147
|
-
if ("object" != typeof attr || null === attr) throw new Error("[
|
|
246
|
+
if ("object" != typeof attr || null === attr) throw new Error("[kt.js error] attr must be an object.");
|
|
148
247
|
!function(element, attr) {
|
|
149
248
|
const classValue = attr.class || attr.className;
|
|
150
249
|
void 0 !== classValue && (isKT(classValue) ? (element.setAttribute("class", classValue.value),
|
|
@@ -153,11 +252,12 @@ function applyAttr(element, attr) {
|
|
|
153
252
|
if (style && ("string" == typeof style ? element.setAttribute("style", style) : "object" == typeof style && (isKT(style) ? (setElementStyle(element, style.value),
|
|
154
253
|
addReactiveCleanup(element, style, v => setElementStyle(element, v))) : setElementStyle(element, style))),
|
|
155
254
|
"k-html" in attr) {
|
|
156
|
-
const html = attr["k-html"]
|
|
157
|
-
|
|
158
|
-
element.innerHTML = value;
|
|
159
|
-
|
|
160
|
-
|
|
255
|
+
const html = attr["k-html"];
|
|
256
|
+
if (isKT(html)) {
|
|
257
|
+
element.innerHTML = html.value;
|
|
258
|
+
const key = nextHandlerId(html.kid);
|
|
259
|
+
html.addOnChange(v => element.innerHTML = v, key), $addNodeCleanup(element, () => html.removeOnChange(key));
|
|
260
|
+
} else element.innerHTML = html;
|
|
161
261
|
}
|
|
162
262
|
for (const key in attr) {
|
|
163
263
|
if ("k-model" === key || "k-for" === key || "k-key" === key || "ref" === key || "class" === key || "className" === key || "style" === key || "children" === key || "k-html" === key) continue;
|
|
@@ -215,7 +315,7 @@ function applyContent(element, content) {
|
|
|
215
315
|
}
|
|
216
316
|
|
|
217
317
|
function applyKModel(element, valueRef) {
|
|
218
|
-
if (!isRefLike(valueRef)) throw new Error("[
|
|
318
|
+
if (!isRefLike(valueRef)) throw new Error("[kt.js error] k-model value must be a KTRefLike.");
|
|
219
319
|
if ("INPUT" !== element.tagName) {
|
|
220
320
|
if ("SELECT" === element.tagName || "TEXTAREA" === element.tagName) {
|
|
221
321
|
element.value = valueRef.value ?? "";
|
|
@@ -224,7 +324,7 @@ function applyKModel(element, valueRef) {
|
|
|
224
324
|
$addNodeCleanup(element, () => element.removeEventListener("change", onChange)),
|
|
225
325
|
void $addNodeCleanup(element, () => valueRef.removeOnChange(onValueChange));
|
|
226
326
|
}
|
|
227
|
-
console.warn("[
|
|
327
|
+
console.warn("[kt.js warn]", "not supported element for k-model:");
|
|
228
328
|
} else if ("radio" === element.type || "checkbox" === element.type) {
|
|
229
329
|
element.checked = Boolean(valueRef.value);
|
|
230
330
|
const onChange = () => valueRef.value = element.checked, onValueChange = newValue => element.checked = newValue;
|
|
@@ -249,123 +349,32 @@ function applyKModel(element, valueRef) {
|
|
|
249
349
|
* ## About
|
|
250
350
|
* @package @ktjs/core
|
|
251
351
|
* @author Kasukabe Tsumugi <futami16237@gmail.com>
|
|
252
|
-
* @version 0.
|
|
352
|
+
* @version 0.38.1 (Last Update: 2026.04.07 17:46:25.204)
|
|
253
353
|
* @license MIT
|
|
254
354
|
* @link https://github.com/baendlorel/kt.js
|
|
255
355
|
* @link https://baendlorel.github.io/ Welcome to my site!
|
|
256
356
|
* @description Core functionality for kt.js - DOM manipulation utilities with JSX/TSX support
|
|
257
357
|
* @copyright Copyright (c) 2026 Kasukabe Tsumugi. All rights reserved.
|
|
258
358
|
*/ const h = (tag, attr, content) => {
|
|
259
|
-
if ("string" != typeof tag) throw new Error("[
|
|
359
|
+
if ("string" != typeof tag) throw new Error("[kt.js error] tagName must be a string.");
|
|
260
360
|
const element = document.createElement(tag);
|
|
261
361
|
return "object" == typeof attr && null !== attr && "k-model" in attr && applyKModel(element, attr["k-model"]),
|
|
262
362
|
applyAttr(element, attr), applyContent(element, content), element;
|
|
263
363
|
}, svg$1 = (tag, attr, content) => {
|
|
264
|
-
if ("string" != typeof tag) throw new Error("[
|
|
364
|
+
if ("string" != typeof tag) throw new Error("[kt.js error] tagName must be a string.");
|
|
265
365
|
const element = document.createElementNS("http://www.w3.org/2000/svg", tag);
|
|
266
366
|
return applyAttr(element, attr), applyContent(element, content), "object" == typeof attr && null !== attr && "k-model" in attr && applyKModel(element, attr["k-model"]),
|
|
267
367
|
element;
|
|
268
368
|
}, mathml$1 = (tag, attr, content) => {
|
|
269
|
-
if ("string" != typeof tag) throw new Error("[
|
|
369
|
+
if ("string" != typeof tag) throw new Error("[kt.js error] tagName must be a string.");
|
|
270
370
|
const element = document.createElementNS("http://www.w3.org/1998/Math/MathML", tag);
|
|
271
371
|
return applyAttr(element, attr), applyContent(element, content), "object" == typeof attr && null !== attr && "k-model" in attr && applyKModel(element, attr["k-model"]),
|
|
272
372
|
element;
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
let kid = 1, handlerId = 1;
|
|
276
|
-
|
|
277
|
-
class KTReactiveLike {
|
|
278
|
-
kid=kid++;
|
|
279
|
-
map(calculator, dependencies) {
|
|
280
|
-
return null;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
class KTReactive extends KTReactiveLike {
|
|
285
|
-
_value;
|
|
286
|
-
_changeHandlers=new Map;
|
|
287
|
-
constructor(value) {
|
|
288
|
-
super(), this._value = value;
|
|
289
|
-
}
|
|
290
|
-
get value() {
|
|
291
|
-
return this._value;
|
|
292
|
-
}
|
|
293
|
-
set value(_newValue) {
|
|
294
|
-
console.warn("[@ktjs/core warn]", "Setting value to a non-ref instance takes no effect.");
|
|
295
|
-
}
|
|
296
|
-
_emit(newValue, oldValue) {
|
|
297
|
-
return this._changeHandlers.forEach(handler => handler(newValue, oldValue)), this;
|
|
298
|
-
}
|
|
299
|
-
addOnChange(handler, key) {
|
|
300
|
-
if (key ??= handlerId++, this._changeHandlers.has(key)) throw new Error(`[@ktjs/core error] Overriding existing change handler with key ${$stringify(key)}.`);
|
|
301
|
-
return this._changeHandlers.set(key, handler), this;
|
|
302
|
-
}
|
|
303
|
-
removeOnChange(key) {
|
|
304
|
-
return this._changeHandlers.delete(key), this;
|
|
305
|
-
}
|
|
306
|
-
clearOnChange() {
|
|
307
|
-
return this._changeHandlers.clear(), this;
|
|
308
|
-
}
|
|
309
|
-
notify() {
|
|
310
|
-
return this._emit(this._value, this._value);
|
|
311
|
-
}
|
|
312
|
-
get(..._keys) {
|
|
313
|
-
return null;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
class KTSubReactive extends KTReactiveLike {
|
|
318
|
-
source;
|
|
319
|
-
_getter;
|
|
320
|
-
constructor(source, paths) {
|
|
321
|
-
super(), this.source = source, this._getter = (path => {
|
|
322
|
-
switch (path.length) {
|
|
323
|
-
case 1:
|
|
324
|
-
return s => s[path[0]];
|
|
325
|
-
|
|
326
|
-
case 2:
|
|
327
|
-
return s => s[path[0]][path[1]];
|
|
328
|
-
|
|
329
|
-
case 3:
|
|
330
|
-
return s => s[path[0]][path[1]][path[2]];
|
|
331
|
-
|
|
332
|
-
case 4:
|
|
333
|
-
return s => s[path[0]][path[1]][path[2]][path[3]];
|
|
334
|
-
|
|
335
|
-
case 5:
|
|
336
|
-
return s => s[path[0]][path[1]][path[2]][path[3]][path[4]];
|
|
337
|
-
|
|
338
|
-
default:
|
|
339
|
-
return s => {
|
|
340
|
-
let r = s[path[0]][path[1]][path[2]][path[3]][path[4]];
|
|
341
|
-
for (let i = 5; i < path.length; i++) r = r[path[i]];
|
|
342
|
-
return r;
|
|
343
|
-
};
|
|
344
|
-
}
|
|
345
|
-
})(paths);
|
|
346
|
-
}
|
|
347
|
-
get value() {
|
|
348
|
-
return this._getter(this.source._value);
|
|
349
|
-
}
|
|
350
|
-
addOnChange(handler, key) {
|
|
351
|
-
return this.source.addOnChange((newSourceValue, oldSourceValue) => {
|
|
352
|
-
const oldValue = this._getter(oldSourceValue), newValue = this._getter(newSourceValue);
|
|
353
|
-
handler(newValue, oldValue);
|
|
354
|
-
}, key), this;
|
|
355
|
-
}
|
|
356
|
-
removeOnChange(key) {
|
|
357
|
-
return this.source.removeOnChange(key), this;
|
|
358
|
-
}
|
|
359
|
-
notify() {
|
|
360
|
-
return this.source.notify(), this;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
const reactiveToOldValue = new Map;
|
|
373
|
+
}, reactiveToOldValue = new Map;
|
|
365
374
|
|
|
366
375
|
let scheduled = !1;
|
|
367
376
|
|
|
368
|
-
const markMutation = reactive => {
|
|
377
|
+
const $markMutation = reactive => {
|
|
369
378
|
if (!reactiveToOldValue.has(reactive)) {
|
|
370
379
|
if (reactiveToOldValue.set(reactive, reactive._value), scheduled) return;
|
|
371
380
|
scheduled = !0, Promise.resolve().then(() => {
|
|
@@ -373,7 +382,7 @@ const markMutation = reactive => {
|
|
|
373
382
|
try {
|
|
374
383
|
reactive._changeHandlers.forEach(handler => handler(reactive.value, oldValue));
|
|
375
384
|
} catch (error) {
|
|
376
|
-
console.error("[
|
|
385
|
+
console.error("[kt.js error]", "KTScheduler:", error);
|
|
377
386
|
}
|
|
378
387
|
}), reactiveToOldValue.clear();
|
|
379
388
|
});
|
|
@@ -394,22 +403,14 @@ class KTRef extends KTReactive {
|
|
|
394
403
|
this._value = newValue, this._emit(newValue, oldValue);
|
|
395
404
|
}
|
|
396
405
|
get draft() {
|
|
397
|
-
return markMutation(this), this._value;
|
|
406
|
+
return $markMutation(this), this._value;
|
|
398
407
|
}
|
|
399
408
|
notify() {
|
|
400
409
|
return this._emit(this._value, this._value);
|
|
401
410
|
}
|
|
402
411
|
subref(...keys) {
|
|
403
|
-
if (0 === keys.length) throw new Error("[
|
|
404
|
-
return new KTSubRef(this, keys)
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
class KTSubRef extends KTSubReactive {
|
|
409
|
-
ktype=4;
|
|
410
|
-
_setter;
|
|
411
|
-
constructor(source, paths) {
|
|
412
|
-
super(source, paths), this._setter = (path => {
|
|
412
|
+
if (0 === keys.length) throw new Error("[kt.js error] At least one key is required to get a sub-ref.");
|
|
413
|
+
return new KTSubRef(this, $createSubGetter(keys), (path => {
|
|
413
414
|
switch (path.length) {
|
|
414
415
|
case 1:
|
|
415
416
|
return (s, newValue) => s[path[0]] = newValue;
|
|
@@ -433,19 +434,10 @@ class KTSubRef extends KTSubReactive {
|
|
|
433
434
|
r[path[path.length - 1]] = newValue;
|
|
434
435
|
};
|
|
435
436
|
}
|
|
436
|
-
})(
|
|
437
|
-
}
|
|
438
|
-
get value() {
|
|
439
|
-
return this._getter(this.source._value);
|
|
437
|
+
})(keys));
|
|
440
438
|
}
|
|
441
|
-
|
|
442
|
-
this.
|
|
443
|
-
}
|
|
444
|
-
get draft() {
|
|
445
|
-
return markMutation(this.source), this._getter(this.source._value);
|
|
446
|
-
}
|
|
447
|
-
notify() {
|
|
448
|
-
return this.source.notify(), this;
|
|
439
|
+
dispose() {
|
|
440
|
+
this._changeHandlers.clear();
|
|
449
441
|
}
|
|
450
442
|
}
|
|
451
443
|
|
|
@@ -453,21 +445,39 @@ const ref = value => new KTRef(value), assertModel = (props, defaultValue) => {
|
|
|
453
445
|
if ("k-model" in props) {
|
|
454
446
|
const kmodel = props["k-model"];
|
|
455
447
|
if (isRefLike(kmodel)) return kmodel;
|
|
456
|
-
throw new Error("[
|
|
448
|
+
throw new Error("[kt.js error] k-model data must be a KTRef object, please use 'ref(...)' to wrap it.");
|
|
457
449
|
}
|
|
458
450
|
return ref(defaultValue);
|
|
459
451
|
}, $refSetter = (props, node) => props.ref.value = node, $initRef = (props, node) => {
|
|
460
452
|
if (!("ref" in props)) return $emptyFn;
|
|
461
453
|
const r = props.ref;
|
|
462
454
|
if (isRefLike(r)) return r.value = node, $refSetter;
|
|
463
|
-
throw new Error("[
|
|
455
|
+
throw new Error("[kt.js error] Fragment: ref must be a KTRef");
|
|
464
456
|
};
|
|
465
457
|
|
|
458
|
+
class KTSubRef extends KTSubReactive {
|
|
459
|
+
ktype=4;
|
|
460
|
+
_setter;
|
|
461
|
+
constructor(source, getter, setter) {
|
|
462
|
+
super(source, getter), this._setter = setter;
|
|
463
|
+
}
|
|
464
|
+
get value() {
|
|
465
|
+
return this._value;
|
|
466
|
+
}
|
|
467
|
+
set value(newValue) {
|
|
468
|
+
this._value = newValue, this._setter(this.source._value, newValue), this.source.notify();
|
|
469
|
+
}
|
|
470
|
+
get draft() {
|
|
471
|
+
return $markMutation(this.source), this._value;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
466
475
|
class KTComputed extends KTReactive {
|
|
467
476
|
ktype=8;
|
|
468
477
|
_calculator;
|
|
469
478
|
_dependencies;
|
|
470
|
-
|
|
479
|
+
_handler;
|
|
480
|
+
_handlerKeys;
|
|
471
481
|
_disposed=!1;
|
|
472
482
|
_recalculate(forced = !1) {
|
|
473
483
|
const newValue = this._calculator(), oldValue = this._value;
|
|
@@ -476,35 +486,60 @@ class KTComputed extends KTReactive {
|
|
|
476
486
|
}
|
|
477
487
|
constructor(calculator, dependencies) {
|
|
478
488
|
super(calculator()), this._calculator = calculator, this._dependencies = dependencies,
|
|
479
|
-
this.
|
|
480
|
-
|
|
489
|
+
this._handler = () => this._recalculate(), this._handlerKeys = dependencies.map(() => nextHandlerId(this.kid));
|
|
490
|
+
const uniqueSources = new Set;
|
|
491
|
+
for (let i = 0; i < dependencies.length; i++) {
|
|
492
|
+
const dep = dependencies[i];
|
|
493
|
+
if (isSubReactive(dep)) {
|
|
494
|
+
if (uniqueSources.has(dep.source)) continue;
|
|
495
|
+
uniqueSources.add(dep.source);
|
|
496
|
+
}
|
|
497
|
+
dep.addOnChange(this._handler, this._handlerKeys[i]);
|
|
498
|
+
}
|
|
499
|
+
uniqueSources.clear();
|
|
481
500
|
}
|
|
482
501
|
notify() {
|
|
483
502
|
return this._recalculate(!0);
|
|
484
503
|
}
|
|
485
504
|
dispose() {
|
|
486
|
-
if (this._disposed)
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
505
|
+
if (!this._disposed) {
|
|
506
|
+
this._disposed = !0;
|
|
507
|
+
for (let i = 0; i < this._dependencies.length; i++) this._dependencies[i].removeOnChange(this._handlerKeys[i]);
|
|
508
|
+
this._dependencies.length = 0, this._changeHandlers.clear();
|
|
509
|
+
}
|
|
490
510
|
}
|
|
491
511
|
}
|
|
492
512
|
|
|
493
|
-
|
|
513
|
+
KTReactive.prototype.map = function(c, dep) {
|
|
494
514
|
return new KTComputed(() => c(this.value), dep ? [ this, ...dep ] : [ this ]);
|
|
515
|
+
}, KTReactive.prototype.is = function(o) {
|
|
516
|
+
return isReactive(o) ? new KTSubComputed(this, v => $is(v, o.value), o) : new KTSubComputed(this, v => $is(v, o));
|
|
517
|
+
}, KTReactive.prototype.match = function(o) {
|
|
518
|
+
return isReactive(o) ? new KTSubComputed(this, v => $deepMatch(v, o.value), o) : new KTSubComputed(this, v => $deepMatch(v, o));
|
|
495
519
|
}, KTReactive.prototype.get = function(...keys) {
|
|
496
|
-
if (0 === keys.length) throw new Error("[
|
|
497
|
-
return new KTSubComputed(this, keys);
|
|
520
|
+
if (0 === keys.length) throw new Error("[kt.js error] At least one key is required to get a sub-computed.");
|
|
521
|
+
return new KTSubComputed(this, $createSubGetter(keys));
|
|
498
522
|
};
|
|
499
523
|
|
|
524
|
+
const computed = (calculator, dependencies) => new KTComputed(calculator, dependencies);
|
|
525
|
+
|
|
500
526
|
class KTSubComputed extends KTSubReactive {
|
|
501
527
|
ktype=16;
|
|
528
|
+
_dependency;
|
|
529
|
+
constructor(source, getter, dependency) {
|
|
530
|
+
super(source, getter), this._dependency = dependency, dependency && (this._handlerKeys.push(nextHandlerId(this.kid)),
|
|
531
|
+
dependency.addOnChange(this._handler, this._handlerKeys[1]));
|
|
532
|
+
}
|
|
533
|
+
get value() {
|
|
534
|
+
return this._value;
|
|
535
|
+
}
|
|
536
|
+
dispose() {
|
|
537
|
+
this._handlerKeys.forEach(key => this.source.removeOnChange(key)), this._dependency?.removeOnChange(this._handlerKeys[1]);
|
|
538
|
+
}
|
|
502
539
|
}
|
|
503
540
|
|
|
504
|
-
const computed = (calculator, dependencies) => new KTComputed(calculator, dependencies);
|
|
505
|
-
|
|
506
541
|
function effect(effectFn, reactives, options) {
|
|
507
|
-
const {lazy: lazy = !1, onCleanup: onCleanup = $emptyFn, debugName: debugName = ""} = Object(options);
|
|
542
|
+
const {lazy: lazy = !1, onCleanup: onCleanup = $emptyFn, debugName: debugName = ""} = Object(options), listenerKeys = [];
|
|
508
543
|
let active = !0;
|
|
509
544
|
const run = () => {
|
|
510
545
|
if (active) {
|
|
@@ -512,11 +547,15 @@ function effect(effectFn, reactives, options) {
|
|
|
512
547
|
try {
|
|
513
548
|
effectFn();
|
|
514
549
|
} catch (err) {
|
|
515
|
-
console.debug("[
|
|
550
|
+
console.debug("[kt.js debug]", "effect error:", debugName, err);
|
|
516
551
|
}
|
|
517
552
|
}
|
|
518
553
|
};
|
|
519
|
-
for (let i = 0; i < reactives.length; i++)
|
|
554
|
+
for (let i = 0; i < reactives.length; i++) {
|
|
555
|
+
listenerKeys[i] = i;
|
|
556
|
+
const r = reactives[i];
|
|
557
|
+
isSubReactive(r) ? r.source._changeHandlers.set(listenerKeys[i], run) : r.addOnChange(run, effectFn);
|
|
558
|
+
}
|
|
520
559
|
return lazy || run(), () => {
|
|
521
560
|
if (active) {
|
|
522
561
|
active = !1;
|
|
@@ -546,7 +585,7 @@ class FragmentAnchor extends KTAnchor {
|
|
|
546
585
|
const jsxh = (tag, props) => "function" == typeof tag ? tag(props) : h(tag, props, props.children), placeholder = data => document.createComment(data);
|
|
547
586
|
|
|
548
587
|
function create(creator, tag, props) {
|
|
549
|
-
if (props.ref && isComputedLike(props.ref)) throw new Error("[
|
|
588
|
+
if (props.ref && isComputedLike(props.ref)) throw new Error("[kt.js error] Cannot assign a computed value to an element.");
|
|
550
589
|
const el = creator(tag, props, props.children);
|
|
551
590
|
return $initRef(props, el), el;
|
|
552
591
|
}
|
|
@@ -564,7 +603,7 @@ function Fragment(props) {
|
|
|
564
603
|
return span.textContent = String(child), void elements.push(span);
|
|
565
604
|
}
|
|
566
605
|
if (child instanceof Element) elements.push(child); else {
|
|
567
|
-
if (!isKT(child)) throw console.warn("[
|
|
606
|
+
if (!isKT(child)) throw console.warn("[kt.js warn]", "Fragment: unsupported child type", child),
|
|
568
607
|
new Error("Fragment: unsupported child type");
|
|
569
608
|
processChild(child.value);
|
|
570
609
|
}
|
|
@@ -613,7 +652,7 @@ class KTForAnchor extends KTAnchor {
|
|
|
613
652
|
}
|
|
614
653
|
|
|
615
654
|
const setForNodeMap = (nodeMap, key, node, index) => {
|
|
616
|
-
nodeMap.has(key) && console.error("[
|
|
655
|
+
nodeMap.has(key) && console.error("[kt.js error]", `[KTFor] Duplicate key detected at index ${index}. Later items override earlier ones. key=${String(key)}`),
|
|
617
656
|
nodeMap.set(key, node);
|
|
618
657
|
};
|
|
619
658
|
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/reactable/common.ts","../src/jsx/anchor.ts","../src/h/attr-helpers.ts","../src/h/attr.ts","../src/h/content.ts","../src/h/model.ts","../src/h/index.ts","../src/reactable/reactive.ts","../src/reactable/scheduler.ts","../src/reactable/ref.ts","../src/reactable/computed.ts","../src/reactable/effect.ts","../src/reactable/index.ts","../src/jsx/fragment.ts","../src/jsx/common.ts","../src/jsx/jsx-runtime.ts","../src/jsx/async.ts","../src/jsx/for.ts","../src/jsx/if.ts"],"sourcesContent":["import { KTReactiveLike, KTReactiveType, type KTReactive } from './reactive.js';\nimport type { KTRef, KTRefLike, KTSubRef } from './ref.js';\nimport type { KTComputed, KTComputedLike, KTSubComputed } from './computed.js';\n\n// # type guards\nexport function isKT<T = any>(obj: any): obj is KTReactiveLike<T> {\n return typeof obj?.kid === 'number';\n}\nexport function isReactiveLike<T = any>(obj: any): obj is KTReactiveLike<T> {\n if (typeof obj?.ktype === 'number') {\n return (obj.ktype & KTReactiveType.ReactiveLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isRef<T = any>(obj: any): obj is KTRef<T> {\n if (typeof obj?.ktype === 'number') {\n return obj.ktype === KTReactiveType.Ref;\n } else {\n return false;\n }\n}\n\nexport function isSubRef<T = any>(obj: any): obj is KTSubRef<T> {\n if (typeof obj?.ktype === 'number') {\n return obj.ktype === KTReactiveType.SubRef;\n } else {\n return false;\n }\n}\n\nexport function isRefLike<T = any>(obj: any): obj is KTRefLike<T> {\n if (typeof obj?.ktype === 'number') {\n return (obj.ktype & KTReactiveType.RefLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isComputed<T = any>(obj: any): obj is KTComputed<T> {\n if (typeof obj?.ktype === 'number') {\n return obj.ktype === KTReactiveType.Computed;\n } else {\n return false;\n }\n}\n\nexport function isSubComputed<T = any>(obj: any): obj is KTSubComputed<T> {\n if (typeof obj?.ktype === 'number') {\n return obj.ktype === KTReactiveType.SubComputed;\n } else {\n return false;\n }\n}\n\nexport function isComputedLike<T = any>(obj: any): obj is KTComputedLike<T> {\n if (typeof obj?.ktype === 'number') {\n return (obj.ktype & KTReactiveType.ComputedLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isReactive<T = any>(obj: any): obj is KTReactive<T> {\n if (typeof obj?.ktype === 'number') {\n return (obj.ktype & KTReactiveType.Reactive) !== 0;\n } else {\n return false;\n }\n}\n\n// # sub getter/setter factory\n\ntype SubGetter = (s: any) => any;\ntype SubSetter = (s: any, newValue: any) => void;\n\n/**\n * Create a value getter which params is `reactive.value`(or `ref.draft`)\n */\nexport const $createSubGetter = (path: Array<string | number>): SubGetter => {\n // & path.length is guaranteed to be greater than 0 in `KTReactive.get` and `KTRef.get`\n switch (path.length) {\n // ? Does it use less memory if we write this:\n // const [k2_0, k2_1] = path;\n // return (s) => s[k2_0][k2_1];\n case 1:\n return (s) => s[path[0]];\n case 2:\n return (s) => s[path[0]][path[1]];\n case 3:\n return (s) => s[path[0]][path[1]][path[2]];\n case 4:\n return (s) => s[path[0]][path[1]][path[2]][path[3]];\n case 5:\n return (s) => s[path[0]][path[1]][path[2]][path[3]][path[4]];\n default:\n return (s) => {\n let r = s[path[0]][path[1]][path[2]][path[3]][path[4]];\n for (let i = 5; i < path.length; i++) {\n r = r[path[i]];\n }\n return r;\n };\n }\n};\n\n/**\n * Create a value setter which params is `reactive.value`(or `ref.draft`)\n */\nexport const $createSubSetter = (path: Array<string | number>): SubSetter => {\n switch (path.length) {\n case 1:\n return (s, newValue) => (s[path[0]] = newValue);\n case 2:\n return (s, newValue) => (s[path[0]][path[1]] = newValue);\n case 3:\n return (s, newValue) => (s[path[0]][path[1]][path[2]] = newValue);\n case 4:\n return (s, newValue) => (s[path[0]][path[1]][path[2]][path[3]] = newValue);\n case 5:\n return (s, newValue) => (s[path[0]][path[1]][path[2]][path[3]][path[4]] = newValue);\n default:\n return (s, newValue) => {\n let r = s[path[0]][path[1]][path[2]][path[3]][path[4]];\n for (let i = 5; i < path.length - 1; i++) {\n r = r[path[i]];\n }\n r[path[path.length - 1]] = newValue;\n };\n }\n};\n","export const enum AnchorType {\n Fragment = 'kt-fragment',\n For = 'kt-for',\n}\n\nexport abstract class KTAnchor<T extends Node = Node> extends Comment {\n readonly isKTAnchor: true = true;\n readonly list: T[] = [];\n abstract readonly type: AnchorType;\n mountCallback?: () => void;\n\n constructor(data: AnchorType) {\n super(data);\n $ensureAnchorObserver();\n }\n\n mount(parent?: Node) {\n if (parent && this.parentNode !== parent) {\n parent.appendChild(this);\n }\n if (this.parentNode) {\n this.mountCallback?.();\n }\n }\n}\n\ntype MountableKTAnchor = Node & {\n isKTAnchor?: true;\n mount?: (parent?: Node) => void;\n};\ntype NodeCleanup = () => void;\n\nconst CANNOT_MOUNT = typeof document === 'undefined' || typeof Node === 'undefined';\nconst CANNOT_OBSERVE = CANNOT_MOUNT || typeof MutationObserver === 'undefined';\nconst COMMENT_FILTER = typeof NodeFilter === 'undefined' ? 0x80 : NodeFilter.SHOW_COMMENT;\nconst ELEMENT_NODE = 1;\nconst DOCUMENT_FRAGMENT_NODE = 11;\nconst nodeToCleanups = new WeakMap<Node, NodeCleanup[]>();\nlet anchorObserver: MutationObserver | undefined;\n\nconst $cleanupRemovedNode = (node: Node) => {\n if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const children = Array.from(node.childNodes);\n for (let i = 0; i < children.length; i++) {\n $cleanupRemovedNode(children[i]);\n }\n }\n\n const anchor = node as KTAnchor<Node>;\n if (anchor.isKTAnchor === true) {\n const list = anchor.list.slice();\n anchor.list.length = 0;\n for (let i = 0; i < list.length; i++) {\n const listNode = list[i] as ChildNode;\n if (listNode.parentNode) {\n listNode.remove();\n }\n $cleanupRemovedNode(listNode);\n }\n }\n\n $runNodeCleanups(node);\n};\n\nconst $ensureAnchorObserver = () => {\n if (CANNOT_OBSERVE || anchorObserver || !document.body) {\n return;\n }\n\n anchorObserver = new MutationObserver((records) => {\n if (typeof document === 'undefined') {\n anchorObserver?.disconnect();\n anchorObserver = undefined;\n return;\n }\n\n for (let i = 0; i < records.length; i++) {\n const addedNodes = records[i].addedNodes;\n for (let j = 0; j < addedNodes.length; j++) {\n $mountFragmentAnchors(addedNodes[j]);\n }\n\n const removedNodes = records[i].removedNodes;\n for (let j = 0; j < removedNodes.length; j++) {\n $cleanupRemovedNode(removedNodes[j]);\n }\n }\n });\n anchorObserver.observe(document.body, { childList: true, subtree: true });\n};\n\nconst $mountIfFragmentAnchor = (node: Node) => {\n const anchor = node as MountableKTAnchor;\n if (anchor.isKTAnchor === true && typeof anchor.mount === 'function') {\n anchor.mount();\n }\n};\n\nconst $runNodeCleanups = (node: Node) => {\n const cleanups = nodeToCleanups.get(node);\n if (!cleanups) {\n return;\n }\n\n nodeToCleanups.delete(node);\n for (let i = cleanups.length - 1; i >= 0; i--) {\n try {\n cleanups[i]();\n } catch (error) {\n $error('KTNodeCleanup:', error);\n }\n }\n};\n\nexport const $addNodeCleanup = (node: Node, cleanup: NodeCleanup) => {\n $ensureAnchorObserver();\n const cleanups = nodeToCleanups.get(node);\n if (cleanups) {\n cleanups.push(cleanup);\n } else {\n nodeToCleanups.set(node, [cleanup]);\n }\n return cleanup;\n};\n\nexport const $removeNodeCleanup = (node: Node, cleanup: NodeCleanup) => {\n const cleanups = nodeToCleanups.get(node);\n if (!cleanups) {\n return;\n }\n\n const index = cleanups.indexOf(cleanup);\n if (index === -1) {\n return;\n }\n\n cleanups.splice(index, 1);\n if (cleanups.length === 0) {\n nodeToCleanups.delete(node);\n }\n};\n\nexport const $mountFragmentAnchors = (node: unknown) => {\n if (CANNOT_MOUNT || typeof document === 'undefined' || !node || typeof (node as any).nodeType !== 'number') {\n return;\n }\n\n const nodeObj = node as Node;\n $mountIfFragmentAnchor(nodeObj);\n\n if (nodeObj.nodeType !== ELEMENT_NODE && nodeObj.nodeType !== DOCUMENT_FRAGMENT_NODE) {\n return;\n }\n\n const walker = document.createTreeWalker(nodeObj, COMMENT_FILTER);\n let current = walker.nextNode();\n while (current) {\n $mountIfFragmentAnchor(current);\n current = walker.nextNode();\n }\n};\n","const booleanHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => {\n if (key in element) {\n (element as any)[key] = !!value;\n } else {\n element.setAttribute(key, value);\n }\n};\n\nconst valueHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => {\n if (key in element) {\n (element as any)[key] = value;\n } else {\n element.setAttribute(key, value);\n }\n};\n\n// Attribute handlers map for optimized lookup\nexport const handlers: Record<\n string,\n (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => void\n> = {\n checked: booleanHandler,\n selected: booleanHandler,\n value: valueHandler,\n valueAsDate: valueHandler,\n valueAsNumber: valueHandler,\n defaultValue: valueHandler,\n defaultChecked: booleanHandler,\n defaultSelected: booleanHandler,\n disabled: booleanHandler,\n readOnly: booleanHandler,\n multiple: booleanHandler,\n required: booleanHandler,\n autofocus: booleanHandler,\n open: booleanHandler,\n controls: booleanHandler,\n autoplay: booleanHandler,\n loop: booleanHandler,\n muted: booleanHandler,\n defer: booleanHandler,\n async: booleanHandler,\n hidden: (element, _key, value) => ((element as HTMLElement).hidden = !!value),\n};\n","import type { KTReactifyProps } from '../reactable/types.js';\nimport type { KTRawAttr, KTAttribute } from '../types/h.js';\nimport { isKT } from '../reactable/common.js';\nimport { $addNodeCleanup } from '../jsx/anchor.js';\nimport { handlers } from './attr-helpers.js';\n\nconst defaultHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) =>\n element.setAttribute(key, value);\n\nconst setElementStyle = (\n element: HTMLElement | SVGElement | MathMLElement,\n style: Partial<CSSStyleDeclaration> | string,\n) => {\n if (typeof style === 'string') {\n (element as HTMLElement).style.cssText = style;\n return;\n }\n\n for (const key in style) {\n (element as any).style[key as any] = style[key];\n }\n};\n\nconst addReactiveCleanup = (\n element: HTMLElement | SVGElement | MathMLElement,\n reactive: {\n addOnChange: (handler: (value: any) => void, key?: any) => unknown;\n removeOnChange: (key: any) => unknown;\n },\n handler: (value: any) => void,\n) => {\n reactive.addOnChange(handler, handler);\n $addNodeCleanup(element, () => reactive.removeOnChange(handler));\n};\n\nfunction attrIsObject(element: HTMLElement | SVGElement | MathMLElement, attr: KTReactifyProps<KTAttribute>) {\n const classValue = attr.class || attr.className;\n if (classValue !== undefined) {\n if (isKT<string>(classValue)) {\n element.setAttribute('class', classValue.value);\n addReactiveCleanup(element, classValue, (v) => element.setAttribute('class', v));\n } else {\n element.setAttribute('class', classValue);\n }\n }\n\n const style = attr.style;\n if (style) {\n if (typeof style === 'string') {\n element.setAttribute('style', style);\n } else if (typeof style === 'object') {\n if (isKT(style)) {\n setElementStyle(element, style.value);\n addReactiveCleanup(element, style, (v: Partial<CSSStyleDeclaration> | string) => setElementStyle(element, v));\n } else {\n setElementStyle(element, style as Partial<CSSStyleDeclaration>);\n }\n }\n }\n\n // ! Security: `k-html` is an explicit raw HTML escape hatch. kt.js intentionally does not sanitize here; callers must pass only trusted HTML.\n if ('k-html' in attr) {\n const html = attr['k-html'];\n // ?? 这是要干嘛啊\n const setHTML = (value: any) => {\n while (element.firstChild) {\n element.firstChild.remove();\n }\n element.innerHTML = value;\n };\n if (isKT(html)) {\n setHTML(html.value);\n addReactiveCleanup(element, html, (v) => setHTML(v));\n } else {\n setHTML(html);\n }\n }\n\n for (const key in attr) {\n // & Arranged in order of usage frequency\n if (\n // key === 'k-if' ||\n // key === 'k-else' ||\n key === 'k-model' ||\n key === 'k-for' ||\n key === 'k-key' ||\n key === 'ref' ||\n key === 'class' ||\n key === 'className' ||\n key === 'style' ||\n key === 'children' ||\n key === 'k-html'\n ) {\n continue;\n }\n\n const o = attr[key];\n\n // normal event handler\n if (key.startsWith('on:')) {\n if (o) {\n const eventName = key.slice(3);\n element.addEventListener(eventName, o); // chop off the `on:`\n $addNodeCleanup(element, () => element.removeEventListener(eventName, o));\n }\n continue;\n }\n\n // normal attributes\n // Security: all non-`on:` attributes are forwarded as-is.\n // Dangerous values such as raw `on*`, `href`, `src`, `srcdoc`, SVG href, etc.\n // remain the caller's responsibility.\n const handler = handlers[key] || defaultHandler;\n if (isKT(o)) {\n handler(element, key, o.value);\n addReactiveCleanup(element, o, (v) => handler(element, key, v));\n } else {\n handler(element, key, o);\n }\n }\n}\n\nexport function applyAttr(element: HTMLElement | SVGElement | MathMLElement, attr: KTRawAttr) {\n if (!attr) {\n return;\n }\n if (typeof attr === 'object' && attr !== null) {\n attrIsObject(element, attr as KTAttribute);\n } else {\n $throw('attr must be an object.');\n }\n}\n","import { $isArray, $isNode, $isThenable } from '@ktjs/shared';\nimport type { KTAvailableContent, KTRawContent } from '../types/h.js';\nimport { isKT } from '../reactable/common.js';\nimport { AnchorType } from '../jsx/anchor.js';\nimport { $addNodeCleanup, $mountFragmentAnchors } from '../jsx/anchor.js';\n\nconst assureNode = (o: any) => ($isNode(o) ? o : document.createTextNode(o));\n\nfunction apdSingle(element: HTMLElement | DocumentFragment | SVGElement | MathMLElement, c: KTAvailableContent) {\n // & Ignores falsy values, consistent with React's behavior\n if (c === undefined || c === null || c === false) {\n return;\n }\n\n if (isKT(c)) {\n let node = assureNode(c.value);\n element.appendChild(node);\n const onChange = (newValue: KTAvailableContent) => {\n const newNode = assureNode(newValue);\n const oldNode = node;\n node = newNode;\n oldNode.replaceWith(newNode);\n $mountFragmentAnchors(newNode);\n };\n c.addOnChange(onChange, onChange);\n $addNodeCleanup(element, () => c.removeOnChange(onChange));\n } else {\n const node = assureNode(c);\n element.appendChild(node);\n const anchor = node as { type?: AnchorType; list?: any[] };\n if (anchor.type === AnchorType.For) {\n apd(element, anchor.list);\n }\n }\n}\n\nfunction apd(element: HTMLElement | DocumentFragment | SVGElement | MathMLElement, c: KTAvailableContent) {\n if ($isThenable(c)) {\n c.then((r) => apd(element, r));\n } else if ($isArray(c)) {\n for (let i = 0; i < c.length; i++) {\n // & might be thenable here too\n const ci = c[i];\n if ($isThenable(ci)) {\n const comment = document.createComment('ktjs-promise-placeholder');\n element.appendChild(comment);\n ci.then((awaited) => {\n if ($isNode(awaited)) {\n // ?? 难道不能都在observer回调里做吗\n comment.replaceWith(awaited);\n $mountFragmentAnchors(awaited);\n } else {\n const awaitedNode = assureNode(awaited);\n comment.replaceWith(awaitedNode);\n $mountFragmentAnchors(awaitedNode);\n }\n });\n } else {\n apdSingle(element, ci);\n }\n }\n } else {\n // & here is thened, so must be a simple elementj\n apdSingle(element, c);\n }\n}\n\nexport function applyContent(element: HTMLElement | SVGElement | MathMLElement, content: KTRawContent): void {\n if ($isArray(content)) {\n for (let i = 0; i < content.length; i++) {\n apd(element, content[i]);\n }\n } else {\n apd(element, content as KTAvailableContent);\n }\n}\n","import type { InputElementTag } from '@ktjs/shared';\nimport type { KTRefLike } from '../reactable/ref.js';\n\nimport { static_cast } from 'type-narrow';\nimport { isRefLike } from '../reactable/common.js';\nimport { $addNodeCleanup } from '../jsx/anchor.js';\n\nexport function applyKModel(element: HTMLElementTagNameMap[InputElementTag], valueRef: KTRefLike<any>) {\n if (!isRefLike(valueRef)) {\n $throw('k-model value must be a KTRefLike.');\n }\n\n if (element.tagName === 'INPUT') {\n static_cast<HTMLInputElement>(element);\n if (element.type === 'radio' || element.type === 'checkbox') {\n element.checked = Boolean(valueRef.value);\n const onChange = () => (valueRef.value = element.checked);\n const onValueChange = (newValue: boolean) => (element.checked = newValue);\n element.addEventListener('change', onChange);\n valueRef.addOnChange(onValueChange, onValueChange);\n $addNodeCleanup(element, () => element.removeEventListener('change', onChange));\n $addNodeCleanup(element, () => valueRef.removeOnChange(onValueChange));\n } else {\n element.value = valueRef.value ?? '';\n const onInput = () => (valueRef.value = element.value);\n const onValueChange = (newValue: string) => (element.value = newValue);\n element.addEventListener('input', onInput);\n valueRef.addOnChange(onValueChange, onValueChange);\n $addNodeCleanup(element, () => element.removeEventListener('input', onInput));\n $addNodeCleanup(element, () => valueRef.removeOnChange(onValueChange));\n }\n return;\n }\n\n if (element.tagName === 'SELECT' || element.tagName === 'TEXTAREA') {\n element.value = valueRef.value ?? '';\n const onChange = () => (valueRef.value = element.value);\n const onValueChange = (newValue: string) => (element.value = newValue);\n element.addEventListener('change', onChange);\n valueRef.addOnChange(onValueChange, onValueChange);\n $addNodeCleanup(element, () => element.removeEventListener('change', onChange));\n $addNodeCleanup(element, () => valueRef.removeOnChange(onValueChange));\n return;\n }\n\n $warn('not supported element for k-model:');\n}\n","import type { HTMLTag, MathMLTag, SVGTag } from '@ktjs/shared';\nimport type { KTRawAttr, KTRawContent, HTML } from '../types/h.js';\n\nimport { applyAttr } from './attr.js';\nimport { applyContent } from './content.js';\nimport { applyKModel } from './model.js';\n\n/**\n * Create an enhanced HTMLElement.\n * - Only supports HTMLElements, **NOT** SVGElements or other Elements.\n * @param tag tag of an `HTMLElement`\n * @param attr attribute object or className\n * @param content a string or an array of HTMLEnhancedElement as child nodes\n *\n * __PKG_INFO__\n */\nexport const h = <T extends HTMLTag | SVGTag | MathMLTag>(\n tag: T,\n attr?: KTRawAttr,\n content?: KTRawContent,\n): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElement(tag) as HTML<T>;\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n return element;\n};\n\nexport const svg = <T extends SVGTag>(tag: T, attr?: KTRawAttr, content?: KTRawContent): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElementNS('http://www.w3.org/2000/svg', tag) as HTML<T>;\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n return element;\n};\n\nexport const mathml = <T extends MathMLTag>(tag: T, attr?: KTRawAttr, content?: KTRawContent): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElementNS('http://www.w3.org/1998/Math/MathML', tag) as HTML<T>;\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n return element;\n};\n","import type { KTComputed, KTSubComputed } from './computed.js';\n\nimport { $stringify } from '@ktjs/shared';\nimport { $createSubGetter } from './common.js';\n\nexport type ChangeHandler<T> = (newValue: T, oldValue: T) => void;\n\nexport const enum KTReactiveType {\n ReactiveLike = 0b11111,\n Ref = 0b00010,\n SubRef = 0b00100,\n RefLike = Ref | SubRef,\n Computed = 0b01000,\n SubComputed = 0b10000,\n ComputedLike = Computed | SubComputed,\n Reactive = Ref | Computed,\n}\n\nlet kid = 1;\nlet handlerId = 1;\n\nexport abstract class KTReactiveLike<T> {\n readonly kid = kid++;\n\n abstract readonly ktype: KTReactiveType;\n\n abstract get value(): T;\n\n abstract addOnChange(handler: ChangeHandler<T>, key?: any): this;\n\n abstract removeOnChange(key: any): this;\n\n /**\n * Create a computed value via current reactive value.\n * - No matter `this` is added to `dependencies` or not, it is always listened.\n * @param calculator A function that generates a new value based on current value.\n * @param dependencies optional other dependencies that the computed value depends on.\n */\n map<U>(calculator: (value: T) => U, dependencies?: Array<KTReactiveLike<any>>): KTComputed<U> {\n return null as any;\n }\n}\n\nexport abstract class KTReactive<T> extends KTReactiveLike<T> {\n /**\n * @internal\n */\n protected _value: T;\n\n /**\n * @internal\n */\n protected readonly _changeHandlers = new Map<any, ChangeHandler<any>>();\n\n constructor(value: T) {\n super();\n this._value = value;\n }\n\n get value() {\n return this._value;\n }\n\n set value(_newValue: T) {\n $warn('Setting value to a non-ref instance takes no effect.');\n }\n\n /**\n * @internal\n */\n protected _emit(newValue: T, oldValue: T): this {\n this._changeHandlers.forEach((handler) => handler(newValue, oldValue));\n return this;\n }\n\n addOnChange(handler: ChangeHandler<T>, key?: any): this {\n key ??= handlerId++;\n if (this._changeHandlers.has(key)) {\n $throw(`Overriding existing change handler with key ${$stringify(key)}.`);\n }\n this._changeHandlers.set(key, handler);\n return this;\n }\n\n removeOnChange(key: any): this {\n this._changeHandlers.delete(key);\n return this;\n }\n\n clearOnChange(): this {\n this._changeHandlers.clear();\n return this;\n }\n\n notify(): this {\n return this._emit(this._value, this._value);\n }\n\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<\n K0 extends keyof T,\n K1 extends keyof T[K0],\n K2 extends keyof T[K0][K1],\n K3 extends keyof T[K0][K1][K2],\n K4 extends keyof T[K0][K1][K2][K3],\n >(key0: K0, key1: K1, key2: K2, key3: K3, key4: K4): KTSubComputed<T[K0][K1][K2][K3][K4]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1], K3 extends keyof T[K0][K1][K2]>(\n key0: K0,\n key1: K1,\n key2: K2,\n key3: K3,\n ): KTSubComputed<T[K0][K1][K2][K3]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1]>(\n key0: K0,\n key1: K1,\n key2: K2,\n ): KTSubComputed<T[K0][K1][K2]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0]>(key0: K0, key1: K1): KTSubComputed<T[K0][K1]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T>(key0: K0): KTSubComputed<T[K0]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get(..._keys: Array<string | number>): KTSubComputed<any> {\n // & Will be implemented in computed.ts to avoid circular dependency\n return null as any;\n }\n}\n\nexport abstract class KTSubReactive<T> extends KTReactiveLike<T> {\n readonly source: KTReactive<any>;\n\n /**\n * @internal\n */\n protected readonly _getter: (sv: KTReactive<any>['value']) => T;\n\n constructor(source: KTReactive<any>, paths: Array<string | number>) {\n super();\n this.source = source;\n this._getter = $createSubGetter(paths);\n }\n\n get value() {\n // @ts-expect-error _value is private\n return this._getter(this.source._value);\n }\n\n addOnChange(handler: ChangeHandler<T>, key?: any): this {\n this.source.addOnChange((newSourceValue, oldSourceValue) => {\n const oldValue = this._getter(oldSourceValue);\n const newValue = this._getter(newSourceValue);\n handler(newValue, oldValue);\n }, key);\n return this;\n }\n\n removeOnChange(key: any): this {\n this.source.removeOnChange(key);\n return this;\n }\n\n notify(): this {\n this.source.notify();\n return this;\n }\n}\n","// Use microqueue to schedule the flush of pending reactions\n\nimport type { KTRef } from './ref.js';\n\nconst reactiveToOldValue = new Map<KTRef<any>, any>();\n\nlet scheduled = false;\n\nexport const markMutation = (reactive: KTRef<any>) => {\n if (!reactiveToOldValue.has(reactive)) {\n // @ts-expect-error accessing protected property\n reactiveToOldValue.set(reactive, reactive._value);\n\n // # schedule by microqueue\n if (scheduled) {\n return;\n }\n\n scheduled = true;\n Promise.resolve().then(() => {\n scheduled = false;\n reactiveToOldValue.forEach((oldValue, reactive) => {\n try {\n // @ts-expect-error accessing protected property\n reactive._changeHandlers.forEach((handler) => handler(reactive.value, oldValue));\n } catch (error) {\n $error('KTScheduler:', error);\n }\n });\n reactiveToOldValue.clear();\n });\n }\n};\n","import { $emptyFn, $is, $stringify } from '@ktjs/shared';\nimport { KTReactive, KTReactiveType, KTSubReactive } from './reactive.js';\nimport { markMutation } from './scheduler.js';\nimport { $createSubSetter, isRefLike } from './common.js';\n\nexport class KTRef<T> extends KTReactive<T> {\n readonly ktype = KTReactiveType.Ref;\n\n constructor(_value: T) {\n super(_value);\n }\n\n // ! Cannot be omitted, otherwise this will override `KTReactive` with only setter. And getter will return undefined.\n get value() {\n return this._value;\n }\n\n set value(newValue: T) {\n if ($is(newValue, this._value)) {\n return;\n }\n const oldValue = this._value;\n this._value = newValue;\n this._emit(newValue, oldValue);\n }\n\n /**\n * Used to mutate the value in-place.\n * - internal value is changed instantly, but the change handlers will be called in the next microtask.\n */\n get draft() {\n markMutation(this);\n return this._value;\n }\n\n notify(): this {\n return this._emit(this._value, this._value);\n }\n\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<\n K0 extends keyof T,\n K1 extends keyof T[K0],\n K2 extends keyof T[K0][K1],\n K3 extends keyof T[K0][K1][K2],\n K4 extends keyof T[K0][K1][K2][K3],\n >(key0: K0, key1: K1, key2: K2, key3: K3, key4: K4): KTSubRef<T[K0][K1][K2][K3][K4]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1], K3 extends keyof T[K0][K1][K2]>(\n key0: K0,\n key1: K1,\n key2: K2,\n key3: K3,\n ): KTSubRef<T[K0][K1][K2][K3]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1]>(\n key0: K0,\n key1: K1,\n key2: K2,\n ): KTSubRef<T[K0][K1][K2]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0]>(key0: K0, key1: K1): KTSubRef<T[K0][K1]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T>(key0: K0): KTSubRef<T[K0]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref(...keys: Array<string | number>): KTSubRef<any> {\n if (keys.length === 0) {\n $throw('At least one key is required to get a sub-ref.');\n }\n return new KTSubRef(this, keys);\n }\n}\n\nexport class KTSubRef<T> extends KTSubReactive<T> {\n readonly ktype = KTReactiveType.SubRef;\n declare readonly source: KTRef<any>;\n\n /**\n * @internal\n */\n protected readonly _setter: (s: object, newValue: T) => void;\n\n constructor(source: KTRef<any>, paths: Array<string | number>) {\n super(source, paths);\n this._setter = $createSubSetter(paths);\n }\n\n get value() {\n // @ts-expect-error _value is private\n return this._getter(this.source._value);\n }\n\n set value(newValue: T) {\n // @ts-expect-error _value is private\n this._setter(this.source._value, newValue);\n this.source.notify();\n }\n\n get draft() {\n // Same implementation as `draft` in `KTRef`\n markMutation(this.source);\n // @ts-expect-error _value is private\n return this._getter(this.source._value);\n }\n\n notify(): this {\n this.source.notify();\n return this;\n }\n}\n\n/**\n * Create a reactive reference to a value. The returned object has a single property `value` that holds the internal value.\n * @param value listened value\n */\nexport const ref = <T>(value?: T): KTRef<T> => new KTRef(value as any);\n\n/**\n * Assert `k-model` to be a ref-like object\n */\nexport const assertModel = <T = any>(props: any, defaultValue?: T): KTRefLike<T> => {\n // & props is an object. Won't use it in any other place\n if ('k-model' in props) {\n const kmodel = props['k-model'];\n if (isRefLike(kmodel)) {\n return kmodel;\n } else {\n $throw(`k-model data must be a KTRef object, please use 'ref(...)' to wrap it.`);\n }\n }\n return ref(defaultValue) as KTRef<T>;\n};\n\nconst $refSetter = <T>(props: { ref?: KTRef<T> }, node: T) => (props.ref!.value = node);\ntype RefSetter<T> = (props: { ref?: KTRef<T> }, node: T) => void;\n\nexport type KTRefLike<T> = KTRef<T> | KTSubRef<T>;\n\n/**\n * Whether `props.ref` is a `KTRef` only needs to be checked in the initial render\n */\nexport const $initRef = <T extends Node>(props: { ref?: KTRefLike<T> }, node: T): RefSetter<T> => {\n if (!('ref' in props)) {\n return $emptyFn;\n }\n\n const r = props.ref;\n if (isRefLike(r)) {\n r.value = node;\n return $refSetter;\n } else {\n $throw('Fragment: ref must be a KTRef');\n }\n};\n","import { $is, $stringify } from '@ktjs/shared';\nimport { KTReactive, KTReactiveLike, KTReactiveType, KTSubReactive } from './reactive.js';\n\nexport class KTComputed<T> extends KTReactive<T> {\n readonly ktype = KTReactiveType.Computed;\n\n private readonly _calculator: () => T;\n private readonly _dependencies: Array<KTReactiveLike<any>>;\n private readonly _recalculateListener: () => void;\n private _disposed = false;\n\n private _recalculate(forced: boolean = false): this {\n const newValue = this._calculator();\n const oldValue = this._value;\n if (!$is(oldValue, newValue) || forced) {\n this._value = newValue;\n this._emit(newValue, oldValue);\n }\n return this;\n }\n\n constructor(calculator: () => T, dependencies: Array<KTReactiveLike<any>>) {\n super(calculator());\n this._calculator = calculator;\n this._dependencies = dependencies;\n this._recalculateListener = () => this._recalculate();\n for (let i = 0; i < dependencies.length; i++) {\n dependencies[i].addOnChange(this._recalculateListener, this._recalculateListener);\n }\n }\n\n notify(): this {\n return this._recalculate(true);\n }\n\n dispose(): this {\n if (this._disposed) {\n return this;\n }\n\n this._disposed = true;\n for (let i = 0; i < this._dependencies.length; i++) {\n this._dependencies[i].removeOnChange(this._recalculateListener);\n }\n return this;\n }\n}\n\nKTReactiveLike.prototype.map = function <U>(\n this: KTReactive<unknown>,\n c: (value: unknown) => U,\n dep?: Array<KTReactiveLike<any>>,\n) {\n return new KTComputed(() => c(this.value), dep ? [this, ...dep] : [this]);\n};\n\nKTReactive.prototype.get = function <T>(this: KTReactive<T>, ...keys: Array<string | number>) {\n if (keys.length === 0) {\n $throw('At least one key is required to get a sub-computed.');\n }\n return new KTSubComputed(this, keys);\n};\n\nexport class KTSubComputed<T> extends KTSubReactive<T> {\n readonly ktype = KTReactiveType.SubComputed;\n}\n\nexport type KTComputedLike<T> = KTComputed<T> | KTSubComputed<T>;\n\n/**\n * Create a computed value that automatically updates when its dependencies change.\n * @param calculator synchronous function that calculates the value of the computed. It should not have side effects.\n * @param dependencies an array of reactive dependencies that the computed value depends on. The computed value will automatically update when any of these dependencies change.\n */\nexport const computed = <T>(calculator: () => T, dependencies: Array<KTReactiveLike<any>>): KTComputed<T> =>\n new KTComputed(calculator, dependencies);\n","import { $emptyFn } from '@ktjs/shared';\nimport type { KTReactiveLike } from './reactive.js';\n\ninterface KTEffectOptions {\n lazy: boolean;\n onCleanup: () => void;\n debugName: string;\n}\n\n/**\n * Register a reactive effect with options.\n * @param effectFn The effect function to run when dependencies change\n * @param reactives The reactive dependencies\n * @param options Effect options: lazy, onCleanup, debugName\n * @returns stop function to remove all listeners\n */\nexport function effect(\n effectFn: () => void,\n reactives: Array<KTReactiveLike<any>>,\n options?: Partial<KTEffectOptions>,\n) {\n const { lazy = false, onCleanup = $emptyFn, debugName = '' } = Object(options);\n const listenerKeys: Array<string | number> = [];\n\n let active = true;\n\n const run = () => {\n if (!active) {\n return;\n }\n\n // cleanup before rerun\n onCleanup();\n\n try {\n effectFn();\n } catch (err) {\n $debug('effect error:', debugName, err);\n }\n };\n\n // subscribe to dependencies\n for (let i = 0; i < reactives.length; i++) {\n listenerKeys[i] = i;\n reactives[i].addOnChange(run, effectFn);\n }\n\n // auto run unless lazy\n if (!lazy) {\n run();\n }\n\n // stop function\n return () => {\n if (!active) {\n return;\n }\n active = false;\n\n for (let i = 0; i < reactives.length; i++) {\n reactives[i].removeOnChange(effectFn);\n }\n\n // final cleanup\n onCleanup();\n };\n}\n","import type { KTReactive, KTReactiveLike } from './reactive.js';\nimport { isKT } from './common.js';\nimport { ref } from './ref.js';\n\n/**\n * Ensure a value is reactive. If it's already `KTReactiveLike`, return it as is; otherwise, wrap it in a `ref`.\n */\nexport const toReactive = <T>(o: T | KTReactiveLike<T>): KTReactiveLike<T> =>\n isKT(o) ? o : (ref(o as T) as KTReactive<T>);\n\n/**\n * Extracts the value from a KTReactive, or returns the value directly if it's not reactive.\n */\nexport const dereactive = <T>(value: T | KTReactiveLike<T>): T => (isKT<T>(value) ? value.value : value);\n\nexport type { KTRef, KTSubRef, KTRefLike } from './ref.js';\nexport { ref, assertModel } from './ref.js';\nexport type { KTComputed, KTSubComputed, KTComputedLike } from './computed.js';\nexport { computed } from './computed.js';\nexport { KTReactiveType } from './reactive.js';\nexport type * from './reactive.js';\n\nexport {\n isKT,\n isReactiveLike,\n isRef,\n isSubRef,\n isRefLike,\n isComputed,\n isSubComputed,\n isComputedLike,\n isReactive,\n} from './common.js';\nexport { effect } from './effect.js';\nexport type * from './types.js';\n","import type { KTReactiveLike } from '../reactable/reactive.js';\nimport type { KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport { $initRef, type KTRefLike } from '../reactable/ref.js';\n\nimport { $forEach, $isArray } from '@ktjs/shared';\nimport { isKT, toReactive } from '../reactable/index.js';\nimport { $addNodeCleanup, AnchorType, KTAnchor } from './anchor.js';\n\nexport class FragmentAnchor extends KTAnchor<Node> {\n readonly type = AnchorType.Fragment;\n\n constructor() {\n super(AnchorType.Fragment);\n }\n\n /**\n * Remove elements in the list\n */\n removeElements() {\n const list = this.list.slice();\n this.list.length = 0;\n for (let i = 0; i < list.length; i++) {\n const node = list[i] as ChildNode;\n if (node.parentNode) {\n node.remove();\n }\n }\n }\n}\n\nexport interface FragmentProps<T extends Node = Node> {\n /** Array of child elements, supports reactive arrays */\n children: T[] | KTReactiveLike<T[]>;\n\n /** element key function for optimization (future enhancement) */\n key?: (element: T, index: number, array: T[]) => any;\n\n /** ref to get the anchor node */\n ref?: KTRefLike<JSX.Element>;\n}\n\n/**\n * Fragment - Container component for managing arrays of child elements\n *\n * Features:\n * 1. Returns a comment anchor node, child elements are inserted after the anchor\n * 2. Supports reactive arrays, automatically updates DOM when array changes\n * 3. Basic version uses simple replacement algorithm (remove all old elements, insert all new elements)\n * 4. Future enhancement: key-based optimization\n *\n * Usage example:\n * ```tsx\n * const children = ref([<div>A</div>, <div>B</div>]);\n * const fragment = <Fragment children={children} />;\n * document.body.appendChild(fragment);\n *\n * // Automatic update\n * children.value = [<div>C</div>, <div>D</div>];\n * ```\n */\nexport function Fragment<T extends Node = Node>(props: FragmentProps<T>): JSX.Element & FragmentAnchor {\n const anchor = new FragmentAnchor();\n const elements = anchor.list as T[];\n const childrenRef = toReactive(props.children);\n\n const redraw = () => {\n const newElements = childrenRef.value;\n const parent = anchor.parentNode;\n\n if (!parent) {\n elements.length = 0;\n for (let i = 0; i < newElements.length; i++) {\n elements.push(newElements[i]);\n }\n return;\n }\n\n anchor.removeElements();\n elements.length = 0;\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < newElements.length; i++) {\n const element = newElements[i];\n elements.push(element);\n fragment.appendChild(element);\n }\n\n parent.insertBefore(fragment, anchor.nextSibling);\n };\n\n childrenRef.addOnChange(redraw, redraw);\n $addNodeCleanup(anchor, () => childrenRef.removeOnChange(redraw));\n anchor.mountCallback = redraw;\n redraw();\n\n $initRef(props as { ref?: KTRefLike<Node> }, anchor);\n\n return anchor as unknown as JSX.Element & FragmentAnchor;\n}\n\n/**\n * Convert KTRawContent to HTMLElement array\n */\nexport function convertChildrenToElements(children: KTRawContent): Element[] {\n const elements: Element[] = [];\n\n const processChild = (child: any): void => {\n if (child === undefined || child === null || child === false || child === true) {\n // Ignore null, undefined, false, true\n return;\n }\n\n if ($isArray(child)) {\n // Recursively process array\n $forEach(child, processChild);\n return;\n }\n\n if (typeof child === 'string' || typeof child === 'number') {\n const span = document.createElement('span');\n span.textContent = String(child);\n elements.push(span);\n return;\n }\n\n if (child instanceof Element) {\n elements.push(child);\n return;\n }\n\n if (isKT(child)) {\n processChild(child.value);\n return;\n }\n\n $warn('Fragment: unsupported child type', child);\n if (process.env.IS_DEV) {\n throw new Error(`Fragment: unsupported child type`);\n }\n };\n\n processChild(children);\n return elements;\n}\n","import type { JSXTag } from '@ktjs/shared';\nimport type { KTAttribute } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport { h } from '../h/index';\n\nexport const jsxh = (tag: JSXTag, props: KTAttribute): JSX.Element =>\n (typeof tag === 'function' ? tag(props) : h(tag, props, props.children)) as JSX.Element;\n\nexport const placeholder = (data: string): JSX.Element => document.createComment(data) as unknown as JSX.Element;\n","import type { JSXTag, MathMLTag, SVGTag } from '@ktjs/shared';\nimport type { KTAttribute, KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\n\nimport { h, mathml as _mathml, svg as _svg } from '../h/index.js';\nimport { $initRef } from '../reactable/ref.js';\nimport { isComputedLike } from '../reactable/common.js';\n\nimport { convertChildrenToElements, Fragment as FragmentArray } from './fragment.js';\nimport { jsxh, placeholder } from './common.js';\n\nfunction create(\n creator: (tag: any, props: KTAttribute, content?: KTRawContent) => JSX.Element,\n tag: any,\n props: KTAttribute,\n) {\n if (props.ref && isComputedLike(props.ref)) {\n $throw('Cannot assign a computed value to an element.');\n }\n const el = creator(tag, props, props.children);\n $initRef(props, el);\n return el;\n}\n\nexport const jsx = (tag: JSXTag, props: KTAttribute): JSX.Element => create(jsxh, tag, props);\nexport const svg = (tag: SVGTag, props: KTAttribute): JSX.Element => create(_svg, tag, props);\nexport const mathml = (tag: MathMLTag, props: KTAttribute): JSX.Element => create(_mathml, tag, props);\nexport { svg as svgRuntime, mathml as mathmlRuntime };\n\n/**\n * Fragment support - returns an array of children\n * Enhanced Fragment component that manages arrays of elements\n */\nexport function Fragment(props: { children?: KTRawContent }): JSX.Element {\n const { children } = props ?? {};\n\n if (!children) {\n return placeholder('kt-fragment-empty');\n }\n\n const elements = convertChildrenToElements(children);\n\n return FragmentArray({ children: elements });\n}\n\n/**\n * JSX Development runtime - same as jsx but with additional dev checks\n */\nexport const jsxDEV: typeof jsx = (...args) => {\n // console.log('JSX DEV called:', ...args);\n // console.log('children', (args[1] as any)?.children);\n return jsx(...args);\n};\n\n/**\n * JSX runtime for React 17+ automatic runtime\n * This is called when using jsx: \"react-jsx\" or \"react-jsxdev\"\n */\nexport const jsxs = jsx;\n\n// Export h as the classic JSX factory for backward compatibility\nexport { h, h as createElement };\n","import { $isThenable } from '@ktjs/shared';\nimport type { KTComponent, KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport type { KTRef } from '../reactable/ref.js';\nimport { $mountFragmentAnchors } from './anchor.js';\n\n/**\n * Extract component props type (excluding ref and children)\n */\ntype ExtractComponentProps<T> = T extends (props: infer P) => any ? Omit<P, 'ref' | 'children'> : {};\n\nexport function KTAsync<T extends KTComponent>(\n props: {\n ref?: KTRef<JSX.Element>;\n skeleton?: JSX.Element;\n component: T;\n children?: KTRawContent;\n } & ExtractComponentProps<T>,\n): JSX.Element {\n const raw = props.component(props);\n let comp: JSX.Element =\n props.skeleton ?? (document.createComment('ktjs-suspense-placeholder') as unknown as JSX.Element);\n\n if ($isThenable(raw)) {\n raw.then((resolved) => {\n comp.replaceWith(resolved);\n $mountFragmentAnchors(resolved);\n });\n } else {\n comp = raw as JSX.Element;\n }\n\n return comp;\n}\n","import type { JSX } from '../types/jsx.js';\nimport type { KTRefLike } from '../reactable/ref.js';\nimport type { KTReactiveLike } from '../reactable/reactive.js';\n\nimport { $identity } from '@ktjs/shared';\nimport { toReactive } from '../reactable/index.js';\nimport { $initRef } from '../reactable/ref.js';\nimport { $addNodeCleanup } from './anchor.js';\nimport { AnchorType, KTAnchor } from './anchor.js';\n\nexport class KTForAnchor extends KTAnchor<JSX.Element> {\n readonly type = AnchorType.For;\n\n constructor() {\n super(AnchorType.For);\n }\n}\n\nexport type KTForElement = JSX.Element & KTForAnchor;\n\nexport interface KTForProps<T> {\n ref?: KTRefLike<KTForElement>;\n list: T[] | KTReactiveLike<T[]>;\n key?: (item: T, index: number, array: T[]) => any;\n map?: (item: T, index: number, array: T[]) => JSX.Element;\n}\n\nconst setForNodeMap = (nodeMap: Map<any, JSX.Element>, key: any, node: JSX.Element, index: number) => {\n if (nodeMap.has(key)) {\n $error(`[KTFor] Duplicate key detected at index ${index}. Later items override earlier ones. key=${String(key)}`);\n }\n nodeMap.set(key, node);\n};\n\n// TASK 对于template标签的for和if,会编译为fragment,可特殊处理,让它们保持原样\n/**\n * KTFor - List rendering component with key-based optimization\n * Returns a Comment anchor node with rendered elements in anchor.list\n */\nexport function KTFor<T>(props: KTForProps<T>): KTForElement {\n const redraw = () => {\n const newList = listRef.value;\n const parent = anchor.parentNode;\n\n if (!parent) {\n anchor.list.length = 0;\n nodeMap.clear();\n for (let index = 0; index < newList.length; index++) {\n const item = newList[index];\n const itemKey = currentKey(item, index, newList);\n const node = currentMap(item, index, newList);\n setForNodeMap(nodeMap, itemKey, node, index);\n anchor.list.push(node);\n }\n return anchor;\n }\n\n const oldLength = anchor.list.length;\n const newLength = newList.length;\n\n if (newLength === 0) {\n nodeMap.forEach((node) => node.remove());\n nodeMap.clear();\n anchor.list.length = 0;\n return anchor;\n }\n\n if (oldLength === 0) {\n anchor.list.length = 0;\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < newLength; i++) {\n const item = newList[i];\n const itemKey = currentKey(item, i, newList);\n const node = currentMap(item, i, newList);\n setForNodeMap(nodeMap, itemKey, node, i);\n anchor.list.push(node);\n fragment.appendChild(node);\n }\n parent.insertBefore(fragment, anchor.nextSibling);\n return anchor;\n }\n\n const newKeyToNewIndex = new Map<any, number>();\n const newElements: JSX.Element[] = new Array(newLength);\n for (let i = 0; i < newLength; i++) {\n const item = newList[i];\n const itemKey = currentKey(item, i, newList);\n newKeyToNewIndex.set(itemKey, i);\n newElements[i] = nodeMap.has(itemKey) ? nodeMap.get(itemKey)! : currentMap(item, i, newList);\n }\n\n const toRemove: JSX.Element[] = [];\n nodeMap.forEach((node, key) => {\n if (!newKeyToNewIndex.has(key)) {\n toRemove.push(node);\n }\n });\n for (let i = 0; i < toRemove.length; i++) {\n toRemove[i].remove();\n }\n\n let currentNode = anchor.nextSibling;\n for (let i = 0; i < newLength; i++) {\n const node = newElements[i];\n if (currentNode !== node) {\n parent.insertBefore(node, currentNode);\n } else {\n currentNode = currentNode.nextSibling;\n }\n }\n\n nodeMap.clear();\n anchor.list.length = 0;\n for (let i = 0; i < newLength; i++) {\n const itemKey = currentKey(newList[i], i, newList);\n const node = newElements[i];\n setForNodeMap(nodeMap, itemKey, node, i);\n anchor.list.push(node);\n }\n return anchor;\n };\n\n const currentKey: NonNullable<KTForProps<T>['key']> = props.key ?? ((item: T) => item);\n const currentMap: NonNullable<KTForProps<T>['map']> =\n props.map ?? ((item: T) => $identity(item) as unknown as JSX.Element);\n const listRef = toReactive(props.list);\n const anchor = new KTForAnchor() as KTForElement;\n const nodeMap = new Map<any, JSX.Element>();\n\n for (let index = 0; index < listRef.value.length; index++) {\n const item = listRef.value[index];\n const itemKey = currentKey(item, index, listRef.value);\n const node = currentMap(item, index, listRef.value);\n setForNodeMap(nodeMap, itemKey, node, index);\n anchor.list.push(node);\n }\n\n listRef.addOnChange(redraw, redraw);\n $addNodeCleanup(anchor, () => listRef.removeOnChange(redraw));\n anchor.mountCallback = redraw;\n $initRef(props, anchor);\n\n return anchor;\n}\n","import type { JSXTag } from '@ktjs/shared';\nimport type { KTAttribute } from '../types/h.js';\nimport type { KTReactiveLike } from '../reactable/reactive.js';\n\nimport { isKT } from '../reactable/index.js';\nimport { $addNodeCleanup, $mountFragmentAnchors, $removeNodeCleanup } from './anchor.js';\nimport { jsxh, placeholder } from './common.js';\n\nexport function KTConditional(\n condition: any | KTReactiveLike<any>,\n tagIf: JSXTag,\n propsIf: KTAttribute,\n tagElse?: JSXTag,\n propsElse?: KTAttribute,\n) {\n if (!isKT(condition)) {\n return condition ? jsxh(tagIf, propsIf) : tagElse ? jsxh(tagElse, propsElse!) : placeholder('kt-conditional');\n }\n\n if (tagElse) {\n let current = condition.value ? jsxh(tagIf, propsIf) : jsxh(tagElse!, propsElse!);\n const cleanup = () => condition.removeOnChange(onChange);\n const onChange = (newValue: any) => {\n const old = current;\n current = newValue ? jsxh(tagIf, propsIf) : jsxh(tagElse!, propsElse!);\n $removeNodeCleanup(old, cleanup);\n $addNodeCleanup(current, cleanup);\n old.replaceWith(current);\n $mountFragmentAnchors(current);\n };\n condition.addOnChange(onChange, onChange);\n $addNodeCleanup(current, cleanup);\n return current;\n } else {\n const dummy = placeholder('kt-conditional') as HTMLElement;\n let current = condition.value ? jsxh(tagIf, propsIf) : dummy;\n const cleanup = () => condition.removeOnChange(onChange);\n const onChange = (newValue: any) => {\n const old = current;\n current = newValue ? jsxh(tagIf, propsIf) : dummy;\n $removeNodeCleanup(old, cleanup);\n $addNodeCleanup(current, cleanup);\n old.replaceWith(current);\n $mountFragmentAnchors(current);\n };\n condition.addOnChange(onChange, onChange);\n $addNodeCleanup(current, cleanup);\n return current;\n }\n}\n"],"names":["isKT","obj","kid","isReactiveLike","ktype","isRef","isSubRef","isRefLike","isComputed","isSubComputed","isComputedLike","isReactive","KTAnchor","Comment","isKTAnchor","list","mountCallback","constructor","data","super","$ensureAnchorObserver","mount","parent","this","parentNode","appendChild","CANNOT_MOUNT","document","Node","CANNOT_OBSERVE","MutationObserver","COMMENT_FILTER","NodeFilter","SHOW_COMMENT","nodeToCleanups","WeakMap","anchorObserver","$cleanupRemovedNode","node","nodeType","children","Array","from","childNodes","i","length","anchor","slice","listNode","remove","$runNodeCleanups","body","records","disconnect","undefined","addedNodes","j","$mountFragmentAnchors","removedNodes","observe","childList","subtree","$mountIfFragmentAnchor","cleanups","get","delete","error","console","$addNodeCleanup","cleanup","push","set","$removeNodeCleanup","index","indexOf","splice","nodeObj","walker","createTreeWalker","current","nextNode","booleanHandler","element","key","value","setAttribute","valueHandler","handlers","checked","selected","valueAsDate","valueAsNumber","defaultValue","defaultChecked","defaultSelected","disabled","readOnly","multiple","required","autofocus","open","controls","autoplay","loop","muted","defer","async","hidden","_key","defaultHandler","setElementStyle","style","cssText","addReactiveCleanup","reactive","handler","addOnChange","removeOnChange","applyAttr","attr","Error","classValue","class","className","v","html","setHTML","firstChild","innerHTML","o","startsWith","eventName","addEventListener","removeEventListener","attrIsObject","assureNode","$isNode","createTextNode","apdSingle","c","onChange","newValue","newNode","oldNode","replaceWith","type","apd","$isThenable","then","r","$isArray","ci","comment","createComment","awaited","awaitedNode","applyContent","content","applyKModel","valueRef","tagName","onValueChange","Boolean","onInput","h","tag","createElement","svg","createElementNS","mathml","handlerId","KTReactiveLike","map","calculator","dependencies","KTReactive","_value","_changeHandlers","Map","_newValue","warn","_emit","oldValue","forEach","has","$stringify","clearOnChange","clear","notify","_keys","KTSubReactive","source","_getter","paths","path","s","$createSubGetter","newSourceValue","oldSourceValue","reactiveToOldValue","scheduled","markMutation","Promise","resolve","KTRef","$is","draft","subref","keys","KTSubRef","_setter","$createSubSetter","ref","assertModel","props","kmodel","$refSetter","$initRef","$emptyFn","KTComputed","_calculator","_dependencies","_recalculateListener","_disposed","_recalculate","forced","dispose","prototype","dep","KTSubComputed","computed","effect","effectFn","reactives","options","lazy","onCleanup","debugName","Object","active","run","err","debug","toReactive","dereactive","FragmentAnchor","removeElements","jsxh","placeholder","create","creator","el","jsx","_svg","_mathml","Fragment","elements","processChild","child","$forEach","span","textContent","String","Element","convertChildrenToElements","childrenRef","redraw","newElements","fragment","createDocumentFragment","insertBefore","nextSibling","FragmentArray","jsxDEV","args","jsxs","KTAsync","raw","component","comp","skeleton","resolved","KTForAnchor","setForNodeMap","nodeMap","KTFor","newList","listRef","item","itemKey","currentKey","currentMap","oldLength","newLength","newKeyToNewIndex","toRemove","currentNode","$identity","KTConditional","condition","tagIf","propsIf","tagElse","propsElse","old","dummy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/reactable/common.ts","../src/reactable/reactive.ts","../src/jsx/anchor.ts","../src/h/attr-helpers.ts","../src/h/attr.ts","../src/h/content.ts","../src/h/model.ts","../src/h/index.ts","../src/reactable/scheduler.ts","../src/reactable/ref.ts","../src/reactable/computed.ts","../src/reactable/effect.ts","../src/reactable/index.ts","../src/jsx/fragment.ts","../src/jsx/common.ts","../src/jsx/jsx-runtime.ts","../src/jsx/async.ts","../src/jsx/for.ts","../src/jsx/if.ts"],"sourcesContent":["import { KTReactiveLike, KTReactiveType, type KTReactive } from './reactive.js';\nimport type { KTRef, KTRefLike, KTSubRef } from './ref.js';\nimport type { KTComputed, KTComputedLike, KTSubComputed } from './computed.js';\n\n// # type guards\nexport function isKT<T = any>(obj: any): obj is KTReactiveLike<T> {\n return typeof obj?.kid === 'number';\n}\n\nexport function isReactiveLike<T = any>(obj: any): obj is KTReactiveLike<T> {\n if (typeof obj?.ktype === 'number') {\n return (obj.ktype & KTReactiveType.ReactiveLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isRef<T = any>(obj: any): obj is KTRef<T> {\n if (typeof obj?.ktype === 'number') {\n return obj.ktype === KTReactiveType.Ref;\n } else {\n return false;\n }\n}\n\nexport function isSubRef<T = any>(obj: any): obj is KTSubRef<T> {\n if (typeof obj?.ktype === 'number') {\n return obj.ktype === KTReactiveType.SubRef;\n } else {\n return false;\n }\n}\n\nexport function isRefLike<T = any>(obj: any): obj is KTRefLike<T> {\n if (typeof obj?.ktype === 'number') {\n return (obj.ktype & KTReactiveType.RefLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isComputed<T = any>(obj: any): obj is KTComputed<T> {\n if (typeof obj?.ktype === 'number') {\n return obj.ktype === KTReactiveType.Computed;\n } else {\n return false;\n }\n}\n\nexport function isSubComputed<T = any>(obj: any): obj is KTSubComputed<T> {\n if (typeof obj?.ktype === 'number') {\n return obj.ktype === KTReactiveType.SubComputed;\n } else {\n return false;\n }\n}\n\nexport function isComputedLike<T = any>(obj: any): obj is KTComputedLike<T> {\n if (typeof obj?.ktype === 'number') {\n return (obj.ktype & KTReactiveType.ComputedLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isReactive<T = any>(obj: any): obj is KTReactive<T> {\n if (typeof obj?.ktype === 'number') {\n return (obj.ktype & KTReactiveType.Reactive) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isSubReactive<T = any>(obj: any): obj is KTSubComputed<T> {\n if (typeof obj?.ktype === 'number') {\n return (obj.ktype & KTReactiveType.SubReactive) !== 0;\n } else {\n return false;\n }\n}\n\n// # sub getter/setter factory\n\ntype SubGetter = (s: any) => any;\ntype SubSetter = (s: any, newValue: any) => void;\n\n/**\n * Create a value getter which params is `reactive.value`(or `ref.draft`)\n */\nexport const $createSubGetter = (path: Array<string | number>): SubGetter => {\n // & path.length is guaranteed to be greater than 0 in `KTReactive.get` and `KTRef.get`\n switch (path.length) {\n // ? Does it use less memory if we write this:\n // const [k2_0, k2_1] = path;\n // return (s) => s[k2_0][k2_1];\n case 1:\n return (s) => s[path[0]];\n case 2:\n return (s) => s[path[0]][path[1]];\n case 3:\n return (s) => s[path[0]][path[1]][path[2]];\n case 4:\n return (s) => s[path[0]][path[1]][path[2]][path[3]];\n case 5:\n return (s) => s[path[0]][path[1]][path[2]][path[3]][path[4]];\n default:\n return (s) => {\n let r = s[path[0]][path[1]][path[2]][path[3]][path[4]];\n for (let i = 5; i < path.length; i++) {\n r = r[path[i]];\n }\n return r;\n };\n }\n};\n\n/**\n * Create a value setter which params is `reactive.value`(or `ref.draft`)\n */\nexport const $createSubSetter = (path: Array<string | number>): SubSetter => {\n switch (path.length) {\n case 1:\n return (s, newValue) => (s[path[0]] = newValue);\n case 2:\n return (s, newValue) => (s[path[0]][path[1]] = newValue);\n case 3:\n return (s, newValue) => (s[path[0]][path[1]][path[2]] = newValue);\n case 4:\n return (s, newValue) => (s[path[0]][path[1]][path[2]][path[3]] = newValue);\n case 5:\n return (s, newValue) => (s[path[0]][path[1]][path[2]][path[3]][path[4]] = newValue);\n default:\n return (s, newValue) => {\n let r = s[path[0]][path[1]][path[2]][path[3]][path[4]];\n for (let i = 5; i < path.length - 1; i++) {\n r = r[path[i]];\n }\n r[path[path.length - 1]] = newValue;\n };\n }\n};\n","import type { KTComputed, KTSubComputed } from './computed.js';\n\nimport { $stringify } from '@ktjs/shared';\n\nexport type ChangeHandler<T> = (newValue: T, oldValue: T) => void;\n\nexport const enum KTReactiveType {\n Pseudo = 0b000001,\n Ref = 0b000010,\n SubRef = 0b000100,\n RefLike = Ref | SubRef,\n Computed = 0b001000,\n SubComputed = 0b010000,\n ComputedLike = Computed | SubComputed,\n Reactive = Ref | Computed,\n SubReactive = SubRef | SubComputed,\n ReactiveLike = RefLike | ComputedLike | Pseudo,\n}\n\nlet kid = 1;\nlet handlerId = 1;\n\nexport const nextKid = () => kid++;\nexport const nextHandlerId = (kid: number) => `@@k-handler-${kid}-${handlerId++}`;\n\nexport abstract class KTReactiveLike<T> {\n readonly kid = nextKid();\n\n abstract readonly ktype: KTReactiveType;\n\n abstract get value(): T;\n\n abstract addOnChange(handler: ChangeHandler<T>, key?: any): this;\n abstract removeOnChange(key: any): this;\n\n abstract dispose(): void;\n}\n\nexport abstract class KTReactive<T> extends KTReactiveLike<T> {\n /**\n * @internal\n */\n protected _value: T;\n\n /**\n * @internal\n */\n protected readonly _changeHandlers = new Map<any, ChangeHandler<any>>();\n\n constructor(value: T) {\n super();\n this._value = value;\n }\n\n get value() {\n return this._value;\n }\n\n set value(_newValue: T) {\n $warn('Setting value to a non-ref instance takes no effect.');\n }\n\n /**\n * @internal\n */\n protected _emit(newValue: T, oldValue: T): this {\n this._changeHandlers.forEach((handler) => handler(newValue, oldValue));\n return this;\n }\n\n addOnChange(handler: ChangeHandler<T>, key: any = nextHandlerId(this.kid)): this {\n if (this._changeHandlers.has(key)) {\n $throw(`Overriding existing change handler with key ${$stringify(key)}.`);\n }\n this._changeHandlers.set(key, handler);\n return this;\n }\n\n removeOnChange(key: any): this {\n this._changeHandlers.delete(key);\n return this;\n }\n\n clearOnChange(): this {\n this._changeHandlers.clear();\n return this;\n }\n\n notify(): this {\n return this._emit(this._value, this._value);\n }\n\n /**\n * Create a computed value via current reactive value.\n * - No matter `this` is added to `dependencies` or not, it is always listened.\n * @param calculator A function that generates a new value based on current value.\n * @param dependencies optional other dependencies that the computed value depends on.\n */\n map<U>(calculator: (value: T) => U, dependencies?: Array<KTReactiveLike<any>>): KTComputed<U> {\n return null as any; // & implemented in computed.ts to avoid circular dependency\n }\n\n /**\n * Make a computed value that checks if the reactive value is strictly equal to a specific value.\n * - Use `Object.is` for comparison.\n * - if `o` is reactive-like, it will be added to dependencies\n */\n is(o: T | KTReactiveLike<T>): KTSubComputed<boolean> {\n return null as any; // & implemented in computed.ts to avoid circular dependency\n }\n\n /**\n * Make a computed value that checks if the reactive value matches a specific object structure.\n * - Deeply match.\n * - if `o` is reactive-like, it will be added to dependencies\n */\n match(o: object | KTReactiveLike<object>): KTSubComputed<boolean> {\n return null as any; // & implemented in computed.ts to avoid circular dependency\n }\n\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<\n K0 extends keyof T,\n K1 extends keyof T[K0],\n K2 extends keyof T[K0][K1],\n K3 extends keyof T[K0][K1][K2],\n K4 extends keyof T[K0][K1][K2][K3],\n >(key0: K0, key1: K1, key2: K2, key3: K3, key4: K4): KTSubComputed<T[K0][K1][K2][K3][K4]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1], K3 extends keyof T[K0][K1][K2]>(\n key0: K0,\n key1: K1,\n key2: K2,\n key3: K3,\n ): KTSubComputed<T[K0][K1][K2][K3]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1]>(\n key0: K0,\n key1: K1,\n key2: K2,\n ): KTSubComputed<T[K0][K1][K2]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0]>(key0: K0, key1: K1): KTSubComputed<T[K0][K1]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T>(key0: K0): KTSubComputed<T[K0]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get(..._keys: Array<string | number>): KTSubComputed<any> {\n // & Will be implemented in computed.ts to avoid circular dependency\n return null as any;\n }\n}\n\nexport abstract class KTSubReactive<T> extends KTReactiveLike<T> {\n readonly source: KTReactive<any>;\n\n /**\n * @internal\n */\n protected _value: T;\n\n /**\n * @internal\n */\n protected readonly _getter: (sv: KTReactive<any>['value']) => T;\n\n /**\n * @internal\n */\n protected readonly _handler: ChangeHandler<any>;\n\n /**\n * @internal\n */\n protected readonly _handlerKeys: string[];\n\n constructor(source: KTReactive<any>, getter: (sv: KTReactive<any>['value']) => T) {\n super();\n this.source = source;\n this._getter = getter;\n this._handlerKeys = [];\n\n // @ts-expect-error _value is protected\n this._value = this._getter(source._value);\n // @ts-expect-error _value is protected\n this._handler = () => (this._value = getter(source._value));\n\n this._handlerKeys.push(nextHandlerId(this.kid));\n source.addOnChange(this._handler, this._handlerKeys[0]);\n }\n\n addOnChange(handler: ChangeHandler<T>, key: any = nextHandlerId(this.kid)): this {\n this._handlerKeys.push(key);\n this.source.addOnChange((newValue, oldValue) => handler(this._getter(newValue), this._getter(oldValue)), key);\n return this;\n }\n\n removeOnChange(key: any): this {\n this.source.removeOnChange(key);\n return this;\n }\n\n dispose(): void {\n this._handlerKeys.forEach((key) => this.source.removeOnChange(key));\n }\n}\n","export const enum AnchorType {\n Fragment = 'kt-fragment',\n For = 'kt-for',\n}\n\nexport abstract class KTAnchor<T extends Node = Node> extends Comment {\n readonly isKTAnchor: true = true;\n readonly list: T[] = [];\n abstract readonly type: AnchorType;\n mountCallback?: () => void;\n\n constructor(data: AnchorType) {\n super(data);\n $ensureAnchorObserver();\n }\n\n mount(parent?: Node) {\n if (parent && this.parentNode !== parent) {\n parent.appendChild(this);\n }\n if (this.parentNode) {\n this.mountCallback?.();\n }\n }\n}\n\ntype MountableKTAnchor = Node & {\n isKTAnchor?: true;\n mount?: (parent?: Node) => void;\n};\ntype NodeCleanup = () => void;\n\nconst CANNOT_MOUNT = typeof document === 'undefined' || typeof Node === 'undefined';\nconst CANNOT_OBSERVE = CANNOT_MOUNT || typeof MutationObserver === 'undefined';\nconst COMMENT_FILTER = typeof NodeFilter === 'undefined' ? 0x80 : NodeFilter.SHOW_COMMENT;\nconst ELEMENT_NODE = 1;\nconst DOCUMENT_FRAGMENT_NODE = 11;\nconst nodeToCleanups = new WeakMap<Node, NodeCleanup[]>();\nlet anchorObserver: MutationObserver | undefined;\n\nconst $cleanupRemovedNode = (node: Node) => {\n if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const children = Array.from(node.childNodes);\n for (let i = 0; i < children.length; i++) {\n $cleanupRemovedNode(children[i]);\n }\n }\n\n const anchor = node as KTAnchor<Node>;\n if (anchor.isKTAnchor === true) {\n const list = anchor.list.slice();\n anchor.list.length = 0;\n for (let i = 0; i < list.length; i++) {\n const listNode = list[i] as ChildNode;\n if (listNode.parentNode) {\n listNode.remove();\n }\n $cleanupRemovedNode(listNode);\n }\n }\n\n $runNodeCleanups(node);\n};\n\nconst $ensureAnchorObserver = () => {\n if (CANNOT_OBSERVE || anchorObserver || !document.body) {\n return;\n }\n\n anchorObserver = new MutationObserver((records) => {\n if (typeof document === 'undefined') {\n anchorObserver?.disconnect();\n anchorObserver = undefined;\n return;\n }\n\n for (let i = 0; i < records.length; i++) {\n const addedNodes = records[i].addedNodes;\n for (let j = 0; j < addedNodes.length; j++) {\n $mountFragmentAnchors(addedNodes[j]);\n }\n\n const removedNodes = records[i].removedNodes;\n for (let j = 0; j < removedNodes.length; j++) {\n $cleanupRemovedNode(removedNodes[j]);\n }\n }\n });\n anchorObserver.observe(document.body, { childList: true, subtree: true });\n};\n\nconst $mountIfFragmentAnchor = (node: Node) => {\n const anchor = node as MountableKTAnchor;\n if (anchor.isKTAnchor === true && typeof anchor.mount === 'function') {\n anchor.mount();\n }\n};\n\nconst $runNodeCleanups = (node: Node) => {\n const cleanups = nodeToCleanups.get(node);\n if (!cleanups) {\n return;\n }\n\n nodeToCleanups.delete(node);\n for (let i = cleanups.length - 1; i >= 0; i--) {\n try {\n cleanups[i]();\n } catch (error) {\n $error('KTNodeCleanup:', error);\n }\n }\n};\n\nexport const $addNodeCleanup = (node: Node, cleanup: NodeCleanup) => {\n $ensureAnchorObserver();\n nodeToCleanups.getOrInsert(node, []).push(cleanup);\n return cleanup;\n};\n\nexport const $removeNodeCleanup = (node: Node, cleanup: NodeCleanup) => {\n const cleanups = nodeToCleanups.get(node);\n if (!cleanups) {\n return;\n }\n\n const index = cleanups.indexOf(cleanup);\n if (index === -1) {\n return;\n }\n\n cleanups.splice(index, 1);\n if (cleanups.length === 0) {\n nodeToCleanups.delete(node);\n }\n};\n\nexport const $mountFragmentAnchors = (node: unknown) => {\n if (CANNOT_MOUNT || typeof document === 'undefined' || !node || typeof (node as any).nodeType !== 'number') {\n return;\n }\n\n const nodeObj = node as Node;\n $mountIfFragmentAnchor(nodeObj);\n\n if (nodeObj.nodeType !== ELEMENT_NODE && nodeObj.nodeType !== DOCUMENT_FRAGMENT_NODE) {\n return;\n }\n\n const walker = document.createTreeWalker(nodeObj, COMMENT_FILTER);\n let current = walker.nextNode();\n while (current) {\n $mountIfFragmentAnchor(current);\n current = walker.nextNode();\n }\n};\n","const booleanHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => {\n if (key in element) {\n (element as any)[key] = !!value;\n } else {\n element.setAttribute(key, value);\n }\n};\n\nconst valueHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => {\n if (key in element) {\n (element as any)[key] = value;\n } else {\n element.setAttribute(key, value);\n }\n};\n\n// Attribute handlers map for optimized lookup\nexport const handlers: Record<\n string,\n (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => void\n> = {\n checked: booleanHandler,\n selected: booleanHandler,\n value: valueHandler,\n valueAsDate: valueHandler,\n valueAsNumber: valueHandler,\n defaultValue: valueHandler,\n defaultChecked: booleanHandler,\n defaultSelected: booleanHandler,\n disabled: booleanHandler,\n readOnly: booleanHandler,\n multiple: booleanHandler,\n required: booleanHandler,\n autofocus: booleanHandler,\n open: booleanHandler,\n controls: booleanHandler,\n autoplay: booleanHandler,\n loop: booleanHandler,\n muted: booleanHandler,\n defer: booleanHandler,\n async: booleanHandler,\n hidden: (element, _key, value) => ((element as HTMLElement).hidden = !!value),\n};\n","import type { KTReactifyProps } from '../reactable/types.js';\nimport type { KTRawAttr, KTAttribute } from '../types/h.js';\nimport { isKT } from '../reactable/common.js';\nimport { nextHandlerId } from '../reactable/reactive.js';\nimport { $addNodeCleanup } from '../jsx/anchor.js';\nimport { handlers } from './attr-helpers.js';\n\nconst defaultHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) =>\n element.setAttribute(key, value);\n\nconst setElementStyle = (\n element: HTMLElement | SVGElement | MathMLElement,\n style: Partial<CSSStyleDeclaration> | string,\n) => {\n if (typeof style === 'string') {\n (element as HTMLElement).style.cssText = style;\n return;\n }\n\n for (const key in style) {\n (element as any).style[key as any] = style[key];\n }\n};\n\nconst addReactiveCleanup = (\n element: HTMLElement | SVGElement | MathMLElement,\n reactive: {\n addOnChange: (handler: (value: any) => void, key?: any) => unknown;\n removeOnChange: (key: any) => unknown;\n },\n handler: (value: any) => void,\n) => {\n reactive.addOnChange(handler, handler);\n $addNodeCleanup(element, () => reactive.removeOnChange(handler));\n};\n\nfunction attrIsObject(element: HTMLElement | SVGElement | MathMLElement, attr: KTReactifyProps<KTAttribute>) {\n const classValue = attr.class || attr.className;\n if (classValue !== undefined) {\n if (isKT<string>(classValue)) {\n element.setAttribute('class', classValue.value);\n addReactiveCleanup(element, classValue, (v) => element.setAttribute('class', v));\n } else {\n element.setAttribute('class', classValue);\n }\n }\n\n const style = attr.style;\n if (style) {\n if (typeof style === 'string') {\n element.setAttribute('style', style);\n } else if (typeof style === 'object') {\n if (isKT(style)) {\n setElementStyle(element, style.value);\n addReactiveCleanup(element, style, (v: Partial<CSSStyleDeclaration> | string) => setElementStyle(element, v));\n } else {\n setElementStyle(element, style as Partial<CSSStyleDeclaration>);\n }\n }\n }\n\n // ! Security: `k-html` is an explicit raw HTML escape hatch. kt.js intentionally does not sanitize here; callers must pass only trusted HTML.\n if ('k-html' in attr) {\n const html = attr['k-html'];\n // ?? 如何在元素消失后自动消除html的onChangeHandler呢\n if (isKT(html)) {\n element.innerHTML = html.value;\n const key = nextHandlerId(html.kid);\n html.addOnChange((v) => (element.innerHTML = v), key);\n $addNodeCleanup(element, () => html.removeOnChange(key));\n } else {\n element.innerHTML = html;\n }\n }\n\n for (const key in attr) {\n // & Arranged in order of usage frequency\n if (\n // key === 'k-if' ||\n // key === 'k-else' ||\n key === 'k-model' ||\n key === 'k-for' ||\n key === 'k-key' ||\n key === 'ref' ||\n key === 'class' ||\n key === 'className' ||\n key === 'style' ||\n key === 'children' ||\n key === 'k-html'\n ) {\n continue;\n }\n\n const o = attr[key];\n\n // normal event handler\n if (key.startsWith('on:')) {\n if (o) {\n const eventName = key.slice(3);\n element.addEventListener(eventName, o); // chop off the `on:`\n $addNodeCleanup(element, () => element.removeEventListener(eventName, o));\n }\n continue;\n }\n\n // normal attributes\n // Security: all non-`on:` attributes are forwarded as-is.\n // Dangerous values such as raw `on*`, `href`, `src`, `srcdoc`, SVG href, etc.\n // remain the caller's responsibility.\n const handler = handlers[key] || defaultHandler;\n if (isKT(o)) {\n handler(element, key, o.value);\n addReactiveCleanup(element, o, (v) => handler(element, key, v));\n } else {\n handler(element, key, o);\n }\n }\n}\n\nexport function applyAttr(element: HTMLElement | SVGElement | MathMLElement, attr: KTRawAttr) {\n if (!attr) {\n return;\n }\n if (typeof attr === 'object' && attr !== null) {\n attrIsObject(element, attr as KTAttribute);\n } else {\n $throw('attr must be an object.');\n }\n}\n","import { $isArray, $isNode, $isThenable } from '@ktjs/shared';\nimport type { KTAvailableContent, KTRawContent } from '../types/h.js';\nimport { isKT } from '../reactable/common.js';\nimport { AnchorType } from '../jsx/anchor.js';\nimport { $addNodeCleanup, $mountFragmentAnchors } from '../jsx/anchor.js';\n\nconst assureNode = (o: any) => ($isNode(o) ? o : document.createTextNode(o));\n\nfunction apdSingle(element: HTMLElement | DocumentFragment | SVGElement | MathMLElement, c: KTAvailableContent) {\n // & Ignores falsy values, consistent with React's behavior\n if (c === undefined || c === null || c === false) {\n return;\n }\n\n if (isKT(c)) {\n let node = assureNode(c.value);\n element.appendChild(node);\n const onChange = (newValue: KTAvailableContent) => {\n const newNode = assureNode(newValue);\n const oldNode = node;\n node = newNode;\n oldNode.replaceWith(newNode);\n $mountFragmentAnchors(newNode);\n };\n c.addOnChange(onChange, onChange);\n $addNodeCleanup(element, () => c.removeOnChange(onChange));\n } else {\n const node = assureNode(c);\n element.appendChild(node);\n const anchor = node as { type?: AnchorType; list?: any[] };\n if (anchor.type === AnchorType.For) {\n apd(element, anchor.list);\n }\n }\n}\n\nfunction apd(element: HTMLElement | DocumentFragment | SVGElement | MathMLElement, c: KTAvailableContent) {\n if ($isThenable(c)) {\n c.then((r) => apd(element, r));\n } else if ($isArray(c)) {\n for (let i = 0; i < c.length; i++) {\n // & might be thenable here too\n const ci = c[i];\n if ($isThenable(ci)) {\n const comment = document.createComment('ktjs-promise-placeholder');\n element.appendChild(comment);\n ci.then((awaited) => {\n if ($isNode(awaited)) {\n // ?? 难道不能都在observer回调里做吗\n comment.replaceWith(awaited);\n $mountFragmentAnchors(awaited);\n } else {\n const awaitedNode = assureNode(awaited);\n comment.replaceWith(awaitedNode);\n $mountFragmentAnchors(awaitedNode);\n }\n });\n } else {\n apdSingle(element, ci);\n }\n }\n } else {\n // & here is thened, so must be a simple elementj\n apdSingle(element, c);\n }\n}\n\nexport function applyContent(element: HTMLElement | SVGElement | MathMLElement, content: KTRawContent): void {\n if ($isArray(content)) {\n for (let i = 0; i < content.length; i++) {\n apd(element, content[i]);\n }\n } else {\n apd(element, content as KTAvailableContent);\n }\n}\n","import type { InputElementTag } from '@ktjs/shared';\nimport type { KTRefLike } from '../reactable/ref.js';\n\nimport { static_cast } from 'type-narrow';\nimport { isRefLike } from '../reactable/common.js';\nimport { $addNodeCleanup } from '../jsx/anchor.js';\n\nexport function applyKModel(element: HTMLElementTagNameMap[InputElementTag], valueRef: KTRefLike<any>) {\n if (!isRefLike(valueRef)) {\n $throw('k-model value must be a KTRefLike.');\n }\n\n if (element.tagName === 'INPUT') {\n static_cast<HTMLInputElement>(element);\n if (element.type === 'radio' || element.type === 'checkbox') {\n element.checked = Boolean(valueRef.value);\n const onChange = () => (valueRef.value = element.checked);\n const onValueChange = (newValue: boolean) => (element.checked = newValue);\n element.addEventListener('change', onChange);\n valueRef.addOnChange(onValueChange, onValueChange);\n $addNodeCleanup(element, () => element.removeEventListener('change', onChange));\n $addNodeCleanup(element, () => valueRef.removeOnChange(onValueChange));\n } else {\n element.value = valueRef.value ?? '';\n const onInput = () => (valueRef.value = element.value);\n const onValueChange = (newValue: string) => (element.value = newValue);\n element.addEventListener('input', onInput);\n valueRef.addOnChange(onValueChange, onValueChange);\n $addNodeCleanup(element, () => element.removeEventListener('input', onInput));\n $addNodeCleanup(element, () => valueRef.removeOnChange(onValueChange));\n }\n return;\n }\n\n if (element.tagName === 'SELECT' || element.tagName === 'TEXTAREA') {\n element.value = valueRef.value ?? '';\n const onChange = () => (valueRef.value = element.value);\n const onValueChange = (newValue: string) => (element.value = newValue);\n element.addEventListener('change', onChange);\n valueRef.addOnChange(onValueChange, onValueChange);\n $addNodeCleanup(element, () => element.removeEventListener('change', onChange));\n $addNodeCleanup(element, () => valueRef.removeOnChange(onValueChange));\n return;\n }\n\n $warn('not supported element for k-model:');\n}\n","import type { HTMLTag, MathMLTag, SVGTag } from '@ktjs/shared';\nimport type { KTRawAttr, KTRawContent, HTML } from '../types/h.js';\n\nimport { applyAttr } from './attr.js';\nimport { applyContent } from './content.js';\nimport { applyKModel } from './model.js';\n\n/**\n * Create an enhanced HTMLElement.\n * - Only supports HTMLElements, **NOT** SVGElements or other Elements.\n * @param tag tag of an `HTMLElement`\n * @param attr attribute object or className\n * @param content a string or an array of HTMLEnhancedElement as child nodes\n *\n * __PKG_INFO__\n */\nexport const h = <T extends HTMLTag | SVGTag | MathMLTag>(\n tag: T,\n attr?: KTRawAttr,\n content?: KTRawContent,\n): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElement(tag) as HTML<T>;\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n return element;\n};\n\nexport const svg = <T extends SVGTag>(tag: T, attr?: KTRawAttr, content?: KTRawContent): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElementNS('http://www.w3.org/2000/svg', tag) as HTML<T>;\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n return element;\n};\n\nexport const mathml = <T extends MathMLTag>(tag: T, attr?: KTRawAttr, content?: KTRawContent): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElementNS('http://www.w3.org/1998/Math/MathML', tag) as HTML<T>;\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n return element;\n};\n","// Use microqueue to schedule the flush of pending reactions\n\nimport type { KTRef } from './ref.js';\n\nconst reactiveToOldValue = new Map<KTRef<any>, any>();\n\nlet scheduled = false;\n\nexport const $markMutation = (reactive: KTRef<any>) => {\n if (!reactiveToOldValue.has(reactive)) {\n // @ts-expect-error accessing protected property\n reactiveToOldValue.set(reactive, reactive._value);\n\n // # schedule by microqueue\n if (scheduled) {\n return;\n }\n\n scheduled = true;\n Promise.resolve().then(() => {\n scheduled = false;\n reactiveToOldValue.forEach((oldValue, reactive) => {\n try {\n // @ts-expect-error accessing protected property\n reactive._changeHandlers.forEach((handler) => handler(reactive.value, oldValue));\n } catch (error) {\n $error('KTScheduler:', error);\n }\n });\n reactiveToOldValue.clear();\n });\n }\n};\n","import { $emptyFn, $is } from '@ktjs/shared';\nimport { $createSubGetter, $createSubSetter, isRefLike } from './common.js';\nimport { KTReactive, KTReactiveType, KTSubReactive } from './reactive.js';\nimport { $markMutation } from './scheduler.js';\n\nexport class KTRef<T> extends KTReactive<T> {\n readonly ktype = KTReactiveType.Ref;\n\n constructor(_value: T) {\n super(_value);\n }\n\n // ! Cannot be omitted, otherwise this will override `KTReactive` with only setter. And getter will return undefined.\n get value() {\n return this._value;\n }\n\n set value(newValue: T) {\n if ($is(newValue, this._value)) {\n return;\n }\n const oldValue = this._value;\n this._value = newValue;\n this._emit(newValue, oldValue);\n }\n\n /**\n * Used to mutate the value in-place.\n * - internal value is changed instantly, but the change handlers will be called in the next microtask.\n */\n get draft() {\n $markMutation(this);\n return this._value;\n }\n\n notify(): this {\n return this._emit(this._value, this._value);\n }\n\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<\n K0 extends keyof T,\n K1 extends keyof T[K0],\n K2 extends keyof T[K0][K1],\n K3 extends keyof T[K0][K1][K2],\n K4 extends keyof T[K0][K1][K2][K3],\n >(key0: K0, key1: K1, key2: K2, key3: K3, key4: K4): KTSubRef<T[K0][K1][K2][K3][K4]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1], K3 extends keyof T[K0][K1][K2]>(\n key0: K0,\n key1: K1,\n key2: K2,\n key3: K3,\n ): KTSubRef<T[K0][K1][K2][K3]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1]>(\n key0: K0,\n key1: K1,\n key2: K2,\n ): KTSubRef<T[K0][K1][K2]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0]>(key0: K0, key1: K1): KTSubRef<T[K0][K1]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T>(key0: K0): KTSubRef<T[K0]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref(...keys: Array<string | number>): KTSubRef<any> {\n if (keys.length === 0) {\n $throw('At least one key is required to get a sub-ref.');\n }\n return new KTSubRef(this, $createSubGetter(keys), $createSubSetter(keys));\n }\n\n dispose(): void {\n this._changeHandlers.clear();\n }\n}\n\n/**\n * Create a reactive reference to a value. The returned object has a single property `value` that holds the internal value.\n * @param value listened value\n */\nexport const ref = <T>(value?: T): KTRef<T> => new KTRef(value as any);\n\n/**\n * Assert `k-model` to be a ref-like object\n */\nexport const assertModel = <T = any>(props: any, defaultValue?: T): KTRefLike<T> => {\n // & props is an object. Won't use it in any other place\n if ('k-model' in props) {\n const kmodel = props['k-model'];\n if (isRefLike(kmodel)) {\n return kmodel;\n } else {\n $throw(`k-model data must be a KTRef object, please use 'ref(...)' to wrap it.`);\n }\n }\n return ref(defaultValue) as KTRef<T>;\n};\n\nconst $refSetter = <T>(props: { ref?: KTRef<T> }, node: T) => (props.ref!.value = node);\ntype RefSetter<T> = (props: { ref?: KTRef<T> }, node: T) => void;\n\nexport type KTRefLike<T> = KTRef<T> | KTSubRef<T>;\n\n/**\n * Whether `props.ref` is a `KTRef` only needs to be checked in the initial render\n */\nexport const $initRef = <T extends Node>(props: { ref?: KTRefLike<T> }, node: T): RefSetter<T> => {\n if (!('ref' in props)) {\n return $emptyFn;\n }\n\n const r = props.ref;\n if (isRefLike(r)) {\n r.value = node;\n return $refSetter;\n } else {\n $throw('Fragment: ref must be a KTRef');\n }\n};\n\n// # SubRef\n\nexport class KTSubRef<T> extends KTSubReactive<T> {\n readonly ktype = KTReactiveType.SubRef;\n declare readonly source: KTRef<any>;\n\n /**\n * @internal\n */\n protected readonly _setter: (s: object, newValue: T) => void;\n\n constructor(\n source: KTRef<any>,\n getter: (sv: KTReactive<any>['value']) => T,\n setter: (s: object, newValue: T) => void,\n ) {\n super(source, getter);\n this._setter = setter;\n }\n\n get value() {\n return this._value;\n }\n\n set value(newValue: T) {\n this._value = newValue;\n // @ts-expect-error _value is private\n this._setter(this.source._value, newValue);\n this.source.notify();\n }\n\n /**\n * Only use it for object's nested properties.\n */\n get draft() {\n // Same implementation as `draft` in `KTRef`\n $markMutation(this.source);\n return this._value;\n }\n}\n","import { $deepMatch, $is } from '@ktjs/shared';\nimport { KTReactive, KTReactiveLike, KTReactiveType, KTSubReactive, nextHandlerId } from './reactive.js';\nimport { $createSubGetter, isReactive, isSubReactive } from './common.js';\n\nexport class KTComputed<T> extends KTReactive<T> {\n readonly ktype = KTReactiveType.Computed;\n\n /**\n * @internal\n */\n private readonly _calculator: () => T;\n /**\n * @internal\n */\n private readonly _dependencies: Array<KTReactiveLike<any>>;\n /**\n * @internal\n */\n private readonly _handler: () => void;\n /**\n * @internal\n */\n protected readonly _handlerKeys: string[];\n private _disposed = false;\n\n private _recalculate(forced: boolean = false): this {\n const newValue = this._calculator();\n const oldValue = this._value;\n if (!$is(oldValue, newValue) || forced) {\n this._value = newValue;\n this._emit(newValue, oldValue);\n }\n return this;\n }\n\n constructor(calculator: () => T, dependencies: Array<KTReactiveLike<any>>) {\n super(calculator());\n this._calculator = calculator;\n this._dependencies = dependencies;\n this._handler = () => this._recalculate();\n this._handlerKeys = dependencies.map(() => nextHandlerId(this.kid));\n\n const uniqueSources = new Set<KTReactive<any>>();\n for (let i = 0; i < dependencies.length; i++) {\n const dep = dependencies[i];\n if (isSubReactive(dep)) {\n if (uniqueSources.has(dep.source)) {\n continue;\n } else {\n uniqueSources.add(dep.source);\n }\n }\n dep.addOnChange(this._handler, this._handlerKeys[i]);\n }\n uniqueSources.clear();\n }\n\n notify(): this {\n return this._recalculate(true);\n }\n\n dispose(): void {\n if (this._disposed) {\n return;\n }\n\n this._disposed = true;\n for (let i = 0; i < this._dependencies.length; i++) {\n this._dependencies[i].removeOnChange(this._handlerKeys[i]);\n }\n\n this._dependencies.length = 0;\n this._changeHandlers.clear();\n }\n}\n\nKTReactive.prototype.map = function <U>(\n this: KTReactive<unknown>,\n c: (value: unknown) => U,\n dep?: Array<KTReactive<any>>,\n) {\n return new KTComputed(() => c(this.value), dep ? [this, ...dep] : [this]);\n};\n\nKTReactive.prototype.is = function (this: KTReactive<unknown>, o: unknown) {\n if (isReactive(o)) {\n return new KTSubComputed(this, (v) => $is(v, o.value), o);\n } else {\n return new KTSubComputed(this, (v) => $is(v, o));\n }\n};\n\nKTReactive.prototype.match = function (this: KTReactive<object>, o: object) {\n if (isReactive(o)) {\n return new KTSubComputed(this, (v) => $deepMatch(v, o.value), o);\n } else {\n return new KTSubComputed(this, (v) => $deepMatch(v, o));\n }\n};\n\nKTReactive.prototype.get = function <T>(this: KTReactive<T>, ...keys: Array<string | number>) {\n if (keys.length === 0) {\n $throw('At least one key is required to get a sub-computed.');\n }\n return new KTSubComputed(this, $createSubGetter(keys));\n};\n\n/**\n * Create a computed value that automatically updates when its dependencies change.\n * @param calculator synchronous function that calculates the value of the computed. It should not have side effects.\n * @param dependencies an array of reactive dependencies that the computed value depends on. The computed value will automatically update when any of these dependencies change.\n */\nexport const computed = <T>(calculator: () => T, dependencies: Array<KTReactiveLike<any>>): KTComputed<T> =>\n new KTComputed(calculator, dependencies);\n\n// # SubComputed\n\nexport class KTSubComputed<T> extends KTSubReactive<T> {\n readonly ktype = KTReactiveType.SubComputed;\n\n /**\n * Used for `reactive.is` and `reactive.match` to track the single dependency.\n * @internal\n */\n private readonly _dependency?: KTReactive<any>;\n\n constructor(source: KTReactive<any>, getter: (sv: KTReactive<any>['value']) => T, dependency?: KTReactive<any>) {\n super(source, getter);\n this._dependency = dependency;\n\n if (dependency) {\n this._handlerKeys.push(nextHandlerId(this.kid));\n dependency.addOnChange(this._handler, this._handlerKeys[1]);\n }\n }\n\n get value() {\n return this._value;\n }\n\n dispose(): void {\n this._handlerKeys.forEach((key) => this.source.removeOnChange(key));\n this._dependency?.removeOnChange(this._handlerKeys[1]);\n }\n}\n\nexport type KTComputedLike<T> = KTComputed<T> | KTSubComputed<T>;\n","import { $emptyFn } from '@ktjs/shared';\nimport type { KTReactiveLike } from './reactive.js';\nimport { isSubReactive } from './common.js';\n\ninterface KTEffectOptions {\n lazy: boolean;\n onCleanup: () => void;\n debugName: string;\n}\n\n/**\n * Register a reactive effect with options.\n * @param effectFn The effect function to run when dependencies change\n * @param reactives The reactive dependencies\n * @param options Effect options: lazy, onCleanup, debugName\n * @returns stop function to remove all listeners\n */\nexport function effect(\n effectFn: () => void,\n reactives: Array<KTReactiveLike<any>>,\n options?: Partial<KTEffectOptions>,\n) {\n const { lazy = false, onCleanup = $emptyFn, debugName = '' } = Object(options);\n const listenerKeys: Array<string | number> = [];\n\n let active = true;\n\n const run = () => {\n if (!active) {\n return;\n }\n\n // cleanup before rerun\n onCleanup();\n\n try {\n effectFn();\n } catch (err) {\n $debug('effect error:', debugName, err);\n }\n };\n\n // subscribe to dependencies\n for (let i = 0; i < reactives.length; i++) {\n listenerKeys[i] = i;\n const r = reactives[i];\n if (isSubReactive(r)) {\n // @ts-expect-error _changeHandlers is protected\n r.source._changeHandlers.set(listenerKeys[i], run);\n } else {\n r.addOnChange(run, effectFn);\n }\n }\n\n // auto run unless lazy\n if (!lazy) {\n run();\n }\n\n // stop function\n return () => {\n if (!active) {\n return;\n }\n active = false;\n\n for (let i = 0; i < reactives.length; i++) {\n reactives[i].removeOnChange(effectFn);\n }\n\n // final cleanup\n onCleanup();\n };\n}\n","import type { KTReactive, KTReactiveLike } from './reactive.js';\nimport { isKT } from './common.js';\nimport { ref } from './ref.js';\n\n/**\n * Ensure a value is reactive. If it's already `KTReactiveLike`, return it as is; otherwise, wrap it in a `ref`.\n */\nexport const toReactive = <T>(o: T | KTReactiveLike<T>): KTReactiveLike<T> =>\n isKT(o) ? o : (ref(o as T) as KTReactive<T>);\n\n/**\n * Extracts the value from a KTReactive, or returns the value directly if it's not reactive.\n */\nexport const dereactive = <T>(value: T | KTReactiveLike<T>): T => (isKT<T>(value) ? value.value : value);\n\nexport type { KTRef, KTSubRef, KTRefLike } from './ref.js';\nexport { ref, assertModel } from './ref.js';\nexport type { KTComputed, KTSubComputed, KTComputedLike } from './computed.js';\nexport { computed } from './computed.js';\nexport { KTReactiveType } from './reactive.js';\nexport type * from './reactive.js';\n\nexport {\n isKT,\n isReactiveLike,\n isRef,\n isSubRef,\n isRefLike,\n isComputed,\n isSubComputed,\n isComputedLike,\n isReactive,\n} from './common.js';\nexport { effect } from './effect.js';\nexport type * from './types.js';\n","import type { KTReactiveLike } from '../reactable/reactive.js';\nimport type { KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport { $initRef, type KTRefLike } from '../reactable/ref.js';\n\nimport { $forEach, $isArray } from '@ktjs/shared';\nimport { isKT, toReactive } from '../reactable/index.js';\nimport { $addNodeCleanup, AnchorType, KTAnchor } from './anchor.js';\n\nexport class FragmentAnchor extends KTAnchor<Node> {\n readonly type = AnchorType.Fragment;\n\n constructor() {\n super(AnchorType.Fragment);\n }\n\n /**\n * Remove elements in the list\n */\n removeElements() {\n const list = this.list.slice();\n this.list.length = 0;\n for (let i = 0; i < list.length; i++) {\n const node = list[i] as ChildNode;\n if (node.parentNode) {\n node.remove();\n }\n }\n }\n}\n\nexport interface FragmentProps<T extends Node = Node> {\n /** Array of child elements, supports reactive arrays */\n children: T[] | KTReactiveLike<T[]>;\n\n /** element key function for optimization (future enhancement) */\n key?: (element: T, index: number, array: T[]) => any;\n\n /** ref to get the anchor node */\n ref?: KTRefLike<JSX.Element>;\n}\n\n/**\n * Fragment - Container component for managing arrays of child elements\n *\n * Features:\n * 1. Returns a comment anchor node, child elements are inserted after the anchor\n * 2. Supports reactive arrays, automatically updates DOM when array changes\n * 3. Basic version uses simple replacement algorithm (remove all old elements, insert all new elements)\n * 4. Future enhancement: key-based optimization\n *\n * Usage example:\n * ```tsx\n * const children = ref([<div>A</div>, <div>B</div>]);\n * const fragment = <Fragment children={children} />;\n * document.body.appendChild(fragment);\n *\n * // Automatic update\n * children.value = [<div>C</div>, <div>D</div>];\n * ```\n */\nexport function Fragment<T extends Node = Node>(props: FragmentProps<T>): JSX.Element & FragmentAnchor {\n const anchor = new FragmentAnchor();\n const elements = anchor.list as T[];\n const childrenRef = toReactive(props.children);\n\n const redraw = () => {\n const newElements = childrenRef.value;\n const parent = anchor.parentNode;\n\n if (!parent) {\n elements.length = 0;\n for (let i = 0; i < newElements.length; i++) {\n elements.push(newElements[i]);\n }\n return;\n }\n\n anchor.removeElements();\n elements.length = 0;\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < newElements.length; i++) {\n const element = newElements[i];\n elements.push(element);\n fragment.appendChild(element);\n }\n\n parent.insertBefore(fragment, anchor.nextSibling);\n };\n\n childrenRef.addOnChange(redraw, redraw);\n $addNodeCleanup(anchor, () => childrenRef.removeOnChange(redraw));\n anchor.mountCallback = redraw;\n redraw();\n\n $initRef(props as { ref?: KTRefLike<Node> }, anchor);\n\n return anchor as unknown as JSX.Element & FragmentAnchor;\n}\n\n/**\n * Convert KTRawContent to HTMLElement array\n */\nexport function convertChildrenToElements(children: KTRawContent): Element[] {\n const elements: Element[] = [];\n\n const processChild = (child: any): void => {\n if (child === undefined || child === null || child === false || child === true) {\n // Ignore null, undefined, false, true\n return;\n }\n\n if ($isArray(child)) {\n // Recursively process array\n $forEach(child, processChild);\n return;\n }\n\n if (typeof child === 'string' || typeof child === 'number') {\n const span = document.createElement('span');\n span.textContent = String(child);\n elements.push(span);\n return;\n }\n\n if (child instanceof Element) {\n elements.push(child);\n return;\n }\n\n if (isKT(child)) {\n processChild(child.value);\n return;\n }\n\n $warn('Fragment: unsupported child type', child);\n if (process.env.IS_DEV) {\n throw new Error(`Fragment: unsupported child type`);\n }\n };\n\n processChild(children);\n return elements;\n}\n","import type { JSXTag } from '@ktjs/shared';\nimport type { KTAttribute } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport { h } from '../h/index';\n\nexport const jsxh = (tag: JSXTag, props: KTAttribute): JSX.Element =>\n (typeof tag === 'function' ? tag(props) : h(tag, props, props.children)) as JSX.Element;\n\nexport const placeholder = (data: string): JSX.Element => document.createComment(data) as unknown as JSX.Element;\n","import type { JSXTag, MathMLTag, SVGTag } from '@ktjs/shared';\nimport type { KTAttribute, KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\n\nimport { h, mathml as _mathml, svg as _svg } from '../h/index.js';\nimport { $initRef } from '../reactable/ref.js';\nimport { isComputedLike } from '../reactable/common.js';\n\nimport { convertChildrenToElements, Fragment as FragmentArray } from './fragment.js';\nimport { jsxh, placeholder } from './common.js';\n\nfunction create(\n creator: (tag: any, props: KTAttribute, content?: KTRawContent) => JSX.Element,\n tag: any,\n props: KTAttribute,\n) {\n if (props.ref && isComputedLike(props.ref)) {\n $throw('Cannot assign a computed value to an element.');\n }\n const el = creator(tag, props, props.children);\n $initRef(props, el);\n return el;\n}\n\nexport const jsx = (tag: JSXTag, props: KTAttribute): JSX.Element => create(jsxh, tag, props);\nexport const svg = (tag: SVGTag, props: KTAttribute): JSX.Element => create(_svg, tag, props);\nexport const mathml = (tag: MathMLTag, props: KTAttribute): JSX.Element => create(_mathml, tag, props);\nexport { svg as svgRuntime, mathml as mathmlRuntime };\n\n/**\n * Fragment support - returns an array of children\n * Enhanced Fragment component that manages arrays of elements\n */\nexport function Fragment(props: { children?: KTRawContent }): JSX.Element {\n const { children } = props ?? {};\n\n if (!children) {\n return placeholder('kt-fragment-empty');\n }\n\n const elements = convertChildrenToElements(children);\n\n return FragmentArray({ children: elements });\n}\n\n/**\n * JSX Development runtime - same as jsx but with additional dev checks\n */\nexport const jsxDEV: typeof jsx = (...args) => {\n // console.log('JSX DEV called:', ...args);\n // console.log('children', (args[1] as any)?.children);\n return jsx(...args);\n};\n\n/**\n * JSX runtime for React 17+ automatic runtime\n * This is called when using jsx: \"react-jsx\" or \"react-jsxdev\"\n */\nexport const jsxs = jsx;\n\n// Export h as the classic JSX factory for backward compatibility\nexport { h, h as createElement };\n","import { $isThenable } from '@ktjs/shared';\nimport type { KTComponent, KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport type { KTRef } from '../reactable/ref.js';\nimport { $mountFragmentAnchors } from './anchor.js';\n\n/**\n * Extract component props type (excluding ref and children)\n */\ntype ExtractComponentProps<T> = T extends (props: infer P) => any ? Omit<P, 'ref' | 'children'> : {};\n\nexport function KTAsync<T extends KTComponent>(\n props: {\n ref?: KTRef<JSX.Element>;\n skeleton?: JSX.Element;\n component: T;\n children?: KTRawContent;\n } & ExtractComponentProps<T>,\n): JSX.Element {\n const raw = props.component(props);\n let comp: JSX.Element =\n props.skeleton ?? (document.createComment('ktjs-suspense-placeholder') as unknown as JSX.Element);\n\n if ($isThenable(raw)) {\n raw.then((resolved) => {\n comp.replaceWith(resolved);\n $mountFragmentAnchors(resolved);\n });\n } else {\n comp = raw as JSX.Element;\n }\n\n return comp;\n}\n","import type { JSX } from '../types/jsx.js';\nimport type { KTRefLike } from '../reactable/ref.js';\nimport type { KTReactiveLike } from '../reactable/reactive.js';\n\nimport { $identity } from '@ktjs/shared';\nimport { toReactive } from '../reactable/index.js';\nimport { $initRef } from '../reactable/ref.js';\nimport { $addNodeCleanup } from './anchor.js';\nimport { AnchorType, KTAnchor } from './anchor.js';\n\nexport class KTForAnchor extends KTAnchor<JSX.Element> {\n readonly type = AnchorType.For;\n\n constructor() {\n super(AnchorType.For);\n }\n}\n\nexport type KTForElement = JSX.Element & KTForAnchor;\n\nexport interface KTForProps<T> {\n ref?: KTRefLike<KTForElement>;\n list: T[] | KTReactiveLike<T[]>;\n key?: (item: T, index: number, array: T[]) => any;\n map?: (item: T, index: number, array: T[]) => JSX.Element;\n}\n\nconst setForNodeMap = (nodeMap: Map<any, JSX.Element>, key: any, node: JSX.Element, index: number) => {\n if (nodeMap.has(key)) {\n $error(`[KTFor] Duplicate key detected at index ${index}. Later items override earlier ones. key=${String(key)}`);\n }\n nodeMap.set(key, node);\n};\n\n// TASK 对于template标签的for和if,会编译为fragment,可特殊处理,让它们保持原样\n/**\n * KTFor - List rendering component with key-based optimization\n * Returns a Comment anchor node with rendered elements in anchor.list\n */\nexport function KTFor<T>(props: KTForProps<T>): KTForElement {\n const redraw = () => {\n const newList = listRef.value;\n const parent = anchor.parentNode;\n\n if (!parent) {\n anchor.list.length = 0;\n nodeMap.clear();\n for (let index = 0; index < newList.length; index++) {\n const item = newList[index];\n const itemKey = currentKey(item, index, newList);\n const node = currentMap(item, index, newList);\n setForNodeMap(nodeMap, itemKey, node, index);\n anchor.list.push(node);\n }\n return anchor;\n }\n\n const oldLength = anchor.list.length;\n const newLength = newList.length;\n\n if (newLength === 0) {\n nodeMap.forEach((node) => node.remove());\n nodeMap.clear();\n anchor.list.length = 0;\n return anchor;\n }\n\n if (oldLength === 0) {\n anchor.list.length = 0;\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < newLength; i++) {\n const item = newList[i];\n const itemKey = currentKey(item, i, newList);\n const node = currentMap(item, i, newList);\n setForNodeMap(nodeMap, itemKey, node, i);\n anchor.list.push(node);\n fragment.appendChild(node);\n }\n parent.insertBefore(fragment, anchor.nextSibling);\n return anchor;\n }\n\n const newKeyToNewIndex = new Map<any, number>();\n const newElements: JSX.Element[] = new Array(newLength);\n for (let i = 0; i < newLength; i++) {\n const item = newList[i];\n const itemKey = currentKey(item, i, newList);\n newKeyToNewIndex.set(itemKey, i);\n newElements[i] = nodeMap.has(itemKey) ? nodeMap.get(itemKey)! : currentMap(item, i, newList);\n }\n\n const toRemove: JSX.Element[] = [];\n nodeMap.forEach((node, key) => {\n if (!newKeyToNewIndex.has(key)) {\n toRemove.push(node);\n }\n });\n for (let i = 0; i < toRemove.length; i++) {\n toRemove[i].remove();\n }\n\n let currentNode = anchor.nextSibling;\n for (let i = 0; i < newLength; i++) {\n const node = newElements[i];\n if (currentNode !== node) {\n parent.insertBefore(node, currentNode);\n } else {\n currentNode = currentNode.nextSibling;\n }\n }\n\n nodeMap.clear();\n anchor.list.length = 0;\n for (let i = 0; i < newLength; i++) {\n const itemKey = currentKey(newList[i], i, newList);\n const node = newElements[i];\n setForNodeMap(nodeMap, itemKey, node, i);\n anchor.list.push(node);\n }\n return anchor;\n };\n\n const currentKey: NonNullable<KTForProps<T>['key']> = props.key ?? ((item: T) => item);\n const currentMap: NonNullable<KTForProps<T>['map']> =\n props.map ?? ((item: T) => $identity(item) as unknown as JSX.Element);\n const listRef = toReactive(props.list);\n const anchor = new KTForAnchor() as KTForElement;\n const nodeMap = new Map<any, JSX.Element>();\n\n for (let index = 0; index < listRef.value.length; index++) {\n const item = listRef.value[index];\n const itemKey = currentKey(item, index, listRef.value);\n const node = currentMap(item, index, listRef.value);\n setForNodeMap(nodeMap, itemKey, node, index);\n anchor.list.push(node);\n }\n\n listRef.addOnChange(redraw, redraw);\n $addNodeCleanup(anchor, () => listRef.removeOnChange(redraw));\n anchor.mountCallback = redraw;\n $initRef(props, anchor);\n\n return anchor;\n}\n","import type { JSXTag } from '@ktjs/shared';\nimport type { KTAttribute } from '../types/h.js';\nimport type { KTReactiveLike } from '../reactable/reactive.js';\n\nimport { isKT } from '../reactable/index.js';\nimport { $addNodeCleanup, $mountFragmentAnchors, $removeNodeCleanup } from './anchor.js';\nimport { jsxh, placeholder } from './common.js';\n\nexport function KTConditional(\n condition: any | KTReactiveLike<any>,\n tagIf: JSXTag,\n propsIf: KTAttribute,\n tagElse?: JSXTag,\n propsElse?: KTAttribute,\n) {\n if (!isKT(condition)) {\n return condition ? jsxh(tagIf, propsIf) : tagElse ? jsxh(tagElse, propsElse!) : placeholder('kt-conditional');\n }\n\n if (tagElse) {\n let current = condition.value ? jsxh(tagIf, propsIf) : jsxh(tagElse!, propsElse!);\n const cleanup = () => condition.removeOnChange(onChange);\n const onChange = (newValue: any) => {\n const old = current;\n current = newValue ? jsxh(tagIf, propsIf) : jsxh(tagElse!, propsElse!);\n $removeNodeCleanup(old, cleanup);\n $addNodeCleanup(current, cleanup);\n old.replaceWith(current);\n $mountFragmentAnchors(current);\n };\n condition.addOnChange(onChange, onChange);\n $addNodeCleanup(current, cleanup);\n return current;\n } else {\n const dummy = placeholder('kt-conditional') as HTMLElement;\n let current = condition.value ? jsxh(tagIf, propsIf) : dummy;\n const cleanup = () => condition.removeOnChange(onChange);\n const onChange = (newValue: any) => {\n const old = current;\n current = newValue ? jsxh(tagIf, propsIf) : dummy;\n $removeNodeCleanup(old, cleanup);\n $addNodeCleanup(current, cleanup);\n old.replaceWith(current);\n $mountFragmentAnchors(current);\n };\n condition.addOnChange(onChange, onChange);\n $addNodeCleanup(current, cleanup);\n return current;\n }\n}\n"],"names":["isKT","obj","kid","isReactiveLike","ktype","isRef","isSubRef","isRefLike","isComputed","isSubComputed","isComputedLike","isReactive","isSubReactive","$createSubGetter","path","length","s","r","i","handlerId","nextHandlerId","KTReactiveLike","nextKid","KTReactive","_value","_changeHandlers","Map","constructor","value","super","this","_newValue","console","warn","_emit","newValue","oldValue","forEach","handler","addOnChange","key","has","Error","$stringify","set","removeOnChange","delete","clearOnChange","clear","notify","map","calculator","dependencies","is","o","match","get","_keys","KTSubReactive","source","_getter","_handler","_handlerKeys","getter","push","dispose","KTAnchor","Comment","isKTAnchor","list","mountCallback","data","$ensureAnchorObserver","mount","parent","parentNode","appendChild","CANNOT_MOUNT","document","Node","CANNOT_OBSERVE","MutationObserver","COMMENT_FILTER","NodeFilter","SHOW_COMMENT","nodeToCleanups","WeakMap","anchorObserver","$cleanupRemovedNode","node","nodeType","children","Array","from","childNodes","anchor","slice","listNode","remove","$runNodeCleanups","body","records","disconnect","undefined","addedNodes","j","$mountFragmentAnchors","removedNodes","observe","childList","subtree","$mountIfFragmentAnchor","cleanups","error","$addNodeCleanup","cleanup","getOrInsert","$removeNodeCleanup","index","indexOf","splice","nodeObj","walker","createTreeWalker","current","nextNode","booleanHandler","element","setAttribute","valueHandler","handlers","checked","selected","valueAsDate","valueAsNumber","defaultValue","defaultChecked","defaultSelected","disabled","readOnly","multiple","required","autofocus","open","controls","autoplay","loop","muted","defer","async","hidden","_key","defaultHandler","setElementStyle","style","cssText","addReactiveCleanup","reactive","applyAttr","attr","classValue","class","className","v","html","innerHTML","startsWith","eventName","addEventListener","removeEventListener","attrIsObject","assureNode","$isNode","createTextNode","apdSingle","c","onChange","newNode","oldNode","replaceWith","type","apd","$isThenable","then","$isArray","ci","comment","createComment","awaited","awaitedNode","applyContent","content","applyKModel","valueRef","tagName","onValueChange","Boolean","onInput","h","tag","createElement","svg","createElementNS","mathml","reactiveToOldValue","scheduled","$markMutation","Promise","resolve","KTRef","$is","draft","subref","keys","KTSubRef","$createSubSetter","ref","assertModel","props","kmodel","$refSetter","$initRef","$emptyFn","_setter","setter","KTComputed","_calculator","_dependencies","_disposed","_recalculate","forced","uniqueSources","Set","dep","add","prototype","KTSubComputed","$deepMatch","computed","_dependency","dependency","effect","effectFn","reactives","options","lazy","onCleanup","debugName","Object","listenerKeys","active","run","err","debug","toReactive","dereactive","FragmentAnchor","removeElements","jsxh","placeholder","create","creator","el","jsx","_svg","_mathml","Fragment","elements","processChild","child","$forEach","span","textContent","String","Element","convertChildrenToElements","childrenRef","redraw","newElements","fragment","createDocumentFragment","insertBefore","nextSibling","FragmentArray","jsxDEV","args","jsxs","KTAsync","raw","component","comp","skeleton","resolved","KTForAnchor","setForNodeMap","nodeMap","KTFor","newList","listRef","item","itemKey","currentKey","currentMap","oldLength","newLength","newKeyToNewIndex","toRemove","currentNode","$identity","KTConditional","condition","tagIf","propsIf","tagElse","propsElse","old","dummy"],"mappings":"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"}
|
package/package.json
CHANGED