react-mnemonic 1.0.0-beta.0 → 1.2.0-beta1
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/README.md +43 -533
- package/dist/core.cjs +1322 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +15 -0
- package/dist/core.d.ts +15 -0
- package/dist/core.js +1313 -0
- package/dist/core.js.map +1 -0
- package/dist/index.cjs +1568 -777
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -1719
- package/dist/index.d.ts +4 -1719
- package/dist/index.js +1565 -779
- package/dist/index.js.map +1 -1
- package/dist/key-BvFvcKiR.d.cts +1723 -0
- package/dist/key-BvFvcKiR.d.ts +1723 -0
- package/dist/schema.cjs +2276 -0
- package/dist/schema.cjs.map +1 -0
- package/dist/schema.d.cts +317 -0
- package/dist/schema.d.ts +317 -0
- package/dist/schema.js +2256 -0
- package/dist/schema.js.map +1 -0
- package/package.json +24 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Mnemonic/runtime.ts","../src/Mnemonic/provider.tsx","../src/Mnemonic/provider-core.tsx","../src/Mnemonic/codecs.ts","../src/Mnemonic/schema.ts","../src/Mnemonic/use-shared.ts","../src/Mnemonic/use-core.ts","../src/Mnemonic/recovery.ts","../src/Mnemonic/key.ts"],"names":["createContext","useContext","useMemo","store","useEffect","MnemonicProvider","jsx","useState","useCallback","useSyncExternalStore","useRef","warnOnce","isDevelopmentRuntime"],"mappings":"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","file":"core.cjs","sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport type { StorageLike } from \"./types\";\n\ntype RuntimeProcess = { env?: { NODE_ENV?: string } };\n\nfunction getGlobalProcess(): RuntimeProcess | undefined {\n return (globalThis as { process?: RuntimeProcess }).process;\n}\n\nexport function getRuntimeNodeEnv(): string | undefined {\n const runtimeProcess = getGlobalProcess();\n if (runtimeProcess?.env?.NODE_ENV !== undefined) {\n return runtimeProcess.env.NODE_ENV;\n }\n return undefined;\n}\n\nexport function getNativeBrowserStorages(): StorageLike[] {\n const globalWindow = (globalThis as { window?: Window }).window;\n if (!globalWindow) return [];\n\n const storages: StorageLike[] = [];\n const addStorage = (getter: () => StorageLike) => {\n try {\n storages.push(getter());\n } catch {\n // Ignore blocked browser storage access and continue probing others.\n }\n };\n\n addStorage(() => globalWindow.localStorage);\n addStorage(() => globalWindow.sessionStorage);\n return storages;\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview React Context provider for persistent state management.\n *\n * This module exports the MnemonicProvider component and useMnemonic hook,\n * which together provide a namespace-scoped storage API to child components.\n * The provider creates an in-memory cache with read-through behavior to localStorage\n * (or a synchronous custom storage backend) and implements the React external\n * store contract.\n */\n\nimport { createContext, useContext, useMemo, useEffect, ReactNode } from \"react\";\nimport { getNativeBrowserStorages, getRuntimeNodeEnv } from \"./runtime\";\nimport type { Mnemonic, MnemonicProviderOptions, StorageLike, Listener, Unsubscribe } from \"./types\";\n\n/**\n * React Context for the Mnemonic store.\n *\n * Provides access to the low-level storage API. Consumer code should use\n * `useMnemonicKey` instead of accessing this context directly.\n *\n * @internal\n */\nconst MnemonicContext = createContext<Mnemonic | null>(null);\n\n/**\n * Hook to access the Mnemonic store from context.\n *\n * This is a low-level hook used internally by `useMnemonicKey`. Most applications\n * should use `useMnemonicKey` instead, which provides a higher-level, type-safe API.\n *\n * @returns The Mnemonic store instance\n *\n * @throws {Error} If called outside of a MnemonicProvider\n *\n * @example\n * ```tsx\n * // Internal usage (prefer useMnemonicKey for application code)\n * function MyComponent() {\n * const store = useMnemonic();\n * const raw = store.getRawSnapshot('myKey');\n * // ...\n * }\n * ```\n *\n * @see {@link useMnemonicKey} - Higher-level hook for application code\n * @see {@link MnemonicProvider} - Required provider component\n */\nexport function useMnemonic(): Mnemonic {\n const context = useContext(MnemonicContext);\n if (!context) {\n throw new Error(\"useMnemonic must be used within a MnemonicProvider\");\n }\n return context;\n}\n\n/**\n * Props for the MnemonicProvider component.\n *\n * Extends MnemonicProviderOptions with required children prop.\n *\n * @see {@link MnemonicProviderOptions} - Configuration options\n * @see {@link MnemonicProvider} - Provider component\n */\nexport interface MnemonicProviderProps extends Readonly<MnemonicProviderOptions> {\n /**\n * React children to render within the provider.\n */\n readonly children: ReactNode;\n}\n\n/**\n * Helper function to safely access window.localStorage in browser environments.\n *\n * Returns undefined in non-browser environments (SSR) or when localStorage\n * is unavailable (e.g., in private browsing mode with strict settings).\n *\n * @returns localStorage if available, undefined otherwise\n *\n * @internal\n */\nfunction defaultBrowserStorage(): StorageLike | undefined {\n const globalWindow = (globalThis as { window?: Window }).window;\n if (globalWindow === undefined) return undefined;\n try {\n return globalWindow.localStorage;\n } catch {\n return undefined;\n }\n}\n\n/** Internal store type with reload capability, not exposed to consumers. */\ntype MnemonicInternal = Mnemonic & {\n reloadFromStorage: (changedKeys?: string[]) => void;\n};\n\n/** Internal store extension to retain a strong provider API reference while mounted. */\ntype MnemonicInternalWithDevToolsHold = MnemonicInternal & {\n __devToolsProviderApiHold?: DevToolsProviderApi;\n};\n\n/** Minimal WeakRef shape so we can compile against ES2020 libs. */\ntype WeakRefLike<T extends object> = {\n deref: () => T | undefined;\n};\n\ntype WeakRefConstructorLike = new <T extends object>(target: T) => WeakRefLike<T>;\n\ntype DevToolsProviderApi = {\n getStore: () => MnemonicInternal;\n dump: () => Record<string, string>;\n get: (key: string) => unknown;\n set: (key: string, value: unknown) => void;\n remove: (key: string) => void;\n clear: () => void;\n keys: () => string[];\n};\n\ntype DevToolsProviderEntry = {\n namespace: string;\n weakRef: WeakRefLike<DevToolsProviderApi>;\n registeredAt: number;\n lastSeenAt: number;\n staleSince: number | null;\n};\n\ntype DevToolsProviderDescriptor = {\n namespace: string;\n available: boolean;\n registeredAt: number;\n lastSeenAt: number;\n staleSince: number | null;\n};\n\ntype DevToolsRegistryRoot = {\n providers: Record<string, DevToolsProviderEntry>;\n resolve: (namespace: string) => DevToolsProviderApi | null;\n list: () => DevToolsProviderDescriptor[];\n capabilities: {\n weakRef: boolean;\n finalizationRegistry: boolean;\n };\n __meta: {\n version: number;\n lastUpdated: number;\n lastChange: string;\n };\n};\n\ntype DevToolsGlobalWindow = Window & {\n __REACT_MNEMONIC_DEVTOOLS__?: unknown;\n};\n\ntype StorageAccessCallbacks = {\n onAccessError: (error: unknown) => void;\n onAccessSuccess: () => void;\n onAsyncViolation: (method: \"getItem\" | \"setItem\" | \"removeItem\", thenable: PromiseLike<unknown>) => void;\n};\n\nfunction detectEnumerableStorage(storage: StorageLike | undefined): boolean {\n if (!storage) return false;\n try {\n return typeof storage.length === \"number\" && typeof storage.key === \"function\";\n } catch {\n return false;\n }\n}\n\nfunction isProductionRuntime(): boolean {\n const env = getRuntimeNodeEnv();\n if (env === undefined) {\n return true;\n }\n return env === \"production\";\n}\n\nfunction weakRefConstructor(): WeakRefConstructorLike | null {\n const ctor = (globalThis as { WeakRef?: unknown }).WeakRef;\n return typeof ctor === \"function\" ? (ctor as WeakRefConstructorLike) : null;\n}\n\nfunction hasFinalizationRegistry(): boolean {\n return typeof (globalThis as { FinalizationRegistry?: unknown }).FinalizationRegistry === \"function\";\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n if (value == null) return false;\n if (typeof value !== \"object\" && typeof value !== \"function\") return false;\n return typeof (value as { then?: unknown }).then === \"function\";\n}\n\nfunction getCrossTabSyncMode(\n requestedStorage: StorageLike | undefined,\n activeStorage: StorageLike | undefined,\n): NonNullable<Mnemonic[\"crossTabSyncMode\"]> {\n const isExplicitNativeBrowserStorage =\n activeStorage !== undefined &&\n requestedStorage !== undefined &&\n getNativeBrowserStorages().includes(activeStorage);\n if ((requestedStorage === undefined && activeStorage !== undefined) || isExplicitNativeBrowserStorage) {\n return \"browser-storage-event\";\n }\n if (typeof activeStorage?.onExternalChange === \"function\") {\n return \"custom-external-change\";\n }\n return \"none\";\n}\n\nfunction getDevToolsWindow(): DevToolsGlobalWindow | undefined {\n return (globalThis as { window?: DevToolsGlobalWindow }).window;\n}\n\nfunction sanitizeDevToolsRoot(root: Record<string, unknown>): void {\n const reserved = new Set([\"providers\", \"resolve\", \"list\", \"capabilities\", \"__meta\"]);\n for (const key of Object.keys(root)) {\n if (reserved.has(key)) continue;\n const descriptor = Object.getOwnPropertyDescriptor(root, key);\n if (descriptor && !descriptor.configurable) continue;\n try {\n delete root[key];\n } catch {\n // Ignore hostile legacy properties so devtools init stays fail-safe.\n }\n }\n}\n\nfunction ensureDevToolsRoot(enableDevTools: boolean): DevToolsRegistryRoot | null {\n if (!enableDevTools) return null;\n\n const globalWindow = getDevToolsWindow();\n if (!globalWindow) return null;\n\n const weakRefSupported = weakRefConstructor() !== null;\n const finalizationRegistrySupported = hasFinalizationRegistry();\n const existing = globalWindow.__REACT_MNEMONIC_DEVTOOLS__;\n const root: Record<string, unknown> =\n existing && typeof existing === \"object\" ? (existing as Record<string, unknown>) : {};\n\n sanitizeDevToolsRoot(root);\n\n if (!root.providers || typeof root.providers !== \"object\") {\n root.providers = {};\n }\n\n if (!root.capabilities || typeof root.capabilities !== \"object\") {\n root.capabilities = {};\n }\n\n const capabilities = root.capabilities as DevToolsRegistryRoot[\"capabilities\"];\n capabilities.weakRef = weakRefSupported;\n capabilities.finalizationRegistry = finalizationRegistrySupported;\n\n if (!root.__meta || typeof root.__meta !== \"object\") {\n root.__meta = {\n version: 0,\n lastUpdated: Date.now(),\n lastChange: \"\",\n };\n }\n\n const meta = root.__meta as DevToolsRegistryRoot[\"__meta\"];\n if (typeof meta.version !== \"number\" || !Number.isFinite(meta.version)) {\n meta.version = 0;\n }\n if (typeof meta.lastUpdated !== \"number\" || !Number.isFinite(meta.lastUpdated)) {\n meta.lastUpdated = Date.now();\n }\n if (typeof meta.lastChange !== \"string\") {\n meta.lastChange = \"\";\n }\n\n const providers = root.providers as Record<string, DevToolsProviderEntry>;\n if (typeof root.resolve !== \"function\") {\n root.resolve = (namespace: string): DevToolsProviderApi | null => {\n const entry = providers[namespace];\n if (!entry || typeof entry.weakRef?.deref !== \"function\") return null;\n\n const live = entry.weakRef.deref();\n if (live) {\n entry.lastSeenAt = Date.now();\n entry.staleSince = null;\n return live;\n }\n\n entry.staleSince ??= Date.now();\n return null;\n };\n }\n\n if (typeof root.list !== \"function\") {\n root.list = (): DevToolsProviderDescriptor[] =>\n Object.entries(providers)\n .map(([namespace, entry]) => {\n const live = typeof entry.weakRef?.deref === \"function\" ? entry.weakRef.deref() : undefined;\n const available = Boolean(live);\n if (available) {\n entry.lastSeenAt = Date.now();\n entry.staleSince = null;\n } else {\n entry.staleSince ??= Date.now();\n }\n return {\n namespace,\n available,\n registeredAt: entry.registeredAt,\n lastSeenAt: entry.lastSeenAt,\n staleSince: entry.staleSince,\n };\n })\n .sort((left, right) => left.namespace.localeCompare(right.namespace));\n }\n\n globalWindow.__REACT_MNEMONIC_DEVTOOLS__ = root;\n return root as DevToolsRegistryRoot;\n}\n\nfunction bumpDevToolsVersion(root: DevToolsRegistryRoot | null, namespace: string, reason: string): void {\n if (!root) return;\n root.__meta.version += 1;\n root.__meta.lastUpdated = Date.now();\n root.__meta.lastChange = `${namespace}.${reason}`;\n}\n\nfunction decodeDevToolsValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nfunction readStorageRaw(\n storage: StorageLike | undefined,\n storageKey: string,\n callbacks: StorageAccessCallbacks,\n): string | null {\n if (!storage) return null;\n\n try {\n const raw = storage.getItem(storageKey);\n if (isPromiseLike(raw)) {\n callbacks.onAsyncViolation(\"getItem\", raw);\n return null;\n }\n callbacks.onAccessSuccess();\n return raw;\n } catch (error) {\n callbacks.onAccessError(error);\n return null;\n }\n}\n\nfunction enumerateNamespaceKeys(\n storage: StorageLike | undefined,\n prefix: string,\n callbacks: Pick<StorageAccessCallbacks, \"onAccessError\" | \"onAccessSuccess\">,\n): string[] {\n if (!storage) {\n return [];\n }\n\n const keys: string[] = [];\n try {\n const storageLength = storage.length;\n const getStorageKey = storage.key;\n if (typeof storageLength !== \"number\" || typeof getStorageKey !== \"function\") {\n return [];\n }\n for (let index = 0; index < storageLength; index++) {\n const fullKey = getStorageKey.call(storage, index);\n if (!fullKey?.startsWith(prefix)) continue;\n keys.push(fullKey.slice(prefix.length));\n }\n callbacks.onAccessSuccess();\n } catch (error) {\n callbacks.onAccessError(error);\n }\n return keys;\n}\n\nfunction syncCacheEntryFromStorage({\n key,\n storageKey,\n storage,\n cache,\n emit,\n callbacks,\n}: {\n key: string;\n storageKey: string;\n storage: StorageLike | undefined;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n}): boolean {\n const fresh = readStorageRaw(storage, storageKey, callbacks);\n const cached = cache.get(key) ?? null;\n if (fresh === cached) {\n return false;\n }\n cache.set(key, fresh);\n emit(key);\n return true;\n}\n\nfunction reloadNamedKeysFromStorage({\n changedKeys,\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n}: {\n changedKeys: string[];\n prefix: string;\n storage: StorageLike | undefined;\n listeners: Map<string, Set<Listener>>;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n}): boolean {\n let changed = false;\n\n for (const fullStorageKey of changedKeys) {\n if (!fullStorageKey.startsWith(prefix)) continue;\n const key = fullStorageKey.slice(prefix.length);\n const listenerSet = listeners.get(key);\n if (listenerSet && listenerSet.size > 0) {\n changed =\n syncCacheEntryFromStorage({\n key,\n storageKey: fullStorageKey,\n storage,\n cache,\n emit,\n callbacks,\n }) || changed;\n continue;\n }\n if (cache.has(key)) {\n cache.delete(key);\n }\n }\n\n return changed;\n}\n\nfunction reloadSubscribedKeysFromStorage({\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n}: {\n prefix: string;\n storage: StorageLike | undefined;\n listeners: Map<string, Set<Listener>>;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n}): boolean {\n let changed = false;\n\n for (const [key, listenerSet] of listeners) {\n if (listenerSet.size === 0) continue;\n changed =\n syncCacheEntryFromStorage({\n key,\n storageKey: `${prefix}${key}`,\n storage,\n cache,\n emit,\n callbacks,\n }) || changed;\n }\n\n for (const key of cache.keys()) {\n const listenerSet = listeners.get(key);\n if (listenerSet && listenerSet.size > 0) continue;\n cache.delete(key);\n }\n\n return changed;\n}\n\nfunction createDevToolsProviderApi({\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n}: {\n store: MnemonicInternal;\n dump: () => Record<string, string>;\n keys: () => string[];\n readThrough: (key: string) => string | null;\n writeRaw: (key: string, raw: string) => void;\n removeRaw: (key: string) => void;\n}): DevToolsProviderApi {\n return {\n getStore: () => store,\n dump: () => {\n const data = dump();\n console.table(\n Object.entries(data).map(([key, value]) => ({\n key,\n value,\n decoded: decodeDevToolsValue(value),\n })),\n );\n return data;\n },\n get: (key: string) => {\n const raw = readThrough(key);\n if (raw == null) return undefined;\n return decodeDevToolsValue(raw);\n },\n set: (key: string, value: unknown) => {\n writeRaw(key, JSON.stringify(value));\n },\n remove: (key: string) => removeRaw(key),\n clear: () => {\n for (const key of keys()) {\n removeRaw(key);\n }\n },\n keys,\n };\n}\n\nfunction createReloadFromStorage({\n storage,\n hasAsyncContractViolation,\n prefix,\n listeners,\n cache,\n emit,\n callbacks,\n devToolsRoot,\n namespace,\n}: {\n storage: StorageLike | undefined;\n hasAsyncContractViolation: () => boolean;\n prefix: string;\n listeners: Map<string, Set<Listener>>;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n devToolsRoot: DevToolsRegistryRoot | null;\n namespace: string;\n}): (changedKeys?: string[]) => void {\n return (changedKeys?: string[]) => {\n if (!storage || hasAsyncContractViolation()) return;\n if (changedKeys?.length === 0) return;\n\n const isFullReload = changedKeys === undefined;\n const changed = isFullReload\n ? reloadSubscribedKeysFromStorage({\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n })\n : reloadNamedKeysFromStorage({\n changedKeys,\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n });\n\n if (changed) {\n bumpDevToolsVersion(devToolsRoot, namespace, isFullReload ? \"reload:full\" : \"reload:granular\");\n }\n };\n}\n\nfunction registerDevToolsProvider({\n devToolsRoot,\n namespace,\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n}: {\n devToolsRoot: DevToolsRegistryRoot;\n namespace: string;\n store: MnemonicInternalWithDevToolsHold;\n dump: () => Record<string, string>;\n keys: () => string[];\n readThrough: (key: string) => string | null;\n writeRaw: (key: string, raw: string) => void;\n removeRaw: (key: string) => void;\n}): void {\n let infoMessage = `[Mnemonic DevTools] Namespace \"${namespace}\" available via window.__REACT_MNEMONIC_DEVTOOLS__.resolve(\"${namespace}\")`;\n\n if (!devToolsRoot.capabilities.weakRef) {\n console.info(\n `[Mnemonic DevTools] WeakRef is not available; registry provider \"${namespace}\" was not registered.`,\n );\n return;\n }\n\n const existingLive = devToolsRoot.resolve(namespace);\n if (existingLive) {\n const duplicateMessage = `[Mnemonic DevTools] Duplicate provider namespace \"${namespace}\" detected. Each window must have at most one live MnemonicProvider per namespace.`;\n if (!isProductionRuntime()) {\n throw new Error(duplicateMessage);\n }\n console.warn(`${duplicateMessage} Keeping the first provider and ignoring the duplicate.`);\n console.info(\n `[Mnemonic DevTools] Namespace \"${namespace}\" already registered. Keeping existing provider reference.`,\n );\n return;\n }\n\n const providerApi = createDevToolsProviderApi({\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n });\n const WeakRefCtor = weakRefConstructor();\n if (!WeakRefCtor) {\n console.info(`[Mnemonic DevTools] WeakRef became unavailable while registering \"${namespace}\".`);\n return;\n }\n\n // Keep a strong reference for the mounted provider lifetime.\n // The global registry still only exposes a WeakRef, but this\n // prevents premature collection while the provider is active.\n store.__devToolsProviderApiHold = providerApi;\n\n const now = Date.now();\n devToolsRoot.providers[namespace] = {\n namespace,\n weakRef: new WeakRefCtor(providerApi),\n registeredAt: now,\n lastSeenAt: now,\n staleSince: null,\n };\n bumpDevToolsVersion(devToolsRoot, namespace, \"registry:namespace-registered\");\n console.info(infoMessage);\n}\n\n/**\n * React Context provider for namespace-isolated persistent state.\n *\n * Creates a scoped storage environment where all keys are automatically prefixed\n * with the namespace to prevent collisions. Implements an in-memory cache with\n * read-through behavior to the underlying storage backend (localStorage by default).\n *\n * This provider must wrap any components that use `useMnemonicKey`. Multiple\n * providers with different namespaces can coexist in the same application.\n *\n * @param props - Provider configuration and children\n * @param props.children - React children to render within the provider\n * @param props.namespace - Unique namespace for isolating storage keys\n * @param props.storage - Optional synchronous custom storage backend (defaults to localStorage)\n * @param props.enableDevTools - Enable DevTools debugging interface (defaults to false)\n * @param props.schemaMode - Schema enforcement mode (default: \"default\")\n * @param props.schemaRegistry - Optional schema registry for storing schemas and migrations\n * @param props.ssr - Optional SSR defaults for descendant hooks\n *\n * @example\n * ```tsx\n * // Basic usage with default settings\n * function App() {\n * return (\n * <MnemonicProvider namespace=\"myApp\">\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With a synchronous custom storage backend\n * function App() {\n * return (\n * <MnemonicProvider\n * namespace=\"myApp\"\n * storage={window.sessionStorage}\n * >\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With DevTools enabled (development only)\n * function App() {\n * return (\n * <MnemonicProvider\n * namespace=\"myApp\"\n * enableDevTools={process.env.NODE_ENV === 'development'}\n * >\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n *\n * // Then in browser console:\n * const dt = window.__REACT_MNEMONIC_DEVTOOLS__.resolve('myApp')\n * dt?.dump()\n * dt?.get('user')\n * dt?.set('theme', 'dark')\n * ```\n *\n * @example\n * ```tsx\n * // Multiple providers with different namespaces\n * function App() {\n * return (\n * <MnemonicProvider namespace=\"user-prefs\">\n * <UserSettings />\n * <MnemonicProvider namespace=\"app-state\">\n * <Dashboard />\n * </MnemonicProvider>\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Delay persisted storage reads until after client mount\n * function App() {\n * return (\n * <MnemonicProvider\n * namespace=\"myApp\"\n * ssr={{ hydration: \"client-only\" }}\n * >\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @remarks\n * - Creates a stable store instance that only recreates when namespace, storage, or enableDevTools change\n * - All storage operations are cached in memory for fast reads\n * - Storage failures are handled gracefully (logged but not thrown)\n * - `StorageLike` is intentionally synchronous for v1; async persistence must sit behind a sync facade\n * - In SSR environments, the provider is safe by default: hooks render\n * `defaultValue` unless configured with an explicit `ssr.serverValue`\n * - The store implements React's useSyncExternalStore contract for efficient updates\n *\n * @see {@link useMnemonicKey} - Hook for using persistent state\n * @see {@link MnemonicProviderOptions} - Configuration options\n */\nexport function MnemonicProvider({\n children,\n namespace,\n storage,\n enableDevTools = false,\n schemaMode = \"default\",\n schemaRegistry,\n ssr,\n}: MnemonicProviderProps) {\n if (schemaMode === \"strict\" && !schemaRegistry) {\n throw new Error(\"MnemonicProvider strict mode requires schemaRegistry\");\n }\n if (schemaMode === \"autoschema\" && typeof schemaRegistry?.registerSchema !== \"function\") {\n throw new Error(\"MnemonicProvider autoschema mode requires schemaRegistry.registerSchema\");\n }\n\n const store = useMemo<MnemonicInternal>(() => {\n const prefix = `${namespace}.`;\n const st = storage ?? defaultBrowserStorage();\n const ssrHydration = ssr?.hydration ?? \"immediate\";\n const devToolsRoot = ensureDevToolsRoot(enableDevTools);\n const canEnumerateKeys = detectEnumerableStorage(st);\n const crossTabSyncMode = getCrossTabSyncMode(storage, st);\n\n /**\n * In-memory cache of raw string values.\n * Maps unprefixed keys to their raw string values (or null if not present).\n * Provides fast reads without hitting storage on every access.\n */\n const cache = new Map<string, string | null>();\n\n /**\n * Per-key listener registry.\n * Maps unprefixed keys to sets of listener functions.\n * Used to notify React components when values change.\n */\n const listeners = new Map<string, Set<Listener>>();\n\n /** Whether a QuotaExceededError has already been logged since the last successful write. */\n let quotaErrorLogged = false;\n\n /** Whether a non-quota DOMException has already been logged since the last successful storage access. */\n let accessErrorLogged = false;\n\n /** Whether the storage backend has violated the synchronous StorageLike contract. */\n let asyncContractViolationDetected = false;\n const storageAccessCallbacks: StorageAccessCallbacks = {\n onAccessError: (err) => logAccessError(err),\n onAccessSuccess: () => {\n accessErrorLogged = false;\n },\n onAsyncViolation: (method, thenable) => handleAsyncStorageContractViolation(method, thenable),\n };\n\n /**\n * Converts an unprefixed key to a fully-qualified storage key.\n *\n * @param key - Unprefixed key\n * @returns Prefixed key with namespace\n */\n const fullKey = (key: string) => prefix + key;\n\n /**\n * Notifies all listeners subscribed to a specific key.\n * Called after mutations (set/remove) to trigger React re-renders.\n *\n * @param key - Unprefixed key that changed\n */\n const emit = (key: string) => {\n const set = listeners.get(key);\n if (!set) return;\n for (const fn of set) fn();\n };\n\n /**\n * Logs a storage-access DOMException once, squelching repeats until\n * a successful storage operation resets the flag. Ignores\n * QuotaExceededError (handled separately in writeRaw) and silently\n * swallows all non-DOMException errors.\n */\n const logAccessError = (err: unknown): void => {\n if (!accessErrorLogged && err instanceof DOMException && err.name !== \"QuotaExceededError\") {\n console.error(\n `[Mnemonic] Storage access error (${err.name}): ${err.message}. ` +\n \"Data is cached in memory but may not persist.\",\n );\n accessErrorLogged = true;\n }\n };\n\n /**\n * Marks the storage backend as incompatible with the synchronous\n * StorageLike contract, consumes the offending thenable to avoid\n * unhandled rejections, and logs the problem once.\n */\n const handleAsyncStorageContractViolation = (\n method: \"getItem\" | \"setItem\" | \"removeItem\",\n thenable: PromiseLike<unknown>,\n ): void => {\n asyncContractViolationDetected = true;\n void Promise.resolve(thenable).catch(() => undefined);\n if (accessErrorLogged) return;\n console.error(\n `[Mnemonic] StorageLike.${method} returned a Promise. ` +\n \"StorageLike must remain synchronous for react-mnemonic v1. \" +\n \"Wrap async persistence behind a synchronous cache facade instead.\",\n );\n accessErrorLogged = true;\n };\n\n /**\n * Read-through cache accessor.\n * Returns cached value if available, otherwise reads from storage and caches.\n *\n * @param key - Unprefixed key to read\n * @returns Raw string value, or null if not present\n */\n const readThrough = (key: string): string | null => {\n if (cache.has(key)) return cache.get(key) ?? null;\n if (!st || asyncContractViolationDetected) {\n cache.set(key, null);\n return null;\n }\n const raw = readStorageRaw(st, fullKey(key), storageAccessCallbacks);\n cache.set(key, raw);\n return raw;\n };\n\n /**\n * Writes a raw string value to both cache and storage.\n * Notifies listeners after the write completes.\n *\n * @param key - Unprefixed key to write\n * @param raw - Raw string value to store\n */\n const writeRaw = (key: string, raw: string) => {\n cache.set(key, raw);\n if (st && !asyncContractViolationDetected) {\n try {\n const result = st.setItem(fullKey(key), raw);\n if (isPromiseLike(result)) {\n handleAsyncStorageContractViolation(\"setItem\", result);\n } else {\n quotaErrorLogged = false;\n accessErrorLogged = false;\n }\n } catch (err) {\n if (!quotaErrorLogged && err instanceof DOMException && err.name === \"QuotaExceededError\") {\n console.error(\n `[Mnemonic] Storage quota exceeded writing key \"${key}\". ` +\n \"Data is cached in memory but will not persist.\",\n );\n quotaErrorLogged = true;\n }\n logAccessError(err);\n }\n }\n emit(key);\n bumpDevToolsVersion(devToolsRoot, namespace, `set:${key}`);\n };\n\n /**\n * Removes a key from both cache and storage.\n * Notifies listeners after the removal completes.\n *\n * @param key - Unprefixed key to remove\n */\n const removeRaw = (key: string) => {\n cache.set(key, null);\n if (st && !asyncContractViolationDetected) {\n try {\n const result = st.removeItem(fullKey(key));\n if (isPromiseLike(result)) {\n handleAsyncStorageContractViolation(\"removeItem\", result);\n } else {\n accessErrorLogged = false;\n }\n } catch (err) {\n logAccessError(err);\n }\n }\n emit(key);\n bumpDevToolsVersion(devToolsRoot, namespace, `remove:${key}`);\n };\n\n /**\n * Subscribes a listener to changes for a specific key.\n * Implements the React external store subscription contract.\n *\n * @param key - Unprefixed key to subscribe to\n * @param listener - Callback invoked when the value changes\n * @returns Unsubscribe function\n */\n const subscribeRaw = (key: string, listener: Listener): Unsubscribe => {\n let set = listeners.get(key);\n if (!set) {\n set = new Set();\n listeners.set(key, set);\n }\n set.add(listener);\n\n // Ensure cache is primed so snapshots are stable.\n readThrough(key);\n\n return () => {\n const s = listeners.get(key);\n if (!s) return;\n s.delete(listener);\n if (s.size === 0) listeners.delete(key);\n };\n };\n\n /**\n * Gets the current snapshot of a key's raw value.\n * Implements the React external store snapshot contract.\n *\n * @param key - Unprefixed key to read\n * @returns Raw string value, or null if not present\n */\n const getRawSnapshot = (key: string) => readThrough(key);\n\n /**\n * Enumerates all keys in this namespace.\n * Iterates through storage and filters keys by namespace prefix.\n *\n * @returns Array of unprefixed key names\n */\n const keys = () => {\n if (asyncContractViolationDetected) {\n return Array.from(cache.entries())\n .filter(([, value]) => value != null)\n .map(([key]) => key);\n }\n if (!canEnumerateKeys) return [];\n return enumerateNamespaceKeys(st, prefix, storageAccessCallbacks);\n };\n\n /**\n * Dumps all key-value pairs in this namespace.\n * Useful for debugging and DevTools integration.\n *\n * @returns Object mapping unprefixed keys to raw string values\n */\n const dump = () => {\n const out: Record<string, string> = {};\n for (const k of keys()) {\n const raw = readThrough(k);\n if (raw != null) out[k] = raw;\n }\n return out;\n };\n\n /**\n * Re-reads keys from the underlying storage, updating the cache and\n * emitting change notifications for any keys whose values differ.\n *\n * @param changedKeys - Optional array of fully-qualified storage keys\n * that changed. When undefined, performs a blanket reload of all\n * actively subscribed keys. When an empty array, does nothing.\n *\n * Called by the onExternalChange subscription when the storage adapter\n * signals that data has changed externally (e.g., from another tab).\n */\n const reloadFromStorage = createReloadFromStorage({\n storage: st,\n hasAsyncContractViolation: () => asyncContractViolationDetected,\n prefix,\n listeners,\n cache,\n emit,\n callbacks: storageAccessCallbacks,\n devToolsRoot,\n namespace,\n });\n\n /**\n * The Mnemonic store API object.\n * Implements the contract expected by useSyncExternalStore.\n */\n const store: MnemonicInternalWithDevToolsHold = {\n prefix,\n canEnumerateKeys,\n subscribeRaw,\n getRawSnapshot,\n setRaw: writeRaw,\n removeRaw,\n keys,\n dump,\n reloadFromStorage,\n schemaMode,\n ssrHydration,\n crossTabSyncMode,\n ...(schemaRegistry ? { schemaRegistry } : {}),\n };\n\n /**\n * DevTools integration.\n * Exposes a weak-provider registry on the window object when enabled.\n */\n if (devToolsRoot) {\n registerDevToolsProvider({\n devToolsRoot,\n namespace,\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n });\n }\n\n return store;\n }, [namespace, storage, enableDevTools, schemaMode, schemaRegistry, ssr?.hydration]);\n\n // Subscribe to external storage changes (e.g., cross-tab BroadcastChannel)\n useEffect(() => {\n if (!storage?.onExternalChange) return;\n return storage.onExternalChange((changedKeys) => store.reloadFromStorage(changedKeys));\n }, [storage, store]);\n\n return <MnemonicContext.Provider value={store}>{children}</MnemonicContext.Provider>;\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport type { ReactNode } from \"react\";\nimport { MnemonicProvider as SchemaMnemonicProvider } from \"./provider\";\nimport type { MnemonicProviderOptions, SchemaRegistry, SchemaMode } from \"./types\";\n\ntype CoreMnemonicProviderOptions = Omit<MnemonicProviderOptions, \"schemaMode\" | \"schemaRegistry\">;\nexport type { CoreMnemonicProviderOptions as MnemonicProviderOptions };\n\nfunction throwCoreProviderSchemaImportError(propName: \"schemaMode\" | \"schemaRegistry\"): never {\n throw new Error(\n `[Mnemonic] MnemonicProvider from react-mnemonic/core does not support ${propName}. Import MnemonicProvider from \"react-mnemonic/schema\" or \"react-mnemonic\" for schema validation, autoschema, and migration support.`,\n );\n}\n\nfunction assertNoSchemaProps(props: { schemaMode?: SchemaMode; schemaRegistry?: SchemaRegistry }): void {\n if (props.schemaMode !== undefined) {\n throwCoreProviderSchemaImportError(\"schemaMode\");\n }\n if (props.schemaRegistry !== undefined) {\n throwCoreProviderSchemaImportError(\"schemaRegistry\");\n }\n}\n\nexport interface MnemonicProviderProps extends Readonly<CoreMnemonicProviderOptions> {\n readonly children: ReactNode;\n}\n\nexport function MnemonicProvider(props: Readonly<MnemonicProviderProps>): ReactNode {\n assertNoSchemaProps(props as MnemonicProviderProps & { schemaMode?: SchemaMode; schemaRegistry?: SchemaRegistry });\n return <SchemaMnemonicProvider {...props} />;\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview Codec implementations for encoding and decoding values to/from storage.\n *\n * This module provides the built-in JSON codec and a factory for creating custom\n * codecs. Codecs handle the bidirectional transformation between typed JavaScript\n * values and their string representations for storage.\n *\n * Codecs are a low-level mechanism for keys that opt out of the JSON Schema\n * validation system. When a schema is registered for a key, the schema's\n * JSON Schema is used for validation and the payload is stored as a JSON value\n * directly (no codec encoding needed).\n */\n\nimport type { Codec } from \"./types\";\n\n/**\n * Custom error class for codec encoding and decoding failures.\n *\n * Thrown when a codec cannot successfully encode a value to a string or\n * decode a string back to its typed representation. This allows callers\n * to distinguish codec errors from other types of errors.\n *\n * @example\n * ```typescript\n * try {\n * const value = JSONCodec.decode('not-valid-json');\n * } catch (error) {\n * if (error instanceof CodecError) {\n * console.error('Failed to decode:', error.message);\n * }\n * }\n * ```\n */\nexport class CodecError extends Error {\n /**\n * The underlying error that caused the codec failure, if any.\n *\n * Useful for debugging when wrapping errors from JSON.parse or\n * other parsing operations.\n */\n readonly cause?: unknown;\n\n /**\n * Creates a new CodecError.\n *\n * @param message - Human-readable error description\n * @param cause - Optional underlying error that caused this failure\n */\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"CodecError\";\n this.cause = cause;\n\n // Required for proper instanceof behavior when targeting ES5\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * JSON codec for encoding and decoding JSON-serializable values.\n *\n * This is the default codec used by `useMnemonicKey` when no codec is specified.\n * It uses `JSON.stringify` for encoding and `JSON.parse` for decoding, making it\n * suitable for objects, arrays, and primitive values.\n *\n * @remarks\n * - Supports any JSON-serializable type: objects, arrays, strings, numbers, booleans, null\n * - Does not preserve JavaScript-specific types like Date, Map, Set, or undefined\n * - Throws standard JSON parsing errors for malformed JSON strings\n *\n * @example\n * ```typescript\n * // Used automatically as the default\n * const { value, set } = useMnemonicKey('userProfile', {\n * defaultValue: { name: 'Guest', preferences: { theme: 'dark' } }\n * // codec: JSONCodec is implicit\n * });\n *\n * // Can be specified explicitly\n * const { value, set } = useMnemonicKey('settings', {\n * defaultValue: { notifications: true },\n * codec: JSONCodec\n * });\n * ```\n *\n * @see {@link createCodec} - For custom encoding schemes\n */\nexport const JSONCodec: Codec<any> = {\n encode: (value) => JSON.stringify(value),\n decode: (encoded) => JSON.parse(encoded),\n};\n\n/**\n * Factory function for creating custom codecs.\n *\n * Creates a `Codec<T>` from separate encode and decode functions. This is\n * useful for implementing custom serialization strategies for types that\n * aren't supported by JSONCodec. Using a custom codec on a key opts out\n * of JSON Schema validation for that key.\n *\n * @template T - The TypeScript type of values to encode/decode\n *\n * @param encode - Function that converts a typed value to a string\n * @param decode - Function that converts a string back to a typed value\n * @returns A `Codec<T>` object compatible with useMnemonicKey\n *\n * @example\n * ```typescript\n * // Codec for Date objects\n * const DateCodec = createCodec<Date>(\n * (date) => date.toISOString(),\n * (str) => new Date(str)\n * );\n *\n * const { value, set } = useMnemonicKey('lastLogin', {\n * defaultValue: new Date(),\n * codec: DateCodec\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Codec for Set<string>\n * const StringSetCodec = createCodec<Set<string>>(\n * (set) => JSON.stringify(Array.from(set)),\n * (str) => new Set(JSON.parse(str))\n * );\n *\n * const { value, set } = useMnemonicKey('tags', {\n * defaultValue: new Set<string>(),\n * codec: StringSetCodec\n * });\n * ```\n *\n * @see {@link Codec} - The codec interface\n * @see {@link CodecError} - Error to throw when encoding/decoding fails\n * @see {@link JSONCodec} - Built-in codec for JSON values\n */\nexport function createCodec<T>(encode: (value: T) => string, decode: (encoded: string) => T): Codec<T> {\n return { encode, decode };\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview Schema versioning primitives for Mnemonic.\n *\n * This module defines the envelope format used to wrap every persisted value\n * and the error class thrown when schema-related operations fail.\n */\n\n/**\n * Error thrown for schema registry, versioning, and migration failures.\n *\n * Each instance carries a machine-readable {@link code} that categorises\n * the failure. When a `defaultValue` factory is provided to\n * `useMnemonicKey`, the `SchemaError` is passed as the `error` argument\n * so the factory can inspect the failure reason.\n *\n * Error codes:\n *\n * | Code | Meaning |\n * | ------------------------------- | --------------------------------------------------------------- |\n * | `INVALID_ENVELOPE` | The raw stored value is not a valid `MnemonicEnvelope`. |\n * | `SCHEMA_NOT_FOUND` | No schema registered for the stored key + version. |\n * | `WRITE_SCHEMA_REQUIRED` | Strict mode requires a schema to write, but none was found. |\n * | `MIGRATION_PATH_NOT_FOUND` | No contiguous migration path between the stored and latest version. |\n * | `MIGRATION_FAILED` | A migration step threw during execution. |\n * | `MIGRATION_GRAPH_INVALID` | The schema registry helper received an ambiguous or cyclic migration graph. |\n * | `RECONCILE_FAILED` | A read-time reconciliation hook threw or returned an unpersistable value. |\n * | `SCHEMA_REGISTRATION_CONFLICT` | `registerSchema` was called with a conflicting definition. |\n * | `TYPE_MISMATCH` | The decoded value failed JSON Schema validation. |\n * | `MODE_CONFIGURATION_INVALID` | The schema mode requires a capability the registry doesn't provide. |\n *\n * @example\n * ```typescript\n * defaultValue: (error) => {\n * if (error instanceof SchemaError) {\n * console.warn(`Schema issue [${error.code}]:`, error.message);\n * }\n * return { name: \"Guest\" };\n * }\n * ```\n *\n * @see {@link SchemaMode} - How the provider uses schemas\n * @see {@link SchemaRegistry} - Where schemas and migrations are registered\n */\nexport class SchemaError extends Error {\n /**\n * Machine-readable code identifying the category of schema failure.\n */\n readonly code:\n | \"INVALID_ENVELOPE\"\n | \"SCHEMA_NOT_FOUND\"\n | \"WRITE_SCHEMA_REQUIRED\"\n | \"MIGRATION_PATH_NOT_FOUND\"\n | \"MIGRATION_FAILED\"\n | \"MIGRATION_GRAPH_INVALID\"\n | \"RECONCILE_FAILED\"\n | \"SCHEMA_REGISTRATION_CONFLICT\"\n | \"TYPE_MISMATCH\"\n | \"MODE_CONFIGURATION_INVALID\";\n\n /**\n * The underlying error that caused this failure, if any.\n */\n readonly cause?: unknown;\n\n /**\n * Creates a new SchemaError.\n *\n * @param code - Machine-readable failure category\n * @param message - Human-readable error description\n * @param cause - Optional underlying error\n */\n constructor(code: SchemaError[\"code\"], message: string, cause?: unknown) {\n super(message);\n this.name = \"SchemaError\";\n this.code = code;\n this.cause = cause;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * The JSON envelope that wraps every value persisted by the library.\n *\n * All values are stored as `JSON.stringify({ version, payload })`. The\n * `version` field tells the read path which schema to use for validating\n * the `payload`.\n *\n * - When no schema is active (codec-only mode), `version` is `0` and\n * `payload` is a codec-encoded string.\n * - When a schema is active, `version` corresponds to the schema version\n * and `payload` is the JSON value directly (not string-encoded).\n *\n * @internal\n */\nexport type MnemonicEnvelope = {\n /**\n * Schema version number.\n *\n * Non-negative integer. Any version (including `0`) may have a\n * registered {@link KeySchema}.\n */\n version: number;\n\n /**\n * The stored value.\n *\n * For schema-managed keys, this is a JSON value (object, array,\n * string, number, boolean, or null). For codec-managed keys, this\n * is a string produced by `Codec.encode`.\n */\n payload: unknown;\n};\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { useSyncExternalStore, useMemo, useEffect, useRef, useCallback, useState } from \"react\";\nimport { useMnemonic } from \"./provider\";\nimport { JSONCodec, CodecError } from \"./codecs\";\nimport { SchemaError, type MnemonicEnvelope } from \"./schema\";\nimport { getRuntimeNodeEnv } from \"./runtime\";\nimport type { Mnemonic, MnemonicKeyDescriptor, MnemonicKeyState, UseMnemonicKeyOptions } from \"./types\";\n\nexport type ReadResult<T, Extra extends object = {}> = {\n value: T;\n rewriteRaw?: string;\n} & Extra;\n\ntype SharedMnemonicKeyContext<T> = {\n api: Mnemonic;\n key: string;\n codec: NonNullable<UseMnemonicKeyOptions<T>[\"codec\"]>;\n codecOpt: UseMnemonicKeyOptions<T>[\"codec\"];\n schema: UseMnemonicKeyOptions<T>[\"schema\"];\n reconcile: UseMnemonicKeyOptions<T>[\"reconcile\"];\n onMount: UseMnemonicKeyOptions<T>[\"onMount\"];\n onChange: UseMnemonicKeyOptions<T>[\"onChange\"];\n listenCrossTab: UseMnemonicKeyOptions<T>[\"listenCrossTab\"];\n getFallback: (error?: CodecError | SchemaError) => T;\n getServerValue: () => T;\n parseEnvelope: (rawText: string) =>\n | {\n ok: true;\n envelope: MnemonicEnvelope;\n }\n | {\n ok: false;\n error: SchemaError;\n };\n decodeStringPayload: <V>(payload: string, activeCodec: { decode: (encoded: string) => V }) => V;\n buildFallbackResult: <Extra extends object = {}>(\n error?: CodecError | SchemaError,\n extra?: Extra,\n ) => ReadResult<T, Extra>;\n developmentRuntime: boolean;\n contractFingerprint: string | null;\n hasMounted: boolean;\n setHasMounted: (value: boolean) => void;\n hydrationMode: NonNullable<UseMnemonicKeyOptions<T>[\"ssr\"]>[\"hydration\"] | undefined;\n ssrOptions: UseMnemonicKeyOptions<T>[\"ssr\"];\n};\n\ntype UseMnemonicKeyStateConfig<T, Extra extends object> = {\n decodeForRead: (rawText: string | null) => ReadResult<T, Extra>;\n encodeForWrite: (nextValue: T) => string;\n additionalDevWarnings?: (args: {\n api: Mnemonic;\n key: string;\n listenCrossTab: UseMnemonicKeyOptions<T>[\"listenCrossTab\"];\n codecOpt: UseMnemonicKeyOptions<T>[\"codec\"];\n schema: UseMnemonicKeyOptions<T>[\"schema\"];\n warnOnce: (id: string, message: string) => void;\n }) => void;\n onDecodedEffect?: (decoded: ReadResult<T, Extra>) => void;\n};\n\ntype ApplyReconcileArgs<T, Extra extends object> = {\n value: T;\n rewriteRaw?: string;\n extra?: Extra;\n persistedVersion: number;\n latestVersion?: number;\n serializeForPersist: (value: T) => string;\n deriveExtra?: (value: T, extra?: Extra) => Extra | undefined;\n};\n\nconst SSR_SNAPSHOT_TOKEN = Symbol(\"mnemonic:ssr-snapshot\");\nconst diagnosticContractRegistry = new WeakMap<object, Map<string, string>>();\nconst diagnosticWarningRegistry = new WeakMap<object, Set<string>>();\nconst diagnosticObjectIds = new WeakMap<object, number>();\nlet nextDiagnosticObjectId = 1;\n\nexport function serializeEnvelope(version: number, payload: unknown): string {\n return JSON.stringify({\n version,\n payload,\n } satisfies MnemonicEnvelope);\n}\n\nexport function withReadMetadata<T, Extra extends object = {}>(\n value: T,\n rewriteRaw?: string,\n extra?: Extra,\n): ReadResult<T, Extra> {\n const result = { value } as ReadResult<T, Extra>;\n if (extra !== undefined) {\n Object.assign(result, extra);\n }\n if (rewriteRaw !== undefined) result.rewriteRaw = rewriteRaw;\n return result;\n}\n\nfunction isDevelopmentRuntime(): boolean {\n return getRuntimeNodeEnv() === \"development\";\n}\n\nfunction getDiagnosticWarnings(api: object): Set<string> {\n let warnings = diagnosticWarningRegistry.get(api);\n if (!warnings) {\n warnings = new Set<string>();\n diagnosticWarningRegistry.set(api, warnings);\n }\n return warnings;\n}\n\nfunction warnOnce(api: object, id: string, message: string): void {\n const warnings = getDiagnosticWarnings(api);\n if (warnings.has(id)) return;\n warnings.add(id);\n console.warn(message);\n}\n\nfunction stableDiagnosticValue(value: unknown): string {\n if (typeof value === \"function\") {\n const source = Function.prototype.toString.call(value).split(/\\s+/).join(\" \").trim();\n const name = value.name || \"anonymous\";\n return `[factory:${name}/${value.length}:${source}]`;\n }\n if (typeof value === \"bigint\") return `${value.toString()}n`;\n if (typeof value === \"symbol\") return value.toString();\n if (value === undefined) return \"undefined\";\n try {\n return JSON.stringify(value);\n } catch {\n const tag = Object.prototype.toString.call(value);\n if (value !== null && (typeof value === \"object\" || typeof value === \"function\")) {\n return `${tag}#${getDiagnosticObjectId(value)}`;\n }\n return tag;\n }\n}\n\nfunction isObjectLike(value: unknown): value is object {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\n\nfunction objectHasOwn(value: object, property: PropertyKey): boolean {\n const hasOwn = (Object as typeof Object & { hasOwn?: (target: object, key: PropertyKey) => boolean }).hasOwn;\n if (typeof hasOwn === \"function\") {\n return hasOwn(value, property);\n }\n return Object.getOwnPropertyDescriptor(value, property) !== undefined;\n}\n\nfunction getDiagnosticObjectId(value: object): number {\n const existing = diagnosticObjectIds.get(value);\n if (existing !== undefined) return existing;\n const id = nextDiagnosticObjectId++;\n diagnosticObjectIds.set(value, id);\n return id;\n}\n\nfunction buildContractFingerprint<T>({\n api,\n key,\n defaultValue,\n codecOpt,\n schemaVersion,\n reconcile,\n listenCrossTab,\n ssrOptions,\n}: {\n api: object;\n key: string;\n defaultValue: UseMnemonicKeyOptions<T>[\"defaultValue\"];\n codecOpt: UseMnemonicKeyOptions<T>[\"codec\"];\n schemaVersion?: number;\n reconcile: UseMnemonicKeyOptions<T>[\"reconcile\"];\n listenCrossTab: UseMnemonicKeyOptions<T>[\"listenCrossTab\"];\n ssrOptions: UseMnemonicKeyOptions<T>[\"ssr\"];\n}): string {\n const codecSignature =\n codecOpt == null || !isObjectLike(codecOpt)\n ? \"default-json-codec\"\n : `codec:${stableDiagnosticValue((codecOpt as { encode?: unknown }).encode)}:${stableDiagnosticValue((codecOpt as { decode?: unknown }).decode)}`;\n const reconcileSignature =\n reconcile == null || !isObjectLike(reconcile)\n ? \"no-reconcile\"\n : `reconcile:${stableDiagnosticValue(reconcile)}`;\n\n return JSON.stringify({\n key,\n defaultValue: stableDiagnosticValue(defaultValue),\n codec: codecSignature,\n schemaVersion: schemaVersion ?? null,\n listenCrossTab: Boolean(listenCrossTab),\n reconcile: reconcileSignature,\n ssrHydration: ssrOptions?.hydration ?? null,\n hasServerValue: ssrOptions?.serverValue !== undefined,\n providerHydration: (api as { ssrHydration?: string }).ssrHydration ?? null,\n });\n}\n\nexport function resolveMnemonicKeyArgs<T>(\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options?: UseMnemonicKeyOptions<T>,\n): MnemonicKeyDescriptor<T, string> {\n if (typeof keyOrDescriptor !== \"string\") {\n return keyOrDescriptor;\n }\n if (!options) {\n throw new Error(\"useMnemonicKey requires options when called with a string key\");\n }\n return {\n key: keyOrDescriptor,\n options,\n };\n}\n\nexport function useMnemonicKeyShared<T>(\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options: UseMnemonicKeyOptions<T> | undefined,\n schemaVersion?: number,\n): SharedMnemonicKeyContext<T> {\n const descriptor = resolveMnemonicKeyArgs(keyOrDescriptor, options);\n const key = descriptor.key;\n const resolvedOptions = descriptor.options;\n const api = useMnemonic();\n\n const {\n defaultValue,\n onMount,\n onChange,\n listenCrossTab,\n codec: codecOpt,\n schema,\n reconcile,\n ssr: ssrOptions,\n } = resolvedOptions;\n\n const codec = codecOpt ?? JSONCodec;\n const hydrationMode = ssrOptions?.hydration ?? api.ssrHydration;\n const [hasMounted, setHasMounted] = useState(hydrationMode !== \"client-only\");\n const developmentRuntime = isDevelopmentRuntime();\n const contractFingerprint = useMemo(\n () =>\n developmentRuntime\n ? buildContractFingerprint({\n api,\n key,\n defaultValue,\n codecOpt,\n ...(schemaVersion === undefined ? {} : { schemaVersion }),\n reconcile,\n listenCrossTab,\n ssrOptions,\n })\n : null,\n [\n developmentRuntime,\n api,\n key,\n defaultValue,\n codecOpt,\n schemaVersion,\n reconcile,\n listenCrossTab,\n ssrOptions?.hydration,\n ssrOptions?.serverValue,\n ],\n );\n\n const getFallback = useCallback(\n (error?: CodecError | SchemaError) =>\n typeof defaultValue === \"function\"\n ? (defaultValue as (error?: CodecError | SchemaError) => T)(error)\n : defaultValue,\n [defaultValue],\n );\n\n const getServerValue = useCallback(() => {\n const serverValue = ssrOptions?.serverValue;\n if (serverValue === undefined) {\n return getFallback();\n }\n return typeof serverValue === \"function\" ? (serverValue as () => T)() : serverValue;\n }, [getFallback, ssrOptions?.serverValue]);\n\n const parseEnvelope = useCallback(\n (rawText: string): { ok: true; envelope: MnemonicEnvelope } | { ok: false; error: SchemaError } => {\n try {\n const parsed = JSON.parse(rawText) as MnemonicEnvelope;\n if (\n typeof parsed !== \"object\" ||\n parsed == null ||\n !Number.isInteger(parsed.version) ||\n parsed.version < 0 ||\n !objectHasOwn(parsed, \"payload\")\n ) {\n return {\n ok: false,\n error: new SchemaError(\"INVALID_ENVELOPE\", `Invalid envelope for key \"${key}\"`),\n };\n }\n return { ok: true, envelope: parsed };\n } catch (err) {\n return {\n ok: false,\n error: new SchemaError(\"INVALID_ENVELOPE\", `Invalid envelope for key \"${key}\"`, err),\n };\n }\n },\n [key],\n );\n\n const decodeStringPayload = useCallback(\n <V>(payload: string, activeCodec: { decode: (encoded: string) => V }) => {\n try {\n return activeCodec.decode(payload);\n } catch (err) {\n throw err instanceof CodecError ? err : new CodecError(`Codec decode failed for key \"${key}\"`, err);\n }\n },\n [key],\n );\n\n const buildFallbackResult = useCallback(\n <Extra extends object = {}>(error?: CodecError | SchemaError, extra?: Extra): ReadResult<T, Extra> => {\n return withReadMetadata(getFallback(error), undefined, extra);\n },\n [getFallback],\n );\n\n return {\n api,\n key,\n codec,\n codecOpt,\n schema,\n reconcile,\n onMount,\n onChange,\n listenCrossTab,\n getFallback,\n getServerValue,\n parseEnvelope,\n decodeStringPayload,\n buildFallbackResult,\n developmentRuntime,\n contractFingerprint,\n hasMounted,\n setHasMounted,\n hydrationMode,\n ssrOptions,\n };\n}\n\nexport function useApplyReconcile<T, Extra extends object = {}>({\n key,\n reconcile,\n buildFallbackResult,\n}: {\n key: string;\n reconcile: UseMnemonicKeyOptions<T>[\"reconcile\"];\n buildFallbackResult: <ResultExtra extends object = {}>(\n error?: CodecError | SchemaError,\n extra?: ResultExtra,\n ) => ReadResult<T, ResultExtra>;\n}) {\n return useCallback(\n ({\n value,\n rewriteRaw,\n extra,\n persistedVersion,\n latestVersion,\n serializeForPersist,\n deriveExtra,\n }: ApplyReconcileArgs<T, Extra>): ReadResult<T, Extra> => {\n if (!reconcile) {\n return withReadMetadata(value, rewriteRaw, extra);\n }\n\n const context: { key: string; persistedVersion: number; latestVersion?: number } = {\n key,\n persistedVersion,\n };\n if (latestVersion !== undefined) {\n context.latestVersion = latestVersion;\n }\n\n const baselineSerialized = (() => {\n try {\n return serializeForPersist(value);\n } catch {\n return rewriteRaw;\n }\n })();\n\n try {\n const reconciled = reconcile(value, context);\n const nextExtra = deriveExtra ? deriveExtra(reconciled, extra) : extra;\n const nextSerialized = serializeForPersist(reconciled);\n const nextRewriteRaw =\n baselineSerialized === undefined || nextSerialized !== baselineSerialized\n ? nextSerialized\n : rewriteRaw;\n return withReadMetadata(reconciled, nextRewriteRaw, nextExtra);\n } catch (err) {\n const typedErr =\n err instanceof SchemaError\n ? err\n : new SchemaError(\"RECONCILE_FAILED\", `Reconciliation failed for key \"${key}\"`, err);\n return buildFallbackResult(typedErr, extra);\n }\n },\n [buildFallbackResult, key, reconcile],\n );\n}\n\nexport function useMnemonicKeyState<T, Extra extends object>(\n shared: SharedMnemonicKeyContext<T>,\n config: UseMnemonicKeyStateConfig<T, Extra>,\n): MnemonicKeyState<T> {\n const {\n api,\n key,\n codecOpt,\n schema,\n onMount,\n onChange,\n listenCrossTab,\n getFallback,\n getServerValue,\n developmentRuntime,\n contractFingerprint,\n hasMounted,\n setHasMounted,\n hydrationMode,\n ssrOptions,\n } = shared;\n const { decodeForRead, encodeForWrite, additionalDevWarnings, onDecodedEffect } = config;\n\n const getServerRawSnapshot = useCallback(\n (): string | typeof SSR_SNAPSHOT_TOKEN | null =>\n ssrOptions?.serverValue === undefined ? null : SSR_SNAPSHOT_TOKEN,\n [ssrOptions?.serverValue],\n );\n\n const deferStorageRead = hydrationMode === \"client-only\" && !hasMounted;\n const subscribe = useCallback(\n (listener: () => void) => {\n if (deferStorageRead) {\n return () => undefined;\n }\n return api.subscribeRaw(key, listener);\n },\n [api, deferStorageRead, key],\n );\n\n const raw = useSyncExternalStore(\n subscribe,\n () => (deferStorageRead ? getServerRawSnapshot() : api.getRawSnapshot(key)),\n getServerRawSnapshot,\n );\n\n const decoded = useMemo(() => {\n if (raw === SSR_SNAPSHOT_TOKEN) {\n return withReadMetadata<T, Extra>(getServerValue());\n }\n return decodeForRead(raw);\n }, [decodeForRead, getServerValue, raw]);\n const value = decoded.value;\n\n useEffect(() => {\n if (!developmentRuntime) return;\n\n const globalWindow = (globalThis as { window?: Window }).window;\n\n if (listenCrossTab && (api.crossTabSyncMode ?? \"none\") === \"none\" && globalWindow !== undefined) {\n warnOnce(\n api,\n `listenCrossTab:${key}`,\n `[Mnemonic] useMnemonicKey(\"${key}\") enabled listenCrossTab, but the active storage backend may not be able to notify external changes. If you're using a custom Storage-like wrapper around localStorage, ensure it forwards browser \"storage\" events or implements storage.onExternalChange(...); otherwise, use localStorage or implement storage.onExternalChange(...) on your custom backend.`,\n );\n }\n\n additionalDevWarnings?.({\n api,\n key,\n listenCrossTab,\n codecOpt,\n schema,\n warnOnce: (id, message) => warnOnce(api, id, message),\n });\n\n let keyContracts = diagnosticContractRegistry.get(api);\n if (!keyContracts) {\n keyContracts = new Map<string, string>();\n diagnosticContractRegistry.set(api, keyContracts);\n }\n\n if (contractFingerprint === null) {\n return;\n }\n const previousContract = keyContracts.get(key);\n if (previousContract === undefined) {\n keyContracts.set(key, contractFingerprint);\n return;\n }\n if (previousContract === contractFingerprint) {\n return;\n }\n\n warnOnce(\n api,\n `contract-conflict:${key}`,\n `[Mnemonic] Conflicting useMnemonicKey contracts detected for key \"${key}\" in namespace \"${api.prefix.slice(0, -1)}\". Reuse a shared descriptor with defineMnemonicKey(...) or align defaultValue/codec/schema/reconcile options so every consumer describes the same persisted contract.`,\n );\n }, [\n additionalDevWarnings,\n api,\n key,\n developmentRuntime,\n contractFingerprint,\n listenCrossTab,\n codecOpt,\n schema,\n api.crossTabSyncMode,\n ]);\n\n useEffect(() => {\n if (hasMounted) return;\n setHasMounted(true);\n }, [hasMounted, setHasMounted]);\n\n useEffect(() => {\n if (decoded.rewriteRaw && decoded.rewriteRaw !== raw) {\n api.setRaw(key, decoded.rewriteRaw);\n }\n }, [api, decoded.rewriteRaw, key, raw]);\n\n useEffect(() => {\n onDecodedEffect?.(decoded);\n }, [decoded, onDecodedEffect]);\n\n const prevRef = useRef<T>(value);\n\n const mounted = useRef(false);\n useEffect(() => {\n if (mounted.current) return;\n mounted.current = true;\n onMount?.(value);\n prevRef.current = value;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const prev = prevRef.current;\n if (Object.is(prev, value)) return;\n prevRef.current = value;\n onChange?.(value, prev);\n }, [value, onChange]);\n\n useEffect(() => {\n if (!listenCrossTab) return;\n const globalWindow = (globalThis as { window?: Window }).window;\n if (globalWindow === undefined) return;\n\n const storageKey = api.prefix + key;\n\n const handler = (e: StorageEvent) => {\n if (e.key === null) {\n api.removeRaw(key);\n return;\n }\n if (e.key !== storageKey) return;\n if (e.newValue == null) {\n api.removeRaw(key);\n return;\n }\n api.setRaw(key, e.newValue);\n };\n\n globalWindow.addEventListener(\"storage\", handler);\n return () => globalWindow.removeEventListener(\"storage\", handler);\n }, [listenCrossTab, api, key]);\n\n const set = useMemo(() => {\n return (next: T | ((cur: T) => T)) => {\n const nextVal =\n typeof next === \"function\" ? (next as (c: T) => T)(decodeForRead(api.getRawSnapshot(key)).value) : next;\n try {\n const encoded = encodeForWrite(nextVal);\n api.setRaw(key, encoded);\n } catch (err) {\n if (err instanceof SchemaError) {\n console.error(`[Mnemonic] Schema error for key \"${key}\" (${err.code}):`, err.message);\n return;\n }\n if (err instanceof CodecError) {\n console.error(`[Mnemonic] Codec encode error for key \"${key}\":`, err.message);\n return;\n }\n console.error(`[Mnemonic] Failed to persist key \"${key}\":`, err);\n }\n };\n }, [api, key, decodeForRead, encodeForWrite]);\n\n const reset = useMemo(() => {\n return () => {\n const v = getFallback();\n try {\n const encoded = encodeForWrite(v);\n api.setRaw(key, encoded);\n } catch (err) {\n if (err instanceof SchemaError) {\n console.error(`[Mnemonic] Schema error for key \"${key}\" (${err.code}):`, err.message);\n return;\n }\n if (err instanceof CodecError) {\n console.error(`[Mnemonic] Codec encode error for key \"${key}\":`, err.message);\n }\n return;\n }\n };\n }, [api, key, getFallback, encodeForWrite]);\n\n const remove = useMemo(() => {\n return () => api.removeRaw(key);\n }, [api, key]);\n\n return useMemo<MnemonicKeyState<T>>(\n () => ({\n value,\n set,\n reset,\n remove,\n }),\n [value, set, reset, remove],\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { useCallback } from \"react\";\nimport { CodecError } from \"./codecs\";\nimport { SchemaError, type MnemonicEnvelope } from \"./schema\";\nimport { serializeEnvelope, useApplyReconcile, useMnemonicKeyShared, useMnemonicKeyState } from \"./use-shared\";\nimport type { MnemonicKeyDescriptor, MnemonicKeyState, UseMnemonicKeyOptions } from \"./types\";\n\nfunction throwCoreSchemaImportError(key: string): never {\n throw new Error(\n `[Mnemonic] useMnemonicKey(\"${key}\") requested schema features from react-mnemonic/core. Import useMnemonicKey from \"react-mnemonic/schema\" or \"react-mnemonic\" for schema validation, autoschema, and migration support.`,\n );\n}\n\nfunction useCoreRuntime<T>(\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options?: UseMnemonicKeyOptions<T>,\n): MnemonicKeyState<T> {\n const shared = useMnemonicKeyShared(keyOrDescriptor, options);\n const { api, key, codec, schema, reconcile, parseEnvelope, decodeStringPayload, buildFallbackResult } = shared;\n\n if (schema?.version !== undefined || api.schemaMode !== \"default\") {\n throwCoreSchemaImportError(key);\n }\n\n const applyReconcile = useApplyReconcile<T>({\n key,\n reconcile,\n buildFallbackResult,\n });\n\n const encodeForWrite = useCallback(\n (nextValue: T): string => {\n return serializeEnvelope(0, codec.encode(nextValue));\n },\n [codec],\n );\n\n const decodeForRead = useCallback(\n (rawText: string | null) => {\n if (rawText == null) return buildFallbackResult();\n\n const parsed = parseEnvelope(rawText);\n if (!parsed.ok) return buildFallbackResult(parsed.error);\n\n const envelope: MnemonicEnvelope = parsed.envelope;\n if (typeof envelope.payload !== \"string\") {\n return applyReconcile({\n value: envelope.payload as T,\n persistedVersion: envelope.version,\n serializeForPersist: encodeForWrite,\n });\n }\n\n try {\n const decoded = decodeStringPayload<T>(envelope.payload, codec);\n return applyReconcile({\n value: decoded,\n persistedVersion: envelope.version,\n serializeForPersist: encodeForWrite,\n });\n } catch (err) {\n return buildFallbackResult(err as CodecError | SchemaError);\n }\n },\n [applyReconcile, buildFallbackResult, codec, decodeStringPayload, encodeForWrite, parseEnvelope],\n );\n\n const additionalDevWarnings = useCallback(\n ({ warnOnce }: { warnOnce: (id: string, message: string) => void }) => {\n if (!api.schemaRegistry) return;\n warnOnce(\n `core-schema-registry:${key}`,\n `[Mnemonic] useMnemonicKey(\"${key}\") is running from react-mnemonic/core, so registered schemas are ignored for this key. Import useMnemonicKey from \"react-mnemonic/schema\" or \"react-mnemonic\" to enable schema validation and migrations.`,\n );\n },\n [api.schemaRegistry, key],\n );\n\n return useMnemonicKeyState(shared, {\n decodeForRead,\n encodeForWrite,\n additionalDevWarnings,\n });\n}\n\nexport function useMnemonicKey<T, K extends string>(descriptor: MnemonicKeyDescriptor<T, K>): MnemonicKeyState<T>;\nexport function useMnemonicKey<T>(key: string, options: UseMnemonicKeyOptions<T>): MnemonicKeyState<T>;\nexport function useMnemonicKey<T>(\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options?: UseMnemonicKeyOptions<T>,\n): MnemonicKeyState<T> {\n return useCoreRuntime(keyOrDescriptor, options);\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { useCallback, useMemo } from \"react\";\nimport { useMnemonic } from \"./provider\";\nimport { getRuntimeNodeEnv } from \"./runtime\";\nimport type {\n MnemonicRecoveryAction,\n MnemonicRecoveryEvent,\n MnemonicRecoveryHook,\n UseMnemonicRecoveryOptions,\n} from \"./types\";\n\nfunction uniqueKeys(keys: readonly string[]): string[] {\n return [...new Set(keys)];\n}\n\nfunction isDevelopmentRuntime(): boolean {\n return getRuntimeNodeEnv() === \"development\";\n}\n\nconst recoveryDiagnosticWarnings = new WeakMap<object, Set<string>>();\n\nfunction warnRecoveryOnce(api: object, id: string, message: string): void {\n let warnings = recoveryDiagnosticWarnings.get(api);\n if (!warnings) {\n warnings = new Set<string>();\n recoveryDiagnosticWarnings.set(api, warnings);\n }\n if (warnings.has(id)) return;\n warnings.add(id);\n console.warn(message);\n}\n\n/**\n * Hook for namespace-scoped recovery actions such as hard reset and selective clear.\n *\n * Applications can use this to offer self-service recovery UX for corrupt or\n * legacy persisted state. The hook operates on the current provider namespace.\n *\n * See the\n * [Reset and Recovery guide](https://thirtytwobits.github.io/react-mnemonic/docs/guides/reset-and-recovery)\n * for soft-reset and hard-reset patterns.\n *\n * @param options - Optional recovery callback for telemetry/auditing\n * @returns Namespace recovery helpers\n *\n * @throws {Error} If used outside of a MnemonicProvider\n */\nexport function useMnemonicRecovery(options: UseMnemonicRecoveryOptions = {}): MnemonicRecoveryHook {\n const api = useMnemonic();\n const { onRecover } = options;\n\n const namespace = useMemo(() => (api.prefix.endsWith(\".\") ? api.prefix.slice(0, -1) : api.prefix), [api.prefix]);\n\n const emitRecovery = useCallback(\n (action: MnemonicRecoveryAction, clearedKeys: string[]) => {\n const event: MnemonicRecoveryEvent = {\n action,\n namespace,\n clearedKeys,\n };\n onRecover?.(event);\n },\n [namespace, onRecover],\n );\n\n const listKeys = useCallback(() => api.keys(), [api]);\n\n const clearResolvedKeys = useCallback(\n (action: MnemonicRecoveryAction, keys: readonly string[]) => {\n const clearedKeys = uniqueKeys(keys);\n for (const key of clearedKeys) {\n api.removeRaw(key);\n }\n emitRecovery(action, clearedKeys);\n return clearedKeys;\n },\n [api, emitRecovery],\n );\n\n const clearKeys = useCallback(\n (keys: readonly string[]) => clearResolvedKeys(\"clear-keys\", keys),\n [clearResolvedKeys],\n );\n\n const clearAll = useCallback(() => {\n if (!api.canEnumerateKeys) {\n if (isDevelopmentRuntime()) {\n warnRecoveryOnce(\n api,\n \"recovery-clear-all-non-enumerable\",\n `[Mnemonic] clearAll() requires an enumerable storage backend in namespace \"${namespace}\". Use clearKeys([...]) with an explicit durable-key list, or supply a storage backend that implements length and key(index).`,\n );\n }\n throw new Error(\n \"clearAll requires an enumerable storage backend. Use clearKeys([...]) with an explicit key list instead.\",\n );\n }\n return clearResolvedKeys(\"clear-all\", api.keys());\n }, [api, clearResolvedKeys, namespace]);\n\n const clearMatching = useCallback(\n (predicate: (key: string) => boolean) => {\n if (!api.canEnumerateKeys) {\n if (isDevelopmentRuntime()) {\n warnRecoveryOnce(\n api,\n \"recovery-clear-matching-non-enumerable\",\n `[Mnemonic] clearMatching() requires an enumerable storage backend in namespace \"${namespace}\". Use clearKeys([...]) with an explicit durable-key list, or supply a storage backend that implements length and key(index).`,\n );\n }\n throw new Error(\n \"clearMatching requires an enumerable storage backend. Use clearKeys([...]) with an explicit key list instead.\",\n );\n }\n return clearResolvedKeys(\n \"clear-matching\",\n api.keys().filter((key) => predicate(key)),\n );\n },\n [api, clearResolvedKeys, namespace],\n );\n\n return useMemo(\n () => ({\n namespace,\n canEnumerateKeys: api.canEnumerateKeys,\n listKeys,\n clearAll,\n clearKeys,\n clearMatching,\n }),\n [namespace, api.canEnumerateKeys, listKeys, clearAll, clearKeys, clearMatching],\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport type { JsonSchema } from \"./json-schema\";\nimport type { KeySchema, MnemonicKeyDescriptor, SchemaBoundKeyOptions, UseMnemonicKeyOptions } from \"./types\";\n\n/**\n * Define a reusable, importable contract for a persisted key.\n *\n * This packages the storage key and the canonical `useMnemonicKey(...)`\n * options into a single object that can be shared across components, docs,\n * and generated code.\n *\n * @template K - The literal storage key name\n * @template T - The decoded value type for the key\n *\n * @param key - The unprefixed storage key\n * @param options - Canonical hook options for the key\n * @returns A descriptor that can be passed directly to `useMnemonicKey(...)`\n *\n * @example\n * ```typescript\n * const themeKey = defineMnemonicKey(\"theme\", {\n * defaultValue: \"light\" as \"light\" | \"dark\",\n * listenCrossTab: true,\n * });\n *\n * const { value, set } = useMnemonicKey(themeKey);\n * ```\n */\nexport function defineMnemonicKey<const K extends string, T>(\n key: K,\n options: UseMnemonicKeyOptions<T>,\n): MnemonicKeyDescriptor<T, K>;\nexport function defineMnemonicKey<const K extends string, TSchema extends KeySchema<unknown, K, JsonSchema>>(\n keySchema: TSchema,\n options: SchemaBoundKeyOptions<TSchema extends KeySchema<infer TValue, string, JsonSchema> ? TValue : never>,\n): MnemonicKeyDescriptor<TSchema extends KeySchema<infer TValue, string, JsonSchema> ? TValue : never, TSchema[\"key\"]>;\nexport function defineMnemonicKey(\n keyOrSchema: string | KeySchema<unknown, string, JsonSchema>,\n options: UseMnemonicKeyOptions<unknown> | SchemaBoundKeyOptions<unknown>,\n): MnemonicKeyDescriptor<unknown, string> {\n if (typeof keyOrSchema !== \"string\") {\n return Object.freeze({\n key: keyOrSchema.key,\n options: {\n ...options,\n schema: { version: keyOrSchema.version },\n },\n });\n }\n\n return Object.freeze({\n key: keyOrSchema,\n options,\n });\n}\n"]}
|
package/dist/core.d.cts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { M as MnemonicProviderOptions, a as MnemonicKeyDescriptor, b as MnemonicKeyState, U as UseMnemonicKeyOptions } from './key-BvFvcKiR.cjs';
|
|
3
|
+
export { C as Codec, c as CodecError, J as JSONCodec, L as Listener, d as Mnemonic, e as MnemonicDevToolsCapabilities, f as MnemonicDevToolsMeta, g as MnemonicDevToolsProviderApi, h as MnemonicDevToolsProviderDescriptor, i as MnemonicDevToolsProviderEntry, j as MnemonicDevToolsRegistry, k as MnemonicDevToolsWeakRef, l as MnemonicHydrationMode, m as MnemonicKeySSRConfig, n as MnemonicProviderSSRConfig, o as MnemonicRecoveryAction, p as MnemonicRecoveryEvent, q as MnemonicRecoveryHook, R as ReconcileContext, S as SchemaError, r as SchemaMode, s as StorageLike, t as Unsubscribe, u as UseMnemonicRecoveryOptions, v as createCodec, w as defineMnemonicKey, x as useMnemonicRecovery } from './key-BvFvcKiR.cjs';
|
|
4
|
+
|
|
5
|
+
type CoreMnemonicProviderOptions = Omit<MnemonicProviderOptions, "schemaMode" | "schemaRegistry">;
|
|
6
|
+
|
|
7
|
+
interface MnemonicProviderProps extends Readonly<CoreMnemonicProviderOptions> {
|
|
8
|
+
readonly children: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
declare function MnemonicProvider(props: Readonly<MnemonicProviderProps>): ReactNode;
|
|
11
|
+
|
|
12
|
+
declare function useMnemonicKey<T, K extends string>(descriptor: MnemonicKeyDescriptor<T, K>): MnemonicKeyState<T>;
|
|
13
|
+
declare function useMnemonicKey<T>(key: string, options: UseMnemonicKeyOptions<T>): MnemonicKeyState<T>;
|
|
14
|
+
|
|
15
|
+
export { MnemonicKeyDescriptor, MnemonicKeyState, MnemonicProvider, type CoreMnemonicProviderOptions as MnemonicProviderOptions, type MnemonicProviderProps, UseMnemonicKeyOptions, useMnemonicKey };
|
package/dist/core.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { M as MnemonicProviderOptions, a as MnemonicKeyDescriptor, b as MnemonicKeyState, U as UseMnemonicKeyOptions } from './key-BvFvcKiR.js';
|
|
3
|
+
export { C as Codec, c as CodecError, J as JSONCodec, L as Listener, d as Mnemonic, e as MnemonicDevToolsCapabilities, f as MnemonicDevToolsMeta, g as MnemonicDevToolsProviderApi, h as MnemonicDevToolsProviderDescriptor, i as MnemonicDevToolsProviderEntry, j as MnemonicDevToolsRegistry, k as MnemonicDevToolsWeakRef, l as MnemonicHydrationMode, m as MnemonicKeySSRConfig, n as MnemonicProviderSSRConfig, o as MnemonicRecoveryAction, p as MnemonicRecoveryEvent, q as MnemonicRecoveryHook, R as ReconcileContext, S as SchemaError, r as SchemaMode, s as StorageLike, t as Unsubscribe, u as UseMnemonicRecoveryOptions, v as createCodec, w as defineMnemonicKey, x as useMnemonicRecovery } from './key-BvFvcKiR.js';
|
|
4
|
+
|
|
5
|
+
type CoreMnemonicProviderOptions = Omit<MnemonicProviderOptions, "schemaMode" | "schemaRegistry">;
|
|
6
|
+
|
|
7
|
+
interface MnemonicProviderProps extends Readonly<CoreMnemonicProviderOptions> {
|
|
8
|
+
readonly children: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
declare function MnemonicProvider(props: Readonly<MnemonicProviderProps>): ReactNode;
|
|
11
|
+
|
|
12
|
+
declare function useMnemonicKey<T, K extends string>(descriptor: MnemonicKeyDescriptor<T, K>): MnemonicKeyState<T>;
|
|
13
|
+
declare function useMnemonicKey<T>(key: string, options: UseMnemonicKeyOptions<T>): MnemonicKeyState<T>;
|
|
14
|
+
|
|
15
|
+
export { MnemonicKeyDescriptor, MnemonicKeyState, MnemonicProvider, type CoreMnemonicProviderOptions as MnemonicProviderOptions, type MnemonicProviderProps, UseMnemonicKeyOptions, useMnemonicKey };
|