@directive-run/vue 1.23.0 → 1.23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dev-true.ts","../src/index.ts"],"names":["dev_true_default","useFact","system","keyOrKeys","assertSystem","_useFactMulti","_useFactSingle","factKey","value","ref","unsubscribe","onScopeDispose","factKeys","getValues","result","key","state","shallowRef","useDerived","idOrIds","_useDerivedMulti","_useDerivedSingle","derivationId","derivationIds","id","useSelector","selector","equalityFn","defaultEquality","deriveKeySet","runWithTracking","runTrackedSelector","initial","trackedFactKeys","trackedDeriveKeys","selected","unsubs","resubscribe","unsub","onUpdate","depsChanged","useDispatch","event","useEvents","useWatch","callback","useInspect","options","computeInspectState","update","throttled","cleanup","createThrottle","unsubFacts","unsubSettled","useRequirementStatus","statusPlugin","typeOrTypes","type","status","useSuspenseRequirement","_useSuspenseRequirementMulti","_useSuspenseRequirementSingle","initialStatus","resolve","reject","current","_findFirstStatusError","types","_waitForAllSettled","onTick","t","err","initialError","useExplain","requirementId","explanation","useConstraintStatus","constraintId","inspectState","computed","fullInspection","c","useOptimisticUpdate","requirementType","isPending","error","snapshot","rollback","mutate","updateFn","useHistory","buildHistoryState","_buildDirectivePlugins","config","plugins","sp","createRequirementStatusPlugin","_createDirectiveSystem","moduleDef","systemConfig","createSystem","_subscribeFacts","subscribeAll","pickFacts","_subscribeDerived","derivedKeys","allDerivationKeys","getDerived","useDirective","factsState","derivedState","unsubDerived","events","createTypedHooks","useNamespacedSelector","keys","_createQuerySystem","getCreateQuerySystem","useQuerySystem","HYDRATION_KEY","DirectiveHydrator","defineComponent","props","slots","provide","useHydratedSystem","inject","mergedFacts","mergeHydrationFacts","useAuditLedger","ledger","filter","opts","requestedPollMs","pollMs","entryCount","entries","intervalId"],"mappings":"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","file":"index.cjs","sourcesContent":["export default typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\";\n","/**\n * Vue Adapter - Vue 3 composables for Directive\n *\n * Exports: useFact, useDerived, useDispatch, useSelector,\n * useWatch, useInspect, useRequirementStatus, useSuspenseRequirement,\n * useEvents, useExplain, useConstraintStatus, useOptimisticUpdate,\n * useDirective, useHistory, createTypedHooks, shallowEqual\n */\n\nimport type {\n ErrorBoundaryConfig,\n InferDerivations,\n InferEvents,\n InferFacts,\n InferSelectorState,\n ModuleDef,\n ModuleSchema,\n ModulesMap,\n NamespacedSystem,\n Plugin,\n SingleModuleSystem,\n SystemSnapshot,\n TraceOption,\n} from \"@directive-run/core\";\nimport {\n createRequirementStatusPlugin,\n createSystem,\n} from \"@directive-run/core\";\nimport type { RequirementTypeStatus } from \"@directive-run/core\";\nimport {\n type ConstraintInfo,\n type InspectState,\n assertSystem,\n buildHistoryState,\n computeInspectState,\n createThrottle,\n defaultEquality,\n depsChanged,\n mergeHydrationFacts,\n pickFacts,\n runTrackedSelector,\n shallowEqual,\n} from \"@directive-run/core/adapter-utils\";\nimport {\n type ComputedRef,\n type InjectionKey,\n type Ref,\n type ShallowRef,\n computed,\n defineComponent,\n inject,\n onScopeDispose,\n provide,\n ref,\n shallowRef,\n} from \"vue\";\nimport isDevelopment from \"#is-development\";\n\n// Re-export for convenience\nexport type { RequirementTypeStatus, InspectState, ConstraintInfo };\nexport { shallowEqual };\n\n/** Type for the requirement status plugin return value */\nexport type StatusPlugin = ReturnType<typeof createRequirementStatusPlugin>;\n\n// ============================================================================\n// useFact — single key or multi key\n// ============================================================================\n\n/** Single key overload */\nexport function useFact<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(system: SingleModuleSystem<S>, factKey: K): Ref<InferFacts<S>[K] | undefined>;\n/** Multi-key overload */\nexport function useFact<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(\n system: SingleModuleSystem<S>,\n factKeys: K[],\n): ShallowRef<Pick<InferFacts<S>, K>>;\n/** Implementation */\nexport function useFact(\n system: SingleModuleSystem<any>,\n keyOrKeys: string | string[],\n): Ref<unknown> | ShallowRef<unknown> {\n assertSystem(\"useFact\", system);\n if (isDevelopment && typeof keyOrKeys === \"function\") {\n console.error(\n \"[Directive] useFact() received a function. Did you mean useSelector()? \" +\n \"useFact() takes a string key or array of keys, not a selector function.\",\n );\n }\n\n // Multi-key path: useFact(system, [keys])\n if (Array.isArray(keyOrKeys)) {\n return _useFactMulti(system, keyOrKeys);\n }\n\n // Single key path: useFact(system, key)\n return _useFactSingle(system, keyOrKeys);\n}\n\nfunction _useFactSingle(\n system: SingleModuleSystem<any>,\n factKey: string,\n): Ref<unknown> {\n if (isDevelopment) {\n if (!system.facts.$store.has(factKey)) {\n console.warn(\n `[Directive] useFact(\"${factKey}\") — fact not found in store. ` +\n `Check that \"${factKey}\" is defined in your module's schema.`,\n );\n }\n }\n\n const value = ref(system.facts.$store.get(factKey));\n const unsubscribe = system.facts.$store.subscribe([factKey], () => {\n value.value = system.facts.$store.get(factKey);\n });\n onScopeDispose(unsubscribe);\n return value;\n}\n\nfunction _useFactMulti(\n system: SingleModuleSystem<any>,\n factKeys: string[],\n): ShallowRef<Record<string, unknown>> {\n const getValues = (): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const key of factKeys) {\n result[key] = system.facts.$store.get(key);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = system.facts.$store.subscribe(factKeys, () => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n}\n\n// ============================================================================\n// useDerived — single key or multi key\n// ============================================================================\n\n/** Single key overload */\nexport function useDerived<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(system: SingleModuleSystem<S>, derivationId: K): Ref<InferDerivations<S>[K]>;\n/** Multi-key overload */\nexport function useDerived<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(\n system: SingleModuleSystem<S>,\n derivationIds: K[],\n): ShallowRef<Pick<InferDerivations<S>, K>>;\n/** Implementation */\nexport function useDerived(\n system: SingleModuleSystem<any>,\n idOrIds: string | string[],\n): Ref<unknown> | ShallowRef<unknown> {\n assertSystem(\"useDerived\", system);\n if (isDevelopment && typeof idOrIds === \"function\") {\n console.error(\n \"[Directive] useDerived() received a function. Did you mean useSelector()? \" +\n \"useDerived() takes a string key or array of keys, not a selector function.\",\n );\n }\n\n // Multi-key path\n if (Array.isArray(idOrIds)) {\n return _useDerivedMulti(system, idOrIds);\n }\n\n // Single key path\n return _useDerivedSingle(system, idOrIds);\n}\n\nfunction _useDerivedSingle(\n system: SingleModuleSystem<any>,\n derivationId: string,\n): Ref<unknown> {\n if (isDevelopment) {\n const initialValue = system.read(derivationId);\n if (initialValue === undefined) {\n console.warn(\n `[Directive] useDerived(\"${derivationId}\") returned undefined. ` +\n `Check that \"${derivationId}\" is defined in your module's derive property.`,\n );\n }\n }\n const value = ref(system.read(derivationId));\n const unsubscribe = system.subscribe([derivationId], () => {\n value.value = system.read(derivationId);\n });\n onScopeDispose(unsubscribe);\n return value;\n}\n\nfunction _useDerivedMulti(\n system: SingleModuleSystem<any>,\n derivationIds: string[],\n): ShallowRef<Record<string, unknown>> {\n const getValues = (): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const id of derivationIds) {\n result[id] = system.read(id);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = system.subscribe(derivationIds, () => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n}\n\n// ============================================================================\n// useSelector — auto-tracking selector over facts and derivations\n// ============================================================================\n\n/**\n * Auto-tracking selector over facts and derivations.\n * Uses `withTracking()` to detect which facts the selector accesses,\n * then subscribes only to those keys.\n */\nexport function useSelector<S extends ModuleSchema, R>(\n system: SingleModuleSystem<S>,\n selector: (state: InferSelectorState<S>) => R,\n equalityFn?: (a: R, b: R) => boolean,\n): Ref<R>;\nexport function useSelector(\n system: SingleModuleSystem<any>,\n selector: (state: Record<string, unknown>) => unknown,\n equalityFn: (a: unknown, b: unknown) => boolean = defaultEquality,\n): Ref<unknown> {\n assertSystem(\"useSelector\", system);\n const deriveKeySet = new Set(Object.keys(system.derive ?? {}));\n\n const runWithTracking = () =>\n runTrackedSelector(system, deriveKeySet, selector);\n\n const initial = runWithTracking();\n let trackedFactKeys = initial.factKeys;\n let trackedDeriveKeys = initial.deriveKeys;\n const selected = ref(initial.value);\n\n const unsubs: Array<() => void> = [];\n\n const resubscribe = () => {\n for (const unsub of unsubs) unsub();\n unsubs.length = 0;\n\n const onUpdate = () => {\n const result = runWithTracking();\n if (!equalityFn(selected.value, result.value)) {\n selected.value = result.value;\n }\n // Re-track: check if deps changed\n if (\n depsChanged(\n trackedFactKeys,\n result.factKeys,\n trackedDeriveKeys,\n result.deriveKeys,\n )\n ) {\n trackedFactKeys = result.factKeys;\n trackedDeriveKeys = result.deriveKeys;\n resubscribe();\n }\n };\n\n if (trackedFactKeys.length > 0) {\n unsubs.push(system.facts.$store.subscribe(trackedFactKeys, onUpdate));\n } else if (trackedDeriveKeys.length === 0) {\n unsubs.push(system.facts.$store.subscribeAll(onUpdate));\n }\n if (trackedDeriveKeys.length > 0) {\n unsubs.push(system.subscribe(trackedDeriveKeys, onUpdate));\n }\n };\n\n resubscribe();\n\n onScopeDispose(() => {\n for (const unsub of unsubs) unsub();\n });\n\n return selected;\n}\n\n// ============================================================================\n// useDispatch\n// ============================================================================\n\nexport function useDispatch<S extends ModuleSchema>(\n system: SingleModuleSystem<S>,\n): (event: InferEvents<S>) => void {\n assertSystem(\"useDispatch\", system);\n return (event: InferEvents<S>) => {\n system.dispatch(event);\n };\n}\n\n// ============================================================================\n// useEvents — memoized events reference\n// ============================================================================\n\n/**\n * Returns the system's events dispatcher.\n */\nexport function useEvents<S extends ModuleSchema>(\n system: SingleModuleSystem<S>,\n): SingleModuleSystem<S>[\"events\"] {\n assertSystem(\"useEvents\", system);\n return system.events;\n}\n\n// ============================================================================\n// useWatch — derivation or fact side-effect\n// ============================================================================\n\n/** Watch a derivation or fact by key (auto-detected). When a key exists in both facts and derivations, the derivation overload takes priority. */\nexport function useWatch<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(\n system: SingleModuleSystem<S>,\n key: K,\n callback: (\n newValue: InferDerivations<S>[K],\n previousValue: InferDerivations<S>[K] | undefined,\n ) => void,\n): void;\n/** Watch a fact key with auto-detection. */\nexport function useWatch<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(\n system: SingleModuleSystem<S>,\n key: K,\n callback: (\n newValue: InferFacts<S>[K] | undefined,\n previousValue: InferFacts<S>[K] | undefined,\n ) => void,\n): void;\n/** Implementation */\nexport function useWatch(\n system: SingleModuleSystem<any>,\n key: string,\n callback: (newValue: unknown, prevValue: unknown) => void,\n): void {\n assertSystem(\"useWatch\", system);\n\n const unsubscribe = system.watch(key, callback);\n onScopeDispose(unsubscribe);\n}\n\n// ============================================================================\n// useInspect — consolidated inspection hook\n// ============================================================================\n\n/** Options for useInspect */\nexport interface UseInspectOptions {\n throttleMs?: number;\n}\n\n/**\n * Consolidated system inspection hook.\n * Returns InspectState with optional throttling.\n */\nexport function useInspect(\n system: SingleModuleSystem<any>,\n options?: UseInspectOptions,\n): ShallowRef<InspectState> {\n assertSystem(\"useInspect\", system);\n const state = shallowRef<InspectState>(computeInspectState(system));\n\n const update = () => {\n state.value = computeInspectState(system);\n };\n\n if (options?.throttleMs && options.throttleMs > 0) {\n const { throttled, cleanup } = createThrottle(update, options.throttleMs);\n const unsubFacts = system.facts.$store.subscribeAll(throttled);\n const unsubSettled = system.onSettledChange(throttled);\n onScopeDispose(() => {\n cleanup();\n unsubFacts();\n unsubSettled();\n });\n } else {\n const unsubFacts = system.facts.$store.subscribeAll(update);\n const unsubSettled = system.onSettledChange(update);\n onScopeDispose(() => {\n unsubFacts();\n unsubSettled();\n });\n }\n\n return state;\n}\n\n// ============================================================================\n// useRequirementStatus — single or multi\n// ============================================================================\n\n/** Single type overload */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n type: string,\n): ShallowRef<RequirementTypeStatus>;\n/** Multi-type overload */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n types: string[],\n): ShallowRef<Record<string, RequirementTypeStatus>>;\n/** Implementation */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n typeOrTypes: string | string[],\n):\n | ShallowRef<RequirementTypeStatus>\n | ShallowRef<Record<string, RequirementTypeStatus>> {\n if (Array.isArray(typeOrTypes)) {\n const getValues = (): Record<string, RequirementTypeStatus> => {\n const result: Record<string, RequirementTypeStatus> = {};\n for (const type of typeOrTypes) {\n result[type] = statusPlugin.getStatus(type);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = statusPlugin.subscribe(() => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n }\n\n const status = shallowRef<RequirementTypeStatus>(\n statusPlugin.getStatus(typeOrTypes),\n );\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = statusPlugin.getStatus(typeOrTypes);\n });\n onScopeDispose(unsubscribe);\n return status;\n}\n\n// ============================================================================\n// useSuspenseRequirement — async setup() Suspense integration\n// ============================================================================\n\n/**\n * Returns a promise that resolves when a requirement type settles.\n * Designed for Vue's async `setup()` with `<Suspense>`.\n *\n * - If the requirement is loading, the returned promise suspends the component.\n * - If the requirement has an error, the promise rejects with that error.\n * - If the requirement is already settled, resolves immediately.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useSuspenseRequirement } from '@directive-run/vue';\n *\n * // In async setup(), this suspends until FETCH_USER settles\n * const status = await useSuspenseRequirement(statusPlugin, \"FETCH_USER\");\n * </script>\n *\n * <template>\n * <div>Resolved: {{ status.resolvedCount }}</div>\n * </template>\n * ```\n */\n\n/** Single type overload */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n type: string,\n): Promise<ShallowRef<RequirementTypeStatus>>;\n\n/** Multi-type overload */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<ShallowRef<Record<string, RequirementTypeStatus>>>;\n\n/** Implementation */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n typeOrTypes: string | string[],\n): Promise<\n | ShallowRef<RequirementTypeStatus>\n | ShallowRef<Record<string, RequirementTypeStatus>>\n> {\n if (Array.isArray(typeOrTypes)) {\n return _useSuspenseRequirementMulti(statusPlugin, typeOrTypes);\n }\n\n return _useSuspenseRequirementSingle(statusPlugin, typeOrTypes);\n}\n\nasync function _useSuspenseRequirementSingle(\n statusPlugin: StatusPlugin,\n type: string,\n): Promise<ShallowRef<RequirementTypeStatus>> {\n const initialStatus = statusPlugin.getStatus(type);\n\n if (initialStatus.hasError && initialStatus.lastError) {\n throw initialStatus.lastError;\n }\n\n // If loading, wait for it to settle\n if (initialStatus.isLoading) {\n await new Promise<void>((resolve, reject) => {\n const unsubscribe = statusPlugin.subscribe(() => {\n const current = statusPlugin.getStatus(type);\n if (!current.isLoading) {\n unsubscribe();\n if (current.hasError && current.lastError) {\n reject(current.lastError);\n } else {\n resolve();\n }\n }\n });\n onScopeDispose(unsubscribe);\n });\n }\n\n // Now settled — return a reactive ref that continues tracking\n const status = shallowRef<RequirementTypeStatus>(\n statusPlugin.getStatus(type),\n );\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = statusPlugin.getStatus(type);\n });\n onScopeDispose(unsubscribe);\n\n return status;\n}\n\nfunction _findFirstStatusError(\n statusPlugin: StatusPlugin,\n types: string[],\n): Error | null {\n for (const type of types) {\n const s = statusPlugin.getStatus(type);\n if (s.hasError && s.lastError) {\n return s.lastError;\n }\n }\n\n return null;\n}\n\nfunction _waitForAllSettled(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const onTick = () => {\n const allDone = types.every((t) => !statusPlugin.getStatus(t).isLoading);\n if (!allDone) return;\n unsubscribe();\n const err = _findFirstStatusError(statusPlugin, types);\n if (err) {\n reject(err);\n return;\n }\n resolve();\n };\n const unsubscribe = statusPlugin.subscribe(onTick);\n onScopeDispose(unsubscribe);\n });\n}\n\nasync function _useSuspenseRequirementMulti(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<ShallowRef<Record<string, RequirementTypeStatus>>> {\n // Check for immediate errors\n const initialError = _findFirstStatusError(statusPlugin, types);\n if (initialError) {\n throw initialError;\n }\n\n // If any are loading, wait for all to settle\n const anyLoading = types.some((t) => statusPlugin.getStatus(t).isLoading);\n if (anyLoading) {\n await _waitForAllSettled(statusPlugin, types);\n }\n\n // Now settled — return a reactive ref that continues tracking\n const getValues = (): Record<string, RequirementTypeStatus> => {\n const result: Record<string, RequirementTypeStatus> = {};\n for (const type of types) {\n result[type] = statusPlugin.getStatus(type);\n }\n\n return result;\n };\n const status = shallowRef(getValues());\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = getValues();\n });\n onScopeDispose(unsubscribe);\n\n return status;\n}\n\n// ============================================================================\n// useExplain — reactive requirement explanation\n// ============================================================================\n\n/**\n * Reactively returns the explanation string for a requirement.\n */\nexport function useExplain(\n system: SingleModuleSystem<any>,\n requirementId: string,\n): Ref<string | null> {\n assertSystem(\"useExplain\", system);\n const explanation = ref<string | null>(system.explain(requirementId)) as Ref<\n string | null\n >;\n\n const update = () => {\n explanation.value = system.explain(requirementId);\n };\n\n const unsubFacts = system.facts.$store.subscribeAll(update);\n const unsubSettled = system.onSettledChange(update);\n onScopeDispose(() => {\n unsubFacts();\n unsubSettled();\n });\n\n return explanation;\n}\n\n// ============================================================================\n// useConstraintStatus — reactive constraint inspection\n// ============================================================================\n\n/** Get all constraints */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n): ComputedRef<ConstraintInfo[]>;\n/** Get a single constraint by ID */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n constraintId: string,\n): ComputedRef<ConstraintInfo | null>;\n/** Implementation */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n constraintId?: string,\n): ComputedRef<ConstraintInfo[] | ConstraintInfo | null> {\n assertSystem(\"useConstraintStatus\", system);\n const inspectState = useInspect(system);\n\n return computed(() => {\n // Track reactivity via inspectState, but use full inspect() for constraint list\n void inspectState.value;\n const fullInspection = system.inspect();\n if (!constraintId) return fullInspection.constraints;\n return (\n fullInspection.constraints.find((c) => c.id === constraintId) ?? null\n );\n });\n}\n\n// ============================================================================\n// useOptimisticUpdate — batch with rollback on failure\n// ============================================================================\n\nexport interface OptimisticUpdateResult {\n mutate: (updateFn: () => void) => void;\n isPending: Ref<boolean>;\n error: Ref<Error | null>;\n rollback: () => void;\n}\n\n/**\n * Optimistic update hook. Saves a snapshot before mutating, monitors\n * a requirement type via statusPlugin, and rolls back on failure.\n */\nexport function useOptimisticUpdate(\n system: SingleModuleSystem<any>,\n statusPlugin?: StatusPlugin,\n requirementType?: string,\n): OptimisticUpdateResult {\n assertSystem(\"useOptimisticUpdate\", system);\n const isPending = ref(false);\n const error = ref<Error | null>(null) as Ref<Error | null>;\n let snapshot: SystemSnapshot | null = null;\n let unsubscribe: (() => void) | null = null;\n\n const rollback = () => {\n if (snapshot) {\n system.restore(snapshot);\n snapshot = null;\n }\n isPending.value = false;\n error.value = null;\n unsubscribe?.();\n unsubscribe = null;\n };\n\n const mutate = (updateFn: () => void) => {\n snapshot = system.getSnapshot();\n isPending.value = true;\n error.value = null;\n system.batch(updateFn);\n\n // Watch for resolver completion/failure\n if (statusPlugin && requirementType) {\n unsubscribe?.();\n unsubscribe = statusPlugin.subscribe(() => {\n const status = statusPlugin.getStatus(requirementType);\n if (!status.isLoading && !status.hasError) {\n snapshot = null;\n isPending.value = false;\n unsubscribe?.();\n unsubscribe = null;\n } else if (status.hasError) {\n error.value = status.lastError;\n rollback();\n }\n });\n }\n };\n\n onScopeDispose(() => {\n unsubscribe?.();\n });\n\n return { mutate, isPending, error, rollback };\n}\n\n// ============================================================================\n// useHistory — reactive history state\n// ============================================================================\n\n/**\n * Reactive history composable. Returns a ShallowRef that updates\n * when snapshots are taken or navigation occurs.\n *\n * @example\n * ```vue\n * const history = useHistory(system);\n * <button :disabled=\"!history.value?.canGoBack\" @click=\"history.value?.goBack()\">Undo</button>\n * ```\n */\nexport function useHistory(\n system: SingleModuleSystem<any>,\n): ShallowRef<ReturnType<typeof buildHistoryState>> {\n assertSystem(\"useHistory\", system);\n const state = shallowRef<ReturnType<typeof buildHistoryState>>(\n buildHistoryState(system),\n );\n const unsub = system.onHistoryChange(() => {\n state.value = buildHistoryState(system);\n });\n onScopeDispose(unsub);\n return state;\n}\n\n// ============================================================================\n// Scoped System Composable\n// ============================================================================\n\n/** Configuration for useDirective */\ninterface UseDirectiveConfig {\n plugins?: Plugin<any>[];\n trace?: TraceOption;\n errorBoundary?: ErrorBoundaryConfig;\n tickMs?: number;\n zeroConfig?: boolean;\n initialFacts?: Record<string, any>;\n status?: boolean;\n /** Fact keys to subscribe to (omit for all) */\n facts?: string[];\n /** Derivation keys to subscribe to (omit for all) */\n derived?: string[];\n}\n\n/**\n * Create a scoped Directive system with automatic lifecycle management.\n * When no `facts` or `derived` keys are specified, subscribes to ALL\n * facts and derivations and returns reactive state.\n *\n * @example\n * ```vue\n * // Subscribe to everything\n * const { facts, derived, events, dispatch } = useDirective(counterModule);\n *\n * // Selective keys\n * const { facts, derived } = useDirective(counterModule, { facts: [\"count\"], derived: [\"doubled\"] });\n * ```\n */\nfunction _buildDirectivePlugins(config: UseDirectiveConfig | undefined): {\n plugins: Plugin<ModuleSchema>[];\n statusPlugin: StatusPlugin | undefined;\n} {\n const plugins = [...(config?.plugins ?? [])] as Plugin<ModuleSchema>[];\n let statusPlugin: StatusPlugin | undefined;\n\n if (config?.status) {\n const sp = createRequirementStatusPlugin();\n statusPlugin = sp;\n plugins.push(sp.plugin as Plugin<any>);\n }\n\n return { plugins, statusPlugin };\n}\n\nfunction _createDirectiveSystem<M extends ModuleSchema>(\n moduleDef: ModuleDef<M>,\n config: UseDirectiveConfig | undefined,\n plugins: Plugin<ModuleSchema>[],\n): SingleModuleSystem<M> {\n const systemConfig = {\n module: moduleDef,\n plugins: plugins.length > 0 ? plugins : undefined,\n trace: config?.trace,\n errorBoundary: config?.errorBoundary,\n tickMs: config?.tickMs,\n zeroConfig: config?.zeroConfig,\n initialFacts: config?.initialFacts,\n } as any;\n\n return createSystem(systemConfig) as unknown as SingleModuleSystem<M>;\n}\n\nfunction _subscribeFacts<M extends ModuleSchema>(\n system: SingleModuleSystem<M>,\n factKeys: string[] | undefined,\n subscribeAll: boolean,\n): { state: ShallowRef<InferFacts<M>>; unsubscribe: (() => void) | null } {\n const state = shallowRef(\n subscribeAll\n ? (system.facts.$store.toObject() as InferFacts<M>)\n : pickFacts(system, factKeys ?? []),\n ) as ShallowRef<InferFacts<M>>;\n\n if (subscribeAll) {\n const unsubscribe = system.facts.$store.subscribeAll(() => {\n state.value = system.facts.$store.toObject() as InferFacts<M>;\n });\n return { state, unsubscribe };\n }\n\n if (factKeys && factKeys.length > 0) {\n const unsubscribe = system.facts.$store.subscribe(factKeys, () => {\n state.value = pickFacts(system, factKeys) as InferFacts<M>;\n });\n return { state, unsubscribe };\n }\n\n return { state, unsubscribe: null };\n}\n\nfunction _subscribeDerived<M extends ModuleSchema>(\n system: SingleModuleSystem<M>,\n derivedKeys: string[] | undefined,\n subscribeAll: boolean,\n): {\n state: ShallowRef<InferDerivations<M>>;\n unsubscribe: (() => void) | null;\n} {\n const allDerivationKeys = subscribeAll\n ? Object.keys(system.derive ?? {})\n : (derivedKeys ?? []);\n const getDerived = (): InferDerivations<M> => {\n const result: Record<string, unknown> = {};\n for (const key of allDerivationKeys) {\n result[key] = system.read(key);\n }\n return result as InferDerivations<M>;\n };\n const state = shallowRef(getDerived()) as ShallowRef<InferDerivations<M>>;\n const unsubscribe =\n allDerivationKeys.length > 0\n ? system.subscribe(allDerivationKeys, () => {\n state.value = getDerived();\n })\n : null;\n\n return { state, unsubscribe };\n}\n\nexport function useDirective<M extends ModuleSchema>(\n moduleDef: ModuleDef<M>,\n config?: UseDirectiveConfig,\n) {\n const { plugins, statusPlugin } = _buildDirectivePlugins(config);\n const system = _createDirectiveSystem(moduleDef, config, plugins);\n\n // SSR guard: initialize facts for SSR rendering, start reconciliation only in the browser\n if (typeof window !== \"undefined\") {\n system.start();\n } else {\n system.initialize();\n }\n\n onScopeDispose(() => {\n // RFC 0009 follow-up (R18 Tier 2-B): use destroyAsync so source\n // unsubscribes actually complete (e.g. Supabase `channel.unsubscribe()`\n // returns a Promise the sync `destroy()` would have dropped on\n // the floor). The framework's onScopeDispose is sync, so we\n // fire-and-forget with a swallow-catch — broker drops finish in\n // the background; any unsubscribe rejection is already routed\n // through the manager's runtime-phase observability sink.\n system.destroyAsync().catch((err: unknown) => {\n if (isDevelopment)\n console.warn(\"[Directive] destroyAsync rejected during unmount:\", err);\n });\n });\n\n const factKeys = config?.facts;\n const derivedKeys = config?.derived;\n const subscribeAll = !factKeys && !derivedKeys;\n\n const { state: factsState, unsubscribe: unsubFacts } = _subscribeFacts(\n system,\n factKeys,\n subscribeAll,\n );\n const { state: derivedState, unsubscribe: unsubDerived } = _subscribeDerived(\n system,\n derivedKeys,\n subscribeAll,\n );\n\n onScopeDispose(() => {\n unsubFacts?.();\n unsubDerived?.();\n });\n\n const events = system.events;\n const dispatch = (event: InferEvents<M>) => system.dispatch(event);\n\n return {\n system,\n facts: factsState as ShallowRef<InferFacts<M>>,\n derived: derivedState as ShallowRef<InferDerivations<M>>,\n events,\n dispatch,\n statusPlugin,\n };\n}\n\n// ============================================================================\n// Typed Hooks Factory\n// ============================================================================\n\nexport function createTypedHooks<M extends ModuleSchema>(): {\n useFact: <K extends keyof InferFacts<M> & string>(\n system: SingleModuleSystem<M>,\n factKey: K,\n ) => Ref<InferFacts<M>[K] | undefined>;\n useDerived: <K extends keyof InferDerivations<M> & string>(\n system: SingleModuleSystem<M>,\n derivationId: K,\n ) => Ref<InferDerivations<M>[K]>;\n useDispatch: (\n system: SingleModuleSystem<M>,\n ) => (event: InferEvents<M>) => void;\n useEvents: (system: SingleModuleSystem<M>) => SingleModuleSystem<M>[\"events\"];\n useWatch: <K extends string>(\n system: SingleModuleSystem<M>,\n key: K,\n callback: (newValue: unknown, previousValue: unknown) => void,\n ) => void;\n} {\n return {\n useFact: <K extends keyof InferFacts<M> & string>(\n system: SingleModuleSystem<M>,\n factKey: K,\n ) =>\n useFact(system as SingleModuleSystem<any>, factKey) as Ref<\n InferFacts<M>[K] | undefined\n >,\n useDerived: <K extends keyof InferDerivations<M> & string>(\n system: SingleModuleSystem<M>,\n derivationId: K,\n ) =>\n useDerived(system as SingleModuleSystem<any>, derivationId) as Ref<\n InferDerivations<M>[K]\n >,\n useDispatch: (system: SingleModuleSystem<M>) => {\n return (event: InferEvents<M>) => {\n system.dispatch(event);\n };\n },\n useEvents: (system: SingleModuleSystem<M>) => useEvents<M>(system),\n useWatch: <K extends string>(\n system: SingleModuleSystem<M>,\n key: K,\n callback: (newValue: unknown, previousValue: unknown) => void,\n ) => useWatch(system as SingleModuleSystem<any>, key, callback),\n };\n}\n\n// ============================================================================\n// useNamespacedSelector — select from a NamespacedSystem\n// ============================================================================\n\n/**\n * Reactive composable to select from a NamespacedSystem.\n * Subscribes to specified keys and returns a Vue ref.\n *\n * @param system - The namespaced system\n * @param keys - Namespaced keys to subscribe to (e.g., [\"auth.token\", \"data.count\"])\n * @param selector - Function that reads from system.facts / system.derive\n *\n * @example\n * ```vue\n * const system = useDirectiveRef({ modules: { auth, data } });\n * const token = useNamespacedSelector(system, [\"auth.token\"], (s) => s.facts.auth.token);\n * ```\n */\nexport function useNamespacedSelector<Modules extends ModulesMap, R>(\n system: NamespacedSystem<Modules>,\n keys: string[],\n selector: (system: NamespacedSystem<Modules>) => R,\n): Ref<R> {\n const value = ref(selector(system)) as Ref<R>;\n const unsubscribe = system.subscribe(keys, () => {\n value.value = selector(system) as R;\n });\n onScopeDispose(unsubscribe);\n\n return value;\n}\n\n// ============================================================================\n// useQuerySystem — Stable query system with lifecycle management\n// ============================================================================\n\nlet _createQuerySystem: ((config: Record<string, unknown>) => any) | null =\n null;\n\nfunction getCreateQuerySystem() {\n if (!_createQuerySystem) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require(\"@directive-run/query\");\n _createQuerySystem = mod.createQuerySystem;\n } catch {\n throw new Error(\n \"[Directive] @directive-run/query is not installed. \" +\n \"Install it with: pnpm add @directive-run/query\",\n );\n }\n }\n\n return _createQuerySystem!;\n}\n\n/**\n * Vue composable to create and manage a query system with proper lifecycle.\n *\n * Accepts a config object or a factory function that creates the system.\n * Handles cleanup on scope disposal.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useQuerySystem, useDerived } from \"@directive-run/vue\";\n *\n * const app = useQuerySystem({\n * facts: { userId: \"\" },\n * queries: { user: { key: ..., fetcher: ... } },\n * });\n *\n * const user = useDerived(app, \"user\");\n * </script>\n * ```\n */\nexport function useQuerySystem<\n T extends {\n start: () => void;\n destroy: () => void;\n isRunning?: boolean;\n [key: string]: any;\n },\n>(config: Record<string, unknown>): T {\n const createQuerySystem = getCreateQuerySystem();\n const system = createQuerySystem(config) as T;\n\n // Start if not already running\n if (typeof window !== \"undefined\" && !system.isRunning) {\n system.start();\n }\n\n onScopeDispose(() => {\n // RFC 0009 follow-up (R18 Tier 2-B): use destroyAsync so source\n // unsubscribes actually complete (e.g. Supabase `channel.unsubscribe()`\n // returns a Promise the sync `destroy()` would have dropped on\n // the floor). The framework's onScopeDispose is sync, so we\n // fire-and-forget with a swallow-catch — broker drops finish in\n // the background; any unsubscribe rejection is already routed\n // through the manager's runtime-phase observability sink.\n system.destroyAsync().catch((err: unknown) => {\n if (isDevelopment)\n console.warn(\"[Directive] destroyAsync rejected during unmount:\", err);\n });\n });\n\n return system;\n}\n\n// ============================================================================\n// SSR Hydration\n// ============================================================================\n\n/** @internal Injection key for SSR hydration snapshot */\nconst HYDRATION_KEY: InjectionKey<Record<string, unknown>> = Symbol(\n \"directive-hydration\",\n);\n\n/**\n * Vue component that provides a DistributableSnapshot to child components.\n * Use with `useHydratedSystem` for SSR hydration in Nuxt or Vue SSR apps.\n *\n * @example\n * ```vue\n * <template>\n * <DirectiveHydrator :snapshot=\"snapshot\">\n * <App />\n * </DirectiveHydrator>\n * </template>\n * ```\n */\nexport const DirectiveHydrator = defineComponent({\n name: \"DirectiveHydrator\",\n props: {\n snapshot: { type: Object, required: true },\n },\n setup(props, { slots }) {\n provide(HYDRATION_KEY, props.snapshot as Record<string, unknown>);\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Vue composable that creates a system hydrated from a server snapshot.\n * Must be used inside a `<DirectiveHydrator>` ancestor.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useHydratedSystem, useDerived } from \"@directive-run/vue\";\n * const system = useHydratedSystem(myModule);\n * const count = useDerived(system, \"count\");\n * </script>\n * ```\n */\nexport function useHydratedSystem<S extends ModuleSchema>(\n moduleDef: ModuleDef<S>,\n config?: UseDirectiveConfig,\n): SingleModuleSystem<S> {\n const snapshot = inject(HYDRATION_KEY, undefined);\n const mergedFacts = mergeHydrationFacts(\n snapshot,\n config?.initialFacts as Record<string, unknown>,\n );\n const { system } = useDirective(moduleDef, {\n ...config,\n initialFacts: mergedFacts,\n });\n\n return system;\n}\n\n// ============================================================================\n// useAuditLedger — live ledger entries with filter (R4.I parity)\n// ============================================================================\n\nimport type { AuditEntry, AuditLedger, QueryFilter } from \"@directive-run/core\";\n\n/**\n * Subscribe to an audit ledger and return the latest entries matching\n * `filter` as a reactive `Ref`. Re-evaluates on each poll tick (default\n * 250 ms — override with `pollMs`).\n *\n * **Polling floor:** `pollMs` is clamped to a minimum of 50 ms to prevent\n * accidental DoS from typos like `pollMs: 5`. Values below the floor are\n * silently clamped in production; dev mode logs a warning.\n *\n * **First-paint freshness:** the interval starts immediately at setup\n * time (not gated on `onMounted`), so the first ledger query lands\n * before the component paints. Cleanup uses `onScopeDispose`, which\n * is correct for both component scopes and ad-hoc effect scopes.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useAuditLedger } from \"@directive-run/vue\";\n * const entries = useAuditLedger(ledger, { kind: \"constraint.evaluate\", limit: 20 });\n * </script>\n * <template>\n * <ul>\n * <li v-for=\"e in entries\" :key=\"e.seq\">{{ e.kind }} @ {{ e.ts }}</li>\n * </ul>\n * </template>\n * ```\n */\nexport function useAuditLedger(\n ledger: AuditLedger,\n filter: QueryFilter = {},\n opts: { pollMs?: number } = {},\n): ShallowRef<readonly AuditEntry[]> {\n const requestedPollMs = opts.pollMs ?? 250;\n const pollMs = Math.max(50, requestedPollMs);\n\n if (isDevelopment) {\n if (opts.pollMs !== undefined && opts.pollMs < 50) {\n console.warn(\n `[Directive] useAuditLedger() pollMs=${opts.pollMs} is below the 50 ms floor; clamped to 50 ms.`,\n );\n }\n if (pollMs < 100) {\n const entryCount = ledger.toJSON().entries.length;\n if (entryCount > 1000) {\n console.warn(\n `[Directive] useAuditLedger() polling every ${pollMs} ms against a ${entryCount}-entry ledger — that's a lot of CPU per tick. Consider raising pollMs or tightening the filter.`,\n );\n }\n }\n }\n\n const entries = shallowRef<readonly AuditEntry[]>(ledger.query(filter));\n const intervalId = setInterval(() => {\n entries.value = ledger.query(filter);\n }, pollMs);\n\n onScopeDispose(() => {\n clearInterval(intervalId);\n });\n\n return entries;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dev-true.ts","../src/index.ts"],"names":["dev_true_default","useFact","system","keyOrKeys","assertSystem","_useFactMulti","_useFactSingle","factKey","value","ref","unsubscribe","onScopeDispose","factKeys","getValues","result","key","state","shallowRef","useDerived","idOrIds","_useDerivedMulti","_useDerivedSingle","derivationId","derivationIds","id","useSelector","selector","equalityFn","defaultEquality","deriveKeySet","runWithTracking","runTrackedSelector","initial","trackedFactKeys","trackedDeriveKeys","selected","unsubs","resubscribe","unsub","onUpdate","depsChanged","useDispatch","event","useEvents","useWatch","callback","useInspect","options","computeInspectState","update","throttled","cleanup","createThrottle","unsubFacts","unsubSettled","useRequirementStatus","statusPlugin","typeOrTypes","type","status","useSuspenseRequirement","_useSuspenseRequirementMulti","_useSuspenseRequirementSingle","initialStatus","resolve","reject","current","_findFirstStatusError","types","_waitForAllSettled","onTick","t","err","initialError","useExplain","requirementId","explanation","useConstraintStatus","constraintId","inspectState","computed","fullInspection","c","useOptimisticUpdate","requirementType","isPending","error","snapshot","rollback","mutate","updateFn","useHistory","buildHistoryState","_buildDirectivePlugins","config","plugins","sp","createRequirementStatusPlugin","_createDirectiveSystem","moduleDef","systemConfig","createSystem","_subscribeFacts","subscribeAll","pickFacts","_subscribeDerived","derivedKeys","allDerivationKeys","getDerived","useDirective","factsState","derivedState","unsubDerived","events","createTypedHooks","useNamespacedSelector","keys","_createQuerySystem","getCreateQuerySystem","useQuerySystem","HYDRATION_KEY","DirectiveHydrator","defineComponent","props","slots","provide","useHydratedSystem","inject","mergedFacts","mergeHydrationFacts","useAuditLedger","ledger","filter","opts","requestedPollMs","pollMs","entryCount","entries","intervalId"],"mappings":"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","file":"index.cjs","sourcesContent":["export default typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\";\n","/**\n * Vue Adapter - Vue 3 composables for Directive\n *\n * Exports: useFact, useDerived, useDispatch, useSelector,\n * useWatch, useInspect, useRequirementStatus, useSuspenseRequirement,\n * useEvents, useExplain, useConstraintStatus, useOptimisticUpdate,\n * useDirective, useHistory, createTypedHooks, shallowEqual\n */\n\nimport type {\n ErrorBoundaryConfig,\n InferDerivations,\n InferEvents,\n InferFacts,\n InferSelectorState,\n ModuleDef,\n ModuleSchema,\n ModulesMap,\n NamespacedSystem,\n Plugin,\n SingleModuleSystem,\n SystemSnapshot,\n TraceOption,\n} from \"@directive-run/core\";\nimport {\n createRequirementStatusPlugin,\n createSystem,\n} from \"@directive-run/core\";\nimport type { RequirementTypeStatus } from \"@directive-run/core\";\nimport {\n type ConstraintInfo,\n type InspectState,\n assertSystem,\n buildHistoryState,\n computeInspectState,\n createThrottle,\n defaultEquality,\n depsChanged,\n mergeHydrationFacts,\n pickFacts,\n runTrackedSelector,\n shallowEqual,\n} from \"@directive-run/core/adapter-utils\";\nimport {\n type ComputedRef,\n type InjectionKey,\n type Ref,\n type ShallowRef,\n computed,\n defineComponent,\n inject,\n onScopeDispose,\n provide,\n ref,\n shallowRef,\n} from \"vue\";\nimport isDevelopment from \"#is-development\";\n\n// Re-export for convenience\nexport type { RequirementTypeStatus, InspectState, ConstraintInfo };\nexport { shallowEqual };\n\n/** Type for the requirement status plugin return value */\nexport type StatusPlugin = ReturnType<typeof createRequirementStatusPlugin>;\n\n// ============================================================================\n// useFact — single key or multi key\n// ============================================================================\n\n/** Single key overload */\nexport function useFact<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(system: SingleModuleSystem<S>, factKey: K): Ref<InferFacts<S>[K] | undefined>;\n/** Multi-key overload */\nexport function useFact<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(\n system: SingleModuleSystem<S>,\n factKeys: K[],\n): ShallowRef<Pick<InferFacts<S>, K>>;\n/** Implementation */\nexport function useFact(\n system: SingleModuleSystem<any>,\n keyOrKeys: string | string[],\n): Ref<unknown> | ShallowRef<unknown> {\n assertSystem(\"useFact\", system);\n if (isDevelopment && typeof keyOrKeys === \"function\") {\n console.error(\n \"[Directive] useFact() received a function. Did you mean useSelector()? \" +\n \"useFact() takes a string key or array of keys, not a selector function.\",\n );\n }\n\n // Multi-key path: useFact(system, [keys])\n if (Array.isArray(keyOrKeys)) {\n return _useFactMulti(system, keyOrKeys);\n }\n\n // Single key path: useFact(system, key)\n return _useFactSingle(system, keyOrKeys);\n}\n\nfunction _useFactSingle(\n system: SingleModuleSystem<any>,\n factKey: string,\n): Ref<unknown> {\n if (isDevelopment) {\n if (!system.facts.$store.has(factKey)) {\n console.warn(\n `[Directive] useFact(\"${factKey}\") — fact not found in store. ` +\n `Check that \"${factKey}\" is defined in your module's schema.`,\n );\n }\n }\n\n const value = ref(system.facts.$store.get(factKey));\n const unsubscribe = system.facts.$store.subscribe([factKey], () => {\n value.value = system.facts.$store.get(factKey);\n });\n onScopeDispose(unsubscribe);\n return value;\n}\n\nfunction _useFactMulti(\n system: SingleModuleSystem<any>,\n factKeys: string[],\n): ShallowRef<Record<string, unknown>> {\n const getValues = (): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const key of factKeys) {\n result[key] = system.facts.$store.get(key);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = system.facts.$store.subscribe(factKeys, () => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n}\n\n// ============================================================================\n// useDerived — single key or multi key\n// ============================================================================\n\n/** Single key overload */\nexport function useDerived<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(system: SingleModuleSystem<S>, derivationId: K): Ref<InferDerivations<S>[K]>;\n/** Multi-key overload */\nexport function useDerived<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(\n system: SingleModuleSystem<S>,\n derivationIds: K[],\n): ShallowRef<Pick<InferDerivations<S>, K>>;\n/** Implementation */\nexport function useDerived(\n system: SingleModuleSystem<any>,\n idOrIds: string | string[],\n): Ref<unknown> | ShallowRef<unknown> {\n assertSystem(\"useDerived\", system);\n if (isDevelopment && typeof idOrIds === \"function\") {\n console.error(\n \"[Directive] useDerived() received a function. Did you mean useSelector()? \" +\n \"useDerived() takes a string key or array of keys, not a selector function.\",\n );\n }\n\n // Multi-key path\n if (Array.isArray(idOrIds)) {\n return _useDerivedMulti(system, idOrIds);\n }\n\n // Single key path\n return _useDerivedSingle(system, idOrIds);\n}\n\nfunction _useDerivedSingle(\n system: SingleModuleSystem<any>,\n derivationId: string,\n): Ref<unknown> {\n if (isDevelopment) {\n const initialValue = system.read(derivationId);\n if (initialValue === undefined) {\n console.warn(\n `[Directive] useDerived(\"${derivationId}\") returned undefined. ` +\n `Check that \"${derivationId}\" is defined in your module's derive property.`,\n );\n }\n }\n const value = ref(system.read(derivationId));\n const unsubscribe = system.subscribe([derivationId], () => {\n value.value = system.read(derivationId);\n });\n onScopeDispose(unsubscribe);\n return value;\n}\n\nfunction _useDerivedMulti(\n system: SingleModuleSystem<any>,\n derivationIds: string[],\n): ShallowRef<Record<string, unknown>> {\n const getValues = (): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const id of derivationIds) {\n result[id] = system.read(id);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = system.subscribe(derivationIds, () => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n}\n\n// ============================================================================\n// useSelector — auto-tracking selector over facts and derivations\n// ============================================================================\n\n/**\n * Auto-tracking selector over facts and derivations.\n * Uses `withTracking()` to detect which facts the selector accesses,\n * then subscribes only to those keys.\n */\nexport function useSelector<S extends ModuleSchema, R>(\n system: SingleModuleSystem<S>,\n selector: (state: InferSelectorState<S>) => R,\n equalityFn?: (a: R, b: R) => boolean,\n): Ref<R>;\nexport function useSelector(\n system: SingleModuleSystem<any>,\n selector: (state: Record<string, unknown>) => unknown,\n equalityFn: (a: unknown, b: unknown) => boolean = defaultEquality,\n): Ref<unknown> {\n assertSystem(\"useSelector\", system);\n const deriveKeySet = new Set(Object.keys(system.derive ?? {}));\n\n const runWithTracking = () =>\n runTrackedSelector(system, deriveKeySet, selector);\n\n const initial = runWithTracking();\n let trackedFactKeys = initial.factKeys;\n let trackedDeriveKeys = initial.deriveKeys;\n const selected = ref(initial.value);\n\n const unsubs: Array<() => void> = [];\n\n const resubscribe = () => {\n for (const unsub of unsubs) unsub();\n unsubs.length = 0;\n\n const onUpdate = () => {\n const result = runWithTracking();\n if (!equalityFn(selected.value, result.value)) {\n selected.value = result.value;\n }\n // Re-track: check if deps changed\n if (\n depsChanged(\n trackedFactKeys,\n result.factKeys,\n trackedDeriveKeys,\n result.deriveKeys,\n )\n ) {\n trackedFactKeys = result.factKeys;\n trackedDeriveKeys = result.deriveKeys;\n resubscribe();\n }\n };\n\n if (trackedFactKeys.length > 0) {\n unsubs.push(system.facts.$store.subscribe(trackedFactKeys, onUpdate));\n } else if (trackedDeriveKeys.length === 0) {\n unsubs.push(system.facts.$store.subscribeAll(onUpdate));\n }\n if (trackedDeriveKeys.length > 0) {\n unsubs.push(system.subscribe(trackedDeriveKeys, onUpdate));\n }\n };\n\n resubscribe();\n\n onScopeDispose(() => {\n for (const unsub of unsubs) unsub();\n });\n\n return selected;\n}\n\n// ============================================================================\n// useDispatch\n// ============================================================================\n\nexport function useDispatch<S extends ModuleSchema>(\n system: SingleModuleSystem<S>,\n): (event: InferEvents<S>) => void {\n assertSystem(\"useDispatch\", system);\n return (event: InferEvents<S>) => {\n system.dispatch(event);\n };\n}\n\n// ============================================================================\n// useEvents — memoized events reference\n// ============================================================================\n\n/**\n * Returns the system's events dispatcher.\n */\nexport function useEvents<S extends ModuleSchema>(\n system: SingleModuleSystem<S>,\n): SingleModuleSystem<S>[\"events\"] {\n assertSystem(\"useEvents\", system);\n return system.events;\n}\n\n// ============================================================================\n// useWatch — derivation or fact side-effect\n// ============================================================================\n\n/** Watch a derivation or fact by key (auto-detected). When a key exists in both facts and derivations, the derivation overload takes priority. */\nexport function useWatch<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(\n system: SingleModuleSystem<S>,\n key: K,\n callback: (\n newValue: InferDerivations<S>[K],\n previousValue: InferDerivations<S>[K] | undefined,\n ) => void,\n): void;\n/** Watch a fact key with auto-detection. */\nexport function useWatch<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(\n system: SingleModuleSystem<S>,\n key: K,\n callback: (\n newValue: InferFacts<S>[K] | undefined,\n previousValue: InferFacts<S>[K] | undefined,\n ) => void,\n): void;\n/** Implementation */\nexport function useWatch(\n system: SingleModuleSystem<any>,\n key: string,\n callback: (newValue: unknown, prevValue: unknown) => void,\n): void {\n assertSystem(\"useWatch\", system);\n\n const unsubscribe = system.watch(key, callback);\n onScopeDispose(unsubscribe);\n}\n\n// ============================================================================\n// useInspect — consolidated inspection hook\n// ============================================================================\n\n/** Options for useInspect */\nexport interface UseInspectOptions {\n throttleMs?: number;\n}\n\n/**\n * Consolidated system inspection hook.\n * Returns InspectState with optional throttling.\n */\nexport function useInspect(\n system: SingleModuleSystem<any>,\n options?: UseInspectOptions,\n): ShallowRef<InspectState> {\n assertSystem(\"useInspect\", system);\n const state = shallowRef<InspectState>(computeInspectState(system));\n\n const update = () => {\n state.value = computeInspectState(system);\n };\n\n if (options?.throttleMs && options.throttleMs > 0) {\n const { throttled, cleanup } = createThrottle(update, options.throttleMs);\n const unsubFacts = system.facts.$store.subscribeAll(throttled);\n const unsubSettled = system.onSettledChange(throttled);\n onScopeDispose(() => {\n cleanup();\n unsubFacts();\n unsubSettled();\n });\n } else {\n const unsubFacts = system.facts.$store.subscribeAll(update);\n const unsubSettled = system.onSettledChange(update);\n onScopeDispose(() => {\n unsubFacts();\n unsubSettled();\n });\n }\n\n return state;\n}\n\n// ============================================================================\n// useRequirementStatus — single or multi\n// ============================================================================\n\n/** Single type overload */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n type: string,\n): ShallowRef<RequirementTypeStatus>;\n/** Multi-type overload */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n types: string[],\n): ShallowRef<Record<string, RequirementTypeStatus>>;\n/** Implementation */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n typeOrTypes: string | string[],\n):\n | ShallowRef<RequirementTypeStatus>\n | ShallowRef<Record<string, RequirementTypeStatus>> {\n if (Array.isArray(typeOrTypes)) {\n const getValues = (): Record<string, RequirementTypeStatus> => {\n const result: Record<string, RequirementTypeStatus> = {};\n for (const type of typeOrTypes) {\n result[type] = statusPlugin.getStatus(type);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = statusPlugin.subscribe(() => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n }\n\n const status = shallowRef<RequirementTypeStatus>(\n statusPlugin.getStatus(typeOrTypes),\n );\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = statusPlugin.getStatus(typeOrTypes);\n });\n onScopeDispose(unsubscribe);\n return status;\n}\n\n// ============================================================================\n// useSuspenseRequirement — async setup() Suspense integration\n// ============================================================================\n\n/**\n * Returns a promise that resolves when a requirement type settles.\n * Designed for Vue's async `setup()` with `<Suspense>`.\n *\n * - If the requirement is loading, the returned promise suspends the component.\n * - If the requirement has an error, the promise rejects with that error.\n * - If the requirement is already settled, resolves immediately.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useSuspenseRequirement } from '@directive-run/vue';\n *\n * // In async setup(), this suspends until FETCH_USER settles\n * const status = await useSuspenseRequirement(statusPlugin, \"FETCH_USER\");\n * </script>\n *\n * <template>\n * <div>Resolved: {{ status.resolvedCount }}</div>\n * </template>\n * ```\n */\n\n/** Single type overload */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n type: string,\n): Promise<ShallowRef<RequirementTypeStatus>>;\n\n/** Multi-type overload */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<ShallowRef<Record<string, RequirementTypeStatus>>>;\n\n/** Implementation */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n typeOrTypes: string | string[],\n): Promise<\n | ShallowRef<RequirementTypeStatus>\n | ShallowRef<Record<string, RequirementTypeStatus>>\n> {\n if (Array.isArray(typeOrTypes)) {\n return _useSuspenseRequirementMulti(statusPlugin, typeOrTypes);\n }\n\n return _useSuspenseRequirementSingle(statusPlugin, typeOrTypes);\n}\n\nasync function _useSuspenseRequirementSingle(\n statusPlugin: StatusPlugin,\n type: string,\n): Promise<ShallowRef<RequirementTypeStatus>> {\n const initialStatus = statusPlugin.getStatus(type);\n\n if (initialStatus.hasError && initialStatus.lastError) {\n throw initialStatus.lastError;\n }\n\n // If loading, wait for it to settle\n if (initialStatus.isLoading) {\n await new Promise<void>((resolve, reject) => {\n const unsubscribe = statusPlugin.subscribe(() => {\n const current = statusPlugin.getStatus(type);\n if (!current.isLoading) {\n unsubscribe();\n if (current.hasError && current.lastError) {\n reject(current.lastError);\n } else {\n resolve();\n }\n }\n });\n onScopeDispose(unsubscribe);\n });\n }\n\n // Now settled — return a reactive ref that continues tracking\n const status = shallowRef<RequirementTypeStatus>(\n statusPlugin.getStatus(type),\n );\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = statusPlugin.getStatus(type);\n });\n onScopeDispose(unsubscribe);\n\n return status;\n}\n\nfunction _findFirstStatusError(\n statusPlugin: StatusPlugin,\n types: string[],\n): Error | null {\n for (const type of types) {\n const s = statusPlugin.getStatus(type);\n if (s.hasError && s.lastError) {\n return s.lastError;\n }\n }\n\n return null;\n}\n\nfunction _waitForAllSettled(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const onTick = () => {\n const allDone = types.every((t) => !statusPlugin.getStatus(t).isLoading);\n if (!allDone) return;\n unsubscribe();\n const err = _findFirstStatusError(statusPlugin, types);\n if (err) {\n reject(err);\n return;\n }\n resolve();\n };\n const unsubscribe = statusPlugin.subscribe(onTick);\n onScopeDispose(unsubscribe);\n });\n}\n\nasync function _useSuspenseRequirementMulti(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<ShallowRef<Record<string, RequirementTypeStatus>>> {\n // Check for immediate errors\n const initialError = _findFirstStatusError(statusPlugin, types);\n if (initialError) {\n throw initialError;\n }\n\n // If any are loading, wait for all to settle\n const anyLoading = types.some((t) => statusPlugin.getStatus(t).isLoading);\n if (anyLoading) {\n await _waitForAllSettled(statusPlugin, types);\n }\n\n // Now settled — return a reactive ref that continues tracking\n const getValues = (): Record<string, RequirementTypeStatus> => {\n const result: Record<string, RequirementTypeStatus> = {};\n for (const type of types) {\n result[type] = statusPlugin.getStatus(type);\n }\n\n return result;\n };\n const status = shallowRef(getValues());\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = getValues();\n });\n onScopeDispose(unsubscribe);\n\n return status;\n}\n\n// ============================================================================\n// useExplain — reactive requirement explanation\n// ============================================================================\n\n/**\n * Reactively returns the explanation string for a requirement.\n */\nexport function useExplain(\n system: SingleModuleSystem<any>,\n requirementId: string,\n): Ref<string | null> {\n assertSystem(\"useExplain\", system);\n const explanation = ref<string | null>(system.explain(requirementId)) as Ref<\n string | null\n >;\n\n const update = () => {\n explanation.value = system.explain(requirementId);\n };\n\n const unsubFacts = system.facts.$store.subscribeAll(update);\n const unsubSettled = system.onSettledChange(update);\n onScopeDispose(() => {\n unsubFacts();\n unsubSettled();\n });\n\n return explanation;\n}\n\n// ============================================================================\n// useConstraintStatus — reactive constraint inspection\n// ============================================================================\n\n/** Get all constraints */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n): ComputedRef<ConstraintInfo[]>;\n/** Get a single constraint by ID */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n constraintId: string,\n): ComputedRef<ConstraintInfo | null>;\n/** Implementation */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n constraintId?: string,\n): ComputedRef<ConstraintInfo[] | ConstraintInfo | null> {\n assertSystem(\"useConstraintStatus\", system);\n const inspectState = useInspect(system);\n\n return computed(() => {\n // Track reactivity via inspectState, but use full inspect() for constraint list\n void inspectState.value;\n const fullInspection = system.inspect();\n if (!constraintId) return fullInspection.constraints;\n return (\n fullInspection.constraints.find((c) => c.id === constraintId) ?? null\n );\n });\n}\n\n// ============================================================================\n// useOptimisticUpdate — batch with rollback on failure\n// ============================================================================\n\nexport interface OptimisticUpdateResult {\n mutate: (updateFn: () => void) => void;\n isPending: Ref<boolean>;\n error: Ref<Error | null>;\n rollback: () => void;\n}\n\n/**\n * Optimistic update hook. Saves a snapshot before mutating, monitors\n * a requirement type via statusPlugin, and rolls back on failure.\n */\nexport function useOptimisticUpdate(\n system: SingleModuleSystem<any>,\n statusPlugin?: StatusPlugin,\n requirementType?: string,\n): OptimisticUpdateResult {\n assertSystem(\"useOptimisticUpdate\", system);\n const isPending = ref(false);\n const error = ref<Error | null>(null) as Ref<Error | null>;\n let snapshot: SystemSnapshot | null = null;\n let unsubscribe: (() => void) | null = null;\n\n const rollback = () => {\n if (snapshot) {\n system.restore(snapshot);\n snapshot = null;\n }\n isPending.value = false;\n error.value = null;\n unsubscribe?.();\n unsubscribe = null;\n };\n\n const mutate = (updateFn: () => void) => {\n snapshot = system.getSnapshot();\n isPending.value = true;\n error.value = null;\n system.batch(updateFn);\n\n // Watch for resolver completion/failure\n if (statusPlugin && requirementType) {\n unsubscribe?.();\n unsubscribe = statusPlugin.subscribe(() => {\n const status = statusPlugin.getStatus(requirementType);\n if (!status.isLoading && !status.hasError) {\n snapshot = null;\n isPending.value = false;\n unsubscribe?.();\n unsubscribe = null;\n } else if (status.hasError) {\n error.value = status.lastError;\n rollback();\n }\n });\n }\n };\n\n onScopeDispose(() => {\n unsubscribe?.();\n });\n\n return { mutate, isPending, error, rollback };\n}\n\n// ============================================================================\n// useHistory — reactive history state\n// ============================================================================\n\n/**\n * Reactive history composable. Returns a ShallowRef that updates\n * when snapshots are taken or navigation occurs.\n *\n * @example\n * ```vue\n * const history = useHistory(system);\n * <button :disabled=\"!history.value?.canGoBack\" @click=\"history.value?.goBack()\">Undo</button>\n * ```\n */\nexport function useHistory(\n system: SingleModuleSystem<any>,\n): ShallowRef<ReturnType<typeof buildHistoryState>> {\n assertSystem(\"useHistory\", system);\n const state = shallowRef<ReturnType<typeof buildHistoryState>>(\n buildHistoryState(system),\n );\n const unsub = system.onHistoryChange(() => {\n state.value = buildHistoryState(system);\n });\n onScopeDispose(unsub);\n return state;\n}\n\n// ============================================================================\n// Scoped System Composable\n// ============================================================================\n\n/** Configuration for useDirective */\ninterface UseDirectiveConfig {\n plugins?: Plugin<any>[];\n trace?: TraceOption;\n errorBoundary?: ErrorBoundaryConfig;\n tickMs?: number;\n zeroConfig?: boolean;\n initialFacts?: Record<string, any>;\n status?: boolean;\n /** Fact keys to subscribe to (omit for all) */\n facts?: string[];\n /** Derivation keys to subscribe to (omit for all) */\n derived?: string[];\n}\n\n/**\n * Create a scoped Directive system with automatic lifecycle management.\n * When no `facts` or `derived` keys are specified, subscribes to ALL\n * facts and derivations and returns reactive state.\n *\n * @example\n * ```vue\n * // Subscribe to everything\n * const { facts, derived, events, dispatch } = useDirective(counterModule);\n *\n * // Selective keys\n * const { facts, derived } = useDirective(counterModule, { facts: [\"count\"], derived: [\"doubled\"] });\n * ```\n */\nfunction _buildDirectivePlugins(config: UseDirectiveConfig | undefined): {\n plugins: Plugin<ModuleSchema>[];\n statusPlugin: StatusPlugin | undefined;\n} {\n const plugins = [...(config?.plugins ?? [])] as Plugin<ModuleSchema>[];\n let statusPlugin: StatusPlugin | undefined;\n\n if (config?.status) {\n const sp = createRequirementStatusPlugin();\n statusPlugin = sp;\n plugins.push(sp.plugin as Plugin<any>);\n }\n\n return { plugins, statusPlugin };\n}\n\nfunction _createDirectiveSystem<M extends ModuleSchema>(\n moduleDef: ModuleDef<M>,\n config: UseDirectiveConfig | undefined,\n plugins: Plugin<ModuleSchema>[],\n): SingleModuleSystem<M> {\n const systemConfig = {\n module: moduleDef,\n plugins: plugins.length > 0 ? plugins : undefined,\n trace: config?.trace,\n errorBoundary: config?.errorBoundary,\n tickMs: config?.tickMs,\n zeroConfig: config?.zeroConfig,\n initialFacts: config?.initialFacts,\n } as any;\n\n return createSystem(systemConfig) as unknown as SingleModuleSystem<M>;\n}\n\nfunction _subscribeFacts<M extends ModuleSchema>(\n system: SingleModuleSystem<M>,\n factKeys: string[] | undefined,\n subscribeAll: boolean,\n): { state: ShallowRef<InferFacts<M>>; unsubscribe: (() => void) | null } {\n const state = shallowRef(\n subscribeAll\n ? (system.facts.$store.toObject() as InferFacts<M>)\n : pickFacts(system, factKeys ?? []),\n ) as ShallowRef<InferFacts<M>>;\n\n if (subscribeAll) {\n const unsubscribe = system.facts.$store.subscribeAll(() => {\n state.value = system.facts.$store.toObject() as InferFacts<M>;\n });\n return { state, unsubscribe };\n }\n\n if (factKeys && factKeys.length > 0) {\n const unsubscribe = system.facts.$store.subscribe(factKeys, () => {\n state.value = pickFacts(system, factKeys) as InferFacts<M>;\n });\n return { state, unsubscribe };\n }\n\n return { state, unsubscribe: null };\n}\n\nfunction _subscribeDerived<M extends ModuleSchema>(\n system: SingleModuleSystem<M>,\n derivedKeys: string[] | undefined,\n subscribeAll: boolean,\n): {\n state: ShallowRef<InferDerivations<M>>;\n unsubscribe: (() => void) | null;\n} {\n const allDerivationKeys = subscribeAll\n ? Object.keys(system.derive ?? {})\n : (derivedKeys ?? []);\n const getDerived = (): InferDerivations<M> => {\n const result: Record<string, unknown> = {};\n for (const key of allDerivationKeys) {\n result[key] = system.read(key);\n }\n return result as InferDerivations<M>;\n };\n const state = shallowRef(getDerived()) as ShallowRef<InferDerivations<M>>;\n const unsubscribe =\n allDerivationKeys.length > 0\n ? system.subscribe(allDerivationKeys, () => {\n state.value = getDerived();\n })\n : null;\n\n return { state, unsubscribe };\n}\n\nexport function useDirective<M extends ModuleSchema>(\n moduleDef: ModuleDef<M>,\n config?: UseDirectiveConfig,\n) {\n const { plugins, statusPlugin } = _buildDirectivePlugins(config);\n const system = _createDirectiveSystem(moduleDef, config, plugins);\n\n // SSR guard: initialize facts for SSR rendering, start reconciliation only in the browser\n if (typeof window !== \"undefined\") {\n system.start();\n } else {\n system.initialize();\n }\n\n onScopeDispose(() => {\n // RFC 0009 follow-up: use destroyAsync so source\n // unsubscribes actually complete (e.g. Supabase `channel.unsubscribe()`\n // returns a Promise the sync `destroy()` would have dropped on\n // the floor). The framework's onScopeDispose is sync, so we\n // fire-and-forget with a swallow-catch — broker drops finish in\n // the background; any unsubscribe rejection is already routed\n // through the manager's runtime-phase observability sink.\n system.destroyAsync().catch((err: unknown) => {\n if (isDevelopment)\n console.warn(\"[Directive] destroyAsync rejected during unmount:\", err);\n });\n });\n\n const factKeys = config?.facts;\n const derivedKeys = config?.derived;\n const subscribeAll = !factKeys && !derivedKeys;\n\n const { state: factsState, unsubscribe: unsubFacts } = _subscribeFacts(\n system,\n factKeys,\n subscribeAll,\n );\n const { state: derivedState, unsubscribe: unsubDerived } = _subscribeDerived(\n system,\n derivedKeys,\n subscribeAll,\n );\n\n onScopeDispose(() => {\n unsubFacts?.();\n unsubDerived?.();\n });\n\n const events = system.events;\n const dispatch = (event: InferEvents<M>) => system.dispatch(event);\n\n return {\n system,\n facts: factsState as ShallowRef<InferFacts<M>>,\n derived: derivedState as ShallowRef<InferDerivations<M>>,\n events,\n dispatch,\n statusPlugin,\n };\n}\n\n// ============================================================================\n// Typed Hooks Factory\n// ============================================================================\n\nexport function createTypedHooks<M extends ModuleSchema>(): {\n useFact: <K extends keyof InferFacts<M> & string>(\n system: SingleModuleSystem<M>,\n factKey: K,\n ) => Ref<InferFacts<M>[K] | undefined>;\n useDerived: <K extends keyof InferDerivations<M> & string>(\n system: SingleModuleSystem<M>,\n derivationId: K,\n ) => Ref<InferDerivations<M>[K]>;\n useDispatch: (\n system: SingleModuleSystem<M>,\n ) => (event: InferEvents<M>) => void;\n useEvents: (system: SingleModuleSystem<M>) => SingleModuleSystem<M>[\"events\"];\n useWatch: <K extends string>(\n system: SingleModuleSystem<M>,\n key: K,\n callback: (newValue: unknown, previousValue: unknown) => void,\n ) => void;\n} {\n return {\n useFact: <K extends keyof InferFacts<M> & string>(\n system: SingleModuleSystem<M>,\n factKey: K,\n ) =>\n useFact(system as SingleModuleSystem<any>, factKey) as Ref<\n InferFacts<M>[K] | undefined\n >,\n useDerived: <K extends keyof InferDerivations<M> & string>(\n system: SingleModuleSystem<M>,\n derivationId: K,\n ) =>\n useDerived(system as SingleModuleSystem<any>, derivationId) as Ref<\n InferDerivations<M>[K]\n >,\n useDispatch: (system: SingleModuleSystem<M>) => {\n return (event: InferEvents<M>) => {\n system.dispatch(event);\n };\n },\n useEvents: (system: SingleModuleSystem<M>) => useEvents<M>(system),\n useWatch: <K extends string>(\n system: SingleModuleSystem<M>,\n key: K,\n callback: (newValue: unknown, previousValue: unknown) => void,\n ) => useWatch(system as SingleModuleSystem<any>, key, callback),\n };\n}\n\n// ============================================================================\n// useNamespacedSelector — select from a NamespacedSystem\n// ============================================================================\n\n/**\n * Reactive composable to select from a NamespacedSystem.\n * Subscribes to specified keys and returns a Vue ref.\n *\n * @param system - The namespaced system\n * @param keys - Namespaced keys to subscribe to (e.g., [\"auth.token\", \"data.count\"])\n * @param selector - Function that reads from system.facts / system.derive\n *\n * @example\n * ```vue\n * const system = useDirectiveRef({ modules: { auth, data } });\n * const token = useNamespacedSelector(system, [\"auth.token\"], (s) => s.facts.auth.token);\n * ```\n */\nexport function useNamespacedSelector<Modules extends ModulesMap, R>(\n system: NamespacedSystem<Modules>,\n keys: string[],\n selector: (system: NamespacedSystem<Modules>) => R,\n): Ref<R> {\n const value = ref(selector(system)) as Ref<R>;\n const unsubscribe = system.subscribe(keys, () => {\n value.value = selector(system) as R;\n });\n onScopeDispose(unsubscribe);\n\n return value;\n}\n\n// ============================================================================\n// useQuerySystem — Stable query system with lifecycle management\n// ============================================================================\n\nlet _createQuerySystem: ((config: Record<string, unknown>) => any) | null =\n null;\n\nfunction getCreateQuerySystem() {\n if (!_createQuerySystem) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require(\"@directive-run/query\");\n _createQuerySystem = mod.createQuerySystem;\n } catch {\n throw new Error(\n \"[Directive] @directive-run/query is not installed. \" +\n \"Install it with: pnpm add @directive-run/query\",\n );\n }\n }\n\n return _createQuerySystem!;\n}\n\n/**\n * Vue composable to create and manage a query system with proper lifecycle.\n *\n * Accepts a config object or a factory function that creates the system.\n * Handles cleanup on scope disposal.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useQuerySystem, useDerived } from \"@directive-run/vue\";\n *\n * const app = useQuerySystem({\n * facts: { userId: \"\" },\n * queries: { user: { key: ..., fetcher: ... } },\n * });\n *\n * const user = useDerived(app, \"user\");\n * </script>\n * ```\n */\nexport function useQuerySystem<\n T extends {\n start: () => void;\n destroy: () => void;\n isRunning?: boolean;\n [key: string]: any;\n },\n>(config: Record<string, unknown>): T {\n const createQuerySystem = getCreateQuerySystem();\n const system = createQuerySystem(config) as T;\n\n // Start if not already running\n if (typeof window !== \"undefined\" && !system.isRunning) {\n system.start();\n }\n\n onScopeDispose(() => {\n // RFC 0009 follow-up: use destroyAsync so source\n // unsubscribes actually complete (e.g. Supabase `channel.unsubscribe()`\n // returns a Promise the sync `destroy()` would have dropped on\n // the floor). The framework's onScopeDispose is sync, so we\n // fire-and-forget with a swallow-catch — broker drops finish in\n // the background; any unsubscribe rejection is already routed\n // through the manager's runtime-phase observability sink.\n system.destroyAsync().catch((err: unknown) => {\n if (isDevelopment)\n console.warn(\"[Directive] destroyAsync rejected during unmount:\", err);\n });\n });\n\n return system;\n}\n\n// ============================================================================\n// SSR Hydration\n// ============================================================================\n\n/** @internal Injection key for SSR hydration snapshot */\nconst HYDRATION_KEY: InjectionKey<Record<string, unknown>> = Symbol(\n \"directive-hydration\",\n);\n\n/**\n * Vue component that provides a DistributableSnapshot to child components.\n * Use with `useHydratedSystem` for SSR hydration in Nuxt or Vue SSR apps.\n *\n * @example\n * ```vue\n * <template>\n * <DirectiveHydrator :snapshot=\"snapshot\">\n * <App />\n * </DirectiveHydrator>\n * </template>\n * ```\n */\nexport const DirectiveHydrator = defineComponent({\n name: \"DirectiveHydrator\",\n props: {\n snapshot: { type: Object, required: true },\n },\n setup(props, { slots }) {\n provide(HYDRATION_KEY, props.snapshot as Record<string, unknown>);\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Vue composable that creates a system hydrated from a server snapshot.\n * Must be used inside a `<DirectiveHydrator>` ancestor.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useHydratedSystem, useDerived } from \"@directive-run/vue\";\n * const system = useHydratedSystem(myModule);\n * const count = useDerived(system, \"count\");\n * </script>\n * ```\n */\nexport function useHydratedSystem<S extends ModuleSchema>(\n moduleDef: ModuleDef<S>,\n config?: UseDirectiveConfig,\n): SingleModuleSystem<S> {\n const snapshot = inject(HYDRATION_KEY, undefined);\n const mergedFacts = mergeHydrationFacts(\n snapshot,\n config?.initialFacts as Record<string, unknown>,\n );\n const { system } = useDirective(moduleDef, {\n ...config,\n initialFacts: mergedFacts,\n });\n\n return system;\n}\n\n// ============================================================================\n// useAuditLedger — live ledger entries with filter (R4.I parity)\n// ============================================================================\n\nimport type { AuditEntry, AuditLedger, QueryFilter } from \"@directive-run/core\";\n\n/**\n * Subscribe to an audit ledger and return the latest entries matching\n * `filter` as a reactive `Ref`. Re-evaluates on each poll tick (default\n * 250 ms — override with `pollMs`).\n *\n * **Polling floor:** `pollMs` is clamped to a minimum of 50 ms to prevent\n * accidental DoS from typos like `pollMs: 5`. Values below the floor are\n * silently clamped in production; dev mode logs a warning.\n *\n * **First-paint freshness:** the interval starts immediately at setup\n * time (not gated on `onMounted`), so the first ledger query lands\n * before the component paints. Cleanup uses `onScopeDispose`, which\n * is correct for both component scopes and ad-hoc effect scopes.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useAuditLedger } from \"@directive-run/vue\";\n * const entries = useAuditLedger(ledger, { kind: \"constraint.evaluate\", limit: 20 });\n * </script>\n * <template>\n * <ul>\n * <li v-for=\"e in entries\" :key=\"e.seq\">{{ e.kind }} @ {{ e.ts }}</li>\n * </ul>\n * </template>\n * ```\n */\nexport function useAuditLedger(\n ledger: AuditLedger,\n filter: QueryFilter = {},\n opts: { pollMs?: number } = {},\n): ShallowRef<readonly AuditEntry[]> {\n const requestedPollMs = opts.pollMs ?? 250;\n const pollMs = Math.max(50, requestedPollMs);\n\n if (isDevelopment) {\n if (opts.pollMs !== undefined && opts.pollMs < 50) {\n console.warn(\n `[Directive] useAuditLedger() pollMs=${opts.pollMs} is below the 50 ms floor; clamped to 50 ms.`,\n );\n }\n if (pollMs < 100) {\n const entryCount = ledger.toJSON().entries.length;\n if (entryCount > 1000) {\n console.warn(\n `[Directive] useAuditLedger() polling every ${pollMs} ms against a ${entryCount}-entry ledger — that's a lot of CPU per tick. Consider raising pollMs or tightening the filter.`,\n );\n }\n }\n }\n\n const entries = shallowRef<readonly AuditEntry[]>(ledger.query(filter));\n const intervalId = setInterval(() => {\n entries.value = ledger.query(filter);\n }, pollMs);\n\n onScopeDispose(() => {\n clearInterval(intervalId);\n });\n\n return entries;\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dev-true.ts","../src/index.ts"],"names":["dev_true_default","useFact","system","keyOrKeys","assertSystem","_useFactMulti","_useFactSingle","factKey","value","ref","unsubscribe","onScopeDispose","factKeys","getValues","result","key","state","shallowRef","useDerived","idOrIds","_useDerivedMulti","_useDerivedSingle","derivationId","derivationIds","id","useSelector","selector","equalityFn","defaultEquality","deriveKeySet","runWithTracking","runTrackedSelector","initial","trackedFactKeys","trackedDeriveKeys","selected","unsubs","resubscribe","unsub","onUpdate","depsChanged","useDispatch","event","useEvents","useWatch","callback","useInspect","options","computeInspectState","update","throttled","cleanup","createThrottle","unsubFacts","unsubSettled","useRequirementStatus","statusPlugin","typeOrTypes","type","status","useSuspenseRequirement","_useSuspenseRequirementMulti","_useSuspenseRequirementSingle","initialStatus","resolve","reject","current","_findFirstStatusError","types","_waitForAllSettled","onTick","t","err","initialError","useExplain","requirementId","explanation","useConstraintStatus","constraintId","inspectState","computed","fullInspection","c","useOptimisticUpdate","requirementType","isPending","error","snapshot","rollback","mutate","updateFn","useHistory","buildHistoryState","_buildDirectivePlugins","config","plugins","sp","createRequirementStatusPlugin","_createDirectiveSystem","moduleDef","systemConfig","createSystem","_subscribeFacts","subscribeAll","pickFacts","_subscribeDerived","derivedKeys","allDerivationKeys","getDerived","useDirective","factsState","derivedState","unsubDerived","events","createTypedHooks","useNamespacedSelector","keys","_createQuerySystem","getCreateQuerySystem","useQuerySystem","HYDRATION_KEY","DirectiveHydrator","defineComponent","props","slots","provide","useHydratedSystem","inject","mergedFacts","mergeHydrationFacts","useAuditLedger","ledger","filter","opts","requestedPollMs","pollMs","entryCount","entries","intervalId"],"mappings":"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","file":"index.js","sourcesContent":["export default typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\";\n","/**\n * Vue Adapter - Vue 3 composables for Directive\n *\n * Exports: useFact, useDerived, useDispatch, useSelector,\n * useWatch, useInspect, useRequirementStatus, useSuspenseRequirement,\n * useEvents, useExplain, useConstraintStatus, useOptimisticUpdate,\n * useDirective, useHistory, createTypedHooks, shallowEqual\n */\n\nimport type {\n ErrorBoundaryConfig,\n InferDerivations,\n InferEvents,\n InferFacts,\n InferSelectorState,\n ModuleDef,\n ModuleSchema,\n ModulesMap,\n NamespacedSystem,\n Plugin,\n SingleModuleSystem,\n SystemSnapshot,\n TraceOption,\n} from \"@directive-run/core\";\nimport {\n createRequirementStatusPlugin,\n createSystem,\n} from \"@directive-run/core\";\nimport type { RequirementTypeStatus } from \"@directive-run/core\";\nimport {\n type ConstraintInfo,\n type InspectState,\n assertSystem,\n buildHistoryState,\n computeInspectState,\n createThrottle,\n defaultEquality,\n depsChanged,\n mergeHydrationFacts,\n pickFacts,\n runTrackedSelector,\n shallowEqual,\n} from \"@directive-run/core/adapter-utils\";\nimport {\n type ComputedRef,\n type InjectionKey,\n type Ref,\n type ShallowRef,\n computed,\n defineComponent,\n inject,\n onScopeDispose,\n provide,\n ref,\n shallowRef,\n} from \"vue\";\nimport isDevelopment from \"#is-development\";\n\n// Re-export for convenience\nexport type { RequirementTypeStatus, InspectState, ConstraintInfo };\nexport { shallowEqual };\n\n/** Type for the requirement status plugin return value */\nexport type StatusPlugin = ReturnType<typeof createRequirementStatusPlugin>;\n\n// ============================================================================\n// useFact — single key or multi key\n// ============================================================================\n\n/** Single key overload */\nexport function useFact<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(system: SingleModuleSystem<S>, factKey: K): Ref<InferFacts<S>[K] | undefined>;\n/** Multi-key overload */\nexport function useFact<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(\n system: SingleModuleSystem<S>,\n factKeys: K[],\n): ShallowRef<Pick<InferFacts<S>, K>>;\n/** Implementation */\nexport function useFact(\n system: SingleModuleSystem<any>,\n keyOrKeys: string | string[],\n): Ref<unknown> | ShallowRef<unknown> {\n assertSystem(\"useFact\", system);\n if (isDevelopment && typeof keyOrKeys === \"function\") {\n console.error(\n \"[Directive] useFact() received a function. Did you mean useSelector()? \" +\n \"useFact() takes a string key or array of keys, not a selector function.\",\n );\n }\n\n // Multi-key path: useFact(system, [keys])\n if (Array.isArray(keyOrKeys)) {\n return _useFactMulti(system, keyOrKeys);\n }\n\n // Single key path: useFact(system, key)\n return _useFactSingle(system, keyOrKeys);\n}\n\nfunction _useFactSingle(\n system: SingleModuleSystem<any>,\n factKey: string,\n): Ref<unknown> {\n if (isDevelopment) {\n if (!system.facts.$store.has(factKey)) {\n console.warn(\n `[Directive] useFact(\"${factKey}\") — fact not found in store. ` +\n `Check that \"${factKey}\" is defined in your module's schema.`,\n );\n }\n }\n\n const value = ref(system.facts.$store.get(factKey));\n const unsubscribe = system.facts.$store.subscribe([factKey], () => {\n value.value = system.facts.$store.get(factKey);\n });\n onScopeDispose(unsubscribe);\n return value;\n}\n\nfunction _useFactMulti(\n system: SingleModuleSystem<any>,\n factKeys: string[],\n): ShallowRef<Record<string, unknown>> {\n const getValues = (): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const key of factKeys) {\n result[key] = system.facts.$store.get(key);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = system.facts.$store.subscribe(factKeys, () => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n}\n\n// ============================================================================\n// useDerived — single key or multi key\n// ============================================================================\n\n/** Single key overload */\nexport function useDerived<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(system: SingleModuleSystem<S>, derivationId: K): Ref<InferDerivations<S>[K]>;\n/** Multi-key overload */\nexport function useDerived<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(\n system: SingleModuleSystem<S>,\n derivationIds: K[],\n): ShallowRef<Pick<InferDerivations<S>, K>>;\n/** Implementation */\nexport function useDerived(\n system: SingleModuleSystem<any>,\n idOrIds: string | string[],\n): Ref<unknown> | ShallowRef<unknown> {\n assertSystem(\"useDerived\", system);\n if (isDevelopment && typeof idOrIds === \"function\") {\n console.error(\n \"[Directive] useDerived() received a function. Did you mean useSelector()? \" +\n \"useDerived() takes a string key or array of keys, not a selector function.\",\n );\n }\n\n // Multi-key path\n if (Array.isArray(idOrIds)) {\n return _useDerivedMulti(system, idOrIds);\n }\n\n // Single key path\n return _useDerivedSingle(system, idOrIds);\n}\n\nfunction _useDerivedSingle(\n system: SingleModuleSystem<any>,\n derivationId: string,\n): Ref<unknown> {\n if (isDevelopment) {\n const initialValue = system.read(derivationId);\n if (initialValue === undefined) {\n console.warn(\n `[Directive] useDerived(\"${derivationId}\") returned undefined. ` +\n `Check that \"${derivationId}\" is defined in your module's derive property.`,\n );\n }\n }\n const value = ref(system.read(derivationId));\n const unsubscribe = system.subscribe([derivationId], () => {\n value.value = system.read(derivationId);\n });\n onScopeDispose(unsubscribe);\n return value;\n}\n\nfunction _useDerivedMulti(\n system: SingleModuleSystem<any>,\n derivationIds: string[],\n): ShallowRef<Record<string, unknown>> {\n const getValues = (): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const id of derivationIds) {\n result[id] = system.read(id);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = system.subscribe(derivationIds, () => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n}\n\n// ============================================================================\n// useSelector — auto-tracking selector over facts and derivations\n// ============================================================================\n\n/**\n * Auto-tracking selector over facts and derivations.\n * Uses `withTracking()` to detect which facts the selector accesses,\n * then subscribes only to those keys.\n */\nexport function useSelector<S extends ModuleSchema, R>(\n system: SingleModuleSystem<S>,\n selector: (state: InferSelectorState<S>) => R,\n equalityFn?: (a: R, b: R) => boolean,\n): Ref<R>;\nexport function useSelector(\n system: SingleModuleSystem<any>,\n selector: (state: Record<string, unknown>) => unknown,\n equalityFn: (a: unknown, b: unknown) => boolean = defaultEquality,\n): Ref<unknown> {\n assertSystem(\"useSelector\", system);\n const deriveKeySet = new Set(Object.keys(system.derive ?? {}));\n\n const runWithTracking = () =>\n runTrackedSelector(system, deriveKeySet, selector);\n\n const initial = runWithTracking();\n let trackedFactKeys = initial.factKeys;\n let trackedDeriveKeys = initial.deriveKeys;\n const selected = ref(initial.value);\n\n const unsubs: Array<() => void> = [];\n\n const resubscribe = () => {\n for (const unsub of unsubs) unsub();\n unsubs.length = 0;\n\n const onUpdate = () => {\n const result = runWithTracking();\n if (!equalityFn(selected.value, result.value)) {\n selected.value = result.value;\n }\n // Re-track: check if deps changed\n if (\n depsChanged(\n trackedFactKeys,\n result.factKeys,\n trackedDeriveKeys,\n result.deriveKeys,\n )\n ) {\n trackedFactKeys = result.factKeys;\n trackedDeriveKeys = result.deriveKeys;\n resubscribe();\n }\n };\n\n if (trackedFactKeys.length > 0) {\n unsubs.push(system.facts.$store.subscribe(trackedFactKeys, onUpdate));\n } else if (trackedDeriveKeys.length === 0) {\n unsubs.push(system.facts.$store.subscribeAll(onUpdate));\n }\n if (trackedDeriveKeys.length > 0) {\n unsubs.push(system.subscribe(trackedDeriveKeys, onUpdate));\n }\n };\n\n resubscribe();\n\n onScopeDispose(() => {\n for (const unsub of unsubs) unsub();\n });\n\n return selected;\n}\n\n// ============================================================================\n// useDispatch\n// ============================================================================\n\nexport function useDispatch<S extends ModuleSchema>(\n system: SingleModuleSystem<S>,\n): (event: InferEvents<S>) => void {\n assertSystem(\"useDispatch\", system);\n return (event: InferEvents<S>) => {\n system.dispatch(event);\n };\n}\n\n// ============================================================================\n// useEvents — memoized events reference\n// ============================================================================\n\n/**\n * Returns the system's events dispatcher.\n */\nexport function useEvents<S extends ModuleSchema>(\n system: SingleModuleSystem<S>,\n): SingleModuleSystem<S>[\"events\"] {\n assertSystem(\"useEvents\", system);\n return system.events;\n}\n\n// ============================================================================\n// useWatch — derivation or fact side-effect\n// ============================================================================\n\n/** Watch a derivation or fact by key (auto-detected). When a key exists in both facts and derivations, the derivation overload takes priority. */\nexport function useWatch<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(\n system: SingleModuleSystem<S>,\n key: K,\n callback: (\n newValue: InferDerivations<S>[K],\n previousValue: InferDerivations<S>[K] | undefined,\n ) => void,\n): void;\n/** Watch a fact key with auto-detection. */\nexport function useWatch<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(\n system: SingleModuleSystem<S>,\n key: K,\n callback: (\n newValue: InferFacts<S>[K] | undefined,\n previousValue: InferFacts<S>[K] | undefined,\n ) => void,\n): void;\n/** Implementation */\nexport function useWatch(\n system: SingleModuleSystem<any>,\n key: string,\n callback: (newValue: unknown, prevValue: unknown) => void,\n): void {\n assertSystem(\"useWatch\", system);\n\n const unsubscribe = system.watch(key, callback);\n onScopeDispose(unsubscribe);\n}\n\n// ============================================================================\n// useInspect — consolidated inspection hook\n// ============================================================================\n\n/** Options for useInspect */\nexport interface UseInspectOptions {\n throttleMs?: number;\n}\n\n/**\n * Consolidated system inspection hook.\n * Returns InspectState with optional throttling.\n */\nexport function useInspect(\n system: SingleModuleSystem<any>,\n options?: UseInspectOptions,\n): ShallowRef<InspectState> {\n assertSystem(\"useInspect\", system);\n const state = shallowRef<InspectState>(computeInspectState(system));\n\n const update = () => {\n state.value = computeInspectState(system);\n };\n\n if (options?.throttleMs && options.throttleMs > 0) {\n const { throttled, cleanup } = createThrottle(update, options.throttleMs);\n const unsubFacts = system.facts.$store.subscribeAll(throttled);\n const unsubSettled = system.onSettledChange(throttled);\n onScopeDispose(() => {\n cleanup();\n unsubFacts();\n unsubSettled();\n });\n } else {\n const unsubFacts = system.facts.$store.subscribeAll(update);\n const unsubSettled = system.onSettledChange(update);\n onScopeDispose(() => {\n unsubFacts();\n unsubSettled();\n });\n }\n\n return state;\n}\n\n// ============================================================================\n// useRequirementStatus — single or multi\n// ============================================================================\n\n/** Single type overload */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n type: string,\n): ShallowRef<RequirementTypeStatus>;\n/** Multi-type overload */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n types: string[],\n): ShallowRef<Record<string, RequirementTypeStatus>>;\n/** Implementation */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n typeOrTypes: string | string[],\n):\n | ShallowRef<RequirementTypeStatus>\n | ShallowRef<Record<string, RequirementTypeStatus>> {\n if (Array.isArray(typeOrTypes)) {\n const getValues = (): Record<string, RequirementTypeStatus> => {\n const result: Record<string, RequirementTypeStatus> = {};\n for (const type of typeOrTypes) {\n result[type] = statusPlugin.getStatus(type);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = statusPlugin.subscribe(() => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n }\n\n const status = shallowRef<RequirementTypeStatus>(\n statusPlugin.getStatus(typeOrTypes),\n );\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = statusPlugin.getStatus(typeOrTypes);\n });\n onScopeDispose(unsubscribe);\n return status;\n}\n\n// ============================================================================\n// useSuspenseRequirement — async setup() Suspense integration\n// ============================================================================\n\n/**\n * Returns a promise that resolves when a requirement type settles.\n * Designed for Vue's async `setup()` with `<Suspense>`.\n *\n * - If the requirement is loading, the returned promise suspends the component.\n * - If the requirement has an error, the promise rejects with that error.\n * - If the requirement is already settled, resolves immediately.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useSuspenseRequirement } from '@directive-run/vue';\n *\n * // In async setup(), this suspends until FETCH_USER settles\n * const status = await useSuspenseRequirement(statusPlugin, \"FETCH_USER\");\n * </script>\n *\n * <template>\n * <div>Resolved: {{ status.resolvedCount }}</div>\n * </template>\n * ```\n */\n\n/** Single type overload */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n type: string,\n): Promise<ShallowRef<RequirementTypeStatus>>;\n\n/** Multi-type overload */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<ShallowRef<Record<string, RequirementTypeStatus>>>;\n\n/** Implementation */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n typeOrTypes: string | string[],\n): Promise<\n | ShallowRef<RequirementTypeStatus>\n | ShallowRef<Record<string, RequirementTypeStatus>>\n> {\n if (Array.isArray(typeOrTypes)) {\n return _useSuspenseRequirementMulti(statusPlugin, typeOrTypes);\n }\n\n return _useSuspenseRequirementSingle(statusPlugin, typeOrTypes);\n}\n\nasync function _useSuspenseRequirementSingle(\n statusPlugin: StatusPlugin,\n type: string,\n): Promise<ShallowRef<RequirementTypeStatus>> {\n const initialStatus = statusPlugin.getStatus(type);\n\n if (initialStatus.hasError && initialStatus.lastError) {\n throw initialStatus.lastError;\n }\n\n // If loading, wait for it to settle\n if (initialStatus.isLoading) {\n await new Promise<void>((resolve, reject) => {\n const unsubscribe = statusPlugin.subscribe(() => {\n const current = statusPlugin.getStatus(type);\n if (!current.isLoading) {\n unsubscribe();\n if (current.hasError && current.lastError) {\n reject(current.lastError);\n } else {\n resolve();\n }\n }\n });\n onScopeDispose(unsubscribe);\n });\n }\n\n // Now settled — return a reactive ref that continues tracking\n const status = shallowRef<RequirementTypeStatus>(\n statusPlugin.getStatus(type),\n );\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = statusPlugin.getStatus(type);\n });\n onScopeDispose(unsubscribe);\n\n return status;\n}\n\nfunction _findFirstStatusError(\n statusPlugin: StatusPlugin,\n types: string[],\n): Error | null {\n for (const type of types) {\n const s = statusPlugin.getStatus(type);\n if (s.hasError && s.lastError) {\n return s.lastError;\n }\n }\n\n return null;\n}\n\nfunction _waitForAllSettled(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const onTick = () => {\n const allDone = types.every((t) => !statusPlugin.getStatus(t).isLoading);\n if (!allDone) return;\n unsubscribe();\n const err = _findFirstStatusError(statusPlugin, types);\n if (err) {\n reject(err);\n return;\n }\n resolve();\n };\n const unsubscribe = statusPlugin.subscribe(onTick);\n onScopeDispose(unsubscribe);\n });\n}\n\nasync function _useSuspenseRequirementMulti(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<ShallowRef<Record<string, RequirementTypeStatus>>> {\n // Check for immediate errors\n const initialError = _findFirstStatusError(statusPlugin, types);\n if (initialError) {\n throw initialError;\n }\n\n // If any are loading, wait for all to settle\n const anyLoading = types.some((t) => statusPlugin.getStatus(t).isLoading);\n if (anyLoading) {\n await _waitForAllSettled(statusPlugin, types);\n }\n\n // Now settled — return a reactive ref that continues tracking\n const getValues = (): Record<string, RequirementTypeStatus> => {\n const result: Record<string, RequirementTypeStatus> = {};\n for (const type of types) {\n result[type] = statusPlugin.getStatus(type);\n }\n\n return result;\n };\n const status = shallowRef(getValues());\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = getValues();\n });\n onScopeDispose(unsubscribe);\n\n return status;\n}\n\n// ============================================================================\n// useExplain — reactive requirement explanation\n// ============================================================================\n\n/**\n * Reactively returns the explanation string for a requirement.\n */\nexport function useExplain(\n system: SingleModuleSystem<any>,\n requirementId: string,\n): Ref<string | null> {\n assertSystem(\"useExplain\", system);\n const explanation = ref<string | null>(system.explain(requirementId)) as Ref<\n string | null\n >;\n\n const update = () => {\n explanation.value = system.explain(requirementId);\n };\n\n const unsubFacts = system.facts.$store.subscribeAll(update);\n const unsubSettled = system.onSettledChange(update);\n onScopeDispose(() => {\n unsubFacts();\n unsubSettled();\n });\n\n return explanation;\n}\n\n// ============================================================================\n// useConstraintStatus — reactive constraint inspection\n// ============================================================================\n\n/** Get all constraints */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n): ComputedRef<ConstraintInfo[]>;\n/** Get a single constraint by ID */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n constraintId: string,\n): ComputedRef<ConstraintInfo | null>;\n/** Implementation */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n constraintId?: string,\n): ComputedRef<ConstraintInfo[] | ConstraintInfo | null> {\n assertSystem(\"useConstraintStatus\", system);\n const inspectState = useInspect(system);\n\n return computed(() => {\n // Track reactivity via inspectState, but use full inspect() for constraint list\n void inspectState.value;\n const fullInspection = system.inspect();\n if (!constraintId) return fullInspection.constraints;\n return (\n fullInspection.constraints.find((c) => c.id === constraintId) ?? null\n );\n });\n}\n\n// ============================================================================\n// useOptimisticUpdate — batch with rollback on failure\n// ============================================================================\n\nexport interface OptimisticUpdateResult {\n mutate: (updateFn: () => void) => void;\n isPending: Ref<boolean>;\n error: Ref<Error | null>;\n rollback: () => void;\n}\n\n/**\n * Optimistic update hook. Saves a snapshot before mutating, monitors\n * a requirement type via statusPlugin, and rolls back on failure.\n */\nexport function useOptimisticUpdate(\n system: SingleModuleSystem<any>,\n statusPlugin?: StatusPlugin,\n requirementType?: string,\n): OptimisticUpdateResult {\n assertSystem(\"useOptimisticUpdate\", system);\n const isPending = ref(false);\n const error = ref<Error | null>(null) as Ref<Error | null>;\n let snapshot: SystemSnapshot | null = null;\n let unsubscribe: (() => void) | null = null;\n\n const rollback = () => {\n if (snapshot) {\n system.restore(snapshot);\n snapshot = null;\n }\n isPending.value = false;\n error.value = null;\n unsubscribe?.();\n unsubscribe = null;\n };\n\n const mutate = (updateFn: () => void) => {\n snapshot = system.getSnapshot();\n isPending.value = true;\n error.value = null;\n system.batch(updateFn);\n\n // Watch for resolver completion/failure\n if (statusPlugin && requirementType) {\n unsubscribe?.();\n unsubscribe = statusPlugin.subscribe(() => {\n const status = statusPlugin.getStatus(requirementType);\n if (!status.isLoading && !status.hasError) {\n snapshot = null;\n isPending.value = false;\n unsubscribe?.();\n unsubscribe = null;\n } else if (status.hasError) {\n error.value = status.lastError;\n rollback();\n }\n });\n }\n };\n\n onScopeDispose(() => {\n unsubscribe?.();\n });\n\n return { mutate, isPending, error, rollback };\n}\n\n// ============================================================================\n// useHistory — reactive history state\n// ============================================================================\n\n/**\n * Reactive history composable. Returns a ShallowRef that updates\n * when snapshots are taken or navigation occurs.\n *\n * @example\n * ```vue\n * const history = useHistory(system);\n * <button :disabled=\"!history.value?.canGoBack\" @click=\"history.value?.goBack()\">Undo</button>\n * ```\n */\nexport function useHistory(\n system: SingleModuleSystem<any>,\n): ShallowRef<ReturnType<typeof buildHistoryState>> {\n assertSystem(\"useHistory\", system);\n const state = shallowRef<ReturnType<typeof buildHistoryState>>(\n buildHistoryState(system),\n );\n const unsub = system.onHistoryChange(() => {\n state.value = buildHistoryState(system);\n });\n onScopeDispose(unsub);\n return state;\n}\n\n// ============================================================================\n// Scoped System Composable\n// ============================================================================\n\n/** Configuration for useDirective */\ninterface UseDirectiveConfig {\n plugins?: Plugin<any>[];\n trace?: TraceOption;\n errorBoundary?: ErrorBoundaryConfig;\n tickMs?: number;\n zeroConfig?: boolean;\n initialFacts?: Record<string, any>;\n status?: boolean;\n /** Fact keys to subscribe to (omit for all) */\n facts?: string[];\n /** Derivation keys to subscribe to (omit for all) */\n derived?: string[];\n}\n\n/**\n * Create a scoped Directive system with automatic lifecycle management.\n * When no `facts` or `derived` keys are specified, subscribes to ALL\n * facts and derivations and returns reactive state.\n *\n * @example\n * ```vue\n * // Subscribe to everything\n * const { facts, derived, events, dispatch } = useDirective(counterModule);\n *\n * // Selective keys\n * const { facts, derived } = useDirective(counterModule, { facts: [\"count\"], derived: [\"doubled\"] });\n * ```\n */\nfunction _buildDirectivePlugins(config: UseDirectiveConfig | undefined): {\n plugins: Plugin<ModuleSchema>[];\n statusPlugin: StatusPlugin | undefined;\n} {\n const plugins = [...(config?.plugins ?? [])] as Plugin<ModuleSchema>[];\n let statusPlugin: StatusPlugin | undefined;\n\n if (config?.status) {\n const sp = createRequirementStatusPlugin();\n statusPlugin = sp;\n plugins.push(sp.plugin as Plugin<any>);\n }\n\n return { plugins, statusPlugin };\n}\n\nfunction _createDirectiveSystem<M extends ModuleSchema>(\n moduleDef: ModuleDef<M>,\n config: UseDirectiveConfig | undefined,\n plugins: Plugin<ModuleSchema>[],\n): SingleModuleSystem<M> {\n const systemConfig = {\n module: moduleDef,\n plugins: plugins.length > 0 ? plugins : undefined,\n trace: config?.trace,\n errorBoundary: config?.errorBoundary,\n tickMs: config?.tickMs,\n zeroConfig: config?.zeroConfig,\n initialFacts: config?.initialFacts,\n } as any;\n\n return createSystem(systemConfig) as unknown as SingleModuleSystem<M>;\n}\n\nfunction _subscribeFacts<M extends ModuleSchema>(\n system: SingleModuleSystem<M>,\n factKeys: string[] | undefined,\n subscribeAll: boolean,\n): { state: ShallowRef<InferFacts<M>>; unsubscribe: (() => void) | null } {\n const state = shallowRef(\n subscribeAll\n ? (system.facts.$store.toObject() as InferFacts<M>)\n : pickFacts(system, factKeys ?? []),\n ) as ShallowRef<InferFacts<M>>;\n\n if (subscribeAll) {\n const unsubscribe = system.facts.$store.subscribeAll(() => {\n state.value = system.facts.$store.toObject() as InferFacts<M>;\n });\n return { state, unsubscribe };\n }\n\n if (factKeys && factKeys.length > 0) {\n const unsubscribe = system.facts.$store.subscribe(factKeys, () => {\n state.value = pickFacts(system, factKeys) as InferFacts<M>;\n });\n return { state, unsubscribe };\n }\n\n return { state, unsubscribe: null };\n}\n\nfunction _subscribeDerived<M extends ModuleSchema>(\n system: SingleModuleSystem<M>,\n derivedKeys: string[] | undefined,\n subscribeAll: boolean,\n): {\n state: ShallowRef<InferDerivations<M>>;\n unsubscribe: (() => void) | null;\n} {\n const allDerivationKeys = subscribeAll\n ? Object.keys(system.derive ?? {})\n : (derivedKeys ?? []);\n const getDerived = (): InferDerivations<M> => {\n const result: Record<string, unknown> = {};\n for (const key of allDerivationKeys) {\n result[key] = system.read(key);\n }\n return result as InferDerivations<M>;\n };\n const state = shallowRef(getDerived()) as ShallowRef<InferDerivations<M>>;\n const unsubscribe =\n allDerivationKeys.length > 0\n ? system.subscribe(allDerivationKeys, () => {\n state.value = getDerived();\n })\n : null;\n\n return { state, unsubscribe };\n}\n\nexport function useDirective<M extends ModuleSchema>(\n moduleDef: ModuleDef<M>,\n config?: UseDirectiveConfig,\n) {\n const { plugins, statusPlugin } = _buildDirectivePlugins(config);\n const system = _createDirectiveSystem(moduleDef, config, plugins);\n\n // SSR guard: initialize facts for SSR rendering, start reconciliation only in the browser\n if (typeof window !== \"undefined\") {\n system.start();\n } else {\n system.initialize();\n }\n\n onScopeDispose(() => {\n // RFC 0009 follow-up (R18 Tier 2-B): use destroyAsync so source\n // unsubscribes actually complete (e.g. Supabase `channel.unsubscribe()`\n // returns a Promise the sync `destroy()` would have dropped on\n // the floor). The framework's onScopeDispose is sync, so we\n // fire-and-forget with a swallow-catch — broker drops finish in\n // the background; any unsubscribe rejection is already routed\n // through the manager's runtime-phase observability sink.\n system.destroyAsync().catch((err: unknown) => {\n if (isDevelopment)\n console.warn(\"[Directive] destroyAsync rejected during unmount:\", err);\n });\n });\n\n const factKeys = config?.facts;\n const derivedKeys = config?.derived;\n const subscribeAll = !factKeys && !derivedKeys;\n\n const { state: factsState, unsubscribe: unsubFacts } = _subscribeFacts(\n system,\n factKeys,\n subscribeAll,\n );\n const { state: derivedState, unsubscribe: unsubDerived } = _subscribeDerived(\n system,\n derivedKeys,\n subscribeAll,\n );\n\n onScopeDispose(() => {\n unsubFacts?.();\n unsubDerived?.();\n });\n\n const events = system.events;\n const dispatch = (event: InferEvents<M>) => system.dispatch(event);\n\n return {\n system,\n facts: factsState as ShallowRef<InferFacts<M>>,\n derived: derivedState as ShallowRef<InferDerivations<M>>,\n events,\n dispatch,\n statusPlugin,\n };\n}\n\n// ============================================================================\n// Typed Hooks Factory\n// ============================================================================\n\nexport function createTypedHooks<M extends ModuleSchema>(): {\n useFact: <K extends keyof InferFacts<M> & string>(\n system: SingleModuleSystem<M>,\n factKey: K,\n ) => Ref<InferFacts<M>[K] | undefined>;\n useDerived: <K extends keyof InferDerivations<M> & string>(\n system: SingleModuleSystem<M>,\n derivationId: K,\n ) => Ref<InferDerivations<M>[K]>;\n useDispatch: (\n system: SingleModuleSystem<M>,\n ) => (event: InferEvents<M>) => void;\n useEvents: (system: SingleModuleSystem<M>) => SingleModuleSystem<M>[\"events\"];\n useWatch: <K extends string>(\n system: SingleModuleSystem<M>,\n key: K,\n callback: (newValue: unknown, previousValue: unknown) => void,\n ) => void;\n} {\n return {\n useFact: <K extends keyof InferFacts<M> & string>(\n system: SingleModuleSystem<M>,\n factKey: K,\n ) =>\n useFact(system as SingleModuleSystem<any>, factKey) as Ref<\n InferFacts<M>[K] | undefined\n >,\n useDerived: <K extends keyof InferDerivations<M> & string>(\n system: SingleModuleSystem<M>,\n derivationId: K,\n ) =>\n useDerived(system as SingleModuleSystem<any>, derivationId) as Ref<\n InferDerivations<M>[K]\n >,\n useDispatch: (system: SingleModuleSystem<M>) => {\n return (event: InferEvents<M>) => {\n system.dispatch(event);\n };\n },\n useEvents: (system: SingleModuleSystem<M>) => useEvents<M>(system),\n useWatch: <K extends string>(\n system: SingleModuleSystem<M>,\n key: K,\n callback: (newValue: unknown, previousValue: unknown) => void,\n ) => useWatch(system as SingleModuleSystem<any>, key, callback),\n };\n}\n\n// ============================================================================\n// useNamespacedSelector — select from a NamespacedSystem\n// ============================================================================\n\n/**\n * Reactive composable to select from a NamespacedSystem.\n * Subscribes to specified keys and returns a Vue ref.\n *\n * @param system - The namespaced system\n * @param keys - Namespaced keys to subscribe to (e.g., [\"auth.token\", \"data.count\"])\n * @param selector - Function that reads from system.facts / system.derive\n *\n * @example\n * ```vue\n * const system = useDirectiveRef({ modules: { auth, data } });\n * const token = useNamespacedSelector(system, [\"auth.token\"], (s) => s.facts.auth.token);\n * ```\n */\nexport function useNamespacedSelector<Modules extends ModulesMap, R>(\n system: NamespacedSystem<Modules>,\n keys: string[],\n selector: (system: NamespacedSystem<Modules>) => R,\n): Ref<R> {\n const value = ref(selector(system)) as Ref<R>;\n const unsubscribe = system.subscribe(keys, () => {\n value.value = selector(system) as R;\n });\n onScopeDispose(unsubscribe);\n\n return value;\n}\n\n// ============================================================================\n// useQuerySystem — Stable query system with lifecycle management\n// ============================================================================\n\nlet _createQuerySystem: ((config: Record<string, unknown>) => any) | null =\n null;\n\nfunction getCreateQuerySystem() {\n if (!_createQuerySystem) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require(\"@directive-run/query\");\n _createQuerySystem = mod.createQuerySystem;\n } catch {\n throw new Error(\n \"[Directive] @directive-run/query is not installed. \" +\n \"Install it with: pnpm add @directive-run/query\",\n );\n }\n }\n\n return _createQuerySystem!;\n}\n\n/**\n * Vue composable to create and manage a query system with proper lifecycle.\n *\n * Accepts a config object or a factory function that creates the system.\n * Handles cleanup on scope disposal.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useQuerySystem, useDerived } from \"@directive-run/vue\";\n *\n * const app = useQuerySystem({\n * facts: { userId: \"\" },\n * queries: { user: { key: ..., fetcher: ... } },\n * });\n *\n * const user = useDerived(app, \"user\");\n * </script>\n * ```\n */\nexport function useQuerySystem<\n T extends {\n start: () => void;\n destroy: () => void;\n isRunning?: boolean;\n [key: string]: any;\n },\n>(config: Record<string, unknown>): T {\n const createQuerySystem = getCreateQuerySystem();\n const system = createQuerySystem(config) as T;\n\n // Start if not already running\n if (typeof window !== \"undefined\" && !system.isRunning) {\n system.start();\n }\n\n onScopeDispose(() => {\n // RFC 0009 follow-up (R18 Tier 2-B): use destroyAsync so source\n // unsubscribes actually complete (e.g. Supabase `channel.unsubscribe()`\n // returns a Promise the sync `destroy()` would have dropped on\n // the floor). The framework's onScopeDispose is sync, so we\n // fire-and-forget with a swallow-catch — broker drops finish in\n // the background; any unsubscribe rejection is already routed\n // through the manager's runtime-phase observability sink.\n system.destroyAsync().catch((err: unknown) => {\n if (isDevelopment)\n console.warn(\"[Directive] destroyAsync rejected during unmount:\", err);\n });\n });\n\n return system;\n}\n\n// ============================================================================\n// SSR Hydration\n// ============================================================================\n\n/** @internal Injection key for SSR hydration snapshot */\nconst HYDRATION_KEY: InjectionKey<Record<string, unknown>> = Symbol(\n \"directive-hydration\",\n);\n\n/**\n * Vue component that provides a DistributableSnapshot to child components.\n * Use with `useHydratedSystem` for SSR hydration in Nuxt or Vue SSR apps.\n *\n * @example\n * ```vue\n * <template>\n * <DirectiveHydrator :snapshot=\"snapshot\">\n * <App />\n * </DirectiveHydrator>\n * </template>\n * ```\n */\nexport const DirectiveHydrator = defineComponent({\n name: \"DirectiveHydrator\",\n props: {\n snapshot: { type: Object, required: true },\n },\n setup(props, { slots }) {\n provide(HYDRATION_KEY, props.snapshot as Record<string, unknown>);\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Vue composable that creates a system hydrated from a server snapshot.\n * Must be used inside a `<DirectiveHydrator>` ancestor.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useHydratedSystem, useDerived } from \"@directive-run/vue\";\n * const system = useHydratedSystem(myModule);\n * const count = useDerived(system, \"count\");\n * </script>\n * ```\n */\nexport function useHydratedSystem<S extends ModuleSchema>(\n moduleDef: ModuleDef<S>,\n config?: UseDirectiveConfig,\n): SingleModuleSystem<S> {\n const snapshot = inject(HYDRATION_KEY, undefined);\n const mergedFacts = mergeHydrationFacts(\n snapshot,\n config?.initialFacts as Record<string, unknown>,\n );\n const { system } = useDirective(moduleDef, {\n ...config,\n initialFacts: mergedFacts,\n });\n\n return system;\n}\n\n// ============================================================================\n// useAuditLedger — live ledger entries with filter (R4.I parity)\n// ============================================================================\n\nimport type { AuditEntry, AuditLedger, QueryFilter } from \"@directive-run/core\";\n\n/**\n * Subscribe to an audit ledger and return the latest entries matching\n * `filter` as a reactive `Ref`. Re-evaluates on each poll tick (default\n * 250 ms — override with `pollMs`).\n *\n * **Polling floor:** `pollMs` is clamped to a minimum of 50 ms to prevent\n * accidental DoS from typos like `pollMs: 5`. Values below the floor are\n * silently clamped in production; dev mode logs a warning.\n *\n * **First-paint freshness:** the interval starts immediately at setup\n * time (not gated on `onMounted`), so the first ledger query lands\n * before the component paints. Cleanup uses `onScopeDispose`, which\n * is correct for both component scopes and ad-hoc effect scopes.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useAuditLedger } from \"@directive-run/vue\";\n * const entries = useAuditLedger(ledger, { kind: \"constraint.evaluate\", limit: 20 });\n * </script>\n * <template>\n * <ul>\n * <li v-for=\"e in entries\" :key=\"e.seq\">{{ e.kind }} @ {{ e.ts }}</li>\n * </ul>\n * </template>\n * ```\n */\nexport function useAuditLedger(\n ledger: AuditLedger,\n filter: QueryFilter = {},\n opts: { pollMs?: number } = {},\n): ShallowRef<readonly AuditEntry[]> {\n const requestedPollMs = opts.pollMs ?? 250;\n const pollMs = Math.max(50, requestedPollMs);\n\n if (isDevelopment) {\n if (opts.pollMs !== undefined && opts.pollMs < 50) {\n console.warn(\n `[Directive] useAuditLedger() pollMs=${opts.pollMs} is below the 50 ms floor; clamped to 50 ms.`,\n );\n }\n if (pollMs < 100) {\n const entryCount = ledger.toJSON().entries.length;\n if (entryCount > 1000) {\n console.warn(\n `[Directive] useAuditLedger() polling every ${pollMs} ms against a ${entryCount}-entry ledger — that's a lot of CPU per tick. Consider raising pollMs or tightening the filter.`,\n );\n }\n }\n }\n\n const entries = shallowRef<readonly AuditEntry[]>(ledger.query(filter));\n const intervalId = setInterval(() => {\n entries.value = ledger.query(filter);\n }, pollMs);\n\n onScopeDispose(() => {\n clearInterval(intervalId);\n });\n\n return entries;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dev-true.ts","../src/index.ts"],"names":["dev_true_default","useFact","system","keyOrKeys","assertSystem","_useFactMulti","_useFactSingle","factKey","value","ref","unsubscribe","onScopeDispose","factKeys","getValues","result","key","state","shallowRef","useDerived","idOrIds","_useDerivedMulti","_useDerivedSingle","derivationId","derivationIds","id","useSelector","selector","equalityFn","defaultEquality","deriveKeySet","runWithTracking","runTrackedSelector","initial","trackedFactKeys","trackedDeriveKeys","selected","unsubs","resubscribe","unsub","onUpdate","depsChanged","useDispatch","event","useEvents","useWatch","callback","useInspect","options","computeInspectState","update","throttled","cleanup","createThrottle","unsubFacts","unsubSettled","useRequirementStatus","statusPlugin","typeOrTypes","type","status","useSuspenseRequirement","_useSuspenseRequirementMulti","_useSuspenseRequirementSingle","initialStatus","resolve","reject","current","_findFirstStatusError","types","_waitForAllSettled","onTick","t","err","initialError","useExplain","requirementId","explanation","useConstraintStatus","constraintId","inspectState","computed","fullInspection","c","useOptimisticUpdate","requirementType","isPending","error","snapshot","rollback","mutate","updateFn","useHistory","buildHistoryState","_buildDirectivePlugins","config","plugins","sp","createRequirementStatusPlugin","_createDirectiveSystem","moduleDef","systemConfig","createSystem","_subscribeFacts","subscribeAll","pickFacts","_subscribeDerived","derivedKeys","allDerivationKeys","getDerived","useDirective","factsState","derivedState","unsubDerived","events","createTypedHooks","useNamespacedSelector","keys","_createQuerySystem","getCreateQuerySystem","useQuerySystem","HYDRATION_KEY","DirectiveHydrator","defineComponent","props","slots","provide","useHydratedSystem","inject","mergedFacts","mergeHydrationFacts","useAuditLedger","ledger","filter","opts","requestedPollMs","pollMs","entryCount","entries","intervalId"],"mappings":"ypBAAA,IAAOA,CAAAA,CAAQ,OAAO,OAAA,CAAY,GAAA,EAChC,OAAA,CAAQ,GAAA,EAAK,QAAA,GAAa,YAAA,CCkFrB,SAASC,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACoC,CAUpC,OATAC,YAAAA,CAAa,SAAA,CAAWF,CAAM,CAAA,CAC1BF,CAAAA,EAAiB,OAAOG,CAAAA,EAAc,UAAA,EACxC,OAAA,CAAQ,KAAA,CACN,gJAEF,CAAA,CAIE,MAAM,OAAA,CAAQA,CAAS,CAAA,CAClBE,CAAAA,CAAcH,CAAAA,CAAQC,CAAS,CAAA,CAIjCG,CAAAA,CAAeJ,CAAAA,CAAQC,CAAS,CACzC,CAEA,SAASG,CAAAA,CACPJ,EACAK,CAAAA,CACc,CACVP,CAAAA,GACGE,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAO,IAAIK,CAAO,CAAA,EAClC,OAAA,CAAQ,IAAA,CACN,CAAA,qBAAA,EAAwBA,CAAO,kDACdA,CAAO,CAAA,qCAAA,CAC1B,CAAA,CAAA,CAIJ,IAAMC,CAAAA,CAAQC,GAAAA,CAAIP,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAIK,CAAO,CAAC,CAAA,CAC5CG,CAAAA,CAAcR,EAAO,KAAA,CAAM,MAAA,CAAO,SAAA,CAAU,CAACK,CAAO,CAAA,CAAG,IAAM,CACjEC,CAAAA,CAAM,KAAA,CAAQN,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAO,IAAIK,CAAO,EAC/C,CAAC,CAAA,CACD,OAAAI,cAAAA,CAAeD,CAAW,CAAA,CACnBF,CACT,CAEA,SAASH,CAAAA,CACPH,CAAAA,CACAU,CAAAA,CACqC,CACrC,IAAMC,CAAAA,CAAY,IAA+B,CAC/C,IAAMC,CAAAA,CAAkC,EAAC,CACzC,IAAA,IAAWC,CAAAA,IAAOH,CAAAA,CAChBE,CAAAA,CAAOC,CAAG,EAAIb,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAIa,CAAG,CAAA,CAE3C,OAAOD,CACT,CAAA,CACME,CAAAA,CAAQC,UAAAA,CAAWJ,CAAAA,EAAW,CAAA,CAC9BH,EAAcR,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAA,CAAUU,CAAAA,CAAU,IAAM,CAChEI,CAAAA,CAAM,KAAA,CAAQH,CAAAA,GAChB,CAAC,CAAA,CACD,OAAAF,cAAAA,CAAeD,CAAW,CAAA,CACnBM,CACT,CAoBO,SAASE,CAAAA,CACdhB,CAAAA,CACAiB,CAAAA,CACoC,CAUpC,OATAf,YAAAA,CAAa,YAAA,CAAcF,CAAM,EAC7BF,CAAAA,EAAiB,OAAOmB,CAAAA,EAAY,UAAA,EACtC,OAAA,CAAQ,KAAA,CACN,sJAEF,CAAA,CAIE,KAAA,CAAM,OAAA,CAAQA,CAAO,CAAA,CAChBC,CAAAA,CAAiBlB,EAAQiB,CAAO,CAAA,CAIlCE,CAAAA,CAAkBnB,CAAAA,CAAQiB,CAAO,CAC1C,CAEA,SAASE,CAAAA,CACPnB,CAAAA,CACAoB,CAAAA,CACc,CACVtB,CAAAA,EACmBE,CAAAA,CAAO,KAAKoB,CAAY,CAAA,GACxB,MAAA,EACnB,OAAA,CAAQ,IAAA,CACN,CAAA,wBAAA,EAA2BA,CAAY,CAAA,mCAAA,EACtBA,CAAY,CAAA,8CAAA,CAC/B,CAAA,CAGJ,IAAMd,CAAAA,CAAQC,IAAIP,CAAAA,CAAO,IAAA,CAAKoB,CAAY,CAAC,CAAA,CACrCZ,CAAAA,CAAcR,CAAAA,CAAO,SAAA,CAAU,CAACoB,CAAY,CAAA,CAAG,IAAM,CACzDd,CAAAA,CAAM,MAAQN,CAAAA,CAAO,IAAA,CAAKoB,CAAY,EACxC,CAAC,CAAA,CACD,OAAAX,cAAAA,CAAeD,CAAW,CAAA,CACnBF,CACT,CAEA,SAASY,EACPlB,CAAAA,CACAqB,CAAAA,CACqC,CACrC,IAAMV,CAAAA,CAAY,IAA+B,CAC/C,IAAMC,CAAAA,CAAkC,EAAC,CACzC,IAAA,IAAWU,CAAAA,IAAMD,CAAAA,CACfT,EAAOU,CAAE,CAAA,CAAItB,CAAAA,CAAO,IAAA,CAAKsB,CAAE,CAAA,CAE7B,OAAOV,CACT,CAAA,CACME,CAAAA,CAAQC,UAAAA,CAAWJ,CAAAA,EAAW,EAC9BH,CAAAA,CAAcR,CAAAA,CAAO,SAAA,CAAUqB,CAAAA,CAAe,IAAM,CACxDP,CAAAA,CAAM,KAAA,CAAQH,CAAAA,GAChB,CAAC,CAAA,CACD,OAAAF,cAAAA,CAAeD,CAAW,CAAA,CACnBM,CACT,CAgBO,SAASS,EAAAA,CACdvB,CAAAA,CACAwB,EACAC,CAAAA,CAAkDC,eAAAA,CACpC,CACdxB,YAAAA,CAAa,aAAA,CAAeF,CAAM,EAClC,IAAM2B,CAAAA,CAAe,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK3B,CAAAA,CAAO,MAAA,EAAU,EAAE,CAAC,CAAA,CAEvD4B,CAAAA,CAAkB,IACtBC,mBAAmB7B,CAAAA,CAAQ2B,CAAAA,CAAcH,CAAQ,CAAA,CAE7CM,CAAAA,CAAUF,CAAAA,GACZG,CAAAA,CAAkBD,CAAAA,CAAQ,QAAA,CAC1BE,CAAAA,CAAoBF,CAAAA,CAAQ,UAAA,CAC1BG,EAAW1B,GAAAA,CAAIuB,CAAAA,CAAQ,KAAK,CAAA,CAE5BI,CAAAA,CAA4B,EAAC,CAE7BC,CAAAA,CAAc,IAAM,CACxB,IAAA,IAAWC,CAAAA,IAASF,CAAAA,CAAQE,CAAAA,GAC5BF,CAAAA,CAAO,MAAA,CAAS,CAAA,CAEhB,IAAMG,CAAAA,CAAW,IAAM,CACrB,IAAMzB,CAAAA,CAASgB,CAAAA,EAAgB,CAC1BH,CAAAA,CAAWQ,CAAAA,CAAS,MAAOrB,CAAAA,CAAO,KAAK,CAAA,GAC1CqB,CAAAA,CAAS,KAAA,CAAQrB,CAAAA,CAAO,KAAA,CAAA,CAIxB0B,WAAAA,CACEP,CAAAA,CACAnB,CAAAA,CAAO,QAAA,CACPoB,CAAAA,CACApB,CAAAA,CAAO,UACT,IAEAmB,CAAAA,CAAkBnB,CAAAA,CAAO,QAAA,CACzBoB,CAAAA,CAAoBpB,CAAAA,CAAO,UAAA,CAC3BuB,GAAY,EAEhB,CAAA,CAEIJ,CAAAA,CAAgB,MAAA,CAAS,CAAA,CAC3BG,CAAAA,CAAO,KAAKlC,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAA,CAAU+B,CAAAA,CAAiBM,CAAQ,CAAC,CAAA,CAC3DL,CAAAA,CAAkB,MAAA,GAAW,CAAA,EACtCE,CAAAA,CAAO,IAAA,CAAKlC,CAAAA,CAAO,MAAM,MAAA,CAAO,YAAA,CAAaqC,CAAQ,CAAC,CAAA,CAEpDL,CAAAA,CAAkB,MAAA,CAAS,CAAA,EAC7BE,CAAAA,CAAO,IAAA,CAAKlC,CAAAA,CAAO,SAAA,CAAUgC,CAAAA,CAAmBK,CAAQ,CAAC,EAE7D,CAAA,CAEA,OAAAF,CAAAA,EAAY,CAEZ1B,cAAAA,CAAe,IAAM,CACnB,IAAA,IAAW2B,CAAAA,IAASF,CAAAA,CAAQE,CAAAA,GAC9B,CAAC,EAEMH,CACT,CAMO,SAASM,EAAAA,CACdvC,CAAAA,CACiC,CACjC,OAAAE,YAAAA,CAAa,aAAA,CAAeF,CAAM,CAAA,CAC1BwC,CAAAA,EAA0B,CAChCxC,EAAO,QAAA,CAASwC,CAAK,EACvB,CACF,CASO,SAASC,CAAAA,CACdzC,CAAAA,CACiC,CACjC,OAAAE,YAAAA,CAAa,WAAA,CAAaF,CAAM,CAAA,CACzBA,EAAO,MAChB,CA+BO,SAAS0C,CAAAA,CACd1C,CAAAA,CACAa,CAAAA,CACA8B,EACM,CACNzC,YAAAA,CAAa,UAAA,CAAYF,CAAM,CAAA,CAE/B,IAAMQ,EAAcR,CAAAA,CAAO,KAAA,CAAMa,CAAAA,CAAK8B,CAAQ,CAAA,CAC9ClC,cAAAA,CAAeD,CAAW,EAC5B,CAeO,SAASoC,CAAAA,CACd5C,CAAAA,CACA6C,CAAAA,CAC0B,CAC1B3C,aAAa,YAAA,CAAcF,CAAM,CAAA,CACjC,IAAMc,CAAAA,CAAQC,UAAAA,CAAyB+B,oBAAoB9C,CAAM,CAAC,CAAA,CAE5D+C,CAAAA,CAAS,IAAM,CACnBjC,EAAM,KAAA,CAAQgC,mBAAAA,CAAoB9C,CAAM,EAC1C,CAAA,CAEA,GAAI6C,CAAAA,EAAS,UAAA,EAAcA,CAAAA,CAAQ,UAAA,CAAa,CAAA,CAAG,CACjD,GAAM,CAAE,UAAAG,CAAAA,CAAW,OAAA,CAAAC,CAAQ,CAAA,CAAIC,cAAAA,CAAeH,CAAAA,CAAQF,EAAQ,UAAU,CAAA,CAClEM,CAAAA,CAAanD,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAO,aAAagD,CAAS,CAAA,CACvDI,CAAAA,CAAepD,CAAAA,CAAO,eAAA,CAAgBgD,CAAS,CAAA,CACrDvC,cAAAA,CAAe,IAAM,CACnBwC,CAAAA,EAAQ,CACRE,CAAAA,EAAW,CACXC,IACF,CAAC,EACH,CAAA,KAAO,CACL,IAAMD,EAAanD,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAO,YAAA,CAAa+C,CAAM,CAAA,CACpDK,EAAepD,CAAAA,CAAO,eAAA,CAAgB+C,CAAM,CAAA,CAClDtC,cAAAA,CAAe,IAAM,CACnB0C,CAAAA,EAAW,CACXC,CAAAA,GACF,CAAC,EACH,CAEA,OAAOtC,CACT,CAiBO,SAASuC,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CAGoD,CACpD,GAAI,KAAA,CAAM,OAAA,CAAQA,CAAW,CAAA,CAAG,CAC9B,IAAM5C,CAAAA,CAAY,IAA6C,CAC7D,IAAMC,CAAAA,CAAgD,EAAC,CACvD,IAAA,IAAW4C,CAAAA,IAAQD,CAAAA,CACjB3C,CAAAA,CAAO4C,CAAI,CAAA,CAAIF,CAAAA,CAAa,UAAUE,CAAI,CAAA,CAE5C,OAAO5C,CACT,CAAA,CACME,CAAAA,CAAQC,WAAWJ,CAAAA,EAAW,CAAA,CAC9BH,CAAAA,CAAc8C,CAAAA,CAAa,SAAA,CAAU,IAAM,CAC/CxC,CAAAA,CAAM,KAAA,CAAQH,CAAAA,GAChB,CAAC,CAAA,CACD,OAAAF,cAAAA,CAAeD,CAAW,CAAA,CACnBM,CACT,CAEA,IAAM2C,EAAS1C,UAAAA,CACbuC,CAAAA,CAAa,SAAA,CAAUC,CAAW,CACpC,CAAA,CACM/C,CAAAA,CAAc8C,CAAAA,CAAa,SAAA,CAAU,IAAM,CAC/CG,CAAAA,CAAO,KAAA,CAAQH,CAAAA,CAAa,UAAUC,CAAW,EACnD,CAAC,CAAA,CACD,OAAA9C,cAAAA,CAAeD,CAAW,CAAA,CACnBiD,CACT,CA0CO,SAASC,EAAAA,CACdJ,CAAAA,CACAC,CAAAA,CAIA,CACA,OAAI,KAAA,CAAM,OAAA,CAAQA,CAAW,CAAA,CACpBI,CAAAA,CAA6BL,EAAcC,CAAW,CAAA,CAGxDK,CAAAA,CAA8BN,CAAAA,CAAcC,CAAW,CAChE,CAEA,eAAeK,CAAAA,CACbN,CAAAA,CACAE,CAAAA,CAC4C,CAC5C,IAAMK,CAAAA,CAAgBP,CAAAA,CAAa,SAAA,CAAUE,CAAI,CAAA,CAEjD,GAAIK,CAAAA,CAAc,QAAA,EAAYA,EAAc,SAAA,CAC1C,MAAMA,CAAAA,CAAc,SAAA,CAIlBA,CAAAA,CAAc,SAAA,EAChB,MAAM,IAAI,OAAA,CAAc,CAACC,CAAAA,CAASC,CAAAA,GAAW,CAC3C,IAAMvD,CAAAA,CAAc8C,CAAAA,CAAa,SAAA,CAAU,IAAM,CAC/C,IAAMU,CAAAA,CAAUV,CAAAA,CAAa,SAAA,CAAUE,CAAI,CAAA,CACtCQ,CAAAA,CAAQ,SAAA,GACXxD,CAAAA,GACIwD,CAAAA,CAAQ,QAAA,EAAYA,CAAAA,CAAQ,SAAA,CAC9BD,CAAAA,CAAOC,CAAAA,CAAQ,SAAS,CAAA,CAExBF,CAAAA,EAAQ,EAGd,CAAC,CAAA,CACDrD,cAAAA,CAAeD,CAAW,EAC5B,CAAC,CAAA,CAIH,IAAMiD,CAAAA,CAAS1C,UAAAA,CACbuC,CAAAA,CAAa,SAAA,CAAUE,CAAI,CAC7B,CAAA,CACMhD,CAAAA,CAAc8C,CAAAA,CAAa,SAAA,CAAU,IAAM,CAC/CG,CAAAA,CAAO,KAAA,CAAQH,CAAAA,CAAa,SAAA,CAAUE,CAAI,EAC5C,CAAC,CAAA,CACD,OAAA/C,cAAAA,CAAeD,CAAW,CAAA,CAEnBiD,CACT,CAEA,SAASQ,CAAAA,CACPX,CAAAA,CACAY,CAAAA,CACc,CACd,IAAA,IAAWV,CAAAA,IAAQU,CAAAA,CAAO,CACxB,IAAM,CAAA,CAAIZ,CAAAA,CAAa,SAAA,CAAUE,CAAI,CAAA,CACrC,GAAI,CAAA,CAAE,QAAA,EAAY,CAAA,CAAE,SAAA,CAClB,OAAO,CAAA,CAAE,SAEb,CAEA,OAAO,IACT,CAEA,SAASW,CAAAA,CACPb,CAAAA,CACAY,CAAAA,CACe,CACf,OAAO,IAAI,OAAA,CAAc,CAACJ,CAAAA,CAASC,CAAAA,GAAW,CAC5C,IAAMK,CAAAA,CAAS,IAAM,CAEnB,GAAI,CADYF,CAAAA,CAAM,KAAA,CAAOG,CAAAA,EAAM,CAACf,EAAa,SAAA,CAAUe,CAAC,CAAA,CAAE,SAAS,CAAA,CACzD,OACd7D,GAAY,CACZ,IAAM8D,CAAAA,CAAML,CAAAA,CAAsBX,CAAAA,CAAcY,CAAK,CAAA,CACrD,GAAII,CAAAA,CAAK,CACPP,CAAAA,CAAOO,CAAG,CAAA,CACV,MACF,CACAR,CAAAA,GACF,CAAA,CACMtD,CAAAA,CAAc8C,CAAAA,CAAa,SAAA,CAAUc,CAAM,CAAA,CACjD3D,cAAAA,CAAeD,CAAW,EAC5B,CAAC,CACH,CAEA,eAAemD,CAAAA,CACbL,CAAAA,CACAY,CAAAA,CAC4D,CAE5D,IAAMK,CAAAA,CAAeN,CAAAA,CAAsBX,CAAAA,CAAcY,CAAK,CAAA,CAC9D,GAAIK,CAAAA,CACF,MAAMA,EAIWL,CAAAA,CAAM,IAAA,CAAMG,CAAAA,EAAMf,CAAAA,CAAa,SAAA,CAAUe,CAAC,CAAA,CAAE,SAAS,CAAA,EAEtE,MAAMF,CAAAA,CAAmBb,CAAAA,CAAcY,CAAK,CAAA,CAI9C,IAAMvD,CAAAA,CAAY,IAA6C,CAC7D,IAAMC,CAAAA,CAAgD,EAAC,CACvD,IAAA,IAAW4C,CAAAA,IAAQU,CAAAA,CACjBtD,CAAAA,CAAO4C,CAAI,CAAA,CAAIF,CAAAA,CAAa,UAAUE,CAAI,CAAA,CAG5C,OAAO5C,CACT,CAAA,CACM6C,CAAAA,CAAS1C,WAAWJ,CAAAA,EAAW,CAAA,CAC/BH,CAAAA,CAAc8C,CAAAA,CAAa,SAAA,CAAU,IAAM,CAC/CG,CAAAA,CAAO,KAAA,CAAQ9C,CAAAA,GACjB,CAAC,CAAA,CACD,OAAAF,cAAAA,CAAeD,CAAW,CAAA,CAEnBiD,CACT,CASO,SAASe,GACdxE,CAAAA,CACAyE,CAAAA,CACoB,CACpBvE,YAAAA,CAAa,YAAA,CAAcF,CAAM,EACjC,IAAM0E,CAAAA,CAAcnE,GAAAA,CAAmBP,CAAAA,CAAO,OAAA,CAAQyE,CAAa,CAAC,CAAA,CAI9D1B,CAAAA,CAAS,IAAM,CACnB2B,CAAAA,CAAY,KAAA,CAAQ1E,CAAAA,CAAO,OAAA,CAAQyE,CAAa,EAClD,CAAA,CAEMtB,CAAAA,CAAanD,CAAAA,CAAO,KAAA,CAAM,OAAO,YAAA,CAAa+C,CAAM,CAAA,CACpDK,CAAAA,CAAepD,CAAAA,CAAO,eAAA,CAAgB+C,CAAM,CAAA,CAClD,OAAAtC,cAAAA,CAAe,IAAM,CACnB0C,CAAAA,GACAC,CAAAA,GACF,CAAC,CAAA,CAEMsB,CACT,CAgBO,SAASC,EAAAA,CACd3E,CAAAA,CACA4E,CAAAA,CACuD,CACvD1E,YAAAA,CAAa,qBAAA,CAAuBF,CAAM,EAC1C,IAAM6E,CAAAA,CAAejC,CAAAA,CAAW5C,CAAM,CAAA,CAEtC,OAAO8E,SAAS,IAAM,CAEfD,CAAAA,CAAa,KAAA,CAClB,IAAME,CAAAA,CAAiB/E,EAAO,OAAA,EAAQ,CACtC,OAAK4E,CAAAA,CAEHG,CAAAA,CAAe,WAAA,CAAY,IAAA,CAAMC,CAAAA,EAAMA,CAAAA,CAAE,EAAA,GAAOJ,CAAY,CAAA,EAAK,IAAA,CAFzCG,CAAAA,CAAe,WAI3C,CAAC,CACH,CAiBO,SAASE,EAAAA,CACdjF,CAAAA,CACAsD,EACA4B,CAAAA,CACwB,CACxBhF,YAAAA,CAAa,qBAAA,CAAuBF,CAAM,CAAA,CAC1C,IAAMmF,CAAAA,CAAY5E,GAAAA,CAAI,KAAK,CAAA,CACrB6E,CAAAA,CAAQ7E,GAAAA,CAAkB,IAAI,CAAA,CAChC8E,CAAAA,CAAkC,IAAA,CAClC7E,CAAAA,CAAmC,IAAA,CAEjC8E,CAAAA,CAAW,IAAM,CACjBD,CAAAA,GACFrF,CAAAA,CAAO,OAAA,CAAQqF,CAAQ,CAAA,CACvBA,CAAAA,CAAW,MAEbF,CAAAA,CAAU,KAAA,CAAQ,KAAA,CAClBC,CAAAA,CAAM,KAAA,CAAQ,IAAA,CACd5E,KAAc,CACdA,CAAAA,CAAc,KAChB,CAAA,CAEM+E,CAAAA,CAAUC,CAAAA,EAAyB,CACvCH,CAAAA,CAAWrF,CAAAA,CAAO,WAAA,EAAY,CAC9BmF,CAAAA,CAAU,KAAA,CAAQ,IAAA,CAClBC,EAAM,KAAA,CAAQ,IAAA,CACdpF,CAAAA,CAAO,KAAA,CAAMwF,CAAQ,CAAA,CAGjBlC,GAAgB4B,CAAAA,GAClB1E,CAAAA,IAAc,CACdA,CAAAA,CAAc8C,CAAAA,CAAa,SAAA,CAAU,IAAM,CACzC,IAAMG,CAAAA,CAASH,CAAAA,CAAa,SAAA,CAAU4B,CAAe,CAAA,CACjD,CAACzB,CAAAA,CAAO,SAAA,EAAa,CAACA,CAAAA,CAAO,QAAA,EAC/B4B,CAAAA,CAAW,KACXF,CAAAA,CAAU,KAAA,CAAQ,KAAA,CAClB3E,CAAAA,IAAc,CACdA,CAAAA,CAAc,IAAA,EACLiD,CAAAA,CAAO,QAAA,GAChB2B,CAAAA,CAAM,KAAA,CAAQ3B,CAAAA,CAAO,SAAA,CACrB6B,CAAAA,IAEJ,CAAC,CAAA,EAEL,CAAA,CAEA,OAAA7E,cAAAA,CAAe,IAAM,CACnBD,CAAAA,KACF,CAAC,CAAA,CAEM,CAAE,MAAA,CAAA+E,CAAAA,CAAQ,UAAAJ,CAAAA,CAAW,KAAA,CAAAC,CAAAA,CAAO,QAAA,CAAAE,CAAS,CAC9C,CAgBO,SAASG,EAAAA,CACdzF,CAAAA,CACkD,CAClDE,YAAAA,CAAa,YAAA,CAAcF,CAAM,CAAA,CACjC,IAAMc,CAAAA,CAAQC,UAAAA,CACZ2E,iBAAAA,CAAkB1F,CAAM,CAC1B,CAAA,CACMoC,CAAAA,CAAQpC,CAAAA,CAAO,eAAA,CAAgB,IAAM,CACzCc,CAAAA,CAAM,MAAQ4E,iBAAAA,CAAkB1F,CAAM,EACxC,CAAC,CAAA,CACD,OAAAS,eAAe2B,CAAK,CAAA,CACbtB,CACT,CAmCA,SAAS6E,CAAAA,CAAuBC,EAG9B,CACA,IAAMC,CAAAA,CAAU,CAAC,GAAID,CAAAA,EAAQ,OAAA,EAAW,EAAG,CAAA,CACvCtC,CAAAA,CAEJ,GAAIsC,CAAAA,EAAQ,MAAA,CAAQ,CAClB,IAAME,CAAAA,CAAKC,6BAAAA,EAA8B,CACzCzC,CAAAA,CAAewC,CAAAA,CACfD,EAAQ,IAAA,CAAKC,CAAAA,CAAG,MAAqB,EACvC,CAEA,OAAO,CAAE,OAAA,CAAAD,CAAAA,CAAS,YAAA,CAAAvC,CAAa,CACjC,CAEA,SAAS0C,CAAAA,CACPC,CAAAA,CACAL,CAAAA,CACAC,CAAAA,CACuB,CACvB,IAAMK,CAAAA,CAAe,CACnB,MAAA,CAAQD,CAAAA,CACR,OAAA,CAASJ,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAAIA,EAAU,MAAA,CACxC,KAAA,CAAOD,CAAAA,EAAQ,KAAA,CACf,aAAA,CAAeA,CAAAA,EAAQ,cACvB,MAAA,CAAQA,CAAAA,EAAQ,MAAA,CAChB,UAAA,CAAYA,CAAAA,EAAQ,UAAA,CACpB,YAAA,CAAcA,CAAAA,EAAQ,YACxB,CAAA,CAEA,OAAOO,YAAAA,CAAaD,CAAY,CAClC,CAEA,SAASE,CAAAA,CACPpG,CAAAA,CACAU,CAAAA,CACA2F,CAAAA,CACwE,CACxE,IAAMvF,CAAAA,CAAQC,UAAAA,CACZsF,CAAAA,CACKrG,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAO,UAAS,CAC9BsG,SAAAA,CAAUtG,CAAAA,CAAQU,CAAAA,EAAY,EAAE,CACtC,CAAA,CAEA,GAAI2F,CAAAA,CAAc,CAChB,IAAM7F,CAAAA,CAAcR,CAAAA,CAAO,MAAM,MAAA,CAAO,YAAA,CAAa,IAAM,CACzDc,CAAAA,CAAM,KAAA,CAAQd,EAAO,KAAA,CAAM,MAAA,CAAO,QAAA,GACpC,CAAC,CAAA,CACD,OAAO,CAAE,KAAA,CAAAc,CAAAA,CAAO,WAAA,CAAAN,CAAY,CAC9B,CAEA,GAAIE,CAAAA,EAAYA,CAAAA,CAAS,MAAA,CAAS,CAAA,CAAG,CACnC,IAAMF,EAAcR,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAA,CAAUU,CAAAA,CAAU,IAAM,CAChEI,CAAAA,CAAM,KAAA,CAAQwF,SAAAA,CAAUtG,CAAAA,CAAQU,CAAQ,EAC1C,CAAC,CAAA,CACD,OAAO,CAAE,KAAA,CAAAI,CAAAA,CAAO,WAAA,CAAAN,CAAY,CAC9B,CAEA,OAAO,CAAE,KAAA,CAAAM,CAAAA,CAAO,WAAA,CAAa,IAAK,CACpC,CAEA,SAASyF,CAAAA,CACPvG,CAAAA,CACAwG,CAAAA,CACAH,CAAAA,CAIA,CACA,IAAMI,CAAAA,CAAoBJ,CAAAA,CACtB,MAAA,CAAO,IAAA,CAAKrG,CAAAA,CAAO,QAAU,EAAE,CAAA,CAC9BwG,CAAAA,EAAe,EAAC,CACfE,CAAAA,CAAa,IAA2B,CAC5C,IAAM9F,CAAAA,CAAkC,EAAC,CACzC,IAAA,IAAWC,KAAO4F,CAAAA,CAChB7F,CAAAA,CAAOC,CAAG,CAAA,CAAIb,CAAAA,CAAO,IAAA,CAAKa,CAAG,CAAA,CAE/B,OAAOD,CACT,CAAA,CACME,CAAAA,CAAQC,UAAAA,CAAW2F,GAAY,CAAA,CAC/BlG,CAAAA,CACJiG,CAAAA,CAAkB,MAAA,CAAS,CAAA,CACvBzG,CAAAA,CAAO,SAAA,CAAUyG,CAAAA,CAAmB,IAAM,CACxC3F,CAAAA,CAAM,KAAA,CAAQ4F,CAAAA,GAChB,CAAC,CAAA,CACD,IAAA,CAEN,OAAO,CAAE,KAAA,CAAA5F,EAAO,WAAA,CAAAN,CAAY,CAC9B,CAEO,SAASmG,CAAAA,CACdV,EACAL,CAAAA,CACA,CACA,GAAM,CAAE,OAAA,CAAAC,CAAAA,CAAS,YAAA,CAAAvC,CAAa,CAAA,CAAIqC,CAAAA,CAAuBC,CAAM,CAAA,CACzD5F,CAAAA,CAASgG,CAAAA,CAAuBC,EAAWL,CAAAA,CAAQC,CAAO,CAAA,CAG5D,OAAO,MAAA,CAAW,GAAA,CACpB7F,EAAO,KAAA,EAAM,CAEbA,CAAAA,CAAO,UAAA,EAAW,CAGpBS,cAAAA,CAAe,IAAM,CAQnBT,CAAAA,CAAO,YAAA,EAAa,CAAE,KAAA,CAAOsE,CAAAA,EAAiB,CACxCxE,CAAAA,EACF,OAAA,CAAQ,IAAA,CAAK,mDAAA,CAAqDwE,CAAG,EACzE,CAAC,EACH,CAAC,CAAA,CAED,IAAM5D,CAAAA,CAAWkF,CAAAA,EAAQ,KAAA,CACnBY,EAAcZ,CAAAA,EAAQ,OAAA,CACtBS,CAAAA,CAAe,CAAC3F,CAAAA,EAAY,CAAC8F,EAE7B,CAAE,KAAA,CAAOI,CAAAA,CAAY,WAAA,CAAazD,CAAW,CAAA,CAAIiD,CAAAA,CACrDpG,CAAAA,CACAU,CAAAA,CACA2F,CACF,CAAA,CACM,CAAE,KAAA,CAAOQ,CAAAA,CAAc,YAAaC,CAAa,CAAA,CAAIP,CAAAA,CACzDvG,CAAAA,CACAwG,CAAAA,CACAH,CACF,EAEA5F,cAAAA,CAAe,IAAM,CACnB0C,CAAAA,IAAa,CACb2D,CAAAA,KACF,CAAC,CAAA,CAED,IAAMC,CAAAA,CAAS/G,CAAAA,CAAO,MAAA,CAGtB,OAAO,CACL,MAAA,CAAAA,CAAAA,CACA,KAAA,CAAO4G,CAAAA,CACP,OAAA,CAASC,CAAAA,CACT,OAAAE,CAAAA,CACA,QAAA,CAPgBvE,CAAAA,EAA0BxC,CAAAA,CAAO,QAAA,CAASwC,CAAK,EAQ/D,YAAA,CAAAc,CACF,CACF,CAMO,SAAS0D,EAAAA,EAkBd,CACA,OAAO,CACL,OAAA,CAAS,CACPhH,CAAAA,CACAK,CAAAA,GAEAN,CAAAA,CAAQC,CAAAA,CAAmCK,CAAO,CAAA,CAGpD,UAAA,CAAY,CACVL,CAAAA,CACAoB,CAAAA,GAEAJ,EAAWhB,CAAAA,CAAmCoB,CAAY,CAAA,CAG5D,WAAA,CAAcpB,CAAAA,EACJwC,CAAAA,EAA0B,CAChCxC,CAAAA,CAAO,QAAA,CAASwC,CAAK,EACvB,CAAA,CAEF,SAAA,CAAYxC,GAAkCyC,CAAAA,CAAazC,CAAM,CAAA,CACjE,QAAA,CAAU,CACRA,CAAAA,CACAa,CAAAA,CACA8B,CAAAA,GACGD,CAAAA,CAAS1C,CAAAA,CAAmCa,CAAAA,CAAK8B,CAAQ,CAChE,CACF,CAoBO,SAASsE,EAAAA,CACdjH,CAAAA,CACAkH,CAAAA,CACA1F,CAAAA,CACQ,CACR,IAAMlB,CAAAA,CAAQC,GAAAA,CAAIiB,CAAAA,CAASxB,CAAM,CAAC,CAAA,CAC5BQ,CAAAA,CAAcR,EAAO,SAAA,CAAUkH,CAAAA,CAAM,IAAM,CAC/C5G,CAAAA,CAAM,KAAA,CAAQkB,CAAAA,CAASxB,CAAM,EAC/B,CAAC,CAAA,CACD,OAAAS,cAAAA,CAAeD,CAAW,EAEnBF,CACT,CAMA,IAAI6G,CAAAA,CACF,IAAA,CAEF,SAASC,IAAuB,CAC9B,GAAI,CAACD,CAAAA,CACH,GAAI,CAGFA,EADY,CAAA,CAAQ,sBAAsB,CAAA,CACjB,kBAC3B,CAAA,KAAQ,CACN,MAAM,IAAI,KAAA,CACR,mGAEF,CACF,CAGF,OAAOA,CACT,CAsBO,SAASE,EAAAA,CAOdzB,CAAAA,CAAoC,CAEpC,IAAM5F,CAAAA,CADoBoH,IAAqB,CACdxB,CAAM,CAAA,CAGvC,OAAI,OAAO,MAAA,CAAW,KAAe,CAAC5F,CAAAA,CAAO,SAAA,EAC3CA,CAAAA,CAAO,KAAA,EAAM,CAGfS,cAAAA,CAAe,IAAM,CAQnBT,CAAAA,CAAO,YAAA,EAAa,CAAE,KAAA,CAAOsE,CAAAA,EAAiB,CACxCxE,CAAAA,EACF,OAAA,CAAQ,IAAA,CAAK,mDAAA,CAAqDwE,CAAG,EACzE,CAAC,EACH,CAAC,CAAA,CAEMtE,CACT,CAOA,IAAMsH,EAAuD,MAAA,CAC3D,qBACF,CAAA,CAeaC,EAAAA,CAAoBC,eAAAA,CAAgB,CAC/C,IAAA,CAAM,mBAAA,CACN,KAAA,CAAO,CACL,QAAA,CAAU,CAAE,IAAA,CAAM,MAAA,CAAQ,SAAU,IAAK,CAC3C,CAAA,CACA,KAAA,CAAMC,CAAAA,CAAO,CAAE,MAAAC,CAAM,CAAA,CAAG,CACtB,OAAAC,OAAAA,CAAQL,CAAAA,CAAeG,EAAM,QAAmC,CAAA,CAEzD,IAAMC,CAAAA,CAAM,OAAA,IACrB,CACF,CAAC,EAeM,SAASE,EAAAA,CACd3B,CAAAA,CACAL,CAAAA,CACuB,CACvB,IAAMP,CAAAA,CAAWwC,MAAAA,CAAOP,CAAAA,CAAe,MAAS,CAAA,CAC1CQ,CAAAA,CAAcC,oBAClB1C,CAAAA,CACAO,CAAAA,EAAQ,YACV,CAAA,CACM,CAAE,MAAA,CAAA5F,CAAO,CAAA,CAAI2G,CAAAA,CAAaV,CAAAA,CAAW,CACzC,GAAGL,CAAAA,CACH,YAAA,CAAckC,CAChB,CAAC,CAAA,CAED,OAAO9H,CACT,CAmCO,SAASgI,GACdC,CAAAA,CACAC,CAAAA,CAAsB,EAAC,CACvBC,CAAAA,CAA4B,GACO,CACnC,IAAMC,CAAAA,CAAkBD,CAAAA,CAAK,MAAA,EAAU,GAAA,CACjCE,EAAS,IAAA,CAAK,GAAA,CAAI,EAAA,CAAID,CAAe,CAAA,CAE3C,GAAItI,CAAAA,GACEqI,CAAAA,CAAK,MAAA,GAAW,MAAA,EAAaA,CAAAA,CAAK,MAAA,CAAS,EAAA,EAC7C,OAAA,CAAQ,KACN,CAAA,oCAAA,EAAuCA,CAAAA,CAAK,MAAM,CAAA,4CAAA,CACpD,CAAA,CAEEE,CAAAA,CAAS,KAAK,CAChB,IAAMC,CAAAA,CAAaL,CAAAA,CAAO,MAAA,EAAO,CAAE,QAAQ,MAAA,CACvCK,CAAAA,CAAa,GAAA,EACf,OAAA,CAAQ,IAAA,CACN,CAAA,2CAAA,EAA8CD,CAAM,CAAA,cAAA,EAAiBC,CAAU,CAAA,oGAAA,CACjF,EAEJ,CAGF,IAAMC,CAAAA,CAAUxH,WAAkCkH,CAAAA,CAAO,KAAA,CAAMC,CAAM,CAAC,CAAA,CAChEM,CAAAA,CAAa,WAAA,CAAY,IAAM,CACnCD,CAAAA,CAAQ,KAAA,CAAQN,CAAAA,CAAO,KAAA,CAAMC,CAAM,EACrC,CAAA,CAAGG,CAAM,CAAA,CAET,OAAA5H,cAAAA,CAAe,IAAM,CACnB,aAAA,CAAc+H,CAAU,EAC1B,CAAC,CAAA,CAEMD,CACT","file":"index.js","sourcesContent":["export default typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\";\n","/**\n * Vue Adapter - Vue 3 composables for Directive\n *\n * Exports: useFact, useDerived, useDispatch, useSelector,\n * useWatch, useInspect, useRequirementStatus, useSuspenseRequirement,\n * useEvents, useExplain, useConstraintStatus, useOptimisticUpdate,\n * useDirective, useHistory, createTypedHooks, shallowEqual\n */\n\nimport type {\n ErrorBoundaryConfig,\n InferDerivations,\n InferEvents,\n InferFacts,\n InferSelectorState,\n ModuleDef,\n ModuleSchema,\n ModulesMap,\n NamespacedSystem,\n Plugin,\n SingleModuleSystem,\n SystemSnapshot,\n TraceOption,\n} from \"@directive-run/core\";\nimport {\n createRequirementStatusPlugin,\n createSystem,\n} from \"@directive-run/core\";\nimport type { RequirementTypeStatus } from \"@directive-run/core\";\nimport {\n type ConstraintInfo,\n type InspectState,\n assertSystem,\n buildHistoryState,\n computeInspectState,\n createThrottle,\n defaultEquality,\n depsChanged,\n mergeHydrationFacts,\n pickFacts,\n runTrackedSelector,\n shallowEqual,\n} from \"@directive-run/core/adapter-utils\";\nimport {\n type ComputedRef,\n type InjectionKey,\n type Ref,\n type ShallowRef,\n computed,\n defineComponent,\n inject,\n onScopeDispose,\n provide,\n ref,\n shallowRef,\n} from \"vue\";\nimport isDevelopment from \"#is-development\";\n\n// Re-export for convenience\nexport type { RequirementTypeStatus, InspectState, ConstraintInfo };\nexport { shallowEqual };\n\n/** Type for the requirement status plugin return value */\nexport type StatusPlugin = ReturnType<typeof createRequirementStatusPlugin>;\n\n// ============================================================================\n// useFact — single key or multi key\n// ============================================================================\n\n/** Single key overload */\nexport function useFact<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(system: SingleModuleSystem<S>, factKey: K): Ref<InferFacts<S>[K] | undefined>;\n/** Multi-key overload */\nexport function useFact<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(\n system: SingleModuleSystem<S>,\n factKeys: K[],\n): ShallowRef<Pick<InferFacts<S>, K>>;\n/** Implementation */\nexport function useFact(\n system: SingleModuleSystem<any>,\n keyOrKeys: string | string[],\n): Ref<unknown> | ShallowRef<unknown> {\n assertSystem(\"useFact\", system);\n if (isDevelopment && typeof keyOrKeys === \"function\") {\n console.error(\n \"[Directive] useFact() received a function. Did you mean useSelector()? \" +\n \"useFact() takes a string key or array of keys, not a selector function.\",\n );\n }\n\n // Multi-key path: useFact(system, [keys])\n if (Array.isArray(keyOrKeys)) {\n return _useFactMulti(system, keyOrKeys);\n }\n\n // Single key path: useFact(system, key)\n return _useFactSingle(system, keyOrKeys);\n}\n\nfunction _useFactSingle(\n system: SingleModuleSystem<any>,\n factKey: string,\n): Ref<unknown> {\n if (isDevelopment) {\n if (!system.facts.$store.has(factKey)) {\n console.warn(\n `[Directive] useFact(\"${factKey}\") — fact not found in store. ` +\n `Check that \"${factKey}\" is defined in your module's schema.`,\n );\n }\n }\n\n const value = ref(system.facts.$store.get(factKey));\n const unsubscribe = system.facts.$store.subscribe([factKey], () => {\n value.value = system.facts.$store.get(factKey);\n });\n onScopeDispose(unsubscribe);\n return value;\n}\n\nfunction _useFactMulti(\n system: SingleModuleSystem<any>,\n factKeys: string[],\n): ShallowRef<Record<string, unknown>> {\n const getValues = (): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const key of factKeys) {\n result[key] = system.facts.$store.get(key);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = system.facts.$store.subscribe(factKeys, () => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n}\n\n// ============================================================================\n// useDerived — single key or multi key\n// ============================================================================\n\n/** Single key overload */\nexport function useDerived<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(system: SingleModuleSystem<S>, derivationId: K): Ref<InferDerivations<S>[K]>;\n/** Multi-key overload */\nexport function useDerived<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(\n system: SingleModuleSystem<S>,\n derivationIds: K[],\n): ShallowRef<Pick<InferDerivations<S>, K>>;\n/** Implementation */\nexport function useDerived(\n system: SingleModuleSystem<any>,\n idOrIds: string | string[],\n): Ref<unknown> | ShallowRef<unknown> {\n assertSystem(\"useDerived\", system);\n if (isDevelopment && typeof idOrIds === \"function\") {\n console.error(\n \"[Directive] useDerived() received a function. Did you mean useSelector()? \" +\n \"useDerived() takes a string key or array of keys, not a selector function.\",\n );\n }\n\n // Multi-key path\n if (Array.isArray(idOrIds)) {\n return _useDerivedMulti(system, idOrIds);\n }\n\n // Single key path\n return _useDerivedSingle(system, idOrIds);\n}\n\nfunction _useDerivedSingle(\n system: SingleModuleSystem<any>,\n derivationId: string,\n): Ref<unknown> {\n if (isDevelopment) {\n const initialValue = system.read(derivationId);\n if (initialValue === undefined) {\n console.warn(\n `[Directive] useDerived(\"${derivationId}\") returned undefined. ` +\n `Check that \"${derivationId}\" is defined in your module's derive property.`,\n );\n }\n }\n const value = ref(system.read(derivationId));\n const unsubscribe = system.subscribe([derivationId], () => {\n value.value = system.read(derivationId);\n });\n onScopeDispose(unsubscribe);\n return value;\n}\n\nfunction _useDerivedMulti(\n system: SingleModuleSystem<any>,\n derivationIds: string[],\n): ShallowRef<Record<string, unknown>> {\n const getValues = (): Record<string, unknown> => {\n const result: Record<string, unknown> = {};\n for (const id of derivationIds) {\n result[id] = system.read(id);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = system.subscribe(derivationIds, () => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n}\n\n// ============================================================================\n// useSelector — auto-tracking selector over facts and derivations\n// ============================================================================\n\n/**\n * Auto-tracking selector over facts and derivations.\n * Uses `withTracking()` to detect which facts the selector accesses,\n * then subscribes only to those keys.\n */\nexport function useSelector<S extends ModuleSchema, R>(\n system: SingleModuleSystem<S>,\n selector: (state: InferSelectorState<S>) => R,\n equalityFn?: (a: R, b: R) => boolean,\n): Ref<R>;\nexport function useSelector(\n system: SingleModuleSystem<any>,\n selector: (state: Record<string, unknown>) => unknown,\n equalityFn: (a: unknown, b: unknown) => boolean = defaultEquality,\n): Ref<unknown> {\n assertSystem(\"useSelector\", system);\n const deriveKeySet = new Set(Object.keys(system.derive ?? {}));\n\n const runWithTracking = () =>\n runTrackedSelector(system, deriveKeySet, selector);\n\n const initial = runWithTracking();\n let trackedFactKeys = initial.factKeys;\n let trackedDeriveKeys = initial.deriveKeys;\n const selected = ref(initial.value);\n\n const unsubs: Array<() => void> = [];\n\n const resubscribe = () => {\n for (const unsub of unsubs) unsub();\n unsubs.length = 0;\n\n const onUpdate = () => {\n const result = runWithTracking();\n if (!equalityFn(selected.value, result.value)) {\n selected.value = result.value;\n }\n // Re-track: check if deps changed\n if (\n depsChanged(\n trackedFactKeys,\n result.factKeys,\n trackedDeriveKeys,\n result.deriveKeys,\n )\n ) {\n trackedFactKeys = result.factKeys;\n trackedDeriveKeys = result.deriveKeys;\n resubscribe();\n }\n };\n\n if (trackedFactKeys.length > 0) {\n unsubs.push(system.facts.$store.subscribe(trackedFactKeys, onUpdate));\n } else if (trackedDeriveKeys.length === 0) {\n unsubs.push(system.facts.$store.subscribeAll(onUpdate));\n }\n if (trackedDeriveKeys.length > 0) {\n unsubs.push(system.subscribe(trackedDeriveKeys, onUpdate));\n }\n };\n\n resubscribe();\n\n onScopeDispose(() => {\n for (const unsub of unsubs) unsub();\n });\n\n return selected;\n}\n\n// ============================================================================\n// useDispatch\n// ============================================================================\n\nexport function useDispatch<S extends ModuleSchema>(\n system: SingleModuleSystem<S>,\n): (event: InferEvents<S>) => void {\n assertSystem(\"useDispatch\", system);\n return (event: InferEvents<S>) => {\n system.dispatch(event);\n };\n}\n\n// ============================================================================\n// useEvents — memoized events reference\n// ============================================================================\n\n/**\n * Returns the system's events dispatcher.\n */\nexport function useEvents<S extends ModuleSchema>(\n system: SingleModuleSystem<S>,\n): SingleModuleSystem<S>[\"events\"] {\n assertSystem(\"useEvents\", system);\n return system.events;\n}\n\n// ============================================================================\n// useWatch — derivation or fact side-effect\n// ============================================================================\n\n/** Watch a derivation or fact by key (auto-detected). When a key exists in both facts and derivations, the derivation overload takes priority. */\nexport function useWatch<\n S extends ModuleSchema,\n K extends keyof InferDerivations<S> & string,\n>(\n system: SingleModuleSystem<S>,\n key: K,\n callback: (\n newValue: InferDerivations<S>[K],\n previousValue: InferDerivations<S>[K] | undefined,\n ) => void,\n): void;\n/** Watch a fact key with auto-detection. */\nexport function useWatch<\n S extends ModuleSchema,\n K extends keyof InferFacts<S> & string,\n>(\n system: SingleModuleSystem<S>,\n key: K,\n callback: (\n newValue: InferFacts<S>[K] | undefined,\n previousValue: InferFacts<S>[K] | undefined,\n ) => void,\n): void;\n/** Implementation */\nexport function useWatch(\n system: SingleModuleSystem<any>,\n key: string,\n callback: (newValue: unknown, prevValue: unknown) => void,\n): void {\n assertSystem(\"useWatch\", system);\n\n const unsubscribe = system.watch(key, callback);\n onScopeDispose(unsubscribe);\n}\n\n// ============================================================================\n// useInspect — consolidated inspection hook\n// ============================================================================\n\n/** Options for useInspect */\nexport interface UseInspectOptions {\n throttleMs?: number;\n}\n\n/**\n * Consolidated system inspection hook.\n * Returns InspectState with optional throttling.\n */\nexport function useInspect(\n system: SingleModuleSystem<any>,\n options?: UseInspectOptions,\n): ShallowRef<InspectState> {\n assertSystem(\"useInspect\", system);\n const state = shallowRef<InspectState>(computeInspectState(system));\n\n const update = () => {\n state.value = computeInspectState(system);\n };\n\n if (options?.throttleMs && options.throttleMs > 0) {\n const { throttled, cleanup } = createThrottle(update, options.throttleMs);\n const unsubFacts = system.facts.$store.subscribeAll(throttled);\n const unsubSettled = system.onSettledChange(throttled);\n onScopeDispose(() => {\n cleanup();\n unsubFacts();\n unsubSettled();\n });\n } else {\n const unsubFacts = system.facts.$store.subscribeAll(update);\n const unsubSettled = system.onSettledChange(update);\n onScopeDispose(() => {\n unsubFacts();\n unsubSettled();\n });\n }\n\n return state;\n}\n\n// ============================================================================\n// useRequirementStatus — single or multi\n// ============================================================================\n\n/** Single type overload */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n type: string,\n): ShallowRef<RequirementTypeStatus>;\n/** Multi-type overload */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n types: string[],\n): ShallowRef<Record<string, RequirementTypeStatus>>;\n/** Implementation */\nexport function useRequirementStatus(\n statusPlugin: StatusPlugin,\n typeOrTypes: string | string[],\n):\n | ShallowRef<RequirementTypeStatus>\n | ShallowRef<Record<string, RequirementTypeStatus>> {\n if (Array.isArray(typeOrTypes)) {\n const getValues = (): Record<string, RequirementTypeStatus> => {\n const result: Record<string, RequirementTypeStatus> = {};\n for (const type of typeOrTypes) {\n result[type] = statusPlugin.getStatus(type);\n }\n return result;\n };\n const state = shallowRef(getValues());\n const unsubscribe = statusPlugin.subscribe(() => {\n state.value = getValues();\n });\n onScopeDispose(unsubscribe);\n return state;\n }\n\n const status = shallowRef<RequirementTypeStatus>(\n statusPlugin.getStatus(typeOrTypes),\n );\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = statusPlugin.getStatus(typeOrTypes);\n });\n onScopeDispose(unsubscribe);\n return status;\n}\n\n// ============================================================================\n// useSuspenseRequirement — async setup() Suspense integration\n// ============================================================================\n\n/**\n * Returns a promise that resolves when a requirement type settles.\n * Designed for Vue's async `setup()` with `<Suspense>`.\n *\n * - If the requirement is loading, the returned promise suspends the component.\n * - If the requirement has an error, the promise rejects with that error.\n * - If the requirement is already settled, resolves immediately.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useSuspenseRequirement } from '@directive-run/vue';\n *\n * // In async setup(), this suspends until FETCH_USER settles\n * const status = await useSuspenseRequirement(statusPlugin, \"FETCH_USER\");\n * </script>\n *\n * <template>\n * <div>Resolved: {{ status.resolvedCount }}</div>\n * </template>\n * ```\n */\n\n/** Single type overload */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n type: string,\n): Promise<ShallowRef<RequirementTypeStatus>>;\n\n/** Multi-type overload */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<ShallowRef<Record<string, RequirementTypeStatus>>>;\n\n/** Implementation */\nexport function useSuspenseRequirement(\n statusPlugin: StatusPlugin,\n typeOrTypes: string | string[],\n): Promise<\n | ShallowRef<RequirementTypeStatus>\n | ShallowRef<Record<string, RequirementTypeStatus>>\n> {\n if (Array.isArray(typeOrTypes)) {\n return _useSuspenseRequirementMulti(statusPlugin, typeOrTypes);\n }\n\n return _useSuspenseRequirementSingle(statusPlugin, typeOrTypes);\n}\n\nasync function _useSuspenseRequirementSingle(\n statusPlugin: StatusPlugin,\n type: string,\n): Promise<ShallowRef<RequirementTypeStatus>> {\n const initialStatus = statusPlugin.getStatus(type);\n\n if (initialStatus.hasError && initialStatus.lastError) {\n throw initialStatus.lastError;\n }\n\n // If loading, wait for it to settle\n if (initialStatus.isLoading) {\n await new Promise<void>((resolve, reject) => {\n const unsubscribe = statusPlugin.subscribe(() => {\n const current = statusPlugin.getStatus(type);\n if (!current.isLoading) {\n unsubscribe();\n if (current.hasError && current.lastError) {\n reject(current.lastError);\n } else {\n resolve();\n }\n }\n });\n onScopeDispose(unsubscribe);\n });\n }\n\n // Now settled — return a reactive ref that continues tracking\n const status = shallowRef<RequirementTypeStatus>(\n statusPlugin.getStatus(type),\n );\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = statusPlugin.getStatus(type);\n });\n onScopeDispose(unsubscribe);\n\n return status;\n}\n\nfunction _findFirstStatusError(\n statusPlugin: StatusPlugin,\n types: string[],\n): Error | null {\n for (const type of types) {\n const s = statusPlugin.getStatus(type);\n if (s.hasError && s.lastError) {\n return s.lastError;\n }\n }\n\n return null;\n}\n\nfunction _waitForAllSettled(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const onTick = () => {\n const allDone = types.every((t) => !statusPlugin.getStatus(t).isLoading);\n if (!allDone) return;\n unsubscribe();\n const err = _findFirstStatusError(statusPlugin, types);\n if (err) {\n reject(err);\n return;\n }\n resolve();\n };\n const unsubscribe = statusPlugin.subscribe(onTick);\n onScopeDispose(unsubscribe);\n });\n}\n\nasync function _useSuspenseRequirementMulti(\n statusPlugin: StatusPlugin,\n types: string[],\n): Promise<ShallowRef<Record<string, RequirementTypeStatus>>> {\n // Check for immediate errors\n const initialError = _findFirstStatusError(statusPlugin, types);\n if (initialError) {\n throw initialError;\n }\n\n // If any are loading, wait for all to settle\n const anyLoading = types.some((t) => statusPlugin.getStatus(t).isLoading);\n if (anyLoading) {\n await _waitForAllSettled(statusPlugin, types);\n }\n\n // Now settled — return a reactive ref that continues tracking\n const getValues = (): Record<string, RequirementTypeStatus> => {\n const result: Record<string, RequirementTypeStatus> = {};\n for (const type of types) {\n result[type] = statusPlugin.getStatus(type);\n }\n\n return result;\n };\n const status = shallowRef(getValues());\n const unsubscribe = statusPlugin.subscribe(() => {\n status.value = getValues();\n });\n onScopeDispose(unsubscribe);\n\n return status;\n}\n\n// ============================================================================\n// useExplain — reactive requirement explanation\n// ============================================================================\n\n/**\n * Reactively returns the explanation string for a requirement.\n */\nexport function useExplain(\n system: SingleModuleSystem<any>,\n requirementId: string,\n): Ref<string | null> {\n assertSystem(\"useExplain\", system);\n const explanation = ref<string | null>(system.explain(requirementId)) as Ref<\n string | null\n >;\n\n const update = () => {\n explanation.value = system.explain(requirementId);\n };\n\n const unsubFacts = system.facts.$store.subscribeAll(update);\n const unsubSettled = system.onSettledChange(update);\n onScopeDispose(() => {\n unsubFacts();\n unsubSettled();\n });\n\n return explanation;\n}\n\n// ============================================================================\n// useConstraintStatus — reactive constraint inspection\n// ============================================================================\n\n/** Get all constraints */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n): ComputedRef<ConstraintInfo[]>;\n/** Get a single constraint by ID */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n constraintId: string,\n): ComputedRef<ConstraintInfo | null>;\n/** Implementation */\nexport function useConstraintStatus(\n system: SingleModuleSystem<any>,\n constraintId?: string,\n): ComputedRef<ConstraintInfo[] | ConstraintInfo | null> {\n assertSystem(\"useConstraintStatus\", system);\n const inspectState = useInspect(system);\n\n return computed(() => {\n // Track reactivity via inspectState, but use full inspect() for constraint list\n void inspectState.value;\n const fullInspection = system.inspect();\n if (!constraintId) return fullInspection.constraints;\n return (\n fullInspection.constraints.find((c) => c.id === constraintId) ?? null\n );\n });\n}\n\n// ============================================================================\n// useOptimisticUpdate — batch with rollback on failure\n// ============================================================================\n\nexport interface OptimisticUpdateResult {\n mutate: (updateFn: () => void) => void;\n isPending: Ref<boolean>;\n error: Ref<Error | null>;\n rollback: () => void;\n}\n\n/**\n * Optimistic update hook. Saves a snapshot before mutating, monitors\n * a requirement type via statusPlugin, and rolls back on failure.\n */\nexport function useOptimisticUpdate(\n system: SingleModuleSystem<any>,\n statusPlugin?: StatusPlugin,\n requirementType?: string,\n): OptimisticUpdateResult {\n assertSystem(\"useOptimisticUpdate\", system);\n const isPending = ref(false);\n const error = ref<Error | null>(null) as Ref<Error | null>;\n let snapshot: SystemSnapshot | null = null;\n let unsubscribe: (() => void) | null = null;\n\n const rollback = () => {\n if (snapshot) {\n system.restore(snapshot);\n snapshot = null;\n }\n isPending.value = false;\n error.value = null;\n unsubscribe?.();\n unsubscribe = null;\n };\n\n const mutate = (updateFn: () => void) => {\n snapshot = system.getSnapshot();\n isPending.value = true;\n error.value = null;\n system.batch(updateFn);\n\n // Watch for resolver completion/failure\n if (statusPlugin && requirementType) {\n unsubscribe?.();\n unsubscribe = statusPlugin.subscribe(() => {\n const status = statusPlugin.getStatus(requirementType);\n if (!status.isLoading && !status.hasError) {\n snapshot = null;\n isPending.value = false;\n unsubscribe?.();\n unsubscribe = null;\n } else if (status.hasError) {\n error.value = status.lastError;\n rollback();\n }\n });\n }\n };\n\n onScopeDispose(() => {\n unsubscribe?.();\n });\n\n return { mutate, isPending, error, rollback };\n}\n\n// ============================================================================\n// useHistory — reactive history state\n// ============================================================================\n\n/**\n * Reactive history composable. Returns a ShallowRef that updates\n * when snapshots are taken or navigation occurs.\n *\n * @example\n * ```vue\n * const history = useHistory(system);\n * <button :disabled=\"!history.value?.canGoBack\" @click=\"history.value?.goBack()\">Undo</button>\n * ```\n */\nexport function useHistory(\n system: SingleModuleSystem<any>,\n): ShallowRef<ReturnType<typeof buildHistoryState>> {\n assertSystem(\"useHistory\", system);\n const state = shallowRef<ReturnType<typeof buildHistoryState>>(\n buildHistoryState(system),\n );\n const unsub = system.onHistoryChange(() => {\n state.value = buildHistoryState(system);\n });\n onScopeDispose(unsub);\n return state;\n}\n\n// ============================================================================\n// Scoped System Composable\n// ============================================================================\n\n/** Configuration for useDirective */\ninterface UseDirectiveConfig {\n plugins?: Plugin<any>[];\n trace?: TraceOption;\n errorBoundary?: ErrorBoundaryConfig;\n tickMs?: number;\n zeroConfig?: boolean;\n initialFacts?: Record<string, any>;\n status?: boolean;\n /** Fact keys to subscribe to (omit for all) */\n facts?: string[];\n /** Derivation keys to subscribe to (omit for all) */\n derived?: string[];\n}\n\n/**\n * Create a scoped Directive system with automatic lifecycle management.\n * When no `facts` or `derived` keys are specified, subscribes to ALL\n * facts and derivations and returns reactive state.\n *\n * @example\n * ```vue\n * // Subscribe to everything\n * const { facts, derived, events, dispatch } = useDirective(counterModule);\n *\n * // Selective keys\n * const { facts, derived } = useDirective(counterModule, { facts: [\"count\"], derived: [\"doubled\"] });\n * ```\n */\nfunction _buildDirectivePlugins(config: UseDirectiveConfig | undefined): {\n plugins: Plugin<ModuleSchema>[];\n statusPlugin: StatusPlugin | undefined;\n} {\n const plugins = [...(config?.plugins ?? [])] as Plugin<ModuleSchema>[];\n let statusPlugin: StatusPlugin | undefined;\n\n if (config?.status) {\n const sp = createRequirementStatusPlugin();\n statusPlugin = sp;\n plugins.push(sp.plugin as Plugin<any>);\n }\n\n return { plugins, statusPlugin };\n}\n\nfunction _createDirectiveSystem<M extends ModuleSchema>(\n moduleDef: ModuleDef<M>,\n config: UseDirectiveConfig | undefined,\n plugins: Plugin<ModuleSchema>[],\n): SingleModuleSystem<M> {\n const systemConfig = {\n module: moduleDef,\n plugins: plugins.length > 0 ? plugins : undefined,\n trace: config?.trace,\n errorBoundary: config?.errorBoundary,\n tickMs: config?.tickMs,\n zeroConfig: config?.zeroConfig,\n initialFacts: config?.initialFacts,\n } as any;\n\n return createSystem(systemConfig) as unknown as SingleModuleSystem<M>;\n}\n\nfunction _subscribeFacts<M extends ModuleSchema>(\n system: SingleModuleSystem<M>,\n factKeys: string[] | undefined,\n subscribeAll: boolean,\n): { state: ShallowRef<InferFacts<M>>; unsubscribe: (() => void) | null } {\n const state = shallowRef(\n subscribeAll\n ? (system.facts.$store.toObject() as InferFacts<M>)\n : pickFacts(system, factKeys ?? []),\n ) as ShallowRef<InferFacts<M>>;\n\n if (subscribeAll) {\n const unsubscribe = system.facts.$store.subscribeAll(() => {\n state.value = system.facts.$store.toObject() as InferFacts<M>;\n });\n return { state, unsubscribe };\n }\n\n if (factKeys && factKeys.length > 0) {\n const unsubscribe = system.facts.$store.subscribe(factKeys, () => {\n state.value = pickFacts(system, factKeys) as InferFacts<M>;\n });\n return { state, unsubscribe };\n }\n\n return { state, unsubscribe: null };\n}\n\nfunction _subscribeDerived<M extends ModuleSchema>(\n system: SingleModuleSystem<M>,\n derivedKeys: string[] | undefined,\n subscribeAll: boolean,\n): {\n state: ShallowRef<InferDerivations<M>>;\n unsubscribe: (() => void) | null;\n} {\n const allDerivationKeys = subscribeAll\n ? Object.keys(system.derive ?? {})\n : (derivedKeys ?? []);\n const getDerived = (): InferDerivations<M> => {\n const result: Record<string, unknown> = {};\n for (const key of allDerivationKeys) {\n result[key] = system.read(key);\n }\n return result as InferDerivations<M>;\n };\n const state = shallowRef(getDerived()) as ShallowRef<InferDerivations<M>>;\n const unsubscribe =\n allDerivationKeys.length > 0\n ? system.subscribe(allDerivationKeys, () => {\n state.value = getDerived();\n })\n : null;\n\n return { state, unsubscribe };\n}\n\nexport function useDirective<M extends ModuleSchema>(\n moduleDef: ModuleDef<M>,\n config?: UseDirectiveConfig,\n) {\n const { plugins, statusPlugin } = _buildDirectivePlugins(config);\n const system = _createDirectiveSystem(moduleDef, config, plugins);\n\n // SSR guard: initialize facts for SSR rendering, start reconciliation only in the browser\n if (typeof window !== \"undefined\") {\n system.start();\n } else {\n system.initialize();\n }\n\n onScopeDispose(() => {\n // RFC 0009 follow-up: use destroyAsync so source\n // unsubscribes actually complete (e.g. Supabase `channel.unsubscribe()`\n // returns a Promise the sync `destroy()` would have dropped on\n // the floor). The framework's onScopeDispose is sync, so we\n // fire-and-forget with a swallow-catch — broker drops finish in\n // the background; any unsubscribe rejection is already routed\n // through the manager's runtime-phase observability sink.\n system.destroyAsync().catch((err: unknown) => {\n if (isDevelopment)\n console.warn(\"[Directive] destroyAsync rejected during unmount:\", err);\n });\n });\n\n const factKeys = config?.facts;\n const derivedKeys = config?.derived;\n const subscribeAll = !factKeys && !derivedKeys;\n\n const { state: factsState, unsubscribe: unsubFacts } = _subscribeFacts(\n system,\n factKeys,\n subscribeAll,\n );\n const { state: derivedState, unsubscribe: unsubDerived } = _subscribeDerived(\n system,\n derivedKeys,\n subscribeAll,\n );\n\n onScopeDispose(() => {\n unsubFacts?.();\n unsubDerived?.();\n });\n\n const events = system.events;\n const dispatch = (event: InferEvents<M>) => system.dispatch(event);\n\n return {\n system,\n facts: factsState as ShallowRef<InferFacts<M>>,\n derived: derivedState as ShallowRef<InferDerivations<M>>,\n events,\n dispatch,\n statusPlugin,\n };\n}\n\n// ============================================================================\n// Typed Hooks Factory\n// ============================================================================\n\nexport function createTypedHooks<M extends ModuleSchema>(): {\n useFact: <K extends keyof InferFacts<M> & string>(\n system: SingleModuleSystem<M>,\n factKey: K,\n ) => Ref<InferFacts<M>[K] | undefined>;\n useDerived: <K extends keyof InferDerivations<M> & string>(\n system: SingleModuleSystem<M>,\n derivationId: K,\n ) => Ref<InferDerivations<M>[K]>;\n useDispatch: (\n system: SingleModuleSystem<M>,\n ) => (event: InferEvents<M>) => void;\n useEvents: (system: SingleModuleSystem<M>) => SingleModuleSystem<M>[\"events\"];\n useWatch: <K extends string>(\n system: SingleModuleSystem<M>,\n key: K,\n callback: (newValue: unknown, previousValue: unknown) => void,\n ) => void;\n} {\n return {\n useFact: <K extends keyof InferFacts<M> & string>(\n system: SingleModuleSystem<M>,\n factKey: K,\n ) =>\n useFact(system as SingleModuleSystem<any>, factKey) as Ref<\n InferFacts<M>[K] | undefined\n >,\n useDerived: <K extends keyof InferDerivations<M> & string>(\n system: SingleModuleSystem<M>,\n derivationId: K,\n ) =>\n useDerived(system as SingleModuleSystem<any>, derivationId) as Ref<\n InferDerivations<M>[K]\n >,\n useDispatch: (system: SingleModuleSystem<M>) => {\n return (event: InferEvents<M>) => {\n system.dispatch(event);\n };\n },\n useEvents: (system: SingleModuleSystem<M>) => useEvents<M>(system),\n useWatch: <K extends string>(\n system: SingleModuleSystem<M>,\n key: K,\n callback: (newValue: unknown, previousValue: unknown) => void,\n ) => useWatch(system as SingleModuleSystem<any>, key, callback),\n };\n}\n\n// ============================================================================\n// useNamespacedSelector — select from a NamespacedSystem\n// ============================================================================\n\n/**\n * Reactive composable to select from a NamespacedSystem.\n * Subscribes to specified keys and returns a Vue ref.\n *\n * @param system - The namespaced system\n * @param keys - Namespaced keys to subscribe to (e.g., [\"auth.token\", \"data.count\"])\n * @param selector - Function that reads from system.facts / system.derive\n *\n * @example\n * ```vue\n * const system = useDirectiveRef({ modules: { auth, data } });\n * const token = useNamespacedSelector(system, [\"auth.token\"], (s) => s.facts.auth.token);\n * ```\n */\nexport function useNamespacedSelector<Modules extends ModulesMap, R>(\n system: NamespacedSystem<Modules>,\n keys: string[],\n selector: (system: NamespacedSystem<Modules>) => R,\n): Ref<R> {\n const value = ref(selector(system)) as Ref<R>;\n const unsubscribe = system.subscribe(keys, () => {\n value.value = selector(system) as R;\n });\n onScopeDispose(unsubscribe);\n\n return value;\n}\n\n// ============================================================================\n// useQuerySystem — Stable query system with lifecycle management\n// ============================================================================\n\nlet _createQuerySystem: ((config: Record<string, unknown>) => any) | null =\n null;\n\nfunction getCreateQuerySystem() {\n if (!_createQuerySystem) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require(\"@directive-run/query\");\n _createQuerySystem = mod.createQuerySystem;\n } catch {\n throw new Error(\n \"[Directive] @directive-run/query is not installed. \" +\n \"Install it with: pnpm add @directive-run/query\",\n );\n }\n }\n\n return _createQuerySystem!;\n}\n\n/**\n * Vue composable to create and manage a query system with proper lifecycle.\n *\n * Accepts a config object or a factory function that creates the system.\n * Handles cleanup on scope disposal.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useQuerySystem, useDerived } from \"@directive-run/vue\";\n *\n * const app = useQuerySystem({\n * facts: { userId: \"\" },\n * queries: { user: { key: ..., fetcher: ... } },\n * });\n *\n * const user = useDerived(app, \"user\");\n * </script>\n * ```\n */\nexport function useQuerySystem<\n T extends {\n start: () => void;\n destroy: () => void;\n isRunning?: boolean;\n [key: string]: any;\n },\n>(config: Record<string, unknown>): T {\n const createQuerySystem = getCreateQuerySystem();\n const system = createQuerySystem(config) as T;\n\n // Start if not already running\n if (typeof window !== \"undefined\" && !system.isRunning) {\n system.start();\n }\n\n onScopeDispose(() => {\n // RFC 0009 follow-up: use destroyAsync so source\n // unsubscribes actually complete (e.g. Supabase `channel.unsubscribe()`\n // returns a Promise the sync `destroy()` would have dropped on\n // the floor). The framework's onScopeDispose is sync, so we\n // fire-and-forget with a swallow-catch — broker drops finish in\n // the background; any unsubscribe rejection is already routed\n // through the manager's runtime-phase observability sink.\n system.destroyAsync().catch((err: unknown) => {\n if (isDevelopment)\n console.warn(\"[Directive] destroyAsync rejected during unmount:\", err);\n });\n });\n\n return system;\n}\n\n// ============================================================================\n// SSR Hydration\n// ============================================================================\n\n/** @internal Injection key for SSR hydration snapshot */\nconst HYDRATION_KEY: InjectionKey<Record<string, unknown>> = Symbol(\n \"directive-hydration\",\n);\n\n/**\n * Vue component that provides a DistributableSnapshot to child components.\n * Use with `useHydratedSystem` for SSR hydration in Nuxt or Vue SSR apps.\n *\n * @example\n * ```vue\n * <template>\n * <DirectiveHydrator :snapshot=\"snapshot\">\n * <App />\n * </DirectiveHydrator>\n * </template>\n * ```\n */\nexport const DirectiveHydrator = defineComponent({\n name: \"DirectiveHydrator\",\n props: {\n snapshot: { type: Object, required: true },\n },\n setup(props, { slots }) {\n provide(HYDRATION_KEY, props.snapshot as Record<string, unknown>);\n\n return () => slots.default?.();\n },\n});\n\n/**\n * Vue composable that creates a system hydrated from a server snapshot.\n * Must be used inside a `<DirectiveHydrator>` ancestor.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useHydratedSystem, useDerived } from \"@directive-run/vue\";\n * const system = useHydratedSystem(myModule);\n * const count = useDerived(system, \"count\");\n * </script>\n * ```\n */\nexport function useHydratedSystem<S extends ModuleSchema>(\n moduleDef: ModuleDef<S>,\n config?: UseDirectiveConfig,\n): SingleModuleSystem<S> {\n const snapshot = inject(HYDRATION_KEY, undefined);\n const mergedFacts = mergeHydrationFacts(\n snapshot,\n config?.initialFacts as Record<string, unknown>,\n );\n const { system } = useDirective(moduleDef, {\n ...config,\n initialFacts: mergedFacts,\n });\n\n return system;\n}\n\n// ============================================================================\n// useAuditLedger — live ledger entries with filter (R4.I parity)\n// ============================================================================\n\nimport type { AuditEntry, AuditLedger, QueryFilter } from \"@directive-run/core\";\n\n/**\n * Subscribe to an audit ledger and return the latest entries matching\n * `filter` as a reactive `Ref`. Re-evaluates on each poll tick (default\n * 250 ms — override with `pollMs`).\n *\n * **Polling floor:** `pollMs` is clamped to a minimum of 50 ms to prevent\n * accidental DoS from typos like `pollMs: 5`. Values below the floor are\n * silently clamped in production; dev mode logs a warning.\n *\n * **First-paint freshness:** the interval starts immediately at setup\n * time (not gated on `onMounted`), so the first ledger query lands\n * before the component paints. Cleanup uses `onScopeDispose`, which\n * is correct for both component scopes and ad-hoc effect scopes.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useAuditLedger } from \"@directive-run/vue\";\n * const entries = useAuditLedger(ledger, { kind: \"constraint.evaluate\", limit: 20 });\n * </script>\n * <template>\n * <ul>\n * <li v-for=\"e in entries\" :key=\"e.seq\">{{ e.kind }} @ {{ e.ts }}</li>\n * </ul>\n * </template>\n * ```\n */\nexport function useAuditLedger(\n ledger: AuditLedger,\n filter: QueryFilter = {},\n opts: { pollMs?: number } = {},\n): ShallowRef<readonly AuditEntry[]> {\n const requestedPollMs = opts.pollMs ?? 250;\n const pollMs = Math.max(50, requestedPollMs);\n\n if (isDevelopment) {\n if (opts.pollMs !== undefined && opts.pollMs < 50) {\n console.warn(\n `[Directive] useAuditLedger() pollMs=${opts.pollMs} is below the 50 ms floor; clamped to 50 ms.`,\n );\n }\n if (pollMs < 100) {\n const entryCount = ledger.toJSON().entries.length;\n if (entryCount > 1000) {\n console.warn(\n `[Directive] useAuditLedger() polling every ${pollMs} ms against a ${entryCount}-entry ledger — that's a lot of CPU per tick. Consider raising pollMs or tightening the filter.`,\n );\n }\n }\n }\n\n const entries = shallowRef<readonly AuditEntry[]>(ledger.query(filter));\n const intervalId = setInterval(() => {\n entries.value = ledger.query(filter);\n }, pollMs);\n\n onScopeDispose(() => {\n clearInterval(intervalId);\n });\n\n return entries;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@directive-run/vue",
|
|
3
|
-
"version": "1.23.
|
|
3
|
+
"version": "1.23.1",
|
|
4
4
|
"imports": {
|
|
5
5
|
"#is-development": {
|
|
6
6
|
"production": "./src/dev-false.ts",
|
|
@@ -64,13 +64,13 @@
|
|
|
64
64
|
"tsup": "^8.3.5",
|
|
65
65
|
"typescript": "^5.7.2",
|
|
66
66
|
"vue": "^3.4.0",
|
|
67
|
-
"@directive-run/core": "1.23.
|
|
68
|
-
"@directive-run/query": "1.2.
|
|
67
|
+
"@directive-run/core": "1.23.1",
|
|
68
|
+
"@directive-run/query": "1.2.1"
|
|
69
69
|
},
|
|
70
70
|
"scripts": {
|
|
71
71
|
"build": "tsup",
|
|
72
72
|
"dev": "tsup --watch",
|
|
73
|
-
"test": "vitest run",
|
|
73
|
+
"test": "cd ../.. && vitest run packages/vue/",
|
|
74
74
|
"typecheck": "tsc --noEmit",
|
|
75
75
|
"clean": "rm -rf dist"
|
|
76
76
|
}
|