voodoojs 0.4.6

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 (54) hide show
  1. package/README.md +77 -0
  2. package/dist/chunk-234ZLC6W.js +401 -0
  3. package/dist/chunk-4HQEOXTK.js +10271 -0
  4. package/dist/chunk-5777LJVW.js +64 -0
  5. package/dist/chunk-5CKGDARU.js +1845 -0
  6. package/dist/chunk-A2UOVQBP.js +82 -0
  7. package/dist/chunk-E27NRARW.js +16 -0
  8. package/dist/chunk-JZIYRIY6.js +1196 -0
  9. package/dist/chunk-NNU6WOOU.js +641 -0
  10. package/dist/chunk-PQZEVFVZ.js +448 -0
  11. package/dist/chunk-RJUNPXQF.js +946 -0
  12. package/dist/chunk-U76IRJKH.js +72 -0
  13. package/dist/essential.cjs +13889 -0
  14. package/dist/essential.d.cts +24 -0
  15. package/dist/essential.d.ts +24 -0
  16. package/dist/essential.js +51 -0
  17. package/dist/gpu.cjs +2008 -0
  18. package/dist/gpu.d.cts +68 -0
  19. package/dist/gpu.d.ts +68 -0
  20. package/dist/gpu.js +273 -0
  21. package/dist/http.cjs +467 -0
  22. package/dist/http.d.cts +148 -0
  23. package/dist/http.d.ts +148 -0
  24. package/dist/http.js +7 -0
  25. package/dist/index-CaLD-0oh.d.cts +608 -0
  26. package/dist/index-CaLD-0oh.d.ts +608 -0
  27. package/dist/index-DTllqUtj.d.cts +261 -0
  28. package/dist/index-DTllqUtj.d.ts +261 -0
  29. package/dist/index.cjs +23063 -0
  30. package/dist/index.d.cts +1603 -0
  31. package/dist/index.d.ts +1603 -0
  32. package/dist/index.js +6924 -0
  33. package/dist/query-CKJ4oSpG.d.cts +1595 -0
  34. package/dist/query-DQFRmu3u.d.ts +1595 -0
  35. package/dist/reactivity.cjs +676 -0
  36. package/dist/reactivity.d.cts +188 -0
  37. package/dist/reactivity.d.ts +188 -0
  38. package/dist/reactivity.js +4 -0
  39. package/dist/socket.cjs +2685 -0
  40. package/dist/socket.d.cts +167 -0
  41. package/dist/socket.d.ts +167 -0
  42. package/dist/socket.js +238 -0
  43. package/dist/style-XEUAGGJK.js +5 -0
  44. package/dist/utils.cjs +397 -0
  45. package/dist/utils.d.cts +111 -0
  46. package/dist/utils.d.ts +111 -0
  47. package/dist/utils.js +4 -0
  48. package/dist/voodoo.core.js +8213 -0
  49. package/dist/voodoo.core.min.js +146 -0
  50. package/dist/voodoo.full.js +21193 -0
  51. package/dist/voodoo.full.min.js +1784 -0
  52. package/dist/voodoo.js +14185 -0
  53. package/dist/voodoo.min.js +420 -0
  54. package/package.json +127 -0
@@ -0,0 +1,676 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Voodoo.js v0.4.6
5
+ * JavaScript feels like magic.
6
+ * (c) 2026 Voodoo.js contributors. MIT License.
7
+ */
8
+ var __defProp = Object.defineProperty;
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
11
+
12
+ // src/reactivity/index.ts
13
+ var resolvedPromise = /* @__PURE__ */ Promise.resolve();
14
+ var queue = [];
15
+ var postQueue = [];
16
+ var isFlushing = false;
17
+ var isFlushPending = false;
18
+ var flushPromise = null;
19
+ var RECURSION_LIMIT = 100;
20
+ function nextTick(fn) {
21
+ const p = flushPromise || resolvedPromise;
22
+ return fn ? p.then(fn) : p;
23
+ }
24
+ function queueJob(job) {
25
+ if (job.queued) return;
26
+ job.queued = true;
27
+ queue.push(job);
28
+ queueFlush();
29
+ }
30
+ function queuePostFlush(cb) {
31
+ postQueue.push(cb);
32
+ queueFlush();
33
+ }
34
+ function queueFlush() {
35
+ if (isFlushing || isFlushPending) return;
36
+ isFlushPending = true;
37
+ flushPromise = resolvedPromise.then(flushJobs);
38
+ }
39
+ function flushJobs() {
40
+ isFlushPending = false;
41
+ isFlushing = true;
42
+ const counts = /* @__PURE__ */ new Map();
43
+ try {
44
+ for (let i = 0; i < queue.length; i++) {
45
+ const job = queue[i];
46
+ if (!job.active) continue;
47
+ const count = (counts.get(job) || 0) + 1;
48
+ counts.set(job, count);
49
+ if (count > RECURSION_LIMIT) {
50
+ warn(
51
+ "Infinite update loop detected. A reactive effect keeps triggering itself without ever settling. Check whether some expression writes to state that it also reads."
52
+ );
53
+ continue;
54
+ }
55
+ try {
56
+ job.run();
57
+ } catch (err) {
58
+ handleError(err, "effect");
59
+ }
60
+ }
61
+ } finally {
62
+ for (const job of queue) job.queued = false;
63
+ queue = [];
64
+ isFlushing = false;
65
+ const posts = postQueue;
66
+ postQueue = [];
67
+ for (const cb of posts) {
68
+ try {
69
+ cb();
70
+ } catch (err) {
71
+ handleError(err, "post-flush");
72
+ }
73
+ }
74
+ if (queue.length || postQueue.length) {
75
+ flushPromise = resolvedPromise.then(flushJobs);
76
+ isFlushPending = true;
77
+ } else {
78
+ flushPromise = null;
79
+ }
80
+ }
81
+ }
82
+ function flushSync() {
83
+ if (isFlushing) return;
84
+ isFlushPending = false;
85
+ flushJobs();
86
+ }
87
+ var errorHandler = null;
88
+ function setErrorHandler(fn) {
89
+ errorHandler = fn;
90
+ }
91
+ function handleError(err, context) {
92
+ if (errorHandler) {
93
+ errorHandler(err, context);
94
+ return;
95
+ }
96
+ console.error(`[Voodoo] error in ${context}:`, err);
97
+ }
98
+ function warn(msg, ...args) {
99
+ console.warn(`[Voodoo] ${msg}`, ...args);
100
+ }
101
+ var activeEffect;
102
+ var shouldTrack = true;
103
+ var trackStack = [];
104
+ function pauseTracking() {
105
+ trackStack.push(shouldTrack);
106
+ shouldTrack = false;
107
+ }
108
+ function enableTracking() {
109
+ trackStack.push(shouldTrack);
110
+ shouldTrack = true;
111
+ }
112
+ function resetTracking() {
113
+ shouldTrack = trackStack.pop() ?? true;
114
+ }
115
+ function getActiveEffect() {
116
+ return activeEffect;
117
+ }
118
+ var effectId = 0;
119
+ var ReactiveEffect = class {
120
+ constructor(fn, options) {
121
+ this.fn = fn;
122
+ this.id = effectId++;
123
+ this.active = true;
124
+ this.queued = false;
125
+ this.deps = [];
126
+ this.parent = void 0;
127
+ this.scheduler = options?.scheduler;
128
+ this.onStop = options?.onStop;
129
+ this.cleanups = [];
130
+ const scope = options?.scope ?? activeScope;
131
+ if (scope) scope.effects.push(this);
132
+ }
133
+ run() {
134
+ if (!this.active) return this.fn();
135
+ let parent = activeEffect;
136
+ while (parent) {
137
+ if (parent === this) return void 0;
138
+ parent = parent.parent;
139
+ }
140
+ this.runCleanups();
141
+ try {
142
+ this.parent = activeEffect;
143
+ activeEffect = this;
144
+ enableTracking();
145
+ cleanupDeps(this);
146
+ return this.fn();
147
+ } finally {
148
+ resetTracking();
149
+ activeEffect = this.parent;
150
+ this.parent = void 0;
151
+ }
152
+ }
153
+ /** Registers a function called before the next run and on stop. */
154
+ onInvalidate(fn) {
155
+ this.cleanups.push(fn);
156
+ }
157
+ runCleanups() {
158
+ if (!this.cleanups.length) return;
159
+ const list = this.cleanups;
160
+ this.cleanups = [];
161
+ for (const fn of list) {
162
+ try {
163
+ fn();
164
+ } catch (err) {
165
+ handleError(err, "effect cleanup");
166
+ }
167
+ }
168
+ }
169
+ stop() {
170
+ if (!this.active) return;
171
+ cleanupDeps(this);
172
+ this.runCleanups();
173
+ this.active = false;
174
+ this.onStop?.();
175
+ }
176
+ };
177
+ function cleanupDeps(effect2) {
178
+ const { deps } = effect2;
179
+ for (let i = 0; i < deps.length; i++) deps[i].delete(effect2);
180
+ deps.length = 0;
181
+ }
182
+ function effect(fn, options) {
183
+ const e = new ReactiveEffect(fn, options);
184
+ if (!options?.lazy) e.run();
185
+ const runner = (() => e.run());
186
+ runner.effect = e;
187
+ return runner;
188
+ }
189
+ function stop(runner) {
190
+ if (runner instanceof ReactiveEffect) runner.stop();
191
+ else runner.effect.stop();
192
+ }
193
+ var activeScope;
194
+ var EffectScope = class {
195
+ constructor(detached = false) {
196
+ this.effects = [];
197
+ this.cleanups = [];
198
+ this.children = [];
199
+ this.active = true;
200
+ this.parent = void 0;
201
+ if (!detached && activeScope) {
202
+ this.parent = activeScope;
203
+ activeScope.children.push(this);
204
+ }
205
+ }
206
+ run(fn) {
207
+ if (!this.active) return void 0;
208
+ const prev = activeScope;
209
+ try {
210
+ activeScope = this;
211
+ return fn();
212
+ } finally {
213
+ activeScope = prev;
214
+ }
215
+ }
216
+ onDispose(fn) {
217
+ this.cleanups.push(fn);
218
+ }
219
+ stop() {
220
+ if (!this.active) return;
221
+ this.active = false;
222
+ for (const e of this.effects) e.stop();
223
+ for (const c of this.children) c.stop();
224
+ for (const fn of this.cleanups) {
225
+ try {
226
+ fn();
227
+ } catch (err) {
228
+ handleError(err, "scope cleanup");
229
+ }
230
+ }
231
+ this.effects.length = 0;
232
+ this.children.length = 0;
233
+ this.cleanups.length = 0;
234
+ if (this.parent) {
235
+ const i = this.parent.children.indexOf(this);
236
+ if (i > -1) this.parent.children.splice(i, 1);
237
+ }
238
+ }
239
+ };
240
+ function effectScope(detached = false) {
241
+ return new EffectScope(detached);
242
+ }
243
+ function getActiveScope() {
244
+ return activeScope;
245
+ }
246
+ var ITERATE_KEY = /* @__PURE__ */ Symbol("voodoo:iterate");
247
+ var targetMap = /* @__PURE__ */ new WeakMap();
248
+ function track(target, key) {
249
+ if (!shouldTrack || !activeEffect) return;
250
+ let depsMap = targetMap.get(target);
251
+ if (!depsMap) targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
252
+ let dep = depsMap.get(key);
253
+ if (!dep) depsMap.set(key, dep = /* @__PURE__ */ new Set());
254
+ if (!dep.has(activeEffect)) {
255
+ dep.add(activeEffect);
256
+ activeEffect.deps.push(dep);
257
+ }
258
+ }
259
+ var TriggerType = /* @__PURE__ */ ((TriggerType2) => {
260
+ TriggerType2["SET"] = "set";
261
+ TriggerType2["ADD"] = "add";
262
+ TriggerType2["DELETE"] = "delete";
263
+ TriggerType2["CLEAR"] = "clear";
264
+ return TriggerType2;
265
+ })(TriggerType || {});
266
+ function trigger(target, type, key, _newValue) {
267
+ const depsMap = targetMap.get(target);
268
+ if (!depsMap) return;
269
+ const effects = /* @__PURE__ */ new Set();
270
+ const add = (dep) => {
271
+ if (!dep) return;
272
+ for (const e of dep) if (e !== activeEffect || type === "clear" /* CLEAR */) effects.add(e);
273
+ };
274
+ if (type === "clear" /* CLEAR */) {
275
+ depsMap.forEach(add);
276
+ } else {
277
+ if (key !== void 0) add(depsMap.get(key));
278
+ const isArr = Array.isArray(target);
279
+ if (type === "add" /* ADD */) {
280
+ if (!isArr) add(depsMap.get(ITERATE_KEY));
281
+ else if (isIntegerKey(key)) add(depsMap.get("length"));
282
+ } else if (type === "delete" /* DELETE */) {
283
+ if (!isArr) add(depsMap.get(ITERATE_KEY));
284
+ } else if (isArr && key === "length") {
285
+ const newLen = Number(_newValue);
286
+ depsMap.forEach((dep, k) => {
287
+ if (k === "length" || typeof k !== "symbol" && Number(k) >= newLen) add(dep);
288
+ });
289
+ }
290
+ }
291
+ for (const e of effects) {
292
+ if (e.scheduler) e.scheduler();
293
+ else queueJob(e);
294
+ }
295
+ }
296
+ function isIntegerKey(key) {
297
+ return typeof key === "string" && key !== "NaN" && key[0] !== "-" && String(parseInt(key, 10)) === key;
298
+ }
299
+ var RAW = /* @__PURE__ */ Symbol("voodoo:raw");
300
+ var IS_REACTIVE = /* @__PURE__ */ Symbol("voodoo:isReactive");
301
+ var SKIP = /* @__PURE__ */ Symbol("voodoo:skip");
302
+ var reactiveMap = /* @__PURE__ */ new WeakMap();
303
+ var arrayInstrumentations = /* @__PURE__ */ (() => {
304
+ const inst = {};
305
+ for (const key of ["includes", "indexOf", "lastIndexOf"]) {
306
+ inst[key] = function(...args) {
307
+ const arr = toRaw(this);
308
+ for (let i = 0; i < arr.length; i++) track(arr, String(i));
309
+ const res = arr[key].apply(arr, args);
310
+ if (res === -1 || res === false) {
311
+ return arr[key].apply(arr, args.map(toRaw));
312
+ }
313
+ return res;
314
+ };
315
+ }
316
+ for (const key of ["push", "pop", "shift", "unshift", "splice"]) {
317
+ inst[key] = function(...args) {
318
+ pauseTracking();
319
+ try {
320
+ return toRaw(this)[key].apply(this, args);
321
+ } finally {
322
+ resetTracking();
323
+ }
324
+ };
325
+ }
326
+ return inst;
327
+ })();
328
+ function isObject(val) {
329
+ return val !== null && typeof val === "object";
330
+ }
331
+ var NON_REACTIVE = /* @__PURE__ */ new Set([
332
+ "Date",
333
+ "RegExp",
334
+ "Promise",
335
+ "Error",
336
+ "File",
337
+ "FileList",
338
+ "Blob",
339
+ "FormData",
340
+ "URL",
341
+ "URLSearchParams",
342
+ "ArrayBuffer",
343
+ "DataView"
344
+ ]);
345
+ function canObserve(value) {
346
+ if (!isObject(value)) return false;
347
+ if (value[SKIP]) return false;
348
+ if (Object.isFrozen(value)) return false;
349
+ if (typeof Node !== "undefined" && value instanceof Node) return false;
350
+ const tag = Object.prototype.toString.call(value).slice(8, -1);
351
+ if (NON_REACTIVE.has(tag)) return false;
352
+ return tag === "Object" || tag === "Array" || tag === "Map" || tag === "Set";
353
+ }
354
+ function markRaw(value) {
355
+ Object.defineProperty(value, SKIP, { value: true, enumerable: false, configurable: true });
356
+ return value;
357
+ }
358
+ function toRaw(observed) {
359
+ const raw = observed && observed[RAW];
360
+ return raw ? toRaw(raw) : observed;
361
+ }
362
+ function isReactive(value) {
363
+ return !!(value && value[IS_REACTIVE]);
364
+ }
365
+ function reactive(target) {
366
+ if (!isObject(target)) return target;
367
+ if (isReactive(target)) return target;
368
+ if (!canObserve(target)) return target;
369
+ const existing = reactiveMap.get(target);
370
+ if (existing) return existing;
371
+ const isMapOrSet = target instanceof Map || target instanceof Set;
372
+ const proxy = new Proxy(
373
+ target,
374
+ isMapOrSet ? collectionHandlers : baseHandlers
375
+ );
376
+ reactiveMap.set(target, proxy);
377
+ return proxy;
378
+ }
379
+ var baseHandlers = {
380
+ get(target, key, receiver) {
381
+ if (key === RAW) return target;
382
+ if (key === IS_REACTIVE) return true;
383
+ const isArr = Array.isArray(target);
384
+ if (isArr && Object.prototype.hasOwnProperty.call(arrayInstrumentations, key)) {
385
+ return Reflect.get(arrayInstrumentations, key, receiver);
386
+ }
387
+ const res = Reflect.get(target, key, receiver);
388
+ if (typeof key === "symbol") return res;
389
+ track(target, key);
390
+ if (isRef(res)) return isArr && isIntegerKey(key) ? res : res.value;
391
+ if (isObject(res)) return reactive(res);
392
+ return res;
393
+ },
394
+ set(target, key, value, receiver) {
395
+ const oldValue = target[key];
396
+ value = toRaw(value);
397
+ if (!Array.isArray(target) && isRef(oldValue) && !isRef(value)) {
398
+ oldValue.value = value;
399
+ return true;
400
+ }
401
+ const hadKey = Array.isArray(target) && isIntegerKey(key) ? Number(key) < target.length : Object.prototype.hasOwnProperty.call(target, key);
402
+ const result = Reflect.set(target, key, value, receiver);
403
+ if (target === toRaw(receiver)) {
404
+ if (!hadKey) trigger(target, "add" /* ADD */, key, value);
405
+ else if (hasChanged(value, oldValue)) trigger(target, "set" /* SET */, key, value);
406
+ }
407
+ return result;
408
+ },
409
+ deleteProperty(target, key) {
410
+ const hadKey = Object.prototype.hasOwnProperty.call(target, key);
411
+ const result = Reflect.deleteProperty(target, key);
412
+ if (result && hadKey) trigger(target, "delete" /* DELETE */, key);
413
+ return result;
414
+ },
415
+ has(target, key) {
416
+ const result = Reflect.has(target, key);
417
+ if (typeof key !== "symbol") track(target, key);
418
+ return result;
419
+ },
420
+ ownKeys(target) {
421
+ track(target, Array.isArray(target) ? "length" : ITERATE_KEY);
422
+ return Reflect.ownKeys(target);
423
+ }
424
+ };
425
+ var collectionHandlers = {
426
+ get(target, key, receiver) {
427
+ if (key === RAW) return target;
428
+ if (key === IS_REACTIVE) return true;
429
+ const raw = target;
430
+ if (key === "size") {
431
+ track(raw, ITERATE_KEY);
432
+ return Reflect.get(raw, "size", raw);
433
+ }
434
+ const methods = {
435
+ get(k) {
436
+ track(raw, k);
437
+ const v = raw.get(k);
438
+ return isObject(v) ? reactive(v) : v;
439
+ },
440
+ has(k) {
441
+ track(raw, k);
442
+ return raw.has(k);
443
+ },
444
+ add(v) {
445
+ v = toRaw(v);
446
+ const had = raw.has(v);
447
+ raw.add(v);
448
+ if (!had) trigger(raw, "add" /* ADD */, v, v);
449
+ return receiver;
450
+ },
451
+ set(k, v) {
452
+ const had = raw.has(k);
453
+ const old = raw.get(k);
454
+ raw.set(k, toRaw(v));
455
+ if (!had) trigger(raw, "add" /* ADD */, k, v);
456
+ else if (hasChanged(v, old)) trigger(raw, "set" /* SET */, k, v);
457
+ return receiver;
458
+ },
459
+ delete(k) {
460
+ const had = raw.has(k);
461
+ const res2 = raw.delete(k);
462
+ if (had) trigger(raw, "delete" /* DELETE */, k);
463
+ return res2;
464
+ },
465
+ clear() {
466
+ const had = raw.size !== 0;
467
+ const res2 = raw.clear();
468
+ if (had) trigger(raw, "clear" /* CLEAR */);
469
+ return res2;
470
+ },
471
+ forEach(cb, thisArg) {
472
+ track(raw, ITERATE_KEY);
473
+ return raw.forEach((v, k) => {
474
+ cb.call(thisArg, isObject(v) ? reactive(v) : v, isObject(k) ? reactive(k) : k, receiver);
475
+ });
476
+ }
477
+ };
478
+ if (key in methods) return methods[key];
479
+ if (key === Symbol.iterator || key === "keys" || key === "values" || key === "entries") {
480
+ track(raw, ITERATE_KEY);
481
+ const method = raw[key];
482
+ return typeof method === "function" ? method.bind(raw) : method;
483
+ }
484
+ const res = Reflect.get(raw, key, raw);
485
+ return typeof res === "function" ? res.bind(raw) : res;
486
+ }
487
+ };
488
+ function hasChanged(value, oldValue) {
489
+ return !Object.is(value, oldValue);
490
+ }
491
+ function isRef(r) {
492
+ return !!(r && r.__v_isRef === true);
493
+ }
494
+ var RefImpl = class {
495
+ constructor(value, shallow = false) {
496
+ __publicField(this, "shallow", shallow);
497
+ __publicField(this, "__v_isRef", true);
498
+ __publicField(this, "_value");
499
+ __publicField(this, "_rawValue");
500
+ __publicField(this, "dep", /* @__PURE__ */ new Set());
501
+ this._rawValue = toRaw(value);
502
+ this._value = shallow ? value : maybeReactive(value);
503
+ }
504
+ get value() {
505
+ trackRefValue(this);
506
+ return this._value;
507
+ }
508
+ set value(newVal) {
509
+ const raw = toRaw(newVal);
510
+ if (hasChanged(raw, this._rawValue)) {
511
+ this._rawValue = raw;
512
+ this._value = this.shallow ? newVal : maybeReactive(newVal);
513
+ triggerRefValue(this);
514
+ }
515
+ }
516
+ };
517
+ function maybeReactive(value) {
518
+ return isObject(value) ? reactive(value) : value;
519
+ }
520
+ function trackRefValue(ref2) {
521
+ if (!shouldTrack || !activeEffect) return;
522
+ if (!ref2.dep.has(activeEffect)) {
523
+ ref2.dep.add(activeEffect);
524
+ activeEffect.deps.push(ref2.dep);
525
+ }
526
+ }
527
+ function triggerRefValue(ref2) {
528
+ for (const e of [...ref2.dep]) {
529
+ if (e.scheduler) e.scheduler();
530
+ else queueJob(e);
531
+ }
532
+ }
533
+ function ref(value) {
534
+ return new RefImpl(value);
535
+ }
536
+ function shallowRef(value) {
537
+ return new RefImpl(value, true);
538
+ }
539
+ function unref(value) {
540
+ return isRef(value) ? value.value : value;
541
+ }
542
+ var ComputedRefImpl = class {
543
+ constructor(getter, setter) {
544
+ __publicField(this, "setter", setter);
545
+ __publicField(this, "__v_isRef", true);
546
+ __publicField(this, "_value");
547
+ __publicField(this, "_dirty", true);
548
+ __publicField(this, "effect");
549
+ __publicField(this, "dep", /* @__PURE__ */ new Set());
550
+ this.effect = new ReactiveEffect(getter, {
551
+ scheduler: () => {
552
+ if (!this._dirty) {
553
+ this._dirty = true;
554
+ triggerRefValue(this);
555
+ }
556
+ }
557
+ });
558
+ }
559
+ get value() {
560
+ trackRefValue(this);
561
+ if (this._dirty) {
562
+ this._dirty = false;
563
+ this._value = this.effect.run();
564
+ }
565
+ return this._value;
566
+ }
567
+ set value(v) {
568
+ if (this.setter) this.setter(v);
569
+ else warn("computed is read-only when there is no setter.");
570
+ }
571
+ stop() {
572
+ this.effect.stop();
573
+ }
574
+ };
575
+ function computed(getterOrOptions) {
576
+ const isFn = typeof getterOrOptions === "function";
577
+ const getter = isFn ? getterOrOptions : getterOrOptions.get;
578
+ const setter = isFn ? void 0 : getterOrOptions.set;
579
+ return new ComputedRefImpl(getter, setter);
580
+ }
581
+ function watch(source, cb, options = {}) {
582
+ const { immediate = false, deep = false, flush = "pre" } = options;
583
+ let getter;
584
+ if (isRef(source)) getter = () => source.value;
585
+ else if (typeof source === "function") getter = source;
586
+ else if (isReactive(source)) getter = () => traverse(source);
587
+ else getter = () => source;
588
+ if (deep) {
589
+ const base = getter;
590
+ getter = () => traverse(base());
591
+ }
592
+ let oldValue;
593
+ let cleanupFn;
594
+ const onInvalidate = (fn) => {
595
+ cleanupFn = fn;
596
+ };
597
+ const job = () => {
598
+ if (!runner.effect.active) return;
599
+ const newValue = runner();
600
+ if (deep || hasChanged(newValue, oldValue)) {
601
+ cleanupFn?.();
602
+ cleanupFn = void 0;
603
+ cb(newValue, oldValue, onInvalidate);
604
+ oldValue = newValue;
605
+ }
606
+ };
607
+ const scheduler = flush === "sync" ? job : flush === "post" ? () => queuePostFlush(job) : () => queueJob(runner.effect);
608
+ const runner = flush === "pre" ? effect(getter, {
609
+ lazy: true,
610
+ scheduler: () => queuePostFlush(job)
611
+ }) : effect(getter, { lazy: true, scheduler });
612
+ oldValue = runner();
613
+ if (immediate) cb(oldValue, void 0, onInvalidate);
614
+ return () => runner.effect.stop();
615
+ }
616
+ function watchEffect(fn) {
617
+ let cleanupFn;
618
+ const onInvalidate = (c) => {
619
+ cleanupFn = c;
620
+ };
621
+ const runner = effect(() => {
622
+ cleanupFn?.();
623
+ cleanupFn = void 0;
624
+ fn(onInvalidate);
625
+ });
626
+ return () => {
627
+ cleanupFn?.();
628
+ runner.effect.stop();
629
+ };
630
+ }
631
+ function traverse(value, seen = /* @__PURE__ */ new Set()) {
632
+ if (!isObject(value) || seen.has(value)) return value;
633
+ seen.add(value);
634
+ if (isRef(value)) traverse(value.value, seen);
635
+ else if (Array.isArray(value)) for (const v of value) traverse(v, seen);
636
+ else if (value instanceof Set || value instanceof Map)
637
+ value.forEach((v) => traverse(v, seen));
638
+ else for (const key of Object.keys(value)) traverse(value[key], seen);
639
+ return value;
640
+ }
641
+
642
+ exports.EffectScope = EffectScope;
643
+ exports.ITERATE_KEY = ITERATE_KEY;
644
+ exports.ReactiveEffect = ReactiveEffect;
645
+ exports.TriggerType = TriggerType;
646
+ exports.computed = computed;
647
+ exports.effect = effect;
648
+ exports.effectScope = effectScope;
649
+ exports.enableTracking = enableTracking;
650
+ exports.flushSync = flushSync;
651
+ exports.getActiveEffect = getActiveEffect;
652
+ exports.getActiveScope = getActiveScope;
653
+ exports.handleError = handleError;
654
+ exports.hasChanged = hasChanged;
655
+ exports.isReactive = isReactive;
656
+ exports.isRef = isRef;
657
+ exports.markRaw = markRaw;
658
+ exports.nextTick = nextTick;
659
+ exports.pauseTracking = pauseTracking;
660
+ exports.queueJob = queueJob;
661
+ exports.queuePostFlush = queuePostFlush;
662
+ exports.reactive = reactive;
663
+ exports.ref = ref;
664
+ exports.resetTracking = resetTracking;
665
+ exports.setErrorHandler = setErrorHandler;
666
+ exports.shallowRef = shallowRef;
667
+ exports.stop = stop;
668
+ exports.toRaw = toRaw;
669
+ exports.track = track;
670
+ exports.trigger = trigger;
671
+ exports.unref = unref;
672
+ exports.warn = warn;
673
+ exports.watch = watch;
674
+ exports.watchEffect = watchEffect;
675
+ //# sourceMappingURL=reactivity.cjs.map
676
+ //# sourceMappingURL=reactivity.cjs.map