@vobs/resource 1.2.1 → 1.3.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.
package/dist/resource.cjs CHANGED
@@ -1,371 +1,41 @@
1
- 'use strict';
2
-
1
+ var __VOBS_CJS_FILE_URL = require("url").pathToFileURL(__filename).href;
2
+ "use strict";
3
3
  var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
7
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
-
6
- // packages/reactivity/src/debug.ts
7
- var activeDebugHooks = null;
8
- var signalNames = /* @__PURE__ */ new WeakMap();
9
- function hasDebugHooks() {
10
- return activeDebugHooks !== null;
11
- }
12
- __name(hasDebugHooks, "hasDebugHooks");
13
- function setSignalDebugName(signal, name) {
14
- signalNames.set(signal, name);
15
- invokeDebug("signalNamed", signal, name);
16
- }
17
- __name(setSignalDebugName, "setSignalDebugName");
18
- function invokeDebug(name, ...args) {
19
- return;
20
- }
21
- __name(invokeDebug, "invokeDebug");
22
-
23
- // packages/reactivity/src/owner.ts
24
- var currentOwner = null;
25
- var nextOwnerId = 1;
26
- function createOwner() {
27
- const parent = currentOwner;
28
- let disposed = parent?.disposed ?? false;
29
- const children = [];
30
- const cleanups = [];
31
- const errorHandlers = /* @__PURE__ */ new Set();
32
- const owner = {
33
- id: `owner-${nextOwnerId++}`,
34
- parent,
35
- children,
36
- depth: (parent?.depth ?? -1) + 1,
37
- get disposed() {
38
- return disposed;
39
- },
40
- run(fn) {
41
- if (disposed) throw new Error("Vobs: \u5DF2\u9500\u6BC1\u7684 Owner \u4E0D\u80FD\u7EE7\u7EED\u8FD0\u884C");
42
- const previous = currentOwner;
43
- currentOwner = owner;
44
- try {
45
- return fn();
46
- } finally {
47
- currentOwner = previous;
48
- }
49
- },
50
- addCleanup(cleanup) {
51
- if (disposed) {
52
- cleanup();
53
- return;
54
- }
55
- cleanups.push(cleanup);
56
- },
57
- onDispose(cleanup) {
58
- owner.addCleanup(cleanup);
59
- },
60
- onError(handler) {
61
- errorHandlers.add(handler);
62
- const remove = /* @__PURE__ */ __name(() => errorHandlers.delete(handler), "remove");
63
- owner.addCleanup(remove);
64
- return remove;
65
- },
66
- handleError(error) {
67
- for (const handler of [...errorHandlers].reverse()) {
68
- try {
69
- handler(error);
70
- return true;
71
- } catch (handlerError) {
72
- return parent?.handleError(handlerError) ?? false;
73
- }
74
- }
75
- return parent?.handleError(error) ?? false;
76
- },
77
- dispose() {
78
- if (disposed) return;
79
- disposed = true;
80
- for (const child of [...children]) child.dispose();
81
- children.length = 0;
82
- let firstError;
83
- for (let index = cleanups.length - 1; index >= 0; index--) {
84
- try {
85
- cleanups[index]();
86
- } catch (error) {
87
- firstError ?? (firstError = error);
88
- }
89
- }
90
- cleanups.length = 0;
91
- if (parent) {
92
- const index = parent.children.indexOf(owner);
93
- if (index >= 0) parent.children.splice(index, 1);
94
- }
95
- if (firstError) throw firstError;
96
- }
97
- };
98
- if (parent && !parent.disposed) parent.children.push(owner);
99
- return owner;
100
- }
101
- __name(createOwner, "createOwner");
102
- function getCurrentOwner() {
103
- return currentOwner;
104
- }
105
- __name(getCurrentOwner, "getCurrentOwner");
106
-
107
- // packages/reactivity/src/signal.ts
108
- var currentSubscriber = null;
109
- function getCurrentSubscriber() {
110
- return currentSubscriber;
111
- }
112
- __name(getCurrentSubscriber, "getCurrentSubscriber");
113
- function setCurrentSubscriber(subscriber) {
114
- currentSubscriber = subscriber;
115
- }
116
- __name(setCurrentSubscriber, "setCurrentSubscriber");
117
- function trackDependency(dependency) {
118
- if (!currentSubscriber || currentSubscriber.disposed) return;
119
- !currentSubscriber.dependencies.has(dependency);
120
- currentSubscriber.dependencies.add(dependency);
121
- }
122
- __name(trackDependency, "trackDependency");
123
- function state(initialValue, debugName) {
124
- let value = initialValue;
125
- let disposed = false;
126
- const subscribers = /* @__PURE__ */ new Set();
127
- const signalInstance = {
128
- get value() {
129
- const subscriber = getCurrentSubscriber();
130
- if (subscriber && !subscriber.disposed) {
131
- subscribers.add(subscriber);
132
- trackDependency(signalInstance);
133
- }
134
- return value;
135
- },
136
- set value(nextValue) {
137
- if (disposed || Object.is(value, nextValue)) return;
138
- value = nextValue;
139
- for (const subscriber of [...subscribers]) subscriber.notify();
140
- },
141
- unsubscribe(subscriber) {
142
- subscribers.delete(subscriber);
143
- },
144
- // 与 `.value =` 赋值同一条路径:判等短路、debug hook、notify 全部一致。
145
- // 以闭包实现,可安全地作为回调直接传递(无 this 绑定问题)。
146
- set(next) {
147
- signalInstance.value = next;
148
- },
149
- dispose() {
150
- if (disposed) return;
151
- disposed = true;
152
- subscribers.clear();
153
- }
154
- };
155
- const owner = getCurrentOwner();
156
- owner?.addCleanup(signalInstance.dispose);
157
- if (debugName?.trim()) setSignalDebugName(signalInstance, debugName.trim());
158
- return signalInstance;
159
- }
160
- __name(state, "state");
161
-
162
- // packages/reactivity/src/scheduler.ts
163
- var _Scheduler = class _Scheduler {
164
- constructor() {
165
- this.dirtyEffects = /* @__PURE__ */ new Set();
166
- this.lowPriorityEffects = /* @__PURE__ */ new Set();
167
- // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。
168
- this.normalBuffer = [];
169
- this.lowBuffer = [];
170
- this.flushing = false;
171
- this.scheduled = false;
172
- this.batchDepth = 0;
173
- }
174
- schedule(effect2) {
175
- if (effect2.disposed) return;
176
- this.dirtyEffects.add(effect2);
177
- this.lowPriorityEffects.delete(effect2);
178
- this.ensureScheduled();
179
- }
180
- /** Queue an effect behind normal updates while preserving deterministic order. */
181
- scheduleLow(effect2) {
182
- if (effect2.disposed) return;
183
- if (!this.dirtyEffects.has(effect2)) this.lowPriorityEffects.add(effect2);
184
- this.ensureScheduled();
185
- }
186
- ensureScheduled() {
187
- if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {
188
- this.scheduled = true;
189
- queueMicrotask(() => {
190
- this.scheduled = false;
191
- this.flush();
192
- });
193
- }
194
- }
195
- remove(effect2) {
196
- this.dirtyEffects.delete(effect2);
197
- this.lowPriorityEffects.delete(effect2);
198
- }
199
- batch(fn) {
200
- this.batchDepth++;
201
- try {
202
- return fn();
203
- } finally {
204
- this.batchDepth--;
205
- if (this.batchDepth === 0) this.flush();
206
- }
207
- }
208
- flush() {
209
- if (this.flushing || this.batchDepth > 0) return;
210
- this.flushing = true;
211
- let rounds = 0;
212
- let firstError;
213
- let hasError = false;
214
- try {
215
- while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {
216
- if (++rounds > 100) {
217
- this.dirtyEffects.clear();
218
- this.lowPriorityEffects.clear();
219
- throw new Error("Vobs: \u54CD\u5E94\u5F0F\u66F4\u65B0\u8D85\u8FC7 100 \u8F6E\uFF0C\u53EF\u80FD\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56");
220
- }
221
- this.collectRunnable(this.dirtyEffects, this.normalBuffer);
222
- this.collectRunnable(this.lowPriorityEffects, this.lowBuffer);
223
- sortEffects(this.normalBuffer);
224
- sortEffects(this.lowBuffer);
225
- for (const effect2 of this.normalBuffer) {
226
- try {
227
- effect2.run();
228
- } catch (error) {
229
- if (!hasError) {
230
- firstError = error;
231
- hasError = true;
232
- }
233
- }
234
- }
235
- for (const effect2 of this.lowBuffer) {
236
- try {
237
- effect2.run();
238
- } catch (error) {
239
- if (!hasError) {
240
- firstError = error;
241
- hasError = true;
242
- }
243
- }
244
- }
245
- this.normalBuffer.length = 0;
246
- this.lowBuffer.length = 0;
247
- }
248
- } finally {
249
- this.normalBuffer.length = 0;
250
- this.lowBuffer.length = 0;
251
- this.flushing = false;
252
- }
253
- if (hasError) throw firstError;
254
- }
255
- /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */
256
- collectRunnable(source, target) {
257
- for (const effect2 of source) {
258
- if (!effect2.disposed) target.push(effect2);
259
- }
260
- source.clear();
261
- }
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
262
11
  };
263
- __name(_Scheduler, "Scheduler");
264
- var Scheduler = _Scheduler;
265
- function sortEffects(effects) {
266
- if (effects.length > 1) {
267
- effects.sort((a, b) => b.depth - a.depth || a.order - b.order);
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
268
17
  }
269
- }
270
- __name(sortEffects, "sortEffects");
271
- var scheduler = new Scheduler();
272
-
273
- // packages/reactivity/src/effect.ts
274
- var nextEffectOrder = 1;
275
- function cleanupDependencies(subscriber) {
276
- for (const dependency of subscriber.dependencies) {
277
- dependency.unsubscribe(subscriber);
278
- }
279
- subscriber.dependencies.clear();
280
- }
281
- __name(cleanupDependencies, "cleanupDependencies");
282
- function effect(callback) {
283
- const owner = getCurrentOwner();
284
- let cleanup;
285
- let dirty = true;
286
- let disposed = false;
287
- const eff = {
288
- order: nextEffectOrder++,
289
- depth: owner?.depth ?? 0,
290
- dependencies: /* @__PURE__ */ new Set(),
291
- get disposed() {
292
- return disposed;
293
- },
294
- notify() {
295
- if (disposed || dirty) return;
296
- dirty = true;
297
- scheduler.schedule(eff);
298
- },
299
- run() {
300
- if (disposed || !dirty) return;
301
- dirty = false;
302
- const previousCleanup = cleanup;
303
- cleanup = void 0;
304
- let cleanupError;
305
- if (previousCleanup) {
306
- try {
307
- previousCleanup();
308
- } catch (error) {
309
- const handled2 = owner?.handleError(error) ?? false;
310
- if (!handled2) cleanupError = error;
311
- }
312
- }
313
- cleanupDependencies(eff);
314
- const previous = getCurrentSubscriber();
315
- setCurrentSubscriber(eff);
316
- let thrown;
317
- let handled = false;
318
- try {
319
- const result = owner ? owner.run(callback) : callback();
320
- cleanup = typeof result === "function" ? result : void 0;
321
- } catch (error) {
322
- thrown = error;
323
- handled = owner?.handleError(error) ?? false;
324
- if (!handled) throw error;
325
- } finally {
326
- setCurrentSubscriber(previous);
327
- }
328
- if (cleanupError && !thrown) throw cleanupError;
329
- },
330
- scheduleLow() {
331
- if (disposed || dirty) return;
332
- dirty = true;
333
- scheduler.scheduleLow(eff);
334
- },
335
- dispose() {
336
- if (disposed) return;
337
- disposed = true;
338
- dirty = false;
339
- scheduler.remove(eff);
340
- const previousCleanup = cleanup;
341
- cleanup = void 0;
342
- let cleanupError;
343
- if (previousCleanup) {
344
- try {
345
- previousCleanup();
346
- } catch (error) {
347
- const handled = owner?.handleError(error) ?? false;
348
- if (!handled) cleanupError = error;
349
- }
350
- }
351
- cleanupDependencies(eff);
352
- if (cleanupError) throw cleanupError;
353
- }
354
- };
355
- owner?.addCleanup(eff.dispose);
356
- eff.run();
357
- return eff;
358
- }
359
- __name(effect, "effect");
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
360
21
 
361
22
  // packages/resource/src/resource.ts
23
+ var resource_exports = {};
24
+ __export(resource_exports, {
25
+ createResourceClient: () => createResourceClient,
26
+ resource: () => resource,
27
+ serializeResourceState: () => serializeResourceState,
28
+ stableSerialize: () => stableSerialize
29
+ });
30
+ module.exports = __toCommonJS(resource_exports);
31
+ var import_reactivity = require("@vobs/reactivity");
362
32
  var defaultClient = createResourceClient();
363
33
  function resource(optionsOrFetcher) {
364
34
  return typeof optionsOrFetcher === "function" ? defaultClient.resource(optionsOrFetcher) : defaultClient.resource(optionsOrFetcher);
365
35
  }
366
36
  __name(resource, "resource");
367
37
  function createResourceClient(options = {}) {
368
- let owner = createOwner();
38
+ let owner = (0, import_reactivity.createOwner)();
369
39
  const cache = /* @__PURE__ */ new Map();
370
40
  const entries = /* @__PURE__ */ new Set();
371
41
  const defaultStaleTime = validateStaleTime(options.staleTime ?? 0);
@@ -374,9 +44,9 @@ function createResourceClient(options = {}) {
374
44
  function createEntry(key, staleTime) {
375
45
  const entry = owner.run(() => ({
376
46
  key,
377
- data: state(null),
378
- error: state(null),
379
- loading: state(false),
47
+ data: (0, import_reactivity.state)(null),
48
+ error: (0, import_reactivity.state)(null),
49
+ loading: (0, import_reactivity.state)(false),
380
50
  staleTime,
381
51
  subscribers: /* @__PURE__ */ new Set(),
382
52
  updatedAt: 0,
@@ -453,7 +123,7 @@ function createResourceClient(options = {}) {
453
123
  if (!entry?.subscribers.delete(resourceHandle)) return;
454
124
  if (entry.subscribers.size === 0) entry.controller?.abort();
455
125
  }, "dispose");
456
- getCurrentOwner()?.onDispose(dispose);
126
+ (0, import_reactivity.getCurrentOwner)()?.onDispose(dispose);
457
127
  return {
458
128
  key: staticKey,
459
129
  data: entry.data,
@@ -503,9 +173,9 @@ function createResourceClient(options = {}) {
503
173
  }
504
174
  };
505
175
  function createReactiveResource(reactiveConfig) {
506
- const data = state(null);
507
- const error = state(null);
508
- const loading = state(false);
176
+ const data = (0, import_reactivity.state)(null);
177
+ const error = (0, import_reactivity.state)(null);
178
+ const loading = (0, import_reactivity.state)(false);
509
179
  const handle = {};
510
180
  let activeEntry;
511
181
  let activeKey;
@@ -537,7 +207,7 @@ function createResourceClient(options = {}) {
537
207
  sync();
538
208
  void request2(false).catch(() => void 0);
539
209
  }, "switchKey");
540
- const stop = effect(() => {
210
+ const stop = (0, import_reactivity.effect)(() => {
541
211
  if (disposed) return;
542
212
  const nextKey = resolveKey(reactiveConfig.key);
543
213
  if (!nextKey) throw new Error("resource: \u54CD\u5E94\u5F0F key \u4E0D\u80FD\u662F undefined");
@@ -554,7 +224,7 @@ function createResourceClient(options = {}) {
554
224
  }
555
225
  activeEntry = void 0;
556
226
  }, "dispose");
557
- getCurrentOwner()?.onDispose(dispose2);
227
+ (0, import_reactivity.getCurrentOwner)()?.onDispose(dispose2);
558
228
  return {
559
229
  get key() {
560
230
  return activeKey;
@@ -592,7 +262,9 @@ function createResourceClient(options = {}) {
592
262
  }
593
263
  return execute(activeEntry, reactiveConfig.fetcher, reactiveConfig.retry, reactiveConfig.retryDelay);
594
264
  }
265
+ __name(request2, "request");
595
266
  }
267
+ __name(createReactiveResource, "createReactiveResource");
596
268
  function createOptimistic(target, next, action) {
597
269
  const previous = { data: target.data.value, error: target.error.value, updatedAt: target.updatedAt };
598
270
  const value = typeof next === "function" ? next(target.data.value) : next;
@@ -612,6 +284,7 @@ function createResourceClient(options = {}) {
612
284
  throw failure;
613
285
  });
614
286
  }
287
+ __name(createOptimistic, "createOptimistic");
615
288
  }
616
289
  __name(createResource, "createResource");
617
290
  return {
@@ -663,7 +336,7 @@ function createResourceClient(options = {}) {
663
336
  cache.clear();
664
337
  entries.clear();
665
338
  owner.dispose();
666
- owner = createOwner();
339
+ owner = (0, import_reactivity.createOwner)();
667
340
  }
668
341
  };
669
342
  }
@@ -806,6 +479,8 @@ function serialize(value, stack) {
806
479
  case "function":
807
480
  case "symbol":
808
481
  throw new Error(`resource: key \u4E0D\u80FD\u5305\u542B ${typeof value}`);
482
+ case "object":
483
+ break;
809
484
  }
810
485
  const object = value;
811
486
  if (stack.has(object)) throw new Error("resource: key \u4E0D\u80FD\u5305\u542B\u5FAA\u73AF\u5F15\u7528");
@@ -823,10 +498,11 @@ function serialize(value, stack) {
823
498
  }
824
499
  }
825
500
  __name(serialize, "serialize");
826
-
827
- exports.createResourceClient = createResourceClient;
828
- exports.resource = resource;
829
- exports.serializeResourceState = serializeResourceState;
830
- exports.stableSerialize = stableSerialize;
831
- //# sourceMappingURL=resource.cjs.map
501
+ // Annotate the CommonJS export names for ESM import in node:
502
+ 0 && (module.exports = {
503
+ createResourceClient,
504
+ resource,
505
+ serializeResourceState,
506
+ stableSerialize
507
+ });
832
508
  //# sourceMappingURL=resource.cjs.map