@blac/core 2.0.1 → 2.0.3

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.
Files changed (43) hide show
  1. package/README.md +4 -55
  2. package/dist/StateContainerRegistry.cjs.map +1 -0
  3. package/dist/StateContainerRegistry.js.map +1 -0
  4. package/dist/debug.cjs +27 -0
  5. package/dist/debug.cjs.map +1 -0
  6. package/dist/debug.js +19 -0
  7. package/dist/debug.js.map +1 -0
  8. package/dist/dependency-manager.cjs.map +1 -0
  9. package/dist/dependency-manager.js.map +1 -0
  10. package/dist/index.cjs +227 -2874
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.cts +14 -1115
  13. package/dist/index.d.ts +14 -1115
  14. package/dist/index.js +197 -2771
  15. package/dist/index.js.map +1 -1
  16. package/dist/management.cjs.map +1 -0
  17. package/dist/management.js.map +1 -0
  18. package/dist/plugins.cjs +4 -0
  19. package/dist/plugins.js +3 -0
  20. package/dist/tracking/dependency-manager.d.ts +37 -0
  21. package/dist/tracking/index.d.ts +12 -0
  22. package/dist/tracking/path-utils.d.ts +52 -0
  23. package/dist/tracking/tracked.d.ts +70 -0
  24. package/dist/tracking/tracking-proxy.d.ts +197 -0
  25. package/dist/tracking-proxy.cjs.map +1 -0
  26. package/dist/tracking-proxy.js.map +1 -0
  27. package/dist/tracking.cjs +19 -0
  28. package/dist/tracking.d.cts +9 -0
  29. package/dist/tracking.d.ts +9 -0
  30. package/dist/tracking.js +4 -0
  31. package/dist/types.cjs +14 -0
  32. package/dist/types.cjs.map +1 -0
  33. package/dist/types.d.cts +8 -0
  34. package/dist/types.d.ts +8 -0
  35. package/dist/types.js +13 -0
  36. package/dist/types.js.map +1 -0
  37. package/dist/watch-entry.cjs +111 -0
  38. package/dist/watch-entry.cjs.map +1 -0
  39. package/dist/watch-entry.js +107 -0
  40. package/dist/watch-entry.js.map +1 -0
  41. package/dist/watch.cjs.map +1 -0
  42. package/dist/watch.js.map +1 -0
  43. package/package.json +73 -2
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Path utilities for dependency tracking
3
+ *
4
+ * Provides utilities for parsing property paths and extracting values
5
+ * from nested objects using path strings.
6
+ *
7
+ * @internal
8
+ */
9
+ /**
10
+ * Parse a property path string into an array of segments
11
+ *
12
+ * @internal
13
+ *
14
+ * Handles both dot notation (a.b.c) and bracket notation (a[0].b)
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * parsePath('user.name') // ['user', 'name']
19
+ * parsePath('items[0].name') // ['items', '0', 'name']
20
+ * parsePath('data.users[2].address.city') // ['data', 'users', '2', 'address', 'city']
21
+ * ```
22
+ */
23
+ export declare function parsePath(path: string): string[];
24
+ /**
25
+ * Get a value from an object using a path of segments
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * const obj = { user: { name: 'Alice', age: 30 } }
30
+ * getValueAtPath(obj, ['user', 'name']) // 'Alice'
31
+ * getValueAtPath(obj, ['user', 'age']) // 30
32
+ * getValueAtPath(obj, ['user', 'missing']) // undefined
33
+ * ```
34
+ *
35
+ * @internal
36
+ */
37
+ export declare function getValueAtPath(obj: any, segments: string[]): any;
38
+ /**
39
+ * Shallow equality comparison for arrays
40
+ *
41
+ * Compares two arrays element-by-element using Object.is
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * shallowEqual([1, 2, 3], [1, 2, 3]) // true
46
+ * shallowEqual([1, 2, 3], [1, 2, 4]) // false
47
+ * shallowEqual([1, 2], [1, 2, 3]) // false
48
+ * ```
49
+ *
50
+ * @internal
51
+ */
52
+ export declare function shallowEqual(arr1: unknown[], arr2: unknown[]): boolean;
@@ -0,0 +1,70 @@
1
+ import type { StateContainerInstance } from '../types/utilities';
2
+ import { DependencyManager } from './dependency-manager';
3
+ /**
4
+ * Result of running a tracked callback.
5
+ */
6
+ export interface TrackedResult<T> {
7
+ result: T;
8
+ dependencies: Set<StateContainerInstance>;
9
+ }
10
+ /**
11
+ * Options for the tracked() function.
12
+ */
13
+ export interface TrackedOptions {
14
+ exclude?: StateContainerInstance;
15
+ }
16
+ /**
17
+ * Run a callback while tracking all bloc dependencies accessed.
18
+ * Returns both the result and the set of discovered dependencies.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const { result, dependencies } = tracked(() => {
23
+ * const user = ensure(UserBloc);
24
+ * return user.fullName; // getter that may access other blocs
25
+ * });
26
+ * // dependencies contains UserBloc + any blocs accessed in fullName getter
27
+ * ```
28
+ */
29
+ export declare function tracked<T>(callback: () => T, options?: TrackedOptions): TrackedResult<T>;
30
+ /**
31
+ * Context for running tracked callbacks with bloc proxies.
32
+ * Provides methods to create proxies and check for changes.
33
+ */
34
+ export declare class TrackedContext {
35
+ private tracker;
36
+ private proxiedBlocs;
37
+ private primaryBlocs;
38
+ constructor();
39
+ /**
40
+ * Get a tracking proxy for a bloc instance.
41
+ * The proxy will track state and getter accesses.
42
+ */
43
+ proxy<T extends StateContainerInstance>(bloc: T): T;
44
+ /**
45
+ * Start tracking for a new callback execution.
46
+ */
47
+ start(): void;
48
+ /**
49
+ * Stop tracking and get discovered dependencies.
50
+ * Excludes primary blocs (those explicitly proxied via proxy()).
51
+ */
52
+ stop(): Set<StateContainerInstance>;
53
+ /**
54
+ * Check if any tracked state or getters have changed.
55
+ */
56
+ changed(): boolean;
57
+ /**
58
+ * Get all primary blocs (those explicitly proxied).
59
+ */
60
+ getPrimaryBlocs(): Set<StateContainerInstance>;
61
+ /**
62
+ * Reset the context for reuse.
63
+ */
64
+ reset(): void;
65
+ }
66
+ /**
67
+ * Create a new tracked context for manual control over tracking.
68
+ */
69
+ export declare function createTrackedContext(): TrackedContext;
70
+ export { DependencyManager };
@@ -0,0 +1,197 @@
1
+ import type { StateContainerInstance } from '../types/utilities';
2
+ /**
3
+ * Check if a value can be proxied
4
+ * Returns true for plain objects and arrays only.
5
+ * @internal
6
+ */
7
+ export declare function isProxyable(value: unknown): value is object;
8
+ /**
9
+ * State container for proxy tracking
10
+ * @internal
11
+ */
12
+ export interface ProxyState<T> {
13
+ trackedPaths: Set<string>;
14
+ isTracking: boolean;
15
+ proxyCache: WeakMap<object, any>;
16
+ boundFunctionsCache: WeakMap<Function, Function> | null;
17
+ lastProxiedState: T | null;
18
+ lastProxy: T | null;
19
+ maxDepth: number;
20
+ }
21
+ /**
22
+ * Create a new proxy tracker state
23
+ * @internal
24
+ */
25
+ export declare function createProxyState<T>(): ProxyState<T>;
26
+ /**
27
+ * Start tracking property accesses
28
+ * @internal
29
+ */
30
+ export declare function startProxy<T>(state: ProxyState<T>): void;
31
+ /**
32
+ * Stop tracking and return the tracked paths
33
+ * @internal
34
+ */
35
+ export declare function stopProxy<T>(state: ProxyState<T>): Set<string>;
36
+ /**
37
+ * Create a proxy for an array with property access tracking
38
+ * @internal
39
+ */
40
+ export declare function createArrayProxy<T, U>(state: ProxyState<T>, target: U[], path: string, depth?: number): U[];
41
+ /**
42
+ * Create a proxy for an object with property access tracking
43
+ * @internal
44
+ */
45
+ export declare function createInternal<T>(state: ProxyState<T>, target: T, path?: string, depth?: number): T;
46
+ /**
47
+ * Create a proxy for a target with caching
48
+ * @internal
49
+ */
50
+ export declare function createForTarget<T>(state: ProxyState<T>, target: T): T;
51
+ /**
52
+ * @internal
53
+ */
54
+ export interface PathInfo {
55
+ segments: string[];
56
+ value: any;
57
+ }
58
+ /**
59
+ * @internal
60
+ */
61
+ export interface DependencyState<T> {
62
+ proxyState: ProxyState<T>;
63
+ previousRenderPaths: Set<string>;
64
+ currentRenderPaths: Set<string>;
65
+ pathCache: Map<string, PathInfo>;
66
+ lastCheckedState: T | null;
67
+ lastCheckedValues: Map<string, any>;
68
+ }
69
+ /**
70
+ * @internal
71
+ */
72
+ export declare function optimizeTrackedPaths(paths: Set<string>): Set<string>;
73
+ /**
74
+ * @internal
75
+ */
76
+ export declare function createDependencyState<T>(): DependencyState<T>;
77
+ /**
78
+ * @internal
79
+ */
80
+ export declare function startDependency<T>(tracker: DependencyState<T>): void;
81
+ /**
82
+ * @internal
83
+ */
84
+ export declare function createDependencyProxy<T>(tracker: DependencyState<T>, state: T): T;
85
+ /**
86
+ * @internal
87
+ */
88
+ export declare function capturePaths<T>(tracker: DependencyState<T>, state: T): void;
89
+ /**
90
+ * @internal
91
+ */
92
+ export declare function hasDependencyChanges<T>(tracker: DependencyState<T>, state: T): boolean;
93
+ /**
94
+ * @internal
95
+ */
96
+ export declare function hasTrackedData<T>(tracker: DependencyState<T>): boolean;
97
+ /**
98
+ * @internal
99
+ */
100
+ export interface GetterState {
101
+ trackedValues: Map<string | symbol, unknown>;
102
+ currentlyAccessing: Set<string | symbol>;
103
+ trackedGetters: Set<string | symbol>;
104
+ isTracking: boolean;
105
+ renderCache: Map<string | symbol, unknown>;
106
+ cacheValid: boolean;
107
+ externalDependencies: Set<StateContainerInstance>;
108
+ }
109
+ interface GetterExecutionContext {
110
+ tracker: GetterState | null;
111
+ currentBloc: StateContainerInstance | null;
112
+ depth: number;
113
+ visitedBlocs: Set<StateContainerInstance>;
114
+ }
115
+ /**
116
+ * @internal
117
+ */
118
+ export declare function getGetterExecutionContext(): GetterExecutionContext;
119
+ /**
120
+ * @internal
121
+ */
122
+ export declare function getDescriptor(obj: any, prop: string | symbol): PropertyDescriptor | undefined;
123
+ /**
124
+ * @internal
125
+ */
126
+ export declare function isGetter(obj: any, prop: string | symbol): boolean;
127
+ /**
128
+ * @internal
129
+ */
130
+ export declare function createGetterState(): GetterState;
131
+ /**
132
+ * @internal
133
+ */
134
+ export declare function setActiveTracker<TBloc extends StateContainerInstance>(bloc: TBloc, tracker: GetterState): void;
135
+ /**
136
+ * @internal
137
+ */
138
+ export declare function clearActiveTracker<TBloc extends StateContainerInstance>(bloc: TBloc): void;
139
+ /**
140
+ * @internal
141
+ */
142
+ export declare function getActiveTracker<TBloc extends StateContainerInstance>(bloc: TBloc): GetterState | undefined;
143
+ /**
144
+ * @internal
145
+ */
146
+ export declare function commitTrackedGetters(tracker: GetterState): void;
147
+ /**
148
+ * @internal
149
+ */
150
+ export declare function createBlocProxy<TBloc extends StateContainerInstance>(bloc: TBloc): TBloc;
151
+ /**
152
+ * @internal
153
+ */
154
+ export declare function hasGetterChanges<TBloc extends StateContainerInstance>(bloc: TBloc, tracker: GetterState | null): boolean;
155
+ /**
156
+ * @internal
157
+ */
158
+ export declare function invalidateRenderCache(tracker: GetterState): void;
159
+ /**
160
+ * @internal
161
+ */
162
+ export declare function clearExternalDependencies(tracker: GetterState): void;
163
+ /**
164
+ * @internal
165
+ */
166
+ export declare function resetGetterState(tracker: GetterState): void;
167
+ /**
168
+ * State for tracking both state property access and getter access.
169
+ */
170
+ export interface TrackingProxyState {
171
+ dependencyState: DependencyState<any>;
172
+ getterState: GetterState;
173
+ dependencies: Set<StateContainerInstance>;
174
+ isTracking: boolean;
175
+ }
176
+ /**
177
+ * Create a new tracking proxy state.
178
+ */
179
+ export declare function createState(): TrackingProxyState;
180
+ /**
181
+ * Start tracking on a tracking proxy.
182
+ */
183
+ export declare function startTracking(tracker: TrackingProxyState): void;
184
+ /**
185
+ * Stop tracking and collect all dependencies.
186
+ */
187
+ export declare function stopTracking(tracker: TrackingProxyState, bloc: StateContainerInstance): Set<StateContainerInstance>;
188
+ /**
189
+ * Check if tracked state or getters have changed.
190
+ */
191
+ export declare function hasChanges(tracker: TrackingProxyState, bloc: StateContainerInstance): boolean;
192
+ /**
193
+ * Create a tracking proxy for a bloc instance.
194
+ * Tracks both state property access and getter access.
195
+ */
196
+ export declare function createTrackingProxy<T extends StateContainerInstance>(bloc: T, tracker: TrackingProxyState): T;
197
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking-proxy.cjs","names":[],"sources":["../src/constants.ts","../src/tracking/path-utils.ts","../src/tracking/tracking-proxy.ts"],"sourcesContent":["/**\n * Default configuration constants for BlaC\n *\n * Centralized location for all magic numbers and default values.\n */\n\n/**\n * Default configuration constants for BlaC\n */\nexport const BLAC_DEFAULTS = {\n /**\n * Default instance key for shared instances\n */\n DEFAULT_INSTANCE_KEY: 'default',\n\n /**\n * Maximum getter nesting depth (prevents infinite recursion)\n */\n MAX_GETTER_DEPTH: 10,\n\n /**\n * Default cleanup interval for subscriptions (30 seconds)\n */\n CLEANUP_INTERVAL_MS: 30_000,\n\n /**\n * Cleanup interval for weak reference stage (10 seconds)\n */\n WEAKREF_CLEANUP_INTERVAL_MS: 10_000,\n\n /**\n * Default maximum subscriptions per container\n */\n MAX_SUBSCRIPTIONS: 1_000,\n\n /**\n * Maximum subscriptions for high-performance mode\n */\n MAX_SUBSCRIPTIONS_HIGH_PERF: 10_000,\n\n /**\n * Default timeout for pipeline execution (5 seconds)\n */\n PIPELINE_TIMEOUT_MS: 5_000,\n\n /**\n * Cleanup interval for high-performance mode (5 seconds)\n */\n CLEANUP_INTERVAL_HIGH_PERF_MS: 5_000,\n\n /**\n * Maximum number of stages in a pipeline\n */\n MAX_PIPELINE_STAGES: 30,\n} as const;\n\n/**\n * Static property names for StateContainer classes\n * Used for feature flags and configuration on bloc classes\n */\nexport const BLAC_STATIC_PROPS = {\n /**\n * Mark a bloc as isolated (each component gets its own instance)\n */\n ISOLATED: 'isolated',\n\n /**\n * Mark a bloc to never be auto-disposed (kept alive permanently)\n */\n KEEP_ALIVE: 'keepAlive',\n\n /**\n * Exclude a bloc from DevTools reporting (prevents infinite loops)\n */\n EXCLUDE_FROM_DEVTOOLS: '__excludeFromDevTools',\n} as const;\n\n/**\n * ID generation patterns and constants\n */\nexport const BLAC_ID_PATTERNS = {\n /**\n * Prefix for isolated instance keys\n */\n ISOLATED_PREFIX: 'isolated-',\n\n /**\n * Length of generated ID portion (9 characters from base36)\n */\n ID_LENGTH: 9,\n} as const;\n\n/**\n * Standard error message prefix\n */\nexport const BLAC_ERROR_PREFIX = '[BlaC]' as const;\n","/**\n * Path utilities for dependency tracking\n *\n * Provides utilities for parsing property paths and extracting values\n * from nested objects using path strings.\n *\n * @internal\n */\n\n/**\n * Parse a property path string into an array of segments\n *\n * @internal\n *\n * Handles both dot notation (a.b.c) and bracket notation (a[0].b)\n *\n * @example\n * ```ts\n * parsePath('user.name') // ['user', 'name']\n * parsePath('items[0].name') // ['items', '0', 'name']\n * parsePath('data.users[2].address.city') // ['data', 'users', '2', 'address', 'city']\n * ```\n */\nexport function parsePath(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n if (char === '.') {\n if (current) segments.push(current);\n current = '';\n } else if (char === '[') {\n if (current) segments.push(current);\n current = '';\n // Skip bracket\n i++;\n // Read until ]\n while (i < path.length && path[i] !== ']') {\n current += path[i++];\n }\n if (current) segments.push(current);\n current = '';\n } else {\n current += char;\n }\n i++;\n }\n\n if (current) segments.push(current);\n return segments;\n}\n\n/**\n * Get a value from an object using a path of segments\n *\n * @example\n * ```ts\n * const obj = { user: { name: 'Alice', age: 30 } }\n * getValueAtPath(obj, ['user', 'name']) // 'Alice'\n * getValueAtPath(obj, ['user', 'age']) // 30\n * getValueAtPath(obj, ['user', 'missing']) // undefined\n * ```\n *\n * @internal\n */\nexport function getValueAtPath(obj: any, segments: string[]): any {\n if (obj == null) return undefined;\n\n let current = obj;\n for (let i = 0; i < segments.length; i++) {\n current = current[segments[i]];\n if (current == null) return undefined;\n }\n return current;\n}\n\n/**\n * Shallow equality comparison for arrays\n *\n * Compares two arrays element-by-element using Object.is\n *\n * @example\n * ```ts\n * shallowEqual([1, 2, 3], [1, 2, 3]) // true\n * shallowEqual([1, 2, 3], [1, 2, 4]) // false\n * shallowEqual([1, 2], [1, 2, 3]) // false\n * ```\n *\n * @internal\n */\nexport function shallowEqual(arr1: unknown[], arr2: unknown[]): boolean {\n if (arr1.length !== arr2.length) return false;\n for (let i = 0; i < arr1.length; i++) {\n if (!Object.is(arr1[i], arr2[i])) return false;\n }\n return true;\n}\n","/**\n * Consolidated Tracking System\n *\n * This module provides all dependency and getter tracking functionality:\n * - Proxy creation for automatic property access tracking\n * - Dependency path tracking and change detection\n * - Getter execution tracking for computed properties\n * - Combined tracking proxy for watch/waitUntil use cases\n */\nimport { BLAC_DEFAULTS, BLAC_ERROR_PREFIX } from '../constants';\nimport type { StateContainerInstance } from '../types/utilities';\nimport { parsePath, getValueAtPath } from './path-utils';\n\n// =============================================================================\n// PROXY TRACKER (Low-level proxy creation)\n// =============================================================================\n\n/**\n * Check if a value can be proxied\n * Returns true for plain objects and arrays only.\n * @internal\n */\nexport function isProxyable(value: unknown): value is object {\n if (typeof value !== 'object' || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === Array.prototype;\n}\n\n/**\n * State container for proxy tracking\n * @internal\n */\nexport interface ProxyState<T> {\n trackedPaths: Set<string>;\n isTracking: boolean;\n proxyCache: WeakMap<object, any>;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n boundFunctionsCache: WeakMap<Function, Function> | null;\n lastProxiedState: T | null;\n lastProxy: T | null;\n maxDepth: number;\n}\n\n/**\n * Create a new proxy tracker state\n * @internal\n */\nexport function createProxyState<T>(): ProxyState<T> {\n return {\n trackedPaths: new Set<string>(),\n isTracking: false,\n proxyCache: new WeakMap<object, any>(),\n boundFunctionsCache: null,\n lastProxiedState: null,\n lastProxy: null,\n maxDepth: 10,\n };\n}\n\n/**\n * Start tracking property accesses\n * @internal\n */\nexport function startProxy<T>(state: ProxyState<T>): void {\n state.isTracking = true;\n state.trackedPaths.clear();\n}\n\n/**\n * Stop tracking and return the tracked paths\n * @internal\n */\nexport function stopProxy<T>(state: ProxyState<T>): Set<string> {\n state.isTracking = false;\n return new Set(state.trackedPaths);\n}\n\n/**\n * Create a proxy for an array with property access tracking\n * @internal\n */\nexport function createArrayProxy<T, U>(\n state: ProxyState<T>,\n target: U[],\n path: string,\n depth: number = 0,\n): U[] {\n const proxy = new Proxy(target, {\n get: (arr, prop: string | symbol) => {\n if (typeof prop === 'symbol') {\n return Reflect.get(arr, prop);\n }\n\n const value = Reflect.get(arr, prop);\n\n if (typeof value === 'function') {\n if (!state.boundFunctionsCache) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n state.boundFunctionsCache = new WeakMap<Function, Function>();\n }\n const cached = state.boundFunctionsCache.get(value);\n if (cached) {\n return cached;\n }\n const bound = value.bind(arr);\n state.boundFunctionsCache.set(value, bound);\n return bound;\n }\n\n if (prop === 'length') {\n if (state.isTracking) {\n const fullPath = path ? `${path}.length` : 'length';\n state.trackedPaths.add(fullPath);\n }\n return value;\n }\n\n let fullPath: string;\n if (typeof prop === 'string') {\n const index = Number(prop);\n if (!isNaN(index) && index >= 0) {\n fullPath = path ? `${path}[${index}]` : `[${index}]`;\n } else {\n fullPath = path ? `${path}.${prop}` : prop;\n }\n } else {\n return value;\n }\n\n if (isProxyable(value)) {\n return createInternal(state, value as T, fullPath, depth + 1);\n }\n\n if (state.isTracking) {\n state.trackedPaths.add(fullPath);\n }\n\n return value;\n },\n });\n\n state.proxyCache.set(target, proxy);\n return proxy;\n}\n\n/**\n * Create a proxy for an object with property access tracking\n * @internal\n */\nexport function createInternal<T>(\n state: ProxyState<T>,\n target: T,\n path: string = '',\n depth: number = 0,\n): T {\n if (!state.isTracking || !isProxyable(target)) {\n return target;\n }\n\n if (depth >= state.maxDepth) {\n return target;\n }\n\n if (state.proxyCache.has(target)) {\n return state.proxyCache.get(target);\n }\n\n if (Array.isArray(target)) {\n return createArrayProxy(\n state,\n target as unknown as any[],\n path,\n depth,\n ) as unknown as T;\n }\n\n const proxy = new Proxy(target, {\n get: (obj, prop: string | symbol) => {\n if (typeof prop === 'symbol') {\n return Reflect.get(obj, prop);\n }\n\n const value = Reflect.get(obj, prop);\n\n if (typeof value === 'function') {\n if (!state.boundFunctionsCache) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n state.boundFunctionsCache = new WeakMap<Function, Function>();\n }\n const cached = state.boundFunctionsCache.get(value);\n if (cached) {\n return cached;\n }\n const bound = value.bind(obj);\n state.boundFunctionsCache.set(value, bound);\n return bound;\n }\n\n const fullPath = path ? `${path}.${String(prop)}` : String(prop);\n\n if (typeof prop === 'string' && state.isTracking) {\n if (!prop.startsWith('_') && !prop.startsWith('$$')) {\n state.trackedPaths.add(fullPath);\n }\n }\n\n if (isProxyable(value)) {\n const proxiedValue = createInternal(\n state,\n value as T,\n fullPath,\n depth + 1,\n );\n return proxiedValue;\n }\n\n return value;\n },\n\n has: (obj, prop: string | symbol) => {\n if (typeof prop === 'string' && state.isTracking) {\n const fullPath = path ? `${path}.${prop}` : prop;\n state.trackedPaths.add(fullPath);\n }\n return Reflect.has(obj, prop);\n },\n\n ownKeys: (obj) => {\n if (state.isTracking && path) {\n state.trackedPaths.add(path);\n }\n return Reflect.ownKeys(obj);\n },\n });\n\n state.proxyCache.set(target, proxy);\n return proxy as T;\n}\n\n/**\n * Create a proxy for a target with caching\n * @internal\n */\nexport function createForTarget<T>(state: ProxyState<T>, target: T): T {\n if (state.lastProxiedState === target && state.lastProxy) {\n return state.lastProxy;\n }\n\n state.proxyCache = new WeakMap<object, any>();\n state.boundFunctionsCache = null;\n\n const proxy = createInternal(state, target, '', 0);\n state.lastProxiedState = target;\n state.lastProxy = proxy;\n return proxy;\n}\n\n// =============================================================================\n// DEPENDENCY TRACKER (Path tracking and change detection)\n// =============================================================================\n\n/**\n * @internal\n */\nexport interface PathInfo {\n segments: string[];\n value: any;\n}\n\n/**\n * @internal\n */\nexport interface DependencyState<T> {\n proxyState: ProxyState<T>;\n previousRenderPaths: Set<string>;\n currentRenderPaths: Set<string>;\n pathCache: Map<string, PathInfo>;\n lastCheckedState: T | null;\n lastCheckedValues: Map<string, any>;\n}\n\nfunction isChildPath(child: string, parent: string): boolean {\n if (child === parent) return false;\n return child.startsWith(parent + '.') || child.startsWith(parent + '[');\n}\n\nfunction getArrayParentPath(path: string): string | null {\n if (path.endsWith('.length')) {\n return path.slice(0, -7);\n }\n const arrayIndexMatch = path.match(/^(.+?)\\[\\d+\\]/);\n if (arrayIndexMatch) {\n return arrayIndexMatch[1];\n }\n return null;\n}\n\n/**\n * @internal\n */\nexport function optimizeTrackedPaths(paths: Set<string>): Set<string> {\n if (paths.size === 0) {\n return new Set();\n }\n\n if (paths.size === 1) {\n return new Set(paths);\n }\n\n const sortedPaths = Array.from(paths).sort((a, b) => b.length - a.length);\n const optimized = new Set<string>();\n\n for (const path of sortedPaths) {\n let hasMoreSpecificChild = false;\n\n for (const optimizedPath of optimized) {\n if (isChildPath(optimizedPath, path)) {\n hasMoreSpecificChild = true;\n break;\n }\n }\n\n if (!hasMoreSpecificChild) {\n optimized.add(path);\n }\n }\n\n const arrayParents = new Set<string>();\n for (const path of optimized) {\n const arrayParent = getArrayParentPath(path);\n if (arrayParent) {\n arrayParents.add(arrayParent);\n }\n }\n\n for (const arrayParent of arrayParents) {\n optimized.add(arrayParent);\n }\n\n return optimized;\n}\n\n/**\n * @internal\n */\nexport function createDependencyState<T>(): DependencyState<T> {\n return {\n proxyState: createProxyState<T>(),\n previousRenderPaths: new Set<string>(),\n currentRenderPaths: new Set<string>(),\n pathCache: new Map<string, PathInfo>(),\n lastCheckedState: null,\n lastCheckedValues: new Map<string, any>(),\n };\n}\n\n/**\n * @internal\n */\nexport function startDependency<T>(tracker: DependencyState<T>): void {\n startProxy(tracker.proxyState);\n}\n\n/**\n * @internal\n */\nexport function createDependencyProxy<T>(\n tracker: DependencyState<T>,\n state: T,\n): T {\n return createForTarget(tracker.proxyState, state);\n}\n\n/**\n * @internal\n */\nexport function capturePaths<T>(tracker: DependencyState<T>, state: T): void {\n tracker.previousRenderPaths = tracker.currentRenderPaths;\n\n const rawPaths = stopProxy(tracker.proxyState);\n tracker.currentRenderPaths = optimizeTrackedPaths(rawPaths);\n\n if (\n tracker.previousRenderPaths.size === 0 &&\n tracker.currentRenderPaths.size === 0\n ) {\n return;\n }\n\n const trackedPathsUnion = new Set(tracker.previousRenderPaths);\n for (const path of tracker.currentRenderPaths) {\n trackedPathsUnion.add(path);\n }\n\n const canReuseCache = tracker.lastCheckedState === state;\n\n for (const path of trackedPathsUnion) {\n if (!tracker.pathCache.has(path)) {\n const segments = parsePath(path);\n const value =\n canReuseCache && tracker.lastCheckedValues.has(path)\n ? tracker.lastCheckedValues.get(path)\n : getValueAtPath(state, segments);\n\n tracker.pathCache.set(path, { segments, value });\n } else {\n const info = tracker.pathCache.get(path)!;\n info.value =\n canReuseCache && tracker.lastCheckedValues.has(path)\n ? tracker.lastCheckedValues.get(path)\n : getValueAtPath(state, info.segments);\n }\n }\n\n tracker.lastCheckedValues.clear();\n}\n\n/**\n * @internal\n */\nexport function hasDependencyChanges<T>(\n tracker: DependencyState<T>,\n state: T,\n): boolean {\n if (tracker.pathCache.size === 0) {\n return true;\n }\n\n tracker.lastCheckedValues.clear();\n\n for (const [path, info] of tracker.pathCache.entries()) {\n const currentValue = getValueAtPath(state, info.segments);\n tracker.lastCheckedValues.set(path, currentValue);\n\n if (!Object.is(currentValue, info.value)) {\n tracker.lastCheckedState = state;\n return true;\n }\n }\n\n tracker.lastCheckedState = state;\n return false;\n}\n\n/**\n * @internal\n */\nexport function hasTrackedData<T>(tracker: DependencyState<T>): boolean {\n return (\n tracker.proxyState.trackedPaths.size > 0 ||\n tracker.pathCache.size > 0 ||\n tracker.previousRenderPaths.size > 0\n );\n}\n\n// =============================================================================\n// GETTER TRACKER (Getter execution tracking)\n// =============================================================================\n\n/**\n * @internal\n */\nexport interface GetterState {\n trackedValues: Map<string | symbol, unknown>;\n currentlyAccessing: Set<string | symbol>;\n trackedGetters: Set<string | symbol>;\n isTracking: boolean;\n renderCache: Map<string | symbol, unknown>;\n cacheValid: boolean;\n externalDependencies: Set<StateContainerInstance>;\n}\n\nconst descriptorCache = new WeakMap<\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n Function,\n Map<string | symbol, PropertyDescriptor | undefined>\n>();\n\nconst blocProxyCache = new WeakMap<StateContainerInstance>();\n\nconst activeTrackerMap = new WeakMap<StateContainerInstance, GetterState>();\n\ninterface GetterExecutionContext {\n tracker: GetterState | null;\n currentBloc: StateContainerInstance | null;\n depth: number;\n visitedBlocs: Set<StateContainerInstance>;\n}\n\nconst getterExecutionContext: GetterExecutionContext = {\n tracker: null,\n currentBloc: null,\n depth: 0,\n visitedBlocs: new Set(),\n};\n\nconst MAX_GETTER_DEPTH = BLAC_DEFAULTS.MAX_GETTER_DEPTH;\n\n/**\n * @internal\n */\nexport function getGetterExecutionContext(): GetterExecutionContext {\n return getterExecutionContext;\n}\n\n/**\n * @internal\n */\nexport function getDescriptor(\n obj: any,\n prop: string | symbol,\n): PropertyDescriptor | undefined {\n const constructor = obj.constructor;\n\n let constructorCache = descriptorCache.get(constructor);\n if (constructorCache?.has(prop)) {\n return constructorCache.get(prop);\n }\n\n let current = obj;\n let descriptor: PropertyDescriptor | undefined;\n\n while (current && current !== Object.prototype) {\n descriptor = Object.getOwnPropertyDescriptor(current, prop);\n if (descriptor) {\n break;\n }\n current = Object.getPrototypeOf(current);\n }\n\n if (!constructorCache) {\n constructorCache = new Map();\n descriptorCache.set(constructor, constructorCache);\n }\n constructorCache.set(prop, descriptor);\n\n return descriptor;\n}\n\n/**\n * @internal\n */\nexport function isGetter(obj: any, prop: string | symbol): boolean {\n const descriptor = getDescriptor(obj, prop);\n return descriptor?.get !== undefined;\n}\n\n/**\n * @internal\n */\nexport function createGetterState(): GetterState {\n return {\n trackedValues: new Map(),\n currentlyAccessing: new Set(),\n trackedGetters: new Set(),\n isTracking: false,\n renderCache: new Map(),\n cacheValid: false,\n externalDependencies: new Set(),\n };\n}\n\n/**\n * @internal\n */\nexport function setActiveTracker<TBloc extends StateContainerInstance>(\n bloc: TBloc,\n tracker: GetterState,\n): void {\n activeTrackerMap.set(bloc, tracker);\n}\n\n/**\n * @internal\n */\nexport function clearActiveTracker<TBloc extends StateContainerInstance>(\n bloc: TBloc,\n): void {\n activeTrackerMap.delete(bloc);\n}\n\n/**\n * @internal\n */\nexport function getActiveTracker<TBloc extends StateContainerInstance>(\n bloc: TBloc,\n): GetterState | undefined {\n return activeTrackerMap.get(bloc);\n}\n\n/**\n * @internal\n */\nexport function commitTrackedGetters(tracker: GetterState): void {\n if (tracker.currentlyAccessing.size > 0) {\n tracker.trackedGetters = new Set(tracker.currentlyAccessing);\n }\n tracker.currentlyAccessing.clear();\n}\n\n/**\n * Execute a tracked getter with depth/circular dependency checks and context management.\n * @internal\n */\nfunction executeTrackedGetter<T extends StateContainerInstance>(\n target: T,\n prop: string | symbol,\n tracker: GetterState,\n context: GetterExecutionContext,\n): unknown {\n tracker.currentlyAccessing.add(prop);\n\n if (tracker.cacheValid && tracker.renderCache.has(prop)) {\n const cachedValue = tracker.renderCache.get(prop);\n tracker.trackedValues.set(prop, cachedValue);\n return cachedValue;\n }\n\n if (context.depth >= MAX_GETTER_DEPTH) {\n console.warn(\n `${BLAC_ERROR_PREFIX} Maximum getter depth (${MAX_GETTER_DEPTH}) exceeded. ` +\n `Possible circular dependency in getter \"${String(prop)}\" on ${target.constructor.name}.`,\n );\n return undefined;\n }\n\n if (context.visitedBlocs.has(target)) {\n console.warn(\n `${BLAC_ERROR_PREFIX} Circular dependency detected: getter \"${String(prop)}\" on ${target.constructor.name}.`,\n );\n return undefined;\n }\n\n const prevContext = {\n tracker: context.tracker,\n currentBloc: context.currentBloc,\n depth: context.depth,\n visitedBlocs: new Set(context.visitedBlocs),\n };\n\n context.tracker = tracker;\n context.currentBloc = target;\n context.depth++;\n context.visitedBlocs.add(target);\n\n try {\n const descriptor = getDescriptor(target, prop);\n const value = descriptor!.get!.call(target);\n tracker.trackedValues.set(prop, value);\n return value;\n } catch (error) {\n tracker.currentlyAccessing.delete(prop);\n throw error;\n } finally {\n context.tracker = prevContext.tracker;\n context.currentBloc = prevContext.currentBloc;\n context.depth = prevContext.depth;\n context.visitedBlocs = prevContext.visitedBlocs;\n }\n}\n\n/**\n * @internal\n */\nexport function createBlocProxy<TBloc extends StateContainerInstance>(\n bloc: TBloc,\n): TBloc {\n const cached = blocProxyCache.get(bloc);\n if (cached) {\n return cached;\n }\n\n const proxy = new Proxy(bloc, {\n get(target, prop, receiver) {\n const tracker = activeTrackerMap.get(target);\n\n if (tracker?.isTracking && isGetter(target, prop)) {\n return executeTrackedGetter(\n target,\n prop,\n tracker,\n getterExecutionContext,\n );\n }\n\n return Reflect.get(target, prop, receiver);\n },\n });\n\n blocProxyCache.set(bloc, proxy);\n return proxy;\n}\n\n/**\n * @internal\n */\nexport function hasGetterChanges<TBloc extends StateContainerInstance>(\n bloc: TBloc,\n tracker: GetterState | null,\n): boolean {\n if (!tracker || tracker.trackedGetters.size === 0) {\n return false;\n }\n\n tracker.renderCache.clear();\n\n let hasAnyChange = false;\n\n for (const prop of tracker.trackedGetters) {\n try {\n const descriptor = getDescriptor(bloc, prop);\n if (!descriptor?.get) {\n continue;\n }\n\n const newValue = descriptor.get.call(bloc);\n const oldValue = tracker.trackedValues.get(prop);\n\n tracker.renderCache.set(prop, newValue);\n tracker.trackedValues.set(prop, newValue);\n\n if (!Object.is(newValue, oldValue)) {\n hasAnyChange = true;\n }\n } catch (error) {\n console.warn(\n `${BLAC_ERROR_PREFIX} Getter \"${String(prop)}\" threw error during change detection. Stopping tracking for this getter.`,\n error,\n );\n\n tracker.trackedGetters.delete(prop);\n tracker.trackedValues.delete(prop);\n tracker.cacheValid = false;\n return true;\n }\n }\n\n tracker.cacheValid = true;\n\n return hasAnyChange;\n}\n\n/**\n * @internal\n */\nexport function invalidateRenderCache(tracker: GetterState): void {\n tracker.cacheValid = false;\n}\n\n/**\n * @internal\n */\nexport function clearExternalDependencies(tracker: GetterState): void {\n tracker.externalDependencies.clear();\n}\n\n/**\n * @internal\n */\nexport function resetGetterState(tracker: GetterState): void {\n tracker.trackedValues.clear();\n tracker.currentlyAccessing.clear();\n tracker.trackedGetters.clear();\n tracker.renderCache.clear();\n tracker.cacheValid = false;\n tracker.isTracking = false;\n tracker.externalDependencies.clear();\n}\n\n// =============================================================================\n// TRACKING PROXY (Combined tracking for watch/waitUntil)\n// =============================================================================\n\n/**\n * State for tracking both state property access and getter access.\n */\nexport interface TrackingProxyState {\n dependencyState: DependencyState<any>;\n getterState: GetterState;\n dependencies: Set<StateContainerInstance>;\n isTracking: boolean;\n}\n\n/**\n * Create a new tracking proxy state.\n */\nexport function createState(): TrackingProxyState {\n return {\n dependencyState: createDependencyState(),\n getterState: createGetterState(),\n dependencies: new Set(),\n isTracking: false,\n };\n}\n\n/**\n * Start tracking on a tracking proxy.\n */\nexport function startTracking(tracker: TrackingProxyState): void {\n tracker.isTracking = true;\n tracker.dependencies.clear();\n tracker.getterState.isTracking = true;\n tracker.getterState.externalDependencies.clear();\n startDependency(tracker.dependencyState);\n}\n\n/**\n * Stop tracking and collect all dependencies.\n */\nexport function stopTracking(\n tracker: TrackingProxyState,\n bloc: StateContainerInstance,\n): Set<StateContainerInstance> {\n tracker.isTracking = false;\n tracker.getterState.isTracking = false;\n\n capturePaths(tracker.dependencyState, bloc.state);\n commitTrackedGetters(tracker.getterState);\n\n const allDeps = new Set(tracker.dependencies);\n for (const dep of tracker.getterState.externalDependencies) {\n allDeps.add(dep);\n }\n\n tracker.getterState.externalDependencies.clear();\n\n return allDeps;\n}\n\n/**\n * Check if tracked state or getters have changed.\n */\nexport function hasChanges(\n tracker: TrackingProxyState,\n bloc: StateContainerInstance,\n): boolean {\n invalidateRenderCache(tracker.getterState);\n\n const stateChanged = hasDependencyChanges(\n tracker.dependencyState,\n bloc.state,\n );\n const getterChanged = hasGetterChanges(bloc, tracker.getterState);\n\n return stateChanged || getterChanged;\n}\n\n/**\n * Create a tracking proxy for a bloc instance.\n * Tracks both state property access and getter access.\n */\nexport function createTrackingProxy<T extends StateContainerInstance>(\n bloc: T,\n tracker: TrackingProxyState,\n): T {\n tracker.dependencies.add(bloc);\n\n const stateProxyCache = new WeakMap<object, any>();\n\n const proxy = new Proxy(bloc, {\n get(target, prop, receiver) {\n if (prop === 'state') {\n if (!tracker.isTracking) {\n return target.state;\n }\n\n const rawState = target.state;\n if (rawState === null || typeof rawState !== 'object') {\n return rawState;\n }\n\n if (stateProxyCache.has(rawState)) {\n return stateProxyCache.get(rawState);\n }\n\n const stateProxy = createDependencyProxy(\n tracker.dependencyState,\n rawState,\n );\n stateProxyCache.set(rawState, stateProxy);\n return stateProxy;\n }\n\n if (typeof prop === 'symbol') {\n return Reflect.get(target, prop, receiver);\n }\n\n const value = Reflect.get(target, prop, receiver);\n\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n if (tracker.isTracking && isGetter(target, prop)) {\n return executeTrackedGetter(\n target,\n prop,\n tracker.getterState,\n getGetterExecutionContext(),\n );\n }\n\n return value;\n },\n });\n\n return proxy as T;\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking-proxy.js","names":[],"sources":["../src/constants.ts","../src/tracking/path-utils.ts","../src/tracking/tracking-proxy.ts"],"sourcesContent":["/**\n * Default configuration constants for BlaC\n *\n * Centralized location for all magic numbers and default values.\n */\n\n/**\n * Default configuration constants for BlaC\n */\nexport const BLAC_DEFAULTS = {\n /**\n * Default instance key for shared instances\n */\n DEFAULT_INSTANCE_KEY: 'default',\n\n /**\n * Maximum getter nesting depth (prevents infinite recursion)\n */\n MAX_GETTER_DEPTH: 10,\n\n /**\n * Default cleanup interval for subscriptions (30 seconds)\n */\n CLEANUP_INTERVAL_MS: 30_000,\n\n /**\n * Cleanup interval for weak reference stage (10 seconds)\n */\n WEAKREF_CLEANUP_INTERVAL_MS: 10_000,\n\n /**\n * Default maximum subscriptions per container\n */\n MAX_SUBSCRIPTIONS: 1_000,\n\n /**\n * Maximum subscriptions for high-performance mode\n */\n MAX_SUBSCRIPTIONS_HIGH_PERF: 10_000,\n\n /**\n * Default timeout for pipeline execution (5 seconds)\n */\n PIPELINE_TIMEOUT_MS: 5_000,\n\n /**\n * Cleanup interval for high-performance mode (5 seconds)\n */\n CLEANUP_INTERVAL_HIGH_PERF_MS: 5_000,\n\n /**\n * Maximum number of stages in a pipeline\n */\n MAX_PIPELINE_STAGES: 30,\n} as const;\n\n/**\n * Static property names for StateContainer classes\n * Used for feature flags and configuration on bloc classes\n */\nexport const BLAC_STATIC_PROPS = {\n /**\n * Mark a bloc as isolated (each component gets its own instance)\n */\n ISOLATED: 'isolated',\n\n /**\n * Mark a bloc to never be auto-disposed (kept alive permanently)\n */\n KEEP_ALIVE: 'keepAlive',\n\n /**\n * Exclude a bloc from DevTools reporting (prevents infinite loops)\n */\n EXCLUDE_FROM_DEVTOOLS: '__excludeFromDevTools',\n} as const;\n\n/**\n * ID generation patterns and constants\n */\nexport const BLAC_ID_PATTERNS = {\n /**\n * Prefix for isolated instance keys\n */\n ISOLATED_PREFIX: 'isolated-',\n\n /**\n * Length of generated ID portion (9 characters from base36)\n */\n ID_LENGTH: 9,\n} as const;\n\n/**\n * Standard error message prefix\n */\nexport const BLAC_ERROR_PREFIX = '[BlaC]' as const;\n","/**\n * Path utilities for dependency tracking\n *\n * Provides utilities for parsing property paths and extracting values\n * from nested objects using path strings.\n *\n * @internal\n */\n\n/**\n * Parse a property path string into an array of segments\n *\n * @internal\n *\n * Handles both dot notation (a.b.c) and bracket notation (a[0].b)\n *\n * @example\n * ```ts\n * parsePath('user.name') // ['user', 'name']\n * parsePath('items[0].name') // ['items', '0', 'name']\n * parsePath('data.users[2].address.city') // ['data', 'users', '2', 'address', 'city']\n * ```\n */\nexport function parsePath(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n if (char === '.') {\n if (current) segments.push(current);\n current = '';\n } else if (char === '[') {\n if (current) segments.push(current);\n current = '';\n // Skip bracket\n i++;\n // Read until ]\n while (i < path.length && path[i] !== ']') {\n current += path[i++];\n }\n if (current) segments.push(current);\n current = '';\n } else {\n current += char;\n }\n i++;\n }\n\n if (current) segments.push(current);\n return segments;\n}\n\n/**\n * Get a value from an object using a path of segments\n *\n * @example\n * ```ts\n * const obj = { user: { name: 'Alice', age: 30 } }\n * getValueAtPath(obj, ['user', 'name']) // 'Alice'\n * getValueAtPath(obj, ['user', 'age']) // 30\n * getValueAtPath(obj, ['user', 'missing']) // undefined\n * ```\n *\n * @internal\n */\nexport function getValueAtPath(obj: any, segments: string[]): any {\n if (obj == null) return undefined;\n\n let current = obj;\n for (let i = 0; i < segments.length; i++) {\n current = current[segments[i]];\n if (current == null) return undefined;\n }\n return current;\n}\n\n/**\n * Shallow equality comparison for arrays\n *\n * Compares two arrays element-by-element using Object.is\n *\n * @example\n * ```ts\n * shallowEqual([1, 2, 3], [1, 2, 3]) // true\n * shallowEqual([1, 2, 3], [1, 2, 4]) // false\n * shallowEqual([1, 2], [1, 2, 3]) // false\n * ```\n *\n * @internal\n */\nexport function shallowEqual(arr1: unknown[], arr2: unknown[]): boolean {\n if (arr1.length !== arr2.length) return false;\n for (let i = 0; i < arr1.length; i++) {\n if (!Object.is(arr1[i], arr2[i])) return false;\n }\n return true;\n}\n","/**\n * Consolidated Tracking System\n *\n * This module provides all dependency and getter tracking functionality:\n * - Proxy creation for automatic property access tracking\n * - Dependency path tracking and change detection\n * - Getter execution tracking for computed properties\n * - Combined tracking proxy for watch/waitUntil use cases\n */\nimport { BLAC_DEFAULTS, BLAC_ERROR_PREFIX } from '../constants';\nimport type { StateContainerInstance } from '../types/utilities';\nimport { parsePath, getValueAtPath } from './path-utils';\n\n// =============================================================================\n// PROXY TRACKER (Low-level proxy creation)\n// =============================================================================\n\n/**\n * Check if a value can be proxied\n * Returns true for plain objects and arrays only.\n * @internal\n */\nexport function isProxyable(value: unknown): value is object {\n if (typeof value !== 'object' || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === Array.prototype;\n}\n\n/**\n * State container for proxy tracking\n * @internal\n */\nexport interface ProxyState<T> {\n trackedPaths: Set<string>;\n isTracking: boolean;\n proxyCache: WeakMap<object, any>;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n boundFunctionsCache: WeakMap<Function, Function> | null;\n lastProxiedState: T | null;\n lastProxy: T | null;\n maxDepth: number;\n}\n\n/**\n * Create a new proxy tracker state\n * @internal\n */\nexport function createProxyState<T>(): ProxyState<T> {\n return {\n trackedPaths: new Set<string>(),\n isTracking: false,\n proxyCache: new WeakMap<object, any>(),\n boundFunctionsCache: null,\n lastProxiedState: null,\n lastProxy: null,\n maxDepth: 10,\n };\n}\n\n/**\n * Start tracking property accesses\n * @internal\n */\nexport function startProxy<T>(state: ProxyState<T>): void {\n state.isTracking = true;\n state.trackedPaths.clear();\n}\n\n/**\n * Stop tracking and return the tracked paths\n * @internal\n */\nexport function stopProxy<T>(state: ProxyState<T>): Set<string> {\n state.isTracking = false;\n return new Set(state.trackedPaths);\n}\n\n/**\n * Create a proxy for an array with property access tracking\n * @internal\n */\nexport function createArrayProxy<T, U>(\n state: ProxyState<T>,\n target: U[],\n path: string,\n depth: number = 0,\n): U[] {\n const proxy = new Proxy(target, {\n get: (arr, prop: string | symbol) => {\n if (typeof prop === 'symbol') {\n return Reflect.get(arr, prop);\n }\n\n const value = Reflect.get(arr, prop);\n\n if (typeof value === 'function') {\n if (!state.boundFunctionsCache) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n state.boundFunctionsCache = new WeakMap<Function, Function>();\n }\n const cached = state.boundFunctionsCache.get(value);\n if (cached) {\n return cached;\n }\n const bound = value.bind(arr);\n state.boundFunctionsCache.set(value, bound);\n return bound;\n }\n\n if (prop === 'length') {\n if (state.isTracking) {\n const fullPath = path ? `${path}.length` : 'length';\n state.trackedPaths.add(fullPath);\n }\n return value;\n }\n\n let fullPath: string;\n if (typeof prop === 'string') {\n const index = Number(prop);\n if (!isNaN(index) && index >= 0) {\n fullPath = path ? `${path}[${index}]` : `[${index}]`;\n } else {\n fullPath = path ? `${path}.${prop}` : prop;\n }\n } else {\n return value;\n }\n\n if (isProxyable(value)) {\n return createInternal(state, value as T, fullPath, depth + 1);\n }\n\n if (state.isTracking) {\n state.trackedPaths.add(fullPath);\n }\n\n return value;\n },\n });\n\n state.proxyCache.set(target, proxy);\n return proxy;\n}\n\n/**\n * Create a proxy for an object with property access tracking\n * @internal\n */\nexport function createInternal<T>(\n state: ProxyState<T>,\n target: T,\n path: string = '',\n depth: number = 0,\n): T {\n if (!state.isTracking || !isProxyable(target)) {\n return target;\n }\n\n if (depth >= state.maxDepth) {\n return target;\n }\n\n if (state.proxyCache.has(target)) {\n return state.proxyCache.get(target);\n }\n\n if (Array.isArray(target)) {\n return createArrayProxy(\n state,\n target as unknown as any[],\n path,\n depth,\n ) as unknown as T;\n }\n\n const proxy = new Proxy(target, {\n get: (obj, prop: string | symbol) => {\n if (typeof prop === 'symbol') {\n return Reflect.get(obj, prop);\n }\n\n const value = Reflect.get(obj, prop);\n\n if (typeof value === 'function') {\n if (!state.boundFunctionsCache) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n state.boundFunctionsCache = new WeakMap<Function, Function>();\n }\n const cached = state.boundFunctionsCache.get(value);\n if (cached) {\n return cached;\n }\n const bound = value.bind(obj);\n state.boundFunctionsCache.set(value, bound);\n return bound;\n }\n\n const fullPath = path ? `${path}.${String(prop)}` : String(prop);\n\n if (typeof prop === 'string' && state.isTracking) {\n if (!prop.startsWith('_') && !prop.startsWith('$$')) {\n state.trackedPaths.add(fullPath);\n }\n }\n\n if (isProxyable(value)) {\n const proxiedValue = createInternal(\n state,\n value as T,\n fullPath,\n depth + 1,\n );\n return proxiedValue;\n }\n\n return value;\n },\n\n has: (obj, prop: string | symbol) => {\n if (typeof prop === 'string' && state.isTracking) {\n const fullPath = path ? `${path}.${prop}` : prop;\n state.trackedPaths.add(fullPath);\n }\n return Reflect.has(obj, prop);\n },\n\n ownKeys: (obj) => {\n if (state.isTracking && path) {\n state.trackedPaths.add(path);\n }\n return Reflect.ownKeys(obj);\n },\n });\n\n state.proxyCache.set(target, proxy);\n return proxy as T;\n}\n\n/**\n * Create a proxy for a target with caching\n * @internal\n */\nexport function createForTarget<T>(state: ProxyState<T>, target: T): T {\n if (state.lastProxiedState === target && state.lastProxy) {\n return state.lastProxy;\n }\n\n state.proxyCache = new WeakMap<object, any>();\n state.boundFunctionsCache = null;\n\n const proxy = createInternal(state, target, '', 0);\n state.lastProxiedState = target;\n state.lastProxy = proxy;\n return proxy;\n}\n\n// =============================================================================\n// DEPENDENCY TRACKER (Path tracking and change detection)\n// =============================================================================\n\n/**\n * @internal\n */\nexport interface PathInfo {\n segments: string[];\n value: any;\n}\n\n/**\n * @internal\n */\nexport interface DependencyState<T> {\n proxyState: ProxyState<T>;\n previousRenderPaths: Set<string>;\n currentRenderPaths: Set<string>;\n pathCache: Map<string, PathInfo>;\n lastCheckedState: T | null;\n lastCheckedValues: Map<string, any>;\n}\n\nfunction isChildPath(child: string, parent: string): boolean {\n if (child === parent) return false;\n return child.startsWith(parent + '.') || child.startsWith(parent + '[');\n}\n\nfunction getArrayParentPath(path: string): string | null {\n if (path.endsWith('.length')) {\n return path.slice(0, -7);\n }\n const arrayIndexMatch = path.match(/^(.+?)\\[\\d+\\]/);\n if (arrayIndexMatch) {\n return arrayIndexMatch[1];\n }\n return null;\n}\n\n/**\n * @internal\n */\nexport function optimizeTrackedPaths(paths: Set<string>): Set<string> {\n if (paths.size === 0) {\n return new Set();\n }\n\n if (paths.size === 1) {\n return new Set(paths);\n }\n\n const sortedPaths = Array.from(paths).sort((a, b) => b.length - a.length);\n const optimized = new Set<string>();\n\n for (const path of sortedPaths) {\n let hasMoreSpecificChild = false;\n\n for (const optimizedPath of optimized) {\n if (isChildPath(optimizedPath, path)) {\n hasMoreSpecificChild = true;\n break;\n }\n }\n\n if (!hasMoreSpecificChild) {\n optimized.add(path);\n }\n }\n\n const arrayParents = new Set<string>();\n for (const path of optimized) {\n const arrayParent = getArrayParentPath(path);\n if (arrayParent) {\n arrayParents.add(arrayParent);\n }\n }\n\n for (const arrayParent of arrayParents) {\n optimized.add(arrayParent);\n }\n\n return optimized;\n}\n\n/**\n * @internal\n */\nexport function createDependencyState<T>(): DependencyState<T> {\n return {\n proxyState: createProxyState<T>(),\n previousRenderPaths: new Set<string>(),\n currentRenderPaths: new Set<string>(),\n pathCache: new Map<string, PathInfo>(),\n lastCheckedState: null,\n lastCheckedValues: new Map<string, any>(),\n };\n}\n\n/**\n * @internal\n */\nexport function startDependency<T>(tracker: DependencyState<T>): void {\n startProxy(tracker.proxyState);\n}\n\n/**\n * @internal\n */\nexport function createDependencyProxy<T>(\n tracker: DependencyState<T>,\n state: T,\n): T {\n return createForTarget(tracker.proxyState, state);\n}\n\n/**\n * @internal\n */\nexport function capturePaths<T>(tracker: DependencyState<T>, state: T): void {\n tracker.previousRenderPaths = tracker.currentRenderPaths;\n\n const rawPaths = stopProxy(tracker.proxyState);\n tracker.currentRenderPaths = optimizeTrackedPaths(rawPaths);\n\n if (\n tracker.previousRenderPaths.size === 0 &&\n tracker.currentRenderPaths.size === 0\n ) {\n return;\n }\n\n const trackedPathsUnion = new Set(tracker.previousRenderPaths);\n for (const path of tracker.currentRenderPaths) {\n trackedPathsUnion.add(path);\n }\n\n const canReuseCache = tracker.lastCheckedState === state;\n\n for (const path of trackedPathsUnion) {\n if (!tracker.pathCache.has(path)) {\n const segments = parsePath(path);\n const value =\n canReuseCache && tracker.lastCheckedValues.has(path)\n ? tracker.lastCheckedValues.get(path)\n : getValueAtPath(state, segments);\n\n tracker.pathCache.set(path, { segments, value });\n } else {\n const info = tracker.pathCache.get(path)!;\n info.value =\n canReuseCache && tracker.lastCheckedValues.has(path)\n ? tracker.lastCheckedValues.get(path)\n : getValueAtPath(state, info.segments);\n }\n }\n\n tracker.lastCheckedValues.clear();\n}\n\n/**\n * @internal\n */\nexport function hasDependencyChanges<T>(\n tracker: DependencyState<T>,\n state: T,\n): boolean {\n if (tracker.pathCache.size === 0) {\n return true;\n }\n\n tracker.lastCheckedValues.clear();\n\n for (const [path, info] of tracker.pathCache.entries()) {\n const currentValue = getValueAtPath(state, info.segments);\n tracker.lastCheckedValues.set(path, currentValue);\n\n if (!Object.is(currentValue, info.value)) {\n tracker.lastCheckedState = state;\n return true;\n }\n }\n\n tracker.lastCheckedState = state;\n return false;\n}\n\n/**\n * @internal\n */\nexport function hasTrackedData<T>(tracker: DependencyState<T>): boolean {\n return (\n tracker.proxyState.trackedPaths.size > 0 ||\n tracker.pathCache.size > 0 ||\n tracker.previousRenderPaths.size > 0\n );\n}\n\n// =============================================================================\n// GETTER TRACKER (Getter execution tracking)\n// =============================================================================\n\n/**\n * @internal\n */\nexport interface GetterState {\n trackedValues: Map<string | symbol, unknown>;\n currentlyAccessing: Set<string | symbol>;\n trackedGetters: Set<string | symbol>;\n isTracking: boolean;\n renderCache: Map<string | symbol, unknown>;\n cacheValid: boolean;\n externalDependencies: Set<StateContainerInstance>;\n}\n\nconst descriptorCache = new WeakMap<\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n Function,\n Map<string | symbol, PropertyDescriptor | undefined>\n>();\n\nconst blocProxyCache = new WeakMap<StateContainerInstance>();\n\nconst activeTrackerMap = new WeakMap<StateContainerInstance, GetterState>();\n\ninterface GetterExecutionContext {\n tracker: GetterState | null;\n currentBloc: StateContainerInstance | null;\n depth: number;\n visitedBlocs: Set<StateContainerInstance>;\n}\n\nconst getterExecutionContext: GetterExecutionContext = {\n tracker: null,\n currentBloc: null,\n depth: 0,\n visitedBlocs: new Set(),\n};\n\nconst MAX_GETTER_DEPTH = BLAC_DEFAULTS.MAX_GETTER_DEPTH;\n\n/**\n * @internal\n */\nexport function getGetterExecutionContext(): GetterExecutionContext {\n return getterExecutionContext;\n}\n\n/**\n * @internal\n */\nexport function getDescriptor(\n obj: any,\n prop: string | symbol,\n): PropertyDescriptor | undefined {\n const constructor = obj.constructor;\n\n let constructorCache = descriptorCache.get(constructor);\n if (constructorCache?.has(prop)) {\n return constructorCache.get(prop);\n }\n\n let current = obj;\n let descriptor: PropertyDescriptor | undefined;\n\n while (current && current !== Object.prototype) {\n descriptor = Object.getOwnPropertyDescriptor(current, prop);\n if (descriptor) {\n break;\n }\n current = Object.getPrototypeOf(current);\n }\n\n if (!constructorCache) {\n constructorCache = new Map();\n descriptorCache.set(constructor, constructorCache);\n }\n constructorCache.set(prop, descriptor);\n\n return descriptor;\n}\n\n/**\n * @internal\n */\nexport function isGetter(obj: any, prop: string | symbol): boolean {\n const descriptor = getDescriptor(obj, prop);\n return descriptor?.get !== undefined;\n}\n\n/**\n * @internal\n */\nexport function createGetterState(): GetterState {\n return {\n trackedValues: new Map(),\n currentlyAccessing: new Set(),\n trackedGetters: new Set(),\n isTracking: false,\n renderCache: new Map(),\n cacheValid: false,\n externalDependencies: new Set(),\n };\n}\n\n/**\n * @internal\n */\nexport function setActiveTracker<TBloc extends StateContainerInstance>(\n bloc: TBloc,\n tracker: GetterState,\n): void {\n activeTrackerMap.set(bloc, tracker);\n}\n\n/**\n * @internal\n */\nexport function clearActiveTracker<TBloc extends StateContainerInstance>(\n bloc: TBloc,\n): void {\n activeTrackerMap.delete(bloc);\n}\n\n/**\n * @internal\n */\nexport function getActiveTracker<TBloc extends StateContainerInstance>(\n bloc: TBloc,\n): GetterState | undefined {\n return activeTrackerMap.get(bloc);\n}\n\n/**\n * @internal\n */\nexport function commitTrackedGetters(tracker: GetterState): void {\n if (tracker.currentlyAccessing.size > 0) {\n tracker.trackedGetters = new Set(tracker.currentlyAccessing);\n }\n tracker.currentlyAccessing.clear();\n}\n\n/**\n * Execute a tracked getter with depth/circular dependency checks and context management.\n * @internal\n */\nfunction executeTrackedGetter<T extends StateContainerInstance>(\n target: T,\n prop: string | symbol,\n tracker: GetterState,\n context: GetterExecutionContext,\n): unknown {\n tracker.currentlyAccessing.add(prop);\n\n if (tracker.cacheValid && tracker.renderCache.has(prop)) {\n const cachedValue = tracker.renderCache.get(prop);\n tracker.trackedValues.set(prop, cachedValue);\n return cachedValue;\n }\n\n if (context.depth >= MAX_GETTER_DEPTH) {\n console.warn(\n `${BLAC_ERROR_PREFIX} Maximum getter depth (${MAX_GETTER_DEPTH}) exceeded. ` +\n `Possible circular dependency in getter \"${String(prop)}\" on ${target.constructor.name}.`,\n );\n return undefined;\n }\n\n if (context.visitedBlocs.has(target)) {\n console.warn(\n `${BLAC_ERROR_PREFIX} Circular dependency detected: getter \"${String(prop)}\" on ${target.constructor.name}.`,\n );\n return undefined;\n }\n\n const prevContext = {\n tracker: context.tracker,\n currentBloc: context.currentBloc,\n depth: context.depth,\n visitedBlocs: new Set(context.visitedBlocs),\n };\n\n context.tracker = tracker;\n context.currentBloc = target;\n context.depth++;\n context.visitedBlocs.add(target);\n\n try {\n const descriptor = getDescriptor(target, prop);\n const value = descriptor!.get!.call(target);\n tracker.trackedValues.set(prop, value);\n return value;\n } catch (error) {\n tracker.currentlyAccessing.delete(prop);\n throw error;\n } finally {\n context.tracker = prevContext.tracker;\n context.currentBloc = prevContext.currentBloc;\n context.depth = prevContext.depth;\n context.visitedBlocs = prevContext.visitedBlocs;\n }\n}\n\n/**\n * @internal\n */\nexport function createBlocProxy<TBloc extends StateContainerInstance>(\n bloc: TBloc,\n): TBloc {\n const cached = blocProxyCache.get(bloc);\n if (cached) {\n return cached;\n }\n\n const proxy = new Proxy(bloc, {\n get(target, prop, receiver) {\n const tracker = activeTrackerMap.get(target);\n\n if (tracker?.isTracking && isGetter(target, prop)) {\n return executeTrackedGetter(\n target,\n prop,\n tracker,\n getterExecutionContext,\n );\n }\n\n return Reflect.get(target, prop, receiver);\n },\n });\n\n blocProxyCache.set(bloc, proxy);\n return proxy;\n}\n\n/**\n * @internal\n */\nexport function hasGetterChanges<TBloc extends StateContainerInstance>(\n bloc: TBloc,\n tracker: GetterState | null,\n): boolean {\n if (!tracker || tracker.trackedGetters.size === 0) {\n return false;\n }\n\n tracker.renderCache.clear();\n\n let hasAnyChange = false;\n\n for (const prop of tracker.trackedGetters) {\n try {\n const descriptor = getDescriptor(bloc, prop);\n if (!descriptor?.get) {\n continue;\n }\n\n const newValue = descriptor.get.call(bloc);\n const oldValue = tracker.trackedValues.get(prop);\n\n tracker.renderCache.set(prop, newValue);\n tracker.trackedValues.set(prop, newValue);\n\n if (!Object.is(newValue, oldValue)) {\n hasAnyChange = true;\n }\n } catch (error) {\n console.warn(\n `${BLAC_ERROR_PREFIX} Getter \"${String(prop)}\" threw error during change detection. Stopping tracking for this getter.`,\n error,\n );\n\n tracker.trackedGetters.delete(prop);\n tracker.trackedValues.delete(prop);\n tracker.cacheValid = false;\n return true;\n }\n }\n\n tracker.cacheValid = true;\n\n return hasAnyChange;\n}\n\n/**\n * @internal\n */\nexport function invalidateRenderCache(tracker: GetterState): void {\n tracker.cacheValid = false;\n}\n\n/**\n * @internal\n */\nexport function clearExternalDependencies(tracker: GetterState): void {\n tracker.externalDependencies.clear();\n}\n\n/**\n * @internal\n */\nexport function resetGetterState(tracker: GetterState): void {\n tracker.trackedValues.clear();\n tracker.currentlyAccessing.clear();\n tracker.trackedGetters.clear();\n tracker.renderCache.clear();\n tracker.cacheValid = false;\n tracker.isTracking = false;\n tracker.externalDependencies.clear();\n}\n\n// =============================================================================\n// TRACKING PROXY (Combined tracking for watch/waitUntil)\n// =============================================================================\n\n/**\n * State for tracking both state property access and getter access.\n */\nexport interface TrackingProxyState {\n dependencyState: DependencyState<any>;\n getterState: GetterState;\n dependencies: Set<StateContainerInstance>;\n isTracking: boolean;\n}\n\n/**\n * Create a new tracking proxy state.\n */\nexport function createState(): TrackingProxyState {\n return {\n dependencyState: createDependencyState(),\n getterState: createGetterState(),\n dependencies: new Set(),\n isTracking: false,\n };\n}\n\n/**\n * Start tracking on a tracking proxy.\n */\nexport function startTracking(tracker: TrackingProxyState): void {\n tracker.isTracking = true;\n tracker.dependencies.clear();\n tracker.getterState.isTracking = true;\n tracker.getterState.externalDependencies.clear();\n startDependency(tracker.dependencyState);\n}\n\n/**\n * Stop tracking and collect all dependencies.\n */\nexport function stopTracking(\n tracker: TrackingProxyState,\n bloc: StateContainerInstance,\n): Set<StateContainerInstance> {\n tracker.isTracking = false;\n tracker.getterState.isTracking = false;\n\n capturePaths(tracker.dependencyState, bloc.state);\n commitTrackedGetters(tracker.getterState);\n\n const allDeps = new Set(tracker.dependencies);\n for (const dep of tracker.getterState.externalDependencies) {\n allDeps.add(dep);\n }\n\n tracker.getterState.externalDependencies.clear();\n\n return allDeps;\n}\n\n/**\n * Check if tracked state or getters have changed.\n */\nexport function hasChanges(\n tracker: TrackingProxyState,\n bloc: StateContainerInstance,\n): boolean {\n invalidateRenderCache(tracker.getterState);\n\n const stateChanged = hasDependencyChanges(\n tracker.dependencyState,\n bloc.state,\n );\n const getterChanged = hasGetterChanges(bloc, tracker.getterState);\n\n return stateChanged || getterChanged;\n}\n\n/**\n * Create a tracking proxy for a bloc instance.\n * Tracks both state property access and getter access.\n */\nexport function createTrackingProxy<T extends StateContainerInstance>(\n bloc: T,\n tracker: TrackingProxyState,\n): T {\n tracker.dependencies.add(bloc);\n\n const stateProxyCache = new WeakMap<object, any>();\n\n const proxy = new Proxy(bloc, {\n get(target, prop, receiver) {\n if (prop === 'state') {\n if (!tracker.isTracking) {\n return target.state;\n }\n\n const rawState = target.state;\n if (rawState === null || typeof rawState !== 'object') {\n return rawState;\n }\n\n if (stateProxyCache.has(rawState)) {\n return stateProxyCache.get(rawState);\n }\n\n const stateProxy = createDependencyProxy(\n tracker.dependencyState,\n rawState,\n );\n stateProxyCache.set(rawState, stateProxy);\n return stateProxy;\n }\n\n if (typeof prop === 'symbol') {\n return Reflect.get(target, prop, receiver);\n }\n\n const value = Reflect.get(target, prop, receiver);\n\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n if (tracker.isTracking && isGetter(target, prop)) {\n return executeTrackedGetter(\n target,\n prop,\n tracker.getterState,\n getGetterExecutionContext(),\n );\n }\n\n return value;\n },\n });\n\n return proxy as T;\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ const require_tracking_proxy = require('./tracking-proxy.cjs');
2
+ const require_dependency_manager = require('./dependency-manager.cjs');
3
+
4
+ exports.DependencyManager = require_dependency_manager.DependencyManager;
5
+ exports.capturePaths = require_tracking_proxy.capturePaths;
6
+ exports.clearActiveTracker = require_tracking_proxy.clearActiveTracker;
7
+ exports.clearExternalDependencies = require_tracking_proxy.clearExternalDependencies;
8
+ exports.commitTrackedGetters = require_tracking_proxy.commitTrackedGetters;
9
+ exports.createBlocProxy = require_tracking_proxy.createBlocProxy;
10
+ exports.createDependencyProxy = require_tracking_proxy.createDependencyProxy;
11
+ exports.createDependencyState = require_tracking_proxy.createDependencyState;
12
+ exports.createGetterState = require_tracking_proxy.createGetterState;
13
+ exports.hasDependencyChanges = require_tracking_proxy.hasDependencyChanges;
14
+ exports.hasGetterChanges = require_tracking_proxy.hasGetterChanges;
15
+ exports.hasTrackedData = require_tracking_proxy.hasTrackedData;
16
+ exports.invalidateRenderCache = require_tracking_proxy.invalidateRenderCache;
17
+ exports.setActiveTracker = require_tracking_proxy.setActiveTracker;
18
+ exports.shallowEqual = require_tracking_proxy.shallowEqual;
19
+ exports.startDependency = require_tracking_proxy.startDependency;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tracking Subpath Export
3
+ *
4
+ * Dependency tracking utilities for framework adapters (React, Vue, etc.).
5
+ * Import from '@blac/core/tracking'
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ export * from './tracking/index';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tracking Subpath Export
3
+ *
4
+ * Dependency tracking utilities for framework adapters (React, Vue, etc.).
5
+ * Import from '@blac/core/tracking'
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ export * from './tracking/index';
@@ -0,0 +1,4 @@
1
+ import { _ as setActiveTracker, a as createBlocProxy, c as createGetterState, g as invalidateRenderCache, h as hasTrackedData, i as commitTrackedGetters, m as hasGetterChanges, n as clearActiveTracker, o as createDependencyProxy, p as hasDependencyChanges, r as clearExternalDependencies, s as createDependencyState, t as capturePaths, v as startDependency, x as shallowEqual } from "./tracking-proxy.js";
2
+ import { t as DependencyManager } from "./dependency-manager.js";
3
+
4
+ export { DependencyManager, capturePaths, clearActiveTracker, clearExternalDependencies, commitTrackedGetters, createBlocProxy, createDependencyProxy, createDependencyState, createGetterState, hasDependencyChanges, hasGetterChanges, hasTrackedData, invalidateRenderCache, setActiveTracker, shallowEqual, startDependency };
package/dist/types.cjs ADDED
@@ -0,0 +1,14 @@
1
+
2
+ //#region src/types/branded.ts
3
+ /**
4
+ * Create a branded InstanceId from a string
5
+ * @param id - The string ID to brand
6
+ * @returns Branded InstanceId
7
+ */
8
+ function instanceId(id) {
9
+ return id;
10
+ }
11
+
12
+ //#endregion
13
+ exports.instanceId = instanceId;
14
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.cjs","names":[],"sources":["../src/types/branded.ts"],"sourcesContent":["declare const brand: unique symbol;\n\n/**\n * Utility type for creating branded/nominal types.\n * Prevents accidental type confusion between similar primitive types.\n * @template T - The base type\n * @template B - The brand identifier\n */\nexport type Brand<T, B> = T & { [brand]: B };\n\n/**\n * Branded string type for type-safe IDs.\n * @template B - The brand identifier\n */\nexport type BrandedId<B> = Brand<string, B>;\n\n/**\n * Branded string type for state container instance IDs\n */\nexport type InstanceId = Brand<string, 'InstanceId'>;\n\n/**\n * Create a branded InstanceId from a string\n * @param id - The string ID to brand\n * @returns Branded InstanceId\n */\nexport function instanceId(id: string): InstanceId {\n return id as InstanceId;\n}\n"],"mappings":";;;;;;;AA0BA,SAAgB,WAAW,IAAwB;AACjD,QAAO"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Branded Types Subpath Export
3
+ *
4
+ * Advanced type utilities for creating nominal/branded types.
5
+ * Import from '@blac/core/types'
6
+ */
7
+ export type { Brand, BrandedId, InstanceId } from './types/branded';
8
+ export { instanceId } from './types/branded';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Branded Types Subpath Export
3
+ *
4
+ * Advanced type utilities for creating nominal/branded types.
5
+ * Import from '@blac/core/types'
6
+ */
7
+ export type { Brand, BrandedId, InstanceId } from './types/branded';
8
+ export { instanceId } from './types/branded';
package/dist/types.js ADDED
@@ -0,0 +1,13 @@
1
+ //#region src/types/branded.ts
2
+ /**
3
+ * Create a branded InstanceId from a string
4
+ * @param id - The string ID to brand
5
+ * @returns Branded InstanceId
6
+ */
7
+ function instanceId(id) {
8
+ return id;
9
+ }
10
+
11
+ //#endregion
12
+ export { instanceId };
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../src/types/branded.ts"],"sourcesContent":["declare const brand: unique symbol;\n\n/**\n * Utility type for creating branded/nominal types.\n * Prevents accidental type confusion between similar primitive types.\n * @template T - The base type\n * @template B - The brand identifier\n */\nexport type Brand<T, B> = T & { [brand]: B };\n\n/**\n * Branded string type for type-safe IDs.\n * @template B - The brand identifier\n */\nexport type BrandedId<B> = Brand<string, B>;\n\n/**\n * Branded string type for state container instance IDs\n */\nexport type InstanceId = Brand<string, 'InstanceId'>;\n\n/**\n * Create a branded InstanceId from a string\n * @param id - The string ID to brand\n * @returns Branded InstanceId\n */\nexport function instanceId(id: string): InstanceId {\n return id as InstanceId;\n}\n"],"mappings":";;;;;;AA0BA,SAAgB,WAAW,IAAwB;AACjD,QAAO"}