@motifx/core 1.0.1 → 1.2.0-rc.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.
@@ -1,1642 +0,0 @@
1
- 'use strict';
2
-
3
- function rethrowLater(error) {
4
- setTimeout(() => { throw error; }, 0);
5
- }
6
- class ErrorHandler {
7
- unexpectedErrorHandler = rethrowLater;
8
- listeners = [];
9
- _isDevelopment = false;
10
- _enableConsoleLogging = true;
11
- setDevelopmentMode(isDev) {
12
- this._isDevelopment = isDev;
13
- }
14
- setConsoleLogging(enabled) {
15
- this._enableConsoleLogging = enabled;
16
- }
17
- isDevelopment() {
18
- return this._isDevelopment || globalThis.__MOTIF_DEV__ === true;
19
- }
20
- reportSuppressed(context, error) {
21
- this.logIfDev(context, error);
22
- }
23
- report(error) {
24
- if (this._enableConsoleLogging) {
25
- if (error.cause !== undefined)
26
- console.error(error.message, error.cause);
27
- else
28
- console.error(error.message);
29
- }
30
- try {
31
- const bus = globalThis.__MOTIF_DEVTOOLS_BUS__;
32
- if (bus && typeof bus.publish === 'function') {
33
- bus.publish('error:caught', { context: error.code ?? error.name, error: this.serializeError(error) });
34
- }
35
- }
36
- catch { /* ignore */ }
37
- this.emit(error);
38
- }
39
- logIfDev(context, error) {
40
- if (this.isDevelopment() && this._enableConsoleLogging) {
41
- console.error(`[motifjs Error - ${context}]`, error);
42
- }
43
- try {
44
- const bus = globalThis.__MOTIF_DEVTOOLS_BUS__;
45
- if (bus && typeof bus.publish === 'function') {
46
- bus.publish('error:caught', { context, error: this.serializeError(error) });
47
- }
48
- }
49
- catch { /* ignore */ }
50
- }
51
- serializeError(error) {
52
- if (!error)
53
- return { message: 'Unknown error' };
54
- if (error instanceof Error) {
55
- return {
56
- name: error.name,
57
- message: error.message,
58
- stack: error.stack,
59
- cause: error.cause ? this.serializeError(error.cause) : undefined
60
- };
61
- }
62
- if (typeof error === 'object') {
63
- try {
64
- return JSON.parse(JSON.stringify(error));
65
- }
66
- catch {
67
- return String(error);
68
- }
69
- }
70
- return String(error);
71
- }
72
- addListener(listener) {
73
- this.listeners.push(listener);
74
- return () => {
75
- const index = this.listeners.indexOf(listener);
76
- if (index !== -1) {
77
- this.listeners.splice(index, 1);
78
- }
79
- };
80
- }
81
- emit(error) {
82
- for (const listener of this.listeners.slice()) {
83
- listener(error);
84
- }
85
- }
86
- setUnexpectedErrorHandler(handler) {
87
- this.unexpectedErrorHandler = handler;
88
- }
89
- getUnexpectedErrorHandler() {
90
- return this.unexpectedErrorHandler;
91
- }
92
- onUnexpectedError(error) {
93
- this.unexpectedErrorHandler(error);
94
- this.emit(error);
95
- }
96
- safeCall(fn, context, fallback) {
97
- try {
98
- return fn();
99
- }
100
- catch (error) {
101
- this.logIfDev(context, error);
102
- this.onUnexpectedError(error);
103
- return fallback;
104
- }
105
- }
106
- async safeCallAsync(fn, context, fallback) {
107
- try {
108
- return await fn();
109
- }
110
- catch (error) {
111
- this.logIfDev(context, error);
112
- this.onUnexpectedError(error);
113
- return fallback;
114
- }
115
- }
116
- safeCallSilent(fn, context) {
117
- try {
118
- fn();
119
- }
120
- catch (error) {
121
- this.logIfDev(context, error);
122
- }
123
- }
124
- async safeCallSilentAsync(fn, context) {
125
- try {
126
- return await fn();
127
- }
128
- catch (error) {
129
- this.logIfDev(context, error);
130
- }
131
- }
132
- wrapSafe(fn, context) {
133
- return (...args) => {
134
- try {
135
- return fn(...args);
136
- }
137
- catch (error) {
138
- this.logIfDev(context, error);
139
- this.onUnexpectedError(error);
140
- return undefined;
141
- }
142
- };
143
- }
144
- wrapSafeAsync(fn, context) {
145
- return async (...args) => {
146
- try {
147
- return await fn(...args);
148
- }
149
- catch (error) {
150
- this.logIfDev(context, error);
151
- this.onUnexpectedError(error);
152
- return undefined;
153
- }
154
- };
155
- }
156
- }
157
- const errorHandler = new ErrorHandler();
158
- function setErrorConsoleLogging(enabled) {
159
- errorHandler.setConsoleLogging(enabled);
160
- }
161
- function safeCall(fn, context, fallback) {
162
- return errorHandler.safeCall(fn, context, fallback);
163
- }
164
- function safeCallAsync(fn, context, fallback) {
165
- return errorHandler.safeCallAsync(fn, context, fallback);
166
- }
167
- function safeCallSilent(fn, context) {
168
- errorHandler.safeCallSilent(fn, context);
169
- }
170
- function safeCallSilentAsync(fn, context) {
171
- return errorHandler.safeCallSilentAsync(fn, context);
172
- }
173
- function setUnexpectedErrorHandler(handler) {
174
- errorHandler.setUnexpectedErrorHandler(handler);
175
- }
176
-
177
- const state = {
178
- enabled: false,
179
- listeners: new Set(),
180
- warnings: [],
181
- routes: null,
182
- };
183
- /** Dev modu: devtools açık ya da `globalThis.__MOTIF_DEV__ === true`. */
184
- function isDevLike() {
185
- return state.enabled || globalThis.__MOTIF_DEV__ === true;
186
- }
187
- function detectEnabled() {
188
- try {
189
- if (typeof window === 'undefined')
190
- return false;
191
- const w = window;
192
- if (w.__motif_DEVTOOLS === true)
193
- return true;
194
- if (globalThis.__MOTIF_DEVTOOLS__ === true)
195
- return true;
196
- if (globalThis.__MOTIF_DEVTOOLS_FLAG === true)
197
- return true;
198
- const qs = (w.location && w.location.search) || '';
199
- if (qs && /(?:[?&])devtools=1(?:&|$)/i.test(qs))
200
- return true;
201
- return false;
202
- }
203
- catch {
204
- return false;
205
- }
206
- }
207
- function ensureDevtoolsFlagInitialized() {
208
- if (state.enabled)
209
- return;
210
- state.enabled = detectEnabled();
211
- if (state.enabled) {
212
- try {
213
- window.__motifDevBus = { on, emit, warn, getWarnings, isEnabled, setRoutes, getRoutes };
214
- }
215
- catch { }
216
- }
217
- }
218
- function isEnabled() { return state.enabled; }
219
- function on(listener) {
220
- state.listeners.add(listener);
221
- return () => { state.listeners.delete(listener); };
222
- }
223
- function emit(type, payload) {
224
- const ev = { type, payload };
225
- for (const l of state.listeners) {
226
- try {
227
- l(ev);
228
- }
229
- catch { }
230
- }
231
- try {
232
- const bus = globalThis.__MOTIF_DEVTOOLS_BUS__;
233
- if (bus && typeof bus.publish === 'function') {
234
- bus.publish('devtools:' + type, payload);
235
- }
236
- }
237
- catch { }
238
- }
239
- function warn(code, message, details) {
240
- if (!isDevLike())
241
- return;
242
- const w = { code, message, details };
243
- state.warnings.push(w);
244
- try {
245
- if (typeof console !== 'undefined')
246
- details === undefined ? console.warn(`[motifjs] ${code}: ${message}`) : console.warn(`[motifjs] ${code}: ${message}`, details);
247
- }
248
- catch { }
249
- emit('warning', w);
250
- }
251
- function getWarnings() { return state.warnings.slice(); }
252
- function setRoutes(routes) { state.routes = routes; }
253
- function getRoutes() { return state.routes; }
254
-
255
- const motifMessages = {
256
- MJX101: (tag) => `dom.createElement('${tag}'): no document is available (no DOM environment).`,
257
- MJX102: (description) => `Invalid element selector "${description}".`,
258
- MJX103: (tag) => `dom.createElementNS('${tag}') failed.`,
259
- MJX104: () => `Skipped inserting a component into the DOM because it contains its own parent.`,
260
- MJX105: () => `Applying router link classes failed.`,
261
- MJX106: () => `The placeholder parent changed; rebuilding the component.`,
262
- MJX107: () => `Disposing a child component failed.`,
263
- MJX108: () => `Component is disposed; the result of doWork was discarded.`,
264
- MJX109: () => `A content block child was removed because its content body is being disposed.`,
265
- MJX110: (ms) => `Lazy timeout: the component did not load within ${ms} ms.`,
266
- MJX111: () => `Lazy aborted: loading the component was cancelled.`,
267
- MJX112: (depth) => `resolveComponent: the factory chain exceeded ${depth} levels; a factory may be returning itself.`,
268
- MJX113: () => `The transport slot has no parent; mount the slot before transporting into it.`,
269
- MJX114: () => `Placing the navigation target into its host failed.`,
270
- MJX115: () => `Disposing the previous navigation target failed.`,
271
- MJX116: (ms) => `Timeout: the listener guard did not settle within ${ms} ms.`,
272
- MJX117: () => `Detaching a control failed.`,
273
- MJX118: () => `The onRemove callback failed while detaching a control.`,
274
- MJX119: () => `Moving a fragment's DOM range stopped: its end marker was not found (possible infinite loop).`,
275
- MJX120: () => `Scanning a fragment's DOM range stopped: its end marker was not found (possible infinite loop).`,
276
- MJX121: (compiled, runtime) => `This code was compiled for compiler contract ${compiled}, but the @motifx/core runtime implements contract ${runtime}. Install matching versions of @motifx/compiler and @motifx/core, and rebuild packages that ship compiled JSX.`,
277
- MJX122: (hook) => `The component ${hook} hook threw.`,
278
- MJX123: (event) => `The '${event}' event handler threw.`,
279
- MJX201: () => `ListBinding: renderFn must return a component instance, a component class, or a factory function.`,
280
- MJX202: (key, index) => `ListBinding: duplicate key "${String(key)}" at index ${index}. Rows are matched by the item object, not by key, so rendering is not affected; keep keys unique so they identify items.`,
281
- MJX203: (max) => `An effect ran ${max} times in one flush and keeps triggering itself; it is skipped for the rest of this flush. It probably writes a value it reads (for example state.n++). Wrap the write in untracked(...).`,
282
- MJX204: () => `A component reached a text binding and was not written to the DOM. For a template prop that can change later, write a getter: {() => props.tpl}. Templates that are ready at setup also work as {props.tpl}.`,
283
- MJX205: () => `Virtualization: the watch callback threw.`,
284
- MJX206: () => `Virtualization: autoRefresh stopped; dataRequest may be changing the reactive data it reads on every refresh.`,
285
- MJX207: () => `Virtualization: loading data failed.`,
286
- MJX208: () => `An effect threw.`,
287
- MJX301: (outlet, ms) => `RouterView outlet '${outlet}' was not built within ${ms} ms, so the route chain cannot be mounted. Does the layout component render a <RouterView>?`,
288
- MJX302: (name) => `Named route '${name}' was not found.`,
289
- MJX303: (chain) => `Redirect loop or too many redirects: ${chain}`,
290
- MJX304: () => `Route execution failed.`,
291
- MJX305: () => `The error fallback route failed.`,
292
- MJX306: (hook) => `The ${hook} hook threw.`,
293
- MJX307: () => `Disposing a route component failed.`,
294
- MJX308: () => `The stack navigation transition failed.`,
295
- MJX309: () => `Router is not initialized. Call useRouter() before navigating.`,
296
- MJX310: (parentPath) => `Route path cannot be empty; use '/' for the default child. Under parent "${parentPath}".`,
297
- MJX311: (path, parentPath) => `Child route path should start with '/': "${path}" under parent "${parentPath}".`,
298
- MJX312: (full) => `Child route path resolves to the same full path as its parent: "${full}".`,
299
- MJX313: (full) => `Multiple routes resolve to the same full path: "${full}".`,
300
- MJX314: (alias, parentPath) => `Child route alias should start with '/': "${alias}" under parent "${parentPath}".`,
301
- MJX315: (alias) => `Route alias resolves to the route's own path: "${alias}".`,
302
- MJX316: (alias) => `Multiple routes use the same alias: "${alias}".`,
303
- MJX401: (token) => `Service not registered for token: ${token}`,
304
- MJX402: (token) => `Async factory used with get() for token ${token}; use getAsync().`,
305
- MJX403: () => `Invalid service descriptor.`,
306
- MJX404: (chain) => `Cyclic dependency detected: ${chain}`,
307
- MJX405: () => `Only one ApplicationBuilder instance is allowed.`,
308
- MJX406: (selector) => `Application.run: host not found for selector: ${selector}`,
309
- MJX407: (token) => `getService: no ServiceProvider found for token '${token}'.`,
310
- MJX408: (token, reason) => `getService failed for token '${token}': ${reason}`,
311
- MJX409: (token) => `inject(${token}) was called outside a service construction; call it in a field initializer or constructor of a class the ServiceProvider creates.`,
312
- MJX410: (token, sources) => `Multiple sources provided for token '${token}': ${sources}. Resolution order is useValue > useFactory > useClass.`,
313
- MJX411: (token) => `'deps' must be an array for token '${token}'; the invalid deps are ignored.`,
314
- MJX413: (token) => `Service '${token}' is registered with a function that cannot be constructed. Use { useValue: fn } to provide the function itself or { useFactory: fn } to create the service.`,
315
- MJX414: (token, reason) => `FromService failed for token '${token}': ${reason}`,
316
- MJX501: () => `Disposable already disposed.`,
317
- MJX502: () => `Cannot register a disposable on itself.`,
318
- MJX503: () => `Errors were thrown while disposing a store.`,
319
- MJX504: () => `A disposable was added to a DisposableStore that is already disposed; the added object will leak.`,
320
- MJX505: () => `Cannot dispose a disposable on itself.`,
321
- MJX507: (name, limit, count) => `[${name}] potential listener LEAK: ${limit} listeners already; most frequent stack (${count}):`,
322
- MJX601: () => `Sequence contains no elements.`,
323
- MJX602: () => `Circuit is open.`,
324
- MJX603: () => `Bulkhead queue is full.`,
325
- MJX604: () => `Rate limit exceeded.`,
326
- MJX605: () => `Operation timed out.`,
327
- MJX607: () => `A history must be created with at least one entry.`,
328
- MJX608: () => `Method not implemented.`,
329
- MJX609: () => `OperationRunner: the operation threw.`,
330
- MJX610: () => `Matching the request path failed.`,
331
- MJX611: () => `The devtools panel failed to load.`,
332
- };
333
- class MotifError extends Error {
334
- code;
335
- constructor(code, message, options) {
336
- super(message, options);
337
- this.name = 'MotifError';
338
- this.code = code;
339
- }
340
- }
341
- function formatMotifMessage(code, ...args) {
342
- return `[motifjs] ${code}: ${motifMessages[code](...args)}`;
343
- }
344
- function motifError(code, ...args) {
345
- return new MotifError(code, formatMotifMessage(code, ...args));
346
- }
347
- function reportError(code, cause, ...args) {
348
- errorHandler.report(new MotifError(code, formatMotifMessage(code, ...args), { cause }));
349
- }
350
- function callReported(fn, code, ...args) {
351
- try {
352
- const result = fn();
353
- if (result && typeof result.then === 'function') {
354
- result.then(undefined, (error) => reportError(code, error, ...args));
355
- }
356
- }
357
- catch (error) {
358
- reportError(code, error, ...args);
359
- }
360
- }
361
- function reportWarning(code, args, details) {
362
- warn(code, motifMessages[code](...args), details);
363
- }
364
-
365
- const ITERATE_KEY = Symbol('');
366
- let followTracking = true;
367
- let arrayScope = { enabled: false, key: '' };
368
- function getRaw(value) {
369
- let current = value;
370
- while (current && current["[__raw__]" /* Flags.RAW */]) {
371
- current = current["[__raw__]" /* Flags.RAW */];
372
- }
373
- return current;
374
- }
375
- function isReadonly(candidate) {
376
- if (candidate == null)
377
- return false;
378
- return Boolean(candidate["[__isReadonly__]" /* Flags.IS_READONLY */]);
379
- }
380
- function hasOwn(target, key) {
381
- return Object.prototype.hasOwnProperty.call(target, key);
382
- }
383
- function isObject(value) {
384
- return typeof value === 'object' && value !== null;
385
- }
386
- const intrinsicSymbols = new Set(Object.values(Object.getOwnPropertyDescriptors(Symbol))
387
- .map(descriptor => descriptor.value)
388
- .filter((value) => typeof value === 'symbol'));
389
- function isIntrinsicSymbol(key) {
390
- return typeof key === 'symbol' && intrinsicSymbols.has(key);
391
- }
392
- const proxyableTags = new Map([
393
- ['[object Object]', 1 /* TargetType.COMMON */],
394
- ['[object Array]', 1 /* TargetType.COMMON */],
395
- ['[object Map]', 2 /* TargetType.COLLECTION */],
396
- ['[object Set]', 2 /* TargetType.COLLECTION */],
397
- ['[object WeakMap]', 2 /* TargetType.COLLECTION */],
398
- ['[object WeakSet]', 2 /* TargetType.COLLECTION */],
399
- ]);
400
- function getTargetType(value) {
401
- var proto = Object.getPrototypeOf(value);
402
- var cname = "";
403
- if (proto && proto.constructor) {
404
- cname = proto.constructor.name;
405
- }
406
- if ((cname === "Control" || cname == "RouteManager" || cname == "ServiceManager")) {
407
- return 0 /* TargetType.SYSTEM */;
408
- }
409
- if (!Object.isExtensible(value)) {
410
- return 0 /* TargetType.INVALID */;
411
- }
412
- return proxyableTags.get(Object.prototype.toString.call(value)) ?? 0 /* TargetType.INVALID */;
413
- }
414
- const canonicalIndex = /^(?:0|[1-9]\d*)$/;
415
- const isNumericKey = (key) => typeof key === 'string' && canonicalIndex.test(key) && String(Number(key)) === key;
416
- const savedTracking = [];
417
- let trackingDepth = 0;
418
- function enterTracking(enabled) {
419
- savedTracking[trackingDepth++] = followTracking;
420
- followTracking = enabled;
421
- }
422
- function pauseTracking() {
423
- enterTracking(false);
424
- }
425
- function enableTracking() {
426
- enterTracking(true);
427
- }
428
- function resetTracking() {
429
- followTracking = trackingDepth > 0 ? savedTracking[--trackingDepth] : true;
430
- }
431
- const arrayStack = [];
432
- function addArrayStack(key) {
433
- arrayStack.push(arrayScope);
434
- arrayScope.enabled = true;
435
- arrayScope.key = key;
436
- }
437
- function removeArrayStack() {
438
- const last = arrayStack.pop();
439
- if (arrayStack.length > 0) {
440
- arrayScope = last === undefined ? { enabled: false, key: '' } : last;
441
- }
442
- else {
443
- arrayScope = { enabled: false, key: '' };
444
- }
445
- }
446
-
447
- class LeakMonitor {
448
- threshold;
449
- name;
450
- _origins = new Map();
451
- _quietChecks = 0;
452
- constructor(threshold, name) {
453
- this.threshold = threshold;
454
- this.name = name;
455
- }
456
- check(size) {
457
- if (this.threshold <= 0 || size < this.threshold) {
458
- return undefined;
459
- }
460
- const origin = new Error().stack ?? '';
461
- this._origins.set(origin, (this._origins.get(origin) ?? 0) + 1);
462
- this._quietChecks--;
463
- if (this._quietChecks <= 0) {
464
- this._quietChecks = this.threshold / 2;
465
- const [stack, count] = this._busiestOrigin();
466
- reportWarning('MJX507', [this.name, size, count], stack);
467
- }
468
- return () => {
469
- this._origins.set(origin, (this._origins.get(origin) ?? 0) - 1);
470
- };
471
- }
472
- _busiestOrigin() {
473
- let busiest = ['', 0];
474
- for (const entry of this._origins) {
475
- if (entry[1] > busiest[1]) {
476
- busiest = entry;
477
- }
478
- }
479
- return busiest;
480
- }
481
- }
482
-
483
- function createRing() {
484
- const ring = { value: undefined, linked: false };
485
- ring.before = ring;
486
- ring.after = ring;
487
- return ring;
488
- }
489
- class LinkedList {
490
- _ring = createRing();
491
- _count = 0;
492
- get size() {
493
- return this._count;
494
- }
495
- isEmpty() {
496
- return this._count === 0;
497
- }
498
- push(value) {
499
- return this._link(value, this._ring.before);
500
- }
501
- unshift(value) {
502
- return this._link(value, this._ring);
503
- }
504
- pop() {
505
- return this._take(this._ring.before);
506
- }
507
- shift() {
508
- return this._take(this._ring.after);
509
- }
510
- clear() {
511
- for (let link = this._ring.after; link !== this._ring; link = link.after) {
512
- link.linked = false;
513
- }
514
- this._ring = createRing();
515
- this._count = 0;
516
- }
517
- *[Symbol.iterator]() {
518
- const ring = this._ring;
519
- for (let link = ring.after; link !== ring; link = link.after) {
520
- yield link.value;
521
- }
522
- }
523
- _link(value, previous) {
524
- const link = { value, before: previous, after: previous.after, linked: true };
525
- previous.after.before = link;
526
- previous.after = link;
527
- this._count++;
528
- return () => this._unlink(link);
529
- }
530
- _take(link) {
531
- if (link === this._ring) {
532
- return undefined;
533
- }
534
- const value = link.value;
535
- this._unlink(link);
536
- return value;
537
- }
538
- _unlink(link) {
539
- if (!link.linked) {
540
- return;
541
- }
542
- link.linked = false;
543
- link.before.after = link.after;
544
- link.after.before = link.before;
545
- this._count--;
546
- }
547
- }
548
-
549
- exports.NodeTypes = void 0;
550
- (function (NodeTypes) {
551
- NodeTypes[NodeTypes["ELEMENT_NODE"] = 1] = "ELEMENT_NODE";
552
- NodeTypes[NodeTypes["ATTRIBUTE_NODE"] = 2] = "ATTRIBUTE_NODE";
553
- NodeTypes[NodeTypes["TEXT_NODE"] = 3] = "TEXT_NODE";
554
- NodeTypes[NodeTypes["CDATA_SECTION_NODE"] = 4] = "CDATA_SECTION_NODE";
555
- NodeTypes[NodeTypes["ENTITY_REFERENCE_NODE"] = 5] = "ENTITY_REFERENCE_NODE";
556
- /**deprecated */
557
- NodeTypes[NodeTypes["ENTITY_NODE"] = 6] = "ENTITY_NODE";
558
- /**deprecated */
559
- NodeTypes[NodeTypes["PROCESSING_INSTRUCTION_NODE"] = 7] = "PROCESSING_INSTRUCTION_NODE";
560
- NodeTypes[NodeTypes["COMMENT_NODE"] = 8] = "COMMENT_NODE";
561
- NodeTypes[NodeTypes["DOCUMENT_NODE"] = 9] = "DOCUMENT_NODE";
562
- NodeTypes[NodeTypes["DOCUMENT_TYPE_NODE"] = 10] = "DOCUMENT_TYPE_NODE";
563
- NodeTypes[NodeTypes["DOCUMENT_FRAGMENT_NODE"] = 11] = "DOCUMENT_FRAGMENT_NODE";
564
- /**deprecated */
565
- NodeTypes[NodeTypes["NOTATION_NODE"] = 12] = "NOTATION_NODE";
566
- })(exports.NodeTypes || (exports.NodeTypes = {}));
567
-
568
- class Effect {
569
- fn;
570
- callback;
571
- deps = [];
572
- active = true;
573
- running = false;
574
- scheduler;
575
- constructor(fn, callback) {
576
- this.fn = fn;
577
- this.callback = callback;
578
- }
579
- run() {
580
- let value;
581
- if (!this.active || this.running)
582
- return;
583
- cleanup(this);
584
- effectStack.push(this);
585
- this.running = true;
586
- try {
587
- value = this.fn();
588
- }
589
- finally {
590
- effectStack.pop();
591
- this.running = false;
592
- if (this.callback) {
593
- this.callback(value);
594
- }
595
- }
596
- }
597
- stop() {
598
- this.active = false;
599
- cleanup(this);
600
- }
601
- }
602
- const depMap = new WeakMap();
603
- const effectStack = [];
604
- const effectQueue = new Set();
605
- let isFlushing = false;
606
- let leakEnabled = false;
607
- let leakThreshold = -1;
608
- let leakMonitor;
609
- const leakCleanups = new WeakMap();
610
- function configureReactivityLeakMonitor(opts = {}) {
611
- leakEnabled = !!opts.enabled;
612
- leakThreshold = typeof opts.threshold === 'number' ? opts.threshold : (leakEnabled ? 200 : -1);
613
- leakMonitor = leakEnabled && leakThreshold > 0 ? new LeakMonitor(leakThreshold, opts.name ?? 'reactivity-core') : undefined;
614
- }
615
- function track(target, key) {
616
- if (!followTracking)
617
- return;
618
- const rawTarget = getRaw(target);
619
- const effect = effectStack[effectStack.length - 1];
620
- if (!effect || !effect.active)
621
- return;
622
- let deps = depMap.get(rawTarget);
623
- if (!deps)
624
- depMap.set(rawTarget, (deps = new Map()));
625
- let dep = deps.get(key);
626
- if (!dep)
627
- deps.set(key, (dep = new Set()));
628
- if (!dep.has(effect)) {
629
- dep.add(effect);
630
- effect.deps.push([rawTarget, key]);
631
- if (leakEnabled && leakMonitor && leakThreshold > 0) {
632
- try {
633
- const cleanup = leakMonitor.check(dep.size);
634
- if (cleanup) {
635
- let m = leakCleanups.get(dep);
636
- if (!m) {
637
- m = new Map();
638
- leakCleanups.set(dep, m);
639
- }
640
- m.set(effect, cleanup);
641
- }
642
- }
643
- catch { }
644
- }
645
- }
646
- }
647
- function trigger(target, key) {
648
- const rawTarget = getRaw(target);
649
- const deps = depMap.get(rawTarget);
650
- if (!deps)
651
- return;
652
- const effects = deps.get(key);
653
- if (!effects)
654
- return;
655
- let queued = false;
656
- effects.forEach(effect => {
657
- if (!effect.active)
658
- return;
659
- if (effect.scheduler) {
660
- runReported(effect.scheduler);
661
- return;
662
- }
663
- effectQueue.add(effect);
664
- queued = true;
665
- });
666
- if (queued)
667
- flushEffects();
668
- }
669
- function runReported(fn) {
670
- try {
671
- fn();
672
- }
673
- catch (error) {
674
- reportError('MJX208', error);
675
- }
676
- }
677
- const MAX_EFFECT_RUNS_PER_FLUSH = 50;
678
- function flushEffects() {
679
- if (isFlushing)
680
- return;
681
- isFlushing = true;
682
- Promise.resolve().then(() => {
683
- const runCounts = new Map();
684
- try {
685
- while (effectQueue.size > 0) {
686
- const batch = Array.from(effectQueue);
687
- effectQueue.clear();
688
- for (const e of batch) {
689
- const runs = (runCounts.get(e) ?? 0) + 1;
690
- runCounts.set(e, runs);
691
- if (runs > MAX_EFFECT_RUNS_PER_FLUSH) {
692
- if (runs === MAX_EFFECT_RUNS_PER_FLUSH + 1) {
693
- reportWarning('MJX203', [MAX_EFFECT_RUNS_PER_FLUSH], { fn: String(e.fn).slice(0, 200) });
694
- }
695
- continue;
696
- }
697
- runReported(() => e.run());
698
- }
699
- }
700
- }
701
- finally {
702
- effectQueue.clear();
703
- isFlushing = false;
704
- }
705
- });
706
- }
707
- function cleanup(effect) {
708
- for (const [target, key] of effect.deps) {
709
- const keyMap = depMap.get(target);
710
- if (!keyMap)
711
- continue;
712
- const depSet = keyMap.get(key);
713
- if (!depSet)
714
- continue;
715
- depSet.delete(effect);
716
- try {
717
- const map = leakCleanups.get(depSet);
718
- const fn = map?.get(effect);
719
- if (fn) {
720
- try {
721
- fn();
722
- }
723
- catch { }
724
- map.delete(effect);
725
- }
726
- }
727
- catch { }
728
- if (depSet.size === 0) {
729
- keyMap.delete(key);
730
- }
731
- if (keyMap.size === 0) {
732
- depMap.delete(target);
733
- }
734
- }
735
- effect.deps = [];
736
- }
737
- function effect(fn, onValueChanged) {
738
- const e = new Effect(fn, onValueChanged);
739
- runReported(() => e.run());
740
- return () => e.stop();
741
- }
742
- function createScheduledEffect(fn, scheduler) {
743
- const e = new Effect(fn);
744
- e.scheduler = scheduler;
745
- return {
746
- run: () => { runReported(() => e.run()); },
747
- stop: () => e.stop(),
748
- };
749
- }
750
- function popAsyncTracking(t) {
751
- if (!t.pushed)
752
- return;
753
- t.pushed = false;
754
- const i = effectStack.lastIndexOf(t.effect);
755
- if (i >= 0)
756
- effectStack.splice(i, 1);
757
- }
758
- const asyncTracking = {
759
- capture() {
760
- return { effect: effectStack[effectStack.length - 1], pushed: false };
761
- },
762
- suspend(t, value) {
763
- popAsyncTracking(t);
764
- return value;
765
- },
766
- resume(t, value) {
767
- if (t.effect && t.effect.active && !t.pushed) {
768
- effectStack.push(t.effect);
769
- t.pushed = true;
770
- }
771
- return value;
772
- },
773
- end(t) {
774
- popAsyncTracking(t);
775
- },
776
- };
777
- const UNTRACKED_SENTINEL = new Effect(() => { });
778
- UNTRACKED_SENTINEL.active = false;
779
- function untracked(fn) {
780
- effectStack.push(UNTRACKED_SENTINEL);
781
- try {
782
- return fn();
783
- }
784
- finally {
785
- effectStack.pop();
786
- }
787
- }
788
- function debugGetDeps(target) {
789
- const rawTarget = getRaw(target);
790
- return depMap.get(rawTarget);
791
- }
792
- function debugGetDepMap() {
793
- return depMap;
794
- }
795
-
796
- const SIGNAL_TARGET = Symbol('SignalTarget');
797
- const SIGNAL_KEY = Symbol('SignalKey');
798
- class Signal {
799
- _value;
800
- _target;
801
- _key;
802
- _equals;
803
- _disposed = false;
804
- static create(initialValue, equals) {
805
- return new Signal(initialValue, equals);
806
- }
807
- constructor(initialValue, equals = Object.is) {
808
- this._value = initialValue;
809
- this._target = { [SIGNAL_TARGET]: true };
810
- this._key = SIGNAL_KEY;
811
- this._equals = equals;
812
- }
813
- get value() {
814
- if (!this._disposed) {
815
- track(this._target, this._key);
816
- }
817
- return this._value;
818
- }
819
- set value(newValue) {
820
- if (this._disposed)
821
- return;
822
- if (!this._equals(this._value, newValue)) {
823
- this._value = newValue;
824
- trigger(this._target, this._key);
825
- }
826
- }
827
- peek() {
828
- return this._value;
829
- }
830
- update(updater) {
831
- this.value = (updater(this._value));
832
- }
833
- mutate(mutator) {
834
- if (this._disposed)
835
- return;
836
- mutator(this._value);
837
- trigger(this._target, this._key);
838
- }
839
- notify() {
840
- if (this._disposed)
841
- return;
842
- trigger(this._target, this._key);
843
- }
844
- asReadonly() {
845
- const self = this;
846
- return {
847
- get value() { return self.value; },
848
- peek() { return self.peek(); },
849
- valueOf() { return self.valueOf(); },
850
- toString() { return self.toString(); }
851
- };
852
- }
853
- dispose() {
854
- this._disposed = true;
855
- }
856
- valueOf() {
857
- return this.value;
858
- }
859
- toString() {
860
- return String(this.value);
861
- }
862
- }
863
- class Computed {
864
- _value;
865
- _dirty = true;
866
- _computing = false;
867
- _target;
868
- _key;
869
- _getter;
870
- _cleanup;
871
- constructor(getter) {
872
- this._getter = getter;
873
- this._target = { [SIGNAL_TARGET]: true };
874
- this._key = SIGNAL_KEY;
875
- this._cleanup = effect(() => {
876
- if (this._computing)
877
- return;
878
- this._computing = true;
879
- try {
880
- const newVal = this._getter();
881
- const changed = this._dirty || !Object.is(this._value, newVal);
882
- this._value = newVal;
883
- this._dirty = false;
884
- if (changed) {
885
- trigger(this._target, this._key);
886
- }
887
- }
888
- finally {
889
- this._computing = false;
890
- }
891
- });
892
- }
893
- get value() {
894
- track(this._target, this._key);
895
- if (this._dirty) {
896
- this._computing = true;
897
- pauseTracking();
898
- try {
899
- this._value = this._getter();
900
- this._dirty = false;
901
- }
902
- finally {
903
- resetTracking();
904
- this._computing = false;
905
- }
906
- }
907
- return this._value;
908
- }
909
- peek() {
910
- if (this._dirty) {
911
- pauseTracking();
912
- try {
913
- this._value = this._getter();
914
- this._dirty = false;
915
- }
916
- finally {
917
- resetTracking();
918
- }
919
- }
920
- return this._value;
921
- }
922
- dispose() {
923
- if (this._cleanup) {
924
- this._cleanup();
925
- this._cleanup = undefined;
926
- }
927
- }
928
- valueOf() {
929
- return this.value;
930
- }
931
- toString() {
932
- return String(this.value);
933
- }
934
- }
935
- class LazyComputed {
936
- _value;
937
- _dirty = true;
938
- _disposed = false;
939
- _target;
940
- _key;
941
- _getter;
942
- _runner;
943
- constructor(getter) {
944
- this._getter = getter;
945
- this._target = { [SIGNAL_TARGET]: true };
946
- this._key = SIGNAL_KEY;
947
- this._runner = createScheduledEffect(() => { this._value = this._getter(); }, () => {
948
- if (this._dirty || this._disposed)
949
- return;
950
- this._dirty = true;
951
- trigger(this._target, this._key);
952
- });
953
- }
954
- get value() {
955
- if (!this._disposed) {
956
- track(this._target, this._key);
957
- }
958
- this._refresh();
959
- return this._value;
960
- }
961
- peek() {
962
- this._refresh();
963
- return this._value;
964
- }
965
- get isDirty() {
966
- return this._dirty;
967
- }
968
- _refresh() {
969
- if (!this._dirty)
970
- return;
971
- if (this._disposed) {
972
- this._value = untracked(this._getter);
973
- }
974
- else {
975
- this._runner.run();
976
- }
977
- this._dirty = false;
978
- }
979
- dispose() {
980
- if (this._disposed)
981
- return;
982
- this._disposed = true;
983
- this._runner.stop();
984
- }
985
- valueOf() {
986
- return this.value;
987
- }
988
- toString() {
989
- return String(this.value);
990
- }
991
- }
992
-
993
- const glblths = globalThis;
994
- function getCurrentDom() {
995
- if (glblths && glblths.motifDom) {
996
- return glblths.motifDom.window.document;
997
- }
998
- return glblths.document;
999
- }
1000
- const dom = {
1001
- get window() {
1002
- if (glblths && glblths.window) {
1003
- return glblths.window;
1004
- }
1005
- else if (glblths && glblths) {
1006
- return glblths.motifDom.window;
1007
- }
1008
- else {
1009
- return glblths;
1010
- }
1011
- },
1012
- _created: new Map(),
1013
- document: getCurrentDom(),
1014
- createElement(tagName, options) {
1015
- const doc = getCurrentDom();
1016
- if (!doc) {
1017
- throw motifError('MJX101', tagName);
1018
- }
1019
- if (tagName === "text") {
1020
- return doc.createTextNode('');
1021
- }
1022
- if (!this._created.has(tagName)) {
1023
- const view = doc.createElement(tagName, options);
1024
- this._created.set(tagName, view);
1025
- }
1026
- const tpl = this._created.get(tagName);
1027
- return tpl.cloneNode(false);
1028
- },
1029
- createDocumentFragment() {
1030
- try {
1031
- var cd = getCurrentDom();
1032
- if (cd) {
1033
- return cd.createDocumentFragment();
1034
- }
1035
- }
1036
- catch (error) {
1037
- errorHandler.reportSuppressed('dom.createDocumentFragment', error);
1038
- }
1039
- },
1040
- createComment(content) {
1041
- try {
1042
- return getCurrentDom()?.createComment(content);
1043
- }
1044
- catch (error) {
1045
- errorHandler.reportSuppressed('dom.createComment', error);
1046
- }
1047
- },
1048
- createTextNode(content) {
1049
- try {
1050
- return getCurrentDom()?.createTextNode(content);
1051
- }
1052
- catch (error) {
1053
- errorHandler.reportSuppressed('dom.createTextNode', error);
1054
- }
1055
- },
1056
- querySelectorAll(selectors) {
1057
- try {
1058
- return getCurrentDom()?.querySelectorAll(selectors);
1059
- }
1060
- catch (error) {
1061
- errorHandler.reportSuppressed('dom.querySelectorAll', error);
1062
- }
1063
- },
1064
- createElementNS(namepsaceUri, tagName, options) {
1065
- try {
1066
- return getCurrentDom()?.createElementNS(namepsaceUri, tagName, options);
1067
- }
1068
- catch (error) {
1069
- reportError('MJX103', error, tagName);
1070
- }
1071
- },
1072
- convertToSvgElement(element) {
1073
- const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
1074
- const tagName = element.tagName.toLowerCase();
1075
- const newSvgElement = document.createElementNS(SVG_NAMESPACE, tagName);
1076
- for (const attr of element.attributes) {
1077
- newSvgElement.setAttribute(attr.name, attr.value);
1078
- }
1079
- while (element.firstChild) {
1080
- newSvgElement.appendChild(element.firstChild);
1081
- }
1082
- const parent = element.parentNode;
1083
- if (parent) {
1084
- parent.replaceChild(newSvgElement, element);
1085
- }
1086
- return newSvgElement;
1087
- },
1088
- get body() {
1089
- return getCurrentDom()?.body;
1090
- }
1091
- };
1092
- const SELECTOR_REGEX = /([\w\-]+)?(#([\w\-]+))?((\.([\w\-]+))*)/;
1093
- var Namespace;
1094
- (function (Namespace) {
1095
- Namespace["HTML"] = "http://www.w3.org/1999/xhtml";
1096
- Namespace["SVG"] = "http://www.w3.org/2000/svg";
1097
- })(Namespace || (Namespace = {}));
1098
- function _$(namespace, description, attrs, ...children) {
1099
- const match = SELECTOR_REGEX.exec(description);
1100
- if (!match) {
1101
- throw motifError('MJX102', description);
1102
- }
1103
- const tagName = match[1] || 'div';
1104
- let result;
1105
- if (namespace !== Namespace.HTML) {
1106
- result = dom.createElementNS(namespace, tagName);
1107
- }
1108
- else {
1109
- result = dom.createElement(tagName);
1110
- }
1111
- if (match[3]) {
1112
- result.id = match[3];
1113
- }
1114
- if (match[4]) {
1115
- result.className = match[4].replace(/\./g, ' ').trim();
1116
- }
1117
- if (attrs) {
1118
- Object.entries(attrs).forEach(([name, value]) => {
1119
- if (typeof value === 'undefined') {
1120
- return;
1121
- }
1122
- if (/^on\w+$/.test(name)) {
1123
- result[name] = value;
1124
- }
1125
- else if (name === 'selected') {
1126
- if (value) {
1127
- result.setAttribute(name, 'true');
1128
- }
1129
- }
1130
- else {
1131
- result.setAttribute(name, value);
1132
- }
1133
- });
1134
- }
1135
- result.append(...children);
1136
- return result;
1137
- }
1138
- function $(description, attrs, ...children) {
1139
- return _$(Namespace.HTML, description, attrs, ...children);
1140
- }
1141
-
1142
- const ARRAY_MUTATORS = new Set(['push', 'pop', 'shift', 'unshift', 'splice', 'reverse', 'sort']);
1143
- const NOT_META = Symbol('');
1144
- const metaReaders = new Map([
1145
- ["[__isReactive__]" /* Flags.IS_REACTIVE */, () => true],
1146
- ["[__isReadonly__]" /* Flags.IS_READONLY */, engine => engine.isReadonly],
1147
- ["[__issuperficial__]" /* Flags.IS_SUPERFICIAL */, engine => engine.superficial],
1148
- ["[__get_setup__]" /* Flags.GET_SETUP */, (_engine, target) => target],
1149
- ["[__raw__]" /* Flags.RAW */, (engine, target, receiver) => engine.ReactiveMap().get(target) === receiver ? target : NOT_META],
1150
- ]);
1151
- function readMeta(engine, target, key, receiver) {
1152
- if (typeof key !== 'string' || key.charCodeAt(0) !== 91)
1153
- return NOT_META;
1154
- const reader = metaReaders.get(key);
1155
- return reader === undefined ? NOT_META : reader(engine, target, receiver);
1156
- }
1157
- function createGetter(engine) {
1158
- return function (target, p, receiver) {
1159
- const meta = readMeta(engine, target, p, receiver);
1160
- if (meta !== NOT_META)
1161
- return meta;
1162
- if (Array.isArray(target) && !engine.isReadonly) {
1163
- const patched = engine.arrayMethods.get;
1164
- if (hasOwn(patched, p)) {
1165
- const method = patched[p];
1166
- if (ARRAY_MUTATORS.has(p))
1167
- addArrayStack(p);
1168
- else
1169
- track(target, p);
1170
- return method;
1171
- }
1172
- }
1173
- const value = Reflect.get(target, p, receiver);
1174
- if (p === '__proto__' || isIntrinsicSymbol(p))
1175
- return value;
1176
- if (!engine.isReadonly)
1177
- track(target, p);
1178
- if (engine.superficial || !isObject(value))
1179
- return value;
1180
- return engine.reactive(value);
1181
- };
1182
- }
1183
-
1184
- function createSetter(engine) {
1185
- return function (target, p, newValue, receiver) {
1186
- if (isReadonly(target)) {
1187
- return false;
1188
- }
1189
- const isArray = Array.isArray(target);
1190
- const oldValue = target[p];
1191
- const oldLength = isArray ? target.length : 0;
1192
- const numeric = isArray && isNumericKey(p);
1193
- const hadKey = numeric ? Number(p) < oldLength : hasOwn(target, p);
1194
- const res = Reflect.set(target, p, newValue, receiver);
1195
- if (engine.onValueChanged) {
1196
- try {
1197
- engine.onValueChanged({ raw: target, proxy: receiver }, p);
1198
- }
1199
- catch { }
1200
- }
1201
- if (getRaw(target) !== getRaw(receiver)) {
1202
- return res;
1203
- }
1204
- if (!isArray && hadKey && Object.is(newValue, oldValue)) {
1205
- return res;
1206
- }
1207
- trigger(target, p);
1208
- if (!isArray && !hadKey) {
1209
- trigger(target, ITERATE_KEY);
1210
- }
1211
- if (numeric && !hadKey) {
1212
- trigger(target, 'length');
1213
- }
1214
- if (isArray && p === 'length') {
1215
- const newLength = Number(newValue);
1216
- for (let i = newLength; i < oldLength; i++) {
1217
- trigger(target, String(i));
1218
- }
1219
- }
1220
- removeArrayStack();
1221
- return res;
1222
- };
1223
- }
1224
-
1225
- function createOwn(engine) {
1226
- return function ownKeys(target) {
1227
- const shapeKey = Array.isArray(target) ? 'length' : ITERATE_KEY;
1228
- track(target, shapeKey);
1229
- return Reflect.ownKeys(target);
1230
- };
1231
- }
1232
- function createHas(engine) {
1233
- return function has(target, p) {
1234
- const found = Reflect.has(target, p);
1235
- if (isIntrinsicSymbol(p))
1236
- return found;
1237
- track(target, p);
1238
- return found;
1239
- };
1240
- }
1241
- function createDelete(engine) {
1242
- return function deleteProperty(target, p) {
1243
- pauseTracking();
1244
- try {
1245
- const isOwned = hasOwn(target, p);
1246
- const result = Reflect.deleteProperty(target, p);
1247
- if (isOwned) {
1248
- if (Array.isArray(target)) {
1249
- trigger(target, 'length');
1250
- }
1251
- else {
1252
- trigger(target, p);
1253
- trigger(target, ITERATE_KEY);
1254
- }
1255
- }
1256
- return result;
1257
- }
1258
- finally {
1259
- resetTracking();
1260
- }
1261
- };
1262
- }
1263
-
1264
- const PATCHED_ARRAY_METHODS = [
1265
- ['includes', 'lookup'],
1266
- ['indexOf', 'lookup'],
1267
- ['lastIndexOf', 'lookup'],
1268
- ['sort', 'order'],
1269
- ['concat', 'join'],
1270
- ['push', 'structural'],
1271
- ['pop', 'structural'],
1272
- ['shift', 'structural'],
1273
- ['unshift', 'structural'],
1274
- ['splice', 'structural'],
1275
- ['reverse', 'structural'],
1276
- ];
1277
- const isLookupMiss = (outcome) => outcome === false || outcome === -1;
1278
- class ArrayMethods {
1279
- engine;
1280
- constructor(engine) {
1281
- this.engine = engine;
1282
- }
1283
- get = this.createArrayMethods();
1284
- createArrayMethods() {
1285
- const table = {};
1286
- for (const [name, kind] of PATCHED_ARRAY_METHODS) {
1287
- table[name] = this.patch(name, kind);
1288
- }
1289
- return table;
1290
- }
1291
- patch(name, kind) {
1292
- const owner = this;
1293
- switch (kind) {
1294
- case 'lookup':
1295
- return function (...needles) {
1296
- const source = getRaw(this);
1297
- owner.engine.track(source, 'length');
1298
- const direct = source[name](...needles);
1299
- if (!isLookupMiss(direct))
1300
- return direct;
1301
- return source[name](...needles.map(needle => getRaw(needle)));
1302
- };
1303
- case 'order':
1304
- return function (...args) {
1305
- const source = getRaw(this);
1306
- const size = this.length;
1307
- for (let index = 0; index < size; index++) {
1308
- owner.engine.track(source, String(index));
1309
- }
1310
- const sorted = source[name].apply(this, args);
1311
- owner.engine.track(source, name);
1312
- return sorted;
1313
- };
1314
- case 'join':
1315
- return function (...args) {
1316
- return Array.prototype.concat.apply(this, args);
1317
- };
1318
- default:
1319
- return function (...args) {
1320
- pauseTracking();
1321
- const source = getRaw(this);
1322
- try {
1323
- return source[name].apply(this, args);
1324
- }
1325
- finally {
1326
- resetTracking();
1327
- }
1328
- };
1329
- }
1330
- }
1331
- }
1332
-
1333
- const ReactiveEngineMapper = new WeakSet();
1334
- const AllreactiveMap = new WeakMap();
1335
- function armgetter() { return AllreactiveMap; }
1336
- class ReactiveEngine {
1337
- _gci;
1338
- startGc(_intervalMs = 10000) { }
1339
- stopGc() { if (this._gci) {
1340
- try {
1341
- clearInterval(this._gci);
1342
- }
1343
- catch { }
1344
- this._gci = undefined;
1345
- } }
1346
- constructor() {
1347
- ReactiveEngineMapper.add(this);
1348
- this.startGc();
1349
- }
1350
- DisposeMapper = new LinkedList();
1351
- arrayTriggerCache = new Map();
1352
- ReactiveMap = () => armgetter();
1353
- activeCallback;
1354
- isReadonly = false;
1355
- superficial = false;
1356
- arrayMethods = new ArrayMethods(this);
1357
- arrayHandler = {
1358
- get: createGetter(this),
1359
- set: createSetter(this),
1360
- has: createHas(),
1361
- deleteProperty: createDelete(),
1362
- ownKeys: createOwn()
1363
- };
1364
- deepHandler = {
1365
- get: createGetter(this),
1366
- set: createSetter(this),
1367
- has: createHas(),
1368
- deleteProperty: createDelete(),
1369
- ownKeys: createOwn()
1370
- };
1371
- reactive(model) {
1372
- if (!isObject(model)) {
1373
- model = { value: model };
1374
- }
1375
- const targetType = getTargetType(model);
1376
- if (targetType === 0 /* TargetType.SYSTEM */ || targetType === 2 /* TargetType.COLLECTION */ || 0 /* TargetType.INVALID */) {
1377
- return model;
1378
- }
1379
- let existingProxy = AllreactiveMap.get(model);
1380
- if (existingProxy) {
1381
- return existingProxy;
1382
- }
1383
- existingProxy = AllreactiveMap.get(getRaw(model));
1384
- if (existingProxy) {
1385
- return existingProxy;
1386
- }
1387
- // if (targetType === TargetType.INVALID) {
1388
- if (Array.isArray(model)) {
1389
- var proxy = new Proxy(model, this.arrayHandler);
1390
- // var original = Object.getPrototypeOf(proxy);
1391
- // original["copy"] = () => { return model; }
1392
- // return "copied";
1393
- AllreactiveMap.set(model, proxy);
1394
- // try { this.startGc(); } catch { }
1395
- return proxy;
1396
- }
1397
- else {
1398
- var proxy = new Proxy(model, this.deepHandler);
1399
- AllreactiveMap.set(model, proxy);
1400
- // try { this.startGc(); } catch { }
1401
- return proxy;
1402
- }
1403
- }
1404
- clearModel(model) {
1405
- if (model != null && model != undefined) {
1406
- Object.keys(model).forEach((key) => {
1407
- if (typeof model[key] === 'object') {
1408
- if (AllreactiveMap.has(model[key]) || AllreactiveMap.has(getRaw(model[key]))) {
1409
- this.clearModel(model[key]);
1410
- }
1411
- }
1412
- AllreactiveMap.delete(getRaw(model[key]));
1413
- AllreactiveMap.delete(model[key]);
1414
- });
1415
- AllreactiveMap.delete(getRaw(model));
1416
- AllreactiveMap.delete(model);
1417
- }
1418
- }
1419
- track(model, key) {
1420
- track(model, key);
1421
- }
1422
- trigger(model, key, value) {
1423
- trigger(model, key);
1424
- }
1425
- ArrayTrigger(target, key, ...args) {
1426
- this.trigger(target, key, args);
1427
- }
1428
- onValueChanged;
1429
- toRaw(item) {
1430
- return JSON.parse(JSON.stringify(this.deepClone(item)));
1431
- }
1432
- deepClone(item) {
1433
- var self = this;
1434
- if (!item) {
1435
- return item;
1436
- }
1437
- var types = [Number, String, Boolean], result;
1438
- types.forEach(function (type) {
1439
- if (item instanceof type) {
1440
- result = type(item);
1441
- }
1442
- });
1443
- if (typeof result == "undefined") {
1444
- if (Object.prototype.toString.call(item) === "[object Array]") {
1445
- result = [];
1446
- item.forEach(function (child, index, array) {
1447
- result[index] = self.deepClone(child);
1448
- });
1449
- }
1450
- else if (typeof item == "object") {
1451
- if (item.nodeType && typeof item.cloneNode == "function") {
1452
- result = item.cloneNode(true);
1453
- }
1454
- else if (!item.prototype) {
1455
- if (item instanceof Date) {
1456
- result = new Date(item);
1457
- }
1458
- else {
1459
- result = {};
1460
- for (var i in item) {
1461
- result[i] = self.deepClone(item[i]);
1462
- }
1463
- }
1464
- }
1465
- else {
1466
- {
1467
- result = item;
1468
- }
1469
- }
1470
- }
1471
- else {
1472
- result = item;
1473
- }
1474
- }
1475
- return result;
1476
- }
1477
- pauseTracking() {
1478
- pauseTracking();
1479
- }
1480
- enableTracking() {
1481
- enableTracking();
1482
- }
1483
- resetTracking() {
1484
- resetTracking();
1485
- }
1486
- dispose() {
1487
- var cnt = true;
1488
- this.stopGc();
1489
- while (cnt == true) {
1490
- if (this.DisposeMapper.size > 0) {
1491
- const element = this.DisposeMapper.pop();
1492
- // if (ApplicationService.current?.Options?.onReactiveEffectRun) {
1493
- AllreactiveMap.delete(element);
1494
- }
1495
- else {
1496
- cnt = false;
1497
- }
1498
- }
1499
- this.DisposeMapper.clear();
1500
- ReactiveEngineMapper.delete(this);
1501
- // if (ApplicationService.current?.Options?.onReactiveEffectRun) {
1502
- }
1503
- }
1504
-
1505
- const engine = new ReactiveEngine();
1506
- /* @DEV-ONLY */ const reactiveRegistry = [];
1507
- const isDevRegistryEnabled = () => {
1508
- try {
1509
- const g = globalThis;
1510
- if (!g.__MOTIF_DEV__)
1511
- return false;
1512
- if (g.__MOTIF_STORE_REGISTRY__ !== reactiveRegistry)
1513
- g.__MOTIF_STORE_REGISTRY__ = reactiveRegistry;
1514
- return true;
1515
- }
1516
- catch {
1517
- return false;
1518
- }
1519
- };
1520
- // export * from "./IStoreBinder";
1521
- // export function reactiveListeners(model?: any) {
1522
- // if (model) {
1523
- // /* @DEV-ONLY */return debugGetDeps(model) ?? new Map();
1524
- // return debugGetDepMap();
1525
- function reactive(model) {
1526
- const result = engine.reactive(model);
1527
- /* @DEV-ONLY */ try {
1528
- /* @DEV-ONLY */ if (isDevRegistryEnabled()) {
1529
- /* @DEV-ONLY */ const name = model?.constructor?.name || 'reactive';
1530
- /* @DEV-ONLY */ reactiveRegistry.push({ name, value: result, type: 'reactive' });
1531
- /* @DEV-ONLY */ if (reactiveRegistry.length > 200)
1532
- reactiveRegistry.shift();
1533
- /* @DEV-ONLY */ }
1534
- /* @DEV-ONLY */
1535
- /* @DEV-ONLY */ }
1536
- catch { }
1537
- return result;
1538
- }
1539
- function useModel(model) {
1540
- const result = engine.reactive(model);
1541
- /* @DEV-ONLY */ try {
1542
- /* @DEV-ONLY */ if (isDevRegistryEnabled()) {
1543
- /* @DEV-ONLY */ const name = model?.constructor?.name || 'useModel';
1544
- /* @DEV-ONLY */ reactiveRegistry.push({ name, value: result, type: 'reactive' });
1545
- /* @DEV-ONLY */ if (reactiveRegistry.length > 200)
1546
- reactiveRegistry.shift();
1547
- /* @DEV-ONLY */ }
1548
- /* @DEV-ONLY */
1549
- /* @DEV-ONLY */ }
1550
- catch { }
1551
- return result;
1552
- }
1553
- function clearModel(model) {
1554
- return engine.clearModel(model);
1555
- }
1556
- function deepClone(item) {
1557
- return engine.deepClone(item);
1558
- }
1559
- function createSignal(initialValue) {
1560
- const sig = new Signal(initialValue);
1561
- /* @DEV-ONLY */ try {
1562
- /* @DEV-ONLY */ if (isDevRegistryEnabled()) {
1563
- /* @DEV-ONLY */ const name = `signal_${reactiveRegistry.length}`;
1564
- /* @DEV-ONLY */ reactiveRegistry.push({ name, value: sig.value, type: 'signal' });
1565
- /* @DEV-ONLY */ if (reactiveRegistry.length > 200)
1566
- reactiveRegistry.shift();
1567
- /* @DEV-ONLY */ }
1568
- /* @DEV-ONLY */
1569
- /* @DEV-ONLY */ }
1570
- catch { }
1571
- return sig;
1572
- }
1573
- function createComputed(getter) {
1574
- const comp = new Computed(getter);
1575
- /* @DEV-ONLY */ try {
1576
- /* @DEV-ONLY */ if (isDevRegistryEnabled()) {
1577
- /* @DEV-ONLY */ const name = `computed_${reactiveRegistry.length}`;
1578
- /* @DEV-ONLY */ reactiveRegistry.push({ name, value: comp.value, type: 'computed' });
1579
- /* @DEV-ONLY */ if (reactiveRegistry.length > 200)
1580
- reactiveRegistry.shift();
1581
- /* @DEV-ONLY */ }
1582
- /* @DEV-ONLY */
1583
- /* @DEV-ONLY */ }
1584
- catch { }
1585
- return comp;
1586
- }
1587
- function createLazyComputed(getter) {
1588
- const comp = new LazyComputed(getter);
1589
- /* @DEV-ONLY */ try {
1590
- /* @DEV-ONLY */ if (isDevRegistryEnabled()) {
1591
- /* @DEV-ONLY */ const name = `lazyComputed_${reactiveRegistry.length}`;
1592
- /* @DEV-ONLY */ reactiveRegistry.push({ name, value: undefined, type: 'computed' });
1593
- /* @DEV-ONLY */ if (reactiveRegistry.length > 200)
1594
- reactiveRegistry.shift();
1595
- /* @DEV-ONLY */ }
1596
- /* @DEV-ONLY */
1597
- /* @DEV-ONLY */ }
1598
- catch { }
1599
- return comp;
1600
- }
1601
-
1602
- exports.$ = $;
1603
- exports.Computed = Computed;
1604
- exports.ErrorHandler = ErrorHandler;
1605
- exports.LazyComputed = LazyComputed;
1606
- exports.LinkedList = LinkedList;
1607
- exports.MotifError = MotifError;
1608
- exports.Signal = Signal;
1609
- exports.asyncTracking = asyncTracking;
1610
- exports.callReported = callReported;
1611
- exports.clearModel = clearModel;
1612
- exports.configureReactivityLeakMonitor = configureReactivityLeakMonitor;
1613
- exports.createComputed = createComputed;
1614
- exports.createLazyComputed = createLazyComputed;
1615
- exports.createSignal = createSignal;
1616
- exports.debugGetDepMap = debugGetDepMap;
1617
- exports.debugGetDeps = debugGetDeps;
1618
- exports.deepClone = deepClone;
1619
- exports.dom = dom;
1620
- exports.effect = effect;
1621
- exports.engine = engine;
1622
- exports.ensureDevtoolsFlagInitialized = ensureDevtoolsFlagInitialized;
1623
- exports.errorHandler = errorHandler;
1624
- exports.formatMotifMessage = formatMotifMessage;
1625
- exports.getRaw = getRaw;
1626
- exports.isDevLike = isDevLike;
1627
- exports.isEnabled = isEnabled;
1628
- exports.motifError = motifError;
1629
- exports.on = on;
1630
- exports.reactive = reactive;
1631
- exports.reportError = reportError;
1632
- exports.reportWarning = reportWarning;
1633
- exports.safeCall = safeCall;
1634
- exports.safeCallAsync = safeCallAsync;
1635
- exports.safeCallSilent = safeCallSilent;
1636
- exports.safeCallSilentAsync = safeCallSilentAsync;
1637
- exports.setErrorConsoleLogging = setErrorConsoleLogging;
1638
- exports.setRoutes = setRoutes;
1639
- exports.setUnexpectedErrorHandler = setUnexpectedErrorHandler;
1640
- exports.untracked = untracked;
1641
- exports.useModel = useModel;
1642
- //# sourceMappingURL=core-DXGu4dNE.cjs.map