@mulanjs/mulanjs 1.0.1-dev.20260220134357 → 1.0.1-dev.20260222103836

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,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.compileSFC = compileSFC;
3
+ exports.compileSFC = void 0;
4
4
  const sfc_parser_1 = require("./sfc-parser");
5
5
  const script_compiler_1 = require("./script-compiler");
6
6
  const template_compiler_1 = require("./template-compiler");
@@ -37,8 +37,8 @@ async function compileSFC(source, filename, options) {
37
37
  });
38
38
  // 1. Apply Script Map
39
39
  if (scriptResult.map) {
40
- const scriptConsumer = await new source_map_1.SourceMapConsumer(JSON.parse(scriptResult.map));
41
- scriptConsumer.eachMapping(mapping => {
40
+ const scriptConsumer = new source_map_1.SourceMapConsumer(JSON.parse(scriptResult.map));
41
+ scriptConsumer.eachMapping((mapping) => {
42
42
  if (mapping.source) {
43
43
  generator.addMapping({
44
44
  generated: {
@@ -56,19 +56,19 @@ async function compileSFC(source, filename, options) {
56
56
  });
57
57
  // Copy source content from script map
58
58
  if (scriptConsumer.sources) {
59
- scriptConsumer.sources.forEach(sourceFile => {
59
+ scriptConsumer.sources.forEach((sourceFile) => {
60
60
  const content = scriptConsumer.sourceContentFor(sourceFile);
61
61
  if (content) {
62
62
  generator.setSourceContent(sourceFile, content);
63
63
  }
64
64
  });
65
65
  }
66
- scriptConsumer.destroy();
66
+ // scriptConsumer.destroy() not needed in 0.6.x
67
67
  }
68
68
  // 2. Apply Template Map
69
69
  if (templateResult.map) {
70
- const templateConsumer = await new source_map_1.SourceMapConsumer(JSON.parse(templateResult.map));
71
- templateConsumer.eachMapping(mapping => {
70
+ const templateConsumer = new source_map_1.SourceMapConsumer(JSON.parse(templateResult.map));
71
+ templateConsumer.eachMapping((mapping) => {
72
72
  if (mapping.source) {
73
73
  generator.addMapping({
74
74
  generated: {
@@ -86,14 +86,14 @@ async function compileSFC(source, filename, options) {
86
86
  });
87
87
  // Copy source content from template map
88
88
  if (templateConsumer.sources) {
89
- templateConsumer.sources.forEach(sourceFile => {
89
+ templateConsumer.sources.forEach((sourceFile) => {
90
90
  const content = templateConsumer.sourceContentFor(sourceFile);
91
91
  if (content) {
92
92
  generator.setSourceContent(sourceFile, content);
93
93
  }
94
94
  });
95
95
  }
96
- templateConsumer.destroy();
96
+ // templateConsumer.destroy() not needed in 0.6.x
97
97
  }
98
98
  mergedMap = generator.toString();
99
99
  }
@@ -166,3 +166,4 @@ export default __component__;
166
166
  map: mergedMap || scriptResult.map // Fallback to script map if merge fails
167
167
  };
168
168
  }
169
+ exports.compileSFC = compileSFC;
@@ -15,25 +15,15 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
35
25
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.compileScript = compileScript;
26
+ exports.compileScript = void 0;
37
27
  const ts = __importStar(require("typescript"));
38
28
  const source_map_1 = require("source-map");
39
29
  const path = __importStar(require("path"));
@@ -78,6 +68,7 @@ async function compileScript(descriptor, options) {
78
68
  return { code: content, errors: [] };
79
69
  }
80
70
  }
71
+ exports.compileScript = compileScript;
81
72
  // Global list of Mulan hooks for auto-imports and reactivity exemption
82
73
  const COMMON_HOOKS = ['muState', 'onMuMount', 'onMuInit', 'onMuDestroy', 'muEffect', 'muMemo', 'muQubit', 'muGate', 'muMeasure', 'muRegister', 'muEntangle', 'persistent'];
83
74
  async function compileSetupScript(script, isTs, descriptor, content, filename, isExternal, externalPath) {
@@ -214,7 +205,7 @@ export default ${hasDefineComponent ? 'defineComponent' : '_defineComponent'}({
214
205
  originalSource = descriptor.source;
215
206
  linesBeforeScript = originalSource.substring(0, script.start).split('\n').length - 1;
216
207
  }
217
- const consumer = await new source_map_1.SourceMapConsumer(finalMap);
208
+ const consumer = new source_map_1.SourceMapConsumer(JSON.parse(finalMap));
218
209
  const generator = new source_map_1.SourceMapGenerator({
219
210
  file: filename,
220
211
  sourceRoot: ''
@@ -246,7 +237,7 @@ export default ${hasDefineComponent ? 'defineComponent' : '_defineComponent'}({
246
237
  // If inline, we set source content of .mujs (the whole file)
247
238
  // If external, we set source content of the .ts file
248
239
  generator.setSourceContent(relativePath, originalSource);
249
- consumer.eachMapping(m => {
240
+ consumer.eachMapping((m) => {
250
241
  if (m.originalLine === null)
251
242
  return;
252
243
  // m.originalLine is the line in `finalCode` (1-based because SourceMapConsumer uses 1-based)
@@ -278,7 +269,7 @@ export default ${hasDefineComponent ? 'defineComponent' : '_defineComponent'}({
278
269
  }
279
270
  });
280
271
  finalMap = generator.toString();
281
- consumer.destroy();
272
+ // consumer.destroy() not needed in 0.6.x
282
273
  }
283
274
  catch (e) {
284
275
  console.warn('[MulanJS] Failed to patch source map:', e);
@@ -328,7 +319,7 @@ async function compileStandardScript(script, descriptor, content, filename, isEx
328
319
  originalSource = descriptor.source;
329
320
  linesBeforeScript = descriptor.source.substring(0, script.start).split('\n').length - 1;
330
321
  }
331
- const consumer = await new source_map_1.SourceMapConsumer(finalMap);
322
+ const consumer = new source_map_1.SourceMapConsumer(JSON.parse(finalMap));
332
323
  const generator = new source_map_1.SourceMapGenerator({
333
324
  file: filename,
334
325
  sourceRoot: ''
@@ -353,7 +344,7 @@ async function compileStandardScript(script, descriptor, content, filename, isEx
353
344
  }
354
345
  }
355
346
  generator.setSourceContent(relativePath, originalSource);
356
- consumer.eachMapping(m => {
347
+ consumer.eachMapping((m) => {
357
348
  if (m.originalLine === null)
358
349
  return;
359
350
  const originalLine = m.originalLine + linesBeforeScript;
@@ -371,7 +362,7 @@ async function compileStandardScript(script, descriptor, content, filename, isEx
371
362
  });
372
363
  });
373
364
  finalMap = generator.toString();
374
- consumer.destroy();
365
+ // consumer.destroy() removed for v0.6.1
375
366
  }
376
367
  catch (e) { /* ignore */ }
377
368
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseMUJS = parseMUJS;
3
+ exports.parseMUJS = void 0;
4
4
  /**
5
5
  * Standardized State-Machine Parser for MulanJS
6
6
  * Parses .mujs files safely, handling attributes, quotes, and nested content.
@@ -91,3 +91,4 @@ function parseMUJS(source, filename) {
91
91
  }
92
92
  return descriptor;
93
93
  }
94
+ exports.parseMUJS = parseMUJS;
@@ -15,25 +15,15 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
35
25
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.compileStyle = compileStyle;
26
+ exports.compileStyle = void 0;
37
27
  const path = __importStar(require("path"));
38
28
  function compileStyle(descriptor, filename, options) {
39
29
  const styles = descriptor.styles;
@@ -101,6 +91,7 @@ function compileStyle(descriptor, filename, options) {
101
91
  errors: []
102
92
  };
103
93
  }
94
+ exports.compileStyle = compileStyle;
104
95
  // Simple hash for ID generation
105
96
  function hash(str) {
106
97
  let hash = 0;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.compileTemplate = compileTemplate;
3
+ exports.compileTemplate = void 0;
4
4
  // --- Compile Function ---
5
5
  const source_map_1 = require("source-map");
6
6
  function compileTemplate(descriptor, scriptResult, scopedId) {
@@ -71,6 +71,7 @@ function compileTemplate(descriptor, scriptResult, scopedId) {
71
71
  map
72
72
  };
73
73
  }
74
+ exports.compileTemplate = compileTemplate;
74
75
  // --- Parser (Recursive Descent) ---
75
76
  function parse(template, errors) {
76
77
  // Root Wrapper
@@ -62,6 +62,12 @@ export class MuComponent {
62
62
  this._eventQueue.push([id, type, handler]);
63
63
  return "";
64
64
  }
65
+ // Manual binding helper for template literals
66
+ bind(handler, type = 'click') {
67
+ const id = 'ev_' + Math.random().toString(36).substr(2, 9);
68
+ this._e(id, type, handler);
69
+ return `data-mu-id="${id}"`;
70
+ }
65
71
  mount() {
66
72
  console.log(`[Mulan Cycle] Mounting component ${this.$uid}`);
67
73
  const stop = effect(() => {
@@ -227,3 +227,145 @@ export function muPulse() {
227
227
  export function muVault(key, initial, options = {}) {
228
228
  return persistent(key, initial, Object.assign(Object.assign({}, options), { onCleanup: (fn) => onMuDestroy(fn) }));
229
229
  }
230
+ // --- Next-Gen MulanJS Hooks ---
231
+ /**
232
+ * muSuspense - The Asynchronous Barrier.
233
+ * Natively handles async state (loading/data/error) without wrapper components.
234
+ */
235
+ export function muSuspense(promiseFn) {
236
+ const state = muState({
237
+ loading: true,
238
+ data: null,
239
+ error: null
240
+ });
241
+ // Execute immediately safely
242
+ promiseFn()
243
+ .then(res => {
244
+ state.data = res;
245
+ state.loading = false;
246
+ })
247
+ .catch(err => {
248
+ state.error = err;
249
+ state.loading = false;
250
+ });
251
+ return state;
252
+ }
253
+ /**
254
+ * onMuVisibility - The Intersection Observer Hook.
255
+ * Triggers when the component enters/leaves the viewport.
256
+ */
257
+ export function onMuVisibility(callback, options = { threshold: 0.1 }) {
258
+ const instance = getCurrentInstance();
259
+ // We defer observation to mount phase to ensure DOM exists
260
+ onMuMount(() => {
261
+ if (!instance || !instance.container)
262
+ return;
263
+ const observer = new IntersectionObserver((entries) => {
264
+ entries.forEach(entry => {
265
+ callback(entry.isIntersecting);
266
+ });
267
+ }, options);
268
+ observer.observe(instance.container);
269
+ onMuDestroy(() => {
270
+ observer.disconnect();
271
+ });
272
+ });
273
+ }
274
+ /**
275
+ * muDebounced - High-performance debouncing built directly into a reactive signal.
276
+ */
277
+ export function muDebounced(initialValue, delayMs) {
278
+ const state = muState(initialValue);
279
+ let timeoutId;
280
+ return {
281
+ get value() {
282
+ return state.value;
283
+ },
284
+ set value(newVal) {
285
+ clearTimeout(timeoutId);
286
+ timeoutId = setTimeout(() => {
287
+ state.value = newVal;
288
+ }, delayMs);
289
+ }
290
+ };
291
+ }
292
+ /**
293
+ * muThrottled - High-performance throttling built directly into a reactive signal.
294
+ */
295
+ export function muThrottled(initialValue, delayMs) {
296
+ const state = muState(initialValue);
297
+ let lastRan = 0;
298
+ return {
299
+ get value() {
300
+ return state.value;
301
+ },
302
+ set value(newVal) {
303
+ const now = Date.now();
304
+ if (now - lastRan >= delayMs) {
305
+ state.value = newVal;
306
+ lastRan = now;
307
+ }
308
+ }
309
+ };
310
+ }
311
+ /**
312
+ * onMuPanic - The Iron Fortress Error Boundary.
313
+ * Catches unhandled exceptions within the component scope.
314
+ */
315
+ export function onMuPanic(fallbackFn) {
316
+ const instance = getCurrentInstance();
317
+ const handler = (event) => {
318
+ // Broad catch - in a full implementation, we'd inspect the stack trace
319
+ // to isolate if it originated from `instance` specifically.
320
+ // For Mulan 2.0 MVP, we execute the fallback.
321
+ const error = event instanceof ErrorEvent ? event.error : event.reason;
322
+ console.error(`[Iron Fortress] Component ${(instance === null || instance === void 0 ? void 0 : instance.$uid) || 'Unknown'} Panic:`, error);
323
+ fallbackFn(error);
324
+ // Prevent default browser crash if handled
325
+ event.preventDefault();
326
+ };
327
+ window.addEventListener('error', handler);
328
+ window.addEventListener('unhandledrejection', handler);
329
+ onMuDestroy(() => {
330
+ window.removeEventListener('error', handler);
331
+ window.removeEventListener('unhandledrejection', handler);
332
+ });
333
+ }
334
+ /**
335
+ * muHistory - State with built-in Undo/Redo tracking.
336
+ */
337
+ export function muHistory(initialValue) {
338
+ const state = muState(initialValue);
339
+ // Explicit wrapper object because muState treats bare arrays dynamically
340
+ const historyTracker = muState({ log: [initialValue] });
341
+ const pointer = muState(0);
342
+ const updateValue = (newVal) => {
343
+ // If we are back in history and make a NEW change, we drop the 'future'
344
+ if (pointer.value < historyTracker.log.length - 1) {
345
+ historyTracker.log = historyTracker.log.slice(0, pointer.value + 1);
346
+ }
347
+ historyTracker.log.push(newVal);
348
+ pointer.value = historyTracker.log.length - 1;
349
+ state.value = newVal;
350
+ };
351
+ const undo = () => {
352
+ if (pointer.value > 0) {
353
+ pointer.value--;
354
+ state.value = historyTracker.log[pointer.value];
355
+ }
356
+ };
357
+ const redo = () => {
358
+ if (pointer.value < historyTracker.log.length - 1) {
359
+ pointer.value++;
360
+ state.value = historyTracker.log[pointer.value];
361
+ }
362
+ };
363
+ return {
364
+ get value() { return state.value; },
365
+ set value(newVal) { updateValue(newVal); },
366
+ undo,
367
+ redo,
368
+ get past() { return historyTracker.log.slice(0, pointer.value); },
369
+ get future() { return historyTracker.log.slice(pointer.value + 1); }
370
+ };
371
+ }
package/dist/mulan.esm.js CHANGED
@@ -38,18 +38,24 @@ var hooks_namespaceObject = {};
38
38
  __webpack_require__.r(hooks_namespaceObject);
39
39
  __webpack_require__.d(hooks_namespaceObject, {
40
40
  getCurrentInstance: () => (getCurrentInstance),
41
+ muDebounced: () => (muDebounced),
41
42
  muEffect: () => (muEffect),
42
43
  muGeom: () => (muGeom),
44
+ muHistory: () => (muHistory),
43
45
  muMemo: () => (muMemo),
44
46
  muPulse: () => (muPulse),
45
47
  muState: () => (muState),
48
+ muSuspense: () => (muSuspense),
49
+ muThrottled: () => (muThrottled),
46
50
  muVault: () => (muVault),
47
51
  onMuDestroy: () => (onMuDestroy),
48
52
  onMuIdle: () => (onMuIdle),
49
53
  onMuInit: () => (onMuInit),
50
54
  onMuMount: () => (onMuMount),
55
+ onMuPanic: () => (onMuPanic),
51
56
  onMuResume: () => (onMuResume),
52
57
  onMuShake: () => (onMuShake),
58
+ onMuVisibility: () => (onMuVisibility),
53
59
  onMuVoice: () => (onMuVoice),
54
60
  setCurrentInstance: () => (setCurrentInstance)
55
61
  });
@@ -601,6 +607,148 @@ function muPulse() {
601
607
  function muVault(key, initial, options = {}) {
602
608
  return persistent(key, initial, Object.assign(Object.assign({}, options), { onCleanup: (fn) => onMuDestroy(fn) }));
603
609
  }
610
+ // --- Next-Gen MulanJS Hooks ---
611
+ /**
612
+ * muSuspense - The Asynchronous Barrier.
613
+ * Natively handles async state (loading/data/error) without wrapper components.
614
+ */
615
+ function muSuspense(promiseFn) {
616
+ const state = muState({
617
+ loading: true,
618
+ data: null,
619
+ error: null
620
+ });
621
+ // Execute immediately safely
622
+ promiseFn()
623
+ .then(res => {
624
+ state.data = res;
625
+ state.loading = false;
626
+ })
627
+ .catch(err => {
628
+ state.error = err;
629
+ state.loading = false;
630
+ });
631
+ return state;
632
+ }
633
+ /**
634
+ * onMuVisibility - The Intersection Observer Hook.
635
+ * Triggers when the component enters/leaves the viewport.
636
+ */
637
+ function onMuVisibility(callback, options = { threshold: 0.1 }) {
638
+ const instance = getCurrentInstance();
639
+ // We defer observation to mount phase to ensure DOM exists
640
+ onMuMount(() => {
641
+ if (!instance || !instance.container)
642
+ return;
643
+ const observer = new IntersectionObserver((entries) => {
644
+ entries.forEach(entry => {
645
+ callback(entry.isIntersecting);
646
+ });
647
+ }, options);
648
+ observer.observe(instance.container);
649
+ onMuDestroy(() => {
650
+ observer.disconnect();
651
+ });
652
+ });
653
+ }
654
+ /**
655
+ * muDebounced - High-performance debouncing built directly into a reactive signal.
656
+ */
657
+ function muDebounced(initialValue, delayMs) {
658
+ const state = muState(initialValue);
659
+ let timeoutId;
660
+ return {
661
+ get value() {
662
+ return state.value;
663
+ },
664
+ set value(newVal) {
665
+ clearTimeout(timeoutId);
666
+ timeoutId = setTimeout(() => {
667
+ state.value = newVal;
668
+ }, delayMs);
669
+ }
670
+ };
671
+ }
672
+ /**
673
+ * muThrottled - High-performance throttling built directly into a reactive signal.
674
+ */
675
+ function muThrottled(initialValue, delayMs) {
676
+ const state = muState(initialValue);
677
+ let lastRan = 0;
678
+ return {
679
+ get value() {
680
+ return state.value;
681
+ },
682
+ set value(newVal) {
683
+ const now = Date.now();
684
+ if (now - lastRan >= delayMs) {
685
+ state.value = newVal;
686
+ lastRan = now;
687
+ }
688
+ }
689
+ };
690
+ }
691
+ /**
692
+ * onMuPanic - The Iron Fortress Error Boundary.
693
+ * Catches unhandled exceptions within the component scope.
694
+ */
695
+ function onMuPanic(fallbackFn) {
696
+ const instance = getCurrentInstance();
697
+ const handler = (event) => {
698
+ // Broad catch - in a full implementation, we'd inspect the stack trace
699
+ // to isolate if it originated from `instance` specifically.
700
+ // For Mulan 2.0 MVP, we execute the fallback.
701
+ const error = event instanceof ErrorEvent ? event.error : event.reason;
702
+ console.error(`[Iron Fortress] Component ${(instance === null || instance === void 0 ? void 0 : instance.$uid) || 'Unknown'} Panic:`, error);
703
+ fallbackFn(error);
704
+ // Prevent default browser crash if handled
705
+ event.preventDefault();
706
+ };
707
+ window.addEventListener('error', handler);
708
+ window.addEventListener('unhandledrejection', handler);
709
+ onMuDestroy(() => {
710
+ window.removeEventListener('error', handler);
711
+ window.removeEventListener('unhandledrejection', handler);
712
+ });
713
+ }
714
+ /**
715
+ * muHistory - State with built-in Undo/Redo tracking.
716
+ */
717
+ function muHistory(initialValue) {
718
+ const state = muState(initialValue);
719
+ // Explicit wrapper object because muState treats bare arrays dynamically
720
+ const historyTracker = muState({ log: [initialValue] });
721
+ const pointer = muState(0);
722
+ const updateValue = (newVal) => {
723
+ // If we are back in history and make a NEW change, we drop the 'future'
724
+ if (pointer.value < historyTracker.log.length - 1) {
725
+ historyTracker.log = historyTracker.log.slice(0, pointer.value + 1);
726
+ }
727
+ historyTracker.log.push(newVal);
728
+ pointer.value = historyTracker.log.length - 1;
729
+ state.value = newVal;
730
+ };
731
+ const undo = () => {
732
+ if (pointer.value > 0) {
733
+ pointer.value--;
734
+ state.value = historyTracker.log[pointer.value];
735
+ }
736
+ };
737
+ const redo = () => {
738
+ if (pointer.value < historyTracker.log.length - 1) {
739
+ pointer.value++;
740
+ state.value = historyTracker.log[pointer.value];
741
+ }
742
+ };
743
+ return {
744
+ get value() { return state.value; },
745
+ set value(newVal) { updateValue(newVal); },
746
+ undo,
747
+ redo,
748
+ get past() { return historyTracker.log.slice(0, pointer.value); },
749
+ get future() { return historyTracker.log.slice(pointer.value + 1); }
750
+ };
751
+ }
604
752
 
605
753
  ;// ./src/core/component.ts
606
754
 
@@ -667,6 +815,12 @@ class MuComponent {
667
815
  this._eventQueue.push([id, type, handler]);
668
816
  return "";
669
817
  }
818
+ // Manual binding helper for template literals
819
+ bind(handler, type = 'click') {
820
+ const id = 'ev_' + Math.random().toString(36).substr(2, 9);
821
+ this._e(id, type, handler);
822
+ return `data-mu-id="${id}"`;
823
+ }
670
824
  mount() {
671
825
  console.log(`[Mulan Cycle] Mounting component ${this.$uid}`);
672
826
  const stop = effect(() => {
@@ -2053,6 +2207,6 @@ if (typeof window !== 'undefined') {
2053
2207
  }
2054
2208
  /* harmony default export */ const src = (Mulan);
2055
2209
 
2056
- export { MuComponent as Component, MuBlochSphereElement, MuComponent, MuInfinity, MuRouter, MuStore, MuRouter as Router, Security, Signal, activeControls, src as default, defineComponent, effect, getCurrentInstance, hydrate, muBurst, muControl, muEffect, muEntangle, muGate, muGeom, muMeasure, muMemo, muParallel, muPulse, muQubit, muRegister, muSearch, muState, muSurge, muSwitch, muTeleport, muVault, onMuDestroy, onMuIdle, onMuInit, onMuMount, onMuResume, onMuShake, onMuVoice, persistent, reactive, ref, render, renderToString, sanitize, setCurrentInstance, useMutation, useQuery };
2210
+ export { MuComponent as Component, MuBlochSphereElement, MuComponent, MuInfinity, MuRouter, MuStore, MuRouter as Router, Security, Signal, activeControls, src as default, defineComponent, effect, getCurrentInstance, hydrate, muBurst, muControl, muDebounced, muEffect, muEntangle, muGate, muGeom, muHistory, muMeasure, muMemo, muParallel, muPulse, muQubit, muRegister, muSearch, muState, muSurge, muSuspense, muSwitch, muTeleport, muThrottled, muVault, onMuDestroy, onMuIdle, onMuInit, onMuMount, onMuPanic, onMuResume, onMuShake, onMuVisibility, onMuVoice, persistent, reactive, ref, render, renderToString, sanitize, setCurrentInstance, useMutation, useQuery };
2057
2211
 
2058
2212
  //# sourceMappingURL=mulan.esm.js.map