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/README.md +69 -72
- package/dist/index.d.mts +22 -4
- package/dist/index.d.ts +22 -4
- package/dist/index.js +130 -19
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +129 -21
- package/dist/index.mjs.map +1 -1
- package/dist/plugin.js +23 -4
- package/dist/production.d.mts +32 -0
- package/dist/production.d.ts +32 -0
- package/dist/production.js +115 -0
- package/dist/production.js.map +1 -0
- package/dist/production.mjs +58 -0
- package/dist/production.mjs.map +1 -0
- package/package.json +10 -3
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
|
-
|
|
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 (
|
|
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
|
|
381
|
-
const
|
|
382
|
-
const
|
|
383
|
-
const
|
|
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
|
-
|
|
386
|
-
|
|
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
|
|
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
|
-
|
|
422
|
-
|
|
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
|
-
|
|
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":"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","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
|
-
|
|
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 =
|
|
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 (
|
|
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
|
|
346
|
-
const
|
|
347
|
-
const
|
|
348
|
-
const
|
|
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
|
-
|
|
351
|
-
|
|
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
|
|
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
|
-
|
|
387
|
-
|
|
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
|
-
|
|
531
|
+
useRef,
|
|
532
|
+
useState,
|
|
533
|
+
useSyncExternalStore,
|
|
534
|
+
useTransition
|
|
427
535
|
};
|
|
428
536
|
//# sourceMappingURL=index.mjs.map
|