@expressive/mvc 0.53.5 → 0.54.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/index.mjs DELETED
@@ -1,906 +0,0 @@
1
- // src/control.ts
2
- var onReady = () => null;
3
- var LISTENERS = /* @__PURE__ */ new WeakMap();
4
- var PENDING = /* @__PURE__ */ new WeakMap();
5
- var PENDING_KEYS = /* @__PURE__ */ new WeakMap();
6
- var DISPATCH = /* @__PURE__ */ new Set();
7
- var OBSERVER = /* @__PURE__ */ new WeakMap();
8
- function addListener(subject, callback, select) {
9
- let listeners = LISTENERS.get(subject);
10
- if (!listeners)
11
- LISTENERS.set(subject, listeners = /* @__PURE__ */ new Map([[onReady, void 0]]));
12
- const filter = select === void 0 ? void 0 : /* @__PURE__ */ new Set([select]);
13
- if (!listeners.has(onReady) && !filter)
14
- callback.call(subject, true, subject);
15
- listeners.set(callback, filter);
16
- return () => listeners.delete(callback);
17
- }
18
- function emit(model, key2) {
19
- const listeners = LISTENERS.get(model);
20
- const notReady = listeners.has(onReady);
21
- if (key2 === true && !notReady)
22
- return;
23
- let pending2 = PENDING.get(model);
24
- if (pending2) {
25
- pending2.add(key2);
26
- return;
27
- }
28
- PENDING.set(model, pending2 = new Set(notReady ? [true, key2] : [key2]));
29
- for (const key3 of pending2)
30
- for (const [callback, filter] of listeners)
31
- if (!filter || filter.has(key3)) {
32
- const after = callback.call(model, key3, model);
33
- if (after)
34
- enqueue(after);
35
- else if (after === null)
36
- listeners.delete(callback);
37
- }
38
- if (key2 === null)
39
- listeners.clear();
40
- PENDING.delete(model);
41
- }
42
- function event(subject, key2, silent) {
43
- if (key2 === null)
44
- return emit(subject, key2);
45
- if (!key2)
46
- return emit(subject, true);
47
- let pending2 = PENDING_KEYS.get(subject);
48
- if (!pending2) {
49
- PENDING_KEYS.set(subject, pending2 = /* @__PURE__ */ new Set());
50
- if (!silent)
51
- enqueue(() => {
52
- emit(subject, false);
53
- PENDING_KEYS.delete(subject);
54
- });
55
- }
56
- pending2.add(key2);
57
- if (!silent)
58
- emit(subject, key2);
59
- }
60
- function pending(subject) {
61
- if (PENDING_KEYS.has(subject))
62
- return {
63
- then: (res) => new Promise((res2) => {
64
- const remove = addListener(subject, (key2) => {
65
- if (key2 !== true) {
66
- remove();
67
- return res2.bind(null, Array.from(PENDING_KEYS.get(subject)));
68
- }
69
- });
70
- }).then(res)
71
- };
72
- }
73
- function enqueue(eventHandler) {
74
- if (!DISPATCH.size)
75
- setTimeout(() => {
76
- DISPATCH.forEach((event2) => {
77
- try {
78
- event2();
79
- } catch (err) {
80
- console.error(err);
81
- }
82
- });
83
- DISPATCH.clear();
84
- }, 0);
85
- DISPATCH.add(eventHandler);
86
- }
87
- function createProxy(from, observer) {
88
- const proxy = Object.create(from);
89
- OBSERVER.set(proxy, observer);
90
- return proxy;
91
- }
92
- function watch(from, key2, value) {
93
- const access = OBSERVER.get(from);
94
- return access ? access(from, key2, value) : value;
95
- }
96
- function createEffect(target, callback, requireValues) {
97
- const listeners = LISTENERS.get(target);
98
- let unset;
99
- let reset;
100
- function invoke() {
101
- let stale;
102
- const subscriber = createProxy(target, access);
103
- LISTENERS.set(subscriber, listeners);
104
- function onUpdate() {
105
- if (stale)
106
- return null;
107
- stale = true;
108
- if (reset && unset) {
109
- unset(true);
110
- unset = void 0;
111
- }
112
- return reset;
113
- }
114
- function access(from, key2, value) {
115
- if (value === void 0 && requireValues)
116
- throw new Error(`${from}.${key2} is required in this context.`);
117
- const listeners2 = LISTENERS.get(from);
118
- let listener = listeners2.get(onUpdate);
119
- if (!listener)
120
- listeners2.set(onUpdate, listener = /* @__PURE__ */ new Set());
121
- listener.add(key2);
122
- const nested = LISTENERS.get(value);
123
- if (nested)
124
- LISTENERS.set(
125
- value = createProxy(value, access),
126
- nested
127
- );
128
- return value;
129
- }
130
- try {
131
- const out = callback.call(subscriber, subscriber);
132
- unset = typeof out == "function" ? out : void 0;
133
- reset = out === null ? out : invoke;
134
- } catch (err) {
135
- if (err instanceof Promise) {
136
- reset = void 0;
137
- err.then(invoke);
138
- } else
139
- throw err;
140
- }
141
- }
142
- addListener(target, (key2) => {
143
- if (key2 === true)
144
- invoke();
145
- else if (!reset)
146
- return reset;
147
- if (key2 === null && unset)
148
- unset(null);
149
- });
150
- return () => {
151
- if (unset)
152
- unset(false);
153
- reset = null;
154
- };
155
- }
156
-
157
- // src/model.ts
158
- var define = Object.defineProperty;
159
- var ID = /* @__PURE__ */ new WeakMap();
160
- var STATE = /* @__PURE__ */ new WeakMap();
161
- var NOTIFY = /* @__PURE__ */ new WeakMap();
162
- var PARENT = /* @__PURE__ */ new WeakMap();
163
- var METHODS = /* @__PURE__ */ new WeakMap();
164
- var METHOD = /* @__PURE__ */ new WeakMap();
165
- var Model = class {
166
- constructor(...args) {
167
- prepare(this);
168
- define(this, "is", { value: this });
169
- init(this, args);
170
- }
171
- get(arg1, arg2) {
172
- const self = this.is;
173
- if (typeof arg1 == "function") {
174
- let pending2 = /* @__PURE__ */ new Set();
175
- return createEffect(self, (proxy) => {
176
- const cb = arg1.call(proxy, proxy, pending2);
177
- return cb === null ? cb : (update2) => {
178
- pending2 = PENDING_KEYS.get(self);
179
- if (typeof cb == "function")
180
- cb(update2);
181
- };
182
- });
183
- }
184
- if (arg1 === void 0)
185
- return snapshot(self);
186
- if (typeof arg2 == "function")
187
- return addListener(self, arg2, arg1);
188
- return arg1 === null ? Object.isFrozen(STATE.get(self)) : fetch(self, arg1, arg2);
189
- }
190
- set(arg1, arg2) {
191
- const self = this.is;
192
- if (typeof arg1 == "function")
193
- return addListener(self, (key2) => {
194
- if (typeof key2 == "string")
195
- return arg1.call(self, key2, self);
196
- });
197
- if (arg1 && typeof arg1 == "object") {
198
- const methods = METHODS.get(self.constructor);
199
- for (const key2 in arg1)
200
- if (methods.has(key2))
201
- self[key2] = arg1[key2];
202
- else if (key2 in self)
203
- update(self, key2, arg1[key2], arg2 === true);
204
- } else
205
- event(self, arg1);
206
- return pending(self);
207
- }
208
- /**
209
- * Iterate over managed properties in this instance of Model.
210
- * Yeilds the key and current value for each property.
211
- */
212
- [Symbol.iterator]() {
213
- return Object.entries(STATE.get(this.is))[Symbol.iterator]();
214
- }
215
- /**
216
- * Create and activate a new instance of this model.
217
- *
218
- * **Important** - Unlike `new this(...)` - this method also activates state.
219
- *
220
- * @param args - arguments sent to constructor
221
- */
222
- static new(...args) {
223
- const instance = new this(...args);
224
- event(instance);
225
- return instance;
226
- }
227
- /**
228
- * Static equivalent of `x instanceof this`.
229
- * Determines if provided class is a subtype of this one.
230
- * If so, language server will make available all static
231
- * methods and properties of this class.
232
- */
233
- static is(maybe) {
234
- return maybe === this || typeof maybe == "function" && maybe.prototype instanceof this;
235
- }
236
- /**
237
- * Register a callback to run when any instance of this Model is updated.
238
- */
239
- static on(listener) {
240
- let notify = NOTIFY.get(this);
241
- if (!notify)
242
- NOTIFY.set(this, notify = /* @__PURE__ */ new Set());
243
- notify.add(listener);
244
- return () => notify.delete(listener);
245
- }
246
- };
247
- define(Model.prototype, "toString", {
248
- value() {
249
- return ID.get(this.is);
250
- }
251
- });
252
- define(Model, "toString", {
253
- value() {
254
- return this.name;
255
- }
256
- });
257
- function prepare(model) {
258
- let T = model.constructor;
259
- if (T === Model)
260
- throw new Error("Cannot create base Model.");
261
- const chain = [];
262
- let keys2 = /* @__PURE__ */ new Set();
263
- ID.set(model, `${T}-${uid()}`);
264
- while (T.name) {
265
- for (const cb of NOTIFY.get(T) || [])
266
- addListener(model, cb);
267
- if (T === Model) break;
268
- else chain.unshift(T);
269
- T = Object.getPrototypeOf(T);
270
- }
271
- for (const type of chain) {
272
- if (METHODS.has(type)) {
273
- keys2 = METHODS.get(type);
274
- continue;
275
- }
276
- METHODS.set(type, keys2 = new Set(keys2));
277
- for (const [key2, { value }] of Object.entries(
278
- Object.getOwnPropertyDescriptors(type.prototype)
279
- )) {
280
- let bind2 = function(method = value) {
281
- const value2 = method.bind(model);
282
- METHOD.set(value2, method);
283
- define(model, key2, { value: value2, writable: true });
284
- return value2;
285
- };
286
- var bind = bind2;
287
- if (!value || key2 == "constructor")
288
- continue;
289
- keys2.add(key2);
290
- define(type.prototype, key2, { get: bind2, set: bind2 });
291
- }
292
- }
293
- }
294
- function init(model, args) {
295
- const methods = METHODS.get(model.constructor);
296
- const state = {};
297
- STATE.set(model, state);
298
- args = args.flat().filter((arg) => {
299
- if (typeof arg != "string")
300
- return true;
301
- ID.set(model, arg);
302
- });
303
- addListener(model, () => {
304
- if (!PARENT.has(model))
305
- PARENT.set(model, null);
306
- args.forEach((arg) => {
307
- const use2 = typeof arg == "function" ? arg.call(model, model) : arg;
308
- if (use2 instanceof Promise)
309
- use2.catch((err) => {
310
- console.error(`Async error in constructor for ${model}:`);
311
- console.error(err);
312
- });
313
- else if (typeof use2 == "function")
314
- addListener(model, use2, null);
315
- else if (typeof use2 == "object") {
316
- for (const key2 in use2)
317
- if (key2 in model || methods.has(key2))
318
- model[key2] = use2[key2];
319
- }
320
- });
321
- for (const key2 in model) {
322
- const desc = Object.getOwnPropertyDescriptor(model, key2);
323
- if ("value" in desc) {
324
- update(model, key2, desc.value, true);
325
- define(model, key2, {
326
- configurable: false,
327
- get() {
328
- return watch(this, key2, state[key2]);
329
- },
330
- set(value) {
331
- update(model, key2, value);
332
- mayAdopt(model, value);
333
- }
334
- });
335
- }
336
- }
337
- addListener(model, () => {
338
- for (const [_, value] of model)
339
- if (value instanceof Model && PARENT.get(value) === model)
340
- value.set(null);
341
- Object.freeze(state);
342
- }, null);
343
- return null;
344
- });
345
- }
346
- function mayAdopt(parent, child) {
347
- if (child instanceof Model && !PARENT.has(child)) {
348
- PARENT.set(child, parent);
349
- event(child);
350
- }
351
- }
352
- function fetch(subject, property, required) {
353
- const state = STATE.get(subject);
354
- if (property in state || required === false) {
355
- const value = state[property];
356
- if (value !== void 0 || !required)
357
- return value;
358
- }
359
- const error = new Error(`${subject}.${property} is not yet available.`);
360
- const promise = new Promise((resolve, reject) => {
361
- addListener(subject, (key2) => {
362
- if (key2 === property) {
363
- resolve(state[key2]);
364
- return null;
365
- }
366
- if (key2 === null)
367
- reject(new Error(`${subject} is destroyed.`));
368
- });
369
- });
370
- throw Object.assign(promise, {
371
- toString: () => String(error),
372
- name: "Suspense",
373
- message: error.message,
374
- stack: error.stack
375
- });
376
- }
377
- var EXPORT;
378
- function snapshot(model) {
379
- const values = {};
380
- let isNotRecursive;
381
- if (!EXPORT) {
382
- isNotRecursive = true;
383
- EXPORT = /* @__PURE__ */ new Map([[model, values]]);
384
- }
385
- for (let [key2, value] of model) {
386
- if (EXPORT.has(value))
387
- value = EXPORT.get(value);
388
- else if (value && typeof value == "object" && "get" in value && typeof value.get === "function")
389
- EXPORT.set(value, value = value.get());
390
- values[key2] = value;
391
- }
392
- if (isNotRecursive)
393
- EXPORT = void 0;
394
- return Object.freeze(values);
395
- }
396
- function update(subject, key2, value, arg) {
397
- const state = STATE.get(subject);
398
- if (Object.isFrozen(state))
399
- throw new Error(`Tried to update ${String(key2)} but ${subject} is destroyed.`);
400
- const previous = state[key2];
401
- if (typeof arg == "function") {
402
- const out = arg.call(subject, value, previous);
403
- if (out === false)
404
- return false;
405
- if (typeof out == "function")
406
- value = out();
407
- }
408
- if (value === previous)
409
- return;
410
- state[key2] = value;
411
- if (arg !== true)
412
- event(subject, key2);
413
- return true;
414
- }
415
- function uid() {
416
- return (0.278 + Math.random() * 0.722).toString(36).substring(2, 8).toUpperCase();
417
- }
418
-
419
- // src/context.ts
420
- var LOOKUP = /* @__PURE__ */ new WeakMap();
421
- var KEYS = /* @__PURE__ */ new Map();
422
- function key(T, upstream) {
423
- let K = KEYS.get(T);
424
- if (!K)
425
- KEYS.set(T, K = Symbol(
426
- typeof T == "symbol" ? "get " + T.description : String(T)
427
- ));
428
- return upstream ? key(K) : K;
429
- }
430
- function keys(from, upstream) {
431
- const keys2 = /* @__PURE__ */ new Set();
432
- do {
433
- keys2.add(key(from, upstream));
434
- } while ((from = Object.getPrototypeOf(from)) !== Model);
435
- return keys2;
436
- }
437
- var Context = class _Context {
438
- constructor(inputs) {
439
- this.layer = /* @__PURE__ */ new Map();
440
- this.cleanup = /* @__PURE__ */ new Set();
441
- if (inputs)
442
- this.include(inputs);
443
- }
444
- static get(from, callback) {
445
- const waiting = LOOKUP.get(from);
446
- if (waiting instanceof _Context) {
447
- if (callback)
448
- callback(waiting);
449
- return waiting;
450
- }
451
- if (callback)
452
- if (waiting)
453
- waiting.push(callback);
454
- else
455
- LOOKUP.set(from, [callback]);
456
- }
457
- /** Run callback when a specified type is registered to a **child** context. */
458
- has(Type, callback) {
459
- define(this, key(Type, true), { value: callback });
460
- }
461
- /** Find specified type registered to a parent context. Returns undefined if none are found. */
462
- get(Type) {
463
- const result = this[key(Type)];
464
- if (result === null)
465
- throw new Error(`Did find ${Type} in context, but multiple were defined.`);
466
- return result;
467
- }
468
- push(inputs) {
469
- const next = Object.create(this);
470
- next.layer = /* @__PURE__ */ new Map();
471
- next.cleanup = /* @__PURE__ */ new Set();
472
- if (inputs)
473
- next.include(inputs);
474
- return next;
475
- }
476
- pop() {
477
- for (const key2 of Object.getOwnPropertySymbols(this))
478
- delete this[key2];
479
- this.cleanup.forEach((cb) => cb());
480
- this.layer.clear();
481
- }
482
- include(inputs, forEach) {
483
- const init2 = /* @__PURE__ */ new Map();
484
- if (typeof inputs == "function" || inputs instanceof Model)
485
- inputs = { 0: inputs };
486
- Object.entries(inputs).forEach(([K, V]) => {
487
- if (Model.is(V) || V instanceof Model)
488
- return;
489
- if (K && K != V)
490
- V = `${V} (as '${K}')`;
491
- throw new Error(
492
- `Context may only include instance or class \`extends Model\` but got ${V}.`
493
- );
494
- });
495
- for (const key2 in inputs) {
496
- const input = inputs[key2];
497
- const exists = this.layer.get(key2);
498
- if (!exists) {
499
- const instance = this.add(input);
500
- this.layer.set(key2, input);
501
- init2.set(instance, true);
502
- } else if (exists !== input) {
503
- this.pop();
504
- this.id = uid();
505
- this.include(inputs);
506
- }
507
- }
508
- for (const [model, explicit] of init2) {
509
- model.set();
510
- if (typeof forEach == "function")
511
- forEach(model, explicit);
512
- else if (forEach && explicit)
513
- model.set(forEach);
514
- for (const [_key, value] of model)
515
- if (PARENT.get(value) === model) {
516
- this.add(value, true);
517
- init2.set(value, false);
518
- }
519
- }
520
- }
521
- add(input, implicit) {
522
- let T;
523
- let I;
524
- if (typeof input == "function") {
525
- Model.is(input);
526
- T = input;
527
- I = new input();
528
- this.cleanup.add(() => I.set(null));
529
- } else {
530
- T = input.constructor;
531
- I = input;
532
- }
533
- keys(T, true).forEach((K) => {
534
- const result = this[K];
535
- if (!result)
536
- return;
537
- const callback = result(I);
538
- if (callback)
539
- this.cleanup.add(callback);
540
- });
541
- keys(T).forEach((K) => {
542
- const value = this.hasOwnProperty(K) ? null : I;
543
- if (value || this[K] !== I && !implicit)
544
- define(this, K, {
545
- configurable: true,
546
- value
547
- });
548
- });
549
- const waiting = LOOKUP.get(I);
550
- if (waiting instanceof Array)
551
- waiting.forEach((cb) => cb(this));
552
- LOOKUP.set(I, this);
553
- return I;
554
- }
555
- };
556
-
557
- // src/instruction/use.ts
558
- var INSTRUCT = /* @__PURE__ */ new Map();
559
- function use(arg1, arg2) {
560
- const token = Symbol("instruction");
561
- if (Model.is(arg1)) {
562
- const type = arg1;
563
- arg1 = (key2, subject) => {
564
- const value = new type();
565
- const desc = { set: set2 };
566
- set2(value);
567
- PARENT.set(value, subject);
568
- function set2(next) {
569
- if (next ? !(next instanceof type) : arg2 !== false)
570
- throw new Error(`${subject}.${key2} expected Model of type ${type} but got ${next && next.constructor}.`);
571
- update(subject, key2, next);
572
- if (next && typeof arg2 == "function")
573
- arg2(next);
574
- return false;
575
- }
576
- return desc;
577
- };
578
- }
579
- INSTRUCT.set(token, arg1);
580
- return token;
581
- }
582
- Model.on((_, model) => {
583
- const state = STATE.get(model);
584
- for (const key2 in model) {
585
- const { value } = Object.getOwnPropertyDescriptor(model, key2);
586
- const instruction = INSTRUCT.get(value);
587
- if (!instruction) {
588
- mayAdopt(model, value);
589
- continue;
590
- }
591
- INSTRUCT.delete(value);
592
- delete model[key2];
593
- const output = instruction.call(model, key2, model, state);
594
- if (!output)
595
- continue;
596
- const desc = typeof output == "object" ? output : { get: output };
597
- if ("value" in desc)
598
- state[key2] = desc.value;
599
- define(model, key2, {
600
- enumerable: desc.enumerable !== false,
601
- get() {
602
- return watch(
603
- this,
604
- key2,
605
- typeof desc.get == "function" ? desc.get(this) : fetch(model, key2, desc.get)
606
- );
607
- },
608
- set(next) {
609
- if (desc.set === false)
610
- throw new Error(`${model}.${key2} is read-only.`);
611
- update(model, key2, next, desc.set);
612
- }
613
- });
614
- }
615
- return null;
616
- });
617
-
618
- // src/instruction/get.ts
619
- var STALE = /* @__PURE__ */ new WeakSet();
620
- function get(arg0, arg1) {
621
- return use((key2, subject, state) => {
622
- if (typeof arg0 == "symbol")
623
- throw new Error(`Attempted to use an instruction result (probably use or get) as computed source for ${subject}.${key2}. This is not allowed.`);
624
- if (Model.is(arg0)) {
625
- let assign2 = function(value) {
626
- if (typeof arg1 == "function")
627
- value.get((x) => arg1(x, key2));
628
- update(subject, key2, value);
629
- };
630
- var assign = assign2;
631
- const hasParent = PARENT.get(subject);
632
- if (!hasParent) {
633
- if (arg1 === true)
634
- throw new Error(`${subject} may only exist as a child of type ${arg0}.`);
635
- Context.get(subject, (context) => {
636
- const model = context.get(arg0);
637
- if (model)
638
- assign2(model);
639
- else if (arg1 !== false)
640
- throw new Error(`Required ${arg0} not found in context for ${subject}.`);
641
- });
642
- } else if (!arg0 || hasParent instanceof arg0)
643
- assign2(hasParent);
644
- else
645
- throw new Error(`New ${subject} created as child of ${hasParent}, but must be instanceof ${arg0}.`);
646
- return {
647
- get: arg1 !== false
648
- };
649
- }
650
- let from = subject;
651
- if (arg0 instanceof Model) {
652
- from = arg0;
653
- } else {
654
- const fn = METHOD.get(arg0) || arg0;
655
- arg1 = (p, k) => fn.call(p, k, p);
656
- }
657
- const source = (resolve) => resolve(from);
658
- const getter = arg1;
659
- let reset;
660
- let isAsync;
661
- let proxy;
662
- function connect(model) {
663
- reset = createEffect(model, (current) => {
664
- proxy = current;
665
- if (!(key2 in state) || STALE.delete(compute))
666
- compute(!reset);
667
- return (didUpdate) => {
668
- if (didUpdate) {
669
- STALE.add(compute);
670
- event(subject, key2, true);
671
- }
672
- };
673
- });
674
- }
675
- function compute(initial) {
676
- let next;
677
- try {
678
- next = getter.call(proxy, proxy, key2);
679
- } catch (err) {
680
- console.warn(`An exception was thrown while ${initial ? "initializing" : "refreshing"} ${subject}.${key2}.`);
681
- if (initial)
682
- throw err;
683
- console.error(err);
684
- }
685
- update(subject, key2, next, !isAsync);
686
- }
687
- return () => {
688
- if (!proxy) {
689
- source(connect);
690
- isAsync = true;
691
- }
692
- if (STALE.delete(compute))
693
- compute();
694
- return fetch(subject, key2, !proxy);
695
- };
696
- });
697
- }
698
-
699
- // src/instruction/ref.ts
700
- function ref(arg, arg2) {
701
- return use((key2, subject, state) => {
702
- let value = {};
703
- if (arg === subject)
704
- subject.get(() => {
705
- for (const key3 in state)
706
- if (typeof arg2 == "function")
707
- define(value, key3, {
708
- configurable: true,
709
- get() {
710
- const out = arg2(key3);
711
- define(value, key3, { value: out });
712
- return out;
713
- }
714
- });
715
- else {
716
- const get2 = () => state[key3];
717
- const set2 = (value2) => {
718
- update(subject, key3, value2);
719
- };
720
- define(set2, "current", { get: get2, set: set2 });
721
- define(set2, "get", { value: get2 });
722
- define(value, key3, { value: set2 });
723
- }
724
- });
725
- else if (typeof arg == "object")
726
- throw new Error("ref instruction does not support object which is not 'this'");
727
- else {
728
- let unSet;
729
- const get2 = () => state[key2];
730
- const set2 = (value2) => {
731
- if (!update(subject, key2, value2) || !arg)
732
- return;
733
- if (unSet)
734
- unSet = void unSet(value2);
735
- if (value2 !== null || arg2 === false) {
736
- const out = arg.call(subject, value2);
737
- if (typeof out == "function")
738
- unSet = out;
739
- }
740
- };
741
- state[key2] = null;
742
- value = Object.defineProperties(set2, {
743
- current: { get: get2, set: set2 },
744
- get: { value: get2 }
745
- });
746
- }
747
- define(subject, key2, { value });
748
- });
749
- }
750
-
751
- // src/instruction/set.ts
752
- function set(value, argument) {
753
- return use((key2, subject) => {
754
- const property = {};
755
- if (typeof value == "function" || value instanceof Promise) {
756
- let init3 = function() {
757
- if (typeof value == "function")
758
- try {
759
- value = attempt(value.bind(subject, key2));
760
- } catch (err) {
761
- console.warn(`Generating initial value for ${subject}.${key2} failed.`);
762
- throw err;
763
- }
764
- property.get = argument === true;
765
- if (value instanceof Promise) {
766
- value.then((value2) => {
767
- update(subject, key2, value2);
768
- return value2;
769
- }).catch((err) => {
770
- event(subject, key2);
771
- property.get = () => {
772
- throw err;
773
- };
774
- });
775
- } else
776
- update(subject, key2, value);
777
- if (0 in arguments)
778
- return subject[key2];
779
- };
780
- var init2 = init3;
781
- if (argument)
782
- init3();
783
- else
784
- property.get = init3;
785
- } else if (value !== void 0)
786
- property.value = value;
787
- if (typeof argument == "function") {
788
- let unSet;
789
- property.set = function(value2, previous) {
790
- const out = argument.call(this, value2, previous);
791
- if (out === false)
792
- return out;
793
- if (typeof unSet == "function")
794
- unSet = void unSet(value2);
795
- if (typeof out == "function")
796
- unSet = out;
797
- };
798
- } else
799
- property.set = (value2) => {
800
- property.get = void 0;
801
- update(subject, key2, value2);
802
- };
803
- return property;
804
- });
805
- }
806
- function attempt(fn) {
807
- function retry(err) {
808
- if (err instanceof Promise)
809
- return err.then(compute);
810
- else
811
- throw err;
812
- }
813
- function compute() {
814
- try {
815
- const output = fn();
816
- return output instanceof Promise ? output.catch(retry) : output;
817
- } catch (err) {
818
- return retry(err);
819
- }
820
- }
821
- return compute();
822
- }
823
-
824
- // src/instruction/has.ts
825
- var APPLY = /* @__PURE__ */ new WeakMap();
826
- function has(arg1, arg2) {
827
- return use((key2, subject) => {
828
- const applied = /* @__PURE__ */ new Set();
829
- const apply = () => {
830
- update(subject, key2, Object.freeze(Array.from(applied)));
831
- };
832
- if (Model.is(arg1))
833
- Context.get(subject, (context) => {
834
- context.has(arg1, (model) => {
835
- let remove;
836
- let disconnect;
837
- if (applied.has(model))
838
- return;
839
- const callback = APPLY.get(model);
840
- if (callback) {
841
- const after = callback(subject);
842
- if (after === false)
843
- return;
844
- if (typeof after == "function")
845
- disconnect = after;
846
- }
847
- if (typeof arg2 == "function") {
848
- const done2 = arg2(model, subject);
849
- if (done2 === false)
850
- return false;
851
- remove = () => {
852
- if (typeof done2 == "function")
853
- done2();
854
- };
855
- }
856
- applied.add(model);
857
- apply();
858
- const done = () => {
859
- ignore();
860
- applied.delete(model);
861
- apply();
862
- if (disconnect)
863
- disconnect();
864
- if (typeof remove == "function")
865
- remove();
866
- };
867
- const ignore = model.get(null, done);
868
- return done;
869
- });
870
- });
871
- else {
872
- if (APPLY.has(subject))
873
- throw new Error(`'has' callback can only be used once per model.`);
874
- APPLY.set(subject, (recipient) => {
875
- let remove;
876
- if (arg1) {
877
- remove = arg1(recipient, subject);
878
- if (remove === false)
879
- return false;
880
- }
881
- applied.add(recipient);
882
- apply();
883
- return () => {
884
- applied.delete(recipient);
885
- apply();
886
- if (typeof remove == "function")
887
- remove();
888
- };
889
- });
890
- }
891
- return { value: [] };
892
- });
893
- }
894
- export {
895
- Context,
896
- Model,
897
- addListener,
898
- createEffect,
899
- createProxy,
900
- Model as default,
901
- get,
902
- has,
903
- ref,
904
- set,
905
- use
906
- };