@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
@@ -33,6 +33,139 @@ var import_reactivity3 = require("@vobs/reactivity");
33
33
  // packages/runtime/src/ops.ts
34
34
  var import_reactivity2 = require("@vobs/reactivity");
35
35
 
36
+ // packages/runtime/src/error.ts
37
+ var _VobsError = class _VobsError extends Error {
38
+ constructor(options) {
39
+ super(options.message);
40
+ this.name = "VobsError";
41
+ this.code = options.code;
42
+ this.severity = options.severity ?? "error";
43
+ this.layer = options.layer ?? "runtime";
44
+ this.cause = options.cause;
45
+ this.fix = options.fix;
46
+ this.location = options.location;
47
+ this.trace = options.trace;
48
+ this.example = options.example;
49
+ this.docs = options.docs;
50
+ this.codeFrame = options.codeFrame;
51
+ }
52
+ };
53
+ __name(_VobsError, "VobsError");
54
+ var VobsError = _VobsError;
55
+ function isVobsError(value) {
56
+ return value instanceof VobsError || Boolean(value && typeof value === "object" && typeof value.code === "string" && typeof value.message === "string");
57
+ }
58
+ __name(isVobsError, "isVobsError");
59
+ function isForeignVobsError(value) {
60
+ return value instanceof Error && value.name === "VobsError" && typeof value.code === "string";
61
+ }
62
+ __name(isForeignVobsError, "isForeignVobsError");
63
+ function describeUnknown(value) {
64
+ if (value === null || value === void 0) return String(value);
65
+ if (typeof value === "string") return value;
66
+ if (typeof value === "object") {
67
+ const message = value.message;
68
+ if (typeof message === "string" && message !== "") return message;
69
+ try {
70
+ return JSON.stringify(value) ?? String(value);
71
+ } catch {
72
+ return String(value);
73
+ }
74
+ }
75
+ return String(value);
76
+ }
77
+ __name(describeUnknown, "describeUnknown");
78
+ function adoptVobsError(value, defaults) {
79
+ return new VobsError({
80
+ code: value.code,
81
+ message: value.message,
82
+ severity: value.severity ?? defaults.severity,
83
+ layer: value.layer ?? defaults.layer,
84
+ cause: value.cause ?? (value instanceof Error ? value : void 0),
85
+ fix: value.fix ?? defaults.fix,
86
+ location: value.location,
87
+ trace: value.trace,
88
+ example: value.example,
89
+ docs: value.docs,
90
+ codeFrame: value.codeFrame
91
+ });
92
+ }
93
+ __name(adoptVobsError, "adoptVobsError");
94
+ function normalizeVobsError(value, defaults = {}) {
95
+ if (value instanceof VobsError) return value;
96
+ if (isForeignVobsError(value)) return adoptVobsError(value, defaults);
97
+ if (value instanceof Error) {
98
+ const metadata = value;
99
+ const code = defaults.code ?? (typeof metadata.vobsCode === "string" ? metadata.vobsCode : void 0);
100
+ if (code) {
101
+ defineErrorMetadata(value, "code", code);
102
+ if (value.code !== code) {
103
+ return new VobsError({
104
+ code,
105
+ message: value.message,
106
+ severity: defaults.severity ?? "error",
107
+ layer: defaults.layer ?? "runtime",
108
+ cause: value,
109
+ fix: defaults.fix ?? (typeof metadata.vobsHint === "string" ? metadata.vobsHint : void 0)
110
+ });
111
+ }
112
+ }
113
+ defineErrorMetadata(value, "severity", defaults.severity ?? "error");
114
+ defineErrorMetadata(value, "layer", defaults.layer ?? "runtime");
115
+ const fix = defaults.fix ?? (typeof metadata.vobsHint === "string" ? metadata.vobsHint : void 0);
116
+ if (fix) defineErrorMetadata(value, "fix", fix);
117
+ const source = metadata.vobsSource;
118
+ if (source && typeof source === "object" && typeof source.file === "string" && typeof source.line === "number" && typeof source.column === "number") {
119
+ defineErrorMetadata(value, "location", source);
120
+ }
121
+ return value;
122
+ }
123
+ if (isVobsError(value)) return adoptVobsError(value, defaults);
124
+ return new VobsError({
125
+ code: defaults.code ?? "VOBS_UNKNOWN",
126
+ message: describeUnknown(value),
127
+ severity: defaults.severity ?? "error",
128
+ layer: defaults.layer ?? "runtime",
129
+ cause: void 0,
130
+ fix: defaults.fix
131
+ });
132
+ }
133
+ __name(normalizeVobsError, "normalizeVobsError");
134
+ function defineErrorMetadata(target, key, value) {
135
+ if (key in target) return;
136
+ try {
137
+ Object.defineProperty(target, key, { configurable: true, enumerable: false, value, writable: true });
138
+ } catch {
139
+ }
140
+ }
141
+ __name(defineErrorMetadata, "defineErrorMetadata");
142
+ function formatVobsError(value, options = {}) {
143
+ const error = normalizeVobsError(value);
144
+ const code = error.code || "VOBS_UNKNOWN";
145
+ const severity = error.severity || "error";
146
+ if (options.environment === "production") return `[Vobs ${code}] ${error.message}`;
147
+ const lines = [`[Vobs ${capitalize(severity)}] ${error.message}`, `Code: ${code}`];
148
+ if (error.location) lines.push(`Location: ${error.location.file}:${error.location.line}:${error.location.column}`);
149
+ if (error.codeFrame) lines.push("", error.codeFrame);
150
+ if (error.cause !== void 0) lines.push(`Cause: ${formatCause(error.cause)}`);
151
+ if (error.trace?.length) lines.push("", `Trace: ${error.trace.join(" \u2192 ")}`);
152
+ if (error.fix) lines.push("", `Fix: ${error.fix}`);
153
+ if (error.example) lines.push("", `Example:
154
+ ${error.example}`);
155
+ if (error.docs) lines.push(`Docs: ${error.docs}`);
156
+ if (options.includeStack && error.stack) lines.push("", error.stack);
157
+ return lines.join("\n");
158
+ }
159
+ __name(formatVobsError, "formatVobsError");
160
+ function formatCause(value) {
161
+ return value instanceof Error ? `${value.name}: ${value.message}` : String(value);
162
+ }
163
+ __name(formatCause, "formatCause");
164
+ function capitalize(value) {
165
+ return value.slice(0, 1).toUpperCase() + value.slice(1);
166
+ }
167
+ __name(capitalize, "capitalize");
168
+
36
169
  // packages/runtime/src/debug.ts
37
170
  var activeRuntimeDebugHooks = null;
38
171
  function getRuntimeDebugHooks() {
@@ -119,7 +252,7 @@ function syncSelectValue(parent) {
119
252
  while (current !== null) {
120
253
  if (current.nodeName === "SELECT") {
121
254
  const read = selectValueReaders.get(current);
122
- if (read !== void 0) setProperty(current, "value", read());
255
+ if (read !== void 0) setProperty(current, "value", (0, import_reactivity2.untrack)(read));
123
256
  return;
124
257
  }
125
258
  current = current.parentNode;
@@ -127,9 +260,9 @@ function syncSelectValue(parent) {
127
260
  }
128
261
  __name(syncSelectValue, "syncSelectValue");
129
262
  function removeChild(parent, child) {
130
- disposeNodeOwner(child);
131
263
  if (isVobsFragment(child)) {
132
264
  child.unmount(parent);
265
+ disposeNodeOwner(child);
133
266
  return;
134
267
  }
135
268
  getRenderer().removeChild(parent, child);
@@ -140,11 +273,12 @@ function removeChild(parent, child) {
140
273
  parent: describeDebugNode(parent)
141
274
  });
142
275
  }
276
+ disposeNodeOwner(child);
143
277
  }
144
278
  __name(removeChild, "removeChild");
145
279
  function setProperty(node, key, value) {
146
280
  const previousValue = getRuntimeDebugHooks() ? readDebugValue(() => Reflect.get(node, key)) : void 0;
147
- getRenderer().setProperty(node, key, value);
281
+ getRenderer().setProperty(node, PROPERTY_IDL_NAMES[key] ?? key, value);
148
282
  if (key === "value" && node.tagName === "SELECT") {
149
283
  scheduleSelectValueSync(node, value);
150
284
  }
@@ -165,15 +299,19 @@ function scheduleSelectValueSync(node, value) {
165
299
  pendingSelectValues.set(node, value);
166
300
  if (selectSyncScheduled.has(node)) return;
167
301
  selectSyncScheduled.add(node);
302
+ const renderer = getRenderer();
168
303
  queueMicrotask(() => {
169
304
  selectSyncScheduled.delete(node);
170
305
  if (!pendingSelectValues.has(node)) return;
171
306
  const pending = pendingSelectValues.get(node);
172
307
  pendingSelectValues.delete(node);
173
- getRenderer().setProperty(node, "value", pending);
308
+ renderer.setProperty(node, "value", pending);
174
309
  });
175
310
  }
176
311
  __name(scheduleSelectValueSync, "scheduleSelectValueSync");
312
+ var PROPERTY_IDL_NAMES = {
313
+ autoFocus: "autofocus"
314
+ };
177
315
  function createBlock(factory) {
178
316
  const owner = (0, import_reactivity2.createOwner)();
179
317
  (0, import_reactivity2.setOwnerDebugName)(owner, "dynamic");
@@ -193,6 +331,11 @@ function createBlock(factory) {
193
331
  }
194
332
  __name(createBlock, "createBlock");
195
333
  function associateNodeOwner(node, owner) {
334
+ if (node === null || node === void 0 || typeof node !== "object" && typeof node !== "function") {
335
+ throw new Error(
336
+ `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`
337
+ );
338
+ }
196
339
  nodeOwners.set(node, owner);
197
340
  }
198
341
  __name(associateNodeOwner, "associateNodeOwner");
@@ -290,82 +433,14 @@ function insertDynamic(parent, anchor, factory) {
290
433
  }
291
434
  __name(insertDynamic, "insertDynamic");
292
435
 
293
- // packages/runtime/src/error.ts
294
- var _VobsError = class _VobsError extends Error {
295
- constructor(options) {
296
- super(options.message);
297
- this.name = "VobsError";
298
- this.code = options.code;
299
- this.severity = options.severity ?? "error";
300
- this.layer = options.layer ?? "runtime";
301
- this.cause = options.cause;
302
- this.fix = options.fix;
303
- this.location = options.location;
304
- this.trace = options.trace;
305
- this.example = options.example;
306
- this.docs = options.docs;
307
- this.codeFrame = options.codeFrame;
308
- }
309
- };
310
- __name(_VobsError, "VobsError");
311
- var VobsError = _VobsError;
312
- function isVobsError(value) {
313
- return value instanceof VobsError || Boolean(value && typeof value === "object" && typeof value.code === "string" && typeof value.message === "string" && typeof value.layer === "string");
314
- }
315
- __name(isVobsError, "isVobsError");
316
- function normalizeVobsError(value, defaults = {}) {
317
- if (value instanceof VobsError) return value;
318
- if (value instanceof Error) {
319
- const metadata = value;
320
- const code = defaults.code ?? (typeof metadata.vobsCode === "string" ? metadata.vobsCode : void 0);
321
- if (code) defineErrorMetadata(value, "code", code);
322
- defineErrorMetadata(value, "severity", defaults.severity ?? "error");
323
- defineErrorMetadata(value, "layer", defaults.layer ?? "runtime");
324
- const fix = defaults.fix ?? (typeof metadata.vobsHint === "string" ? metadata.vobsHint : void 0);
325
- if (fix) defineErrorMetadata(value, "fix", fix);
326
- const source = metadata.vobsSource;
327
- if (source && typeof source === "object" && typeof source.file === "string" && typeof source.line === "number" && typeof source.column === "number") {
328
- defineErrorMetadata(value, "location", source);
329
- }
330
- return value;
331
- }
332
- if (isVobsError(value)) {
333
- const candidate = value;
334
- return new VobsError({
335
- code: candidate.code,
336
- message: candidate.message,
337
- severity: candidate.severity ?? defaults.severity,
338
- layer: candidate.layer ?? defaults.layer,
339
- cause: candidate.cause,
340
- fix: candidate.fix ?? defaults.fix,
341
- location: candidate.location,
342
- trace: candidate.trace,
343
- example: candidate.example,
344
- docs: candidate.docs,
345
- codeFrame: candidate.codeFrame
346
- });
347
- }
348
- const message = String(value);
349
- return new VobsError({
350
- code: defaults.code ?? "VOBS_UNKNOWN",
351
- message,
352
- severity: defaults.severity ?? "error",
353
- layer: defaults.layer ?? "runtime",
354
- cause: void 0,
355
- fix: defaults.fix
356
- });
357
- }
358
- __name(normalizeVobsError, "normalizeVobsError");
359
- function defineErrorMetadata(target, key, value) {
360
- if (key in target) return;
361
- try {
362
- Object.defineProperty(target, key, { configurable: true, enumerable: false, value, writable: true });
363
- } catch {
436
+ // packages/runtime/src/boundary.ts
437
+ function reportBoundaryError(event, loud) {
438
+ invokeRuntimeDebug("error", event);
439
+ if (loud && getRuntimeDebugHooks()?.error === void 0) {
440
+ console.error(formatVobsError(event.error, { includeStack: true }));
364
441
  }
365
442
  }
366
- __name(defineErrorMetadata, "defineErrorMetadata");
367
-
368
- // packages/runtime/src/boundary.ts
443
+ __name(reportBoundaryError, "reportBoundaryError");
369
444
  function insertBoundary(parent, anchor, options) {
370
445
  const boundary = (0, import_reactivity5.createOwner)();
371
446
  boundary.run(() => {
@@ -382,24 +457,24 @@ function insertBoundary(parent, anchor, options) {
382
457
  fix: "\u68C0\u67E5\u7EC4\u4EF6\u6E32\u67D3\u903B\u8F91\uFF0C\u6216\u5728\u8FB9\u754C fallback \u4E2D\u63D0\u4F9B\u6062\u590D\u64CD\u4F5C\u3002"
383
458
  });
384
459
  lastError = normalized;
385
- invokeRuntimeDebug("error", {
460
+ reportBoundaryError({
386
461
  error: normalized,
387
462
  owner: boundary,
388
463
  phase: "boundary",
389
464
  handled: true,
390
465
  recovery: "fallback"
391
- });
466
+ }, true);
392
467
  error.value = normalized;
393
468
  });
394
469
  const retry = /* @__PURE__ */ __name(() => {
395
470
  if (error.value) {
396
- invokeRuntimeDebug("error", {
471
+ reportBoundaryError({
397
472
  error: error.value,
398
473
  owner: boundary,
399
474
  phase: "boundary",
400
475
  handled: true,
401
476
  recovery: "retrying"
402
- });
477
+ }, false);
403
478
  }
404
479
  error.value = null;
405
480
  return options.onRetry?.();
@@ -414,13 +489,13 @@ function insertBoundary(parent, anchor, options) {
414
489
  const currentError = error.value;
415
490
  if (!currentError) {
416
491
  if (fallbackActive && lastError) {
417
- invokeRuntimeDebug("error", {
492
+ reportBoundaryError({
418
493
  error: lastError,
419
494
  owner: boundary,
420
495
  phase: "boundary",
421
496
  handled: true,
422
497
  recovery: "recovered"
423
- });
498
+ }, false);
424
499
  lastError = null;
425
500
  }
426
501
  fallbackActive = false;