@blac/core 2.0.17 → 2.0.18

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 (73) hide show
  1. package/README.md +7 -1
  2. package/dist/StateContainerRegistry-4Ljd9EJx.js +1018 -0
  3. package/dist/StateContainerRegistry-4Ljd9EJx.js.map +1 -0
  4. package/dist/StateContainerRegistry-CEWpc1bj.cjs +1113 -0
  5. package/dist/StateContainerRegistry-CEWpc1bj.cjs.map +1 -0
  6. package/dist/StateContainerRegistry-CSNm2Ws5.cjs +1085 -0
  7. package/dist/StateContainerRegistry-CSNm2Ws5.cjs.map +1 -0
  8. package/dist/StateContainerRegistry-CvBOhAT2.js +996 -0
  9. package/dist/StateContainerRegistry-CvBOhAT2.js.map +1 -0
  10. package/dist/acquire-B1Wuqla6.cjs +46 -0
  11. package/dist/acquire-B1Wuqla6.cjs.map +1 -0
  12. package/dist/acquire-BP-ZfUH2.js +35 -0
  13. package/dist/acquire-BP-ZfUH2.js.map +1 -0
  14. package/dist/acquire-BZIs6tpN.cjs +46 -0
  15. package/dist/acquire-BZIs6tpN.cjs.map +1 -0
  16. package/dist/acquire-CwB083au.js +35 -0
  17. package/dist/acquire-CwB083au.js.map +1 -0
  18. package/dist/config-C7Ktkjh2.cjs +32 -0
  19. package/dist/config-C7Ktkjh2.cjs.map +1 -0
  20. package/dist/config-COT4Xkbc.js +16 -0
  21. package/dist/config-COT4Xkbc.js.map +1 -0
  22. package/dist/config-b2z51Y_C.cjs +32 -0
  23. package/dist/config-b2z51Y_C.cjs.map +1 -0
  24. package/dist/config-buwpT7l3.js +16 -0
  25. package/dist/config-buwpT7l3.js.map +1 -0
  26. package/dist/core/Cubit.d.ts +4 -4
  27. package/dist/core/StateContainer.d.ts +34 -38
  28. package/dist/core/StateContainerRegistry.d.ts +1 -1
  29. package/dist/core/meta.d.ts +73 -0
  30. package/dist/core/symbols.d.ts +10 -17
  31. package/dist/debug.cjs +3 -3
  32. package/dist/debug.js +3 -3
  33. package/dist/ensure-B9oOqpOB.cjs +558 -0
  34. package/dist/ensure-B9oOqpOB.cjs.map +1 -0
  35. package/dist/ensure-BfYnvAsI.js +709 -0
  36. package/dist/ensure-BfYnvAsI.js.map +1 -0
  37. package/dist/ensure-C1a8IFWy.js +535 -0
  38. package/dist/ensure-C1a8IFWy.js.map +1 -0
  39. package/dist/ensure-_Oh8XPm4.cjs +732 -0
  40. package/dist/ensure-_Oh8XPm4.cjs.map +1 -0
  41. package/dist/index.cjs +9 -9
  42. package/dist/index.d.cts +4 -7
  43. package/dist/index.d.ts +4 -7
  44. package/dist/index.js +7 -7
  45. package/dist/management-14vsHr4t.cjs +85 -0
  46. package/dist/management-14vsHr4t.cjs.map +1 -0
  47. package/dist/management-BqGBdL01.js +38 -0
  48. package/dist/management-BqGBdL01.js.map +1 -0
  49. package/dist/management-BvUAjril.js +38 -0
  50. package/dist/management-BvUAjril.js.map +1 -0
  51. package/dist/management-Df7Y2sF1.cjs +85 -0
  52. package/dist/management-Df7Y2sF1.cjs.map +1 -0
  53. package/dist/plugin/BlacPlugin.d.ts +11 -12
  54. package/dist/plugin/PluginManager.d.ts +3 -4
  55. package/dist/plugins.cjs +1 -1
  56. package/dist/plugins.js +1 -1
  57. package/dist/testing.cjs +10 -15
  58. package/dist/testing.cjs.map +1 -1
  59. package/dist/testing.d.cts +4 -6
  60. package/dist/testing.d.ts +4 -6
  61. package/dist/testing.js +10 -14
  62. package/dist/testing.js.map +1 -1
  63. package/dist/watch-CfrSSrRY.js +59 -0
  64. package/dist/watch-CfrSSrRY.js.map +1 -0
  65. package/dist/watch-Cnh3PtQA.cjs +70 -0
  66. package/dist/watch-Cnh3PtQA.cjs.map +1 -0
  67. package/dist/watch-D8hwbFU1.js +59 -0
  68. package/dist/watch-D8hwbFU1.js.map +1 -0
  69. package/dist/watch-DVmvZBMD.cjs +70 -0
  70. package/dist/watch-DVmvZBMD.cjs.map +1 -0
  71. package/dist/watch-entry.cjs +1 -1
  72. package/dist/watch-entry.js +1 -1
  73. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-_Oh8XPm4.cjs","names":["EMPTY_DEPS","StructuralContainer","APPLY_DEPS","REMOVE_DEPS_OWNER","getRegistry","getBlacConfig","ALL_PATHS","INIT_CONFIG","getClassEquality","EMIT","getRegistry"],"sources":["../src/utils/idGenerator.ts","../src/core/meta.ts","../src/core/StateContainer.ts","../src/core/Cubit.ts","../src/registry/ensure.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","/**\n * `$blac` meta namespace for `StateContainer`.\n *\n * ──────────────────────────────────────────────────────────────────────────\n * CONSTRAINT — NO ES `#private` FIELDS, ANYWHERE IN THIS FILE.\n *\n * `@blac/react`'s `buildTrackedProxy` invokes prototype getters with a\n * `Proxy(instance)` as the `this`-receiver. Accessing an ES `#private` field\n * through a proxy receiver throws (`#x` brand checks fail on the proxy). The\n * whole point of this meta object is to be proxy-safe: every getter/method\n * here closes over the *real* container instance captured at `createMeta`\n * time, NEVER over a `this`-receiver. Do not \"modernize\" the `_`-prefixed\n * TS-private reads below into `#private` access.\n * ──────────────────────────────────────────────────────────────────────────\n */\n\nimport type { HydrationStatus } from './StateContainer';\nimport type { StateContainerConstructor } from '../types/utilities';\n\n/**\n * Hydration sub-surface of {@link BlacMeta}. Mirrors the legacy\n * `beginHydration`/`applyHydratedState`/`finishHydration`/`failHydration`/\n * `waitForHydration` methods and the `hydrationStatus`/`hydrationError`/\n * `isHydrated`/`changedWhileHydrating` getters, namespaced under `$blac`.\n */\nexport interface BlacHydration<S extends object> {\n readonly status: HydrationStatus;\n readonly error: Error | undefined;\n readonly isHydrated: boolean;\n readonly changedWhileHydrating: boolean;\n begin(): void;\n /** Was `applyHydratedState`. */\n apply(next: S): boolean;\n finish(): void;\n fail(error: Error): void;\n /** Was `waitForHydration`. */\n wait(): Promise<void>;\n}\n\n/**\n * The reserved `$blac` instance member on every `StateContainer`. Collapses\n * the previously-scattered identity/lifecycle/hydration surface\n * (`name`, `instanceId`, `debug`, `createdAt`, `isDisposed`, `dependencies`,\n * and the hydration methods) under one namespace, freeing the generic names\n * for userland blocs.\n *\n * The object is allocated once per container, frozen, branded, and exposes\n * live getters that read the container's current `_`-private fields — values\n * are never snapshotted.\n */\nexport interface BlacMeta<S extends object = any> {\n readonly name: string;\n /** Was `instanceId`. */\n readonly id: string;\n readonly debug: boolean;\n readonly createdAt: number;\n /** Was `isDisposed`. */\n readonly disposed: boolean;\n readonly dependencies: ReadonlyMap<StateContainerConstructor, string>;\n readonly hydration: BlacHydration<S>;\n}\n\n/**\n * Non-enumerable brand carried on every `$blac` object produced by\n * {@link createMeta}. Used by the clobber guard in `StateContainer` to detect\n * a subclass class-field shadowing the base's own `$blac` property, and by the\n * meta tests. Intentionally NOT re-exported from the package barrel.\n */\nexport const META_BRAND = Symbol('blac.meta');\n\nconst EMPTY_DEPS: ReadonlyMap<StateContainerConstructor, string> = new Map();\n\n/**\n * Narrow view of the parts of `StateContainer` the meta getters read. The\n * container's fields are TS-private (compile-time only), so they are not\n * reachable cross-module by name; `createMeta` performs a single internal cast\n * to this shape. This is purely a typing bridge — zero runtime indirection.\n *\n * Hydration methods are referenced by their legacy names: the `$blac.hydration`\n * surface delegates to the exact same implementations, so there is one source\n * of truth for the hydration state machine.\n */\ninterface MetaInternals<S extends object> {\n _name: string;\n _instanceId: string;\n _debug: boolean;\n _createdAt: number;\n _disposed: boolean;\n _hydrationStatus: HydrationStatus;\n _hydrationError: Error | undefined;\n _changedWhileHydrating: boolean;\n _dependencies: Map<StateContainerConstructor, string> | null;\n _beginHydration(): void;\n _applyHydratedState(next: S): boolean;\n _finishHydration(): void;\n _failHydration(error: Error): void;\n _waitForHydration(): Promise<void>;\n}\n\n/**\n * Build the frozen, branded `$blac` meta object for a container.\n *\n * Called from a `StateContainer` field initializer (`$blac = createMeta(this)`).\n * Only the back-reference is captured at this point; every getter/method reads\n * the container's `_`-private fields lazily on access, so field-initializer\n * ordering relative to those private fields is irrelevant.\n *\n * The getters close over `container` (the real instance), never over a\n * `this`-receiver — this is what keeps `$blac` reads safe through\n * `buildTrackedProxy`.\n */\nexport function createMeta<S extends object>(container: object): BlacMeta<S> {\n const c = container as unknown as MetaInternals<S>;\n\n const hydration: BlacHydration<S> = Object.freeze({\n get status() {\n return c._hydrationStatus;\n },\n get error() {\n return c._hydrationError;\n },\n get isHydrated() {\n return c._hydrationStatus === 'hydrated';\n },\n get changedWhileHydrating() {\n return c._changedWhileHydrating;\n },\n begin() {\n c._beginHydration();\n },\n apply(next: S) {\n return c._applyHydratedState(next);\n },\n finish() {\n c._finishHydration();\n },\n fail(error: Error) {\n c._failHydration(error);\n },\n wait() {\n return c._waitForHydration();\n },\n });\n\n const meta: BlacMeta<S> = {\n get name() {\n return c._name;\n },\n get id() {\n return c._instanceId;\n },\n get debug() {\n return c._debug;\n },\n get createdAt() {\n return c._createdAt;\n },\n get disposed() {\n return c._disposed;\n },\n get dependencies() {\n return c._dependencies ?? EMPTY_DEPS;\n },\n hydration,\n };\n\n Object.defineProperty(meta, META_BRAND, {\n value: true,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n\n return Object.freeze(meta);\n}\n","import {\n ALL_PATHS,\n StructuralContainer,\n type DeepPartial,\n type StructuralContainerOptions,\n} from '@dirtytalk/structural';\nimport { generateSimpleId } from '../utils/idGenerator';\nimport { getRegistry } from '../registry/config';\nimport type {\n ExtractArgs,\n ExtractState,\n StateContainerConstructor,\n} from '../types/utilities';\nimport { APPLY_DEPS, EMIT, INIT_CONFIG, REMOVE_DEPS_OWNER } from './symbols';\nimport { type EqualityFn, getBlacConfig } from '../config';\nimport { getClassEquality } from '../utils/static-props';\nimport { type BlacMeta, createMeta, META_BRAND } from './meta';\n\n/**\n * Brand symbol carried (non-enumerable) on every handle returned by\n * `depend()`. Framework adapters (`@blac/react`) use this to detect handles\n * inside a tracked-proxy and swap in a session-bound wrapper.\n *\n * @internal — exported for `@blac/react`; not part of the public API.\n */\nexport const DEP_BRAND = Symbol('blac.depHandle');\n\n/**\n * Per-access options for a {@link DepHandle}. `args` resolves the specific dep\n * instance for this call; omit it to fall back to the default args passed to\n * `depend()`. Args resolve at call time so they can derive from current state.\n */\nexport interface DepAccessOptions<T extends StateContainerConstructor> {\n args?: ExtractArgs<T>;\n}\n\n/**\n * Branded handle returned by `StateContainer.depend()`. Two intention-revealing\n * accessors, no callable surface:\n *\n * - `handle.track(options?)` — base impl: returns `[instance.state, instance]`\n * live with no subscription. The React layer replaces `.track()` per-consumer\n * so that cross-bloc state changes trigger re-renders of the reading component.\n * - `handle.untracked(options?)` — returns the live dep instance with no\n * tracking. Use for imperative calls (`.untracked().doThing()`) and one-off\n * state reads that should not subscribe the reader.\n * - `handle[DEP_BRAND]` — carries `{ Type, defaultArgs }` for framework use.\n */\nexport interface DepHandle<T extends StateContainerConstructor> {\n track(options?: DepAccessOptions<T>): [ExtractState<T>, InstanceType<T>];\n untracked(options?: DepAccessOptions<T>): InstanceType<T>;\n readonly [DEP_BRAND]: { Type: T; defaultArgs?: ExtractArgs<T> };\n}\n\nexport interface StateContainerConfig {\n name?: string;\n debug?: boolean;\n instanceId?: string;\n /** Args passed at acquire time; forwarded to init(). */\n args?: unknown;\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\n// ---------------------------------------------------------------------------\n// Deprecation warnings (dev-only, once per member per class)\n//\n// The legacy identity/lifecycle/hydration surface (`name`, `instanceId`,\n// `debug`, `createdAt`, `isDisposed`, the `*Hydration` methods, `initConfig`)\n// is kept as deprecated delegates onto `$blac` until M5. Reading/writing them\n// from userland warns once per member per concrete class so registries that\n// spin up many instances don't spam.\n//\n// Suppressed under `NODE_ENV === 'test'` (vitest sets it — the legacy test\n// sites and `console.warn`-spying tests must stay quiet/green) and\n// `'production'` (dead-code-eliminated, zero cost). INTERNAL container code\n// must NEVER touch the legacy delegates — it reads the `_`-private fields and\n// `[INIT_CONFIG]` directly so it never trips these warnings.\n// ---------------------------------------------------------------------------\n\nconst warnedMembers = new WeakMap<object, Set<string>>();\n\nfunction warnDeprecated(\n ctor: object,\n member: string,\n replacement: string,\n): void {\n if (\n process.env.NODE_ENV === 'test' ||\n process.env.NODE_ENV === 'production'\n ) {\n return;\n }\n let seen = warnedMembers.get(ctor);\n if (!seen) {\n seen = new Set();\n warnedMembers.set(ctor, seen);\n }\n if (seen.has(member)) return;\n seen.add(member);\n console.warn(\n `[blac] \\`StateContainer#${member}\\` is deprecated; use \\`${replacement}\\` instead. ` +\n `(${(ctor as { name: string }).name}; this warning fires once per class.)`,\n );\n}\n\n/**\n * Shallow per-key `Object.is` comparison of two plain records. Keys are\n * considered: a key present in one but not the other (regardless of value)\n * makes the records unequal. Used to detect real deps changes.\n */\nfunction shallowEqualRecord(\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n): boolean {\n if (a === b) return true;\n const aKeys = Object.keys(a);\n if (aKeys.length !== Object.keys(b).length) return false;\n for (const key of aKeys) {\n if (!(key in b)) return false;\n if (!Object.is(a[key], b[key])) return false;\n }\n return true;\n}\n\n/**\n * BlaC's lifecycle/identity/dependency layer on top of `StructuralContainer`.\n *\n * StructuralContainer provides:\n * - `state` getter\n * - `emit` / `patch` / `update` (path-tracked, microtask-flushed)\n * - `channel` (the underlying `DirtyChannel`)\n * - `registerConsumerPaths` / `unregisterConsumer` (for fine-grained consumers)\n * - per-class `PathInterner`\n *\n * StateContainer layers on:\n * - identity (`name`, `instanceId`, `createdAt`, `debug`)\n * - lifecycle (`dispose`, `isDisposed`, `onSystemEvent`)\n * - hydration (`beginHydration` / `applyHydratedState` / `finishHydration` / `failHydration` / `waitForHydration`)\n * - cross-bloc deps (`depend()`, `dependencies` getter)\n * - per-consumer deps slices (`APPLY_DEPS` / `REMOVE_DEPS_OWNER` / `onDepsChanged`)\n * - registry integration (config-driven equality, emit-rate circuit breaker)\n *\n * Subscribers can attach via:\n * - `subscribe(listener)` — legacy state listener (back-compat); fires on\n * every flush with the latest state.\n * - `onSystemEvent('stateChanged' | 'dispose' | 'hydrationChanged', cb)` —\n * coarse lifecycle events.\n * - `this.channel.subscribe(interest, cb)` — path-scoped (new code).\n */\nexport abstract class StateContainer<\n S extends object = any,\n Args = void,\n Deps extends object = Record<string, never>,\n> extends StructuralContainer<S> {\n static __excludeFromDevTools = false;\n\n /** @internal phantom — the args type this bloc is constructed with (see init()) */\n declare readonly __args: Args;\n /** @internal phantom — the injected deps type */\n declare readonly __deps: Deps;\n\n // ---------------------------------------------------------------------------\n // Per-consumer deps slices (APPLY_DEPS / REMOVE_DEPS_OWNER)\n //\n // Kept until D0 ports `useBloc` off the adapter surface. See A2 audit:\n // `@blac/react/src/useBloc.ts` calls these via the `@blac/adapter`\n // re-export. EMIT is gone; APPLY_DEPS / REMOVE_DEPS_OWNER stay.\n // ---------------------------------------------------------------------------\n\n private _depsByOwner: Map<string, Partial<Deps>> | null = null;\n private _deps: Partial<Deps> = {};\n\n get deps(): Readonly<Deps> {\n return this._deps as Readonly<Deps>;\n }\n\n /**\n * @internal Apply one owner's (consumer's) deps slice. Shallow-merges the\n * slice, reconciles keys the owner dropped since its last apply (other\n * owners' keys untouched), dev-warns on cross-owner key collisions, then\n * recomputes the merged view and fires onDepsChanged if it changed.\n *\n * Idempotent: re-applying an identical slice for the same owner is a no-op.\n */\n [APPLY_DEPS](ownerId: string, slice: Partial<Deps>): void {\n if (this._disposed) return;\n\n const owners = (this._depsByOwner ??= new Map());\n const prevSlice = owners.get(ownerId);\n\n if (prevSlice && shallowEqualRecord(prevSlice, slice)) {\n return;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n for (const key of Object.keys(slice) as (keyof Deps)[]) {\n for (const [otherOwner, otherSlice] of owners) {\n if (otherOwner === ownerId) continue;\n if (\n key in otherSlice &&\n (otherSlice as Record<keyof Deps, unknown>)[key] !==\n (slice as Record<keyof Deps, unknown>)[key]\n ) {\n console.warn(\n `[${this._name}] multiple owners writing dep \\`${String(\n key,\n )}\\`; last write wins`,\n );\n }\n }\n }\n }\n\n owners.set(ownerId, { ...slice });\n this.reconcileDeps();\n }\n\n /**\n * @internal Withdraw an owner's entire deps slice (consumer unmounted).\n */\n [REMOVE_DEPS_OWNER](ownerId: string): void {\n if (this._disposed) return;\n if (!this._depsByOwner?.delete(ownerId)) return;\n this.reconcileDeps();\n }\n\n private reconcileDeps(): void {\n const prev = this._deps;\n const next: Partial<Deps> = {};\n if (this._depsByOwner) {\n for (const slice of this._depsByOwner.values()) {\n Object.assign(next, slice);\n }\n }\n for (const key of Object.keys(prev) as (keyof Deps)[]) {\n if (!(key in next)) {\n (next as Record<keyof Deps, unknown>)[key] = undefined;\n }\n }\n\n if (shallowEqualRecord(prev, next)) return;\n\n this._deps = next;\n this.onDepsChanged(next as Readonly<Deps>, prev as Readonly<Deps>);\n this._registry.emit(\n 'depsChanged',\n this,\n prev as Readonly<Record<string, unknown>>,\n next as Readonly<Record<string, unknown>>,\n );\n }\n\n protected onDepsChanged(_next: Readonly<Deps>, _prev: Readonly<Deps>): void {}\n\n // ---------------------------------------------------------------------------\n // Identity / lifecycle\n // ---------------------------------------------------------------------------\n\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 _initCalled = false;\n\n // Dev-only emit-rate circuit breaker state (see configureBlac.maxEmitsPerSecond).\n private _emitWindowStart = 0;\n private _emitCount = 0;\n private _emitRateWarned = false;\n\n // Legacy listener-style subscribers (subscribe(listener)). Fires on every\n // channel flush with the latest state. Kept for back-compat with code that\n // hasn't migrated to `channel.subscribe(interest, cb)`.\n private readonly _listeners = new Set<StateListener<S>>();\n\n // System-event handlers (stateChanged | dispose | hydrationChanged).\n private readonly _systemEventHandlers = new Map<\n SystemEvent,\n Set<SystemEventHandler<S, any>>\n >();\n\n // Cross-bloc dependencies recorded by depend(). Map<DepCtor, instanceKey>.\n private _dependencies: Map<StateContainerConstructor, string> | null = null;\n\n // Pending state-change capture; set by emit(), drained by the channel-bridge\n // callback on flush. Coalesced: multiple emits in one tick collapse to one\n // (prev = the first prev, next = the latest next), matching Decision 7.\n private _pendingChange: { prev: S; next: S } | null = null;\n\n // Unsubscribe from the internal bridge that turns channel flushes into\n // legacy listener calls + 'stateChanged' system events.\n private _bridgeUnsub: (() => void) | null = null;\n\n private _registry = getRegistry();\n private _equalityFn: EqualityFn = getBlacConfig().equality;\n\n // Identity fields. TS-private (compile-time only) — proxy-safe, unlike ES\n // `#private`. The `$blac` meta getters and the legacy delegates read these.\n private _name: string = this.constructor.name;\n private _debug: boolean = false;\n private _instanceId: string = generateSimpleId(this.constructor.name, 'main');\n private _createdAt: number = Date.now();\n\n /**\n * Reserved meta namespace: identity (`name`/`id`/`debug`/`createdAt`),\n * lifecycle (`disposed`/`dependencies`), and the `hydration` sub-surface.\n * Own, frozen, branded data property — `buildTrackedProxy` only intercepts\n * prototype getters, so this own property and its closure-based getters are\n * proxy-safe. See {@link createMeta}.\n */\n readonly $blac: BlacMeta<S> = createMeta<S>(this);\n\n /**\n * @deprecated Use `$blac.name`. Setter kept until M5 (`[INIT_CONFIG]` and\n * legacy `initConfig` historically wrote `name`).\n */\n get name(): string {\n warnDeprecated(this.constructor, 'name', '$blac.name');\n return this._name;\n }\n set name(value: string) {\n warnDeprecated(this.constructor, 'name', '$blac.name');\n this._name = value;\n }\n\n /**\n * @deprecated Use `$blac.debug`. Setter kept until M5.\n */\n get debug(): boolean {\n warnDeprecated(this.constructor, 'debug', '$blac.debug');\n return this._debug;\n }\n set debug(value: boolean) {\n warnDeprecated(this.constructor, 'debug', '$blac.debug');\n this._debug = value;\n }\n\n /**\n * @deprecated Use `$blac.id`. Setter kept until M5.\n */\n get instanceId(): string {\n warnDeprecated(this.constructor, 'instanceId', '$blac.id');\n return this._instanceId;\n }\n set instanceId(value: string) {\n warnDeprecated(this.constructor, 'instanceId', '$blac.id');\n this._instanceId = value;\n }\n\n /**\n * @deprecated Use `$blac.createdAt`.\n */\n get createdAt(): number {\n warnDeprecated(this.constructor, 'createdAt', '$blac.createdAt');\n return this._createdAt;\n }\n\n /**\n * @deprecated Use `$blac.dependencies`.\n */\n get dependencies(): ReadonlyMap<StateContainerConstructor, string> {\n warnDeprecated(this.constructor, 'dependencies', '$blac.dependencies');\n return this._dependencies ?? EMPTY_DEPS;\n }\n\n get args(): Args | undefined {\n return this._config.args as Args | undefined;\n }\n\n /**\n * Declare a cross-bloc dependency. Returns a branded handle with two\n * accessors — the dep instance is resolved against the registry on each call,\n * which keeps the surface immune to dep-instance churn:\n *\n * - `handle.track(options?)` — reactive read. Returns `[state, instance]`.\n * Inside a getter reached through the React proxy this subscribes the\n * reading component to the dep's changes (base impl: live, no subscription).\n * - `handle.untracked(options?)` — returns the live instance with no tracking,\n * for imperative method calls and one-off reads.\n *\n * `defaultArgs` resolves the dep instance when an accessor is called without\n * its own `args`; per-call `options.args` overrides it and can derive from\n * current state. This does NOT auto-resubscribe outside the React proxy;\n * non-React consumers needing updates should subscribe explicitly.\n */\n protected depend<T extends StateContainerConstructor>(\n Type: T,\n defaultArgs?: ExtractArgs<T>,\n ): DepHandle<T> {\n if (!this._dependencies) {\n this._dependencies = new Map();\n }\n this._dependencies.set(\n Type,\n this._registry.resolveKey(Type, undefined, defaultArgs),\n );\n\n const resolve = (args?: ExtractArgs<T>): InstanceType<T> => {\n const effectiveArgs = args ?? defaultArgs;\n const key = this._registry.resolveKey(Type, undefined, effectiveArgs);\n return this._registry.ensure(Type, key, effectiveArgs);\n };\n\n const handle = {\n track: (\n options?: DepAccessOptions<T>,\n ): [ExtractState<T>, InstanceType<T>] => {\n const instance = resolve(options?.args);\n return [instance.state as ExtractState<T>, instance];\n },\n untracked: (options?: DepAccessOptions<T>): InstanceType<T> =>\n resolve(options?.args),\n } as DepHandle<T>;\n\n Object.defineProperty(handle, DEP_BRAND, {\n value: { Type, defaultArgs },\n enumerable: false,\n writable: false,\n configurable: false,\n });\n\n return handle;\n }\n\n constructor(initialState: S, options?: StructuralContainerOptions) {\n super(initialState, options);\n\n // Bridge channel flushes -> legacy listeners + 'stateChanged' system event.\n // Interest is ALL_PATHS so we wake on every flush. Coalesced via\n // `_pendingChange`: if no emit happened (e.g. a no-op patch), the bridge\n // sees null and skips.\n this._bridgeUnsub = this.channel.subscribe(\n () => ALL_PATHS,\n () => this._drainPending(),\n );\n }\n\n /**\n * Called once after construction with the args passed at acquire time, before the first\n * state snapshot is read by any consumer. Override to seed args-derived state (via\n * this.emit(...)) or kick off loads.\n */\n protected init(_args: Args): void {}\n\n /**\n * @internal Framework-only configuration entry point (registry + testing\n * helpers). Writes the `_`-private identity fields directly (NOT through the\n * deprecated setters, so it never trips a deprecation warning), resolves\n * per-class equality, emits the registry `created` event, and runs `init()`\n * once. See {@link INIT_CONFIG}.\n */\n [INIT_CONFIG](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 const perClass = getClassEquality(\n this.constructor as StateContainerConstructor,\n );\n this._equalityFn = perClass ?? getBlacConfig().equality;\n this._registry.emit('created', this);\n if (!this._initCalled) {\n this._initCalled = true;\n this.init(this._config.args as Args);\n }\n\n // Clobber guard: a subclass class-field `$blac = ...` initializes after\n // `super()` and would overwrite the base's own meta property. Dev-only.\n if (process.env.NODE_ENV !== 'production') {\n if (!(this.$blac as unknown as Record<symbol, unknown>)?.[META_BRAND]) {\n console.warn(\n `[blac] ${this.constructor.name} appears to declare its own \\`$blac\\` ` +\n `member, which shadows the reserved meta namespace. \\`$blac\\` is ` +\n `reserved by StateContainer — remove the subclass field.`,\n );\n }\n }\n }\n\n /**\n * @deprecated Use `[INIT_CONFIG]` (the symbol from `@blac/core`). Kept as a\n * delegate until M5.\n */\n initConfig(config: StateContainerConfig): void {\n warnDeprecated(this.constructor, 'initConfig', '[INIT_CONFIG]');\n this[INIT_CONFIG](config);\n }\n\n /**\n * @deprecated Use `$blac.disposed`.\n */\n get isDisposed(): boolean {\n warnDeprecated(this.constructor, 'isDisposed', '$blac.disposed');\n return this._disposed;\n }\n\n /**\n * @deprecated Use `$blac.hydration.status`.\n */\n get hydrationStatus(): HydrationStatus {\n warnDeprecated(\n this.constructor,\n 'hydrationStatus',\n '$blac.hydration.status',\n );\n return this._hydrationStatus;\n }\n\n /**\n * @deprecated Use `$blac.hydration.error`.\n */\n get hydrationError(): Error | undefined {\n warnDeprecated(this.constructor, 'hydrationError', '$blac.hydration.error');\n return this._hydrationError;\n }\n\n /**\n * @deprecated Use `$blac.hydration.isHydrated`.\n */\n get isHydrated(): boolean {\n warnDeprecated(\n this.constructor,\n 'isHydrated',\n '$blac.hydration.isHydrated',\n );\n return this._hydrationStatus === 'hydrated';\n }\n\n /**\n * @deprecated Use `$blac.hydration.changedWhileHydrating`.\n */\n get changedWhileHydrating(): boolean {\n warnDeprecated(\n this.constructor,\n 'changedWhileHydrating',\n '$blac.hydration.changedWhileHydrating',\n );\n return this._changedWhileHydrating;\n }\n\n // ---------------------------------------------------------------------------\n // Subscribe (legacy listener-style) — back-compat.\n //\n // Old surface: subscribe(listener: (state) => void). New code should use\n // `this.channel.subscribe(interest, cb)` directly. This override shadows\n // `StructuralContainer.subscribe`'s richer signature on purpose — only one\n // legacy consumer pattern exists (per A2 audit: tracking/, watch/, adapter).\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 () => {\n this._listeners.delete(listener);\n };\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle: dispose\n // ---------------------------------------------------------------------------\n\n dispose(): void {\n if (this._disposed) return;\n\n if (this._debug) {\n console.log(`[${this._name}] Disposing...`);\n }\n\n // Reconcile to an empty deps view so a final onDepsChanged(next, prev)\n // fires with all keys absent (undefined). After this, APPLY_DEPS /\n // REMOVE_DEPS_OWNER are guarded by _disposed.\n if (this._depsByOwner) {\n this._depsByOwner.clear();\n this.reconcileDeps();\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 // Tear down the channel bridge so we don't leak a subscription.\n this._bridgeUnsub?.();\n this._bridgeUnsub = null;\n\n this._listeners.clear();\n this._systemEventHandlers.clear();\n this._pendingChange = null;\n\n this._registry.emit('disposed', this);\n\n if (this._debug) {\n console.log(`[${this._name}] Disposed successfully`);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Mutation: emit / patch / update.\n //\n // We override `emit` to layer in:\n // - disposed guard\n // - equality-fn short-circuit (consults getBlacConfig().equality or the\n // per-class override via @blac decorator)\n // - emit-rate circuit breaker (dev-only)\n // - `_changedWhileHydrating` flag tracking\n // - registry-level stateChanged notification (microtask-deferred)\n // - pending-change capture so the channel-bridge callback can fire the\n // legacy listeners + 'stateChanged' system event with prev/next.\n //\n // The actual change-detection (path diff, channel mark, single-consumer\n // skip) is delegated to `super.emit`.\n // ---------------------------------------------------------------------------\n\n override emit(next: S): void {\n this.applyState(next, 'default');\n }\n\n /**\n * Override of `StructuralContainer.patch` that routes through the\n * StateContainer concerns: disposed guard, dev-only emit-rate check,\n * `_changedWhileHydrating` flag, pending-change capture (so legacy\n * listeners and `stateChanged` system events see the merged prev/next),\n * and the registry-level `stateChanged` notification. We still call\n * `super.patch` so path-marking semantics (the whole point of patch) are\n * preserved.\n */\n override patch(partial: DeepPartial<S>): void {\n if (this._disposed) {\n throw new Error(\n `Cannot emit state from disposed container ${this._name}`,\n );\n }\n const partialKeys = Object.keys(partial as object);\n if (partialKeys.length === 0) return;\n\n const prev = this.state;\n\n // Pre-spread skip: if every top-level key in `partial` is already\n // `Object.is`-equal to the current state's value at that key, the\n // merge is a structural no-op — skip entirely. Matches the pre-C0\n // `Cubit.patch` semantics (per-key Object.is short-circuit). This is\n // shallow on purpose; deep no-op detection lives in `super.patch`'s\n // path-diff path which still wakes consumers if anything truly moved.\n let allEqual = true;\n for (const key of partialKeys) {\n if (\n !Object.is(\n (prev as Record<string, unknown>)[key],\n (partial as Record<string, unknown>)[key],\n )\n ) {\n allEqual = false;\n break;\n }\n }\n if (allEqual) return;\n\n if (process.env.NODE_ENV !== 'production') {\n this._checkEmitRate();\n }\n\n super.patch(partial);\n\n const next = this.state;\n if (Object.is(prev, next)) return;\n\n if (this._hydrationStatus === 'hydrating') {\n this._changedWhileHydrating = true;\n }\n\n if (this._pendingChange) {\n this._pendingChange.next = next;\n } else {\n this._pendingChange = { prev, next };\n }\n\n if (this._registry.hasStateChangedListeners) {\n this._registry.notifyStateChanged(this, prev, next);\n }\n }\n\n /**\n * @internal @deprecated Symbol-keyed alias for `emit`. Kept only so legacy\n * in-package tests that index with `[EMIT]` typecheck/run unchanged. C5\n * removes this along with the `EMIT` symbol.\n */\n protected [EMIT](next: S): void {\n this.applyState(next, 'default');\n }\n\n private applyState(next: S, source: 'default' | 'hydration'): void {\n if (this._disposed) {\n throw new Error(\n `Cannot emit state from disposed container ${this._name}`,\n );\n }\n\n const prev = this.state;\n if (prev === next) return;\n if (this._equalityFn(prev, next)) return;\n\n if (process.env.NODE_ENV !== 'production') {\n this._checkEmitRate();\n }\n\n if (this._hydrationStatus === 'hydrating' && source !== 'hydration') {\n this._changedWhileHydrating = true;\n }\n\n // Coalesce: keep the first prev seen this tick, take the latest next.\n if (this._pendingChange) {\n this._pendingChange.next = next;\n } else {\n this._pendingChange = { prev, next };\n }\n\n super.emit(next);\n\n if (this._registry.hasStateChangedListeners) {\n this._registry.notifyStateChanged(this, prev, next);\n }\n }\n\n /**\n * Called by the channel-bridge subscriber on each flush. Drains the\n * pending change (if any) into legacy listeners and the 'stateChanged'\n * system event. No pending change == flush from a no-op patch == skip.\n */\n private _drainPending(): void {\n const pending = this._pendingChange;\n if (!pending) return;\n this._pendingChange = null;\n\n // Iterate against a fixed-size snapshot so a listener that subscribes a\n // new listener mid-drain does not get the late one called in this flush.\n // (Matches the pre-C0 contract; restored by counting against the size\n // captured at drain entry.) Order matches pre-C0: 'stateChanged' system\n // event fires *before* legacy subscribe() listeners.\n const handlers = this._systemEventHandlers.get('stateChanged');\n if (handlers && handlers.size > 0) {\n const payload = { state: pending.next, previousState: pending.prev };\n let count = 0;\n const size = handlers.size;\n for (const handler of handlers) {\n if (++count > size) break;\n try {\n handler(payload);\n } catch (error) {\n console.error(\n `[${this._name}] Error in system event handler:`,\n error,\n );\n }\n }\n }\n\n if (this._listeners.size > 0) {\n const current = this.state;\n let count = 0;\n const size = this._listeners.size;\n for (const listener of this._listeners) {\n if (++count > size) break;\n try {\n listener(current);\n } catch (error) {\n console.error(`[${this._name}] Error in listener:`, error);\n }\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Hydration\n // ---------------------------------------------------------------------------\n\n // The hydration state machine lives in these `_`-private impls. Both the\n // `$blac.hydration` surface and the deprecated public methods below delegate\n // here, so there's a single source of truth.\n\n private _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 void this.ensureHydrationPromise();\n this.setHydrationStatus('hydrating');\n }\n\n private _applyHydratedState(next: 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(next, 'hydration');\n return true;\n }\n\n private _finishHydration(): void {\n if (this._hydrationStatus !== 'hydrating') {\n if (this._hydrationStatus === 'hydrated') {\n return;\n }\n if (this._hydrationStatus === 'error') {\n void this.ensureHydrationPromise();\n }\n }\n\n this.setHydrationStatus('hydrated');\n this.resolveHydration();\n }\n\n private _failHydration(error: Error): void {\n const err =\n error instanceof Error\n ? error\n : new Error(`Hydration failed: ${String(error)}`);\n\n this._hydrationError = err;\n this.setHydrationStatus('error', err);\n this.rejectHydration(err);\n }\n\n private _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 /**\n * @deprecated Use `$blac.hydration.begin()`.\n */\n beginHydration(): void {\n warnDeprecated(\n this.constructor,\n 'beginHydration',\n '$blac.hydration.begin()',\n );\n this._beginHydration();\n }\n\n /**\n * @deprecated Use `$blac.hydration.apply()`.\n */\n applyHydratedState(next: S): boolean {\n warnDeprecated(\n this.constructor,\n 'applyHydratedState',\n '$blac.hydration.apply()',\n );\n return this._applyHydratedState(next);\n }\n\n /**\n * @deprecated Use `$blac.hydration.finish()`.\n */\n finishHydration(): void {\n warnDeprecated(\n this.constructor,\n 'finishHydration',\n '$blac.hydration.finish()',\n );\n this._finishHydration();\n }\n\n /**\n * @deprecated Use `$blac.hydration.fail()`.\n */\n failHydration(error: Error): void {\n warnDeprecated(this.constructor, 'failHydration', '$blac.hydration.fail()');\n this._failHydration(error);\n }\n\n /**\n * @deprecated Use `$blac.hydration.wait()`.\n */\n waitForHydration(): Promise<void> {\n warnDeprecated(\n this.constructor,\n 'waitForHydration',\n '$blac.hydration.wait()',\n );\n return this._waitForHydration();\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 void this.ensureHydrationPromise();\n this._rejectHydrationPromise?.(error);\n }\n\n // ---------------------------------------------------------------------------\n // System events\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 // ---------------------------------------------------------------------------\n // Emit-rate circuit breaker (dev-only)\n // ---------------------------------------------------------------------------\n\n /**\n * Dev-only soft circuit breaker. Counts real state changes in a rolling 1s\n * window and warns once if the rate exceeds `maxEmitsPerSecond` — the\n * signature of a runaway loop (RAF/animation or emit-on-every-commit) pushing\n * high-frequency data through state, which freezes subscribers/plugins.\n */\n private _checkEmitRate(): void {\n const limit = getBlacConfig().maxEmitsPerSecond;\n if (!(limit > 0) || !Number.isFinite(limit) || this._emitRateWarned) return;\n\n const now = Date.now();\n if (now - this._emitWindowStart >= 1000) {\n this._emitWindowStart = now;\n this._emitCount = 1;\n return;\n }\n\n this._emitCount++;\n if (this._emitCount > limit) {\n this._emitRateWarned = true;\n console.warn(\n `[${this._name}] emitted more than ${limit} state changes in under a second. ` +\n `This is usually a runaway loop pushing high-frequency data through state ` +\n `(e.g. \\`emit\\`/\\`patch\\` inside a requestAnimationFrame loop, or an effect ` +\n `that emits on every render). It can freeze the app by saturating ` +\n `subscribers and plugins (logging/devtools). Keep high-frequency work ` +\n `imperative and emit only coarse/throttled state, or raise ` +\n `\\`configureBlac({ maxEmitsPerSecond })\\`. (This warning fires once.)`,\n );\n }\n }\n}\n","import { StateContainer } from './StateContainer';\n\n/**\n * `Cubit<S>` is a `StateContainer<S>` with `emit` / `patch` exposed as\n * public mutation surface. Today it adds nothing structurally beyond\n * `StateContainer` — both are inherited from the underlying\n * `StructuralContainer<S>`. Kept as a real class (not a type alias) because\n * downstream code does `instance instanceof Cubit` checks (see A2 audit).\n *\n * The class body is intentionally empty: a no-op `emit` override would\n * still go through `applyState`, and `patch` is inherited from\n * `StructuralContainer` (path-diffed, microtask-flushed). If a caller\n * needs the old \"skip if no real change\" patch semantics, they can wrap\n * `patch` themselves or call `emit` after a manual equality check.\n */\nexport abstract class Cubit<\n S extends object = any,\n Args = void,\n Deps extends object = Record<string, never>,\n> extends StateContainer<S, Args, Deps> {}\n","import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\n\n/**\n * Ensure an instance exists without taking ownership (no ref added). Instance\n * identity is derived purely from `args`, matching `acquire`.\n */\nexport function ensure<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): InstanceType<T> {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.ensure(BlocClass, key, opts?.args);\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_StateContainerRegistry = require("./StateContainerRegistry-DJQqLrli.cjs");
3
- const require_ensure = require("./ensure-Dx86f80B.cjs");
4
- const require_config = require("./config-sCPKPYxZ.cjs");
5
- const require_acquire = require("./acquire-CbMz7gWs.cjs");
6
- const require_management = require("./management-DAV9sN-k.cjs");
7
- const require_watch = require("./watch-B91opmva.cjs");
2
+ const require_StateContainerRegistry = require("./StateContainerRegistry-CSNm2Ws5.cjs");
3
+ const require_ensure = require("./ensure-B9oOqpOB.cjs");
4
+ const require_config = require("./config-C7Ktkjh2.cjs");
5
+ const require_acquire = require("./acquire-B1Wuqla6.cjs");
6
+ const require_management = require("./management-14vsHr4t.cjs");
7
+ const require_watch = require("./watch-Cnh3PtQA.cjs");
8
8
  const require_branded = require("./branded-BybA0_xw.cjs");
9
9
  let _dirtytalk_structural = require("@dirtytalk/structural");
10
10
  //#region src/registry/borrow.ts
@@ -69,12 +69,12 @@ Object.defineProperty(exports, "ALL_PATHS", {
69
69
  return _dirtytalk_structural.ALL_PATHS;
70
70
  }
71
71
  });
72
- exports.APPLY_DEPS = require_ensure.APPLY_DEPS;
72
+ exports.APPLY_DEPS = require_StateContainerRegistry.APPLY_DEPS;
73
73
  exports.Cubit = require_ensure.Cubit;
74
74
  exports.DEP_BRAND = require_ensure.DEP_BRAND;
75
- exports.EMIT = require_ensure.EMIT;
75
+ exports.INIT_CONFIG = require_StateContainerRegistry.INIT_CONFIG;
76
76
  exports.PluginManager = require_StateContainerRegistry.PluginManager;
77
- exports.REMOVE_DEPS_OWNER = require_ensure.REMOVE_DEPS_OWNER;
77
+ exports.REMOVE_DEPS_OWNER = require_StateContainerRegistry.REMOVE_DEPS_OWNER;
78
78
  exports.StateContainer = require_ensure.StateContainer;
79
79
  exports.StateContainerRegistry = require_StateContainerRegistry.StateContainerRegistry;
80
80
  exports.acquire = require_acquire.acquire;
package/dist/index.d.cts CHANGED
@@ -3,14 +3,11 @@ export { StateContainer, DEP_BRAND } from './core/StateContainer';
3
3
  export type { HydrationStatus, StateContainerConfig, SystemEvent, SystemEventPayloads, DepHandle, } from './core/StateContainer';
4
4
  export { Cubit } from './core/Cubit';
5
5
  /**
6
- * @internal symbols — read by framework adapters (`@blac/react` via the
7
- * `@blac/adapter` re-export). Kept until D0 ports `useBloc` off this surface.
8
- *
9
- * `EMIT` is deprecated: zero external consumers per A2 audit, but the
10
- * in-package legacy tests still index `[EMIT]`. Kept as a thin alias for
11
- * `emit()` so those tests typecheck and run unchanged; C5 deletes it.
6
+ * @internal symbols — read by `@blac/react` (APPLY_DEPS / REMOVE_DEPS_OWNER)
7
+ * and in-package tests (INIT_CONFIG).
12
8
  */
13
- export { EMIT, APPLY_DEPS, REMOVE_DEPS_OWNER } from './core/symbols';
9
+ export { APPLY_DEPS, REMOVE_DEPS_OWNER, INIT_CONFIG } from './core/symbols';
10
+ export type { BlacMeta, BlacHydration } from './core/meta';
14
11
  export { ALL_PATHS } from '@dirtytalk/structural';
15
12
  export type { PathSet } from '@dirtytalk/structural';
16
13
  export { acquire, resolveInstanceKey, borrow, borrowSafe, ensure, release, clear, clearAll, register, hasInstance, getRefCount, getRefIds, getAll, forEach, getRegistry, setRegistry, getStats, } from './registry';
package/dist/index.d.ts CHANGED
@@ -3,14 +3,11 @@ export { StateContainer, DEP_BRAND } from './core/StateContainer';
3
3
  export type { HydrationStatus, StateContainerConfig, SystemEvent, SystemEventPayloads, DepHandle, } from './core/StateContainer';
4
4
  export { Cubit } from './core/Cubit';
5
5
  /**
6
- * @internal symbols — read by framework adapters (`@blac/react` via the
7
- * `@blac/adapter` re-export). Kept until D0 ports `useBloc` off this surface.
8
- *
9
- * `EMIT` is deprecated: zero external consumers per A2 audit, but the
10
- * in-package legacy tests still index `[EMIT]`. Kept as a thin alias for
11
- * `emit()` so those tests typecheck and run unchanged; C5 deletes it.
6
+ * @internal symbols — read by `@blac/react` (APPLY_DEPS / REMOVE_DEPS_OWNER)
7
+ * and in-package tests (INIT_CONFIG).
12
8
  */
13
- export { EMIT, APPLY_DEPS, REMOVE_DEPS_OWNER } from './core/symbols';
9
+ export { APPLY_DEPS, REMOVE_DEPS_OWNER, INIT_CONFIG } from './core/symbols';
10
+ export type { BlacMeta, BlacHydration } from './core/meta';
14
11
  export { ALL_PATHS } from '@dirtytalk/structural';
15
12
  export type { PathSet } from '@dirtytalk/structural';
16
13
  export { acquire, resolveInstanceKey, borrow, borrowSafe, ensure, release, clear, clearAll, register, hasInstance, getRefCount, getRefIds, getAll, forEach, getRegistry, setRegistry, getStats, } from './registry';
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import { a as isExcludedFromDevTools, c as PluginManager, d as resetBlacConfig, f as shallowEqualState, l as configureBlac, n as getPluginManager, o as isKeepAliveClass, r as globalRegistry, s as BLAC_STATIC_PROPS, t as StateContainerRegistry, u as getBlacConfig } from "./StateContainerRegistry-B1GYx9Xo.js";
2
- import { a as APPLY_DEPS, i as StateContainer, n as Cubit, o as EMIT, r as DEP_BRAND, s as REMOVE_DEPS_OWNER, t as ensure } from "./ensure-DzqGej43.js";
3
- import { n as getStats, r as setRegistry, t as getRegistry } from "./config-Dk1FxfXj.js";
4
- import { n as resolveInstanceKey, t as acquire } from "./acquire-G8aB3GAx.js";
5
- import { a as getAll, c as hasInstance, i as forEach, n as clearAll, o as getRefCount, r as register, s as getRefIds, t as clear } from "./management-444tdCBG.js";
6
- import { n as watch, t as instance } from "./watch-DPVUwPUY.js";
1
+ import { a as INIT_CONFIG, c as isExcludedFromDevTools, d as PluginManager, f as configureBlac, h as shallowEqualState, i as APPLY_DEPS, l as isKeepAliveClass, m as resetBlacConfig, n as getPluginManager, o as REMOVE_DEPS_OWNER, p as getBlacConfig, r as globalRegistry, t as StateContainerRegistry, u as BLAC_STATIC_PROPS } from "./StateContainerRegistry-CvBOhAT2.js";
2
+ import { i as StateContainer, n as Cubit, r as DEP_BRAND, t as ensure } from "./ensure-C1a8IFWy.js";
3
+ import { n as getStats, r as setRegistry, t as getRegistry } from "./config-buwpT7l3.js";
4
+ import { n as resolveInstanceKey, t as acquire } from "./acquire-BP-ZfUH2.js";
5
+ import { a as getAll, c as hasInstance, i as forEach, n as clearAll, o as getRefCount, r as register, s as getRefIds, t as clear } from "./management-BvUAjril.js";
6
+ import { n as watch, t as instance } from "./watch-D8hwbFU1.js";
7
7
  import { t as instanceId } from "./branded-DkbUzncc.js";
8
8
  import { ALL_PATHS } from "@dirtytalk/structural";
9
9
  //#region src/registry/borrow.ts
@@ -62,6 +62,6 @@ function blac(options) {
62
62
  };
63
63
  }
64
64
  //#endregion
65
- export { ALL_PATHS, APPLY_DEPS, Cubit, DEP_BRAND, EMIT, PluginManager, REMOVE_DEPS_OWNER, StateContainer, StateContainerRegistry, acquire, blac, borrow, borrowSafe, clear, clearAll, configureBlac, ensure, forEach, getAll, getBlacConfig, getPluginManager, getRefCount, getRefIds, getRegistry, getStats, globalRegistry, hasInstance, instance, instanceId, isExcludedFromDevTools, isKeepAliveClass, register, release, resetBlacConfig, resolveInstanceKey, setRegistry, shallowEqualState, watch };
65
+ export { ALL_PATHS, APPLY_DEPS, Cubit, DEP_BRAND, INIT_CONFIG, PluginManager, REMOVE_DEPS_OWNER, StateContainer, StateContainerRegistry, acquire, blac, borrow, borrowSafe, clear, clearAll, configureBlac, ensure, forEach, getAll, getBlacConfig, getPluginManager, getRefCount, getRefIds, getRegistry, getStats, globalRegistry, hasInstance, instance, instanceId, isExcludedFromDevTools, isKeepAliveClass, register, release, resetBlacConfig, resolveInstanceKey, setRegistry, shallowEqualState, watch };
66
66
 
67
67
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,85 @@
1
+ const require_config = require("./config-C7Ktkjh2.cjs");
2
+ //#region src/registry/queries.ts
3
+ function hasInstance(BlocClass, opts) {
4
+ const registry = require_config.getRegistry();
5
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
6
+ return registry.hasInstance(BlocClass, key);
7
+ }
8
+ function getRefCount(BlocClass, opts) {
9
+ const registry = require_config.getRegistry();
10
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
11
+ return registry.getRefCount(BlocClass, key);
12
+ }
13
+ function getRefIds(BlocClass, opts) {
14
+ const registry = require_config.getRegistry();
15
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
16
+ return registry.getRefIds(BlocClass, key);
17
+ }
18
+ function getAll(BlocClass) {
19
+ return require_config.getRegistry().getAll(BlocClass);
20
+ }
21
+ function forEach(BlocClass, callback) {
22
+ require_config.getRegistry().forEach(BlocClass, callback);
23
+ }
24
+ //#endregion
25
+ //#region src/registry/management.ts
26
+ function clear(BlocClass) {
27
+ require_config.getRegistry().clear(BlocClass);
28
+ }
29
+ function clearAll() {
30
+ require_config.getRegistry().clearAll();
31
+ }
32
+ function register(BlocClass) {
33
+ require_config.getRegistry().register(BlocClass);
34
+ }
35
+ //#endregion
36
+ Object.defineProperty(exports, "clear", {
37
+ enumerable: true,
38
+ get: function() {
39
+ return clear;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "clearAll", {
43
+ enumerable: true,
44
+ get: function() {
45
+ return clearAll;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "forEach", {
49
+ enumerable: true,
50
+ get: function() {
51
+ return forEach;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "getAll", {
55
+ enumerable: true,
56
+ get: function() {
57
+ return getAll;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "getRefCount", {
61
+ enumerable: true,
62
+ get: function() {
63
+ return getRefCount;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "getRefIds", {
67
+ enumerable: true,
68
+ get: function() {
69
+ return getRefIds;
70
+ }
71
+ });
72
+ Object.defineProperty(exports, "hasInstance", {
73
+ enumerable: true,
74
+ get: function() {
75
+ return hasInstance;
76
+ }
77
+ });
78
+ Object.defineProperty(exports, "register", {
79
+ enumerable: true,
80
+ get: function() {
81
+ return register;
82
+ }
83
+ });
84
+
85
+ //# sourceMappingURL=management-14vsHr4t.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management-14vsHr4t.cjs","names":["getRegistry"],"sources":["../src/registry/queries.ts","../src/registry/management.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n InstanceReadonlyState,\n} from '../types/utilities';\n\nexport function hasInstance<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): boolean {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.hasInstance(BlocClass, key);\n}\n\nexport function getRefCount<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): number {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefCount(BlocClass, key);\n}\n\nexport function getRefIds<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): string[] {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefIds(BlocClass, key);\n}\n\nexport function getAll<T extends StateContainerConstructor>(\n BlocClass: T,\n): InstanceReadonlyState<T>[] {\n return getRegistry().getAll(BlocClass);\n}\n\nexport function forEach<T extends StateContainerConstructor>(\n BlocClass: T,\n callback: (instance: InstanceReadonlyState<T>) => void,\n): void {\n getRegistry().forEach(BlocClass, callback);\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function clear<T extends StateContainerConstructor>(BlocClass: T): void {\n getRegistry().clear(BlocClass);\n}\n\nexport function clearAll(): void {\n getRegistry().clearAll();\n}\n\nexport function register<T extends StateContainerConstructor>(\n BlocClass: T,\n): void {\n getRegistry().register(BlocClass);\n}\n"],"mappings":";;AAOA,SAAgB,YACd,WACA,MACS;CACT,MAAM,WAAWA,eAAAA,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,YACd,WACA,MACQ;CACR,MAAM,WAAWA,eAAAA,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,UACd,WACA,MACU;CACV,MAAM,WAAWA,eAAAA,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,UAAU,WAAW,GAAG;AAC1C;AAEA,SAAgB,OACd,WAC4B;CAC5B,OAAOA,eAAAA,YAAY,EAAE,OAAO,SAAS;AACvC;AAEA,SAAgB,QACd,WACA,UACM;CACN,eAAA,YAAY,EAAE,QAAQ,WAAW,QAAQ;AAC3C;;;AC1CA,SAAgB,MAA2C,WAAoB;CAC7E,eAAA,YAAY,EAAE,MAAM,SAAS;AAC/B;AAEA,SAAgB,WAAiB;CAC/B,eAAA,YAAY,EAAE,SAAS;AACzB;AAEA,SAAgB,SACd,WACM;CACN,eAAA,YAAY,EAAE,SAAS,SAAS;AAClC"}
@@ -0,0 +1,38 @@
1
+ import { t as getRegistry } from "./config-COT4Xkbc.js";
2
+ //#region src/registry/queries.ts
3
+ function hasInstance(BlocClass, opts) {
4
+ const registry = getRegistry();
5
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
6
+ return registry.hasInstance(BlocClass, key);
7
+ }
8
+ function getRefCount(BlocClass, opts) {
9
+ const registry = getRegistry();
10
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
11
+ return registry.getRefCount(BlocClass, key);
12
+ }
13
+ function getRefIds(BlocClass, opts) {
14
+ const registry = getRegistry();
15
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
16
+ return registry.getRefIds(BlocClass, key);
17
+ }
18
+ function getAll(BlocClass) {
19
+ return getRegistry().getAll(BlocClass);
20
+ }
21
+ function forEach(BlocClass, callback) {
22
+ getRegistry().forEach(BlocClass, callback);
23
+ }
24
+ //#endregion
25
+ //#region src/registry/management.ts
26
+ function clear(BlocClass) {
27
+ getRegistry().clear(BlocClass);
28
+ }
29
+ function clearAll() {
30
+ getRegistry().clearAll();
31
+ }
32
+ function register(BlocClass) {
33
+ getRegistry().register(BlocClass);
34
+ }
35
+ //#endregion
36
+ export { getAll as a, hasInstance as c, forEach as i, clearAll as n, getRefCount as o, register as r, getRefIds as s, clear as t };
37
+
38
+ //# sourceMappingURL=management-BqGBdL01.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management-BqGBdL01.js","names":[],"sources":["../src/registry/queries.ts","../src/registry/management.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n InstanceReadonlyState,\n} from '../types/utilities';\n\nexport function hasInstance<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): boolean {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.hasInstance(BlocClass, key);\n}\n\nexport function getRefCount<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): number {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefCount(BlocClass, key);\n}\n\nexport function getRefIds<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): string[] {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefIds(BlocClass, key);\n}\n\nexport function getAll<T extends StateContainerConstructor>(\n BlocClass: T,\n): InstanceReadonlyState<T>[] {\n return getRegistry().getAll(BlocClass);\n}\n\nexport function forEach<T extends StateContainerConstructor>(\n BlocClass: T,\n callback: (instance: InstanceReadonlyState<T>) => void,\n): void {\n getRegistry().forEach(BlocClass, callback);\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function clear<T extends StateContainerConstructor>(BlocClass: T): void {\n getRegistry().clear(BlocClass);\n}\n\nexport function clearAll(): void {\n getRegistry().clearAll();\n}\n\nexport function register<T extends StateContainerConstructor>(\n BlocClass: T,\n): void {\n getRegistry().register(BlocClass);\n}\n"],"mappings":";;AAOA,SAAgB,YACd,WACA,MACS;CACT,MAAM,WAAW,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,YACd,WACA,MACQ;CACR,MAAM,WAAW,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,UACd,WACA,MACU;CACV,MAAM,WAAW,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,UAAU,WAAW,GAAG;AAC1C;AAEA,SAAgB,OACd,WAC4B;CAC5B,OAAO,YAAY,EAAE,OAAO,SAAS;AACvC;AAEA,SAAgB,QACd,WACA,UACM;CACN,YAAY,EAAE,QAAQ,WAAW,QAAQ;AAC3C;;;AC1CA,SAAgB,MAA2C,WAAoB;CAC7E,YAAY,EAAE,MAAM,SAAS;AAC/B;AAEA,SAAgB,WAAiB;CAC/B,YAAY,EAAE,SAAS;AACzB;AAEA,SAAgB,SACd,WACM;CACN,YAAY,EAAE,SAAS,SAAS;AAClC"}
@@ -0,0 +1,38 @@
1
+ import { t as getRegistry } from "./config-buwpT7l3.js";
2
+ //#region src/registry/queries.ts
3
+ function hasInstance(BlocClass, opts) {
4
+ const registry = getRegistry();
5
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
6
+ return registry.hasInstance(BlocClass, key);
7
+ }
8
+ function getRefCount(BlocClass, opts) {
9
+ const registry = getRegistry();
10
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
11
+ return registry.getRefCount(BlocClass, key);
12
+ }
13
+ function getRefIds(BlocClass, opts) {
14
+ const registry = getRegistry();
15
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
16
+ return registry.getRefIds(BlocClass, key);
17
+ }
18
+ function getAll(BlocClass) {
19
+ return getRegistry().getAll(BlocClass);
20
+ }
21
+ function forEach(BlocClass, callback) {
22
+ getRegistry().forEach(BlocClass, callback);
23
+ }
24
+ //#endregion
25
+ //#region src/registry/management.ts
26
+ function clear(BlocClass) {
27
+ getRegistry().clear(BlocClass);
28
+ }
29
+ function clearAll() {
30
+ getRegistry().clearAll();
31
+ }
32
+ function register(BlocClass) {
33
+ getRegistry().register(BlocClass);
34
+ }
35
+ //#endregion
36
+ export { getAll as a, hasInstance as c, forEach as i, clearAll as n, getRefCount as o, register as r, getRefIds as s, clear as t };
37
+
38
+ //# sourceMappingURL=management-BvUAjril.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management-BvUAjril.js","names":[],"sources":["../src/registry/queries.ts","../src/registry/management.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n InstanceReadonlyState,\n} from '../types/utilities';\n\nexport function hasInstance<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): boolean {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.hasInstance(BlocClass, key);\n}\n\nexport function getRefCount<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): number {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefCount(BlocClass, key);\n}\n\nexport function getRefIds<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): string[] {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefIds(BlocClass, key);\n}\n\nexport function getAll<T extends StateContainerConstructor>(\n BlocClass: T,\n): InstanceReadonlyState<T>[] {\n return getRegistry().getAll(BlocClass);\n}\n\nexport function forEach<T extends StateContainerConstructor>(\n BlocClass: T,\n callback: (instance: InstanceReadonlyState<T>) => void,\n): void {\n getRegistry().forEach(BlocClass, callback);\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function clear<T extends StateContainerConstructor>(BlocClass: T): void {\n getRegistry().clear(BlocClass);\n}\n\nexport function clearAll(): void {\n getRegistry().clearAll();\n}\n\nexport function register<T extends StateContainerConstructor>(\n BlocClass: T,\n): void {\n getRegistry().register(BlocClass);\n}\n"],"mappings":";;AAOA,SAAgB,YACd,WACA,MACS;CACT,MAAM,WAAW,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,YACd,WACA,MACQ;CACR,MAAM,WAAW,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,UACd,WACA,MACU;CACV,MAAM,WAAW,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,UAAU,WAAW,GAAG;AAC1C;AAEA,SAAgB,OACd,WAC4B;CAC5B,OAAO,YAAY,EAAE,OAAO,SAAS;AACvC;AAEA,SAAgB,QACd,WACA,UACM;CACN,YAAY,EAAE,QAAQ,WAAW,QAAQ;AAC3C;;;AC1CA,SAAgB,MAA2C,WAAoB;CAC7E,YAAY,EAAE,MAAM,SAAS;AAC/B;AAEA,SAAgB,WAAiB;CAC/B,YAAY,EAAE,SAAS;AACzB;AAEA,SAAgB,SACd,WACM;CACN,YAAY,EAAE,SAAS,SAAS;AAClC"}
@@ -0,0 +1,85 @@
1
+ const require_config = require("./config-b2z51Y_C.cjs");
2
+ //#region src/registry/queries.ts
3
+ function hasInstance(BlocClass, opts) {
4
+ const registry = require_config.getRegistry();
5
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
6
+ return registry.hasInstance(BlocClass, key);
7
+ }
8
+ function getRefCount(BlocClass, opts) {
9
+ const registry = require_config.getRegistry();
10
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
11
+ return registry.getRefCount(BlocClass, key);
12
+ }
13
+ function getRefIds(BlocClass, opts) {
14
+ const registry = require_config.getRegistry();
15
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
16
+ return registry.getRefIds(BlocClass, key);
17
+ }
18
+ function getAll(BlocClass) {
19
+ return require_config.getRegistry().getAll(BlocClass);
20
+ }
21
+ function forEach(BlocClass, callback) {
22
+ require_config.getRegistry().forEach(BlocClass, callback);
23
+ }
24
+ //#endregion
25
+ //#region src/registry/management.ts
26
+ function clear(BlocClass) {
27
+ require_config.getRegistry().clear(BlocClass);
28
+ }
29
+ function clearAll() {
30
+ require_config.getRegistry().clearAll();
31
+ }
32
+ function register(BlocClass) {
33
+ require_config.getRegistry().register(BlocClass);
34
+ }
35
+ //#endregion
36
+ Object.defineProperty(exports, "clear", {
37
+ enumerable: true,
38
+ get: function() {
39
+ return clear;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "clearAll", {
43
+ enumerable: true,
44
+ get: function() {
45
+ return clearAll;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "forEach", {
49
+ enumerable: true,
50
+ get: function() {
51
+ return forEach;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "getAll", {
55
+ enumerable: true,
56
+ get: function() {
57
+ return getAll;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "getRefCount", {
61
+ enumerable: true,
62
+ get: function() {
63
+ return getRefCount;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "getRefIds", {
67
+ enumerable: true,
68
+ get: function() {
69
+ return getRefIds;
70
+ }
71
+ });
72
+ Object.defineProperty(exports, "hasInstance", {
73
+ enumerable: true,
74
+ get: function() {
75
+ return hasInstance;
76
+ }
77
+ });
78
+ Object.defineProperty(exports, "register", {
79
+ enumerable: true,
80
+ get: function() {
81
+ return register;
82
+ }
83
+ });
84
+
85
+ //# sourceMappingURL=management-Df7Y2sF1.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management-Df7Y2sF1.cjs","names":["getRegistry"],"sources":["../src/registry/queries.ts","../src/registry/management.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n InstanceReadonlyState,\n} from '../types/utilities';\n\nexport function hasInstance<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): boolean {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.hasInstance(BlocClass, key);\n}\n\nexport function getRefCount<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): number {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefCount(BlocClass, key);\n}\n\nexport function getRefIds<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): string[] {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefIds(BlocClass, key);\n}\n\nexport function getAll<T extends StateContainerConstructor>(\n BlocClass: T,\n): InstanceReadonlyState<T>[] {\n return getRegistry().getAll(BlocClass);\n}\n\nexport function forEach<T extends StateContainerConstructor>(\n BlocClass: T,\n callback: (instance: InstanceReadonlyState<T>) => void,\n): void {\n getRegistry().forEach(BlocClass, callback);\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function clear<T extends StateContainerConstructor>(BlocClass: T): void {\n getRegistry().clear(BlocClass);\n}\n\nexport function clearAll(): void {\n getRegistry().clearAll();\n}\n\nexport function register<T extends StateContainerConstructor>(\n BlocClass: T,\n): void {\n getRegistry().register(BlocClass);\n}\n"],"mappings":";;AAOA,SAAgB,YACd,WACA,MACS;CACT,MAAM,WAAWA,eAAAA,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,YACd,WACA,MACQ;CACR,MAAM,WAAWA,eAAAA,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,UACd,WACA,MACU;CACV,MAAM,WAAWA,eAAAA,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,UAAU,WAAW,GAAG;AAC1C;AAEA,SAAgB,OACd,WAC4B;CAC5B,OAAOA,eAAAA,YAAY,EAAE,OAAO,SAAS;AACvC;AAEA,SAAgB,QACd,WACA,UACM;CACN,eAAA,YAAY,EAAE,QAAQ,WAAW,QAAQ;AAC3C;;;AC1CA,SAAgB,MAA2C,WAAoB;CAC7E,eAAA,YAAY,EAAE,MAAM,SAAS;AAC/B;AAEA,SAAgB,WAAiB;CAC/B,eAAA,YAAY,EAAE,SAAS;AACzB;AAEA,SAAgB,SACd,WACM;CACN,eAAA,YAAY,EAAE,SAAS,SAAS;AAClC"}
@@ -19,10 +19,9 @@ export interface InstanceMetadata {
19
19
  /**
20
20
  * Per-event context delivered to plugin hooks.
21
21
  *
22
- * Per Decision 6 (C2 migration): `PluginContext` is per-container — it
23
- * identifies the bloc, not the event. Per-event data (e.g. the changed
24
- * `PathSet`) is passed via dedicated method arguments, never via the
25
- * context object.
22
+ * `PluginContext` is per-container — it identifies the bloc, not the event.
23
+ * Per-event data (e.g. the changed `PathSet`) is passed via dedicated method
24
+ * arguments, never via the context object.
26
25
  *
27
26
  * The `container` field is the focal bloc for the event. For `onInstall`
28
27
  * (which fires once at install time, not bound to any container) the
@@ -54,9 +53,9 @@ export interface PluginContext {
54
53
  /**
55
54
  * BlaC plugin hook surface.
56
55
  *
57
- * Per C2 (Decision 6), state-change events carry the `PathSet` of paths
58
- * that changed in the flush. Lifecycle events (`onCreated`, `onDestroyed`)
59
- * are not tied to a state change and so do not carry `paths`.
56
+ * State-change events carry the `PathSet` of paths that changed in the flush.
57
+ * Lifecycle events (`onCreated`, `onDestroyed`) are not tied to a state change
58
+ * and so do not carry `paths`.
60
59
  *
61
60
  * Hook firing model:
62
61
  * - `onCreated` fires synchronously when a container is first acquired.
@@ -66,9 +65,9 @@ export interface PluginContext {
66
65
  * - `onDestroyed` fires synchronously when a container is disposed (after
67
66
  * its system 'dispose' event).
68
67
  *
69
- * Legacy ref/deps hooks (`onRefAcquired`, `onRefReleased`, `onDepsChanged`)
70
- * are retained for devtools-connect compatibility — they are orthogonal to
71
- * the C2 event payload contract.
68
+ * The ref/deps hooks (`onRefAcquired`, `onRefReleased`, `onDepsChanged`) are
69
+ * devtools-only — they drive devtools-connect and are orthogonal to the
70
+ * state-change event payload.
72
71
  */
73
72
  export interface BlacPlugin {
74
73
  readonly name: string;
@@ -102,12 +101,12 @@ export interface BlacPlugin {
102
101
  onHydrationChange?(ctx: PluginContext, status: HydrationStatus, previousStatus: HydrationStatus): void;
103
102
  /**
104
103
  * @internal Devtools-only — fires when a named ref is acquired.
105
- * Not part of the C2 event payload contract.
104
+ * Not part of the state-change event payload.
106
105
  */
107
106
  onRefAcquired?(ctx: PluginContext, refId: string): void;
108
107
  /**
109
108
  * @internal Devtools-only — fires when a named ref is released.
110
- * Not part of the C2 event payload contract.
109
+ * Not part of the state-change event payload.
111
110
  */
112
111
  onRefReleased?(ctx: PluginContext, refId: string): void;
113
112
  /**
@@ -105,8 +105,7 @@ export declare class PluginManager {
105
105
  *
106
106
  * Note: `prev` is captured once and reused across plugins — every
107
107
  * plugin sees the same `prev`/`next`/`paths` regardless of dispatch
108
- * order, matching the "snapshot prev once per flush" invariant called
109
- * out in the C2 spec pitfalls.
108
+ * order, matching the "snapshot prev once per flush" invariant.
110
109
  */
111
110
  private dispatchStateChange;
112
111
  /**
@@ -114,7 +113,7 @@ export declare class PluginManager {
114
113
  *
115
114
  * Builds a fresh `PluginContext` per dispatch (instance becomes
116
115
  * `ctx.container`), so plugins can reach the focal bloc through
117
- * `ctx.container` per Decision 6.
116
+ * `ctx.container`.
118
117
  */
119
118
  private notifyPlugins;
120
119
  /**
@@ -123,7 +122,7 @@ export declare class PluginManager {
123
122
  * so we create one per dispatch rather than caching per container.
124
123
  * This sidesteps the lifetime question of "when do we evict a cached
125
124
  * context?" and keeps `paths`-vs-`container` lifetimes cleanly
126
- * separated per the C2 spec.
125
+ * separated.
127
126
  */
128
127
  private buildContext;
129
128
  /**
package/dist/plugins.cjs CHANGED
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_StateContainerRegistry = require("./StateContainerRegistry-DJQqLrli.cjs");
2
+ const require_StateContainerRegistry = require("./StateContainerRegistry-CSNm2Ws5.cjs");
3
3
  exports.PluginManager = require_StateContainerRegistry.PluginManager;
4
4
  exports.getPluginManager = require_StateContainerRegistry.getPluginManager;
package/dist/plugins.js CHANGED
@@ -1,2 +1,2 @@
1
- import { c as PluginManager, n as getPluginManager } from "./StateContainerRegistry-B1GYx9Xo.js";
1
+ import { d as PluginManager, n as getPluginManager } from "./StateContainerRegistry-CvBOhAT2.js";
2
2
  export { PluginManager, getPluginManager };