react-state-basis 0.1.4 → 0.2.1

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.js CHANGED
@@ -24,6 +24,8 @@ __export(index_exports, {
24
24
  __testEngine__: () => __testEngine__,
25
25
  __test__: () => __test__,
26
26
  beginEffectTracking: () => beginEffectTracking,
27
+ config: () => config,
28
+ configureBasis: () => configureBasis,
27
29
  createContext: () => createContext,
28
30
  currentTickBatch: () => currentTickBatch,
29
31
  endEffectTracking: () => endEffectTracking,
@@ -33,11 +35,21 @@ __export(index_exports, {
33
35
  registerVariable: () => registerVariable,
34
36
  unregisterVariable: () => unregisterVariable,
35
37
  useBasisConfig: () => useBasisConfig,
38
+ useCallback: () => useCallback,
36
39
  useContext: () => useContext,
40
+ useDebugValue: () => useDebugValue,
41
+ useDeferredValue: () => useDeferredValue,
37
42
  useEffect: () => useEffect,
43
+ useId: () => useId,
44
+ useImperativeHandle: () => useImperativeHandle,
45
+ useInsertionEffect: () => useInsertionEffect,
46
+ useLayoutEffect: () => useLayoutEffect,
38
47
  useMemo: () => useMemo,
39
48
  useReducer: () => useReducer,
40
- useState: () => useState
49
+ useRef: () => useRef,
50
+ useState: () => useState,
51
+ useSyncExternalStore: () => useSyncExternalStore,
52
+ useTransition: () => useTransition
41
53
  });
42
54
  module.exports = __toCommonJS(index_exports);
43
55
 
@@ -261,14 +273,25 @@ var LOOP_WINDOW_MS = 500;
261
273
  var ANALYSIS_INTERVAL = 5;
262
274
 
263
275
  // src/engine.ts
276
+ var config = {
277
+ debug: false
278
+ };
279
+ var booted = false;
280
+ var configureBasis = (newConfig) => {
281
+ config = { ...config, ...newConfig };
282
+ if (config.debug && !booted) {
283
+ displayBootLog(WINDOW_SIZE);
284
+ booted = true;
285
+ }
286
+ };
264
287
  var history = /* @__PURE__ */ new Map();
265
288
  var currentTickBatch = /* @__PURE__ */ new Set();
266
289
  var updateLog = [];
267
290
  var currentEffectSource = null;
268
291
  var tick = 0;
269
292
  var isBatching = false;
270
- displayBootLog(WINDOW_SIZE);
271
293
  var analyzeBasis = () => {
294
+ if (!config.debug) return;
272
295
  const entries = Array.from(history.entries());
273
296
  if (entries.length < 2) return;
274
297
  entries.forEach(([labelA, vecA], i) => {
@@ -281,6 +304,10 @@ var analyzeBasis = () => {
281
304
  });
282
305
  };
283
306
  var printBasisHealthReport = (threshold = 0.5) => {
307
+ if (!config.debug) {
308
+ console.warn("[Basis] Cannot generate report. Debug mode is OFF.");
309
+ return;
310
+ }
284
311
  displayHealthReport(history, calculateCosineSimilarity, threshold);
285
312
  };
286
313
  var beginEffectTracking = (label) => {
@@ -290,6 +317,7 @@ var endEffectTracking = () => {
290
317
  currentEffectSource = null;
291
318
  };
292
319
  var registerVariable = (label) => {
320
+ if (!config.debug) return;
293
321
  if (!history.has(label)) {
294
322
  history.set(label, new Array(WINDOW_SIZE).fill(0));
295
323
  }
@@ -298,6 +326,7 @@ var unregisterVariable = (label) => {
298
326
  history.delete(label);
299
327
  };
300
328
  var recordUpdate = (label) => {
329
+ if (!config.debug) return true;
301
330
  const now = Date.now();
302
331
  updateLog.push({ label, ts: now });
303
332
  updateLog = updateLog.filter((e) => now - e.ts < LOOP_WINDOW_MS);
@@ -330,6 +359,8 @@ if (typeof window !== "undefined") {
330
359
  window.printBasisReport = printBasisHealthReport;
331
360
  }
332
361
  var __testEngine__ = {
362
+ config,
363
+ configureBasis,
333
364
  history,
334
365
  currentTickBatch,
335
366
  registerVariable,
@@ -355,17 +386,43 @@ function useState(initialValue, label) {
355
386
  }, [effectiveLabel]);
356
387
  return [val, setter];
357
388
  }
389
+ function useReducer(reducer, initialArg, init, label) {
390
+ const effectiveLabel = typeof init === "string" ? init : label || "anonymous_reducer";
391
+ const reactInit = typeof init === "function" ? init : void 0;
392
+ const [state, dispatch] = (0, import_react.useReducer)(reducer, initialArg, reactInit);
393
+ (0, import_react.useEffect)(() => {
394
+ registerVariable(effectiveLabel);
395
+ return () => unregisterVariable(effectiveLabel);
396
+ }, [effectiveLabel]);
397
+ const basisDispatch = (0, import_react.useCallback)((action) => {
398
+ if (recordUpdate(effectiveLabel)) {
399
+ dispatch(action);
400
+ }
401
+ }, [effectiveLabel]);
402
+ return [state, basisDispatch];
403
+ }
358
404
  function useMemo(factory, depsOrLabel, label) {
359
405
  const isLabelAsSecondArg = typeof depsOrLabel === "string";
360
406
  const actualDeps = isLabelAsSecondArg ? void 0 : depsOrLabel;
361
407
  const effectiveLabel = isLabelAsSecondArg ? depsOrLabel : label || "anonymous_projection";
362
408
  (0, import_react.useEffect)(() => {
363
- if (window._basis_debug !== false) {
409
+ if (config.debug) {
364
410
  console.log(`%c [Basis] Valid Projection: "${effectiveLabel}" `, "color: #2ecc71; font-weight: bold;");
365
411
  }
366
412
  }, [effectiveLabel]);
367
413
  return (0, import_react.useMemo)(factory, actualDeps || []);
368
414
  }
415
+ function useCallback(callback, depsOrLabel, label) {
416
+ const isLabelAsSecondArg = typeof depsOrLabel === "string";
417
+ const actualDeps = isLabelAsSecondArg ? void 0 : depsOrLabel;
418
+ const effectiveLabel = isLabelAsSecondArg ? depsOrLabel : label || "anonymous_callback";
419
+ (0, import_react.useEffect)(() => {
420
+ if (config.debug) {
421
+ console.log(`%c [Basis] Stable Callback: "${effectiveLabel}" `, "color: #2ecc71; font-weight: bold;");
422
+ }
423
+ }, [effectiveLabel]);
424
+ return (0, import_react.useCallback)(callback, actualDeps || []);
425
+ }
369
426
  function useEffect(effect, depsOrLabel, label) {
370
427
  const isLabelAsSecondArg = typeof depsOrLabel === "string";
371
428
  const actualDeps = isLabelAsSecondArg ? void 0 : depsOrLabel;
@@ -377,20 +434,47 @@ function useEffect(effect, depsOrLabel, label) {
377
434
  return cleanup;
378
435
  }, actualDeps);
379
436
  }
380
- function useReducer(reducer, initialArg, init, label) {
381
- const effectiveLabel = typeof init === "string" ? init : label || "anonymous_reducer";
382
- const reactInit = typeof init === "function" ? init : void 0;
383
- const [state, dispatch] = (0, import_react.useReducer)(reducer, initialArg, reactInit);
437
+ function useLayoutEffect(effect, depsOrLabel, label) {
438
+ const isLabelAsSecondArg = typeof depsOrLabel === "string";
439
+ const actualDeps = isLabelAsSecondArg ? void 0 : depsOrLabel;
440
+ const effectiveLabel = isLabelAsSecondArg ? depsOrLabel : label || "anonymous_layout_effect";
441
+ (0, import_react.useLayoutEffect)(() => {
442
+ beginEffectTracking(effectiveLabel);
443
+ const cleanup = effect();
444
+ endEffectTracking();
445
+ return cleanup;
446
+ }, actualDeps);
447
+ }
448
+ function useInsertionEffect(effect, deps, _label) {
449
+ return (0, import_react.useInsertionEffect)(effect, deps);
450
+ }
451
+ function useTransition(_label) {
452
+ const [isPending, startTransition] = (0, import_react.useTransition)();
453
+ const effectiveLabel = _label || "anonymous_transition";
454
+ const basisStartTransition = (callback) => {
455
+ if (config.debug) {
456
+ console.log(`%c [Basis] Transition Started: "${effectiveLabel}" `, "color: #e67e22; font-weight: bold;");
457
+ }
458
+ startTransition(() => {
459
+ callback();
460
+ });
461
+ };
462
+ return [isPending, basisStartTransition];
463
+ }
464
+ function useDeferredValue(value, initialValueOrLabel, label) {
465
+ const isLabelAsSecondArg = typeof initialValueOrLabel === "string" && label === void 0;
466
+ const actualInitialValue = isLabelAsSecondArg ? void 0 : initialValueOrLabel;
467
+ const effectiveLabel = isLabelAsSecondArg ? initialValueOrLabel : label || "anonymous_deferred";
468
+ const deferredValue = (0, import_react.useDeferredValue)(value, actualInitialValue);
384
469
  (0, import_react.useEffect)(() => {
385
- registerVariable(effectiveLabel);
386
- return () => unregisterVariable(effectiveLabel);
387
- }, [effectiveLabel]);
388
- const basisDispatch = (0, import_react.useCallback)((action) => {
389
- if (recordUpdate(effectiveLabel)) {
390
- dispatch(action);
470
+ if (config.debug && value !== deferredValue) {
471
+ console.log(`%c [Basis] Value Deferred: "${effectiveLabel}" `, "color: #e67e22; font-weight: bold;");
391
472
  }
392
- }, [effectiveLabel]);
393
- return [state, basisDispatch];
473
+ }, [value, deferredValue, effectiveLabel]);
474
+ return deferredValue;
475
+ }
476
+ function useRef(initialValue, _label) {
477
+ return (0, import_react.useRef)(initialValue);
394
478
  }
395
479
  function createContext(defaultValue, label) {
396
480
  const context = (0, import_react.createContext)(defaultValue);
@@ -402,6 +486,18 @@ function createContext(defaultValue, label) {
402
486
  function useContext(context) {
403
487
  return (0, import_react.useContext)(context);
404
488
  }
489
+ function useId(_label) {
490
+ return (0, import_react.useId)();
491
+ }
492
+ function useDebugValue(value, formatter, _label) {
493
+ return (0, import_react.useDebugValue)(value, formatter);
494
+ }
495
+ function useImperativeHandle(ref, init, deps, _label) {
496
+ return (0, import_react.useImperativeHandle)(ref, init, deps);
497
+ }
498
+ function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot, _label) {
499
+ return (0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getServerSnapshot);
500
+ }
405
501
  var __test__ = {
406
502
  registerVariable,
407
503
  unregisterVariable,
@@ -418,9 +514,12 @@ var import_jsx_runtime = require("react/jsx-runtime");
418
514
  var BasisContext = (0, import_react2.createContext)({ debug: false });
419
515
  var isWeb2 = typeof window !== "undefined" && typeof window.document !== "undefined";
420
516
  var BasisProvider = ({ children, debug = true }) => {
421
- if (isWeb2) {
422
- window._basis_debug = debug;
423
- }
517
+ (0, import_react2.useLayoutEffect)(() => {
518
+ configureBasis({ debug });
519
+ if (isWeb2) {
520
+ window._basis_debug = debug;
521
+ }
522
+ }, [debug]);
424
523
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(BasisContext.Provider, { value: { debug }, children: [
425
524
  children,
426
525
  debug && isWeb2 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: {
@@ -446,6 +545,8 @@ var useBasisConfig = () => (0, import_react2.useContext)(BasisContext);
446
545
  __testEngine__,
447
546
  __test__,
448
547
  beginEffectTracking,
548
+ config,
549
+ configureBasis,
449
550
  createContext,
450
551
  currentTickBatch,
451
552
  endEffectTracking,
@@ -455,10 +556,20 @@ var useBasisConfig = () => (0, import_react2.useContext)(BasisContext);
455
556
  registerVariable,
456
557
  unregisterVariable,
457
558
  useBasisConfig,
559
+ useCallback,
458
560
  useContext,
561
+ useDebugValue,
562
+ useDeferredValue,
459
563
  useEffect,
564
+ useId,
565
+ useImperativeHandle,
566
+ useInsertionEffect,
567
+ useLayoutEffect,
460
568
  useMemo,
461
569
  useReducer,
462
- useState
570
+ useRef,
571
+ useState,
572
+ useSyncExternalStore,
573
+ useTransition
463
574
  });
464
575
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/logger.ts","../src/core/math.ts","../src/core/constants.ts","../src/engine.ts","../src/hooks.ts","../src/context.tsx"],"sourcesContent":["// src/index.ts\n\nexport * from './engine';\nexport * from './hooks';\nexport * from './context';\nexport type { \n ReactNode, \n ReactElement, \n FC, \n PropsWithChildren, \n Context,\n Dispatch,\n SetStateAction,\n Reducer,\n CSSProperties\n} from 'react';","// src/core/logger.ts\n\nconst isWeb = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\nconst STYLES = {\n basis: \"background: #6c5ce7; color: white; font-weight: bold; padding: 2px 6px; border-radius: 3px;\",\n version: \"background: #a29bfe; color: #2d3436; padding: 2px 6px; border-radius: 3px; margin-left: -4px;\",\n\n headerRed: \"background: #d63031; color: white; font-weight: bold; padding: 4px 8px; border-radius: 4px;\",\n headerBlue: \"background: #0984e3; color: white; font-weight: bold; padding: 4px 8px; border-radius: 4px;\",\n headerGreen: \"background: #00b894; color: white; font-weight: bold; padding: 4px 8px; border-radius: 4px;\",\n\n label: \"background: #dfe6e9; color: #2d3436; padding: 0 4px; border-radius: 3px; font-family: monospace; font-weight: bold; border: 1px solid #b2bec3;\",\n location: \"color: #0984e3; font-family: monospace; font-weight: bold;\",\n math: \"color: #636e72; font-style: italic; font-family: serif;\",\n\n codeBlock: `\n background: #1e1e1e; \n color: #9cdcfe; \n padding: 8px 12px; \n display: block; \n margin: 4px 0; \n border-left: 3px solid #00b894; \n font-family: 'Fira Code', monospace; \n line-height: 1.4; \n border-radius: 0 3px 3px 0;\n `,\n\n dim: \"color: #e84393; font-weight: bold;\",\n bold: \"font-weight: bold;\"\n};\n\nconst parseLabel = (label: string) => {\n const parts = label.split(' -> ');\n return {\n file: parts[0] || \"Unknown\",\n name: parts[1] || label\n };\n};\n\nconst logBasis = (message: string, ...styles: string[]) => {\n if (isWeb) {\n console.log(message, ...styles);\n } else {\n console.log(message.replace(/%c/g, ''));\n }\n};\n\nexport const displayBootLog = (windowSize: number) => {\n logBasis(\n `%cBasis%cAuditor v0.1.4%c Monitoring State Space | Window: ${windowSize} ticks`,\n STYLES.basis,\n STYLES.version,\n \"color: #636e72; font-style: italic; margin-left: 8px;\"\n );\n};\n\nexport const displayRedundancyAlert = (labelA: string, labelB: string, sim: number, totalDimensions: number) => {\n const infoA = parseLabel(labelA);\n const infoB = parseLabel(labelB);\n const isCrossFile = infoA.file !== infoB.file;\n\n if (isWeb) {\n console.group(`%c 📐 BASIS | DIMENSION COLLAPSE DETECTED `, STYLES.headerRed);\n console.log(`%c📍 Location: %c${isCrossFile ? `${infoA.file} & ${infoB.file}` : infoA.file}`, STYLES.bold, STYLES.location);\n console.log(\n `%cAnalysis:%c Vectors %c${infoA.name}%c and %c${infoB.name}%c are collinear (redundant).`,\n STYLES.bold, \"\", STYLES.label, \"\", STYLES.label, \"\"\n );\n console.log(\n `%cHow to fix:%c Project %c${infoB.name}%c as a derived value:\n%c// 🛠️ Basis Fix: Remove useState, use useMemo\nconst ${infoB.name} = useMemo(() => deriveFrom(${infoA.name}), [${infoA.name}]);%c`,\n \"color: #00b894; font-weight: bold;\", \"\",\n \"color: #e84393; font-weight: bold;\", \"\",\n STYLES.codeBlock, \"\"\n );\n console.groupCollapsed(`%c 🔬 Proof Details `, \"color: #636e72; font-size: 10px; cursor: pointer;\");\n console.table({\n \"Similarity\": `${(sim * 100).toFixed(2)}%`,\n \"Linear Dependency\": \"TRUE\",\n \"Rank\": totalDimensions - 1\n });\n console.groupEnd();\n console.groupEnd();\n } else {\n console.log(`[BASIS] REDUNDANCY DETECTED: ${infoA.name} <-> ${infoB.name} (${(sim * 100).toFixed(0)}% similarity)`);\n console.log(`Location: ${isCrossFile ? `${infoA.file} & ${infoB.file}` : infoA.file}`);\n }\n};\n\nexport const displayCausalHint = (targetLabel: string, sourceLabel: string) => {\n const target = parseLabel(targetLabel);\n const source = parseLabel(sourceLabel);\n\n const isCrossFile = target.file !== source.file;\n const locationPath = isCrossFile\n ? `${source.file} ➔ ${target.file}`\n : target.file;\n\n if (isWeb) {\n console.groupCollapsed(`%c 💡 BASIS | CAUSALITY (Sequential Update) `, STYLES.headerBlue);\n console.log(`%c📍 Location: %c${locationPath}`, STYLES.bold, STYLES.location);\n console.log(\n `%cSequence:%c %c${source.name}%c ➔ Effect ➔ %c${target.name}%c`,\n STYLES.bold, \"\", STYLES.label, \"\", STYLES.label, \"\"\n );\n console.log(\n `%cObservation:%c Variable %c${target.name}%c is being manually synchronized. This creates a %c\"Double Render Cycle\"%c.`,\n STYLES.bold, \"\", STYLES.label, \"\", \"color: #d63031; font-weight: bold;\", \"\"\n );\n console.groupEnd();\n } else {\n console.log(`[BASIS] CAUSALITY: ${source.name} ➔ ${target.name} (Double Render Cycle)`);\n }\n};\n\nexport const displayInfiniteLoop = (label: string) => {\n const info = parseLabel(label);\n if (isWeb) {\n console.group(`%c 🛑 BASIS CRITICAL | CIRCUIT BREAKER `, STYLES.headerRed);\n console.error(\n `Infinite oscillation detected on: %c${info.name}%c\\nExecution halted to prevent browser thread lock.`,\n \"color: white; background: #d63031; padding: 2px 4px; border-radius: 3px;\", \"\"\n );\n console.groupEnd();\n } else {\n console.log(`[BASIS CRITICAL] INFINITE LOOP ON: ${info.name}. Execution halted.`);\n }\n};\n\nexport const displayHealthReport = (\n history: Map<string, number[]>,\n similarityFn: (A: number[], B: number[]) => number,\n threshold: number\n) => {\n const entries = Array.from(history.entries());\n const totalVars = entries.length;\n if (totalVars === 0) return;\n\n const clusters: string[][] = [];\n const processed = new Set<string>();\n let independentCount = 0;\n\n entries.forEach(([labelA, vecA]) => {\n if (processed.has(labelA)) return;\n const currentCluster = [labelA];\n processed.add(labelA);\n entries.forEach(([labelB, vecB]) => {\n if (labelA === labelB || processed.has(labelB)) return;\n const sim = similarityFn(vecA, vecB);\n if (sim > threshold) {\n currentCluster.push(labelB);\n processed.add(labelB);\n }\n });\n if (currentCluster.length > 1) {\n clusters.push(currentCluster);\n } else {\n independentCount++;\n }\n });\n\n const systemRank = independentCount + clusters.length;\n const efficiency = (systemRank / totalVars) * 100;\n\n if (isWeb) {\n console.group(`%c 📊 BASIS | SYSTEM HEALTH REPORT `, STYLES.headerGreen);\n console.log(\n `%cBasis Efficiency: %c${efficiency.toFixed(1)}% %c(Rank: ${systemRank}/${totalVars})`,\n STYLES.bold,\n `color: ${efficiency > 85 ? '#00b894' : '#d63031'}; font-size: 16px; font-weight: bold;`,\n \"color: #636e72; font-style: italic;\"\n );\n\n if (clusters.length > 0) {\n console.log(`%cDetected ${clusters.length} Redundancy Clusters:`, \"font-weight: bold; color: #e17055; margin-top: 10px;\");\n clusters.forEach((cluster, idx) => {\n const names = cluster.map(l => parseLabel(l).name).join(' ⟷ ');\n console.log(` %c${idx + 1}%c ${names}`, \"background: #e17055; color: white; border-radius: 50%; padding: 0 5px;\", \"font-family: monospace;\");\n });\n } else {\n console.log(\"%c✨ All state variables are linearly independent. Your Basis is optimal.\", \"color: #00b894; font-weight: bold; margin-top: 10px;\");\n }\n\n if (totalVars > 0 && totalVars < 15) {\n console.groupCollapsed(\"%cView Full Correlation Matrix\", \"color: #636e72; font-size: 11px;\");\n const matrix: any = {};\n entries.forEach(([labelA]) => {\n const nameA = parseLabel(labelA).name;\n matrix[nameA] = {};\n entries.forEach(([labelB]) => {\n const nameB = parseLabel(labelB).name;\n const sim = similarityFn(history.get(labelA)!, history.get(labelB)!);\n matrix[nameA][nameB] = sim > threshold ? `❌ ${(sim * 100).toFixed(0)}%` : `✅`;\n });\n });\n console.table(matrix);\n console.groupEnd();\n }\n console.groupEnd();\n } else {\n console.log(`[BASIS HEALTH] Efficiency: ${efficiency.toFixed(1)}% (Rank: ${systemRank}/${totalVars})`);\n if (clusters.length > 0) {\n console.log(`Redundancy Clusters: ${clusters.length}`);\n }\n }\n};","// src/core/math.ts\n\nexport const calculateCosineSimilarity = (A: number[], B: number[]): number => {\n let dot = 0, magA = 0, magB = 0;\n for (let i = 0; i < A.length; i++) {\n dot += A[i] * B[i];\n magA += A[i] * A[i];\n magB += B[i] * B[i];\n }\n return magA && magB ? dot / (Math.sqrt(magA) * Math.sqrt(magB)) : 0;\n};","// src/core/constants.ts\n\nexport const WINDOW_SIZE = 50;\nexport const SIMILARITY_THRESHOLD = 0.88;\nexport const LOOP_THRESHOLD = 25;\nexport const LOOP_WINDOW_MS = 500;\nexport const ANALYSIS_INTERVAL = 5;","// src/engine.ts\n\nimport * as UI from './core/logger';\nimport { calculateCosineSimilarity } from './core/math';\nimport { \n WINDOW_SIZE, \n SIMILARITY_THRESHOLD, \n LOOP_THRESHOLD, \n LOOP_WINDOW_MS, \n ANALYSIS_INTERVAL \n} from './core/constants';\n\nexport const history = new Map<string, number[]>();\nexport const currentTickBatch = new Set<string>();\nlet updateLog: { label: string; ts: number }[] = [];\nlet currentEffectSource: string | null = null; \nlet tick = 0;\nlet isBatching = false;\n\nUI.displayBootLog(WINDOW_SIZE);\n\nconst analyzeBasis = () => {\n const entries = Array.from(history.entries());\n if (entries.length < 2) return;\n\n entries.forEach(([labelA, vecA], i) => {\n entries.slice(i + 1).forEach(([labelB, vecB]) => {\n const sim = calculateCosineSimilarity(vecA, vecB);\n \n if (sim > SIMILARITY_THRESHOLD) {\n UI.displayRedundancyAlert(labelA, labelB, sim, history.size);\n }\n });\n });\n};\n\nexport const printBasisHealthReport = (threshold = 0.5) => {\n UI.displayHealthReport(history, calculateCosineSimilarity, threshold);\n};\n\nexport const beginEffectTracking = (label: string) => { currentEffectSource = label; };\nexport const endEffectTracking = () => { currentEffectSource = null; };\n\nexport const registerVariable = (label: string) => {\n if (!history.has(label)) {\n history.set(label, new Array(WINDOW_SIZE).fill(0));\n }\n};\n\nexport const unregisterVariable = (label: string) => {\n history.delete(label);\n};\n\nexport const recordUpdate = (label: string): boolean => {\n const now = Date.now();\n\n updateLog.push({ label, ts: now });\n updateLog = updateLog.filter(e => now - e.ts < LOOP_WINDOW_MS);\n if (updateLog.filter(e => e.label === label).length > LOOP_THRESHOLD) {\n UI.displayInfiniteLoop(label);\n return false;\n }\n\n if (currentEffectSource && currentEffectSource !== label) {\n UI.displayCausalHint(label, currentEffectSource);\n }\n\n currentTickBatch.add(label);\n\n if (!isBatching) {\n isBatching = true;\n setTimeout(() => {\n tick++;\n history.forEach((vec, l) => {\n vec.shift();\n vec.push(currentTickBatch.has(l) ? 1 : 0);\n });\n\n currentTickBatch.clear();\n isBatching = false;\n \n if (tick % ANALYSIS_INTERVAL === 0) {\n analyzeBasis();\n }\n }, 20);\n }\n\n return true;\n};\n\nif (typeof window !== 'undefined') {\n (window as any).printBasisReport = printBasisHealthReport;\n}\n\nexport const __testEngine__ = {\n history,\n currentTickBatch,\n registerVariable,\n recordUpdate,\n printBasisHealthReport,\n beginEffectTracking,\n endEffectTracking,\n};","// src/hooks.ts\n\nimport { \n useState as reactUseState, \n useEffect as reactUseEffect, \n useMemo as reactUseMemo, \n useReducer as reactUseReducer,\n useContext as reactUseContext,\n createContext as reactCreateContext,\n useCallback \n} from 'react';\n\nimport type { \n Reducer, \n Context,\n Dispatch,\n SetStateAction,\n DependencyList,\n EffectCallback\n} from 'react';\n\nimport { \n registerVariable, \n unregisterVariable, \n recordUpdate, \n beginEffectTracking, \n endEffectTracking \n} from './engine';\n\nimport * as engine from './engine';\n\nexport type { \n ReactNode, \n FC, \n PropsWithChildren, \n Context, \n ReactElement,\n Dispatch,\n SetStateAction,\n Reducer,\n CSSProperties,\n EffectCallback,\n DependencyList\n} from 'react';\n\nexport function useState<T>(initialValue: T, label?: string): [T, Dispatch<SetStateAction<T>>] {\n const [val, setVal] = reactUseState(initialValue);\n const effectiveLabel = label || 'anonymous_state';\n\n reactUseEffect(() => {\n registerVariable(effectiveLabel);\n return () => unregisterVariable(effectiveLabel);\n }, [effectiveLabel]);\n\n const setter = useCallback((newValue: SetStateAction<T>) => {\n if (recordUpdate(effectiveLabel)) {\n setVal(newValue);\n }\n }, [effectiveLabel]);\n\n return [val, setter];\n}\n\nexport function useMemo<T>(factory: () => T, depsOrLabel?: DependencyList | string, label?: string): T {\n const isLabelAsSecondArg = typeof depsOrLabel === 'string';\n \n const actualDeps = isLabelAsSecondArg ? undefined : (depsOrLabel as DependencyList);\n const effectiveLabel = isLabelAsSecondArg ? (depsOrLabel as string) : (label || 'anonymous_projection');\n \n reactUseEffect(() => {\n if ((window as any)._basis_debug !== false) {\n console.log(`%c [Basis] Valid Projection: \"${effectiveLabel}\" `, \"color: #2ecc71; font-weight: bold;\");\n }\n }, [effectiveLabel]);\n\n return reactUseMemo(factory, actualDeps || []);\n}\n\nexport function useEffect(effect: EffectCallback, depsOrLabel?: DependencyList | string, label?: string) {\n const isLabelAsSecondArg = typeof depsOrLabel === 'string';\n \n const actualDeps = isLabelAsSecondArg ? undefined : (depsOrLabel as DependencyList);\n const effectiveLabel = isLabelAsSecondArg ? (depsOrLabel as string) : (label || 'anonymous_effect');\n\n reactUseEffect(() => {\n beginEffectTracking(effectiveLabel);\n const cleanup = effect();\n endEffectTracking();\n return cleanup;\n }, actualDeps);\n}\n\nexport function useReducer<S, A, I>(\n reducer: Reducer<S, A>,\n initialArg: I & S,\n init?: any,\n label?: string\n): [S, Dispatch<A>] {\n\n const effectiveLabel = typeof init === 'string' ? init : (label || 'anonymous_reducer');\n\n const reactInit = typeof init === 'function' ? init : undefined;\n\n const [state, dispatch] = reactUseReducer(reducer, initialArg, reactInit);\n\n reactUseEffect(() => {\n registerVariable(effectiveLabel);\n return () => unregisterVariable(effectiveLabel);\n }, [effectiveLabel]);\n\n const basisDispatch = useCallback((action: A) => {\n if (recordUpdate(effectiveLabel)) {\n dispatch(action);\n }\n }, [effectiveLabel]);\n\n return [state, basisDispatch];\n}\n\nexport function createContext<T>(defaultValue: T, label?: string): Context<T> {\n const context = reactCreateContext(defaultValue);\n if (label) {\n (context as any)._basis_label = label;\n }\n return context;\n}\n\nexport function useContext<T>(context: Context<T>): T {\n return reactUseContext(context);\n}\n\nexport const __test__ = {\n registerVariable,\n unregisterVariable,\n recordUpdate,\n beginEffectTracking,\n endEffectTracking,\n history: (engine as any).history,\n currentTickBatch: (engine as any).currentTickBatch\n};","// src/context.tsx\nimport React, { createContext, useContext, ReactNode } from 'react';\n\nconst BasisContext = createContext({ debug: false });\n\nconst isWeb = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\ninterface BasisProviderProps {\n children: ReactNode;\n debug?: boolean;\n}\n\nexport const BasisProvider: React.FC<BasisProviderProps> = ({ children, debug = true }) => {\n if (isWeb) {\n (window as any)._basis_debug = debug;\n }\n\n return (\n <BasisContext.Provider value={{ debug }}>\n {children}\n {(debug && isWeb) && (\n <div style={{ \n position: 'fixed', bottom: 10, right: 10, background: 'black', color: '#0f0', \n padding: '5px 10px', fontSize: '10px', fontFamily: 'monospace', \n border: '1px solid #0f0', zIndex: 99999, borderRadius: '4px', pointerEvents: 'none'\n }}>\n BASIS_ENGINE: ACTIVE\n </div>\n )}\n </BasisContext.Provider>\n );\n};\n\nexport const useBasisConfig = () => useContext(BasisContext);"],"mappings":"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","names":["history","reactUseState","reactUseEffect","reactUseMemo","reactUseReducer","reactCreateContext","reactUseContext","import_react","isWeb"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/logger.ts","../src/core/math.ts","../src/core/constants.ts","../src/engine.ts","../src/hooks.ts","../src/context.tsx"],"sourcesContent":["// src/index.ts\n\nexport * from './engine';\nexport * from './hooks';\nexport * from './context';\nexport type { \n ReactNode, \n ReactElement, \n FC, \n PropsWithChildren, \n Context,\n Dispatch,\n SetStateAction,\n Reducer,\n CSSProperties\n} from 'react';","// src/core/logger.ts\n\nconst isWeb = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\nconst STYLES = {\n basis: \"background: #6c5ce7; color: white; font-weight: bold; padding: 2px 6px; border-radius: 3px;\",\n version: \"background: #a29bfe; color: #2d3436; padding: 2px 6px; border-radius: 3px; margin-left: -4px;\",\n\n headerRed: \"background: #d63031; color: white; font-weight: bold; padding: 4px 8px; border-radius: 4px;\",\n headerBlue: \"background: #0984e3; color: white; font-weight: bold; padding: 4px 8px; border-radius: 4px;\",\n headerGreen: \"background: #00b894; color: white; font-weight: bold; padding: 4px 8px; border-radius: 4px;\",\n\n label: \"background: #dfe6e9; color: #2d3436; padding: 0 4px; border-radius: 3px; font-family: monospace; font-weight: bold; border: 1px solid #b2bec3;\",\n location: \"color: #0984e3; font-family: monospace; font-weight: bold;\",\n math: \"color: #636e72; font-style: italic; font-family: serif;\",\n\n codeBlock: `\n background: #1e1e1e; \n color: #9cdcfe; \n padding: 8px 12px; \n display: block; \n margin: 4px 0; \n border-left: 3px solid #00b894; \n font-family: 'Fira Code', monospace; \n line-height: 1.4; \n border-radius: 0 3px 3px 0;\n `,\n\n dim: \"color: #e84393; font-weight: bold;\",\n bold: \"font-weight: bold;\"\n};\n\nconst parseLabel = (label: string) => {\n const parts = label.split(' -> ');\n return {\n file: parts[0] || \"Unknown\",\n name: parts[1] || label\n };\n};\n\nconst logBasis = (message: string, ...styles: string[]) => {\n if (isWeb) {\n console.log(message, ...styles);\n } else {\n console.log(message.replace(/%c/g, ''));\n }\n};\n\nexport const displayBootLog = (windowSize: number) => {\n logBasis(\n `%cBasis%cAuditor v0.1.4%c Monitoring State Space | Window: ${windowSize} ticks`,\n STYLES.basis,\n STYLES.version,\n \"color: #636e72; font-style: italic; margin-left: 8px;\"\n );\n};\n\nexport const displayRedundancyAlert = (labelA: string, labelB: string, sim: number, totalDimensions: number) => {\n const infoA = parseLabel(labelA);\n const infoB = parseLabel(labelB);\n const isCrossFile = infoA.file !== infoB.file;\n\n if (isWeb) {\n console.group(`%c 📐 BASIS | DIMENSION COLLAPSE DETECTED `, STYLES.headerRed);\n console.log(`%c📍 Location: %c${isCrossFile ? `${infoA.file} & ${infoB.file}` : infoA.file}`, STYLES.bold, STYLES.location);\n console.log(\n `%cAnalysis:%c Vectors %c${infoA.name}%c and %c${infoB.name}%c are collinear (redundant).`,\n STYLES.bold, \"\", STYLES.label, \"\", STYLES.label, \"\"\n );\n console.log(\n `%cHow to fix:%c Project %c${infoB.name}%c as a derived value:\n%c// 🛠️ Basis Fix: Remove useState, use useMemo\nconst ${infoB.name} = useMemo(() => deriveFrom(${infoA.name}), [${infoA.name}]);%c`,\n \"color: #00b894; font-weight: bold;\", \"\",\n \"color: #e84393; font-weight: bold;\", \"\",\n STYLES.codeBlock, \"\"\n );\n console.groupCollapsed(`%c 🔬 Proof Details `, \"color: #636e72; font-size: 10px; cursor: pointer;\");\n console.table({\n \"Similarity\": `${(sim * 100).toFixed(2)}%`,\n \"Linear Dependency\": \"TRUE\",\n \"Rank\": totalDimensions - 1\n });\n console.groupEnd();\n console.groupEnd();\n } else {\n console.log(`[BASIS] REDUNDANCY DETECTED: ${infoA.name} <-> ${infoB.name} (${(sim * 100).toFixed(0)}% similarity)`);\n console.log(`Location: ${isCrossFile ? `${infoA.file} & ${infoB.file}` : infoA.file}`);\n }\n};\n\nexport const displayCausalHint = (targetLabel: string, sourceLabel: string) => {\n const target = parseLabel(targetLabel);\n const source = parseLabel(sourceLabel);\n\n const isCrossFile = target.file !== source.file;\n const locationPath = isCrossFile\n ? `${source.file} ➔ ${target.file}`\n : target.file;\n\n if (isWeb) {\n console.groupCollapsed(`%c 💡 BASIS | CAUSALITY (Sequential Update) `, STYLES.headerBlue);\n console.log(`%c📍 Location: %c${locationPath}`, STYLES.bold, STYLES.location);\n console.log(\n `%cSequence:%c %c${source.name}%c ➔ Effect ➔ %c${target.name}%c`,\n STYLES.bold, \"\", STYLES.label, \"\", STYLES.label, \"\"\n );\n console.log(\n `%cObservation:%c Variable %c${target.name}%c is being manually synchronized. This creates a %c\"Double Render Cycle\"%c.`,\n STYLES.bold, \"\", STYLES.label, \"\", \"color: #d63031; font-weight: bold;\", \"\"\n );\n console.groupEnd();\n } else {\n console.log(`[BASIS] CAUSALITY: ${source.name} ➔ ${target.name} (Double Render Cycle)`);\n }\n};\n\nexport const displayInfiniteLoop = (label: string) => {\n const info = parseLabel(label);\n if (isWeb) {\n console.group(`%c 🛑 BASIS CRITICAL | CIRCUIT BREAKER `, STYLES.headerRed);\n console.error(\n `Infinite oscillation detected on: %c${info.name}%c\\nExecution halted to prevent browser thread lock.`,\n \"color: white; background: #d63031; padding: 2px 4px; border-radius: 3px;\", \"\"\n );\n console.groupEnd();\n } else {\n console.log(`[BASIS CRITICAL] INFINITE LOOP ON: ${info.name}. Execution halted.`);\n }\n};\n\nexport const displayHealthReport = (\n history: Map<string, number[]>,\n similarityFn: (A: number[], B: number[]) => number,\n threshold: number\n) => {\n const entries = Array.from(history.entries());\n const totalVars = entries.length;\n if (totalVars === 0) return;\n\n const clusters: string[][] = [];\n const processed = new Set<string>();\n let independentCount = 0;\n\n entries.forEach(([labelA, vecA]) => {\n if (processed.has(labelA)) return;\n const currentCluster = [labelA];\n processed.add(labelA);\n entries.forEach(([labelB, vecB]) => {\n if (labelA === labelB || processed.has(labelB)) return;\n const sim = similarityFn(vecA, vecB);\n if (sim > threshold) {\n currentCluster.push(labelB);\n processed.add(labelB);\n }\n });\n if (currentCluster.length > 1) {\n clusters.push(currentCluster);\n } else {\n independentCount++;\n }\n });\n\n const systemRank = independentCount + clusters.length;\n const efficiency = (systemRank / totalVars) * 100;\n\n if (isWeb) {\n console.group(`%c 📊 BASIS | SYSTEM HEALTH REPORT `, STYLES.headerGreen);\n console.log(\n `%cBasis Efficiency: %c${efficiency.toFixed(1)}% %c(Rank: ${systemRank}/${totalVars})`,\n STYLES.bold,\n `color: ${efficiency > 85 ? '#00b894' : '#d63031'}; font-size: 16px; font-weight: bold;`,\n \"color: #636e72; font-style: italic;\"\n );\n\n if (clusters.length > 0) {\n console.log(`%cDetected ${clusters.length} Redundancy Clusters:`, \"font-weight: bold; color: #e17055; margin-top: 10px;\");\n clusters.forEach((cluster, idx) => {\n const names = cluster.map(l => parseLabel(l).name).join(' ⟷ ');\n console.log(` %c${idx + 1}%c ${names}`, \"background: #e17055; color: white; border-radius: 50%; padding: 0 5px;\", \"font-family: monospace;\");\n });\n } else {\n console.log(\"%c✨ All state variables are linearly independent. Your Basis is optimal.\", \"color: #00b894; font-weight: bold; margin-top: 10px;\");\n }\n\n if (totalVars > 0 && totalVars < 15) {\n console.groupCollapsed(\"%cView Full Correlation Matrix\", \"color: #636e72; font-size: 11px;\");\n const matrix: any = {};\n entries.forEach(([labelA]) => {\n const nameA = parseLabel(labelA).name;\n matrix[nameA] = {};\n entries.forEach(([labelB]) => {\n const nameB = parseLabel(labelB).name;\n const sim = similarityFn(history.get(labelA)!, history.get(labelB)!);\n matrix[nameA][nameB] = sim > threshold ? `❌ ${(sim * 100).toFixed(0)}%` : `✅`;\n });\n });\n console.table(matrix);\n console.groupEnd();\n }\n console.groupEnd();\n } else {\n console.log(`[BASIS HEALTH] Efficiency: ${efficiency.toFixed(1)}% (Rank: ${systemRank}/${totalVars})`);\n if (clusters.length > 0) {\n console.log(`Redundancy Clusters: ${clusters.length}`);\n }\n }\n};","// src/core/math.ts\n\nexport const calculateCosineSimilarity = (A: number[], B: number[]): number => {\n let dot = 0, magA = 0, magB = 0;\n for (let i = 0; i < A.length; i++) {\n dot += A[i] * B[i];\n magA += A[i] * A[i];\n magB += B[i] * B[i];\n }\n return magA && magB ? dot / (Math.sqrt(magA) * Math.sqrt(magB)) : 0;\n};","// src/core/constants.ts\n\nexport const WINDOW_SIZE = 50;\nexport const SIMILARITY_THRESHOLD = 0.88;\nexport const LOOP_THRESHOLD = 25;\nexport const LOOP_WINDOW_MS = 500;\nexport const ANALYSIS_INTERVAL = 5;","// src/engine.ts\n\nimport * as UI from './core/logger';\nimport { calculateCosineSimilarity } from './core/math';\nimport { \n WINDOW_SIZE, \n SIMILARITY_THRESHOLD, \n LOOP_THRESHOLD, \n LOOP_WINDOW_MS, \n ANALYSIS_INTERVAL \n} from './core/constants';\n\nexport interface BasisConfig {\n debug: boolean;\n}\n\nexport let config: BasisConfig = {\n debug: false,\n};\n\nlet booted = false;\n\nexport const configureBasis = (newConfig: Partial<BasisConfig>) => {\n config = { ...config, ...newConfig };\n\n if (config.debug && !booted) {\n UI.displayBootLog(WINDOW_SIZE);\n booted = true;\n }\n};\n\nexport const history = new Map<string, number[]>();\nexport const currentTickBatch = new Set<string>();\nlet updateLog: { label: string; ts: number }[] = [];\nlet currentEffectSource: string | null = null; \nlet tick = 0;\nlet isBatching = false;\n\nconst analyzeBasis = () => {\n if (!config.debug) return;\n\n const entries = Array.from(history.entries());\n if (entries.length < 2) return;\n\n entries.forEach(([labelA, vecA], i) => {\n entries.slice(i + 1).forEach(([labelB, vecB]) => {\n const sim = calculateCosineSimilarity(vecA, vecB);\n \n if (sim > SIMILARITY_THRESHOLD) {\n UI.displayRedundancyAlert(labelA, labelB, sim, history.size);\n }\n });\n });\n};\n\nexport const printBasisHealthReport = (threshold = 0.5) => {\n if (!config.debug) {\n console.warn(\"[Basis] Cannot generate report. Debug mode is OFF.\");\n return;\n }\n UI.displayHealthReport(history, calculateCosineSimilarity, threshold);\n};\n\nexport const beginEffectTracking = (label: string) => { currentEffectSource = label; };\nexport const endEffectTracking = () => { currentEffectSource = null; };\n\nexport const registerVariable = (label: string) => {\n if (!config.debug) return; \n\n if (!history.has(label)) {\n history.set(label, new Array(WINDOW_SIZE).fill(0));\n }\n};\n\nexport const unregisterVariable = (label: string) => {\n history.delete(label);\n};\n\nexport const recordUpdate = (label: string): boolean => {\n if (!config.debug) return true;\n\n const now = Date.now();\n\n updateLog.push({ label, ts: now });\n updateLog = updateLog.filter(e => now - e.ts < LOOP_WINDOW_MS);\n if (updateLog.filter(e => e.label === label).length > LOOP_THRESHOLD) {\n UI.displayInfiniteLoop(label);\n return false;\n }\n\n if (currentEffectSource && currentEffectSource !== label) {\n UI.displayCausalHint(label, currentEffectSource);\n }\n\n currentTickBatch.add(label);\n\n if (!isBatching) {\n isBatching = true;\n setTimeout(() => {\n tick++;\n history.forEach((vec, l) => {\n vec.shift();\n vec.push(currentTickBatch.has(l) ? 1 : 0);\n });\n\n currentTickBatch.clear();\n isBatching = false;\n \n if (tick % ANALYSIS_INTERVAL === 0) {\n analyzeBasis();\n }\n }, 20);\n }\n\n return true;\n};\n\nif (typeof window !== 'undefined') {\n (window as any).printBasisReport = printBasisHealthReport;\n}\n\nexport const __testEngine__ = {\n config,\n configureBasis,\n history,\n currentTickBatch,\n registerVariable,\n recordUpdate,\n printBasisHealthReport,\n beginEffectTracking,\n endEffectTracking,\n};","// src/hooks.ts\n\nimport {\n useState as reactUseState,\n useEffect as reactUseEffect,\n useMemo as reactUseMemo,\n useReducer as reactUseReducer,\n useContext as reactUseContext,\n createContext as reactCreateContext,\n useRef as reactUseRef,\n useLayoutEffect as reactUseLayoutEffect,\n useCallback as reactUseCallback,\n useId as reactUseId,\n useDebugValue as reactUseDebugValue,\n useImperativeHandle as reactUseImperativeHandle,\n useInsertionEffect as reactUseInsertionEffect,\n useSyncExternalStore as reactUseSyncExternalStore,\n useTransition as reactUseTransition, \n useDeferredValue as reactUseDeferredValue \n} from 'react';\n\nimport type {\n Reducer,\n Context,\n Dispatch,\n SetStateAction,\n DependencyList,\n EffectCallback\n} from 'react';\n\nimport {\n registerVariable,\n unregisterVariable,\n recordUpdate,\n beginEffectTracking,\n endEffectTracking,\n config\n} from './engine';\n\nimport * as engine from './engine';\n\nexport type {\n ReactNode,\n FC,\n PropsWithChildren,\n Context,\n ReactElement,\n Dispatch,\n SetStateAction,\n Reducer,\n CSSProperties,\n EffectCallback,\n DependencyList\n} from 'react';\n\n// --- STATE HOOKS ---\n\nexport function useState<T>(initialValue: T, label?: string): [T, Dispatch<SetStateAction<T>>] {\n const [val, setVal] = reactUseState(initialValue);\n const effectiveLabel = label || 'anonymous_state';\n\n reactUseEffect(() => {\n registerVariable(effectiveLabel);\n return () => unregisterVariable(effectiveLabel);\n }, [effectiveLabel]);\n\n const setter = reactUseCallback((newValue: SetStateAction<T>) => {\n if (recordUpdate(effectiveLabel)) {\n setVal(newValue);\n }\n }, [effectiveLabel]);\n\n return [val, setter];\n}\n\nexport function useReducer<S, A, I>(\n reducer: Reducer<S, A>,\n initialArg: I & S,\n init?: any,\n label?: string\n): [S, Dispatch<A>] {\n const effectiveLabel = typeof init === 'string' ? init : (label || 'anonymous_reducer');\n const reactInit = typeof init === 'function' ? init : undefined;\n\n const [state, dispatch] = reactUseReducer(reducer, initialArg, reactInit);\n\n reactUseEffect(() => {\n registerVariable(effectiveLabel);\n return () => unregisterVariable(effectiveLabel);\n }, [effectiveLabel]);\n\n const basisDispatch = reactUseCallback((action: A) => {\n if (recordUpdate(effectiveLabel)) {\n dispatch(action);\n }\n }, [effectiveLabel]);\n\n return [state, basisDispatch];\n}\n\n// --- MEMOIZATION & CALLBACKS ---\n\nexport function useMemo<T>(factory: () => T, depsOrLabel?: DependencyList | string, label?: string): T {\n const isLabelAsSecondArg = typeof depsOrLabel === 'string';\n const actualDeps = isLabelAsSecondArg ? undefined : (depsOrLabel as DependencyList);\n const effectiveLabel = isLabelAsSecondArg ? (depsOrLabel as string) : (label || 'anonymous_projection');\n\n reactUseEffect(() => {\n if (config.debug) {\n console.log(`%c [Basis] Valid Projection: \"${effectiveLabel}\" `, \"color: #2ecc71; font-weight: bold;\");\n }\n }, [effectiveLabel]);\n\n return reactUseMemo(factory, actualDeps || []);\n}\n\nexport function useCallback<T extends (...args: any[]) => any>(\n callback: T,\n depsOrLabel?: DependencyList | string,\n label?: string\n): T {\n const isLabelAsSecondArg = typeof depsOrLabel === 'string';\n const actualDeps = isLabelAsSecondArg ? undefined : (depsOrLabel as DependencyList);\n const effectiveLabel = isLabelAsSecondArg ? (depsOrLabel as string) : (label || 'anonymous_callback');\n\n reactUseEffect(() => {\n if (config.debug) {\n console.log(`%c [Basis] Stable Callback: \"${effectiveLabel}\" `, \"color: #2ecc71; font-weight: bold;\");\n }\n }, [effectiveLabel]);\n\n return reactUseCallback(callback, actualDeps || []);\n}\n\n// --- EFFECTS ---\n\nexport function useEffect(effect: EffectCallback, depsOrLabel?: DependencyList | string, label?: string) {\n const isLabelAsSecondArg = typeof depsOrLabel === 'string';\n const actualDeps = isLabelAsSecondArg ? undefined : (depsOrLabel as DependencyList);\n const effectiveLabel = isLabelAsSecondArg ? (depsOrLabel as string) : (label || 'anonymous_effect');\n\n reactUseEffect(() => {\n beginEffectTracking(effectiveLabel);\n const cleanup = effect();\n endEffectTracking();\n return cleanup;\n }, actualDeps);\n}\n\nexport function useLayoutEffect(effect: EffectCallback, depsOrLabel?: DependencyList | string, label?: string) {\n const isLabelAsSecondArg = typeof depsOrLabel === 'string';\n const actualDeps = isLabelAsSecondArg ? undefined : (depsOrLabel as DependencyList);\n const effectiveLabel = isLabelAsSecondArg ? (depsOrLabel as string) : (label || 'anonymous_layout_effect');\n\n reactUseLayoutEffect(() => {\n beginEffectTracking(effectiveLabel);\n const cleanup = effect();\n endEffectTracking();\n return cleanup;\n }, actualDeps);\n}\n\nexport function useInsertionEffect(effect: EffectCallback, deps?: DependencyList, _label?: string) {\n return reactUseInsertionEffect(effect, deps);\n}\n\n// --- CONCURRENT HOOKS ---\n\nexport function useTransition(_label?: string): [boolean, (callback: () => void) => void] {\n const [isPending, startTransition] = reactUseTransition();\n const effectiveLabel = _label || 'anonymous_transition';\n\n const basisStartTransition = (callback: () => void) => {\n if (config.debug) {\n console.log(`%c [Basis] Transition Started: \"${effectiveLabel}\" `, \"color: #e67e22; font-weight: bold;\");\n }\n startTransition(() => {\n callback();\n });\n };\n\n return [isPending, basisStartTransition];\n}\n\nexport function useDeferredValue<T>(value: T, initialValueOrLabel?: T | string, label?: string): T {\n const isLabelAsSecondArg = typeof initialValueOrLabel === 'string' && label === undefined;\n const actualInitialValue = isLabelAsSecondArg ? undefined : initialValueOrLabel as T;\n const effectiveLabel = isLabelAsSecondArg ? (initialValueOrLabel as string) : (label || 'anonymous_deferred');\n\n const deferredValue = reactUseDeferredValue(value, actualInitialValue);\n\n reactUseEffect(() => {\n if (config.debug && value !== deferredValue) {\n console.log(`%c [Basis] Value Deferred: \"${effectiveLabel}\" `, \"color: #e67e22; font-weight: bold;\");\n }\n }, [value, deferredValue, effectiveLabel]);\n\n return deferredValue;\n}\n\n// --- UTILITY & CONTEXT ---\n\nexport function useRef<T>(initialValue: T, _label?: string) {\n return reactUseRef(initialValue);\n}\n\nexport function createContext<T>(defaultValue: T, label?: string): Context<T> {\n const context = reactCreateContext(defaultValue);\n if (label) {\n (context as any)._basis_label = label;\n }\n return context;\n}\n\nexport function useContext<T>(context: Context<T>): T {\n return reactUseContext(context);\n}\n\nexport function useId(_label?: string): string {\n return reactUseId();\n}\n\nexport function useDebugValue<T>(value: T, formatter?: (value: T) => any, _label?: string): void {\n return reactUseDebugValue(value, formatter);\n}\n\nexport function useImperativeHandle<T, R extends T>(\n ref: React.Ref<T> | undefined,\n init: () => R,\n deps?: DependencyList,\n _label?: string\n): void {\n return reactUseImperativeHandle(ref, init, deps);\n}\n\nexport function useSyncExternalStore<Snapshot>(\n subscribe: (onStoreChange: () => void) => () => void,\n getSnapshot: () => Snapshot,\n getServerSnapshot?: () => Snapshot,\n _label?: string\n): Snapshot {\n return reactUseSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n\nexport const __test__ = {\n registerVariable,\n unregisterVariable,\n recordUpdate,\n beginEffectTracking,\n endEffectTracking,\n history: (engine as any).history,\n currentTickBatch: (engine as any).currentTickBatch\n};","// src/context.tsx\n\nimport React, { createContext, useContext, ReactNode, useEffect, useLayoutEffect } from 'react';\nimport { configureBasis } from './engine';\n\nconst BasisContext = createContext({ debug: false });\n\nconst isWeb = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\ninterface BasisProviderProps {\n children: ReactNode;\n debug?: boolean;\n}\n\nexport const BasisProvider: React.FC<BasisProviderProps> = ({ children, debug = true }) => {\n \n useLayoutEffect(() => {\n configureBasis({ debug });\n\n if (isWeb) {\n (window as any)._basis_debug = debug;\n }\n }, [debug]);\n\n return (\n <BasisContext.Provider value={{ debug }}>\n {children}\n \n {(debug && isWeb) && (\n <div style={{ \n position: 'fixed', bottom: 10, right: 10, background: 'black', color: '#0f0', \n padding: '5px 10px', fontSize: '10px', fontFamily: 'monospace', \n border: '1px solid #0f0', zIndex: 99999, borderRadius: '4px', pointerEvents: 'none'\n }}>\n BASIS_ENGINE: ACTIVE\n </div>\n )}\n </BasisContext.Provider>\n );\n};\n\nexport const useBasisConfig = () => useContext(BasisContext);"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAM,QAAQ,OAAO,WAAW,eAAe,OAAO,OAAO,aAAa;AAE1E,IAAM,SAAS;AAAA,EACb,OAAO;AAAA,EACP,SAAS;AAAA,EAET,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EAEb,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EAEN,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYX,KAAK;AAAA,EACL,MAAM;AACR;AAEA,IAAM,aAAa,CAAC,UAAkB;AACpC,QAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,SAAO;AAAA,IACL,MAAM,MAAM,CAAC,KAAK;AAAA,IAClB,MAAM,MAAM,CAAC,KAAK;AAAA,EACpB;AACF;AAEA,IAAM,WAAW,CAAC,YAAoB,WAAqB;AACzD,MAAI,OAAO;AACT,YAAQ,IAAI,SAAS,GAAG,MAAM;AAAA,EAChC,OAAO;AACL,YAAQ,IAAI,QAAQ,QAAQ,OAAO,EAAE,CAAC;AAAA,EACxC;AACF;AAEO,IAAM,iBAAiB,CAAC,eAAuB;AACpD;AAAA,IACE,8DAA8D,UAAU;AAAA,IACxE,OAAO;AAAA,IACP,OAAO;AAAA,IACP;AAAA,EACF;AACF;AAEO,IAAM,yBAAyB,CAAC,QAAgB,QAAgB,KAAa,oBAA4B;AAC9G,QAAM,QAAQ,WAAW,MAAM;AAC/B,QAAM,QAAQ,WAAW,MAAM;AAC/B,QAAM,cAAc,MAAM,SAAS,MAAM;AAEzC,MAAI,OAAO;AACT,YAAQ,MAAM,qDAA8C,OAAO,SAAS;AAC5E,YAAQ,IAAI,2BAAoB,cAAc,GAAG,MAAM,IAAI,MAAM,MAAM,IAAI,KAAK,MAAM,IAAI,IAAI,OAAO,MAAM,OAAO,QAAQ;AAC1H,YAAQ;AAAA,MACN,2BAA2B,MAAM,IAAI,YAAY,MAAM,IAAI;AAAA,MAC3D,OAAO;AAAA,MAAM;AAAA,MAAI,OAAO;AAAA,MAAO;AAAA,MAAI,OAAO;AAAA,MAAO;AAAA,IACnD;AACA,YAAQ;AAAA,MACN,6BAA6B,MAAM,IAAI;AAAA;AAAA,QAErC,MAAM,IAAI,+BAA+B,MAAM,IAAI,OAAO,MAAM,IAAI;AAAA,MACtE;AAAA,MAAsC;AAAA,MACtC;AAAA,MAAsC;AAAA,MACtC,OAAO;AAAA,MAAW;AAAA,IACpB;AACA,YAAQ,eAAe,+BAAwB,mDAAmD;AAClG,YAAQ,MAAM;AAAA,MACZ,cAAc,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAC;AAAA,MACvC,qBAAqB;AAAA,MACrB,QAAQ,kBAAkB;AAAA,IAC5B,CAAC;AACD,YAAQ,SAAS;AACjB,YAAQ,SAAS;AAAA,EACnB,OAAO;AACL,YAAQ,IAAI,gCAAgC,MAAM,IAAI,QAAQ,MAAM,IAAI,MAAM,MAAM,KAAK,QAAQ,CAAC,CAAC,eAAe;AAClH,YAAQ,IAAI,aAAa,cAAc,GAAG,MAAM,IAAI,MAAM,MAAM,IAAI,KAAK,MAAM,IAAI,EAAE;AAAA,EACvF;AACF;AAEO,IAAM,oBAAoB,CAAC,aAAqB,gBAAwB;AAC7E,QAAM,SAAS,WAAW,WAAW;AACrC,QAAM,SAAS,WAAW,WAAW;AAErC,QAAM,cAAc,OAAO,SAAS,OAAO;AAC3C,QAAM,eAAe,cACjB,GAAG,OAAO,IAAI,WAAM,OAAO,IAAI,KAC/B,OAAO;AAEX,MAAI,OAAO;AACT,YAAQ,eAAe,uDAAgD,OAAO,UAAU;AACxF,YAAQ,IAAI,2BAAoB,YAAY,IAAI,OAAO,MAAM,OAAO,QAAQ;AAC5E,YAAQ;AAAA,MACN,mBAAmB,OAAO,IAAI,6BAAmB,OAAO,IAAI;AAAA,MAC5D,OAAO;AAAA,MAAM;AAAA,MAAI,OAAO;AAAA,MAAO;AAAA,MAAI,OAAO;AAAA,MAAO;AAAA,IACnD;AACA,YAAQ;AAAA,MACN,+BAA+B,OAAO,IAAI;AAAA,MAC1C,OAAO;AAAA,MAAM;AAAA,MAAI,OAAO;AAAA,MAAO;AAAA,MAAI;AAAA,MAAsC;AAAA,IAC3E;AACA,YAAQ,SAAS;AAAA,EACnB,OAAO;AACL,YAAQ,IAAI,sBAAsB,OAAO,IAAI,WAAM,OAAO,IAAI,wBAAwB;AAAA,EACxF;AACF;AAEO,IAAM,sBAAsB,CAAC,UAAkB;AACpD,QAAM,OAAO,WAAW,KAAK;AAC7B,MAAI,OAAO;AACT,YAAQ,MAAM,kDAA2C,OAAO,SAAS;AACzE,YAAQ;AAAA,MACN,uCAAuC,KAAK,IAAI;AAAA;AAAA,MAChD;AAAA,MAA4E;AAAA,IAC9E;AACA,YAAQ,SAAS;AAAA,EACnB,OAAO;AACL,YAAQ,IAAI,sCAAsC,KAAK,IAAI,qBAAqB;AAAA,EAClF;AACF;AAEO,IAAM,sBAAsB,CACjCA,UACA,cACA,cACG;AACH,QAAM,UAAU,MAAM,KAAKA,SAAQ,QAAQ,CAAC;AAC5C,QAAM,YAAY,QAAQ;AAC1B,MAAI,cAAc,EAAG;AAErB,QAAM,WAAuB,CAAC;AAC9B,QAAM,YAAY,oBAAI,IAAY;AAClC,MAAI,mBAAmB;AAEvB,UAAQ,QAAQ,CAAC,CAAC,QAAQ,IAAI,MAAM;AAClC,QAAI,UAAU,IAAI,MAAM,EAAG;AAC3B,UAAM,iBAAiB,CAAC,MAAM;AAC9B,cAAU,IAAI,MAAM;AACpB,YAAQ,QAAQ,CAAC,CAAC,QAAQ,IAAI,MAAM;AAClC,UAAI,WAAW,UAAU,UAAU,IAAI,MAAM,EAAG;AAChD,YAAM,MAAM,aAAa,MAAM,IAAI;AACnC,UAAI,MAAM,WAAW;AACnB,uBAAe,KAAK,MAAM;AAC1B,kBAAU,IAAI,MAAM;AAAA,MACtB;AAAA,IACF,CAAC;AACD,QAAI,eAAe,SAAS,GAAG;AAC7B,eAAS,KAAK,cAAc;AAAA,IAC9B,OAAO;AACL;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,aAAa,mBAAmB,SAAS;AAC/C,QAAM,aAAc,aAAa,YAAa;AAE9C,MAAI,OAAO;AACT,YAAQ,MAAM,8CAAuC,OAAO,WAAW;AACvE,YAAQ;AAAA,MACN,yBAAyB,WAAW,QAAQ,CAAC,CAAC,cAAc,UAAU,IAAI,SAAS;AAAA,MACnF,OAAO;AAAA,MACP,UAAU,aAAa,KAAK,YAAY,SAAS;AAAA,MACjD;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,cAAQ,IAAI,cAAc,SAAS,MAAM,yBAAyB,sDAAsD;AACxH,eAAS,QAAQ,CAAC,SAAS,QAAQ;AACjC,cAAM,QAAQ,QAAQ,IAAI,OAAK,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,UAAK;AAC7D,gBAAQ,IAAI,MAAM,MAAM,CAAC,MAAM,KAAK,IAAI,0EAA0E,yBAAyB;AAAA,MAC7I,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,IAAI,iFAA4E,sDAAsD;AAAA,IAChJ;AAEA,QAAI,YAAY,KAAK,YAAY,IAAI;AACnC,cAAQ,eAAe,kCAAkC,kCAAkC;AAC3F,YAAM,SAAc,CAAC;AACrB,cAAQ,QAAQ,CAAC,CAAC,MAAM,MAAM;AAC5B,cAAM,QAAQ,WAAW,MAAM,EAAE;AACjC,eAAO,KAAK,IAAI,CAAC;AACjB,gBAAQ,QAAQ,CAAC,CAAC,MAAM,MAAM;AAC5B,gBAAM,QAAQ,WAAW,MAAM,EAAE;AACjC,gBAAM,MAAM,aAAaA,SAAQ,IAAI,MAAM,GAAIA,SAAQ,IAAI,MAAM,CAAE;AACnE,iBAAO,KAAK,EAAE,KAAK,IAAI,MAAM,YAAY,WAAM,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM;AAAA,QAC5E,CAAC;AAAA,MACH,CAAC;AACD,cAAQ,MAAM,MAAM;AACpB,cAAQ,SAAS;AAAA,IACnB;AACA,YAAQ,SAAS;AAAA,EACnB,OAAO;AACL,YAAQ,IAAI,8BAA8B,WAAW,QAAQ,CAAC,CAAC,YAAY,UAAU,IAAI,SAAS,GAAG;AACrG,QAAI,SAAS,SAAS,GAAG;AACvB,cAAQ,IAAI,wBAAwB,SAAS,MAAM,EAAE;AAAA,IACvD;AAAA,EACF;AACF;;;AC7MO,IAAM,4BAA4B,CAAC,GAAa,MAAwB;AAC7E,MAAI,MAAM,GAAG,OAAO,GAAG,OAAO;AAC9B,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,WAAO,EAAE,CAAC,IAAI,EAAE,CAAC;AACjB,YAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;AAClB,YAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,EACpB;AACA,SAAO,QAAQ,OAAO,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK;AACpE;;;ACRO,IAAM,cAAc;AACpB,IAAM,uBAAuB;AAC7B,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;;;ACU1B,IAAI,SAAsB;AAAA,EAC/B,OAAO;AACT;AAEA,IAAI,SAAS;AAEN,IAAM,iBAAiB,CAAC,cAAoC;AACjE,WAAS,EAAE,GAAG,QAAQ,GAAG,UAAU;AAEnC,MAAI,OAAO,SAAS,CAAC,QAAQ;AAC3B,IAAG,eAAe,WAAW;AAC7B,aAAS;AAAA,EACX;AACF;AAEO,IAAM,UAAU,oBAAI,IAAsB;AAC1C,IAAM,mBAAmB,oBAAI,IAAY;AAChD,IAAI,YAA6C,CAAC;AAClD,IAAI,sBAAqC;AACzC,IAAI,OAAO;AACX,IAAI,aAAa;AAEjB,IAAM,eAAe,MAAM;AACzB,MAAI,CAAC,OAAO,MAAO;AAEnB,QAAM,UAAU,MAAM,KAAK,QAAQ,QAAQ,CAAC;AAC5C,MAAI,QAAQ,SAAS,EAAG;AAExB,UAAQ,QAAQ,CAAC,CAAC,QAAQ,IAAI,GAAG,MAAM;AACrC,YAAQ,MAAM,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,IAAI,MAAM;AAC/C,YAAM,MAAM,0BAA0B,MAAM,IAAI;AAEhD,UAAI,MAAM,sBAAsB;AAC9B,QAAG,uBAAuB,QAAQ,QAAQ,KAAK,QAAQ,IAAI;AAAA,MAC7D;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEO,IAAM,yBAAyB,CAAC,YAAY,QAAQ;AACzD,MAAI,CAAC,OAAO,OAAO;AACjB,YAAQ,KAAK,oDAAoD;AACjE;AAAA,EACF;AACA,EAAG,oBAAoB,SAAS,2BAA2B,SAAS;AACtE;AAEO,IAAM,sBAAsB,CAAC,UAAkB;AAAE,wBAAsB;AAAO;AAC9E,IAAM,oBAAoB,MAAM;AAAE,wBAAsB;AAAM;AAE9D,IAAM,mBAAmB,CAAC,UAAkB;AACjD,MAAI,CAAC,OAAO,MAAO;AAEnB,MAAI,CAAC,QAAQ,IAAI,KAAK,GAAG;AACvB,YAAQ,IAAI,OAAO,IAAI,MAAM,WAAW,EAAE,KAAK,CAAC,CAAC;AAAA,EACnD;AACF;AAEO,IAAM,qBAAqB,CAAC,UAAkB;AACnD,UAAQ,OAAO,KAAK;AACtB;AAEO,IAAM,eAAe,CAAC,UAA2B;AACtD,MAAI,CAAC,OAAO,MAAO,QAAO;AAE1B,QAAM,MAAM,KAAK,IAAI;AAErB,YAAU,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC;AACjC,cAAY,UAAU,OAAO,OAAK,MAAM,EAAE,KAAK,cAAc;AAC7D,MAAI,UAAU,OAAO,OAAK,EAAE,UAAU,KAAK,EAAE,SAAS,gBAAgB;AACpE,IAAG,oBAAoB,KAAK;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,uBAAuB,wBAAwB,OAAO;AACxD,IAAG,kBAAkB,OAAO,mBAAmB;AAAA,EACjD;AAEA,mBAAiB,IAAI,KAAK;AAE1B,MAAI,CAAC,YAAY;AACf,iBAAa;AACb,eAAW,MAAM;AACf;AACA,cAAQ,QAAQ,CAAC,KAAK,MAAM;AAC1B,YAAI,MAAM;AACV,YAAI,KAAK,iBAAiB,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,MAC1C,CAAC;AAED,uBAAiB,MAAM;AACvB,mBAAa;AAEb,UAAI,OAAO,sBAAsB,GAAG;AAClC,qBAAa;AAAA,MACf;AAAA,IACF,GAAG,EAAE;AAAA,EACP;AAEA,SAAO;AACT;AAEA,IAAI,OAAO,WAAW,aAAa;AACjC,EAAC,OAAe,mBAAmB;AACrC;AAEO,IAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACjIA,mBAiBO;AAsCA,SAAS,SAAY,cAAiB,OAAkD;AAC7F,QAAM,CAAC,KAAK,MAAM,QAAI,aAAAC,UAAc,YAAY;AAChD,QAAM,iBAAiB,SAAS;AAEhC,mBAAAC,WAAe,MAAM;AACnB,qBAAiB,cAAc;AAC/B,WAAO,MAAM,mBAAmB,cAAc;AAAA,EAChD,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,aAAS,aAAAC,aAAiB,CAAC,aAAgC;AAC/D,QAAI,aAAa,cAAc,GAAG;AAChC,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,SAAO,CAAC,KAAK,MAAM;AACrB;AAEO,SAAS,WACd,SACA,YACA,MACA,OACkB;AAClB,QAAM,iBAAiB,OAAO,SAAS,WAAW,OAAQ,SAAS;AACnE,QAAM,YAAY,OAAO,SAAS,aAAa,OAAO;AAEtD,QAAM,CAAC,OAAO,QAAQ,QAAI,aAAAC,YAAgB,SAAS,YAAY,SAAS;AAExE,mBAAAF,WAAe,MAAM;AACnB,qBAAiB,cAAc;AAC/B,WAAO,MAAM,mBAAmB,cAAc;AAAA,EAChD,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,oBAAgB,aAAAC,aAAiB,CAAC,WAAc;AACpD,QAAI,aAAa,cAAc,GAAG;AAChC,eAAS,MAAM;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,SAAO,CAAC,OAAO,aAAa;AAC9B;AAIO,SAAS,QAAW,SAAkB,aAAuC,OAAmB;AACrG,QAAM,qBAAqB,OAAO,gBAAgB;AAClD,QAAM,aAAa,qBAAqB,SAAa;AACrD,QAAM,iBAAiB,qBAAsB,cAA0B,SAAS;AAEhF,mBAAAD,WAAe,MAAM;AACnB,QAAI,OAAO,OAAO;AAChB,cAAQ,IAAI,iCAAiC,cAAc,MAAM,oCAAoC;AAAA,IACvG;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,aAAO,aAAAG,SAAa,SAAS,cAAc,CAAC,CAAC;AAC/C;AAEO,SAAS,YACd,UACA,aACA,OACG;AACH,QAAM,qBAAqB,OAAO,gBAAgB;AAClD,QAAM,aAAa,qBAAqB,SAAa;AACrD,QAAM,iBAAiB,qBAAsB,cAA0B,SAAS;AAEhF,mBAAAH,WAAe,MAAM;AACnB,QAAI,OAAO,OAAO;AAChB,cAAQ,IAAI,gCAAgC,cAAc,MAAM,oCAAoC;AAAA,IACtG;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,aAAO,aAAAC,aAAiB,UAAU,cAAc,CAAC,CAAC;AACpD;AAIO,SAAS,UAAU,QAAwB,aAAuC,OAAgB;AACvG,QAAM,qBAAqB,OAAO,gBAAgB;AAClD,QAAM,aAAa,qBAAqB,SAAa;AACrD,QAAM,iBAAiB,qBAAsB,cAA0B,SAAS;AAEhF,mBAAAD,WAAe,MAAM;AACnB,wBAAoB,cAAc;AAClC,UAAM,UAAU,OAAO;AACvB,sBAAkB;AAClB,WAAO;AAAA,EACT,GAAG,UAAU;AACf;AAEO,SAAS,gBAAgB,QAAwB,aAAuC,OAAgB;AAC7G,QAAM,qBAAqB,OAAO,gBAAgB;AAClD,QAAM,aAAa,qBAAqB,SAAa;AACrD,QAAM,iBAAiB,qBAAsB,cAA0B,SAAS;AAEhF,mBAAAI,iBAAqB,MAAM;AACzB,wBAAoB,cAAc;AAClC,UAAM,UAAU,OAAO;AACvB,sBAAkB;AAClB,WAAO;AAAA,EACT,GAAG,UAAU;AACf;AAEO,SAAS,mBAAmB,QAAwB,MAAuB,QAAiB;AACjG,aAAO,aAAAC,oBAAwB,QAAQ,IAAI;AAC7C;AAIO,SAAS,cAAc,QAA4D;AACxF,QAAM,CAAC,WAAW,eAAe,QAAI,aAAAC,eAAmB;AACxD,QAAM,iBAAiB,UAAU;AAEjC,QAAM,uBAAuB,CAAC,aAAyB;AACrD,QAAI,OAAO,OAAO;AAChB,cAAQ,IAAI,mCAAmC,cAAc,MAAM,oCAAoC;AAAA,IACzG;AACA,oBAAgB,MAAM;AACpB,eAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO,CAAC,WAAW,oBAAoB;AACzC;AAEO,SAAS,iBAAoB,OAAU,qBAAkC,OAAmB;AACjG,QAAM,qBAAqB,OAAO,wBAAwB,YAAY,UAAU;AAChF,QAAM,qBAAqB,qBAAqB,SAAY;AAC5D,QAAM,iBAAiB,qBAAsB,sBAAkC,SAAS;AAExF,QAAM,oBAAgB,aAAAC,kBAAsB,OAAO,kBAAkB;AAErE,mBAAAP,WAAe,MAAM;AACnB,QAAI,OAAO,SAAS,UAAU,eAAe;AAC3C,cAAQ,IAAI,+BAA+B,cAAc,MAAM,oCAAoC;AAAA,IACrG;AAAA,EACF,GAAG,CAAC,OAAO,eAAe,cAAc,CAAC;AAEzC,SAAO;AACT;AAIO,SAAS,OAAU,cAAiB,QAAiB;AAC1D,aAAO,aAAAQ,QAAY,YAAY;AACjC;AAEO,SAAS,cAAiB,cAAiB,OAA4B;AAC5E,QAAM,cAAU,aAAAC,eAAmB,YAAY;AAC/C,MAAI,OAAO;AACT,IAAC,QAAgB,eAAe;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,WAAc,SAAwB;AACpD,aAAO,aAAAC,YAAgB,OAAO;AAChC;AAEO,SAAS,MAAM,QAAyB;AAC7C,aAAO,aAAAC,OAAW;AACpB;AAEO,SAAS,cAAiB,OAAU,WAA+B,QAAuB;AAC/F,aAAO,aAAAC,eAAmB,OAAO,SAAS;AAC5C;AAEO,SAAS,oBACd,KACA,MACA,MACA,QACM;AACN,aAAO,aAAAC,qBAAyB,KAAK,MAAM,IAAI;AACjD;AAEO,SAAS,qBACd,WACA,aACA,mBACA,QACU;AACV,aAAO,aAAAC,sBAA0B,WAAW,aAAa,iBAAiB;AAC5E;AAEO,IAAM,WAAW;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC1PA,IAAAC,gBAAwF;AAuBpF;AApBJ,IAAM,mBAAe,6BAAc,EAAE,OAAO,MAAM,CAAC;AAEnD,IAAMC,SAAQ,OAAO,WAAW,eAAe,OAAO,OAAO,aAAa;AAOnE,IAAM,gBAA8C,CAAC,EAAE,UAAU,QAAQ,KAAK,MAAM;AAEzF,qCAAgB,MAAM;AACpB,mBAAe,EAAE,MAAM,CAAC;AAExB,QAAIA,QAAO;AACT,MAAC,OAAe,eAAe;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,SACE,6CAAC,aAAa,UAAb,EAAsB,OAAO,EAAE,MAAM,GACnC;AAAA;AAAA,IAEC,SAASA,UACT,4CAAC,SAAI,OAAO;AAAA,MACV,UAAU;AAAA,MAAS,QAAQ;AAAA,MAAI,OAAO;AAAA,MAAI,YAAY;AAAA,MAAS,OAAO;AAAA,MACtE,SAAS;AAAA,MAAY,UAAU;AAAA,MAAQ,YAAY;AAAA,MACnD,QAAQ;AAAA,MAAkB,QAAQ;AAAA,MAAO,cAAc;AAAA,MAAO,eAAe;AAAA,IAC/E,GAAG,kCAEH;AAAA,KAEJ;AAEJ;AAEO,IAAM,iBAAiB,UAAM,0BAAW,YAAY;","names":["history","reactUseState","reactUseEffect","reactUseCallback","reactUseReducer","reactUseMemo","reactUseLayoutEffect","reactUseInsertionEffect","reactUseTransition","reactUseDeferredValue","reactUseRef","reactCreateContext","reactUseContext","reactUseId","reactUseDebugValue","reactUseImperativeHandle","reactUseSyncExternalStore","import_react","isWeb"]}
package/dist/index.mjs CHANGED
@@ -218,14 +218,25 @@ var LOOP_WINDOW_MS = 500;
218
218
  var ANALYSIS_INTERVAL = 5;
219
219
 
220
220
  // src/engine.ts
221
+ var config = {
222
+ debug: false
223
+ };
224
+ var booted = false;
225
+ var configureBasis = (newConfig) => {
226
+ config = { ...config, ...newConfig };
227
+ if (config.debug && !booted) {
228
+ displayBootLog(WINDOW_SIZE);
229
+ booted = true;
230
+ }
231
+ };
221
232
  var history = /* @__PURE__ */ new Map();
222
233
  var currentTickBatch = /* @__PURE__ */ new Set();
223
234
  var updateLog = [];
224
235
  var currentEffectSource = null;
225
236
  var tick = 0;
226
237
  var isBatching = false;
227
- displayBootLog(WINDOW_SIZE);
228
238
  var analyzeBasis = () => {
239
+ if (!config.debug) return;
229
240
  const entries = Array.from(history.entries());
230
241
  if (entries.length < 2) return;
231
242
  entries.forEach(([labelA, vecA], i) => {
@@ -238,6 +249,10 @@ var analyzeBasis = () => {
238
249
  });
239
250
  };
240
251
  var printBasisHealthReport = (threshold = 0.5) => {
252
+ if (!config.debug) {
253
+ console.warn("[Basis] Cannot generate report. Debug mode is OFF.");
254
+ return;
255
+ }
241
256
  displayHealthReport(history, calculateCosineSimilarity, threshold);
242
257
  };
243
258
  var beginEffectTracking = (label) => {
@@ -247,6 +262,7 @@ var endEffectTracking = () => {
247
262
  currentEffectSource = null;
248
263
  };
249
264
  var registerVariable = (label) => {
265
+ if (!config.debug) return;
250
266
  if (!history.has(label)) {
251
267
  history.set(label, new Array(WINDOW_SIZE).fill(0));
252
268
  }
@@ -255,6 +271,7 @@ var unregisterVariable = (label) => {
255
271
  history.delete(label);
256
272
  };
257
273
  var recordUpdate = (label) => {
274
+ if (!config.debug) return true;
258
275
  const now = Date.now();
259
276
  updateLog.push({ label, ts: now });
260
277
  updateLog = updateLog.filter((e) => now - e.ts < LOOP_WINDOW_MS);
@@ -287,6 +304,8 @@ if (typeof window !== "undefined") {
287
304
  window.printBasisReport = printBasisHealthReport;
288
305
  }
289
306
  var __testEngine__ = {
307
+ config,
308
+ configureBasis,
290
309
  history,
291
310
  currentTickBatch,
292
311
  registerVariable,
@@ -304,7 +323,16 @@ import {
304
323
  useReducer as reactUseReducer,
305
324
  useContext as reactUseContext,
306
325
  createContext as reactCreateContext,
307
- useCallback
326
+ useRef as reactUseRef,
327
+ useLayoutEffect as reactUseLayoutEffect,
328
+ useCallback as reactUseCallback,
329
+ useId as reactUseId,
330
+ useDebugValue as reactUseDebugValue,
331
+ useImperativeHandle as reactUseImperativeHandle,
332
+ useInsertionEffect as reactUseInsertionEffect,
333
+ useSyncExternalStore as reactUseSyncExternalStore,
334
+ useTransition as reactUseTransition,
335
+ useDeferredValue as reactUseDeferredValue
308
336
  } from "react";
309
337
  function useState(initialValue, label) {
310
338
  const [val, setVal] = reactUseState(initialValue);
@@ -313,24 +341,50 @@ function useState(initialValue, label) {
313
341
  registerVariable(effectiveLabel);
314
342
  return () => unregisterVariable(effectiveLabel);
315
343
  }, [effectiveLabel]);
316
- const setter = useCallback((newValue) => {
344
+ const setter = reactUseCallback((newValue) => {
317
345
  if (recordUpdate(effectiveLabel)) {
318
346
  setVal(newValue);
319
347
  }
320
348
  }, [effectiveLabel]);
321
349
  return [val, setter];
322
350
  }
351
+ function useReducer(reducer, initialArg, init, label) {
352
+ const effectiveLabel = typeof init === "string" ? init : label || "anonymous_reducer";
353
+ const reactInit = typeof init === "function" ? init : void 0;
354
+ const [state, dispatch] = reactUseReducer(reducer, initialArg, reactInit);
355
+ reactUseEffect(() => {
356
+ registerVariable(effectiveLabel);
357
+ return () => unregisterVariable(effectiveLabel);
358
+ }, [effectiveLabel]);
359
+ const basisDispatch = reactUseCallback((action) => {
360
+ if (recordUpdate(effectiveLabel)) {
361
+ dispatch(action);
362
+ }
363
+ }, [effectiveLabel]);
364
+ return [state, basisDispatch];
365
+ }
323
366
  function useMemo(factory, depsOrLabel, label) {
324
367
  const isLabelAsSecondArg = typeof depsOrLabel === "string";
325
368
  const actualDeps = isLabelAsSecondArg ? void 0 : depsOrLabel;
326
369
  const effectiveLabel = isLabelAsSecondArg ? depsOrLabel : label || "anonymous_projection";
327
370
  reactUseEffect(() => {
328
- if (window._basis_debug !== false) {
371
+ if (config.debug) {
329
372
  console.log(`%c [Basis] Valid Projection: "${effectiveLabel}" `, "color: #2ecc71; font-weight: bold;");
330
373
  }
331
374
  }, [effectiveLabel]);
332
375
  return reactUseMemo(factory, actualDeps || []);
333
376
  }
377
+ function useCallback(callback, depsOrLabel, label) {
378
+ const isLabelAsSecondArg = typeof depsOrLabel === "string";
379
+ const actualDeps = isLabelAsSecondArg ? void 0 : depsOrLabel;
380
+ const effectiveLabel = isLabelAsSecondArg ? depsOrLabel : label || "anonymous_callback";
381
+ reactUseEffect(() => {
382
+ if (config.debug) {
383
+ console.log(`%c [Basis] Stable Callback: "${effectiveLabel}" `, "color: #2ecc71; font-weight: bold;");
384
+ }
385
+ }, [effectiveLabel]);
386
+ return reactUseCallback(callback, actualDeps || []);
387
+ }
334
388
  function useEffect(effect, depsOrLabel, label) {
335
389
  const isLabelAsSecondArg = typeof depsOrLabel === "string";
336
390
  const actualDeps = isLabelAsSecondArg ? void 0 : depsOrLabel;
@@ -342,20 +396,47 @@ function useEffect(effect, depsOrLabel, label) {
342
396
  return cleanup;
343
397
  }, actualDeps);
344
398
  }
345
- function useReducer(reducer, initialArg, init, label) {
346
- const effectiveLabel = typeof init === "string" ? init : label || "anonymous_reducer";
347
- const reactInit = typeof init === "function" ? init : void 0;
348
- const [state, dispatch] = reactUseReducer(reducer, initialArg, reactInit);
399
+ function useLayoutEffect(effect, depsOrLabel, label) {
400
+ const isLabelAsSecondArg = typeof depsOrLabel === "string";
401
+ const actualDeps = isLabelAsSecondArg ? void 0 : depsOrLabel;
402
+ const effectiveLabel = isLabelAsSecondArg ? depsOrLabel : label || "anonymous_layout_effect";
403
+ reactUseLayoutEffect(() => {
404
+ beginEffectTracking(effectiveLabel);
405
+ const cleanup = effect();
406
+ endEffectTracking();
407
+ return cleanup;
408
+ }, actualDeps);
409
+ }
410
+ function useInsertionEffect(effect, deps, _label) {
411
+ return reactUseInsertionEffect(effect, deps);
412
+ }
413
+ function useTransition(_label) {
414
+ const [isPending, startTransition] = reactUseTransition();
415
+ const effectiveLabel = _label || "anonymous_transition";
416
+ const basisStartTransition = (callback) => {
417
+ if (config.debug) {
418
+ console.log(`%c [Basis] Transition Started: "${effectiveLabel}" `, "color: #e67e22; font-weight: bold;");
419
+ }
420
+ startTransition(() => {
421
+ callback();
422
+ });
423
+ };
424
+ return [isPending, basisStartTransition];
425
+ }
426
+ function useDeferredValue(value, initialValueOrLabel, label) {
427
+ const isLabelAsSecondArg = typeof initialValueOrLabel === "string" && label === void 0;
428
+ const actualInitialValue = isLabelAsSecondArg ? void 0 : initialValueOrLabel;
429
+ const effectiveLabel = isLabelAsSecondArg ? initialValueOrLabel : label || "anonymous_deferred";
430
+ const deferredValue = reactUseDeferredValue(value, actualInitialValue);
349
431
  reactUseEffect(() => {
350
- registerVariable(effectiveLabel);
351
- return () => unregisterVariable(effectiveLabel);
352
- }, [effectiveLabel]);
353
- const basisDispatch = useCallback((action) => {
354
- if (recordUpdate(effectiveLabel)) {
355
- dispatch(action);
432
+ if (config.debug && value !== deferredValue) {
433
+ console.log(`%c [Basis] Value Deferred: "${effectiveLabel}" `, "color: #e67e22; font-weight: bold;");
356
434
  }
357
- }, [effectiveLabel]);
358
- return [state, basisDispatch];
435
+ }, [value, deferredValue, effectiveLabel]);
436
+ return deferredValue;
437
+ }
438
+ function useRef(initialValue, _label) {
439
+ return reactUseRef(initialValue);
359
440
  }
360
441
  function createContext(defaultValue, label) {
361
442
  const context = reactCreateContext(defaultValue);
@@ -367,6 +448,18 @@ function createContext(defaultValue, label) {
367
448
  function useContext(context) {
368
449
  return reactUseContext(context);
369
450
  }
451
+ function useId(_label) {
452
+ return reactUseId();
453
+ }
454
+ function useDebugValue(value, formatter, _label) {
455
+ return reactUseDebugValue(value, formatter);
456
+ }
457
+ function useImperativeHandle(ref, init, deps, _label) {
458
+ return reactUseImperativeHandle(ref, init, deps);
459
+ }
460
+ function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot, _label) {
461
+ return reactUseSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
462
+ }
370
463
  var __test__ = {
371
464
  registerVariable,
372
465
  unregisterVariable,
@@ -378,14 +471,17 @@ var __test__ = {
378
471
  };
379
472
 
380
473
  // src/context.tsx
381
- import { createContext as createContext2, useContext as useContext2 } from "react";
474
+ import { createContext as createContext2, useContext as useContext2, useLayoutEffect as useLayoutEffect2 } from "react";
382
475
  import { jsx, jsxs } from "react/jsx-runtime";
383
476
  var BasisContext = createContext2({ debug: false });
384
477
  var isWeb2 = typeof window !== "undefined" && typeof window.document !== "undefined";
385
478
  var BasisProvider = ({ children, debug = true }) => {
386
- if (isWeb2) {
387
- window._basis_debug = debug;
388
- }
479
+ useLayoutEffect2(() => {
480
+ configureBasis({ debug });
481
+ if (isWeb2) {
482
+ window._basis_debug = debug;
483
+ }
484
+ }, [debug]);
389
485
  return /* @__PURE__ */ jsxs(BasisContext.Provider, { value: { debug }, children: [
390
486
  children,
391
487
  debug && isWeb2 && /* @__PURE__ */ jsx("div", { style: {
@@ -410,6 +506,8 @@ export {
410
506
  __testEngine__,
411
507
  __test__,
412
508
  beginEffectTracking,
509
+ config,
510
+ configureBasis,
413
511
  createContext,
414
512
  currentTickBatch,
415
513
  endEffectTracking,
@@ -419,10 +517,20 @@ export {
419
517
  registerVariable,
420
518
  unregisterVariable,
421
519
  useBasisConfig,
520
+ useCallback,
422
521
  useContext,
522
+ useDebugValue,
523
+ useDeferredValue,
423
524
  useEffect,
525
+ useId,
526
+ useImperativeHandle,
527
+ useInsertionEffect,
528
+ useLayoutEffect,
424
529
  useMemo,
425
530
  useReducer,
426
- useState
531
+ useRef,
532
+ useState,
533
+ useSyncExternalStore,
534
+ useTransition
427
535
  };
428
536
  //# sourceMappingURL=index.mjs.map