@vobs/runtime 1.7.8 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +1 -1
  2. package/dist/async-boundary.cjs +14 -4
  3. package/dist/async-boundary.cjs.map +1 -1
  4. package/dist/async-boundary.js +17 -7
  5. package/dist/async-boundary.js.map +1 -1
  6. package/dist/bind.cjs +43 -3
  7. package/dist/bind.cjs.map +1 -1
  8. package/dist/bind.js +48 -8
  9. package/dist/bind.js.map +1 -1
  10. package/dist/boundary.cjs +159 -84
  11. package/dist/boundary.cjs.map +1 -1
  12. package/dist/boundary.js +162 -87
  13. package/dist/boundary.js.map +1 -1
  14. package/dist/client-only.cjs +323 -0
  15. package/dist/client-only.cjs.map +1 -0
  16. package/dist/client-only.d.cts +42 -0
  17. package/dist/client-only.d.ts +42 -0
  18. package/dist/client-only.js +299 -0
  19. package/dist/client-only.js.map +1 -0
  20. package/dist/debug.cjs.map +1 -1
  21. package/dist/debug.d.cts +12 -2
  22. package/dist/debug.d.ts +12 -2
  23. package/dist/debug.js.map +1 -1
  24. package/dist/dom-events.cjs +46 -0
  25. package/dist/dom-events.cjs.map +1 -0
  26. package/dist/dom-events.d.cts +23 -0
  27. package/dist/dom-events.d.ts +23 -0
  28. package/dist/dom-events.js +21 -0
  29. package/dist/dom-events.js.map +1 -0
  30. package/dist/dom-props.cjs +154 -0
  31. package/dist/dom-props.cjs.map +1 -0
  32. package/dist/dom-props.d.cts +21 -0
  33. package/dist/dom-props.d.ts +21 -0
  34. package/dist/dom-props.js +128 -0
  35. package/dist/dom-props.js.map +1 -0
  36. package/dist/dynamic.cjs +68 -14
  37. package/dist/dynamic.cjs.map +1 -1
  38. package/dist/dynamic.js +73 -19
  39. package/dist/dynamic.js.map +1 -1
  40. package/dist/error-boundary.cjs +159 -84
  41. package/dist/error-boundary.cjs.map +1 -1
  42. package/dist/error-boundary.js +162 -87
  43. package/dist/error-boundary.js.map +1 -1
  44. package/dist/error.cjs +52 -20
  45. package/dist/error.cjs.map +1 -1
  46. package/dist/error.d.cts +8 -0
  47. package/dist/error.d.ts +8 -0
  48. package/dist/error.js +52 -20
  49. package/dist/error.js.map +1 -1
  50. package/dist/fragment.cjs.map +1 -1
  51. package/dist/fragment.js +1 -1
  52. package/dist/fragment.js.map +1 -1
  53. package/dist/hmr.cjs +137 -1
  54. package/dist/hmr.cjs.map +1 -1
  55. package/dist/hmr.js +135 -1
  56. package/dist/hmr.js.map +1 -1
  57. package/dist/index.cjs +713 -236
  58. package/dist/index.cjs.map +1 -1
  59. package/dist/index.d.cts +5 -2
  60. package/dist/index.d.ts +5 -2
  61. package/dist/index.js +715 -245
  62. package/dist/index.js.map +1 -1
  63. package/dist/ops.cjs +561 -107
  64. package/dist/ops.cjs.map +1 -1
  65. package/dist/ops.d.cts +49 -4
  66. package/dist/ops.d.ts +49 -4
  67. package/dist/ops.js +557 -108
  68. package/dist/ops.js.map +1 -1
  69. package/dist/profiler.cjs +14 -4
  70. package/dist/profiler.cjs.map +1 -1
  71. package/dist/profiler.js +17 -7
  72. package/dist/profiler.js.map +1 -1
  73. package/dist/ref.cjs +160 -5
  74. package/dist/ref.cjs.map +1 -1
  75. package/dist/ref.js +160 -5
  76. package/dist/ref.js.map +1 -1
  77. package/dist/renderer.cjs.map +1 -1
  78. package/dist/renderer.d.cts +2 -0
  79. package/dist/renderer.d.ts +2 -0
  80. package/dist/show.cjs +196 -0
  81. package/dist/show.cjs.map +1 -0
  82. package/dist/show.d.cts +54 -0
  83. package/dist/show.d.ts +54 -0
  84. package/dist/show.js +171 -0
  85. package/dist/show.js.map +1 -0
  86. package/dist/svg.cjs +102 -0
  87. package/dist/svg.cjs.map +1 -0
  88. package/dist/svg.d.cts +21 -0
  89. package/dist/svg.d.ts +21 -0
  90. package/dist/svg.js +76 -0
  91. package/dist/svg.js.map +1 -0
  92. package/package.json +20 -2
  93. package/src/bind.ts +30 -2
  94. package/src/boundaries.test.ts +54 -1
  95. package/src/boundary.ts +24 -8
  96. package/src/clear-remove.test.ts +85 -0
  97. package/src/client-only.test.ts +140 -0
  98. package/src/client-only.ts +65 -0
  99. package/src/component-empty-return.test.ts +123 -0
  100. package/src/debug.ts +12 -1
  101. package/src/dom-events.ts +32 -0
  102. package/src/dom-props-consistency.test.ts +149 -0
  103. package/src/dom-props.test.ts +70 -0
  104. package/src/dom-props.ts +107 -0
  105. package/src/dynamic.ts +91 -14
  106. package/src/error.test.ts +76 -1
  107. package/src/error.ts +87 -22
  108. package/src/event-cleanup-growth.test.ts +128 -0
  109. package/src/events.test.ts +16 -3
  110. package/src/hmr.ts +8 -2
  111. package/src/index.ts +13 -1
  112. package/src/invariants.test.ts +252 -0
  113. package/src/list-fast-path.test.ts +83 -0
  114. package/src/list-reactive-item.test.ts +77 -0
  115. package/src/ops.ts +419 -60
  116. package/src/props.test.ts +61 -1
  117. package/src/ref-cleanup.test.ts +144 -0
  118. package/src/ref.ts +57 -8
  119. package/src/remove-listener-identity.test.ts +97 -0
  120. package/src/renderer.ts +3 -1
  121. package/src/select-hidden-subscription.test.ts +104 -0
  122. package/src/show-classlist.test.ts +205 -0
  123. package/src/show.ts +107 -0
  124. package/src/spread-stable-shape.test.ts +109 -0
  125. package/src/spread.test.ts +86 -0
  126. package/src/svg.test.ts +28 -1
  127. package/src/svg.ts +34 -0
@@ -5,7 +5,140 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
5
5
  import { getCurrentOwner as getCurrentOwner3 } from "@vobs/reactivity";
6
6
 
7
7
  // packages/runtime/src/ops.ts
8
- import { createOwner, getCurrentOwner as getCurrentOwner2, setOwnerDebugName, untrack } from "@vobs/reactivity";
8
+ import { createOwner, effect, getCurrentOwner as getCurrentOwner2, setOwnerDebugName, untrack } from "@vobs/reactivity";
9
+
10
+ // packages/runtime/src/error.ts
11
+ var _VobsError = class _VobsError extends Error {
12
+ constructor(options) {
13
+ super(options.message);
14
+ this.name = "VobsError";
15
+ this.code = options.code;
16
+ this.severity = options.severity ?? "error";
17
+ this.layer = options.layer ?? "runtime";
18
+ this.cause = options.cause;
19
+ this.fix = options.fix;
20
+ this.location = options.location;
21
+ this.trace = options.trace;
22
+ this.example = options.example;
23
+ this.docs = options.docs;
24
+ this.codeFrame = options.codeFrame;
25
+ }
26
+ };
27
+ __name(_VobsError, "VobsError");
28
+ var VobsError = _VobsError;
29
+ function isVobsError(value) {
30
+ return value instanceof VobsError || Boolean(value && typeof value === "object" && typeof value.code === "string" && typeof value.message === "string");
31
+ }
32
+ __name(isVobsError, "isVobsError");
33
+ function isForeignVobsError(value) {
34
+ return value instanceof Error && value.name === "VobsError" && typeof value.code === "string";
35
+ }
36
+ __name(isForeignVobsError, "isForeignVobsError");
37
+ function describeUnknown(value) {
38
+ if (value === null || value === void 0) return String(value);
39
+ if (typeof value === "string") return value;
40
+ if (typeof value === "object") {
41
+ const message = value.message;
42
+ if (typeof message === "string" && message !== "") return message;
43
+ try {
44
+ return JSON.stringify(value) ?? String(value);
45
+ } catch {
46
+ return String(value);
47
+ }
48
+ }
49
+ return String(value);
50
+ }
51
+ __name(describeUnknown, "describeUnknown");
52
+ function adoptVobsError(value, defaults) {
53
+ return new VobsError({
54
+ code: value.code,
55
+ message: value.message,
56
+ severity: value.severity ?? defaults.severity,
57
+ layer: value.layer ?? defaults.layer,
58
+ cause: value.cause ?? (value instanceof Error ? value : void 0),
59
+ fix: value.fix ?? defaults.fix,
60
+ location: value.location,
61
+ trace: value.trace,
62
+ example: value.example,
63
+ docs: value.docs,
64
+ codeFrame: value.codeFrame
65
+ });
66
+ }
67
+ __name(adoptVobsError, "adoptVobsError");
68
+ function normalizeVobsError(value, defaults = {}) {
69
+ if (value instanceof VobsError) return value;
70
+ if (isForeignVobsError(value)) return adoptVobsError(value, defaults);
71
+ if (value instanceof Error) {
72
+ const metadata = value;
73
+ const code = defaults.code ?? (typeof metadata.vobsCode === "string" ? metadata.vobsCode : void 0);
74
+ if (code) {
75
+ defineErrorMetadata(value, "code", code);
76
+ if (value.code !== code) {
77
+ return new VobsError({
78
+ code,
79
+ message: value.message,
80
+ severity: defaults.severity ?? "error",
81
+ layer: defaults.layer ?? "runtime",
82
+ cause: value,
83
+ fix: defaults.fix ?? (typeof metadata.vobsHint === "string" ? metadata.vobsHint : void 0)
84
+ });
85
+ }
86
+ }
87
+ defineErrorMetadata(value, "severity", defaults.severity ?? "error");
88
+ defineErrorMetadata(value, "layer", defaults.layer ?? "runtime");
89
+ const fix = defaults.fix ?? (typeof metadata.vobsHint === "string" ? metadata.vobsHint : void 0);
90
+ if (fix) defineErrorMetadata(value, "fix", fix);
91
+ const source = metadata.vobsSource;
92
+ if (source && typeof source === "object" && typeof source.file === "string" && typeof source.line === "number" && typeof source.column === "number") {
93
+ defineErrorMetadata(value, "location", source);
94
+ }
95
+ return value;
96
+ }
97
+ if (isVobsError(value)) return adoptVobsError(value, defaults);
98
+ return new VobsError({
99
+ code: defaults.code ?? "VOBS_UNKNOWN",
100
+ message: describeUnknown(value),
101
+ severity: defaults.severity ?? "error",
102
+ layer: defaults.layer ?? "runtime",
103
+ cause: void 0,
104
+ fix: defaults.fix
105
+ });
106
+ }
107
+ __name(normalizeVobsError, "normalizeVobsError");
108
+ function defineErrorMetadata(target, key, value) {
109
+ if (key in target) return;
110
+ try {
111
+ Object.defineProperty(target, key, { configurable: true, enumerable: false, value, writable: true });
112
+ } catch {
113
+ }
114
+ }
115
+ __name(defineErrorMetadata, "defineErrorMetadata");
116
+ function formatVobsError(value, options = {}) {
117
+ const error = normalizeVobsError(value);
118
+ const code = error.code || "VOBS_UNKNOWN";
119
+ const severity = error.severity || "error";
120
+ if (options.environment === "production") return `[Vobs ${code}] ${error.message}`;
121
+ const lines = [`[Vobs ${capitalize(severity)}] ${error.message}`, `Code: ${code}`];
122
+ if (error.location) lines.push(`Location: ${error.location.file}:${error.location.line}:${error.location.column}`);
123
+ if (error.codeFrame) lines.push("", error.codeFrame);
124
+ if (error.cause !== void 0) lines.push(`Cause: ${formatCause(error.cause)}`);
125
+ if (error.trace?.length) lines.push("", `Trace: ${error.trace.join(" \u2192 ")}`);
126
+ if (error.fix) lines.push("", `Fix: ${error.fix}`);
127
+ if (error.example) lines.push("", `Example:
128
+ ${error.example}`);
129
+ if (error.docs) lines.push(`Docs: ${error.docs}`);
130
+ if (options.includeStack && error.stack) lines.push("", error.stack);
131
+ return lines.join("\n");
132
+ }
133
+ __name(formatVobsError, "formatVobsError");
134
+ function formatCause(value) {
135
+ return value instanceof Error ? `${value.name}: ${value.message}` : String(value);
136
+ }
137
+ __name(formatCause, "formatCause");
138
+ function capitalize(value) {
139
+ return value.slice(0, 1).toUpperCase() + value.slice(1);
140
+ }
141
+ __name(capitalize, "capitalize");
9
142
 
10
143
  // packages/runtime/src/debug.ts
11
144
  var activeRuntimeDebugHooks = null;
@@ -93,7 +226,7 @@ function syncSelectValue(parent) {
93
226
  while (current !== null) {
94
227
  if (current.nodeName === "SELECT") {
95
228
  const read = selectValueReaders.get(current);
96
- if (read !== void 0) setProperty(current, "value", read());
229
+ if (read !== void 0) setProperty(current, "value", untrack(read));
97
230
  return;
98
231
  }
99
232
  current = current.parentNode;
@@ -101,9 +234,9 @@ function syncSelectValue(parent) {
101
234
  }
102
235
  __name(syncSelectValue, "syncSelectValue");
103
236
  function removeChild(parent, child) {
104
- disposeNodeOwner(child);
105
237
  if (isVobsFragment(child)) {
106
238
  child.unmount(parent);
239
+ disposeNodeOwner(child);
107
240
  return;
108
241
  }
109
242
  getRenderer().removeChild(parent, child);
@@ -114,11 +247,12 @@ function removeChild(parent, child) {
114
247
  parent: describeDebugNode(parent)
115
248
  });
116
249
  }
250
+ disposeNodeOwner(child);
117
251
  }
118
252
  __name(removeChild, "removeChild");
119
253
  function setProperty(node, key, value) {
120
254
  const previousValue = getRuntimeDebugHooks() ? readDebugValue(() => Reflect.get(node, key)) : void 0;
121
- getRenderer().setProperty(node, key, value);
255
+ getRenderer().setProperty(node, PROPERTY_IDL_NAMES[key] ?? key, value);
122
256
  if (key === "value" && node.tagName === "SELECT") {
123
257
  scheduleSelectValueSync(node, value);
124
258
  }
@@ -139,15 +273,19 @@ function scheduleSelectValueSync(node, value) {
139
273
  pendingSelectValues.set(node, value);
140
274
  if (selectSyncScheduled.has(node)) return;
141
275
  selectSyncScheduled.add(node);
276
+ const renderer = getRenderer();
142
277
  queueMicrotask(() => {
143
278
  selectSyncScheduled.delete(node);
144
279
  if (!pendingSelectValues.has(node)) return;
145
280
  const pending = pendingSelectValues.get(node);
146
281
  pendingSelectValues.delete(node);
147
- getRenderer().setProperty(node, "value", pending);
282
+ renderer.setProperty(node, "value", pending);
148
283
  });
149
284
  }
150
285
  __name(scheduleSelectValueSync, "scheduleSelectValueSync");
286
+ var PROPERTY_IDL_NAMES = {
287
+ autoFocus: "autofocus"
288
+ };
151
289
  function createBlock(factory) {
152
290
  const owner = createOwner();
153
291
  setOwnerDebugName(owner, "dynamic");
@@ -167,6 +305,11 @@ function createBlock(factory) {
167
305
  }
168
306
  __name(createBlock, "createBlock");
169
307
  function associateNodeOwner(node, owner) {
308
+ if (node === null || node === void 0 || typeof node !== "object" && typeof node !== "function") {
309
+ throw new Error(
310
+ `Vobs: associateNodeOwner \u6536\u5230\u975E\u8282\u70B9\u503C\uFF08${String(node)}\uFF09\u3002\u7EC4\u4EF6\u5FC5\u987B\u8FD4\u56DE VobsNode\uFF1B\u8FD4\u56DE null/undefined \u7531 createComponent \u8F6C\u6210\u7A7A\u6CE8\u91CA\u8282\u70B9\u3002`
311
+ );
312
+ }
170
313
  nodeOwners.set(node, owner);
171
314
  }
172
315
  __name(associateNodeOwner, "associateNodeOwner");
@@ -249,12 +392,12 @@ __name(moveRange, "moveRange");
249
392
  import { createOwner as createOwner3, state as state2 } from "@vobs/reactivity";
250
393
 
251
394
  // packages/runtime/src/dynamic.ts
252
- import { createOwner as createOwner2, effect, state } from "@vobs/reactivity";
395
+ import { createOwner as createOwner2, effect as effect2, state } from "@vobs/reactivity";
253
396
  function insertDynamic(parent, anchor, factory) {
254
397
  const marker = createComment("vobs:dynamic");
255
398
  insertBefore(parent, marker, anchor);
256
399
  let current = null;
257
- effect(() => {
400
+ effect2(() => {
258
401
  const next = createBlock(factory);
259
402
  if (next === current) return;
260
403
  if (current) removeChild(parent, current);
@@ -264,82 +407,14 @@ function insertDynamic(parent, anchor, factory) {
264
407
  }
265
408
  __name(insertDynamic, "insertDynamic");
266
409
 
267
- // packages/runtime/src/error.ts
268
- var _VobsError = class _VobsError extends Error {
269
- constructor(options) {
270
- super(options.message);
271
- this.name = "VobsError";
272
- this.code = options.code;
273
- this.severity = options.severity ?? "error";
274
- this.layer = options.layer ?? "runtime";
275
- this.cause = options.cause;
276
- this.fix = options.fix;
277
- this.location = options.location;
278
- this.trace = options.trace;
279
- this.example = options.example;
280
- this.docs = options.docs;
281
- this.codeFrame = options.codeFrame;
282
- }
283
- };
284
- __name(_VobsError, "VobsError");
285
- var VobsError = _VobsError;
286
- function isVobsError(value) {
287
- return value instanceof VobsError || Boolean(value && typeof value === "object" && typeof value.code === "string" && typeof value.message === "string" && typeof value.layer === "string");
288
- }
289
- __name(isVobsError, "isVobsError");
290
- function normalizeVobsError(value, defaults = {}) {
291
- if (value instanceof VobsError) return value;
292
- if (value instanceof Error) {
293
- const metadata = value;
294
- const code = defaults.code ?? (typeof metadata.vobsCode === "string" ? metadata.vobsCode : void 0);
295
- if (code) defineErrorMetadata(value, "code", code);
296
- defineErrorMetadata(value, "severity", defaults.severity ?? "error");
297
- defineErrorMetadata(value, "layer", defaults.layer ?? "runtime");
298
- const fix = defaults.fix ?? (typeof metadata.vobsHint === "string" ? metadata.vobsHint : void 0);
299
- if (fix) defineErrorMetadata(value, "fix", fix);
300
- const source = metadata.vobsSource;
301
- if (source && typeof source === "object" && typeof source.file === "string" && typeof source.line === "number" && typeof source.column === "number") {
302
- defineErrorMetadata(value, "location", source);
303
- }
304
- return value;
305
- }
306
- if (isVobsError(value)) {
307
- const candidate = value;
308
- return new VobsError({
309
- code: candidate.code,
310
- message: candidate.message,
311
- severity: candidate.severity ?? defaults.severity,
312
- layer: candidate.layer ?? defaults.layer,
313
- cause: candidate.cause,
314
- fix: candidate.fix ?? defaults.fix,
315
- location: candidate.location,
316
- trace: candidate.trace,
317
- example: candidate.example,
318
- docs: candidate.docs,
319
- codeFrame: candidate.codeFrame
320
- });
321
- }
322
- const message = String(value);
323
- return new VobsError({
324
- code: defaults.code ?? "VOBS_UNKNOWN",
325
- message,
326
- severity: defaults.severity ?? "error",
327
- layer: defaults.layer ?? "runtime",
328
- cause: void 0,
329
- fix: defaults.fix
330
- });
331
- }
332
- __name(normalizeVobsError, "normalizeVobsError");
333
- function defineErrorMetadata(target, key, value) {
334
- if (key in target) return;
335
- try {
336
- Object.defineProperty(target, key, { configurable: true, enumerable: false, value, writable: true });
337
- } catch {
410
+ // packages/runtime/src/boundary.ts
411
+ function reportBoundaryError(event, loud) {
412
+ invokeRuntimeDebug("error", event);
413
+ if (loud && getRuntimeDebugHooks()?.error === void 0) {
414
+ console.error(formatVobsError(event.error, { includeStack: true }));
338
415
  }
339
416
  }
340
- __name(defineErrorMetadata, "defineErrorMetadata");
341
-
342
- // packages/runtime/src/boundary.ts
417
+ __name(reportBoundaryError, "reportBoundaryError");
343
418
  function insertBoundary(parent, anchor, options) {
344
419
  const boundary = createOwner3();
345
420
  boundary.run(() => {
@@ -356,24 +431,24 @@ function insertBoundary(parent, anchor, options) {
356
431
  fix: "\u68C0\u67E5\u7EC4\u4EF6\u6E32\u67D3\u903B\u8F91\uFF0C\u6216\u5728\u8FB9\u754C fallback \u4E2D\u63D0\u4F9B\u6062\u590D\u64CD\u4F5C\u3002"
357
432
  });
358
433
  lastError = normalized;
359
- invokeRuntimeDebug("error", {
434
+ reportBoundaryError({
360
435
  error: normalized,
361
436
  owner: boundary,
362
437
  phase: "boundary",
363
438
  handled: true,
364
439
  recovery: "fallback"
365
- });
440
+ }, true);
366
441
  error.value = normalized;
367
442
  });
368
443
  const retry = /* @__PURE__ */ __name(() => {
369
444
  if (error.value) {
370
- invokeRuntimeDebug("error", {
445
+ reportBoundaryError({
371
446
  error: error.value,
372
447
  owner: boundary,
373
448
  phase: "boundary",
374
449
  handled: true,
375
450
  recovery: "retrying"
376
- });
451
+ }, false);
377
452
  }
378
453
  error.value = null;
379
454
  return options.onRetry?.();
@@ -388,13 +463,13 @@ function insertBoundary(parent, anchor, options) {
388
463
  const currentError = error.value;
389
464
  if (!currentError) {
390
465
  if (fallbackActive && lastError) {
391
- invokeRuntimeDebug("error", {
466
+ reportBoundaryError({
392
467
  error: lastError,
393
468
  owner: boundary,
394
469
  phase: "boundary",
395
470
  handled: true,
396
471
  recovery: "recovered"
397
- });
472
+ }, false);
398
473
  lastError = null;
399
474
  }
400
475
  fallbackActive = false;