@blac/core 2.0.7 → 2.0.9

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 (65) hide show
  1. package/dist/Cubit-CZaf_fp4.cjs +313 -0
  2. package/dist/Cubit-CZaf_fp4.cjs.map +1 -0
  3. package/dist/Cubit-PMTXxI_u.js +290 -0
  4. package/dist/Cubit-PMTXxI_u.js.map +1 -0
  5. package/dist/{StateContainerRegistry-COxgpYAw.cjs → StateContainerRegistry-BsMIpllP.cjs} +7 -1
  6. package/dist/{StateContainerRegistry-COxgpYAw.cjs.map → StateContainerRegistry-BsMIpllP.cjs.map} +1 -1
  7. package/dist/{StateContainerRegistry-DS_wyKck.js → StateContainerRegistry-DOkDGng-.js} +2 -2
  8. package/dist/{StateContainerRegistry-DS_wyKck.js.map → StateContainerRegistry-DOkDGng-.js.map} +1 -1
  9. package/dist/{branded-DndTHjv2.cjs → branded-DCqi3De1.cjs} +1 -1
  10. package/dist/{branded-DndTHjv2.cjs.map → branded-DCqi3De1.cjs.map} +1 -1
  11. package/dist/{branded-mwGzzPF1.js → branded-Max3xOTA.js} +1 -1
  12. package/dist/{branded-mwGzzPF1.js.map → branded-Max3xOTA.js.map} +1 -1
  13. package/dist/config-DLzmy2rZ.cjs +32 -0
  14. package/dist/config-DLzmy2rZ.cjs.map +1 -0
  15. package/dist/config-XQua95Xz.js +16 -0
  16. package/dist/config-XQua95Xz.js.map +1 -0
  17. package/dist/debug.cjs +8 -7
  18. package/dist/debug.js +3 -2
  19. package/dist/ensure-C5I1xp2C.js +9 -0
  20. package/dist/ensure-C5I1xp2C.js.map +1 -0
  21. package/dist/ensure-CSHYjIeH.cjs +14 -0
  22. package/dist/ensure-CSHYjIeH.cjs.map +1 -0
  23. package/dist/index.cjs +24 -305
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +12 -294
  28. package/dist/index.js.map +1 -1
  29. package/dist/management-C-wBdpho.js +29 -0
  30. package/dist/management-C-wBdpho.js.map +1 -0
  31. package/dist/management-xoZ7w3bI.cjs +70 -0
  32. package/dist/management-xoZ7w3bI.cjs.map +1 -0
  33. package/dist/plugins.cjs +1 -1
  34. package/dist/plugins.js +1 -1
  35. package/dist/{resolve-dependencies-8xtWXd53.js → resolve-dependencies-BA3u06uC.js} +4 -3
  36. package/dist/resolve-dependencies-BA3u06uC.js.map +1 -0
  37. package/dist/{resolve-dependencies-DJ2UBTq1.cjs → resolve-dependencies-BT6TU2HF.cjs} +4 -3
  38. package/dist/resolve-dependencies-BT6TU2HF.cjs.map +1 -0
  39. package/dist/testing.cjs +105 -0
  40. package/dist/testing.cjs.map +1 -0
  41. package/dist/testing.d.cts +19 -0
  42. package/dist/testing.d.ts +19 -0
  43. package/dist/testing.js +96 -0
  44. package/dist/testing.js.map +1 -0
  45. package/dist/{tracked-DLnq137F.cjs → tracked-DCfBaYjL.cjs} +6 -16
  46. package/dist/tracked-DCfBaYjL.cjs.map +1 -0
  47. package/dist/{tracked-12W-U7tq.js → tracked-DKduNLgI.js} +5 -9
  48. package/dist/tracked-DKduNLgI.js.map +1 -0
  49. package/dist/tracking/path-utils.d.ts +1 -1
  50. package/dist/tracking/tracking-proxy.d.ts +3 -3
  51. package/dist/tracking.cjs +1 -1
  52. package/dist/tracking.js +1 -1
  53. package/dist/types.cjs +1 -1
  54. package/dist/types.js +1 -1
  55. package/dist/watch-entry.cjs +1 -1
  56. package/dist/watch-entry.js +1 -1
  57. package/package.json +23 -14
  58. package/dist/config-BD9MkJ0k.js +0 -42
  59. package/dist/config-BD9MkJ0k.js.map +0 -1
  60. package/dist/config-DTuCbHcJ.cjs +0 -101
  61. package/dist/config-DTuCbHcJ.cjs.map +0 -1
  62. package/dist/resolve-dependencies-8xtWXd53.js.map +0 -1
  63. package/dist/resolve-dependencies-DJ2UBTq1.cjs.map +0 -1
  64. package/dist/tracked-12W-U7tq.js.map +0 -1
  65. package/dist/tracked-DLnq137F.cjs.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,296 +1,14 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_StateContainerRegistry = require("./StateContainerRegistry-COxgpYAw.cjs");
3
- const require_tracked = require("./tracked-DLnq137F.cjs");
4
- const require_config = require("./config-DTuCbHcJ.cjs");
5
- const require_branded = require("./branded-DndTHjv2.cjs");
6
- //#region src/utils/idGenerator.ts
7
- /**
8
- * Generate simple ID with timestamp and random (no counter tracking)
9
- *
10
- * Format: `${prefix}:${timestamp}_${random}`
11
- *
12
- * @param prefix - Prefix for the ID
13
- * @returns Branded ID string
14
- *
15
- * @example
16
- * ```ts
17
- * const id = generateSimpleId('CounterBloc');
18
- * // Returns: "CounterBloc:1698765432100_a3k9d7f2q"
19
- * ```
20
- */
21
- function generateSimpleId(prefix, affix) {
22
- if (affix) return `${prefix}:${affix}`;
23
- return `${prefix}:${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
24
- }
25
- //#endregion
26
- //#region src/core/symbols.ts
27
- const EMIT = Symbol("blac.emit");
28
- const UPDATE = Symbol("blac.update");
29
- //#endregion
30
- //#region src/core/StateContainer.ts
31
- const EMPTY_DEPS = /* @__PURE__ */ new Map();
32
- var StateContainer = class StateContainer {
33
- static {
34
- this.__excludeFromDevTools = false;
35
- }
36
- static {
37
- this.enableStackTrace = true;
38
- }
39
- get dependencies() {
40
- return this._dependencies ?? EMPTY_DEPS;
41
- }
42
- depend(Type, instanceKey) {
43
- if (!this._dependencies) this._dependencies = /* @__PURE__ */ new Map();
44
- this._dependencies.set(Type, instanceKey ?? require_StateContainerRegistry.BLAC_DEFAULTS.DEFAULT_INSTANCE_KEY);
45
- return () => require_StateContainerRegistry.globalRegistry.ensure(Type, instanceKey);
46
- }
47
- constructor(initialState) {
48
- this._listeners = /* @__PURE__ */ new Set();
49
- this._disposed = false;
50
- this._hydrationStatus = "idle";
51
- this._changedWhileHydrating = false;
52
- this._hydrationPromise = null;
53
- this._hydrationPromiseSettled = false;
54
- this._config = {};
55
- this._systemEventHandlers = /* @__PURE__ */ new Map();
56
- this._dependencies = null;
57
- this.name = this.constructor.name;
58
- this.debug = false;
59
- this.instanceId = generateSimpleId(this.constructor.name, "main");
60
- this.createdAt = Date.now();
61
- this.lastUpdateTimestamp = Date.now();
62
- this.onSystemEvent = (event, handler) => {
63
- let handlers = this._systemEventHandlers.get(event);
64
- if (!handlers) {
65
- handlers = /* @__PURE__ */ new Set();
66
- this._systemEventHandlers.set(event, handlers);
67
- }
68
- handlers.add(handler);
69
- return () => {
70
- handlers?.delete(handler);
71
- };
72
- };
73
- this._state = initialState;
74
- }
75
- initConfig(config) {
76
- this._config = { ...config };
77
- this.name = this._config.name || this.constructor.name;
78
- this.debug = this._config.debug ?? false;
79
- this.instanceId = generateSimpleId(this.constructor.name, this._config.instanceId);
80
- require_StateContainerRegistry.globalRegistry.emit("created", this);
81
- }
82
- get state() {
83
- return this._state;
84
- }
85
- get isDisposed() {
86
- return this._disposed;
87
- }
88
- get hydrationStatus() {
89
- return this._hydrationStatus;
90
- }
91
- get hydrationError() {
92
- return this._hydrationError;
93
- }
94
- get isHydrated() {
95
- return this._hydrationStatus === "hydrated";
96
- }
97
- get changedWhileHydrating() {
98
- return this._changedWhileHydrating;
99
- }
100
- subscribe(listener) {
101
- if (this._disposed) throw new Error(`Cannot subscribe to disposed container ${this.name}`);
102
- this._listeners.add(listener);
103
- return () => this._listeners.delete(listener);
104
- }
105
- dispose() {
106
- if (this._disposed) return;
107
- if (this.debug) console.log(`[${this.name}] Disposing...`);
108
- this._disposed = true;
109
- if (this._hydrationStatus === "hydrating") this.failHydration(/* @__PURE__ */ new Error(`Hydration cancelled because ${this.name} was disposed`));
110
- this.emitSystemEvent("dispose", void 0);
111
- this._listeners.clear();
112
- this._systemEventHandlers.clear();
113
- require_StateContainerRegistry.globalRegistry.emit("disposed", this);
114
- if (this.debug) console.log(`[${this.name}] Disposed successfully`);
115
- }
116
- [EMIT](newState) {
117
- this.applyState(newState, "default");
118
- }
119
- [UPDATE](updater) {
120
- if (this._disposed) throw new Error(`Cannot update state from disposed container ${this.name}`);
121
- this[EMIT](updater(this._state));
122
- }
123
- beginHydration() {
124
- if (this._disposed) throw new Error(`Cannot begin hydration for disposed container ${this.name}`);
125
- this._changedWhileHydrating = false;
126
- this._hydrationError = void 0;
127
- this._hydrationPromise = null;
128
- this._resolveHydrationPromise = void 0;
129
- this._rejectHydrationPromise = void 0;
130
- this._hydrationPromiseSettled = false;
131
- this.ensureHydrationPromise();
132
- this.setHydrationStatus("hydrating");
133
- }
134
- applyHydratedState(newState) {
135
- if (this._disposed) return false;
136
- if (this._hydrationStatus !== "hydrating" || this._changedWhileHydrating) return false;
137
- this.applyState(newState, "hydration");
138
- return true;
139
- }
140
- finishHydration() {
141
- if (this._hydrationStatus !== "hydrating") {
142
- if (this._hydrationStatus === "hydrated") return;
143
- if (this._hydrationStatus === "error") this.ensureHydrationPromise();
144
- }
145
- this.setHydrationStatus("hydrated");
146
- this.resolveHydration();
147
- }
148
- failHydration(error) {
149
- const err = error instanceof Error ? error : /* @__PURE__ */ new Error(`Hydration failed: ${error}`);
150
- this._hydrationError = err;
151
- this.setHydrationStatus("error", err);
152
- this.rejectHydration(err);
153
- }
154
- waitForHydration() {
155
- if (this._hydrationStatus === "idle" || this._hydrationStatus === "hydrated") return Promise.resolve();
156
- if (this._hydrationStatus === "error") return Promise.reject(this._hydrationError ?? /* @__PURE__ */ new Error(`Hydration failed for container ${this.name}`));
157
- return this.ensureHydrationPromise();
158
- }
159
- captureStackTrace() {
160
- if (!StateContainer.enableStackTrace || typeof process !== "undefined" && process.env?.NODE_ENV === "production") return "";
161
- try {
162
- const relevantLines = ((/* @__PURE__ */ new Error()).stack || "").split("\n").slice(1);
163
- const formattedLines = [];
164
- for (const line of relevantLines) {
165
- if (!line.trim()) continue;
166
- if (line.includes("StateContainer.emit") || line.includes("StateContainer.update") || line.includes("StateContainer.captureStackTrace") || line.includes("[blac.emit]") || line.includes("[blac.update]") || line.includes("Cubit.patch")) continue;
167
- if (line.includes("node_modules") || line.includes("react-dom") || line.includes("react_jsx") || line.includes(".vite/deps") || line.includes("executeDispatch") || line.includes("runWithFiber") || line.includes("invokeGuarded") || line.includes("callCallback") || line.includes("processDispatchQueue") || line.includes("dispatchEvent") || line.includes("batchedUpdates")) continue;
168
- const formatted = this.formatStackLine(line);
169
- if (formatted) formattedLines.push(formatted);
170
- }
171
- return formattedLines.join("\n");
172
- } catch {
173
- return "";
174
- }
175
- }
176
- formatStackLine(line) {
177
- const match = line.match(/at\s+(.+?)\s+\((.+?):(\d+):(\d+)\)/);
178
- if (!match) {
179
- const simpleMatch = line.match(/at\s+(.+?):(\d+):(\d+)/);
180
- if (simpleMatch) {
181
- const [, url, lineNum, col] = simpleMatch;
182
- return ` at ${this.cleanFilePath(url)}:${lineNum}:${col}`;
183
- }
184
- return null;
185
- }
186
- const [, functionName, url, lineNum, col] = match;
187
- return ` at ${functionName} (${this.cleanFilePath(url)}:${lineNum}:${col})`;
188
- }
189
- cleanFilePath(url) {
190
- let path = url.replace(/http:\/\/localhost:\d+\/@fs/, "").replace(/http:\/\/localhost:\d+\//, "").replace(/\?t=\d+/, "").replace(/\?v=[a-f0-9]+/, "");
191
- const projectMatch = path.match(/\/Projects\/blac\/(.+)/);
192
- if (projectMatch) path = projectMatch[1];
193
- const segments = path.split("/");
194
- if (segments.length > 3) path = segments.slice(-3).join("/");
195
- return path;
196
- }
197
- applyState(newState, source) {
198
- if (this._disposed) throw new Error(`Cannot emit state from disposed container ${this.name}`);
199
- if (this._state === newState) return;
200
- if (this._hydrationStatus === "hydrating" && source !== "hydration") this._changedWhileHydrating = true;
201
- const previousState = this._state;
202
- this._state = newState;
203
- this.emitSystemEvent("stateChanged", {
204
- state: newState,
205
- previousState
206
- });
207
- const listeners = Array.from(this._listeners);
208
- for (const listener of listeners) try {
209
- listener(newState);
210
- } catch (error) {
211
- console.error(`[${this.name}] Error in listener:`, error);
212
- }
213
- const stackTrace = this.captureStackTrace();
214
- require_StateContainerRegistry.globalRegistry.emit("stateChanged", this, previousState, newState, stackTrace);
215
- this.lastUpdateTimestamp = Date.now();
216
- }
217
- setHydrationStatus(status, error) {
218
- const previousStatus = this._hydrationStatus;
219
- this._hydrationStatus = status;
220
- this._hydrationError = error;
221
- this.emitSystemEvent("hydrationChanged", {
222
- status,
223
- previousStatus,
224
- error,
225
- changedWhileHydrating: this._changedWhileHydrating
226
- });
227
- }
228
- ensureHydrationPromise() {
229
- if (!this._hydrationPromise || this._hydrationPromiseSettled) {
230
- this._hydrationPromiseSettled = false;
231
- this._hydrationPromise = new Promise((resolve, reject) => {
232
- this._resolveHydrationPromise = () => {
233
- if (this._hydrationPromiseSettled) return;
234
- this._hydrationPromiseSettled = true;
235
- resolve();
236
- };
237
- this._rejectHydrationPromise = (error) => {
238
- if (this._hydrationPromiseSettled) return;
239
- this._hydrationPromiseSettled = true;
240
- reject(error);
241
- };
242
- });
243
- this._hydrationPromise.catch(() => {});
244
- }
245
- return this._hydrationPromise;
246
- }
247
- resolveHydration() {
248
- this._resolveHydrationPromise?.();
249
- }
250
- rejectHydration(error) {
251
- this.ensureHydrationPromise();
252
- this._rejectHydrationPromise?.(error);
253
- }
254
- emitSystemEvent(event, payload) {
255
- const handlers = this._systemEventHandlers.get(event);
256
- if (!handlers) return;
257
- for (const handler of handlers) try {
258
- handler(payload);
259
- } catch (error) {
260
- console.error(`[${this.name}] Error in system event handler:`, error);
261
- }
262
- }
263
- };
264
- //#endregion
265
- //#region src/core/Cubit.ts
266
- var Cubit = class extends StateContainer {
267
- constructor(initialState) {
268
- super(initialState);
269
- this.patch = ((partial) => {
270
- if (typeof this.state !== "object" || this.state === null) throw new Error("patch() is only available for object state types");
271
- const current = this.state;
272
- let hasChanges = false;
273
- for (const key in partial) if (!Object.is(current[key], partial[key])) {
274
- hasChanges = true;
275
- break;
276
- }
277
- if (hasChanges) this.update((c) => ({
278
- ...c,
279
- ...partial
280
- }));
281
- });
282
- }
283
- emit(newState) {
284
- this[EMIT](newState);
285
- }
286
- update(updater) {
287
- this[UPDATE](updater);
288
- }
289
- };
290
- //#endregion
2
+ const require_Cubit = require("./Cubit-CZaf_fp4.cjs");
3
+ const require_StateContainerRegistry = require("./StateContainerRegistry-BsMIpllP.cjs");
4
+ const require_config = require("./config-DLzmy2rZ.cjs");
5
+ const require_ensure = require("./ensure-CSHYjIeH.cjs");
6
+ const require_management = require("./management-xoZ7w3bI.cjs");
7
+ const require_tracked = require("./tracked-DCfBaYjL.cjs");
8
+ const require_branded = require("./branded-DCqi3De1.cjs");
291
9
  //#region src/registry/acquire.ts
292
10
  function acquire(BlocClass, instanceKey) {
293
- return require_StateContainerRegistry.globalRegistry.acquire(BlocClass, instanceKey, {
11
+ return require_config.getRegistry().acquire(BlocClass, instanceKey, {
294
12
  canCreate: true,
295
13
  countRef: true
296
14
  });
@@ -298,15 +16,15 @@ function acquire(BlocClass, instanceKey) {
298
16
  //#endregion
299
17
  //#region src/registry/borrow.ts
300
18
  function borrow(BlocClass, instanceKey) {
301
- return require_StateContainerRegistry.globalRegistry.borrow(BlocClass, instanceKey);
19
+ return require_config.getRegistry().borrow(BlocClass, instanceKey);
302
20
  }
303
21
  function borrowSafe(BlocClass, instanceKey) {
304
- return require_StateContainerRegistry.globalRegistry.borrowSafe(BlocClass, instanceKey);
22
+ return require_config.getRegistry().borrowSafe(BlocClass, instanceKey);
305
23
  }
306
24
  //#endregion
307
25
  //#region src/registry/release.ts
308
26
  function release(BlocClass, instanceKey, forceDispose = false) {
309
- require_StateContainerRegistry.globalRegistry.release(BlocClass, instanceKey, forceDispose);
27
+ require_config.getRegistry().release(BlocClass, instanceKey, forceDispose);
310
28
  }
311
29
  //#endregion
312
30
  //#region src/decorators/blac.ts
@@ -337,31 +55,32 @@ function blac(options) {
337
55
  };
338
56
  }
339
57
  //#endregion
340
- exports.Cubit = Cubit;
341
- exports.EMIT = EMIT;
58
+ exports.Cubit = require_Cubit.Cubit;
59
+ exports.EMIT = require_Cubit.EMIT;
342
60
  exports.PluginManager = require_StateContainerRegistry.PluginManager;
343
- exports.StateContainer = StateContainer;
61
+ exports.StateContainer = require_Cubit.StateContainer;
62
+ exports.StateContainerRegistry = require_StateContainerRegistry.StateContainerRegistry;
344
63
  exports.TrackedContext = require_tracked.TrackedContext;
345
- exports.UPDATE = UPDATE;
64
+ exports.UPDATE = require_Cubit.UPDATE;
346
65
  exports.acquire = acquire;
347
66
  exports.blac = blac;
348
67
  exports.borrow = borrow;
349
68
  exports.borrowSafe = borrowSafe;
350
- exports.clear = require_config.clear;
351
- exports.clearAll = require_config.clearAll;
69
+ exports.clear = require_management.clear;
70
+ exports.clearAll = require_management.clearAll;
352
71
  exports.createTrackedContext = require_tracked.createTrackedContext;
353
- exports.ensure = require_tracked.ensure;
354
- exports.forEach = require_config.forEach;
355
- exports.getAll = require_config.getAll;
72
+ exports.ensure = require_ensure.ensure;
73
+ exports.forEach = require_management.forEach;
74
+ exports.getAll = require_management.getAll;
356
75
  exports.getPluginManager = require_StateContainerRegistry.getPluginManager;
357
- exports.getRefCount = require_config.getRefCount;
76
+ exports.getRefCount = require_management.getRefCount;
358
77
  exports.getRegistry = require_config.getRegistry;
359
78
  exports.getStats = require_config.getStats;
360
79
  exports.globalRegistry = require_StateContainerRegistry.globalRegistry;
361
- exports.hasInstance = require_config.hasInstance;
80
+ exports.hasInstance = require_management.hasInstance;
362
81
  exports.instance = require_tracked.instance;
363
82
  exports.instanceId = require_branded.instanceId;
364
- exports.register = require_config.register;
83
+ exports.register = require_management.register;
365
84
  exports.release = release;
366
85
  exports.setRegistry = require_config.setRegistry;
367
86
  exports.tracked = require_tracked.tracked;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["BLAC_DEFAULTS","globalRegistry","globalRegistry","globalRegistry","BLAC_STATIC_PROPS"],"sources":["../src/utils/idGenerator.ts","../src/core/symbols.ts","../src/core/StateContainer.ts","../src/core/Cubit.ts","../src/registry/acquire.ts","../src/registry/borrow.ts","../src/registry/release.ts","../src/decorators/blac.ts"],"sourcesContent":["/**\n * Centralized ID Generation\n *\n * Provides consistent, collision-resistant ID generation for all BlaC subsystems.\n * Uses timestamp + counter + random suffix for uniqueness.\n */\n\n// Global counter map for ID generation\nconst globalCounters = new Map<string, number>();\n\n/**\n * Creates an ID generator with isolated counter state\n *\n * @param prefix - Prefix for generated IDs\n * @returns Object with next(), nextSimple(), and reset() methods\n *\n * @example\n * ```ts\n * const generator = createIdGenerator('sub');\n * const id1 = generator.next(); // \"sub:1698765432100_1_a3k9d7f2q\"\n * const id2 = generator.next(); // \"sub:1698765432101_2_b4n8e9g3r\"\n * ```\n */\nexport function createIdGenerator(prefix: string) {\n let counter = 0;\n return {\n next: () =>\n `${prefix}:${Date.now()}_${++counter}_${Math.random().toString(36).substring(2, 11)}`,\n nextSimple: () => `${prefix}:${++counter}`,\n reset: () => {\n counter = 0;\n },\n };\n}\n\n/**\n * Generate ID with timestamp, counter, and random suffix (tree-shakeable)\n *\n * Format: `${prefix}:${timestamp}_${counter}_${random}`\n *\n * @param prefix - Prefix for the ID (e.g., 'sub', 'consumer', 'stage')\n * @returns Branded ID string\n *\n * @example\n * const id = generateId('sub');\n * // Returns: \"sub:1698765432100_1_a3k9d7f2q\"\n */\nexport function generateId(prefix: string): string {\n const counter = (globalCounters.get(prefix) ?? 0) + 1;\n globalCounters.set(prefix, counter);\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 11);\n return `${prefix}:${timestamp}_${counter}_${random}`;\n}\n\n/**\n * Generate simple ID with timestamp and random (no counter tracking)\n *\n * Format: `${prefix}:${timestamp}_${random}`\n *\n * @param prefix - Prefix for the ID\n * @returns Branded ID string\n *\n * @example\n * ```ts\n * const id = generateSimpleId('CounterBloc');\n * // Returns: \"CounterBloc:1698765432100_a3k9d7f2q\"\n * ```\n */\nexport function generateSimpleId(prefix: string, affix?: string): string {\n if (affix) {\n return `${prefix}:${affix}`;\n }\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 11);\n return `${prefix}:${timestamp}_${random}`;\n}\n\n/**\n * Reset all counters for testing purposes\n * @internal\n */\nexport function __resetIdCounters(): void {\n globalCounters.clear();\n}\n","export const EMIT = Symbol('blac.emit');\nexport const UPDATE = Symbol('blac.update');\n","import { generateSimpleId } from '../utils/idGenerator';\nimport { BLAC_DEFAULTS } from '../constants';\nimport { globalRegistry } from './StateContainerRegistry';\nimport type { StateContainerConstructor } from '../types/utilities';\nimport { EMIT, UPDATE } from './symbols';\n\nexport interface StateContainerConfig {\n name?: string;\n debug?: boolean;\n instanceId?: string;\n}\n\nexport type HydrationStatus = 'idle' | 'hydrating' | 'hydrated' | 'error';\n\ntype StateListener<S> = (state: S) => void;\n\nexport type SystemEvent = 'stateChanged' | 'dispose' | 'hydrationChanged';\n\nexport interface SystemEventPayloads<S> {\n stateChanged: { state: S; previousState: S };\n dispose: void;\n hydrationChanged: {\n status: HydrationStatus;\n previousStatus: HydrationStatus;\n error?: Error;\n changedWhileHydrating: boolean;\n };\n}\n\ntype SystemEventHandler<S, E extends SystemEvent> = (\n payload: SystemEventPayloads<S>[E],\n) => void;\n\nconst EMPTY_DEPS: ReadonlyMap<any, any> = new Map();\n\nexport abstract class StateContainer<S extends object = any> {\n static __excludeFromDevTools = false;\n static enableStackTrace = true;\n\n private _state: S;\n private readonly _listeners = new Set<StateListener<S>>();\n private _disposed = false;\n private _hydrationStatus: HydrationStatus = 'idle';\n private _hydrationError?: Error;\n private _changedWhileHydrating = false;\n private _hydrationPromise: Promise<void> | null = null;\n private _resolveHydrationPromise?: () => void;\n private _rejectHydrationPromise?: (error: Error) => void;\n private _hydrationPromiseSettled = false;\n private _config: StateContainerConfig = {};\n private readonly _systemEventHandlers = new Map<\n SystemEvent,\n Set<SystemEventHandler<S, any>>\n >();\n private _dependencies: Map<StateContainerConstructor, string> | null = null;\n\n name: string = this.constructor.name;\n debug: boolean = false;\n instanceId: string = generateSimpleId(this.constructor.name, 'main');\n createdAt: number = Date.now();\n lastUpdateTimestamp: number = Date.now();\n\n get dependencies(): ReadonlyMap<StateContainerConstructor, string> {\n return this._dependencies ?? EMPTY_DEPS;\n }\n\n protected depend<T extends StateContainerConstructor>(\n Type: T,\n instanceKey?: string,\n ): () => InstanceType<T> {\n if (!this._dependencies) {\n this._dependencies = new Map();\n }\n this._dependencies.set(\n Type,\n instanceKey ?? BLAC_DEFAULTS.DEFAULT_INSTANCE_KEY,\n );\n return () => globalRegistry.ensure(Type, instanceKey);\n }\n\n constructor(initialState: S) {\n this._state = initialState;\n }\n\n initConfig(config: StateContainerConfig): void {\n this._config = { ...config };\n this.name = this._config.name || this.constructor.name;\n this.debug = this._config.debug ?? false;\n this.instanceId = generateSimpleId(\n this.constructor.name,\n this._config.instanceId,\n );\n globalRegistry.emit('created', this);\n }\n\n get state(): Readonly<S> {\n return this._state;\n }\n\n get isDisposed(): boolean {\n return this._disposed;\n }\n\n get hydrationStatus(): HydrationStatus {\n return this._hydrationStatus;\n }\n\n get hydrationError(): Error | undefined {\n return this._hydrationError;\n }\n\n get isHydrated(): boolean {\n return this._hydrationStatus === 'hydrated';\n }\n\n get changedWhileHydrating(): boolean {\n return this._changedWhileHydrating;\n }\n\n subscribe(listener: StateListener<S>): () => void {\n if (this._disposed) {\n throw new Error(`Cannot subscribe to disposed container ${this.name}`);\n }\n this._listeners.add(listener);\n return () => this._listeners.delete(listener);\n }\n\n dispose(): void {\n if (this._disposed) return;\n\n if (this.debug) {\n console.log(`[${this.name}] Disposing...`);\n }\n\n this._disposed = true;\n\n if (this._hydrationStatus === 'hydrating') {\n this.failHydration(\n new Error(`Hydration cancelled because ${this.name} was disposed`),\n );\n }\n\n this.emitSystemEvent('dispose', undefined as void);\n\n this._listeners.clear();\n this._systemEventHandlers.clear();\n\n globalRegistry.emit('disposed', this);\n\n if (this.debug) {\n console.log(`[${this.name}] Disposed successfully`);\n }\n }\n\n protected [EMIT](newState: S): void {\n this.applyState(newState, 'default');\n }\n\n protected [UPDATE](updater: (current: S) => S): void {\n if (this._disposed) {\n throw new Error(\n `Cannot update state from disposed container ${this.name}`,\n );\n }\n this[EMIT](updater(this._state));\n }\n\n beginHydration(): void {\n if (this._disposed) {\n throw new Error(\n `Cannot begin hydration for disposed container ${this.name}`,\n );\n }\n\n this._changedWhileHydrating = false;\n this._hydrationError = undefined;\n this._hydrationPromise = null;\n this._resolveHydrationPromise = undefined;\n this._rejectHydrationPromise = undefined;\n this._hydrationPromiseSettled = false;\n this.ensureHydrationPromise();\n this.setHydrationStatus('hydrating');\n }\n\n applyHydratedState(newState: S): boolean {\n if (this._disposed) {\n return false;\n }\n\n if (this._hydrationStatus !== 'hydrating' || this._changedWhileHydrating) {\n return false;\n }\n\n this.applyState(newState, 'hydration');\n return true;\n }\n\n finishHydration(): void {\n if (this._hydrationStatus !== 'hydrating') {\n if (this._hydrationStatus === 'hydrated') {\n return;\n }\n if (this._hydrationStatus === 'error') {\n this.ensureHydrationPromise();\n }\n }\n\n this.setHydrationStatus('hydrated');\n this.resolveHydration();\n }\n\n failHydration(error: Error): void {\n const err =\n error instanceof Error ? error : new Error(`Hydration failed: ${error}`);\n\n this._hydrationError = err;\n this.setHydrationStatus('error', err);\n this.rejectHydration(err);\n }\n\n waitForHydration(): Promise<void> {\n if (\n this._hydrationStatus === 'idle' ||\n this._hydrationStatus === 'hydrated'\n ) {\n return Promise.resolve();\n }\n\n if (this._hydrationStatus === 'error') {\n return Promise.reject(\n this._hydrationError ??\n new Error(`Hydration failed for container ${this.name}`),\n );\n }\n\n return this.ensureHydrationPromise();\n }\n\n private captureStackTrace(): string {\n if (\n !StateContainer.enableStackTrace ||\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'production')\n ) {\n return '';\n }\n\n try {\n const error = new Error();\n const stack = error.stack || '';\n const lines = stack.split('\\n');\n const relevantLines = lines.slice(1);\n const formattedLines: string[] = [];\n\n for (const line of relevantLines) {\n if (!line.trim()) continue;\n\n if (\n line.includes('StateContainer.emit') ||\n line.includes('StateContainer.update') ||\n line.includes('StateContainer.captureStackTrace') ||\n line.includes('[blac.emit]') ||\n line.includes('[blac.update]') ||\n line.includes('Cubit.patch')\n ) {\n continue;\n }\n\n if (\n line.includes('node_modules') ||\n line.includes('react-dom') ||\n line.includes('react_jsx') ||\n line.includes('.vite/deps') ||\n line.includes('executeDispatch') ||\n line.includes('runWithFiber') ||\n line.includes('invokeGuarded') ||\n line.includes('callCallback') ||\n line.includes('processDispatchQueue') ||\n line.includes('dispatchEvent') ||\n line.includes('batchedUpdates')\n ) {\n continue;\n }\n\n const formatted = this.formatStackLine(line);\n if (formatted) {\n formattedLines.push(formatted);\n }\n }\n\n return formattedLines.join('\\n');\n } catch {\n return '';\n }\n }\n\n private formatStackLine(line: string): string | null {\n const match = line.match(/at\\s+(.+?)\\s+\\((.+?):(\\d+):(\\d+)\\)/);\n if (!match) {\n const simpleMatch = line.match(/at\\s+(.+?):(\\d+):(\\d+)/);\n if (simpleMatch) {\n const [, url, lineNum, col] = simpleMatch;\n const cleanPath = this.cleanFilePath(url);\n return ` at ${cleanPath}:${lineNum}:${col}`;\n }\n return null;\n }\n\n const [, functionName, url, lineNum, col] = match;\n const cleanPath = this.cleanFilePath(url);\n\n return ` at ${functionName} (${cleanPath}:${lineNum}:${col})`;\n }\n\n private cleanFilePath(url: string): string {\n let path = url\n .replace(/http:\\/\\/localhost:\\d+\\/@fs/, '')\n .replace(/http:\\/\\/localhost:\\d+\\//, '')\n .replace(/\\?t=\\d+/, '')\n .replace(/\\?v=[a-f0-9]+/, '');\n\n const projectMatch = path.match(/\\/Projects\\/blac\\/(.+)/);\n if (projectMatch) {\n path = projectMatch[1];\n }\n\n const segments = path.split('/');\n if (segments.length > 3) {\n path = segments.slice(-3).join('/');\n }\n\n return path;\n }\n\n private applyState(newState: S, source: 'default' | 'hydration'): void {\n if (this._disposed) {\n throw new Error(`Cannot emit state from disposed container ${this.name}`);\n }\n\n if (this._state === newState) return;\n\n if (this._hydrationStatus === 'hydrating' && source !== 'hydration') {\n this._changedWhileHydrating = true;\n }\n\n const previousState = this._state;\n this._state = newState;\n\n this.emitSystemEvent('stateChanged', {\n state: newState,\n previousState,\n });\n\n const listeners = Array.from(this._listeners);\n for (const listener of listeners) {\n try {\n listener(newState);\n } catch (error) {\n console.error(`[${this.name}] Error in listener:`, error);\n }\n }\n\n const stackTrace = this.captureStackTrace();\n\n globalRegistry.emit(\n 'stateChanged',\n this,\n previousState,\n newState,\n stackTrace,\n );\n this.lastUpdateTimestamp = Date.now();\n }\n\n private setHydrationStatus(status: HydrationStatus, error?: Error): void {\n const previousStatus = this._hydrationStatus;\n this._hydrationStatus = status;\n this._hydrationError = error;\n\n this.emitSystemEvent('hydrationChanged', {\n status,\n previousStatus,\n error,\n changedWhileHydrating: this._changedWhileHydrating,\n });\n }\n\n private ensureHydrationPromise(): Promise<void> {\n if (!this._hydrationPromise || this._hydrationPromiseSettled) {\n this._hydrationPromiseSettled = false;\n this._hydrationPromise = new Promise<void>((resolve, reject) => {\n this._resolveHydrationPromise = () => {\n if (this._hydrationPromiseSettled) return;\n this._hydrationPromiseSettled = true;\n resolve();\n };\n this._rejectHydrationPromise = (error: Error) => {\n if (this._hydrationPromiseSettled) return;\n this._hydrationPromiseSettled = true;\n reject(error);\n };\n });\n this._hydrationPromise.catch(() => {});\n }\n\n return this._hydrationPromise;\n }\n\n private resolveHydration(): void {\n this._resolveHydrationPromise?.();\n }\n\n private rejectHydration(error: Error): void {\n this.ensureHydrationPromise();\n this._rejectHydrationPromise?.(error);\n }\n\n protected onSystemEvent = <E extends SystemEvent>(\n event: E,\n handler: SystemEventHandler<S, E>,\n ): (() => void) => {\n let handlers = this._systemEventHandlers.get(event);\n if (!handlers) {\n handlers = new Set();\n this._systemEventHandlers.set(event, handlers);\n }\n handlers.add(handler as SystemEventHandler<S, any>);\n\n return () => {\n handlers?.delete(handler as SystemEventHandler<S, any>);\n };\n };\n\n private emitSystemEvent<E extends SystemEvent>(\n event: E,\n payload: SystemEventPayloads<S>[E],\n ): void {\n const handlers = this._systemEventHandlers.get(event);\n if (!handlers) return;\n\n for (const handler of handlers) {\n try {\n handler(payload);\n } catch (error) {\n console.error(`[${this.name}] Error in system event handler:`, error);\n }\n }\n }\n}\n","import { StateContainer } from './StateContainer';\nimport { EMIT, UPDATE } from './symbols';\n\nexport abstract class Cubit<S extends object = any> extends StateContainer<S> {\n constructor(initialState: S) {\n super(initialState);\n }\n\n public emit(newState: S): void {\n this[EMIT](newState);\n }\n\n public update(updater: (current: S) => S): void {\n this[UPDATE](updater);\n }\n\n public patch = ((partial: S extends object ? Partial<S> : never): void => {\n if (typeof this.state !== 'object' || this.state === null) {\n throw new Error('patch() is only available for object state types');\n }\n const current = this.state;\n let hasChanges = false;\n for (const key in partial) {\n if (!Object.is((current as any)[key], (partial as any)[key])) {\n hasChanges = true;\n break;\n }\n }\n if (hasChanges) {\n this.update((c) => ({ ...c, ...partial }) as S);\n }\n }) as S extends object ? (partial: Partial<S>) => void : never;\n}\n","import { globalRegistry } from '../core/StateContainerRegistry';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function acquire<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n): InstanceType<T> {\n return globalRegistry.acquire(BlocClass, instanceKey, {\n canCreate: true,\n countRef: true,\n });\n}\n","import { globalRegistry } from '../core/StateContainerRegistry';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function borrow<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n): InstanceType<T> {\n return globalRegistry.borrow(BlocClass, instanceKey);\n}\n\nexport function borrowSafe<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n):\n | { error: Error; instance: null }\n | { error: null; instance: InstanceType<T> } {\n return globalRegistry.borrowSafe(BlocClass, instanceKey);\n}\n","import { globalRegistry } from '../core/StateContainerRegistry';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function release<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n forceDispose = false,\n): void {\n globalRegistry.release(BlocClass, instanceKey, forceDispose);\n}\n","import { BLAC_STATIC_PROPS } from '../constants';\n\n/**\n * Configuration options for the @blac decorator.\n * Only one option can be specified at a time (union type).\n */\nexport type BlacOptions =\n /** Mark bloc to never be auto-disposed when ref count reaches 0 */\n | { keepAlive: true }\n /** Exclude bloc from DevTools tracking (prevents infinite loops) */\n | { excludeFromDevTools: true };\n\n/**\n * Decorator to configure StateContainer classes.\n *\n * @example Decorator syntax (requires experimentalDecorators or TC39 decorators)\n * ```ts\n * @blac({ keepAlive: true })\n * class AuthBloc extends Cubit<AuthState> {}\n *\n * @blac({ excludeFromDevTools: true })\n * class InternalBloc extends Cubit<InternalState> {}\n * ```\n *\n * @example Function syntax (no decorator support needed)\n * ```ts\n * const AuthBloc = blac({ keepAlive: true })(\n * class extends Cubit<AuthState> {}\n * );\n * ```\n */\nexport function blac(options: BlacOptions) {\n return function <T extends new (...args: any[]) => any>(\n target: T,\n _context?: ClassDecoratorContext,\n ): T {\n if ('keepAlive' in options && options.keepAlive) {\n (target as any)[BLAC_STATIC_PROPS.KEEP_ALIVE] = true;\n }\n if ('excludeFromDevTools' in options && options.excludeFromDevTools) {\n (target as any)[BLAC_STATIC_PROPS.EXCLUDE_FROM_DEVTOOLS] = true;\n }\n return target;\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["getRegistry","getRegistry","BLAC_STATIC_PROPS"],"sources":["../src/registry/acquire.ts","../src/registry/borrow.ts","../src/registry/release.ts","../src/decorators/blac.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function acquire<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n): InstanceType<T> {\n return getRegistry().acquire(BlocClass, instanceKey, {\n canCreate: true,\n countRef: true,\n });\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function borrow<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n): InstanceType<T> {\n return getRegistry().borrow(BlocClass, instanceKey);\n}\n\nexport function borrowSafe<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n):\n | { error: Error; instance: null }\n | { error: null; instance: InstanceType<T> } {\n return getRegistry().borrowSafe(BlocClass, instanceKey);\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function release<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n forceDispose = false,\n): void {\n getRegistry().release(BlocClass, instanceKey, forceDispose);\n}\n","import { BLAC_STATIC_PROPS } from '../constants';\n\n/**\n * Configuration options for the @blac decorator.\n * Only one option can be specified at a time (union type).\n */\nexport type BlacOptions =\n /** Mark bloc to never be auto-disposed when ref count reaches 0 */\n | { keepAlive: true }\n /** Exclude bloc from DevTools tracking (prevents infinite loops) */\n | { excludeFromDevTools: true };\n\n/**\n * Decorator to configure StateContainer classes.\n *\n * @example Decorator syntax (requires experimentalDecorators or TC39 decorators)\n * ```ts\n * @blac({ keepAlive: true })\n * class AuthBloc extends Cubit<AuthState> {}\n *\n * @blac({ excludeFromDevTools: true })\n * class InternalBloc extends Cubit<InternalState> {}\n * ```\n *\n * @example Function syntax (no decorator support needed)\n * ```ts\n * const AuthBloc = blac({ keepAlive: true })(\n * class extends Cubit<AuthState> {}\n * );\n * ```\n */\nexport function blac(options: BlacOptions) {\n return function <T extends new (...args: any[]) => any>(\n target: T,\n _context?: ClassDecoratorContext,\n ): T {\n if ('keepAlive' in options && options.keepAlive) {\n (target as any)[BLAC_STATIC_PROPS.KEEP_ALIVE] = true;\n }\n if ('excludeFromDevTools' in options && options.excludeFromDevTools) {\n (target as any)[BLAC_STATIC_PROPS.EXCLUDE_FROM_DEVTOOLS] = true;\n }\n return target;\n };\n}\n"],"mappings":";;;;;;;;;AAGA,SAAgB,QACd,WACA,aACiB;AACjB,QAAOA,eAAAA,aAAa,CAAC,QAAQ,WAAW,aAAa;EACnD,WAAW;EACX,UAAU;EACX,CAAC;;;;ACPJ,SAAgB,OACd,WACA,aACiB;AACjB,QAAOC,eAAAA,aAAa,CAAC,OAAO,WAAW,YAAY;;AAGrD,SAAgB,WACd,WACA,aAG6C;AAC7C,QAAOA,eAAAA,aAAa,CAAC,WAAW,WAAW,YAAY;;;;ACbzD,SAAgB,QACd,WACA,aACA,eAAe,OACT;AACN,gBAAA,aAAa,CAAC,QAAQ,WAAW,aAAa,aAAa;;;;;;;;;;;;;;;;;;;;;;;ACuB7D,SAAgB,KAAK,SAAsB;AACzC,QAAO,SACL,QACA,UACG;AACH,MAAI,eAAe,WAAW,QAAQ,UACnC,QAAeC,+BAAAA,kBAAkB,cAAc;AAElD,MAAI,yBAAyB,WAAW,QAAQ,oBAC7C,QAAeA,+BAAAA,kBAAkB,yBAAyB;AAE7D,SAAO"}
package/dist/index.d.cts CHANGED
@@ -3,7 +3,7 @@ export type { HydrationStatus, StateContainerConfig, SystemEvent, SystemEventPay
3
3
  export { Cubit } from './core/Cubit';
4
4
  export { EMIT, UPDATE } from './core/symbols';
5
5
  export { acquire, borrow, borrowSafe, ensure, release, clear, clearAll, register, hasInstance, getRefCount, getAll, forEach, getRegistry, setRegistry, getStats, } from './registry';
6
- export { globalRegistry } from './core/StateContainerRegistry';
6
+ export { globalRegistry, StateContainerRegistry, } from './core/StateContainerRegistry';
7
7
  export type { LifecycleEvent, LifecycleListener, InstanceEntry, } from './core/StateContainerRegistry';
8
8
  export { blac, type BlacOptions } from './decorators';
9
9
  export { getPluginManager } from './core/StateContainerRegistry';
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export type { HydrationStatus, StateContainerConfig, SystemEvent, SystemEventPay
3
3
  export { Cubit } from './core/Cubit';
4
4
  export { EMIT, UPDATE } from './core/symbols';
5
5
  export { acquire, borrow, borrowSafe, ensure, release, clear, clearAll, register, hasInstance, getRefCount, getAll, forEach, getRegistry, setRegistry, getStats, } from './registry';
6
- export { globalRegistry } from './core/StateContainerRegistry';
6
+ export { globalRegistry, StateContainerRegistry, } from './core/StateContainerRegistry';
7
7
  export type { LifecycleEvent, LifecycleListener, InstanceEntry, } from './core/StateContainerRegistry';
8
8
  export { blac, type BlacOptions } from './decorators';
9
9
  export { getPluginManager } from './core/StateContainerRegistry';