react-mnemonic 1.2.0-beta1 → 1.3.0

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.
@@ -0,0 +1,47 @@
1
+ import { u as UseMnemonicRecoveryOptions, q as MnemonicRecoveryHook, U as UseMnemonicKeyOptions, a as MnemonicKeyDescriptor, K as KeySchema, z as JsonSchema, A as SchemaBoundKeyOptions } from './types-DcdXbmVl.cjs';
2
+
3
+ /**
4
+ * Hook for namespace-scoped recovery actions such as hard reset and selective clear.
5
+ *
6
+ * Applications can use this to offer self-service recovery UX for corrupt or
7
+ * legacy persisted state. The hook operates on the current provider namespace.
8
+ *
9
+ * See the
10
+ * [Reset and Recovery guide](https://thirtytwobits.github.io/react-mnemonic/docs/guides/reset-and-recovery)
11
+ * for soft-reset and hard-reset patterns.
12
+ *
13
+ * @param options - Optional recovery callback for telemetry/auditing
14
+ * @returns Namespace recovery helpers
15
+ *
16
+ * @throws {Error} If used outside of a MnemonicProvider
17
+ */
18
+ declare function useMnemonicRecovery(options?: UseMnemonicRecoveryOptions): MnemonicRecoveryHook;
19
+
20
+ /**
21
+ * Define a reusable, importable contract for a persisted key.
22
+ *
23
+ * This packages the storage key and the canonical `useMnemonicKey(...)`
24
+ * options into a single object that can be shared across components, docs,
25
+ * and generated code.
26
+ *
27
+ * @template K - The literal storage key name
28
+ * @template T - The decoded value type for the key
29
+ *
30
+ * @param key - The unprefixed storage key
31
+ * @param options - Canonical hook options for the key
32
+ * @returns A descriptor that can be passed directly to `useMnemonicKey(...)`
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * const themeKey = defineMnemonicKey("theme", {
37
+ * defaultValue: "light" as "light" | "dark",
38
+ * listenCrossTab: true,
39
+ * });
40
+ *
41
+ * const { value, set } = useMnemonicKey(themeKey);
42
+ * ```
43
+ */
44
+ declare function defineMnemonicKey<const K extends string, T>(key: K, options: UseMnemonicKeyOptions<T>): MnemonicKeyDescriptor<T, K>;
45
+ declare function defineMnemonicKey<const K extends string, TSchema extends KeySchema<unknown, K, JsonSchema>>(keySchema: TSchema, options: SchemaBoundKeyOptions<TSchema extends KeySchema<infer TValue, string, JsonSchema> ? TValue : never>): MnemonicKeyDescriptor<TSchema extends KeySchema<infer TValue, string, JsonSchema> ? TValue : never, TSchema["key"]>;
46
+
47
+ export { defineMnemonicKey as d, useMnemonicRecovery as u };
@@ -0,0 +1,47 @@
1
+ import { u as UseMnemonicRecoveryOptions, q as MnemonicRecoveryHook, U as UseMnemonicKeyOptions, a as MnemonicKeyDescriptor, K as KeySchema, z as JsonSchema, A as SchemaBoundKeyOptions } from './types-DcdXbmVl.js';
2
+
3
+ /**
4
+ * Hook for namespace-scoped recovery actions such as hard reset and selective clear.
5
+ *
6
+ * Applications can use this to offer self-service recovery UX for corrupt or
7
+ * legacy persisted state. The hook operates on the current provider namespace.
8
+ *
9
+ * See the
10
+ * [Reset and Recovery guide](https://thirtytwobits.github.io/react-mnemonic/docs/guides/reset-and-recovery)
11
+ * for soft-reset and hard-reset patterns.
12
+ *
13
+ * @param options - Optional recovery callback for telemetry/auditing
14
+ * @returns Namespace recovery helpers
15
+ *
16
+ * @throws {Error} If used outside of a MnemonicProvider
17
+ */
18
+ declare function useMnemonicRecovery(options?: UseMnemonicRecoveryOptions): MnemonicRecoveryHook;
19
+
20
+ /**
21
+ * Define a reusable, importable contract for a persisted key.
22
+ *
23
+ * This packages the storage key and the canonical `useMnemonicKey(...)`
24
+ * options into a single object that can be shared across components, docs,
25
+ * and generated code.
26
+ *
27
+ * @template K - The literal storage key name
28
+ * @template T - The decoded value type for the key
29
+ *
30
+ * @param key - The unprefixed storage key
31
+ * @param options - Canonical hook options for the key
32
+ * @returns A descriptor that can be passed directly to `useMnemonicKey(...)`
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * const themeKey = defineMnemonicKey("theme", {
37
+ * defaultValue: "light" as "light" | "dark",
38
+ * listenCrossTab: true,
39
+ * });
40
+ *
41
+ * const { value, set } = useMnemonicKey(themeKey);
42
+ * ```
43
+ */
44
+ declare function defineMnemonicKey<const K extends string, T>(key: K, options: UseMnemonicKeyOptions<T>): MnemonicKeyDescriptor<T, K>;
45
+ declare function defineMnemonicKey<const K extends string, TSchema extends KeySchema<unknown, K, JsonSchema>>(keySchema: TSchema, options: SchemaBoundKeyOptions<TSchema extends KeySchema<infer TValue, string, JsonSchema> ? TValue : never>): MnemonicKeyDescriptor<TSchema extends KeySchema<infer TValue, string, JsonSchema> ? TValue : never, TSchema["key"]>;
46
+
47
+ export { defineMnemonicKey as d, useMnemonicRecovery as u };
@@ -0,0 +1,166 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+
5
+ // src/Mnemonic/use-key-optional.ts
6
+ var MnemonicOptionalBridgeContext = react.createContext(null);
7
+ function useMnemonicOptionalBridge() {
8
+ return react.useContext(MnemonicOptionalBridgeContext);
9
+ }
10
+ function toPublicMnemonicOptionalBridge(bridge) {
11
+ if (!bridge) {
12
+ return null;
13
+ }
14
+ return {
15
+ namespace: bridge.namespace,
16
+ capabilities: bridge.capabilities
17
+ };
18
+ }
19
+
20
+ // src/Mnemonic/use-key-optional.ts
21
+ var SSR_SNAPSHOT_TOKEN = /* @__PURE__ */ Symbol("mnemonic:optional-ssr-snapshot");
22
+ function resolveOptionalDescriptor(keyOrDescriptor, options) {
23
+ if (typeof keyOrDescriptor !== "string") {
24
+ return keyOrDescriptor;
25
+ }
26
+ if (!options) {
27
+ throw new Error("useMnemonicKeyOptional requires options when called with a string key");
28
+ }
29
+ return {
30
+ key: keyOrDescriptor,
31
+ options
32
+ };
33
+ }
34
+ function resolveOptionalDefaultValue(defaultValue) {
35
+ return typeof defaultValue === "function" ? defaultValue() : defaultValue;
36
+ }
37
+ function resolveOptionalServerValue(options) {
38
+ const serverValue = options.ssr?.serverValue;
39
+ if (serverValue !== void 0) {
40
+ return typeof serverValue === "function" ? serverValue() : serverValue;
41
+ }
42
+ return resolveOptionalDefaultValue(options.defaultValue);
43
+ }
44
+ function useMnemonicOptional() {
45
+ const bridge = useMnemonicOptionalBridge();
46
+ return react.useMemo(() => toPublicMnemonicOptionalBridge(bridge), [bridge]);
47
+ }
48
+ function useMnemonicKeyOptional(keyOrDescriptor, options) {
49
+ const bridge = useMnemonicOptionalBridge();
50
+ const descriptor = resolveOptionalDescriptor(keyOrDescriptor, options);
51
+ const key = descriptor.key;
52
+ const resolvedOptions = descriptor.options;
53
+ const { defaultValue, onMount, onChange } = resolvedOptions;
54
+ const hasBridge = bridge !== null;
55
+ const getFallback = react.useCallback(() => resolveOptionalDefaultValue(defaultValue), [defaultValue]);
56
+ const getServerValue = react.useCallback(() => resolveOptionalServerValue(resolvedOptions), [resolvedOptions]);
57
+ const [memoryValue, setMemoryValue] = react.useState(() => getServerValue());
58
+ const raw = react.useSyncExternalStore(
59
+ react.useCallback(
60
+ (listener) => {
61
+ if (!bridge) {
62
+ return () => void 0;
63
+ }
64
+ return bridge.subscribeRaw(key, listener);
65
+ },
66
+ [bridge, key]
67
+ ),
68
+ react.useCallback(() => bridge ? bridge.getRawSnapshot(key) : null, [bridge, key]),
69
+ react.useCallback(
70
+ () => resolvedOptions.ssr?.serverValue === void 0 ? null : SSR_SNAPSHOT_TOKEN,
71
+ [resolvedOptions.ssr?.serverValue]
72
+ )
73
+ );
74
+ const bridgeSnapshot = react.useMemo(() => {
75
+ if (!bridge) {
76
+ return null;
77
+ }
78
+ if (raw === SSR_SNAPSHOT_TOKEN) {
79
+ return {
80
+ value: getServerValue()
81
+ };
82
+ }
83
+ return bridge.decodeSnapshot(key, raw, resolvedOptions);
84
+ }, [bridge, getServerValue, key, raw, resolvedOptions]);
85
+ react.useEffect(() => {
86
+ if (!bridge || !bridgeSnapshot || raw === SSR_SNAPSHOT_TOKEN) {
87
+ return;
88
+ }
89
+ bridge.commitSnapshot(key, raw, bridgeSnapshot);
90
+ }, [bridge, bridgeSnapshot, key, raw]);
91
+ const value = hasBridge ? bridgeSnapshot?.value ?? memoryValue : memoryValue;
92
+ const mountedRef = react.useRef(false);
93
+ const previousRef = react.useRef(value);
94
+ react.useEffect(() => {
95
+ if (mountedRef.current) {
96
+ return;
97
+ }
98
+ mountedRef.current = true;
99
+ onMount?.(value);
100
+ previousRef.current = value;
101
+ }, []);
102
+ react.useEffect(() => {
103
+ const previous = previousRef.current;
104
+ if (Object.is(previous, value)) {
105
+ return;
106
+ }
107
+ previousRef.current = value;
108
+ onChange?.(value, previous);
109
+ }, [onChange, value]);
110
+ const set = react.useMemo(
111
+ () => (next) => {
112
+ if (bridge) {
113
+ const nextValue = typeof next === "function" ? next(
114
+ bridge.decodeSnapshot(key, bridge.getRawSnapshot(key), resolvedOptions).value
115
+ ) : next;
116
+ bridge.setValue(key, nextValue, resolvedOptions);
117
+ return;
118
+ }
119
+ setMemoryValue((current) => typeof next === "function" ? next(current) : next);
120
+ },
121
+ [bridge, key, resolvedOptions]
122
+ );
123
+ const reset = react.useMemo(
124
+ () => () => {
125
+ if (bridge) {
126
+ bridge.setValue(key, getFallback(), resolvedOptions);
127
+ return;
128
+ }
129
+ setMemoryValue(getFallback());
130
+ },
131
+ [bridge, getFallback, key, resolvedOptions]
132
+ );
133
+ const remove = react.useMemo(
134
+ () => () => {
135
+ if (bridge) {
136
+ bridge.removeValue(key);
137
+ return;
138
+ }
139
+ setMemoryValue(getFallback());
140
+ },
141
+ [bridge, getFallback, key]
142
+ );
143
+ return react.useMemo(
144
+ () => ({
145
+ value,
146
+ set,
147
+ reset,
148
+ remove
149
+ }),
150
+ [remove, reset, set, value]
151
+ );
152
+ }
153
+
154
+ // src/Mnemonic/key-optional.ts
155
+ function defineMnemonicKey(key, options) {
156
+ return Object.freeze({
157
+ key,
158
+ options
159
+ });
160
+ }
161
+
162
+ exports.defineMnemonicKey = defineMnemonicKey;
163
+ exports.useMnemonicKeyOptional = useMnemonicKeyOptional;
164
+ exports.useMnemonicOptional = useMnemonicOptional;
165
+ //# sourceMappingURL=optional.cjs.map
166
+ //# sourceMappingURL=optional.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Mnemonic/optional-bridge.tsx","../src/Mnemonic/use-key-optional.ts","../src/Mnemonic/key-optional.ts"],"names":["createContext","useContext","useMemo","useCallback","useState","useSyncExternalStore","useEffect","useRef"],"mappings":"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","file":"optional.cjs","sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { createContext, useContext } from \"react\";\nimport type { KeySchema, Listener, MnemonicOptionalBridge, OptionalMnemonicKeyOptions, Unsubscribe } from \"./types\";\n\nexport type OptionalReadResult<T> = {\n value: T;\n rewriteRaw?: string;\n pendingSchema?: KeySchema;\n};\n\nexport interface MnemonicOptionalBridgeInternal extends MnemonicOptionalBridge {\n subscribeRaw(key: string, listener: Listener): Unsubscribe;\n getRawSnapshot(key: string): string | null;\n decodeSnapshot<T>(key: string, raw: string | null, options: OptionalMnemonicKeyOptions<T>): OptionalReadResult<T>;\n setValue<T>(key: string, nextValue: T, options: OptionalMnemonicKeyOptions<T>): void;\n removeValue(key: string): void;\n commitSnapshot<T>(key: string, raw: string | null, snapshot: OptionalReadResult<T>): void;\n}\n\nexport const MnemonicOptionalBridgeContext = createContext<MnemonicOptionalBridgeInternal | null>(null);\n\nexport function useMnemonicOptionalBridge(): MnemonicOptionalBridgeInternal | null {\n return useContext(MnemonicOptionalBridgeContext);\n}\n\nexport function toPublicMnemonicOptionalBridge(\n bridge: MnemonicOptionalBridgeInternal | null,\n): MnemonicOptionalBridge | null {\n if (!bridge) {\n return null;\n }\n return {\n namespace: bridge.namespace,\n capabilities: bridge.capabilities,\n };\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from \"react\";\nimport { toPublicMnemonicOptionalBridge, useMnemonicOptionalBridge } from \"./optional-bridge\";\nimport type {\n MnemonicKeyState,\n MnemonicOptionalBridge,\n OptionalMnemonicKeyDescriptor,\n OptionalMnemonicKeyOptions,\n} from \"./types\";\n\nconst SSR_SNAPSHOT_TOKEN = Symbol(\"mnemonic:optional-ssr-snapshot\");\n\nfunction resolveOptionalDescriptor<T>(\n keyOrDescriptor: string | OptionalMnemonicKeyDescriptor<T, string>,\n options?: OptionalMnemonicKeyOptions<T>,\n): OptionalMnemonicKeyDescriptor<T, string> {\n if (typeof keyOrDescriptor !== \"string\") {\n return keyOrDescriptor;\n }\n if (!options) {\n throw new Error(\"useMnemonicKeyOptional requires options when called with a string key\");\n }\n return {\n key: keyOrDescriptor,\n options,\n };\n}\n\nfunction resolveOptionalDefaultValue<T>(defaultValue: OptionalMnemonicKeyOptions<T>[\"defaultValue\"]): T {\n return typeof defaultValue === \"function\" ? (defaultValue as () => T)() : defaultValue;\n}\n\nfunction resolveOptionalServerValue<T>(options: OptionalMnemonicKeyOptions<T>): T {\n const serverValue = options.ssr?.serverValue;\n if (serverValue !== undefined) {\n return typeof serverValue === \"function\" ? (serverValue as () => T)() : serverValue;\n }\n return resolveOptionalDefaultValue(options.defaultValue);\n}\n\nexport function useMnemonicOptional(): MnemonicOptionalBridge | null {\n const bridge = useMnemonicOptionalBridge();\n return useMemo(() => toPublicMnemonicOptionalBridge(bridge), [bridge]);\n}\n\nexport function useMnemonicKeyOptional<T, K extends string>(\n descriptor: OptionalMnemonicKeyDescriptor<T, K>,\n): MnemonicKeyState<T>;\nexport function useMnemonicKeyOptional<T>(key: string, options: OptionalMnemonicKeyOptions<T>): MnemonicKeyState<T>;\nexport function useMnemonicKeyOptional<T>(\n keyOrDescriptor: string | OptionalMnemonicKeyDescriptor<T, string>,\n options?: OptionalMnemonicKeyOptions<T>,\n): MnemonicKeyState<T> {\n const bridge = useMnemonicOptionalBridge();\n const descriptor = resolveOptionalDescriptor(keyOrDescriptor, options);\n const key = descriptor.key;\n const resolvedOptions = descriptor.options;\n const { defaultValue, onMount, onChange } = resolvedOptions;\n const hasBridge = bridge !== null;\n\n const getFallback = useCallback(() => resolveOptionalDefaultValue(defaultValue), [defaultValue]);\n const getServerValue = useCallback(() => resolveOptionalServerValue(resolvedOptions), [resolvedOptions]);\n\n const [memoryValue, setMemoryValue] = useState<T>(() => getServerValue());\n const raw = useSyncExternalStore<string | null | typeof SSR_SNAPSHOT_TOKEN>(\n useCallback(\n (listener: () => void) => {\n if (!bridge) {\n return () => undefined;\n }\n return bridge.subscribeRaw(key, listener);\n },\n [bridge, key],\n ),\n useCallback(() => (bridge ? bridge.getRawSnapshot(key) : null), [bridge, key]),\n useCallback(\n () => (resolvedOptions.ssr?.serverValue === undefined ? null : SSR_SNAPSHOT_TOKEN),\n [resolvedOptions.ssr?.serverValue],\n ),\n );\n\n const bridgeSnapshot = useMemo(() => {\n if (!bridge) {\n return null;\n }\n if (raw === SSR_SNAPSHOT_TOKEN) {\n return {\n value: getServerValue(),\n };\n }\n return bridge.decodeSnapshot(key, raw, resolvedOptions);\n }, [bridge, getServerValue, key, raw, resolvedOptions]);\n\n useEffect(() => {\n if (!bridge || !bridgeSnapshot || raw === SSR_SNAPSHOT_TOKEN) {\n return;\n }\n bridge.commitSnapshot(key, raw, bridgeSnapshot);\n }, [bridge, bridgeSnapshot, key, raw]);\n\n const value = hasBridge ? (bridgeSnapshot?.value ?? memoryValue) : memoryValue;\n\n const mountedRef = useRef(false);\n const previousRef = useRef(value);\n\n useEffect(() => {\n if (mountedRef.current) {\n return;\n }\n mountedRef.current = true;\n onMount?.(value);\n previousRef.current = value;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const previous = previousRef.current;\n if (Object.is(previous, value)) {\n return;\n }\n previousRef.current = value;\n onChange?.(value, previous);\n }, [onChange, value]);\n\n const set = useMemo<MnemonicKeyState<T>[\"set\"]>(\n () => (next) => {\n if (bridge) {\n const nextValue =\n typeof next === \"function\"\n ? (next as (current: T) => T)(\n bridge.decodeSnapshot(key, bridge.getRawSnapshot(key), resolvedOptions).value,\n )\n : next;\n bridge.setValue(key, nextValue, resolvedOptions);\n return;\n }\n\n setMemoryValue((current) => (typeof next === \"function\" ? (next as (current: T) => T)(current) : next));\n },\n [bridge, key, resolvedOptions],\n );\n\n const reset = useMemo<MnemonicKeyState<T>[\"reset\"]>(\n () => () => {\n if (bridge) {\n bridge.setValue(key, getFallback(), resolvedOptions);\n return;\n }\n setMemoryValue(getFallback());\n },\n [bridge, getFallback, key, resolvedOptions],\n );\n\n const remove = useMemo<MnemonicKeyState<T>[\"remove\"]>(\n () => () => {\n if (bridge) {\n bridge.removeValue(key);\n return;\n }\n setMemoryValue(getFallback());\n },\n [bridge, getFallback, key],\n );\n\n return useMemo(\n () => ({\n value,\n set,\n reset,\n remove,\n }),\n [remove, reset, set, value],\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport type { OptionalMnemonicKeyDescriptor, OptionalMnemonicKeyOptions } from \"./types\";\n\n/**\n * Define a reusable, importable contract for a lean optionally persistent key.\n */\nexport function defineMnemonicKey<const K extends string, T>(\n key: K,\n options: OptionalMnemonicKeyOptions<T>,\n): OptionalMnemonicKeyDescriptor<T, K> {\n return Object.freeze({\n key,\n options,\n });\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import { O as OptionalMnemonicKeyDescriptor, b as MnemonicKeyState, w as OptionalMnemonicKeyOptions, x as MnemonicOptionalBridge } from './types-DcdXbmVl.cjs';
2
+ export { C as Codec, y as OptionalMnemonicKeySSRConfig } from './types-DcdXbmVl.cjs';
3
+
4
+ declare function useMnemonicOptional(): MnemonicOptionalBridge | null;
5
+ declare function useMnemonicKeyOptional<T, K extends string>(descriptor: OptionalMnemonicKeyDescriptor<T, K>): MnemonicKeyState<T>;
6
+ declare function useMnemonicKeyOptional<T>(key: string, options: OptionalMnemonicKeyOptions<T>): MnemonicKeyState<T>;
7
+
8
+ /**
9
+ * Define a reusable, importable contract for a lean optionally persistent key.
10
+ */
11
+ declare function defineMnemonicKey<const K extends string, T>(key: K, options: OptionalMnemonicKeyOptions<T>): OptionalMnemonicKeyDescriptor<T, K>;
12
+
13
+ export { OptionalMnemonicKeyDescriptor as MnemonicKeyDescriptor, MnemonicKeyState, MnemonicOptionalBridge, OptionalMnemonicKeyDescriptor, OptionalMnemonicKeyOptions, OptionalMnemonicKeyOptions as UseMnemonicKeyOptions, defineMnemonicKey, useMnemonicKeyOptional, useMnemonicOptional };
@@ -0,0 +1,13 @@
1
+ import { O as OptionalMnemonicKeyDescriptor, b as MnemonicKeyState, w as OptionalMnemonicKeyOptions, x as MnemonicOptionalBridge } from './types-DcdXbmVl.js';
2
+ export { C as Codec, y as OptionalMnemonicKeySSRConfig } from './types-DcdXbmVl.js';
3
+
4
+ declare function useMnemonicOptional(): MnemonicOptionalBridge | null;
5
+ declare function useMnemonicKeyOptional<T, K extends string>(descriptor: OptionalMnemonicKeyDescriptor<T, K>): MnemonicKeyState<T>;
6
+ declare function useMnemonicKeyOptional<T>(key: string, options: OptionalMnemonicKeyOptions<T>): MnemonicKeyState<T>;
7
+
8
+ /**
9
+ * Define a reusable, importable contract for a lean optionally persistent key.
10
+ */
11
+ declare function defineMnemonicKey<const K extends string, T>(key: K, options: OptionalMnemonicKeyOptions<T>): OptionalMnemonicKeyDescriptor<T, K>;
12
+
13
+ export { OptionalMnemonicKeyDescriptor as MnemonicKeyDescriptor, MnemonicKeyState, MnemonicOptionalBridge, OptionalMnemonicKeyDescriptor, OptionalMnemonicKeyOptions, OptionalMnemonicKeyOptions as UseMnemonicKeyOptions, defineMnemonicKey, useMnemonicKeyOptional, useMnemonicOptional };
@@ -0,0 +1,162 @@
1
+ import { createContext, useMemo, useCallback, useState, useSyncExternalStore, useEffect, useRef, useContext } from 'react';
2
+
3
+ // src/Mnemonic/use-key-optional.ts
4
+ var MnemonicOptionalBridgeContext = createContext(null);
5
+ function useMnemonicOptionalBridge() {
6
+ return useContext(MnemonicOptionalBridgeContext);
7
+ }
8
+ function toPublicMnemonicOptionalBridge(bridge) {
9
+ if (!bridge) {
10
+ return null;
11
+ }
12
+ return {
13
+ namespace: bridge.namespace,
14
+ capabilities: bridge.capabilities
15
+ };
16
+ }
17
+
18
+ // src/Mnemonic/use-key-optional.ts
19
+ var SSR_SNAPSHOT_TOKEN = /* @__PURE__ */ Symbol("mnemonic:optional-ssr-snapshot");
20
+ function resolveOptionalDescriptor(keyOrDescriptor, options) {
21
+ if (typeof keyOrDescriptor !== "string") {
22
+ return keyOrDescriptor;
23
+ }
24
+ if (!options) {
25
+ throw new Error("useMnemonicKeyOptional requires options when called with a string key");
26
+ }
27
+ return {
28
+ key: keyOrDescriptor,
29
+ options
30
+ };
31
+ }
32
+ function resolveOptionalDefaultValue(defaultValue) {
33
+ return typeof defaultValue === "function" ? defaultValue() : defaultValue;
34
+ }
35
+ function resolveOptionalServerValue(options) {
36
+ const serverValue = options.ssr?.serverValue;
37
+ if (serverValue !== void 0) {
38
+ return typeof serverValue === "function" ? serverValue() : serverValue;
39
+ }
40
+ return resolveOptionalDefaultValue(options.defaultValue);
41
+ }
42
+ function useMnemonicOptional() {
43
+ const bridge = useMnemonicOptionalBridge();
44
+ return useMemo(() => toPublicMnemonicOptionalBridge(bridge), [bridge]);
45
+ }
46
+ function useMnemonicKeyOptional(keyOrDescriptor, options) {
47
+ const bridge = useMnemonicOptionalBridge();
48
+ const descriptor = resolveOptionalDescriptor(keyOrDescriptor, options);
49
+ const key = descriptor.key;
50
+ const resolvedOptions = descriptor.options;
51
+ const { defaultValue, onMount, onChange } = resolvedOptions;
52
+ const hasBridge = bridge !== null;
53
+ const getFallback = useCallback(() => resolveOptionalDefaultValue(defaultValue), [defaultValue]);
54
+ const getServerValue = useCallback(() => resolveOptionalServerValue(resolvedOptions), [resolvedOptions]);
55
+ const [memoryValue, setMemoryValue] = useState(() => getServerValue());
56
+ const raw = useSyncExternalStore(
57
+ useCallback(
58
+ (listener) => {
59
+ if (!bridge) {
60
+ return () => void 0;
61
+ }
62
+ return bridge.subscribeRaw(key, listener);
63
+ },
64
+ [bridge, key]
65
+ ),
66
+ useCallback(() => bridge ? bridge.getRawSnapshot(key) : null, [bridge, key]),
67
+ useCallback(
68
+ () => resolvedOptions.ssr?.serverValue === void 0 ? null : SSR_SNAPSHOT_TOKEN,
69
+ [resolvedOptions.ssr?.serverValue]
70
+ )
71
+ );
72
+ const bridgeSnapshot = useMemo(() => {
73
+ if (!bridge) {
74
+ return null;
75
+ }
76
+ if (raw === SSR_SNAPSHOT_TOKEN) {
77
+ return {
78
+ value: getServerValue()
79
+ };
80
+ }
81
+ return bridge.decodeSnapshot(key, raw, resolvedOptions);
82
+ }, [bridge, getServerValue, key, raw, resolvedOptions]);
83
+ useEffect(() => {
84
+ if (!bridge || !bridgeSnapshot || raw === SSR_SNAPSHOT_TOKEN) {
85
+ return;
86
+ }
87
+ bridge.commitSnapshot(key, raw, bridgeSnapshot);
88
+ }, [bridge, bridgeSnapshot, key, raw]);
89
+ const value = hasBridge ? bridgeSnapshot?.value ?? memoryValue : memoryValue;
90
+ const mountedRef = useRef(false);
91
+ const previousRef = useRef(value);
92
+ useEffect(() => {
93
+ if (mountedRef.current) {
94
+ return;
95
+ }
96
+ mountedRef.current = true;
97
+ onMount?.(value);
98
+ previousRef.current = value;
99
+ }, []);
100
+ useEffect(() => {
101
+ const previous = previousRef.current;
102
+ if (Object.is(previous, value)) {
103
+ return;
104
+ }
105
+ previousRef.current = value;
106
+ onChange?.(value, previous);
107
+ }, [onChange, value]);
108
+ const set = useMemo(
109
+ () => (next) => {
110
+ if (bridge) {
111
+ const nextValue = typeof next === "function" ? next(
112
+ bridge.decodeSnapshot(key, bridge.getRawSnapshot(key), resolvedOptions).value
113
+ ) : next;
114
+ bridge.setValue(key, nextValue, resolvedOptions);
115
+ return;
116
+ }
117
+ setMemoryValue((current) => typeof next === "function" ? next(current) : next);
118
+ },
119
+ [bridge, key, resolvedOptions]
120
+ );
121
+ const reset = useMemo(
122
+ () => () => {
123
+ if (bridge) {
124
+ bridge.setValue(key, getFallback(), resolvedOptions);
125
+ return;
126
+ }
127
+ setMemoryValue(getFallback());
128
+ },
129
+ [bridge, getFallback, key, resolvedOptions]
130
+ );
131
+ const remove = useMemo(
132
+ () => () => {
133
+ if (bridge) {
134
+ bridge.removeValue(key);
135
+ return;
136
+ }
137
+ setMemoryValue(getFallback());
138
+ },
139
+ [bridge, getFallback, key]
140
+ );
141
+ return useMemo(
142
+ () => ({
143
+ value,
144
+ set,
145
+ reset,
146
+ remove
147
+ }),
148
+ [remove, reset, set, value]
149
+ );
150
+ }
151
+
152
+ // src/Mnemonic/key-optional.ts
153
+ function defineMnemonicKey(key, options) {
154
+ return Object.freeze({
155
+ key,
156
+ options
157
+ });
158
+ }
159
+
160
+ export { defineMnemonicKey, useMnemonicKeyOptional, useMnemonicOptional };
161
+ //# sourceMappingURL=optional.js.map
162
+ //# sourceMappingURL=optional.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Mnemonic/optional-bridge.tsx","../src/Mnemonic/use-key-optional.ts","../src/Mnemonic/key-optional.ts"],"names":[],"mappings":"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","file":"optional.js","sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { createContext, useContext } from \"react\";\nimport type { KeySchema, Listener, MnemonicOptionalBridge, OptionalMnemonicKeyOptions, Unsubscribe } from \"./types\";\n\nexport type OptionalReadResult<T> = {\n value: T;\n rewriteRaw?: string;\n pendingSchema?: KeySchema;\n};\n\nexport interface MnemonicOptionalBridgeInternal extends MnemonicOptionalBridge {\n subscribeRaw(key: string, listener: Listener): Unsubscribe;\n getRawSnapshot(key: string): string | null;\n decodeSnapshot<T>(key: string, raw: string | null, options: OptionalMnemonicKeyOptions<T>): OptionalReadResult<T>;\n setValue<T>(key: string, nextValue: T, options: OptionalMnemonicKeyOptions<T>): void;\n removeValue(key: string): void;\n commitSnapshot<T>(key: string, raw: string | null, snapshot: OptionalReadResult<T>): void;\n}\n\nexport const MnemonicOptionalBridgeContext = createContext<MnemonicOptionalBridgeInternal | null>(null);\n\nexport function useMnemonicOptionalBridge(): MnemonicOptionalBridgeInternal | null {\n return useContext(MnemonicOptionalBridgeContext);\n}\n\nexport function toPublicMnemonicOptionalBridge(\n bridge: MnemonicOptionalBridgeInternal | null,\n): MnemonicOptionalBridge | null {\n if (!bridge) {\n return null;\n }\n return {\n namespace: bridge.namespace,\n capabilities: bridge.capabilities,\n };\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from \"react\";\nimport { toPublicMnemonicOptionalBridge, useMnemonicOptionalBridge } from \"./optional-bridge\";\nimport type {\n MnemonicKeyState,\n MnemonicOptionalBridge,\n OptionalMnemonicKeyDescriptor,\n OptionalMnemonicKeyOptions,\n} from \"./types\";\n\nconst SSR_SNAPSHOT_TOKEN = Symbol(\"mnemonic:optional-ssr-snapshot\");\n\nfunction resolveOptionalDescriptor<T>(\n keyOrDescriptor: string | OptionalMnemonicKeyDescriptor<T, string>,\n options?: OptionalMnemonicKeyOptions<T>,\n): OptionalMnemonicKeyDescriptor<T, string> {\n if (typeof keyOrDescriptor !== \"string\") {\n return keyOrDescriptor;\n }\n if (!options) {\n throw new Error(\"useMnemonicKeyOptional requires options when called with a string key\");\n }\n return {\n key: keyOrDescriptor,\n options,\n };\n}\n\nfunction resolveOptionalDefaultValue<T>(defaultValue: OptionalMnemonicKeyOptions<T>[\"defaultValue\"]): T {\n return typeof defaultValue === \"function\" ? (defaultValue as () => T)() : defaultValue;\n}\n\nfunction resolveOptionalServerValue<T>(options: OptionalMnemonicKeyOptions<T>): T {\n const serverValue = options.ssr?.serverValue;\n if (serverValue !== undefined) {\n return typeof serverValue === \"function\" ? (serverValue as () => T)() : serverValue;\n }\n return resolveOptionalDefaultValue(options.defaultValue);\n}\n\nexport function useMnemonicOptional(): MnemonicOptionalBridge | null {\n const bridge = useMnemonicOptionalBridge();\n return useMemo(() => toPublicMnemonicOptionalBridge(bridge), [bridge]);\n}\n\nexport function useMnemonicKeyOptional<T, K extends string>(\n descriptor: OptionalMnemonicKeyDescriptor<T, K>,\n): MnemonicKeyState<T>;\nexport function useMnemonicKeyOptional<T>(key: string, options: OptionalMnemonicKeyOptions<T>): MnemonicKeyState<T>;\nexport function useMnemonicKeyOptional<T>(\n keyOrDescriptor: string | OptionalMnemonicKeyDescriptor<T, string>,\n options?: OptionalMnemonicKeyOptions<T>,\n): MnemonicKeyState<T> {\n const bridge = useMnemonicOptionalBridge();\n const descriptor = resolveOptionalDescriptor(keyOrDescriptor, options);\n const key = descriptor.key;\n const resolvedOptions = descriptor.options;\n const { defaultValue, onMount, onChange } = resolvedOptions;\n const hasBridge = bridge !== null;\n\n const getFallback = useCallback(() => resolveOptionalDefaultValue(defaultValue), [defaultValue]);\n const getServerValue = useCallback(() => resolveOptionalServerValue(resolvedOptions), [resolvedOptions]);\n\n const [memoryValue, setMemoryValue] = useState<T>(() => getServerValue());\n const raw = useSyncExternalStore<string | null | typeof SSR_SNAPSHOT_TOKEN>(\n useCallback(\n (listener: () => void) => {\n if (!bridge) {\n return () => undefined;\n }\n return bridge.subscribeRaw(key, listener);\n },\n [bridge, key],\n ),\n useCallback(() => (bridge ? bridge.getRawSnapshot(key) : null), [bridge, key]),\n useCallback(\n () => (resolvedOptions.ssr?.serverValue === undefined ? null : SSR_SNAPSHOT_TOKEN),\n [resolvedOptions.ssr?.serverValue],\n ),\n );\n\n const bridgeSnapshot = useMemo(() => {\n if (!bridge) {\n return null;\n }\n if (raw === SSR_SNAPSHOT_TOKEN) {\n return {\n value: getServerValue(),\n };\n }\n return bridge.decodeSnapshot(key, raw, resolvedOptions);\n }, [bridge, getServerValue, key, raw, resolvedOptions]);\n\n useEffect(() => {\n if (!bridge || !bridgeSnapshot || raw === SSR_SNAPSHOT_TOKEN) {\n return;\n }\n bridge.commitSnapshot(key, raw, bridgeSnapshot);\n }, [bridge, bridgeSnapshot, key, raw]);\n\n const value = hasBridge ? (bridgeSnapshot?.value ?? memoryValue) : memoryValue;\n\n const mountedRef = useRef(false);\n const previousRef = useRef(value);\n\n useEffect(() => {\n if (mountedRef.current) {\n return;\n }\n mountedRef.current = true;\n onMount?.(value);\n previousRef.current = value;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const previous = previousRef.current;\n if (Object.is(previous, value)) {\n return;\n }\n previousRef.current = value;\n onChange?.(value, previous);\n }, [onChange, value]);\n\n const set = useMemo<MnemonicKeyState<T>[\"set\"]>(\n () => (next) => {\n if (bridge) {\n const nextValue =\n typeof next === \"function\"\n ? (next as (current: T) => T)(\n bridge.decodeSnapshot(key, bridge.getRawSnapshot(key), resolvedOptions).value,\n )\n : next;\n bridge.setValue(key, nextValue, resolvedOptions);\n return;\n }\n\n setMemoryValue((current) => (typeof next === \"function\" ? (next as (current: T) => T)(current) : next));\n },\n [bridge, key, resolvedOptions],\n );\n\n const reset = useMemo<MnemonicKeyState<T>[\"reset\"]>(\n () => () => {\n if (bridge) {\n bridge.setValue(key, getFallback(), resolvedOptions);\n return;\n }\n setMemoryValue(getFallback());\n },\n [bridge, getFallback, key, resolvedOptions],\n );\n\n const remove = useMemo<MnemonicKeyState<T>[\"remove\"]>(\n () => () => {\n if (bridge) {\n bridge.removeValue(key);\n return;\n }\n setMemoryValue(getFallback());\n },\n [bridge, getFallback, key],\n );\n\n return useMemo(\n () => ({\n value,\n set,\n reset,\n remove,\n }),\n [remove, reset, set, value],\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport type { OptionalMnemonicKeyDescriptor, OptionalMnemonicKeyOptions } from \"./types\";\n\n/**\n * Define a reusable, importable contract for a lean optionally persistent key.\n */\nexport function defineMnemonicKey<const K extends string, T>(\n key: K,\n options: OptionalMnemonicKeyOptions<T>,\n): OptionalMnemonicKeyDescriptor<T, K> {\n return Object.freeze({\n key,\n options,\n });\n}\n"]}