@estjs/template 0.0.15-beta.1 → 0.0.15-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/template.cjs.js +3 -3
- package/dist/template.cjs.js.map +1 -1
- package/dist/template.d.cts +89 -2285
- package/dist/template.d.ts +89 -2285
- package/dist/template.dev.cjs.js +425 -282
- package/dist/template.dev.esm.js +427 -285
- package/dist/template.esm.js +4 -4
- package/dist/template.esm.js.map +1 -1
- package/package.json +3 -3
- package/types/component.d.ts +0 -21
- package/types/index.d.ts +0 -3
- package/types/jsx.d.ts +0 -2209
- package/types/node.d.ts +0 -15
package/dist/template.dev.esm.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { isObject,
|
|
1
|
+
import { isObject, startsWith, isHTMLElement, isString, error, isArray, camelCase, capitalize, warn, isSpecialBooleanAttr, isBooleanAttr, includeBooleanAttr, isSymbol, isUndefined, isPromise, isFunction, coerceArray, isFalsy, isNumber, isPrimitive, isNil, kebabCase } from '@estjs/shared';
|
|
2
2
|
export { escapeHTML } from '@estjs/shared';
|
|
3
|
-
import { shallowReactive, isSignal,
|
|
3
|
+
import { effect, shallowReactive, isSignal, signal, isComputed } from '@estjs/signals';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* @estjs/template v0.0.15-beta.
|
|
6
|
+
* @estjs/template v0.0.15-beta.5
|
|
7
7
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
8
8
|
* @license MIT
|
|
9
9
|
**/
|
|
@@ -43,125 +43,117 @@ var __async = (__this, __arguments, generator) => {
|
|
|
43
43
|
step((generator = generator.apply(__this, __arguments)).next());
|
|
44
44
|
});
|
|
45
45
|
};
|
|
46
|
-
var
|
|
47
|
-
var
|
|
48
|
-
var
|
|
49
|
-
function
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
var activeScope = null;
|
|
47
|
+
var scopeId = 0;
|
|
48
|
+
var scopeStack = [];
|
|
49
|
+
function getActiveScope() {
|
|
50
|
+
return activeScope;
|
|
51
|
+
}
|
|
52
|
+
function setActiveScope(scope) {
|
|
53
|
+
activeScope = scope;
|
|
54
|
+
}
|
|
55
|
+
function createScope(parent = activeScope) {
|
|
56
|
+
const scope = {
|
|
57
|
+
id: ++scopeId,
|
|
52
58
|
parent,
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
children: null,
|
|
60
|
+
// Lazy initialized
|
|
61
|
+
provides: null,
|
|
62
|
+
// Lazy initialized
|
|
63
|
+
cleanup: null,
|
|
64
|
+
// Lazy initialized
|
|
65
|
+
onMount: null,
|
|
66
|
+
// Lazy initialized
|
|
67
|
+
onUpdate: null,
|
|
68
|
+
// Lazy initialized
|
|
69
|
+
onDestroy: null,
|
|
70
|
+
// Lazy initialized
|
|
71
|
+
isMounted: false,
|
|
72
|
+
isDestroyed: false
|
|
61
73
|
};
|
|
62
74
|
if (parent) {
|
|
63
|
-
parent.children
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
function getActiveContext() {
|
|
68
|
-
return activeContext;
|
|
69
|
-
}
|
|
70
|
-
function pushContextStack(context) {
|
|
71
|
-
if (activeContext) {
|
|
72
|
-
contextStack.push(activeContext);
|
|
73
|
-
}
|
|
74
|
-
activeContext = context;
|
|
75
|
-
}
|
|
76
|
-
function popContextStack() {
|
|
77
|
-
activeContext = contextStack.pop() || null;
|
|
78
|
-
}
|
|
79
|
-
function destroyContext(context) {
|
|
80
|
-
if (!context || context.isDestroy) {
|
|
81
|
-
return;
|
|
75
|
+
if (!parent.children) {
|
|
76
|
+
parent.children = /* @__PURE__ */ new Set();
|
|
77
|
+
}
|
|
78
|
+
parent.children.add(scope);
|
|
82
79
|
}
|
|
83
|
-
|
|
84
|
-
childrenToDestroy.forEach(destroyContext);
|
|
85
|
-
cleanupContext(context);
|
|
80
|
+
return scope;
|
|
86
81
|
}
|
|
87
|
-
function
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (context.parent) {
|
|
92
|
-
context.parent.children.delete(context);
|
|
93
|
-
context.parent = null;
|
|
82
|
+
function runWithScope(scope, fn) {
|
|
83
|
+
const prevScope = activeScope;
|
|
84
|
+
if (prevScope) {
|
|
85
|
+
scopeStack.push(prevScope);
|
|
94
86
|
}
|
|
87
|
+
activeScope = scope;
|
|
95
88
|
try {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
context.update.clear();
|
|
100
|
-
context.destroy.clear();
|
|
101
|
-
context.provides.clear();
|
|
102
|
-
context.children.clear();
|
|
103
|
-
} catch (error_) {
|
|
104
|
-
error("Error during context cleanup:", error_);
|
|
89
|
+
return fn();
|
|
90
|
+
} finally {
|
|
91
|
+
activeScope = scopeStack.length > 0 ? scopeStack.pop() : prevScope;
|
|
105
92
|
}
|
|
106
|
-
context.isDestroy = true;
|
|
107
93
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
update: "update"
|
|
112
|
-
};
|
|
113
|
-
function registerLifecycleHook(type, hook) {
|
|
114
|
-
const context = getActiveContext();
|
|
115
|
-
if (!context) {
|
|
116
|
-
error(`Cannot register ${type} hook outside component context`);
|
|
94
|
+
function disposeScope(scope) {
|
|
95
|
+
var _a2, _b, _c, _d, _e;
|
|
96
|
+
if (!scope || scope.isDestroyed) {
|
|
117
97
|
return;
|
|
118
98
|
}
|
|
119
|
-
if (
|
|
120
|
-
|
|
121
|
-
|
|
99
|
+
if (scope.children) {
|
|
100
|
+
const children = Array.from(scope.children);
|
|
101
|
+
for (const child of children) {
|
|
102
|
+
disposeScope(child);
|
|
103
|
+
}
|
|
122
104
|
}
|
|
123
|
-
if (
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
105
|
+
if (scope.onDestroy) {
|
|
106
|
+
for (const hook of scope.onDestroy) {
|
|
107
|
+
try {
|
|
108
|
+
hook();
|
|
109
|
+
} catch (error_) {
|
|
110
|
+
{
|
|
111
|
+
error(`Scope(${scope.id}): Error in destroy hook:`, error_);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
128
114
|
}
|
|
129
|
-
|
|
115
|
+
scope.onDestroy.clear();
|
|
130
116
|
}
|
|
131
|
-
|
|
117
|
+
if (scope.cleanup) {
|
|
118
|
+
for (const fn of scope.cleanup) {
|
|
119
|
+
try {
|
|
120
|
+
fn();
|
|
121
|
+
} catch (error_) {
|
|
122
|
+
{
|
|
123
|
+
error(`Scope(${scope.id}): Error in cleanup:`, error_);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
scope.cleanup.clear();
|
|
128
|
+
}
|
|
129
|
+
if ((_a2 = scope.parent) == null ? void 0 : _a2.children) {
|
|
130
|
+
scope.parent.children.delete(scope);
|
|
131
|
+
}
|
|
132
|
+
(_b = scope.children) == null ? void 0 : _b.clear();
|
|
133
|
+
(_c = scope.provides) == null ? void 0 : _c.clear();
|
|
134
|
+
(_d = scope.onMount) == null ? void 0 : _d.clear();
|
|
135
|
+
(_e = scope.onUpdate) == null ? void 0 : _e.clear();
|
|
136
|
+
setActiveScope(scope.parent);
|
|
137
|
+
scope.parent = null;
|
|
138
|
+
scope.isDestroyed = true;
|
|
132
139
|
}
|
|
133
|
-
function
|
|
134
|
-
const
|
|
135
|
-
if (!
|
|
136
|
-
|
|
140
|
+
function onCleanup(fn) {
|
|
141
|
+
const scope = activeScope;
|
|
142
|
+
if (!scope) {
|
|
143
|
+
{
|
|
144
|
+
error("onCleanup() must be called within a scope");
|
|
145
|
+
}
|
|
137
146
|
return;
|
|
138
147
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
return;
|
|
148
|
+
if (!scope.cleanup) {
|
|
149
|
+
scope.cleanup = /* @__PURE__ */ new Set();
|
|
142
150
|
}
|
|
143
|
-
|
|
144
|
-
try {
|
|
145
|
-
hook();
|
|
146
|
-
} catch (error_) {
|
|
147
|
-
{
|
|
148
|
-
error(`Error in ${type} lifecycle hook:`, error_);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
function onMount(hook) {
|
|
154
|
-
registerLifecycleHook(LIFECYCLE.mount, hook);
|
|
155
|
-
}
|
|
156
|
-
function onDestroy(hook) {
|
|
157
|
-
registerLifecycleHook(LIFECYCLE.destroy, hook);
|
|
158
|
-
}
|
|
159
|
-
function onUpdate(hook) {
|
|
160
|
-
registerLifecycleHook(LIFECYCLE.update, hook);
|
|
151
|
+
scope.cleanup.add(fn);
|
|
161
152
|
}
|
|
162
153
|
|
|
163
154
|
// src/constants.ts
|
|
164
155
|
var EVENT_PREFIX = "on";
|
|
156
|
+
var SPREAD_NAME = "_$spread$";
|
|
165
157
|
var REF_KEY = "ref";
|
|
166
158
|
var KEY_PROP = "key";
|
|
167
159
|
var SVG_NAMESPACE = "http://www.w3.org/2000/svg";
|
|
@@ -251,6 +243,36 @@ function getNodeKey(node) {
|
|
|
251
243
|
}
|
|
252
244
|
|
|
253
245
|
// src/utils.ts
|
|
246
|
+
function omitProps(target, keys) {
|
|
247
|
+
const excludeSet = new Set(keys);
|
|
248
|
+
return new Proxy(target, {
|
|
249
|
+
// Intercept property reads
|
|
250
|
+
get(obj, prop) {
|
|
251
|
+
if (excludeSet.has(prop)) {
|
|
252
|
+
return void 0;
|
|
253
|
+
}
|
|
254
|
+
return Reflect.get(obj, prop);
|
|
255
|
+
},
|
|
256
|
+
// Intercept property enumeration (for...in, Object.keys, etc.)
|
|
257
|
+
ownKeys(obj) {
|
|
258
|
+
return Reflect.ownKeys(obj).filter((key) => !excludeSet.has(key));
|
|
259
|
+
},
|
|
260
|
+
// Intercept property descriptor retrieval
|
|
261
|
+
getOwnPropertyDescriptor(obj, prop) {
|
|
262
|
+
if (excludeSet.has(prop)) {
|
|
263
|
+
return void 0;
|
|
264
|
+
}
|
|
265
|
+
return Reflect.getOwnPropertyDescriptor(obj, prop);
|
|
266
|
+
},
|
|
267
|
+
// Intercept the 'in' operator
|
|
268
|
+
has(obj, prop) {
|
|
269
|
+
if (excludeSet.has(prop)) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
return Reflect.has(obj, prop);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
254
276
|
function removeNode(node) {
|
|
255
277
|
if (!node) return;
|
|
256
278
|
try {
|
|
@@ -266,7 +288,7 @@ function removeNode(node) {
|
|
|
266
288
|
error("Failed to remove node:", _error);
|
|
267
289
|
}
|
|
268
290
|
}
|
|
269
|
-
function insertNode(parent, child, before
|
|
291
|
+
function insertNode(parent, child, before) {
|
|
270
292
|
if (!parent || !child) return;
|
|
271
293
|
try {
|
|
272
294
|
const beforeNode = isComponent(before) ? before.firstChild : before;
|
|
@@ -291,19 +313,23 @@ function insertNode(parent, child, before = null) {
|
|
|
291
313
|
function replaceNode(parent, newNode, oldNode) {
|
|
292
314
|
if (!parent || !newNode || !oldNode || newNode === oldNode) return;
|
|
293
315
|
try {
|
|
294
|
-
|
|
316
|
+
const beforeNode = isComponent(oldNode) ? oldNode.beforeNode : oldNode.nextSibling;
|
|
295
317
|
removeNode(oldNode);
|
|
318
|
+
insertNode(parent, newNode, beforeNode);
|
|
296
319
|
} catch (_error) {
|
|
297
320
|
error("Failed to replace node:", _error);
|
|
298
321
|
}
|
|
299
322
|
}
|
|
300
323
|
function getFirstDOMNode(node) {
|
|
301
324
|
if (!node) {
|
|
302
|
-
return
|
|
325
|
+
return;
|
|
303
326
|
}
|
|
304
327
|
if (isComponent(node)) {
|
|
305
328
|
return node.firstChild;
|
|
306
329
|
}
|
|
330
|
+
if (isPrimitive(node)) {
|
|
331
|
+
return void 0;
|
|
332
|
+
}
|
|
307
333
|
return node;
|
|
308
334
|
}
|
|
309
335
|
function isSameNode(a, b) {
|
|
@@ -320,6 +346,9 @@ function isSameNode(a, b) {
|
|
|
320
346
|
if (aIsComponent !== bIsComponent) {
|
|
321
347
|
return false;
|
|
322
348
|
}
|
|
349
|
+
if (isPrimitive(a) || isPrimitive(b)) {
|
|
350
|
+
return a === b;
|
|
351
|
+
}
|
|
323
352
|
const aNode = a;
|
|
324
353
|
const bNode = b;
|
|
325
354
|
if (aNode.nodeType !== bNode.nodeType) {
|
|
@@ -426,11 +455,9 @@ function patchChildren(parent, oldChildren, newChildren, anchor) {
|
|
|
426
455
|
return [];
|
|
427
456
|
}
|
|
428
457
|
if (oldLength === 0) {
|
|
429
|
-
const fragment = document.createDocumentFragment();
|
|
430
458
|
for (let i = 0; i < newLength; i++) {
|
|
431
|
-
insertNode(
|
|
459
|
+
insertNode(parent, newChildren[i], anchor);
|
|
432
460
|
}
|
|
433
|
-
insertNode(parent, fragment, anchor);
|
|
434
461
|
return newChildren;
|
|
435
462
|
}
|
|
436
463
|
if (newLength === 0) {
|
|
@@ -662,12 +689,9 @@ function getSequence(arr) {
|
|
|
662
689
|
// src/binding.ts
|
|
663
690
|
function addEventListener(element, event, handler, options) {
|
|
664
691
|
element.addEventListener(event, handler, options);
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
element.removeEventListener(event, handler, options);
|
|
669
|
-
});
|
|
670
|
-
}
|
|
692
|
+
onCleanup(() => {
|
|
693
|
+
element.removeEventListener(event, handler, options);
|
|
694
|
+
});
|
|
671
695
|
}
|
|
672
696
|
function bindElement(node, key, defaultValue, setter) {
|
|
673
697
|
if (isHtmlInputElement(node)) {
|
|
@@ -723,23 +747,28 @@ function bindElement(node, key, defaultValue, setter) {
|
|
|
723
747
|
});
|
|
724
748
|
}
|
|
725
749
|
}
|
|
726
|
-
function insert(parent, nodeFactory, before
|
|
750
|
+
function insert(parent, nodeFactory, before) {
|
|
727
751
|
if (!parent) return;
|
|
728
|
-
const
|
|
729
|
-
if (!context) return;
|
|
752
|
+
const ownerScope = getActiveScope();
|
|
730
753
|
let renderedNodes = [];
|
|
731
754
|
const cleanup = effect(() => {
|
|
732
|
-
const
|
|
733
|
-
|
|
734
|
-
|
|
755
|
+
const executeUpdate = () => {
|
|
756
|
+
const rawNodes = isFunction(nodeFactory) ? nodeFactory() : nodeFactory;
|
|
757
|
+
const nodes = coerceArray(rawNodes).map((item) => isFunction(item) ? item() : item).flatMap((i) => i).map(normalizeNode);
|
|
758
|
+
renderedNodes = patchChildren(parent, renderedNodes, nodes, before);
|
|
759
|
+
};
|
|
760
|
+
if (ownerScope && !ownerScope.isDestroyed) {
|
|
761
|
+
runWithScope(ownerScope, executeUpdate);
|
|
762
|
+
} else {
|
|
763
|
+
executeUpdate();
|
|
764
|
+
}
|
|
735
765
|
});
|
|
736
|
-
|
|
766
|
+
onCleanup(() => {
|
|
737
767
|
cleanup();
|
|
738
|
-
|
|
739
|
-
renderedNodes.forEach((node) => removeNode(node));
|
|
740
|
-
}
|
|
768
|
+
renderedNodes.forEach((node) => removeNode(node));
|
|
741
769
|
renderedNodes.length = 0;
|
|
742
770
|
});
|
|
771
|
+
return renderedNodes;
|
|
743
772
|
}
|
|
744
773
|
function mapNodes(template2, indexes) {
|
|
745
774
|
const len = indexes.length;
|
|
@@ -765,6 +794,99 @@ function mapNodes(template2, indexes) {
|
|
|
765
794
|
walk(template2);
|
|
766
795
|
return tree;
|
|
767
796
|
}
|
|
797
|
+
function registerMountHook(hook) {
|
|
798
|
+
const scope = getActiveScope();
|
|
799
|
+
if (!scope) {
|
|
800
|
+
{
|
|
801
|
+
error("onMount() must be called within a scope");
|
|
802
|
+
}
|
|
803
|
+
return;
|
|
804
|
+
}
|
|
805
|
+
if (scope.isMounted) {
|
|
806
|
+
try {
|
|
807
|
+
hook();
|
|
808
|
+
} catch (error_) {
|
|
809
|
+
{
|
|
810
|
+
error(`Scope(${scope.id}): Error in mount hook:`, error_);
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
return;
|
|
814
|
+
}
|
|
815
|
+
if (!scope.onMount) {
|
|
816
|
+
scope.onMount = /* @__PURE__ */ new Set();
|
|
817
|
+
}
|
|
818
|
+
scope.onMount.add(hook);
|
|
819
|
+
}
|
|
820
|
+
function registerUpdateHook(hook) {
|
|
821
|
+
const scope = getActiveScope();
|
|
822
|
+
if (!scope) {
|
|
823
|
+
{
|
|
824
|
+
error("onUpdate() must be called within a scope");
|
|
825
|
+
}
|
|
826
|
+
return;
|
|
827
|
+
}
|
|
828
|
+
if (!scope.onUpdate) {
|
|
829
|
+
scope.onUpdate = /* @__PURE__ */ new Set();
|
|
830
|
+
}
|
|
831
|
+
scope.onUpdate.add(hook);
|
|
832
|
+
}
|
|
833
|
+
function registerDestroyHook(hook) {
|
|
834
|
+
const scope = getActiveScope();
|
|
835
|
+
if (!scope) {
|
|
836
|
+
{
|
|
837
|
+
error("onDestroy() must be called within a scope");
|
|
838
|
+
}
|
|
839
|
+
return;
|
|
840
|
+
}
|
|
841
|
+
if (!scope.onDestroy) {
|
|
842
|
+
scope.onDestroy = /* @__PURE__ */ new Set();
|
|
843
|
+
}
|
|
844
|
+
scope.onDestroy.add(hook);
|
|
845
|
+
}
|
|
846
|
+
function triggerMountHooks(scope) {
|
|
847
|
+
if (!scope || scope.isDestroyed || scope.isMounted) {
|
|
848
|
+
return;
|
|
849
|
+
}
|
|
850
|
+
scope.isMounted = true;
|
|
851
|
+
if (scope.onMount) {
|
|
852
|
+
runWithScope(scope, () => {
|
|
853
|
+
for (const hook of scope.onMount) {
|
|
854
|
+
try {
|
|
855
|
+
hook();
|
|
856
|
+
} catch (error_) {
|
|
857
|
+
if (true) {
|
|
858
|
+
error(`Scope(${scope.id}): Error in mount hook:`, error_);
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
});
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
function triggerUpdateHooks(scope) {
|
|
866
|
+
if (!scope || scope.isDestroyed) {
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
if (scope.onUpdate) {
|
|
870
|
+
for (const hook of scope.onUpdate) {
|
|
871
|
+
try {
|
|
872
|
+
hook();
|
|
873
|
+
} catch (error_) {
|
|
874
|
+
{
|
|
875
|
+
error(`Scope(${scope.id}): Error in update hook:`, error_);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
function onMount(hook) {
|
|
882
|
+
registerMountHook(hook);
|
|
883
|
+
}
|
|
884
|
+
function onDestroy(hook) {
|
|
885
|
+
registerDestroyHook(hook);
|
|
886
|
+
}
|
|
887
|
+
function onUpdate(hook) {
|
|
888
|
+
registerUpdateHook(hook);
|
|
889
|
+
}
|
|
768
890
|
|
|
769
891
|
// src/component.ts
|
|
770
892
|
var _a;
|
|
@@ -773,71 +895,74 @@ var Component = class {
|
|
|
773
895
|
constructor(component, props) {
|
|
774
896
|
this.component = component;
|
|
775
897
|
this.props = props;
|
|
776
|
-
// component rendered
|
|
777
|
-
this.
|
|
778
|
-
// component context
|
|
779
|
-
this.
|
|
898
|
+
// component rendered nodes (supports arrays and fragments)
|
|
899
|
+
this.renderedNodes = [];
|
|
900
|
+
// component scope (unified context management)
|
|
901
|
+
this.scope = null;
|
|
780
902
|
// component parent node
|
|
781
|
-
this.parentNode =
|
|
903
|
+
this.parentNode = void 0;
|
|
782
904
|
// component before node
|
|
783
|
-
this.beforeNode =
|
|
905
|
+
this.beforeNode = void 0;
|
|
784
906
|
// component props
|
|
785
907
|
this.reactiveProps = {};
|
|
786
|
-
this._propSnapshots = {};
|
|
787
908
|
// component state
|
|
788
909
|
this.state = 0 /* INITIAL */;
|
|
789
|
-
//
|
|
790
|
-
this.
|
|
791
|
-
// component parent context
|
|
792
|
-
this.parentContext = null;
|
|
910
|
+
// parent scope captured at construction time
|
|
911
|
+
this.parentScope = null;
|
|
793
912
|
// component type
|
|
794
913
|
// @ts-ignore
|
|
795
914
|
this[_a] = true;
|
|
796
915
|
this.key = (props == null ? void 0 : props.key) ? normalizeKey(props.key) : getComponentKey(component);
|
|
797
916
|
this.reactiveProps = shallowReactive(__spreadValues({}, this.props || {}));
|
|
798
|
-
this.
|
|
799
|
-
if (this.props) {
|
|
800
|
-
for (const key in this.props) {
|
|
801
|
-
const val = this.props[key];
|
|
802
|
-
if (isObject(val) && val !== null) {
|
|
803
|
-
this._propSnapshots[key] = Array.isArray(val) ? [...val] : __spreadValues({}, val);
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
}
|
|
917
|
+
this.parentScope = getActiveScope();
|
|
807
918
|
}
|
|
808
919
|
get isConnected() {
|
|
809
920
|
return this.state === 2 /* MOUNTED */;
|
|
810
921
|
}
|
|
811
922
|
get firstChild() {
|
|
812
|
-
|
|
813
|
-
|
|
923
|
+
for (const node of this.renderedNodes) {
|
|
924
|
+
const dom = getFirstDOMNode(node);
|
|
925
|
+
if (dom) {
|
|
926
|
+
return dom;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
return void 0;
|
|
814
930
|
}
|
|
815
931
|
mount(parentNode, beforeNode) {
|
|
932
|
+
var _a2;
|
|
816
933
|
this.parentNode = parentNode;
|
|
817
|
-
this.beforeNode = beforeNode
|
|
934
|
+
this.beforeNode = beforeNode;
|
|
818
935
|
this.state = 1 /* MOUNTING */;
|
|
819
|
-
if (this.
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
result =
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
936
|
+
if (this.renderedNodes.length > 0) {
|
|
937
|
+
for (const node of this.renderedNodes) {
|
|
938
|
+
insertNode(parentNode, node, beforeNode);
|
|
939
|
+
}
|
|
940
|
+
this.state = 2 /* MOUNTED */;
|
|
941
|
+
return this.renderedNodes;
|
|
942
|
+
}
|
|
943
|
+
const parent = (_a2 = this.parentScope) != null ? _a2 : getActiveScope();
|
|
944
|
+
this.scope = createScope(parent);
|
|
945
|
+
const renderedNodes = runWithScope(this.scope, () => {
|
|
946
|
+
var _a3;
|
|
947
|
+
let result = this.component(this.reactiveProps);
|
|
948
|
+
if (isFunction(result)) {
|
|
949
|
+
result = result(this.reactiveProps);
|
|
950
|
+
}
|
|
951
|
+
if (isSignal(result) || isComputed(result)) {
|
|
952
|
+
result = result.value;
|
|
953
|
+
}
|
|
954
|
+
const nodes = (_a3 = insert(parentNode, result, beforeNode)) != null ? _a3 : [];
|
|
955
|
+
return nodes;
|
|
956
|
+
});
|
|
957
|
+
this.renderedNodes = renderedNodes;
|
|
958
|
+
runWithScope(this.scope, () => {
|
|
959
|
+
this.applyProps(this.props || {});
|
|
960
|
+
});
|
|
835
961
|
this.state = 2 /* MOUNTED */;
|
|
836
|
-
if (this.
|
|
837
|
-
this.
|
|
962
|
+
if (this.scope) {
|
|
963
|
+
triggerMountHooks(this.scope);
|
|
838
964
|
}
|
|
839
|
-
|
|
840
|
-
return this.renderedNode;
|
|
965
|
+
return this.renderedNodes;
|
|
841
966
|
}
|
|
842
967
|
update(prevNode) {
|
|
843
968
|
if (this.key !== prevNode.key) {
|
|
@@ -846,76 +971,79 @@ var Component = class {
|
|
|
846
971
|
}
|
|
847
972
|
this.parentNode = prevNode.parentNode;
|
|
848
973
|
this.beforeNode = prevNode.beforeNode;
|
|
849
|
-
this.
|
|
850
|
-
this.
|
|
974
|
+
this.scope = prevNode.scope;
|
|
975
|
+
this.parentScope = prevNode.parentScope;
|
|
976
|
+
this.renderedNodes = prevNode.renderedNodes;
|
|
851
977
|
this.state = prevNode.state;
|
|
852
978
|
this.reactiveProps = prevNode.reactiveProps;
|
|
853
|
-
this._propSnapshots = prevNode._propSnapshots;
|
|
854
979
|
if (this.props) {
|
|
855
980
|
for (const key in this.props) {
|
|
856
981
|
if (key === "key") continue;
|
|
857
982
|
const newValue = this.props[key];
|
|
858
983
|
const oldValue = this.reactiveProps[key];
|
|
859
|
-
if (
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
}
|
|
866
|
-
} else {
|
|
867
|
-
if (hasChanged(newValue, oldValue)) {
|
|
868
|
-
this.reactiveProps[key] = newValue;
|
|
869
|
-
if (this._propSnapshots[key]) {
|
|
870
|
-
delete this._propSnapshots[key];
|
|
871
|
-
}
|
|
984
|
+
if (Object.is(oldValue, newValue)) {
|
|
985
|
+
continue;
|
|
986
|
+
}
|
|
987
|
+
if (isObject(oldValue) && isObject(newValue)) {
|
|
988
|
+
if (shallowCompare(oldValue, newValue)) {
|
|
989
|
+
continue;
|
|
872
990
|
}
|
|
873
991
|
}
|
|
992
|
+
this.reactiveProps[key] = newValue;
|
|
874
993
|
}
|
|
875
994
|
}
|
|
876
995
|
if (!this.isConnected && this.parentNode) {
|
|
877
996
|
this.mount(this.parentNode, this.beforeNode);
|
|
878
997
|
}
|
|
879
|
-
if (this.
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
998
|
+
if (this.scope) {
|
|
999
|
+
runWithScope(this.scope, () => {
|
|
1000
|
+
this.applyProps(this.props || {});
|
|
1001
|
+
});
|
|
1002
|
+
triggerUpdateHooks(this.scope);
|
|
884
1003
|
}
|
|
885
1004
|
return this;
|
|
886
1005
|
}
|
|
887
1006
|
forceUpdate() {
|
|
888
1007
|
return __async(this, null, function* () {
|
|
889
|
-
|
|
1008
|
+
yield Promise.resolve();
|
|
1009
|
+
if (this.state === 5 /* DESTROYED */ || !this.parentNode || !this.scope) {
|
|
890
1010
|
return;
|
|
891
1011
|
}
|
|
892
|
-
const
|
|
893
|
-
let newNode;
|
|
1012
|
+
const originalNodes = [...this.renderedNodes];
|
|
894
1013
|
try {
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
}
|
|
905
|
-
if (prevNode && newNode && prevNode !== newNode) {
|
|
1014
|
+
runWithScope(this.scope, () => {
|
|
1015
|
+
let result = this.component(this.reactiveProps);
|
|
1016
|
+
if (isFunction(result)) {
|
|
1017
|
+
result = result(this.reactiveProps);
|
|
1018
|
+
}
|
|
1019
|
+
if (isSignal(result) || isComputed(result)) {
|
|
1020
|
+
result = result.value;
|
|
1021
|
+
}
|
|
1022
|
+
const newNodes = coerceArray(result);
|
|
906
1023
|
if (this.parentNode) {
|
|
907
|
-
|
|
908
|
-
this.
|
|
1024
|
+
let anchor = this.beforeNode;
|
|
1025
|
+
if (!anchor && this.renderedNodes.length > 0) {
|
|
1026
|
+
const lastNode = this.renderedNodes[this.renderedNodes.length - 1];
|
|
1027
|
+
const lastDom = getFirstDOMNode(lastNode);
|
|
1028
|
+
if (lastDom) {
|
|
1029
|
+
anchor = lastDom.nextSibling;
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
for (const node of this.renderedNodes) {
|
|
1033
|
+
removeNode(node);
|
|
1034
|
+
}
|
|
1035
|
+
for (const node of newNodes) {
|
|
1036
|
+
insertNode(this.parentNode, node, anchor);
|
|
1037
|
+
}
|
|
1038
|
+
this.renderedNodes = newNodes;
|
|
909
1039
|
}
|
|
1040
|
+
});
|
|
1041
|
+
if (this.scope) {
|
|
1042
|
+
triggerUpdateHooks(this.scope);
|
|
910
1043
|
}
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
throw _error;
|
|
915
|
-
} finally {
|
|
916
|
-
if (this.componentContext) {
|
|
917
|
-
popContextStack();
|
|
918
|
-
}
|
|
1044
|
+
} catch (error10) {
|
|
1045
|
+
this.renderedNodes = originalNodes;
|
|
1046
|
+
throw error10;
|
|
919
1047
|
}
|
|
920
1048
|
});
|
|
921
1049
|
}
|
|
@@ -927,21 +1055,18 @@ var Component = class {
|
|
|
927
1055
|
return;
|
|
928
1056
|
}
|
|
929
1057
|
this.state = 4 /* DESTROYING */;
|
|
930
|
-
const
|
|
931
|
-
if (
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
}
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
this.renderedNode = null;
|
|
943
|
-
this.parentNode = null;
|
|
944
|
-
this.beforeNode = null;
|
|
1058
|
+
const scope = this.scope;
|
|
1059
|
+
if (scope) {
|
|
1060
|
+
disposeScope(scope);
|
|
1061
|
+
this.scope = null;
|
|
1062
|
+
}
|
|
1063
|
+
for (const node of this.renderedNodes) {
|
|
1064
|
+
removeNode(node);
|
|
1065
|
+
}
|
|
1066
|
+
this.renderedNodes = [];
|
|
1067
|
+
this.parentNode = void 0;
|
|
1068
|
+
this.beforeNode = void 0;
|
|
1069
|
+
this.parentScope = null;
|
|
945
1070
|
this.reactiveProps = {};
|
|
946
1071
|
this.props = void 0;
|
|
947
1072
|
this.state = 5 /* DESTROYED */;
|
|
@@ -950,14 +1075,15 @@ var Component = class {
|
|
|
950
1075
|
if (!props) {
|
|
951
1076
|
return;
|
|
952
1077
|
}
|
|
1078
|
+
const firstElement = this.firstChild;
|
|
953
1079
|
for (const [propName, propValue] of Object.entries(props)) {
|
|
954
|
-
if (startsWith(propName, EVENT_PREFIX) &&
|
|
1080
|
+
if (startsWith(propName, EVENT_PREFIX) && firstElement) {
|
|
955
1081
|
const eventName = propName.slice(2).toLowerCase();
|
|
956
|
-
if (isHTMLElement(
|
|
957
|
-
addEventListener(
|
|
1082
|
+
if (isHTMLElement(firstElement)) {
|
|
1083
|
+
addEventListener(firstElement, eventName, propValue);
|
|
958
1084
|
}
|
|
959
1085
|
} else if (propName === REF_KEY && isSignal(propValue)) {
|
|
960
|
-
propValue.value =
|
|
1086
|
+
propValue.value = firstElement;
|
|
961
1087
|
}
|
|
962
1088
|
}
|
|
963
1089
|
this.props = props;
|
|
@@ -1003,26 +1129,37 @@ function createApp(component, target) {
|
|
|
1003
1129
|
return rootComponent;
|
|
1004
1130
|
}
|
|
1005
1131
|
function provide(key, value) {
|
|
1006
|
-
const
|
|
1007
|
-
if (!
|
|
1008
|
-
|
|
1132
|
+
const scope = getActiveScope();
|
|
1133
|
+
if (!scope) {
|
|
1134
|
+
{
|
|
1135
|
+
error("provide() must be called within a scope");
|
|
1136
|
+
}
|
|
1009
1137
|
return;
|
|
1010
1138
|
}
|
|
1011
|
-
|
|
1139
|
+
if (!scope.provides) {
|
|
1140
|
+
scope.provides = /* @__PURE__ */ new Map();
|
|
1141
|
+
}
|
|
1142
|
+
scope.provides.set(key, value);
|
|
1012
1143
|
}
|
|
1013
1144
|
function inject(key, defaultValue) {
|
|
1014
|
-
const
|
|
1015
|
-
|
|
1016
|
-
|
|
1145
|
+
const scope = getActiveScope();
|
|
1146
|
+
console.log(scope);
|
|
1147
|
+
if (!scope) {
|
|
1148
|
+
{
|
|
1149
|
+
error("inject() must be called within a scope");
|
|
1150
|
+
}
|
|
1017
1151
|
return defaultValue;
|
|
1018
1152
|
}
|
|
1019
|
-
let
|
|
1020
|
-
while (
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1153
|
+
let current = scope;
|
|
1154
|
+
while (current) {
|
|
1155
|
+
if (current.provides) {
|
|
1156
|
+
console.log(current.provides);
|
|
1157
|
+
const value = current.provides.get(key);
|
|
1158
|
+
if (value) {
|
|
1159
|
+
return value;
|
|
1160
|
+
}
|
|
1024
1161
|
}
|
|
1025
|
-
|
|
1162
|
+
current = current.parent;
|
|
1026
1163
|
}
|
|
1027
1164
|
return defaultValue;
|
|
1028
1165
|
}
|
|
@@ -1208,10 +1345,6 @@ function autoPrefix(style, rawName) {
|
|
|
1208
1345
|
return rawName;
|
|
1209
1346
|
}
|
|
1210
1347
|
function patchAttr(el, key, prev, next) {
|
|
1211
|
-
if (key === REF_KEY) {
|
|
1212
|
-
prev.value = el;
|
|
1213
|
-
return;
|
|
1214
|
-
}
|
|
1215
1348
|
if (key === KEY_PROP) {
|
|
1216
1349
|
if (next == null) {
|
|
1217
1350
|
setNodeKey(el, void 0);
|
|
@@ -1220,6 +1353,17 @@ function patchAttr(el, key, prev, next) {
|
|
|
1220
1353
|
}
|
|
1221
1354
|
return;
|
|
1222
1355
|
}
|
|
1356
|
+
if (key === SPREAD_NAME) {
|
|
1357
|
+
{
|
|
1358
|
+
if (!isObject(next)) {
|
|
1359
|
+
warn("spread attribute must be an object");
|
|
1360
|
+
}
|
|
1361
|
+
}
|
|
1362
|
+
Object.keys(next).forEach((k) => {
|
|
1363
|
+
patchAttr(el, k, prev == null ? void 0 : prev[k], next == null ? void 0 : next[k]);
|
|
1364
|
+
});
|
|
1365
|
+
return;
|
|
1366
|
+
}
|
|
1223
1367
|
const elementIsSVG = (el == null ? void 0 : el.namespaceURI) === SVG_NAMESPACE;
|
|
1224
1368
|
const isXlink = elementIsSVG && key.startsWith("xlink:");
|
|
1225
1369
|
const isXmlns = elementIsSVG && key.startsWith("xmlns:");
|
|
@@ -1304,29 +1448,18 @@ function addEvent(el, event, handler, options) {
|
|
|
1304
1448
|
el.removeEventListener(event, wrappedHandler, cleanOptions);
|
|
1305
1449
|
};
|
|
1306
1450
|
}
|
|
1307
|
-
|
|
1308
|
-
// src/components/Fragment.ts
|
|
1309
1451
|
function Fragment(props) {
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
const childArray = Array.isArray(children) ? children : [children];
|
|
1320
|
-
childArray.forEach((child) => {
|
|
1321
|
-
if (child != null) {
|
|
1322
|
-
const normalized = normalizeNode(child);
|
|
1323
|
-
if (normalized) {
|
|
1324
|
-
insertNode(fragment, normalized);
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
|
-
});
|
|
1452
|
+
{
|
|
1453
|
+
if (!props) {
|
|
1454
|
+
error("Fragment component requires props");
|
|
1455
|
+
return null;
|
|
1456
|
+
}
|
|
1457
|
+
if (!props.children) {
|
|
1458
|
+
error("Fragment component requires children");
|
|
1459
|
+
return null;
|
|
1460
|
+
}
|
|
1328
1461
|
}
|
|
1329
|
-
return
|
|
1462
|
+
return props == null ? void 0 : props.children;
|
|
1330
1463
|
}
|
|
1331
1464
|
Fragment["fragment" /* FRAGMENT */] = true;
|
|
1332
1465
|
function isFragment(node) {
|
|
@@ -1334,34 +1467,43 @@ function isFragment(node) {
|
|
|
1334
1467
|
}
|
|
1335
1468
|
function Portal(props) {
|
|
1336
1469
|
if (typeof document === "undefined") {
|
|
1337
|
-
const
|
|
1338
|
-
if (!
|
|
1339
|
-
const childArray = isArray(
|
|
1470
|
+
const children2 = props.children;
|
|
1471
|
+
if (!children2) return "";
|
|
1472
|
+
const childArray = isArray(children2) ? children2 : [children2];
|
|
1340
1473
|
return childArray.map((child) => String(child || "")).join("");
|
|
1341
1474
|
}
|
|
1342
1475
|
const placeholder = document.createComment("portal");
|
|
1343
1476
|
placeholder["portal" /* PORTAL */] = true;
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1477
|
+
const children = props.children;
|
|
1478
|
+
if (children) {
|
|
1479
|
+
const childArray = isArray(children) ? children : [children];
|
|
1480
|
+
const nodes = [];
|
|
1481
|
+
onMount(() => {
|
|
1482
|
+
const targetElement = isString(props.target) ? document.querySelector(props.target) : props.target;
|
|
1483
|
+
if (!targetElement) {
|
|
1484
|
+
{
|
|
1485
|
+
warn(`[Portal] Target element not found: ${props.target}`);
|
|
1486
|
+
}
|
|
1487
|
+
return;
|
|
1349
1488
|
}
|
|
1350
|
-
return;
|
|
1351
|
-
}
|
|
1352
|
-
const children = props.children;
|
|
1353
|
-
if (children) {
|
|
1354
|
-
const childArray = isArray(children) ? children : [children];
|
|
1355
1489
|
childArray.forEach((child) => {
|
|
1356
1490
|
if (child != null) {
|
|
1357
1491
|
const normalized = normalizeNode(child);
|
|
1358
1492
|
if (normalized) {
|
|
1359
1493
|
insertNode(targetElement, normalized);
|
|
1494
|
+
nodes.push(normalized);
|
|
1360
1495
|
}
|
|
1361
1496
|
}
|
|
1362
1497
|
});
|
|
1363
|
-
|
|
1364
|
-
|
|
1498
|
+
onCleanup(() => {
|
|
1499
|
+
nodes.forEach((node) => {
|
|
1500
|
+
if (typeof node !== "string" && node.parentNode === targetElement) {
|
|
1501
|
+
targetElement.removeChild(node);
|
|
1502
|
+
}
|
|
1503
|
+
});
|
|
1504
|
+
});
|
|
1505
|
+
});
|
|
1506
|
+
}
|
|
1365
1507
|
return placeholder;
|
|
1366
1508
|
}
|
|
1367
1509
|
Portal["portal" /* PORTAL */] = true;
|
|
@@ -1417,12 +1559,12 @@ function Suspense(props) {
|
|
|
1417
1559
|
container.removeChild(container.firstChild);
|
|
1418
1560
|
}
|
|
1419
1561
|
if (children2 == null) return;
|
|
1420
|
-
const
|
|
1562
|
+
const currentScope = getActiveScope();
|
|
1421
1563
|
const childArray = isArray(children2) ? children2 : [children2];
|
|
1422
1564
|
childArray.forEach((child) => {
|
|
1423
1565
|
if (child != null) {
|
|
1424
1566
|
if (isComponent(child)) {
|
|
1425
|
-
child.parentContext =
|
|
1567
|
+
child.parentContext = currentScope;
|
|
1426
1568
|
}
|
|
1427
1569
|
const normalized = normalizeNode(child);
|
|
1428
1570
|
if (normalized) {
|
|
@@ -1794,4 +1936,4 @@ function hydrate(component, container, props = {}) {
|
|
|
1794
1936
|
}
|
|
1795
1937
|
}
|
|
1796
1938
|
|
|
1797
|
-
export { Component, Fragment, Portal, Suspense, SuspenseContext, addEvent, addEventListener, bindElement, createApp, createComponent, createResource, createSSGComponent, delegateEvents, getHydrationKey, getRenderedElement, hydrate, inject, insert, isComponent, isFragment, isPortal, isSuspense, mapNodes, mapSSRNodes, normalizeClass, onDestroy, onMount, onUpdate, patchAttr, patchClass, patchStyle, provide, render, renderToString, setSSGAttr, setStyle, template };
|
|
1939
|
+
export { Component, Fragment, Portal, Suspense, SuspenseContext, addEvent, addEventListener, bindElement, createApp, createComponent, createResource, createSSGComponent, delegateEvents, getHydrationKey, getRenderedElement, hydrate, inject, insert, isComponent, isFragment, isPortal, isSuspense, mapNodes, mapSSRNodes, normalizeClass, omitProps, onDestroy, onMount, onUpdate, patchAttr, patchClass, patchStyle, provide, render, renderToString, setSSGAttr, setStyle, template };
|