@vobs/runtime 1.7.8 → 1.8.0

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
package/dist/boundary.js CHANGED
@@ -38,10 +38,10 @@ function describeDebugNode(node) {
38
38
  __name(describeDebugNode, "describeDebugNode");
39
39
 
40
40
  // packages/runtime/src/dynamic.ts
41
- import { createOwner as createOwner2, effect, state } from "@vobs/reactivity";
41
+ import { createOwner as createOwner2, effect as effect2, state } from "@vobs/reactivity";
42
42
 
43
43
  // packages/runtime/src/ops.ts
44
- import { createOwner, getCurrentOwner as getCurrentOwner3, setOwnerDebugName, untrack } from "@vobs/reactivity";
44
+ import { createOwner, effect, getCurrentOwner as getCurrentOwner3, setOwnerDebugName, untrack } from "@vobs/reactivity";
45
45
 
46
46
  // packages/runtime/src/fragment.ts
47
47
  import { getCurrentOwner } from "@vobs/reactivity";
@@ -50,6 +50,139 @@ function isVobsFragment(value) {
50
50
  }
51
51
  __name(isVobsFragment, "isVobsFragment");
52
52
 
53
+ // packages/runtime/src/error.ts
54
+ var _VobsError = class _VobsError extends Error {
55
+ constructor(options) {
56
+ super(options.message);
57
+ this.name = "VobsError";
58
+ this.code = options.code;
59
+ this.severity = options.severity ?? "error";
60
+ this.layer = options.layer ?? "runtime";
61
+ this.cause = options.cause;
62
+ this.fix = options.fix;
63
+ this.location = options.location;
64
+ this.trace = options.trace;
65
+ this.example = options.example;
66
+ this.docs = options.docs;
67
+ this.codeFrame = options.codeFrame;
68
+ }
69
+ };
70
+ __name(_VobsError, "VobsError");
71
+ var VobsError = _VobsError;
72
+ function isVobsError(value) {
73
+ return value instanceof VobsError || Boolean(value && typeof value === "object" && typeof value.code === "string" && typeof value.message === "string");
74
+ }
75
+ __name(isVobsError, "isVobsError");
76
+ function isForeignVobsError(value) {
77
+ return value instanceof Error && value.name === "VobsError" && typeof value.code === "string";
78
+ }
79
+ __name(isForeignVobsError, "isForeignVobsError");
80
+ function describeUnknown(value) {
81
+ if (value === null || value === void 0) return String(value);
82
+ if (typeof value === "string") return value;
83
+ if (typeof value === "object") {
84
+ const message = value.message;
85
+ if (typeof message === "string" && message !== "") return message;
86
+ try {
87
+ return JSON.stringify(value) ?? String(value);
88
+ } catch {
89
+ return String(value);
90
+ }
91
+ }
92
+ return String(value);
93
+ }
94
+ __name(describeUnknown, "describeUnknown");
95
+ function adoptVobsError(value, defaults) {
96
+ return new VobsError({
97
+ code: value.code,
98
+ message: value.message,
99
+ severity: value.severity ?? defaults.severity,
100
+ layer: value.layer ?? defaults.layer,
101
+ cause: value.cause ?? (value instanceof Error ? value : void 0),
102
+ fix: value.fix ?? defaults.fix,
103
+ location: value.location,
104
+ trace: value.trace,
105
+ example: value.example,
106
+ docs: value.docs,
107
+ codeFrame: value.codeFrame
108
+ });
109
+ }
110
+ __name(adoptVobsError, "adoptVobsError");
111
+ function normalizeVobsError(value, defaults = {}) {
112
+ if (value instanceof VobsError) return value;
113
+ if (isForeignVobsError(value)) return adoptVobsError(value, defaults);
114
+ if (value instanceof Error) {
115
+ const metadata = value;
116
+ const code = defaults.code ?? (typeof metadata.vobsCode === "string" ? metadata.vobsCode : void 0);
117
+ if (code) {
118
+ defineErrorMetadata(value, "code", code);
119
+ if (value.code !== code) {
120
+ return new VobsError({
121
+ code,
122
+ message: value.message,
123
+ severity: defaults.severity ?? "error",
124
+ layer: defaults.layer ?? "runtime",
125
+ cause: value,
126
+ fix: defaults.fix ?? (typeof metadata.vobsHint === "string" ? metadata.vobsHint : void 0)
127
+ });
128
+ }
129
+ }
130
+ defineErrorMetadata(value, "severity", defaults.severity ?? "error");
131
+ defineErrorMetadata(value, "layer", defaults.layer ?? "runtime");
132
+ const fix = defaults.fix ?? (typeof metadata.vobsHint === "string" ? metadata.vobsHint : void 0);
133
+ if (fix) defineErrorMetadata(value, "fix", fix);
134
+ const source = metadata.vobsSource;
135
+ if (source && typeof source === "object" && typeof source.file === "string" && typeof source.line === "number" && typeof source.column === "number") {
136
+ defineErrorMetadata(value, "location", source);
137
+ }
138
+ return value;
139
+ }
140
+ if (isVobsError(value)) return adoptVobsError(value, defaults);
141
+ return new VobsError({
142
+ code: defaults.code ?? "VOBS_UNKNOWN",
143
+ message: describeUnknown(value),
144
+ severity: defaults.severity ?? "error",
145
+ layer: defaults.layer ?? "runtime",
146
+ cause: void 0,
147
+ fix: defaults.fix
148
+ });
149
+ }
150
+ __name(normalizeVobsError, "normalizeVobsError");
151
+ function defineErrorMetadata(target, key, value) {
152
+ if (key in target) return;
153
+ try {
154
+ Object.defineProperty(target, key, { configurable: true, enumerable: false, value, writable: true });
155
+ } catch {
156
+ }
157
+ }
158
+ __name(defineErrorMetadata, "defineErrorMetadata");
159
+ function formatVobsError(value, options = {}) {
160
+ const error = normalizeVobsError(value);
161
+ const code = error.code || "VOBS_UNKNOWN";
162
+ const severity = error.severity || "error";
163
+ if (options.environment === "production") return `[Vobs ${code}] ${error.message}`;
164
+ const lines = [`[Vobs ${capitalize(severity)}] ${error.message}`, `Code: ${code}`];
165
+ if (error.location) lines.push(`Location: ${error.location.file}:${error.location.line}:${error.location.column}`);
166
+ if (error.codeFrame) lines.push("", error.codeFrame);
167
+ if (error.cause !== void 0) lines.push(`Cause: ${formatCause(error.cause)}`);
168
+ if (error.trace?.length) lines.push("", `Trace: ${error.trace.join(" \u2192 ")}`);
169
+ if (error.fix) lines.push("", `Fix: ${error.fix}`);
170
+ if (error.example) lines.push("", `Example:
171
+ ${error.example}`);
172
+ if (error.docs) lines.push(`Docs: ${error.docs}`);
173
+ if (options.includeStack && error.stack) lines.push("", error.stack);
174
+ return lines.join("\n");
175
+ }
176
+ __name(formatVobsError, "formatVobsError");
177
+ function formatCause(value) {
178
+ return value instanceof Error ? `${value.name}: ${value.message}` : String(value);
179
+ }
180
+ __name(formatCause, "formatCause");
181
+ function capitalize(value) {
182
+ return value.slice(0, 1).toUpperCase() + value.slice(1);
183
+ }
184
+ __name(capitalize, "capitalize");
185
+
53
186
  // packages/runtime/src/hmr.ts
54
187
  var globalTarget = globalThis;
55
188
  var hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: /* @__PURE__ */ new Map(), states: /* @__PURE__ */ new Map() };
@@ -103,7 +236,7 @@ function syncSelectValue(parent) {
103
236
  while (current !== null) {
104
237
  if (current.nodeName === "SELECT") {
105
238
  const read = selectValueReaders.get(current);
106
- if (read !== void 0) setProperty(current, "value", read());
239
+ if (read !== void 0) setProperty(current, "value", untrack(read));
107
240
  return;
108
241
  }
109
242
  current = current.parentNode;
@@ -111,9 +244,9 @@ function syncSelectValue(parent) {
111
244
  }
112
245
  __name(syncSelectValue, "syncSelectValue");
113
246
  function removeChild(parent, child) {
114
- disposeNodeOwner(child);
115
247
  if (isVobsFragment(child)) {
116
248
  child.unmount(parent);
249
+ disposeNodeOwner(child);
117
250
  return;
118
251
  }
119
252
  getRenderer().removeChild(parent, child);
@@ -124,11 +257,12 @@ function removeChild(parent, child) {
124
257
  parent: describeDebugNode(parent)
125
258
  });
126
259
  }
260
+ disposeNodeOwner(child);
127
261
  }
128
262
  __name(removeChild, "removeChild");
129
263
  function setProperty(node, key, value) {
130
264
  const previousValue = getRuntimeDebugHooks() ? readDebugValue(() => Reflect.get(node, key)) : void 0;
131
- getRenderer().setProperty(node, key, value);
265
+ getRenderer().setProperty(node, PROPERTY_IDL_NAMES[key] ?? key, value);
132
266
  if (key === "value" && node.tagName === "SELECT") {
133
267
  scheduleSelectValueSync(node, value);
134
268
  }
@@ -149,15 +283,19 @@ function scheduleSelectValueSync(node, value) {
149
283
  pendingSelectValues.set(node, value);
150
284
  if (selectSyncScheduled.has(node)) return;
151
285
  selectSyncScheduled.add(node);
286
+ const renderer = getRenderer();
152
287
  queueMicrotask(() => {
153
288
  selectSyncScheduled.delete(node);
154
289
  if (!pendingSelectValues.has(node)) return;
155
290
  const pending = pendingSelectValues.get(node);
156
291
  pendingSelectValues.delete(node);
157
- getRenderer().setProperty(node, "value", pending);
292
+ renderer.setProperty(node, "value", pending);
158
293
  });
159
294
  }
160
295
  __name(scheduleSelectValueSync, "scheduleSelectValueSync");
296
+ var PROPERTY_IDL_NAMES = {
297
+ autoFocus: "autofocus"
298
+ };
161
299
  function createBlock(factory) {
162
300
  const owner = createOwner();
163
301
  setOwnerDebugName(owner, "dynamic");
@@ -177,6 +315,11 @@ function createBlock(factory) {
177
315
  }
178
316
  __name(createBlock, "createBlock");
179
317
  function associateNodeOwner(node, owner) {
318
+ if (node === null || node === void 0 || typeof node !== "object" && typeof node !== "function") {
319
+ throw new Error(
320
+ `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`
321
+ );
322
+ }
180
323
  nodeOwners.set(node, owner);
181
324
  }
182
325
  __name(associateNodeOwner, "associateNodeOwner");
@@ -193,7 +336,7 @@ function insertDynamic(parent, anchor, factory) {
193
336
  const marker = createComment("vobs:dynamic");
194
337
  insertBefore(parent, marker, anchor);
195
338
  let current = null;
196
- effect(() => {
339
+ effect2(() => {
197
340
  const next = createBlock(factory);
198
341
  if (next === current) return;
199
342
  if (current) removeChild(parent, current);
@@ -203,82 +346,14 @@ function insertDynamic(parent, anchor, factory) {
203
346
  }
204
347
  __name(insertDynamic, "insertDynamic");
205
348
 
206
- // packages/runtime/src/error.ts
207
- var _VobsError = class _VobsError extends Error {
208
- constructor(options) {
209
- super(options.message);
210
- this.name = "VobsError";
211
- this.code = options.code;
212
- this.severity = options.severity ?? "error";
213
- this.layer = options.layer ?? "runtime";
214
- this.cause = options.cause;
215
- this.fix = options.fix;
216
- this.location = options.location;
217
- this.trace = options.trace;
218
- this.example = options.example;
219
- this.docs = options.docs;
220
- this.codeFrame = options.codeFrame;
221
- }
222
- };
223
- __name(_VobsError, "VobsError");
224
- var VobsError = _VobsError;
225
- function isVobsError(value) {
226
- return value instanceof VobsError || Boolean(value && typeof value === "object" && typeof value.code === "string" && typeof value.message === "string" && typeof value.layer === "string");
227
- }
228
- __name(isVobsError, "isVobsError");
229
- function normalizeVobsError(value, defaults = {}) {
230
- if (value instanceof VobsError) return value;
231
- if (value instanceof Error) {
232
- const metadata = value;
233
- const code = defaults.code ?? (typeof metadata.vobsCode === "string" ? metadata.vobsCode : void 0);
234
- if (code) defineErrorMetadata(value, "code", code);
235
- defineErrorMetadata(value, "severity", defaults.severity ?? "error");
236
- defineErrorMetadata(value, "layer", defaults.layer ?? "runtime");
237
- const fix = defaults.fix ?? (typeof metadata.vobsHint === "string" ? metadata.vobsHint : void 0);
238
- if (fix) defineErrorMetadata(value, "fix", fix);
239
- const source = metadata.vobsSource;
240
- if (source && typeof source === "object" && typeof source.file === "string" && typeof source.line === "number" && typeof source.column === "number") {
241
- defineErrorMetadata(value, "location", source);
242
- }
243
- return value;
244
- }
245
- if (isVobsError(value)) {
246
- const candidate = value;
247
- return new VobsError({
248
- code: candidate.code,
249
- message: candidate.message,
250
- severity: candidate.severity ?? defaults.severity,
251
- layer: candidate.layer ?? defaults.layer,
252
- cause: candidate.cause,
253
- fix: candidate.fix ?? defaults.fix,
254
- location: candidate.location,
255
- trace: candidate.trace,
256
- example: candidate.example,
257
- docs: candidate.docs,
258
- codeFrame: candidate.codeFrame
259
- });
260
- }
261
- const message = String(value);
262
- return new VobsError({
263
- code: defaults.code ?? "VOBS_UNKNOWN",
264
- message,
265
- severity: defaults.severity ?? "error",
266
- layer: defaults.layer ?? "runtime",
267
- cause: void 0,
268
- fix: defaults.fix
269
- });
270
- }
271
- __name(normalizeVobsError, "normalizeVobsError");
272
- function defineErrorMetadata(target, key, value) {
273
- if (key in target) return;
274
- try {
275
- Object.defineProperty(target, key, { configurable: true, enumerable: false, value, writable: true });
276
- } catch {
349
+ // packages/runtime/src/boundary.ts
350
+ function reportBoundaryError(event, loud) {
351
+ invokeRuntimeDebug("error", event);
352
+ if (loud && getRuntimeDebugHooks()?.error === void 0) {
353
+ console.error(formatVobsError(event.error, { includeStack: true }));
277
354
  }
278
355
  }
279
- __name(defineErrorMetadata, "defineErrorMetadata");
280
-
281
- // packages/runtime/src/boundary.ts
356
+ __name(reportBoundaryError, "reportBoundaryError");
282
357
  function insertBoundary(parent, anchor, options) {
283
358
  const boundary = createOwner3();
284
359
  boundary.run(() => {
@@ -295,24 +370,24 @@ function insertBoundary(parent, anchor, options) {
295
370
  fix: "\u68C0\u67E5\u7EC4\u4EF6\u6E32\u67D3\u903B\u8F91\uFF0C\u6216\u5728\u8FB9\u754C fallback \u4E2D\u63D0\u4F9B\u6062\u590D\u64CD\u4F5C\u3002"
296
371
  });
297
372
  lastError = normalized;
298
- invokeRuntimeDebug("error", {
373
+ reportBoundaryError({
299
374
  error: normalized,
300
375
  owner: boundary,
301
376
  phase: "boundary",
302
377
  handled: true,
303
378
  recovery: "fallback"
304
- });
379
+ }, true);
305
380
  error.value = normalized;
306
381
  });
307
382
  const retry = /* @__PURE__ */ __name(() => {
308
383
  if (error.value) {
309
- invokeRuntimeDebug("error", {
384
+ reportBoundaryError({
310
385
  error: error.value,
311
386
  owner: boundary,
312
387
  phase: "boundary",
313
388
  handled: true,
314
389
  recovery: "retrying"
315
- });
390
+ }, false);
316
391
  }
317
392
  error.value = null;
318
393
  return options.onRetry?.();
@@ -327,13 +402,13 @@ function insertBoundary(parent, anchor, options) {
327
402
  const currentError = error.value;
328
403
  if (!currentError) {
329
404
  if (fallbackActive && lastError) {
330
- invokeRuntimeDebug("error", {
405
+ reportBoundaryError({
331
406
  error: lastError,
332
407
  owner: boundary,
333
408
  phase: "boundary",
334
409
  handled: true,
335
410
  recovery: "recovered"
336
- });
411
+ }, false);
337
412
  lastError = null;
338
413
  }
339
414
  fallbackActive = false;