@vobs/runtime 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/async-boundary.cjs +73 -374
  2. package/dist/async-boundary.cjs.map +1 -1
  3. package/dist/async-boundary.js +44 -367
  4. package/dist/async-boundary.js.map +1 -1
  5. package/dist/bind.cjs +83 -234
  6. package/dist/bind.cjs.map +1 -1
  7. package/dist/bind.js +54 -227
  8. package/dist/bind.js.map +1 -1
  9. package/dist/boundary.cjs +67 -369
  10. package/dist/boundary.cjs.map +1 -1
  11. package/dist/boundary.js +42 -366
  12. package/dist/boundary.js.map +1 -1
  13. package/dist/debug.cjs +41 -12
  14. package/dist/debug.cjs.map +1 -1
  15. package/dist/debug.js +10 -3
  16. package/dist/debug.js.map +1 -1
  17. package/dist/dynamic.cjs +76 -378
  18. package/dist/dynamic.cjs.map +1 -1
  19. package/dist/dynamic.js +43 -367
  20. package/dist/dynamic.js.map +1 -1
  21. package/dist/error-boundary.cjs +72 -371
  22. package/dist/error-boundary.cjs.map +1 -1
  23. package/dist/error-boundary.js +43 -366
  24. package/dist/error-boundary.js.map +1 -1
  25. package/dist/error.cjs +35 -9
  26. package/dist/error.cjs.map +1 -1
  27. package/dist/error.js +7 -3
  28. package/dist/error.js.map +1 -1
  29. package/dist/fragment.cjs +44 -133
  30. package/dist/fragment.cjs.map +1 -1
  31. package/dist/fragment.js +19 -130
  32. package/dist/fragment.js.map +1 -1
  33. package/dist/hmr.cjs +50 -22
  34. package/dist/hmr.cjs.map +1 -1
  35. package/dist/hmr.js +9 -3
  36. package/dist/hmr.js.map +1 -1
  37. package/dist/index.cjs +193 -462
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.js +92 -385
  40. package/dist/index.js.map +1 -1
  41. package/dist/ops.cjs +126 -242
  42. package/dist/ops.cjs.map +1 -1
  43. package/dist/ops.js +76 -214
  44. package/dist/ops.js.map +1 -1
  45. package/dist/profiler.cjs +69 -320
  46. package/dist/profiler.cjs.map +1 -1
  47. package/dist/profiler.js +40 -315
  48. package/dist/profiler.js.map +1 -1
  49. package/dist/ref.cjs +33 -131
  50. package/dist/ref.cjs.map +1 -1
  51. package/dist/ref.js +10 -130
  52. package/dist/ref.js.map +1 -1
  53. package/dist/renderer.cjs +18 -2
  54. package/dist/renderer.cjs.map +1 -1
  55. package/dist/renderer.js +0 -2
  56. package/dist/renderer.js.map +1 -1
  57. package/dist/template.cjs +29 -6
  58. package/dist/template.cjs.map +1 -1
  59. package/dist/template.js +4 -3
  60. package/dist/template.js.map +1 -1
  61. package/package.json +6 -2
package/dist/dynamic.js CHANGED
@@ -1,367 +1,14 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
- // packages/reactivity/src/debug.ts
5
- var activeDebugHooks = null;
6
- var signalNames = /* @__PURE__ */ new WeakMap();
7
- function hasDebugHooks() {
8
- return activeDebugHooks !== null;
9
- }
10
- __name(hasDebugHooks, "hasDebugHooks");
11
- function setSignalDebugName(signal, name) {
12
- signalNames.set(signal, name);
13
- invokeDebug("signalNamed", signal, name);
14
- }
15
- __name(setSignalDebugName, "setSignalDebugName");
16
- function invokeDebug(name, ...args) {
17
- return;
18
- }
19
- __name(invokeDebug, "invokeDebug");
20
-
21
- // packages/reactivity/src/owner.ts
22
- var currentOwner = null;
23
- var nextOwnerId = 1;
24
- var ownerNames = /* @__PURE__ */ new WeakMap();
25
- function createOwner() {
26
- const parent = currentOwner;
27
- let disposed = parent?.disposed ?? false;
28
- const children = [];
29
- const cleanups = [];
30
- const errorHandlers = /* @__PURE__ */ new Set();
31
- const owner = {
32
- id: `owner-${nextOwnerId++}`,
33
- parent,
34
- children,
35
- depth: (parent?.depth ?? -1) + 1,
36
- get disposed() {
37
- return disposed;
38
- },
39
- run(fn) {
40
- if (disposed) throw new Error("Vobs: \u5DF2\u9500\u6BC1\u7684 Owner \u4E0D\u80FD\u7EE7\u7EED\u8FD0\u884C");
41
- const previous = currentOwner;
42
- currentOwner = owner;
43
- try {
44
- return fn();
45
- } finally {
46
- currentOwner = previous;
47
- }
48
- },
49
- addCleanup(cleanup) {
50
- if (disposed) {
51
- cleanup();
52
- return;
53
- }
54
- cleanups.push(cleanup);
55
- },
56
- onDispose(cleanup) {
57
- owner.addCleanup(cleanup);
58
- },
59
- onError(handler) {
60
- errorHandlers.add(handler);
61
- const remove = /* @__PURE__ */ __name(() => errorHandlers.delete(handler), "remove");
62
- owner.addCleanup(remove);
63
- return remove;
64
- },
65
- handleError(error) {
66
- for (const handler of [...errorHandlers].reverse()) {
67
- try {
68
- handler(error);
69
- return true;
70
- } catch (handlerError) {
71
- return parent?.handleError(handlerError) ?? false;
72
- }
73
- }
74
- return parent?.handleError(error) ?? false;
75
- },
76
- dispose() {
77
- if (disposed) return;
78
- disposed = true;
79
- for (const child of [...children]) child.dispose();
80
- children.length = 0;
81
- let firstError;
82
- for (let index = cleanups.length - 1; index >= 0; index--) {
83
- try {
84
- cleanups[index]();
85
- } catch (error) {
86
- firstError ?? (firstError = error);
87
- }
88
- }
89
- cleanups.length = 0;
90
- if (parent) {
91
- const index = parent.children.indexOf(owner);
92
- if (index >= 0) parent.children.splice(index, 1);
93
- }
94
- if (firstError) throw firstError;
95
- }
96
- };
97
- if (parent && !parent.disposed) parent.children.push(owner);
98
- return owner;
99
- }
100
- __name(createOwner, "createOwner");
101
- function setOwnerDebugName(owner, name) {
102
- ownerNames.set(owner, name);
103
- }
104
- __name(setOwnerDebugName, "setOwnerDebugName");
105
- function getCurrentOwner() {
106
- return currentOwner;
107
- }
108
- __name(getCurrentOwner, "getCurrentOwner");
109
-
110
- // packages/reactivity/src/signal.ts
111
- var currentSubscriber = null;
112
- function getCurrentSubscriber() {
113
- return currentSubscriber;
114
- }
115
- __name(getCurrentSubscriber, "getCurrentSubscriber");
116
- function setCurrentSubscriber(subscriber) {
117
- currentSubscriber = subscriber;
118
- }
119
- __name(setCurrentSubscriber, "setCurrentSubscriber");
120
- function trackDependency(dependency) {
121
- if (!currentSubscriber || currentSubscriber.disposed) return;
122
- !currentSubscriber.dependencies.has(dependency);
123
- currentSubscriber.dependencies.add(dependency);
124
- }
125
- __name(trackDependency, "trackDependency");
126
- function state(initialValue, debugName) {
127
- let value = initialValue;
128
- let disposed = false;
129
- const subscribers = /* @__PURE__ */ new Set();
130
- const signalInstance = {
131
- get value() {
132
- const subscriber = getCurrentSubscriber();
133
- if (subscriber && !subscriber.disposed) {
134
- subscribers.add(subscriber);
135
- trackDependency(signalInstance);
136
- }
137
- return value;
138
- },
139
- set value(nextValue) {
140
- if (disposed || Object.is(value, nextValue)) return;
141
- value = nextValue;
142
- for (const subscriber of [...subscribers]) subscriber.notify();
143
- },
144
- unsubscribe(subscriber) {
145
- subscribers.delete(subscriber);
146
- },
147
- // 与 `.value =` 赋值同一条路径:判等短路、debug hook、notify 全部一致。
148
- // 以闭包实现,可安全地作为回调直接传递(无 this 绑定问题)。
149
- set(next) {
150
- signalInstance.value = next;
151
- },
152
- dispose() {
153
- if (disposed) return;
154
- disposed = true;
155
- subscribers.clear();
156
- }
157
- };
158
- const owner = getCurrentOwner();
159
- owner?.addCleanup(signalInstance.dispose);
160
- if (debugName?.trim()) setSignalDebugName(signalInstance, debugName.trim());
161
- return signalInstance;
162
- }
163
- __name(state, "state");
164
-
165
- // packages/reactivity/src/scheduler.ts
166
- var _Scheduler = class _Scheduler {
167
- constructor() {
168
- this.dirtyEffects = /* @__PURE__ */ new Set();
169
- this.lowPriorityEffects = /* @__PURE__ */ new Set();
170
- // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。
171
- this.normalBuffer = [];
172
- this.lowBuffer = [];
173
- this.flushing = false;
174
- this.scheduled = false;
175
- this.batchDepth = 0;
176
- }
177
- schedule(effect2) {
178
- if (effect2.disposed) return;
179
- this.dirtyEffects.add(effect2);
180
- this.lowPriorityEffects.delete(effect2);
181
- this.ensureScheduled();
182
- }
183
- /** Queue an effect behind normal updates while preserving deterministic order. */
184
- scheduleLow(effect2) {
185
- if (effect2.disposed) return;
186
- if (!this.dirtyEffects.has(effect2)) this.lowPriorityEffects.add(effect2);
187
- this.ensureScheduled();
188
- }
189
- ensureScheduled() {
190
- if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {
191
- this.scheduled = true;
192
- queueMicrotask(() => {
193
- this.scheduled = false;
194
- this.flush();
195
- });
196
- }
197
- }
198
- remove(effect2) {
199
- this.dirtyEffects.delete(effect2);
200
- this.lowPriorityEffects.delete(effect2);
201
- }
202
- batch(fn) {
203
- this.batchDepth++;
204
- try {
205
- return fn();
206
- } finally {
207
- this.batchDepth--;
208
- if (this.batchDepth === 0) this.flush();
209
- }
210
- }
211
- flush() {
212
- if (this.flushing || this.batchDepth > 0) return;
213
- this.flushing = true;
214
- let rounds = 0;
215
- let firstError;
216
- let hasError = false;
217
- try {
218
- while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {
219
- if (++rounds > 100) {
220
- this.dirtyEffects.clear();
221
- this.lowPriorityEffects.clear();
222
- throw new Error("Vobs: \u54CD\u5E94\u5F0F\u66F4\u65B0\u8D85\u8FC7 100 \u8F6E\uFF0C\u53EF\u80FD\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56");
223
- }
224
- this.collectRunnable(this.dirtyEffects, this.normalBuffer);
225
- this.collectRunnable(this.lowPriorityEffects, this.lowBuffer);
226
- sortEffects(this.normalBuffer);
227
- sortEffects(this.lowBuffer);
228
- for (const effect2 of this.normalBuffer) {
229
- try {
230
- effect2.run();
231
- } catch (error) {
232
- if (!hasError) {
233
- firstError = error;
234
- hasError = true;
235
- }
236
- }
237
- }
238
- for (const effect2 of this.lowBuffer) {
239
- try {
240
- effect2.run();
241
- } catch (error) {
242
- if (!hasError) {
243
- firstError = error;
244
- hasError = true;
245
- }
246
- }
247
- }
248
- this.normalBuffer.length = 0;
249
- this.lowBuffer.length = 0;
250
- }
251
- } finally {
252
- this.normalBuffer.length = 0;
253
- this.lowBuffer.length = 0;
254
- this.flushing = false;
255
- }
256
- if (hasError) throw firstError;
257
- }
258
- /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */
259
- collectRunnable(source, target) {
260
- for (const effect2 of source) {
261
- if (!effect2.disposed) target.push(effect2);
262
- }
263
- source.clear();
264
- }
265
- };
266
- __name(_Scheduler, "Scheduler");
267
- var Scheduler = _Scheduler;
268
- function sortEffects(effects) {
269
- if (effects.length > 1) {
270
- effects.sort((a, b) => b.depth - a.depth || a.order - b.order);
271
- }
272
- }
273
- __name(sortEffects, "sortEffects");
274
- var scheduler = new Scheduler();
4
+ // packages/runtime/src/dynamic.ts
5
+ import { createOwner as createOwner2, effect, state } from "@vobs/reactivity";
275
6
 
276
- // packages/reactivity/src/effect.ts
277
- var nextEffectOrder = 1;
278
- function cleanupDependencies(subscriber) {
279
- for (const dependency of subscriber.dependencies) {
280
- dependency.unsubscribe(subscriber);
281
- }
282
- subscriber.dependencies.clear();
283
- }
284
- __name(cleanupDependencies, "cleanupDependencies");
285
- function effect(callback) {
286
- const owner = getCurrentOwner();
287
- let cleanup;
288
- let dirty = true;
289
- let disposed = false;
290
- const eff = {
291
- order: nextEffectOrder++,
292
- depth: owner?.depth ?? 0,
293
- dependencies: /* @__PURE__ */ new Set(),
294
- get disposed() {
295
- return disposed;
296
- },
297
- notify() {
298
- if (disposed || dirty) return;
299
- dirty = true;
300
- scheduler.schedule(eff);
301
- },
302
- run() {
303
- if (disposed || !dirty) return;
304
- dirty = false;
305
- const previousCleanup = cleanup;
306
- cleanup = void 0;
307
- let cleanupError;
308
- if (previousCleanup) {
309
- try {
310
- previousCleanup();
311
- } catch (error) {
312
- const handled2 = owner?.handleError(error) ?? false;
313
- if (!handled2) cleanupError = error;
314
- }
315
- }
316
- cleanupDependencies(eff);
317
- const previous = getCurrentSubscriber();
318
- setCurrentSubscriber(eff);
319
- let thrown;
320
- let handled = false;
321
- try {
322
- const result = owner ? owner.run(callback) : callback();
323
- cleanup = typeof result === "function" ? result : void 0;
324
- } catch (error) {
325
- thrown = error;
326
- handled = owner?.handleError(error) ?? false;
327
- if (!handled) throw error;
328
- } finally {
329
- setCurrentSubscriber(previous);
330
- }
331
- if (cleanupError && !thrown) throw cleanupError;
332
- },
333
- scheduleLow() {
334
- if (disposed || dirty) return;
335
- dirty = true;
336
- scheduler.scheduleLow(eff);
337
- },
338
- dispose() {
339
- if (disposed) return;
340
- disposed = true;
341
- dirty = false;
342
- scheduler.remove(eff);
343
- const previousCleanup = cleanup;
344
- cleanup = void 0;
345
- let cleanupError;
346
- if (previousCleanup) {
347
- try {
348
- previousCleanup();
349
- } catch (error) {
350
- const handled = owner?.handleError(error) ?? false;
351
- if (!handled) cleanupError = error;
352
- }
353
- }
354
- cleanupDependencies(eff);
355
- if (cleanupError) throw cleanupError;
356
- }
357
- };
358
- owner?.addCleanup(eff.dispose);
359
- eff.run();
360
- return eff;
361
- }
362
- __name(effect, "effect");
7
+ // packages/runtime/src/ops.ts
8
+ import { createOwner, getCurrentOwner as getCurrentOwner3, setOwnerDebugName } from "@vobs/reactivity";
363
9
 
364
10
  // packages/runtime/src/fragment.ts
11
+ import { getCurrentOwner } from "@vobs/reactivity";
365
12
  function createFragment(factory) {
366
13
  const start = createComment("vobs:fragment:start");
367
14
  const end = createComment("vobs:fragment:end");
@@ -435,7 +82,12 @@ function getRuntimeDebugHooks() {
435
82
  }
436
83
  __name(getRuntimeDebugHooks, "getRuntimeDebugHooks");
437
84
  function invokeRuntimeDebug(name, ...args) {
438
- return;
85
+ const callback = activeRuntimeDebugHooks?.[name];
86
+ if (!callback) return;
87
+ try {
88
+ callback(...args);
89
+ } catch {
90
+ }
439
91
  }
440
92
  __name(invokeRuntimeDebug, "invokeRuntimeDebug");
441
93
  function describeDebugNode(node) {
@@ -458,11 +110,18 @@ function markHmrInstanceMounted(node, parent) {
458
110
  }
459
111
  __name(markHmrInstanceMounted, "markHmrInstanceMounted");
460
112
  var hmrInstances = /* @__PURE__ */ new WeakMap();
113
+
114
+ // packages/runtime/src/ref.ts
115
+ import { getCurrentOwner as getCurrentOwner2 } from "@vobs/reactivity";
116
+
117
+ // packages/runtime/src/ops.ts
118
+ var currentRenderer = null;
461
119
  var nodeOwners = /* @__PURE__ */ new WeakMap();
462
120
  function getRenderer() {
463
- {
121
+ if (!currentRenderer) {
464
122
  throw new Error("\u6E32\u67D3\u5668\u672A\u521D\u59CB\u5316");
465
123
  }
124
+ return currentRenderer;
466
125
  }
467
126
  __name(getRenderer, "getRenderer");
468
127
  function createText(content) {
@@ -480,6 +139,13 @@ function insertBefore(parent, child, anchor) {
480
139
  }
481
140
  getRenderer().insertBefore(parent, child, isVobsFragment(anchor) ? anchor.start : anchor);
482
141
  markHmrInstanceMounted(child, parent);
142
+ if (getRuntimeDebugHooks()) {
143
+ invokeRuntimeDebug("domMutation", {
144
+ operation: "insert",
145
+ target: describeDebugNode(child),
146
+ parent: describeDebugNode(parent)
147
+ });
148
+ }
483
149
  }
484
150
  __name(insertBefore, "insertBefore");
485
151
  function removeChild(parent, child) {
@@ -489,6 +155,13 @@ function removeChild(parent, child) {
489
155
  return;
490
156
  }
491
157
  getRenderer().removeChild(parent, child);
158
+ if (getRuntimeDebugHooks()) {
159
+ invokeRuntimeDebug("domMutation", {
160
+ operation: "remove",
161
+ target: describeDebugNode(child),
162
+ parent: describeDebugNode(parent)
163
+ });
164
+ }
492
165
  }
493
166
  __name(removeChild, "removeChild");
494
167
  function createBlock(factory) {
@@ -541,7 +214,7 @@ function insertDynamicValue(parent, anchor, factory) {
541
214
  let current = null;
542
215
  let scope = null;
543
216
  effect(() => {
544
- const nextScope = createOwner();
217
+ const nextScope = createOwner2();
545
218
  const next = nextScope.run(() => normalizeDynamicChild(factory()));
546
219
  if (next === current) {
547
220
  nextScope.dispose();
@@ -737,13 +410,13 @@ function isPrimitiveItem(item) {
737
410
  }
738
411
  __name(isPrimitiveItem, "isPrimitiveItem");
739
412
  function createListEntry(item, index, key, renderItem) {
740
- const owner = createOwner();
413
+ const owner = createOwner2();
741
414
  let itemSignal;
742
415
  let viewOwner;
743
416
  let node;
744
417
  owner.run(() => {
745
418
  itemSignal = state(item);
746
- viewOwner = createOwner();
419
+ viewOwner = createOwner2();
747
420
  node = viewOwner.run(() => renderItem(toReactiveItem(itemSignal, item), index));
748
421
  });
749
422
  associateNodeOwner(node, viewOwner);
@@ -755,7 +428,7 @@ function refreshListEntry(parent, entry, index, renderItem) {
755
428
  entry.index = index;
756
429
  const previousView = entry.viewOwner;
757
430
  entry.owner.run(() => {
758
- entry.viewOwner = createOwner();
431
+ entry.viewOwner = createOwner2();
759
432
  entry.node = entry.viewOwner.run(() => renderItem(
760
433
  toReactiveItem(entry.item, entry.value),
761
434
  index
@@ -790,7 +463,10 @@ function disposeEntry(parent, entry) {
790
463
  entry.owner.dispose();
791
464
  }
792
465
  __name(disposeEntry, "disposeEntry");
793
-
794
- export { insertDynamic, insertDynamicValue, insertList, normalizeDynamicChild };
795
- //# sourceMappingURL=dynamic.js.map
466
+ export {
467
+ insertDynamic,
468
+ insertDynamicValue,
469
+ insertList,
470
+ normalizeDynamicChild
471
+ };
796
472
  //# sourceMappingURL=dynamic.js.map