Latest Threat Research:SANDWORM_MODE: Shai-Hulud-Style npm Worm Hijacks CI Workflows and Poisons AI Toolchains.Details
Socket
Book a DemoInstallSign in
Socket

@blac/adapter

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@blac/adapter - npm Package Compare versions

Comparing version
2.0.3
to
2.0.4
+6
-7
dist/index.cjs

@@ -16,4 +16,4 @@ let _blac_core = require("@blac/core");

* Update subscriptions to external bloc dependencies.
* Creates subscriptions to blocs accessed via getters.
* @param getterState - The getter tracker state with external dependencies
* Resolves transitive dependencies via depend() declarations.
* @param getterState - The getter tracker state (needed for change detection)
* @param rawInstance - The primary bloc instance (excluded from subscriptions)

@@ -24,4 +24,4 @@ * @param onGetterChange - Callback to invoke when external dependency changes

updateSubscriptions(getterState, rawInstance, onGetterChange) {
if (!getterState?.externalDependencies) return false;
const currentDeps = getterState.externalDependencies;
if (!getterState) return false;
const currentDeps = (0, _blac_core_tracking.resolveDependencies)(rawInstance);
const onExternalChange = () => {

@@ -31,5 +31,3 @@ (0, _blac_core_tracking.invalidateRenderCache)(getterState);

};
const changed = this.manager.sync(currentDeps, onExternalChange, rawInstance);
(0, _blac_core_tracking.clearExternalDependencies)(getterState);
return changed;
return this.manager.sync(currentDeps, onExternalChange, rawInstance);
}

@@ -192,2 +190,3 @@ /**

(0, _blac_core_tracking.clearActiveTracker)(rawInstance);
(0, _blac_core_tracking.commitTrackedGetters)(adapterState.getterState);
}

@@ -194,0 +193,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"index.cjs","names":["DependencyManager"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * @blac/adapter - Framework Adapter\n *\n * Reusable utilities for integrating BlaC with any reactive framework.\n * Provides subscription and snapshot functions for different tracking modes.\n *\n * This package provides the building blocks for React, Preact, Vue, and other\n * framework integrations.\n */\nimport type {\n ExtractState,\n InstanceReadonlyState,\n InstanceState,\n StateContainerConstructor,\n StateContainerInstance,\n} from '@blac/core';\n\n// Re-export types needed by framework integrations\nexport type {\n ExtractState,\n InstanceReadonlyState,\n InstanceState,\n StateContainerConstructor,\n StateContainerInstance,\n} from '@blac/core';\n\n// Re-export registry functions needed by hooks\nexport {\n acquire,\n release,\n isIsolatedClass,\n generateIsolatedKey,\n} from '@blac/core';\n\n// Import tracking types and functions from @blac/core/tracking subpath\nimport type { DependencyState, GetterState } from '@blac/core/tracking';\n\nimport {\n createDependencyState,\n startDependency,\n createDependencyProxy,\n capturePaths,\n hasDependencyChanges,\n hasTrackedData,\n shallowEqual,\n createGetterState,\n createBlocProxy,\n hasGetterChanges,\n setActiveTracker,\n clearActiveTracker,\n commitTrackedGetters,\n invalidateRenderCache,\n clearExternalDependencies,\n DependencyManager,\n} from '@blac/core/tracking';\n\n/**\n * Internal state for framework adapters, holding tracking and caching data.\n * @template TBloc - The state container type\n */\nexport interface AdapterState<TBloc extends StateContainerConstructor> {\n /** Dependency tracker for state property access tracking */\n dependencyState: DependencyState<ExtractState<TBloc>> | null;\n /** Cached manual dependencies for comparison */\n manualDepsCache: unknown[] | null;\n /** Getter state for computed property tracking */\n getterState: GetterState | null;\n /** Proxied bloc instance for auto-tracking */\n proxiedBloc: InstanceState<TBloc> | null;\n}\n\n/**\n * Configuration for manual dependency tracking mode\n * @template TBloc - The state container type\n */\nexport interface ManualDepsConfig<TBloc extends StateContainerConstructor> {\n /** Function that returns dependency array from state and bloc */\n dependencies: (\n state: ExtractState<TBloc>,\n bloc: InstanceState<TBloc>,\n ) => any[];\n}\n\n/**\n * Callback function invoked when subscribed state changes\n */\nexport type SubscriptionCallback = () => void;\n\n/**\n * Function that subscribes to state changes and returns an unsubscribe function\n */\nexport type SubscribeFunction = (callback: SubscriptionCallback) => () => void;\n\n/**\n * Function that returns a snapshot of the current state\n * @template TState - The state type\n */\nexport type SnapshotFunction<TState> = () => TState;\n\n/**\n * Manages subscriptions to external bloc dependencies for getter tracking.\n * When a getter accesses another bloc's state, this manager ensures\n * re-renders occur when those external dependencies change.\n */\nexport class ExternalDepsManager {\n private manager = new DependencyManager();\n\n /**\n * Update subscriptions to external bloc dependencies.\n * Creates subscriptions to blocs accessed via getters.\n * @param getterState - The getter tracker state with external dependencies\n * @param rawInstance - The primary bloc instance (excluded from subscriptions)\n * @param onGetterChange - Callback to invoke when external dependency changes\n * @returns true if subscriptions were updated, false if unchanged\n */\n updateSubscriptions(\n getterState: GetterState | null,\n rawInstance: StateContainerInstance,\n onGetterChange: () => void,\n ): boolean {\n if (!getterState?.externalDependencies) {\n return false;\n }\n\n const currentDeps = getterState.externalDependencies;\n\n const onExternalChange = () => {\n invalidateRenderCache(getterState);\n\n if (hasGetterChanges(rawInstance, getterState)) {\n onGetterChange();\n }\n };\n\n const changed = this.manager.sync(\n currentDeps,\n onExternalChange,\n rawInstance,\n );\n\n clearExternalDependencies(getterState);\n\n return changed;\n }\n\n /**\n * Clean up all active subscriptions\n */\n cleanup(): void {\n this.manager.cleanup();\n }\n}\n\nexport { DependencyManager };\n\n/**\n * Create a subscribe function for auto-tracking mode.\n * Only triggers callback when tracked properties change.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for tracking\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function autoTrackSubscribe<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n adapterState: AdapterState<TBloc>,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => {\n return instance.subscribe(() => {\n const depState =\n adapterState.dependencyState ||\n (adapterState.dependencyState = createDependencyState<any>());\n\n const hasStateDeps = depState.pathCache && depState.pathCache.size > 0;\n const hasGetterDeps =\n adapterState.getterState &&\n adapterState.getterState.trackedGetters.size > 0;\n\n const isPrimitiveState =\n instance.state !== null &&\n typeof instance.state !== 'object' &&\n typeof instance.state !== 'function';\n\n if (!hasStateDeps && !hasGetterDeps && !isPrimitiveState) {\n return;\n }\n\n let stateChanged = hasDependencyChanges(depState, instance.state);\n\n if (!hasStateDeps && hasGetterDeps) {\n stateChanged = false;\n }\n\n if (stateChanged) {\n callback();\n return;\n }\n\n const getterChanged = hasGetterChanges(\n instance,\n adapterState.getterState,\n );\n\n if (getterChanged) {\n callback();\n }\n });\n };\n}\n\n/**\n * Create a subscribe function for manual dependency tracking mode.\n * Only triggers callback when dependencies array changes.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for caching\n * @param config - Configuration with dependencies function\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function manualDepsSubscribe<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n adapterState: AdapterState<TBloc>,\n config: ManualDepsConfig<TBloc>,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => {\n return instance.subscribe(() => {\n const newDeps = config.dependencies(instance.state, instance);\n if (\n !adapterState.manualDepsCache ||\n !shallowEqual(adapterState.manualDepsCache, newDeps)\n ) {\n adapterState.manualDepsCache = newDeps;\n callback();\n }\n });\n };\n}\n\n/**\n * Create a subscribe function for no-tracking mode.\n * Triggers callback on every state change.\n * @param instance - The state container instance\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function noTrackSubscribe<TBloc extends StateContainerInstance>(\n instance: TBloc,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => instance.subscribe(callback);\n}\n\n/**\n * Create a snapshot function for auto-tracking mode.\n * Returns a proxied state that tracks property access.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for tracking\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function autoTrackSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n adapterState: AdapterState<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => {\n const depState =\n adapterState.dependencyState ||\n (adapterState.dependencyState = createDependencyState<any>());\n\n if (hasTrackedData(depState)) {\n capturePaths(depState, instance.state);\n }\n\n if (adapterState.getterState) {\n invalidateRenderCache(adapterState.getterState);\n\n commitTrackedGetters(adapterState.getterState);\n\n adapterState.getterState.isTracking = true;\n\n setActiveTracker(instance, adapterState.getterState);\n }\n\n startDependency(depState);\n return createDependencyProxy(depState, instance.state);\n };\n}\n\n/**\n * Create a snapshot function for manual dependency tracking mode.\n * Caches dependencies for comparison on next render.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for caching\n * @param config - Configuration with dependencies function\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function manualDepsSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n adapterState: AdapterState<TBloc>,\n config: ManualDepsConfig<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => {\n adapterState.manualDepsCache = config.dependencies(\n instance.state,\n instance,\n );\n return instance.state;\n };\n}\n\n/**\n * Create a snapshot function for no-tracking mode.\n * Returns the raw state directly.\n * @param instance - The state container instance\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function noTrackSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => instance.state;\n}\n\n/**\n * Initialize adapter state for auto-tracking mode.\n * Creates getter tracker and proxied bloc instance.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function autoTrackInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: createGetterState(),\n proxiedBloc: createBlocProxy(instance),\n };\n}\n\n/**\n * Initialize adapter state for manual dependency tracking mode.\n * No proxy is created; bloc is used directly.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function manualDepsInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: null,\n proxiedBloc: instance,\n };\n}\n\n/**\n * Initialize adapter state for no-tracking mode.\n * No tracking or proxy is created.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function noTrackInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: null,\n proxiedBloc: instance,\n };\n}\n\n/**\n * Disable getter tracking after render phase completes.\n * Clears the active tracker to prevent tracking outside of render.\n * @param adapterState - The adapter state\n * @param rawInstance - The raw bloc instance\n */\nexport function disableGetterTracking<TBloc extends StateContainerConstructor>(\n adapterState: AdapterState<TBloc>,\n rawInstance: InstanceState<TBloc>,\n): void {\n if (adapterState.getterState) {\n adapterState.getterState.isTracking = false;\n clearActiveTracker(rawInstance);\n }\n}\n"],"mappings":";;;;;;;;;AAwGA,IAAa,sBAAb,MAAiC;;iBACb,IAAIA,uCAAmB;;;;;;;;;;CAUzC,oBACE,aACA,aACA,gBACS;AACT,MAAI,CAAC,aAAa,qBAChB,QAAO;EAGT,MAAM,cAAc,YAAY;EAEhC,MAAM,yBAAyB;AAC7B,kDAAsB,YAAY;AAElC,iDAAqB,aAAa,YAAY,CAC5C,iBAAgB;;EAIpB,MAAM,UAAU,KAAK,QAAQ,KAC3B,aACA,kBACA,YACD;AAED,qDAA0B,YAAY;AAEtC,SAAO;;;;;CAMT,UAAgB;AACd,OAAK,QAAQ,SAAS;;;;;;;;;;AAa1B,SAAgB,mBACd,UACA,cACmB;AACnB,SAAQ,aAAmC;AACzC,SAAO,SAAS,gBAAgB;GAC9B,MAAM,WACJ,aAAa,oBACZ,aAAa,kEAA8C;GAE9D,MAAM,eAAe,SAAS,aAAa,SAAS,UAAU,OAAO;GACrE,MAAM,gBACJ,aAAa,eACb,aAAa,YAAY,eAAe,OAAO;GAEjD,MAAM,mBACJ,SAAS,UAAU,QACnB,OAAO,SAAS,UAAU,YAC1B,OAAO,SAAS,UAAU;AAE5B,OAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,iBACtC;GAGF,IAAI,6DAAoC,UAAU,SAAS,MAAM;AAEjE,OAAI,CAAC,gBAAgB,cACnB,gBAAe;AAGjB,OAAI,cAAc;AAChB,cAAU;AACV;;AAQF,iDAJE,UACA,aAAa,YACd,CAGC,WAAU;IAEZ;;;;;;;;;;;AAYN,SAAgB,oBACd,UACA,cACA,QACmB;AACnB,SAAQ,aAAmC;AACzC,SAAO,SAAS,gBAAgB;GAC9B,MAAM,UAAU,OAAO,aAAa,SAAS,OAAO,SAAS;AAC7D,OACE,CAAC,aAAa,mBACd,uCAAc,aAAa,iBAAiB,QAAQ,EACpD;AACA,iBAAa,kBAAkB;AAC/B,cAAU;;IAEZ;;;;;;;;;AAUN,SAAgB,iBACd,UACmB;AACnB,SAAQ,aAAmC,SAAS,UAAU,SAAS;;;;;;;;;AAUzE,SAAgB,kBACd,UACA,cACuC;AACvC,cAAa;EACX,MAAM,WACJ,aAAa,oBACZ,aAAa,kEAA8C;AAE9D,8CAAmB,SAAS,CAC1B,uCAAa,UAAU,SAAS,MAAM;AAGxC,MAAI,aAAa,aAAa;AAC5B,kDAAsB,aAAa,YAAY;AAE/C,iDAAqB,aAAa,YAAY;AAE9C,gBAAa,YAAY,aAAa;AAEtC,6CAAiB,UAAU,aAAa,YAAY;;AAGtD,2CAAgB,SAAS;AACzB,wDAA6B,UAAU,SAAS,MAAM;;;;;;;;;;;AAY1D,SAAgB,mBACd,UACA,cACA,QACuC;AACvC,cAAa;AACX,eAAa,kBAAkB,OAAO,aACpC,SAAS,OACT,SACD;AACD,SAAO,SAAS;;;;;;;;;AAUpB,SAAgB,gBACd,UACuC;AACvC,cAAa,SAAS;;;;;;;;AASxB,SAAgB,cACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,yDAAgC;EAChC,sDAA6B,SAAS;EACvC;;;;;;;;AASH,SAAgB,eACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,aAAa;EACb,aAAa;EACd;;;;;;;;AASH,SAAgB,YACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,aAAa;EACb,aAAa;EACd;;;;;;;;AASH,SAAgB,sBACd,cACA,aACM;AACN,KAAI,aAAa,aAAa;AAC5B,eAAa,YAAY,aAAa;AACtC,8CAAmB,YAAY"}
{"version":3,"file":"index.cjs","names":["DependencyManager"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * @blac/adapter - Framework Adapter\n *\n * Reusable utilities for integrating BlaC with any reactive framework.\n * Provides subscription and snapshot functions for different tracking modes.\n *\n * This package provides the building blocks for React, Preact, Vue, and other\n * framework integrations.\n */\nimport type {\n ExtractState,\n InstanceReadonlyState,\n InstanceState,\n StateContainerConstructor,\n StateContainerInstance,\n} from '@blac/core';\n\n// Re-export types needed by framework integrations\nexport type {\n ExtractState,\n InstanceReadonlyState,\n InstanceState,\n StateContainerConstructor,\n StateContainerInstance,\n} from '@blac/core';\n\n// Re-export registry functions needed by hooks\nexport {\n acquire,\n release,\n isIsolatedClass,\n generateIsolatedKey,\n} from '@blac/core';\n\n// Import tracking types and functions from @blac/core/tracking subpath\nimport type { DependencyState, GetterState } from '@blac/core/tracking';\n\nimport {\n createDependencyState,\n startDependency,\n createDependencyProxy,\n capturePaths,\n hasDependencyChanges,\n hasTrackedData,\n shallowEqual,\n createGetterState,\n createBlocProxy,\n hasGetterChanges,\n setActiveTracker,\n clearActiveTracker,\n commitTrackedGetters,\n invalidateRenderCache,\n resolveDependencies,\n DependencyManager,\n} from '@blac/core/tracking';\n\n/**\n * Internal state for framework adapters, holding tracking and caching data.\n * @template TBloc - The state container type\n */\nexport interface AdapterState<TBloc extends StateContainerConstructor> {\n /** Dependency tracker for state property access tracking */\n dependencyState: DependencyState<ExtractState<TBloc>> | null;\n /** Cached manual dependencies for comparison */\n manualDepsCache: unknown[] | null;\n /** Getter state for computed property tracking */\n getterState: GetterState | null;\n /** Proxied bloc instance for auto-tracking */\n proxiedBloc: InstanceState<TBloc> | null;\n}\n\n/**\n * Configuration for manual dependency tracking mode\n * @template TBloc - The state container type\n */\nexport interface ManualDepsConfig<TBloc extends StateContainerConstructor> {\n /** Function that returns dependency array from state and bloc */\n dependencies: (\n state: ExtractState<TBloc>,\n bloc: InstanceState<TBloc>,\n ) => any[];\n}\n\n/**\n * Callback function invoked when subscribed state changes\n */\nexport type SubscriptionCallback = () => void;\n\n/**\n * Function that subscribes to state changes and returns an unsubscribe function\n */\nexport type SubscribeFunction = (callback: SubscriptionCallback) => () => void;\n\n/**\n * Function that returns a snapshot of the current state\n * @template TState - The state type\n */\nexport type SnapshotFunction<TState> = () => TState;\n\n/**\n * Manages subscriptions to external bloc dependencies for getter tracking.\n * When a getter accesses another bloc's state, this manager ensures\n * re-renders occur when those external dependencies change.\n */\nexport class ExternalDepsManager {\n private manager = new DependencyManager();\n\n /**\n * Update subscriptions to external bloc dependencies.\n * Resolves transitive dependencies via depend() declarations.\n * @param getterState - The getter tracker state (needed for change detection)\n * @param rawInstance - The primary bloc instance (excluded from subscriptions)\n * @param onGetterChange - Callback to invoke when external dependency changes\n * @returns true if subscriptions were updated, false if unchanged\n */\n updateSubscriptions(\n getterState: GetterState | null,\n rawInstance: StateContainerInstance,\n onGetterChange: () => void,\n ): boolean {\n if (!getterState) {\n return false;\n }\n\n const currentDeps = resolveDependencies(rawInstance);\n\n const onExternalChange = () => {\n invalidateRenderCache(getterState);\n\n if (hasGetterChanges(rawInstance, getterState)) {\n onGetterChange();\n }\n };\n\n return this.manager.sync(currentDeps, onExternalChange, rawInstance);\n }\n\n /**\n * Clean up all active subscriptions\n */\n cleanup(): void {\n this.manager.cleanup();\n }\n}\n\nexport { DependencyManager };\n\n/**\n * Create a subscribe function for auto-tracking mode.\n * Only triggers callback when tracked properties change.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for tracking\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function autoTrackSubscribe<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n adapterState: AdapterState<TBloc>,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => {\n return instance.subscribe(() => {\n const depState =\n adapterState.dependencyState ||\n (adapterState.dependencyState = createDependencyState<any>());\n\n const hasStateDeps = depState.pathCache && depState.pathCache.size > 0;\n const hasGetterDeps =\n adapterState.getterState &&\n adapterState.getterState.trackedGetters.size > 0;\n\n const isPrimitiveState =\n instance.state !== null &&\n typeof instance.state !== 'object' &&\n typeof instance.state !== 'function';\n\n if (!hasStateDeps && !hasGetterDeps && !isPrimitiveState) {\n return;\n }\n\n let stateChanged = hasDependencyChanges(depState, instance.state);\n\n if (!hasStateDeps && hasGetterDeps) {\n stateChanged = false;\n }\n\n if (stateChanged) {\n callback();\n return;\n }\n\n const getterChanged = hasGetterChanges(\n instance,\n adapterState.getterState,\n );\n\n if (getterChanged) {\n callback();\n }\n });\n };\n}\n\n/**\n * Create a subscribe function for manual dependency tracking mode.\n * Only triggers callback when dependencies array changes.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for caching\n * @param config - Configuration with dependencies function\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function manualDepsSubscribe<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n adapterState: AdapterState<TBloc>,\n config: ManualDepsConfig<TBloc>,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => {\n return instance.subscribe(() => {\n const newDeps = config.dependencies(instance.state, instance);\n if (\n !adapterState.manualDepsCache ||\n !shallowEqual(adapterState.manualDepsCache, newDeps)\n ) {\n adapterState.manualDepsCache = newDeps;\n callback();\n }\n });\n };\n}\n\n/**\n * Create a subscribe function for no-tracking mode.\n * Triggers callback on every state change.\n * @param instance - The state container instance\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function noTrackSubscribe<TBloc extends StateContainerInstance>(\n instance: TBloc,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => instance.subscribe(callback);\n}\n\n/**\n * Create a snapshot function for auto-tracking mode.\n * Returns a proxied state that tracks property access.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for tracking\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function autoTrackSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n adapterState: AdapterState<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => {\n const depState =\n adapterState.dependencyState ||\n (adapterState.dependencyState = createDependencyState<any>());\n\n if (hasTrackedData(depState)) {\n capturePaths(depState, instance.state);\n }\n\n if (adapterState.getterState) {\n invalidateRenderCache(adapterState.getterState);\n\n commitTrackedGetters(adapterState.getterState);\n\n adapterState.getterState.isTracking = true;\n\n setActiveTracker(instance, adapterState.getterState);\n }\n\n startDependency(depState);\n return createDependencyProxy(depState, instance.state);\n };\n}\n\n/**\n * Create a snapshot function for manual dependency tracking mode.\n * Caches dependencies for comparison on next render.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for caching\n * @param config - Configuration with dependencies function\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function manualDepsSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n adapterState: AdapterState<TBloc>,\n config: ManualDepsConfig<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => {\n adapterState.manualDepsCache = config.dependencies(\n instance.state,\n instance,\n );\n return instance.state;\n };\n}\n\n/**\n * Create a snapshot function for no-tracking mode.\n * Returns the raw state directly.\n * @param instance - The state container instance\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function noTrackSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => instance.state;\n}\n\n/**\n * Initialize adapter state for auto-tracking mode.\n * Creates getter tracker and proxied bloc instance.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function autoTrackInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: createGetterState(),\n proxiedBloc: createBlocProxy(instance),\n };\n}\n\n/**\n * Initialize adapter state for manual dependency tracking mode.\n * No proxy is created; bloc is used directly.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function manualDepsInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: null,\n proxiedBloc: instance,\n };\n}\n\n/**\n * Initialize adapter state for no-tracking mode.\n * No tracking or proxy is created.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function noTrackInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: null,\n proxiedBloc: instance,\n };\n}\n\n/**\n * Disable getter tracking after render phase completes.\n * Clears the active tracker to prevent tracking outside of render.\n * @param adapterState - The adapter state\n * @param rawInstance - The raw bloc instance\n */\nexport function disableGetterTracking<TBloc extends StateContainerConstructor>(\n adapterState: AdapterState<TBloc>,\n rawInstance: InstanceState<TBloc>,\n): void {\n if (adapterState.getterState) {\n adapterState.getterState.isTracking = false;\n clearActiveTracker(rawInstance);\n commitTrackedGetters(adapterState.getterState);\n }\n}\n"],"mappings":";;;;;;;;;AAwGA,IAAa,sBAAb,MAAiC;;iBACb,IAAIA,uCAAmB;;;;;;;;;;CAUzC,oBACE,aACA,aACA,gBACS;AACT,MAAI,CAAC,YACH,QAAO;EAGT,MAAM,2DAAkC,YAAY;EAEpD,MAAM,yBAAyB;AAC7B,kDAAsB,YAAY;AAElC,iDAAqB,aAAa,YAAY,CAC5C,iBAAgB;;AAIpB,SAAO,KAAK,QAAQ,KAAK,aAAa,kBAAkB,YAAY;;;;;CAMtE,UAAgB;AACd,OAAK,QAAQ,SAAS;;;;;;;;;;AAa1B,SAAgB,mBACd,UACA,cACmB;AACnB,SAAQ,aAAmC;AACzC,SAAO,SAAS,gBAAgB;GAC9B,MAAM,WACJ,aAAa,oBACZ,aAAa,kEAA8C;GAE9D,MAAM,eAAe,SAAS,aAAa,SAAS,UAAU,OAAO;GACrE,MAAM,gBACJ,aAAa,eACb,aAAa,YAAY,eAAe,OAAO;GAEjD,MAAM,mBACJ,SAAS,UAAU,QACnB,OAAO,SAAS,UAAU,YAC1B,OAAO,SAAS,UAAU;AAE5B,OAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,iBACtC;GAGF,IAAI,6DAAoC,UAAU,SAAS,MAAM;AAEjE,OAAI,CAAC,gBAAgB,cACnB,gBAAe;AAGjB,OAAI,cAAc;AAChB,cAAU;AACV;;AAQF,iDAJE,UACA,aAAa,YACd,CAGC,WAAU;IAEZ;;;;;;;;;;;AAYN,SAAgB,oBACd,UACA,cACA,QACmB;AACnB,SAAQ,aAAmC;AACzC,SAAO,SAAS,gBAAgB;GAC9B,MAAM,UAAU,OAAO,aAAa,SAAS,OAAO,SAAS;AAC7D,OACE,CAAC,aAAa,mBACd,uCAAc,aAAa,iBAAiB,QAAQ,EACpD;AACA,iBAAa,kBAAkB;AAC/B,cAAU;;IAEZ;;;;;;;;;AAUN,SAAgB,iBACd,UACmB;AACnB,SAAQ,aAAmC,SAAS,UAAU,SAAS;;;;;;;;;AAUzE,SAAgB,kBACd,UACA,cACuC;AACvC,cAAa;EACX,MAAM,WACJ,aAAa,oBACZ,aAAa,kEAA8C;AAE9D,8CAAmB,SAAS,CAC1B,uCAAa,UAAU,SAAS,MAAM;AAGxC,MAAI,aAAa,aAAa;AAC5B,kDAAsB,aAAa,YAAY;AAE/C,iDAAqB,aAAa,YAAY;AAE9C,gBAAa,YAAY,aAAa;AAEtC,6CAAiB,UAAU,aAAa,YAAY;;AAGtD,2CAAgB,SAAS;AACzB,wDAA6B,UAAU,SAAS,MAAM;;;;;;;;;;;AAY1D,SAAgB,mBACd,UACA,cACA,QACuC;AACvC,cAAa;AACX,eAAa,kBAAkB,OAAO,aACpC,SAAS,OACT,SACD;AACD,SAAO,SAAS;;;;;;;;;AAUpB,SAAgB,gBACd,UACuC;AACvC,cAAa,SAAS;;;;;;;;AASxB,SAAgB,cACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,yDAAgC;EAChC,sDAA6B,SAAS;EACvC;;;;;;;;AASH,SAAgB,eACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,aAAa;EACb,aAAa;EACd;;;;;;;;AASH,SAAgB,YACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,aAAa;EACb,aAAa;EACd;;;;;;;;AASH,SAAgB,sBACd,cACA,aACM;AACN,KAAI,aAAa,aAAa;AAC5B,eAAa,YAAY,aAAa;AACtC,8CAAmB,YAAY;AAC/B,gDAAqB,aAAa,YAAY"}

@@ -76,4 +76,4 @@ import { acquire } from '@blac/core';

* Update subscriptions to external bloc dependencies.
* Creates subscriptions to blocs accessed via getters.
* @param getterState - The getter tracker state with external dependencies
* Resolves transitive dependencies via depend() declarations.
* @param getterState - The getter tracker state (needed for change detection)
* @param rawInstance - The primary bloc instance (excluded from subscriptions)

@@ -80,0 +80,0 @@ * @param onGetterChange - Callback to invoke when external dependency changes

@@ -76,4 +76,4 @@ import { acquire } from '@blac/core';

* Update subscriptions to external bloc dependencies.
* Creates subscriptions to blocs accessed via getters.
* @param getterState - The getter tracker state with external dependencies
* Resolves transitive dependencies via depend() declarations.
* @param getterState - The getter tracker state (needed for change detection)
* @param rawInstance - The primary bloc instance (excluded from subscriptions)

@@ -80,0 +80,0 @@ * @param onGetterChange - Callback to invoke when external dependency changes

import { acquire, generateIsolatedKey, isIsolatedClass, release } from "@blac/core";
import { DependencyManager, capturePaths, clearActiveTracker, clearExternalDependencies, commitTrackedGetters, createBlocProxy, createDependencyProxy, createDependencyState, createGetterState, hasDependencyChanges, hasGetterChanges, hasTrackedData, invalidateRenderCache, setActiveTracker, shallowEqual, startDependency } from "@blac/core/tracking";
import { DependencyManager, capturePaths, clearActiveTracker, commitTrackedGetters, createBlocProxy, createDependencyProxy, createDependencyState, createGetterState, hasDependencyChanges, hasGetterChanges, hasTrackedData, invalidateRenderCache, resolveDependencies, setActiveTracker, shallowEqual, startDependency } from "@blac/core/tracking";

@@ -16,4 +16,4 @@ //#region src/index.ts

* Update subscriptions to external bloc dependencies.
* Creates subscriptions to blocs accessed via getters.
* @param getterState - The getter tracker state with external dependencies
* Resolves transitive dependencies via depend() declarations.
* @param getterState - The getter tracker state (needed for change detection)
* @param rawInstance - The primary bloc instance (excluded from subscriptions)

@@ -24,4 +24,4 @@ * @param onGetterChange - Callback to invoke when external dependency changes

updateSubscriptions(getterState, rawInstance, onGetterChange) {
if (!getterState?.externalDependencies) return false;
const currentDeps = getterState.externalDependencies;
if (!getterState) return false;
const currentDeps = resolveDependencies(rawInstance);
const onExternalChange = () => {

@@ -31,5 +31,3 @@ invalidateRenderCache(getterState);

};
const changed = this.manager.sync(currentDeps, onExternalChange, rawInstance);
clearExternalDependencies(getterState);
return changed;
return this.manager.sync(currentDeps, onExternalChange, rawInstance);
}

@@ -192,2 +190,3 @@ /**

clearActiveTracker(rawInstance);
commitTrackedGetters(adapterState.getterState);
}

@@ -194,0 +193,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * @blac/adapter - Framework Adapter\n *\n * Reusable utilities for integrating BlaC with any reactive framework.\n * Provides subscription and snapshot functions for different tracking modes.\n *\n * This package provides the building blocks for React, Preact, Vue, and other\n * framework integrations.\n */\nimport type {\n ExtractState,\n InstanceReadonlyState,\n InstanceState,\n StateContainerConstructor,\n StateContainerInstance,\n} from '@blac/core';\n\n// Re-export types needed by framework integrations\nexport type {\n ExtractState,\n InstanceReadonlyState,\n InstanceState,\n StateContainerConstructor,\n StateContainerInstance,\n} from '@blac/core';\n\n// Re-export registry functions needed by hooks\nexport {\n acquire,\n release,\n isIsolatedClass,\n generateIsolatedKey,\n} from '@blac/core';\n\n// Import tracking types and functions from @blac/core/tracking subpath\nimport type { DependencyState, GetterState } from '@blac/core/tracking';\n\nimport {\n createDependencyState,\n startDependency,\n createDependencyProxy,\n capturePaths,\n hasDependencyChanges,\n hasTrackedData,\n shallowEqual,\n createGetterState,\n createBlocProxy,\n hasGetterChanges,\n setActiveTracker,\n clearActiveTracker,\n commitTrackedGetters,\n invalidateRenderCache,\n clearExternalDependencies,\n DependencyManager,\n} from '@blac/core/tracking';\n\n/**\n * Internal state for framework adapters, holding tracking and caching data.\n * @template TBloc - The state container type\n */\nexport interface AdapterState<TBloc extends StateContainerConstructor> {\n /** Dependency tracker for state property access tracking */\n dependencyState: DependencyState<ExtractState<TBloc>> | null;\n /** Cached manual dependencies for comparison */\n manualDepsCache: unknown[] | null;\n /** Getter state for computed property tracking */\n getterState: GetterState | null;\n /** Proxied bloc instance for auto-tracking */\n proxiedBloc: InstanceState<TBloc> | null;\n}\n\n/**\n * Configuration for manual dependency tracking mode\n * @template TBloc - The state container type\n */\nexport interface ManualDepsConfig<TBloc extends StateContainerConstructor> {\n /** Function that returns dependency array from state and bloc */\n dependencies: (\n state: ExtractState<TBloc>,\n bloc: InstanceState<TBloc>,\n ) => any[];\n}\n\n/**\n * Callback function invoked when subscribed state changes\n */\nexport type SubscriptionCallback = () => void;\n\n/**\n * Function that subscribes to state changes and returns an unsubscribe function\n */\nexport type SubscribeFunction = (callback: SubscriptionCallback) => () => void;\n\n/**\n * Function that returns a snapshot of the current state\n * @template TState - The state type\n */\nexport type SnapshotFunction<TState> = () => TState;\n\n/**\n * Manages subscriptions to external bloc dependencies for getter tracking.\n * When a getter accesses another bloc's state, this manager ensures\n * re-renders occur when those external dependencies change.\n */\nexport class ExternalDepsManager {\n private manager = new DependencyManager();\n\n /**\n * Update subscriptions to external bloc dependencies.\n * Creates subscriptions to blocs accessed via getters.\n * @param getterState - The getter tracker state with external dependencies\n * @param rawInstance - The primary bloc instance (excluded from subscriptions)\n * @param onGetterChange - Callback to invoke when external dependency changes\n * @returns true if subscriptions were updated, false if unchanged\n */\n updateSubscriptions(\n getterState: GetterState | null,\n rawInstance: StateContainerInstance,\n onGetterChange: () => void,\n ): boolean {\n if (!getterState?.externalDependencies) {\n return false;\n }\n\n const currentDeps = getterState.externalDependencies;\n\n const onExternalChange = () => {\n invalidateRenderCache(getterState);\n\n if (hasGetterChanges(rawInstance, getterState)) {\n onGetterChange();\n }\n };\n\n const changed = this.manager.sync(\n currentDeps,\n onExternalChange,\n rawInstance,\n );\n\n clearExternalDependencies(getterState);\n\n return changed;\n }\n\n /**\n * Clean up all active subscriptions\n */\n cleanup(): void {\n this.manager.cleanup();\n }\n}\n\nexport { DependencyManager };\n\n/**\n * Create a subscribe function for auto-tracking mode.\n * Only triggers callback when tracked properties change.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for tracking\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function autoTrackSubscribe<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n adapterState: AdapterState<TBloc>,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => {\n return instance.subscribe(() => {\n const depState =\n adapterState.dependencyState ||\n (adapterState.dependencyState = createDependencyState<any>());\n\n const hasStateDeps = depState.pathCache && depState.pathCache.size > 0;\n const hasGetterDeps =\n adapterState.getterState &&\n adapterState.getterState.trackedGetters.size > 0;\n\n const isPrimitiveState =\n instance.state !== null &&\n typeof instance.state !== 'object' &&\n typeof instance.state !== 'function';\n\n if (!hasStateDeps && !hasGetterDeps && !isPrimitiveState) {\n return;\n }\n\n let stateChanged = hasDependencyChanges(depState, instance.state);\n\n if (!hasStateDeps && hasGetterDeps) {\n stateChanged = false;\n }\n\n if (stateChanged) {\n callback();\n return;\n }\n\n const getterChanged = hasGetterChanges(\n instance,\n adapterState.getterState,\n );\n\n if (getterChanged) {\n callback();\n }\n });\n };\n}\n\n/**\n * Create a subscribe function for manual dependency tracking mode.\n * Only triggers callback when dependencies array changes.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for caching\n * @param config - Configuration with dependencies function\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function manualDepsSubscribe<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n adapterState: AdapterState<TBloc>,\n config: ManualDepsConfig<TBloc>,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => {\n return instance.subscribe(() => {\n const newDeps = config.dependencies(instance.state, instance);\n if (\n !adapterState.manualDepsCache ||\n !shallowEqual(adapterState.manualDepsCache, newDeps)\n ) {\n adapterState.manualDepsCache = newDeps;\n callback();\n }\n });\n };\n}\n\n/**\n * Create a subscribe function for no-tracking mode.\n * Triggers callback on every state change.\n * @param instance - The state container instance\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function noTrackSubscribe<TBloc extends StateContainerInstance>(\n instance: TBloc,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => instance.subscribe(callback);\n}\n\n/**\n * Create a snapshot function for auto-tracking mode.\n * Returns a proxied state that tracks property access.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for tracking\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function autoTrackSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n adapterState: AdapterState<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => {\n const depState =\n adapterState.dependencyState ||\n (adapterState.dependencyState = createDependencyState<any>());\n\n if (hasTrackedData(depState)) {\n capturePaths(depState, instance.state);\n }\n\n if (adapterState.getterState) {\n invalidateRenderCache(adapterState.getterState);\n\n commitTrackedGetters(adapterState.getterState);\n\n adapterState.getterState.isTracking = true;\n\n setActiveTracker(instance, adapterState.getterState);\n }\n\n startDependency(depState);\n return createDependencyProxy(depState, instance.state);\n };\n}\n\n/**\n * Create a snapshot function for manual dependency tracking mode.\n * Caches dependencies for comparison on next render.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for caching\n * @param config - Configuration with dependencies function\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function manualDepsSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n adapterState: AdapterState<TBloc>,\n config: ManualDepsConfig<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => {\n adapterState.manualDepsCache = config.dependencies(\n instance.state,\n instance,\n );\n return instance.state;\n };\n}\n\n/**\n * Create a snapshot function for no-tracking mode.\n * Returns the raw state directly.\n * @param instance - The state container instance\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function noTrackSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => instance.state;\n}\n\n/**\n * Initialize adapter state for auto-tracking mode.\n * Creates getter tracker and proxied bloc instance.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function autoTrackInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: createGetterState(),\n proxiedBloc: createBlocProxy(instance),\n };\n}\n\n/**\n * Initialize adapter state for manual dependency tracking mode.\n * No proxy is created; bloc is used directly.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function manualDepsInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: null,\n proxiedBloc: instance,\n };\n}\n\n/**\n * Initialize adapter state for no-tracking mode.\n * No tracking or proxy is created.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function noTrackInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: null,\n proxiedBloc: instance,\n };\n}\n\n/**\n * Disable getter tracking after render phase completes.\n * Clears the active tracker to prevent tracking outside of render.\n * @param adapterState - The adapter state\n * @param rawInstance - The raw bloc instance\n */\nexport function disableGetterTracking<TBloc extends StateContainerConstructor>(\n adapterState: AdapterState<TBloc>,\n rawInstance: InstanceState<TBloc>,\n): void {\n if (adapterState.getterState) {\n adapterState.getterState.isTracking = false;\n clearActiveTracker(rawInstance);\n }\n}\n"],"mappings":";;;;;;;;;AAwGA,IAAa,sBAAb,MAAiC;;iBACb,IAAI,mBAAmB;;;;;;;;;;CAUzC,oBACE,aACA,aACA,gBACS;AACT,MAAI,CAAC,aAAa,qBAChB,QAAO;EAGT,MAAM,cAAc,YAAY;EAEhC,MAAM,yBAAyB;AAC7B,yBAAsB,YAAY;AAElC,OAAI,iBAAiB,aAAa,YAAY,CAC5C,iBAAgB;;EAIpB,MAAM,UAAU,KAAK,QAAQ,KAC3B,aACA,kBACA,YACD;AAED,4BAA0B,YAAY;AAEtC,SAAO;;;;;CAMT,UAAgB;AACd,OAAK,QAAQ,SAAS;;;;;;;;;;AAa1B,SAAgB,mBACd,UACA,cACmB;AACnB,SAAQ,aAAmC;AACzC,SAAO,SAAS,gBAAgB;GAC9B,MAAM,WACJ,aAAa,oBACZ,aAAa,kBAAkB,uBAA4B;GAE9D,MAAM,eAAe,SAAS,aAAa,SAAS,UAAU,OAAO;GACrE,MAAM,gBACJ,aAAa,eACb,aAAa,YAAY,eAAe,OAAO;GAEjD,MAAM,mBACJ,SAAS,UAAU,QACnB,OAAO,SAAS,UAAU,YAC1B,OAAO,SAAS,UAAU;AAE5B,OAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,iBACtC;GAGF,IAAI,eAAe,qBAAqB,UAAU,SAAS,MAAM;AAEjE,OAAI,CAAC,gBAAgB,cACnB,gBAAe;AAGjB,OAAI,cAAc;AAChB,cAAU;AACV;;AAQF,OALsB,iBACpB,UACA,aAAa,YACd,CAGC,WAAU;IAEZ;;;;;;;;;;;AAYN,SAAgB,oBACd,UACA,cACA,QACmB;AACnB,SAAQ,aAAmC;AACzC,SAAO,SAAS,gBAAgB;GAC9B,MAAM,UAAU,OAAO,aAAa,SAAS,OAAO,SAAS;AAC7D,OACE,CAAC,aAAa,mBACd,CAAC,aAAa,aAAa,iBAAiB,QAAQ,EACpD;AACA,iBAAa,kBAAkB;AAC/B,cAAU;;IAEZ;;;;;;;;;AAUN,SAAgB,iBACd,UACmB;AACnB,SAAQ,aAAmC,SAAS,UAAU,SAAS;;;;;;;;;AAUzE,SAAgB,kBACd,UACA,cACuC;AACvC,cAAa;EACX,MAAM,WACJ,aAAa,oBACZ,aAAa,kBAAkB,uBAA4B;AAE9D,MAAI,eAAe,SAAS,CAC1B,cAAa,UAAU,SAAS,MAAM;AAGxC,MAAI,aAAa,aAAa;AAC5B,yBAAsB,aAAa,YAAY;AAE/C,wBAAqB,aAAa,YAAY;AAE9C,gBAAa,YAAY,aAAa;AAEtC,oBAAiB,UAAU,aAAa,YAAY;;AAGtD,kBAAgB,SAAS;AACzB,SAAO,sBAAsB,UAAU,SAAS,MAAM;;;;;;;;;;;AAY1D,SAAgB,mBACd,UACA,cACA,QACuC;AACvC,cAAa;AACX,eAAa,kBAAkB,OAAO,aACpC,SAAS,OACT,SACD;AACD,SAAO,SAAS;;;;;;;;;AAUpB,SAAgB,gBACd,UACuC;AACvC,cAAa,SAAS;;;;;;;;AASxB,SAAgB,cACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,aAAa,mBAAmB;EAChC,aAAa,gBAAgB,SAAS;EACvC;;;;;;;;AASH,SAAgB,eACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,aAAa;EACb,aAAa;EACd;;;;;;;;AASH,SAAgB,YACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,aAAa;EACb,aAAa;EACd;;;;;;;;AASH,SAAgB,sBACd,cACA,aACM;AACN,KAAI,aAAa,aAAa;AAC5B,eAAa,YAAY,aAAa;AACtC,qBAAmB,YAAY"}
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * @blac/adapter - Framework Adapter\n *\n * Reusable utilities for integrating BlaC with any reactive framework.\n * Provides subscription and snapshot functions for different tracking modes.\n *\n * This package provides the building blocks for React, Preact, Vue, and other\n * framework integrations.\n */\nimport type {\n ExtractState,\n InstanceReadonlyState,\n InstanceState,\n StateContainerConstructor,\n StateContainerInstance,\n} from '@blac/core';\n\n// Re-export types needed by framework integrations\nexport type {\n ExtractState,\n InstanceReadonlyState,\n InstanceState,\n StateContainerConstructor,\n StateContainerInstance,\n} from '@blac/core';\n\n// Re-export registry functions needed by hooks\nexport {\n acquire,\n release,\n isIsolatedClass,\n generateIsolatedKey,\n} from '@blac/core';\n\n// Import tracking types and functions from @blac/core/tracking subpath\nimport type { DependencyState, GetterState } from '@blac/core/tracking';\n\nimport {\n createDependencyState,\n startDependency,\n createDependencyProxy,\n capturePaths,\n hasDependencyChanges,\n hasTrackedData,\n shallowEqual,\n createGetterState,\n createBlocProxy,\n hasGetterChanges,\n setActiveTracker,\n clearActiveTracker,\n commitTrackedGetters,\n invalidateRenderCache,\n resolveDependencies,\n DependencyManager,\n} from '@blac/core/tracking';\n\n/**\n * Internal state for framework adapters, holding tracking and caching data.\n * @template TBloc - The state container type\n */\nexport interface AdapterState<TBloc extends StateContainerConstructor> {\n /** Dependency tracker for state property access tracking */\n dependencyState: DependencyState<ExtractState<TBloc>> | null;\n /** Cached manual dependencies for comparison */\n manualDepsCache: unknown[] | null;\n /** Getter state for computed property tracking */\n getterState: GetterState | null;\n /** Proxied bloc instance for auto-tracking */\n proxiedBloc: InstanceState<TBloc> | null;\n}\n\n/**\n * Configuration for manual dependency tracking mode\n * @template TBloc - The state container type\n */\nexport interface ManualDepsConfig<TBloc extends StateContainerConstructor> {\n /** Function that returns dependency array from state and bloc */\n dependencies: (\n state: ExtractState<TBloc>,\n bloc: InstanceState<TBloc>,\n ) => any[];\n}\n\n/**\n * Callback function invoked when subscribed state changes\n */\nexport type SubscriptionCallback = () => void;\n\n/**\n * Function that subscribes to state changes and returns an unsubscribe function\n */\nexport type SubscribeFunction = (callback: SubscriptionCallback) => () => void;\n\n/**\n * Function that returns a snapshot of the current state\n * @template TState - The state type\n */\nexport type SnapshotFunction<TState> = () => TState;\n\n/**\n * Manages subscriptions to external bloc dependencies for getter tracking.\n * When a getter accesses another bloc's state, this manager ensures\n * re-renders occur when those external dependencies change.\n */\nexport class ExternalDepsManager {\n private manager = new DependencyManager();\n\n /**\n * Update subscriptions to external bloc dependencies.\n * Resolves transitive dependencies via depend() declarations.\n * @param getterState - The getter tracker state (needed for change detection)\n * @param rawInstance - The primary bloc instance (excluded from subscriptions)\n * @param onGetterChange - Callback to invoke when external dependency changes\n * @returns true if subscriptions were updated, false if unchanged\n */\n updateSubscriptions(\n getterState: GetterState | null,\n rawInstance: StateContainerInstance,\n onGetterChange: () => void,\n ): boolean {\n if (!getterState) {\n return false;\n }\n\n const currentDeps = resolveDependencies(rawInstance);\n\n const onExternalChange = () => {\n invalidateRenderCache(getterState);\n\n if (hasGetterChanges(rawInstance, getterState)) {\n onGetterChange();\n }\n };\n\n return this.manager.sync(currentDeps, onExternalChange, rawInstance);\n }\n\n /**\n * Clean up all active subscriptions\n */\n cleanup(): void {\n this.manager.cleanup();\n }\n}\n\nexport { DependencyManager };\n\n/**\n * Create a subscribe function for auto-tracking mode.\n * Only triggers callback when tracked properties change.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for tracking\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function autoTrackSubscribe<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n adapterState: AdapterState<TBloc>,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => {\n return instance.subscribe(() => {\n const depState =\n adapterState.dependencyState ||\n (adapterState.dependencyState = createDependencyState<any>());\n\n const hasStateDeps = depState.pathCache && depState.pathCache.size > 0;\n const hasGetterDeps =\n adapterState.getterState &&\n adapterState.getterState.trackedGetters.size > 0;\n\n const isPrimitiveState =\n instance.state !== null &&\n typeof instance.state !== 'object' &&\n typeof instance.state !== 'function';\n\n if (!hasStateDeps && !hasGetterDeps && !isPrimitiveState) {\n return;\n }\n\n let stateChanged = hasDependencyChanges(depState, instance.state);\n\n if (!hasStateDeps && hasGetterDeps) {\n stateChanged = false;\n }\n\n if (stateChanged) {\n callback();\n return;\n }\n\n const getterChanged = hasGetterChanges(\n instance,\n adapterState.getterState,\n );\n\n if (getterChanged) {\n callback();\n }\n });\n };\n}\n\n/**\n * Create a subscribe function for manual dependency tracking mode.\n * Only triggers callback when dependencies array changes.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for caching\n * @param config - Configuration with dependencies function\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function manualDepsSubscribe<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n adapterState: AdapterState<TBloc>,\n config: ManualDepsConfig<TBloc>,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => {\n return instance.subscribe(() => {\n const newDeps = config.dependencies(instance.state, instance);\n if (\n !adapterState.manualDepsCache ||\n !shallowEqual(adapterState.manualDepsCache, newDeps)\n ) {\n adapterState.manualDepsCache = newDeps;\n callback();\n }\n });\n };\n}\n\n/**\n * Create a subscribe function for no-tracking mode.\n * Triggers callback on every state change.\n * @param instance - The state container instance\n * @returns Subscribe function for use with useSyncExternalStore\n */\nexport function noTrackSubscribe<TBloc extends StateContainerInstance>(\n instance: TBloc,\n): SubscribeFunction {\n return (callback: SubscriptionCallback) => instance.subscribe(callback);\n}\n\n/**\n * Create a snapshot function for auto-tracking mode.\n * Returns a proxied state that tracks property access.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for tracking\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function autoTrackSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n adapterState: AdapterState<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => {\n const depState =\n adapterState.dependencyState ||\n (adapterState.dependencyState = createDependencyState<any>());\n\n if (hasTrackedData(depState)) {\n capturePaths(depState, instance.state);\n }\n\n if (adapterState.getterState) {\n invalidateRenderCache(adapterState.getterState);\n\n commitTrackedGetters(adapterState.getterState);\n\n adapterState.getterState.isTracking = true;\n\n setActiveTracker(instance, adapterState.getterState);\n }\n\n startDependency(depState);\n return createDependencyProxy(depState, instance.state);\n };\n}\n\n/**\n * Create a snapshot function for manual dependency tracking mode.\n * Caches dependencies for comparison on next render.\n * @param instance - The state container instance\n * @param adapterState - The adapter state for caching\n * @param config - Configuration with dependencies function\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function manualDepsSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n adapterState: AdapterState<TBloc>,\n config: ManualDepsConfig<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => {\n adapterState.manualDepsCache = config.dependencies(\n instance.state,\n instance,\n );\n return instance.state;\n };\n}\n\n/**\n * Create a snapshot function for no-tracking mode.\n * Returns the raw state directly.\n * @param instance - The state container instance\n * @returns Snapshot function for use with useSyncExternalStore\n */\nexport function noTrackSnapshot<TBloc extends StateContainerConstructor>(\n instance: InstanceReadonlyState<TBloc>,\n): SnapshotFunction<ExtractState<TBloc>> {\n return () => instance.state;\n}\n\n/**\n * Initialize adapter state for auto-tracking mode.\n * Creates getter tracker and proxied bloc instance.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function autoTrackInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: createGetterState(),\n proxiedBloc: createBlocProxy(instance),\n };\n}\n\n/**\n * Initialize adapter state for manual dependency tracking mode.\n * No proxy is created; bloc is used directly.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function manualDepsInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: null,\n proxiedBloc: instance,\n };\n}\n\n/**\n * Initialize adapter state for no-tracking mode.\n * No tracking or proxy is created.\n * @param instance - The state container instance\n * @returns Initialized adapter state\n */\nexport function noTrackInit<TBloc extends StateContainerConstructor>(\n instance: InstanceState<TBloc>,\n): AdapterState<TBloc> {\n return {\n dependencyState: null,\n manualDepsCache: null,\n getterState: null,\n proxiedBloc: instance,\n };\n}\n\n/**\n * Disable getter tracking after render phase completes.\n * Clears the active tracker to prevent tracking outside of render.\n * @param adapterState - The adapter state\n * @param rawInstance - The raw bloc instance\n */\nexport function disableGetterTracking<TBloc extends StateContainerConstructor>(\n adapterState: AdapterState<TBloc>,\n rawInstance: InstanceState<TBloc>,\n): void {\n if (adapterState.getterState) {\n adapterState.getterState.isTracking = false;\n clearActiveTracker(rawInstance);\n commitTrackedGetters(adapterState.getterState);\n }\n}\n"],"mappings":";;;;;;;;;AAwGA,IAAa,sBAAb,MAAiC;;iBACb,IAAI,mBAAmB;;;;;;;;;;CAUzC,oBACE,aACA,aACA,gBACS;AACT,MAAI,CAAC,YACH,QAAO;EAGT,MAAM,cAAc,oBAAoB,YAAY;EAEpD,MAAM,yBAAyB;AAC7B,yBAAsB,YAAY;AAElC,OAAI,iBAAiB,aAAa,YAAY,CAC5C,iBAAgB;;AAIpB,SAAO,KAAK,QAAQ,KAAK,aAAa,kBAAkB,YAAY;;;;;CAMtE,UAAgB;AACd,OAAK,QAAQ,SAAS;;;;;;;;;;AAa1B,SAAgB,mBACd,UACA,cACmB;AACnB,SAAQ,aAAmC;AACzC,SAAO,SAAS,gBAAgB;GAC9B,MAAM,WACJ,aAAa,oBACZ,aAAa,kBAAkB,uBAA4B;GAE9D,MAAM,eAAe,SAAS,aAAa,SAAS,UAAU,OAAO;GACrE,MAAM,gBACJ,aAAa,eACb,aAAa,YAAY,eAAe,OAAO;GAEjD,MAAM,mBACJ,SAAS,UAAU,QACnB,OAAO,SAAS,UAAU,YAC1B,OAAO,SAAS,UAAU;AAE5B,OAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,iBACtC;GAGF,IAAI,eAAe,qBAAqB,UAAU,SAAS,MAAM;AAEjE,OAAI,CAAC,gBAAgB,cACnB,gBAAe;AAGjB,OAAI,cAAc;AAChB,cAAU;AACV;;AAQF,OALsB,iBACpB,UACA,aAAa,YACd,CAGC,WAAU;IAEZ;;;;;;;;;;;AAYN,SAAgB,oBACd,UACA,cACA,QACmB;AACnB,SAAQ,aAAmC;AACzC,SAAO,SAAS,gBAAgB;GAC9B,MAAM,UAAU,OAAO,aAAa,SAAS,OAAO,SAAS;AAC7D,OACE,CAAC,aAAa,mBACd,CAAC,aAAa,aAAa,iBAAiB,QAAQ,EACpD;AACA,iBAAa,kBAAkB;AAC/B,cAAU;;IAEZ;;;;;;;;;AAUN,SAAgB,iBACd,UACmB;AACnB,SAAQ,aAAmC,SAAS,UAAU,SAAS;;;;;;;;;AAUzE,SAAgB,kBACd,UACA,cACuC;AACvC,cAAa;EACX,MAAM,WACJ,aAAa,oBACZ,aAAa,kBAAkB,uBAA4B;AAE9D,MAAI,eAAe,SAAS,CAC1B,cAAa,UAAU,SAAS,MAAM;AAGxC,MAAI,aAAa,aAAa;AAC5B,yBAAsB,aAAa,YAAY;AAE/C,wBAAqB,aAAa,YAAY;AAE9C,gBAAa,YAAY,aAAa;AAEtC,oBAAiB,UAAU,aAAa,YAAY;;AAGtD,kBAAgB,SAAS;AACzB,SAAO,sBAAsB,UAAU,SAAS,MAAM;;;;;;;;;;;AAY1D,SAAgB,mBACd,UACA,cACA,QACuC;AACvC,cAAa;AACX,eAAa,kBAAkB,OAAO,aACpC,SAAS,OACT,SACD;AACD,SAAO,SAAS;;;;;;;;;AAUpB,SAAgB,gBACd,UACuC;AACvC,cAAa,SAAS;;;;;;;;AASxB,SAAgB,cACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,aAAa,mBAAmB;EAChC,aAAa,gBAAgB,SAAS;EACvC;;;;;;;;AASH,SAAgB,eACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,aAAa;EACb,aAAa;EACd;;;;;;;;AASH,SAAgB,YACd,UACqB;AACrB,QAAO;EACL,iBAAiB;EACjB,iBAAiB;EACjB,aAAa;EACb,aAAa;EACd;;;;;;;;AASH,SAAgB,sBACd,cACA,aACM;AACN,KAAI,aAAa,aAAa;AAC5B,eAAa,YAAY,aAAa;AACtC,qBAAmB,YAAY;AAC/B,uBAAqB,aAAa,YAAY"}
{
"name": "@blac/adapter",
"version": "2.0.3",
"version": "2.0.4",
"license": "MIT",

@@ -47,3 +47,3 @@ "author": "Brendan Mullins <jsnanigans@gmail.com>",

"dependencies": {
"@blac/core": "2.0.3"
"@blac/core": "2.0.4"
},

@@ -50,0 +50,0 @@ "devDependencies": {