@molecule/app-solid 1.0.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.
- package/LICENSE +115 -0
- package/README.md +2543 -0
- package/dist/context.d.ts +82 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +141 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/async-state.d.ts +46 -0
- package/dist/primitives/async-state.d.ts.map +1 -0
- package/dist/primitives/async-state.js +83 -0
- package/dist/primitives/async-state.js.map +1 -0
- package/dist/primitives/auth.d.ts +85 -0
- package/dist/primitives/auth.d.ts.map +1 -0
- package/dist/primitives/auth.js +147 -0
- package/dist/primitives/auth.js.map +1 -0
- package/dist/primitives/capacitor-app.d.ts +46 -0
- package/dist/primitives/capacitor-app.d.ts.map +1 -0
- package/dist/primitives/capacitor-app.js +57 -0
- package/dist/primitives/capacitor-app.js.map +1 -0
- package/dist/primitives/change-password.d.ts +36 -0
- package/dist/primitives/change-password.d.ts.map +1 -0
- package/dist/primitives/change-password.js +32 -0
- package/dist/primitives/change-password.js.map +1 -0
- package/dist/primitives/device.d.ts +48 -0
- package/dist/primitives/device.d.ts.map +1 -0
- package/dist/primitives/device.js +47 -0
- package/dist/primitives/device.js.map +1 -0
- package/dist/primitives/forms.d.ts +193 -0
- package/dist/primitives/forms.d.ts.map +1 -0
- package/dist/primitives/forms.js +309 -0
- package/dist/primitives/forms.js.map +1 -0
- package/dist/primitives/http.d.ts +176 -0
- package/dist/primitives/http.d.ts.map +1 -0
- package/dist/primitives/http.js +254 -0
- package/dist/primitives/http.js.map +1 -0
- package/dist/primitives/i18n.d.ts +146 -0
- package/dist/primitives/i18n.d.ts.map +1 -0
- package/dist/primitives/i18n.js +223 -0
- package/dist/primitives/i18n.js.map +1 -0
- package/dist/primitives/index.d.ts +27 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +27 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/logger.d.ts +143 -0
- package/dist/primitives/logger.d.ts.map +1 -0
- package/dist/primitives/logger.js +165 -0
- package/dist/primitives/logger.js.map +1 -0
- package/dist/primitives/login.d.ts +37 -0
- package/dist/primitives/login.d.ts.map +1 -0
- package/dist/primitives/login.js +32 -0
- package/dist/primitives/login.js.map +1 -0
- package/dist/primitives/oauth.d.ts +102 -0
- package/dist/primitives/oauth.d.ts.map +1 -0
- package/dist/primitives/oauth.js +232 -0
- package/dist/primitives/oauth.js.map +1 -0
- package/dist/primitives/password-reset.d.ts +46 -0
- package/dist/primitives/password-reset.d.ts.map +1 -0
- package/dist/primitives/password-reset.js +49 -0
- package/dist/primitives/password-reset.js.map +1 -0
- package/dist/primitives/platform.d.ts +48 -0
- package/dist/primitives/platform.d.ts.map +1 -0
- package/dist/primitives/platform.js +47 -0
- package/dist/primitives/platform.js.map +1 -0
- package/dist/primitives/promise.d.ts +46 -0
- package/dist/primitives/promise.d.ts.map +1 -0
- package/dist/primitives/promise.js +104 -0
- package/dist/primitives/promise.js.map +1 -0
- package/dist/primitives/push.d.ts +52 -0
- package/dist/primitives/push.d.ts.map +1 -0
- package/dist/primitives/push.js +72 -0
- package/dist/primitives/push.js.map +1 -0
- package/dist/primitives/router.d.ts +170 -0
- package/dist/primitives/router.d.ts.map +1 -0
- package/dist/primitives/router.js +251 -0
- package/dist/primitives/router.js.map +1 -0
- package/dist/primitives/signup.d.ts +37 -0
- package/dist/primitives/signup.d.ts.map +1 -0
- package/dist/primitives/signup.js +32 -0
- package/dist/primitives/signup.js.map +1 -0
- package/dist/primitives/state.d.ts +132 -0
- package/dist/primitives/state.d.ts.map +1 -0
- package/dist/primitives/state.js +167 -0
- package/dist/primitives/state.js.map +1 -0
- package/dist/primitives/storage.d.ts +132 -0
- package/dist/primitives/storage.d.ts.map +1 -0
- package/dist/primitives/storage.js +275 -0
- package/dist/primitives/storage.js.map +1 -0
- package/dist/primitives/theme.d.ts +106 -0
- package/dist/primitives/theme.d.ts.map +1 -0
- package/dist/primitives/theme.js +187 -0
- package/dist/primitives/theme.js.map +1 -0
- package/dist/primitives/version.d.ts +50 -0
- package/dist/primitives/version.d.ts.map +1 -0
- package/dist/primitives/version.js +62 -0
- package/dist/primitives/version.js.map +1 -0
- package/dist/provider.d.ts +36 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.jsx +71 -0
- package/dist/provider.jsx.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitives for state management.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { type Accessor } from 'solid-js';
|
|
7
|
+
import type { StateProvider, Store, StoreConfig } from '@molecule/app-state';
|
|
8
|
+
/**
|
|
9
|
+
* Create a reactive store using Solid signals.
|
|
10
|
+
*
|
|
11
|
+
* @param config - Store configuration
|
|
12
|
+
* @returns Store instance
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* import { createStore } from '@molecule/app-solid'
|
|
17
|
+
*
|
|
18
|
+
* interface CounterState {
|
|
19
|
+
* count: number
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* const counterStore = createStore<CounterState>({
|
|
23
|
+
* initial: { count: 0 },
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* function Counter() {
|
|
27
|
+
* const count = useStore(counterStore, (s) => s.count)
|
|
28
|
+
*
|
|
29
|
+
* return (
|
|
30
|
+
* <button onClick={() => counterStore.setState({ count: count() + 1 })}>
|
|
31
|
+
* Count: {count()}
|
|
32
|
+
* </button>
|
|
33
|
+
* )
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function createStore<T extends object>(config: StoreConfig<T>): Store<T>;
|
|
38
|
+
/**
|
|
39
|
+
* Use a store with optional selector, returning an accessor.
|
|
40
|
+
*
|
|
41
|
+
* @param store - Store to subscribe to
|
|
42
|
+
* @param selector - Optional selector function
|
|
43
|
+
* @returns Accessor for selected state
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```tsx
|
|
47
|
+
* function UserName() {
|
|
48
|
+
* const name = useStore(userStore, (s) => s.name)
|
|
49
|
+
* return <span>{name()}</span>
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function useStore<T extends object, S = T>(store: Store<T>, selector?: (state: T) => S): Accessor<S>;
|
|
54
|
+
/**
|
|
55
|
+
* Create a simple signal-based store without provider.
|
|
56
|
+
*
|
|
57
|
+
* @param initial - Initial state
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```tsx
|
|
61
|
+
* const [count, setCount] = createSignalStore(0)
|
|
62
|
+
*
|
|
63
|
+
* function Counter() {
|
|
64
|
+
* return (
|
|
65
|
+
* <button onClick={() => setCount((c) => c + 1)}>
|
|
66
|
+
* Count: {count()}
|
|
67
|
+
* </button>
|
|
68
|
+
* )
|
|
69
|
+
* }
|
|
70
|
+
* ```
|
|
71
|
+
* @returns The created instance.
|
|
72
|
+
*/
|
|
73
|
+
export declare function createSignalStore<T>(initial: T): [Accessor<T>, (value: T | ((prev: T) => T)) => void];
|
|
74
|
+
/**
|
|
75
|
+
* Storage adapter interface for persisted stores.
|
|
76
|
+
*/
|
|
77
|
+
interface StorageAdapter {
|
|
78
|
+
getItem(key: string): string | null;
|
|
79
|
+
setItem(key: string, value: string): void;
|
|
80
|
+
removeItem?(key: string): void;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Create a persisted signal store.
|
|
84
|
+
*
|
|
85
|
+
* @param key - Storage key
|
|
86
|
+
* @param initial - Initial value
|
|
87
|
+
* @param storage - Storage adapter (required - use localStorage, sessionStorage, or `@molecule/app-storage`)
|
|
88
|
+
* @returns Tuple of accessor and setter
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```tsx
|
|
92
|
+
* // Use with localStorage
|
|
93
|
+
* const [theme, setTheme] = createPersistedStore('theme', 'light', localStorage)
|
|
94
|
+
*
|
|
95
|
+
* // Use with a custom storage provider
|
|
96
|
+
* import { getProvider } from '@molecule/app-storage'
|
|
97
|
+
* const storageProvider = getProvider()
|
|
98
|
+
* const [user, setUser] = createPersistedStore('user', null, {
|
|
99
|
+
* getItem: (key) => storageProvider.get(key),
|
|
100
|
+
* setItem: (key, value) => storageProvider.set(key, value),
|
|
101
|
+
* })
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export declare function createPersistedStore<T>(key: string, initial: T, storage: StorageAdapter): [Accessor<T>, (value: T | ((prev: T) => T)) => void];
|
|
105
|
+
/**
|
|
106
|
+
* Create state helpers from context.
|
|
107
|
+
*
|
|
108
|
+
* @returns State helper functions
|
|
109
|
+
*/
|
|
110
|
+
/**
|
|
111
|
+
* Creates a state helpers.
|
|
112
|
+
* @returns The created result.
|
|
113
|
+
*/
|
|
114
|
+
export declare function createStateHelpers(): {
|
|
115
|
+
createStore: <T extends object>(config: StoreConfig<T>) => Store<T>;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Create state helpers from a specific provider.
|
|
119
|
+
*
|
|
120
|
+
* @param provider - State provider
|
|
121
|
+
* @returns State helper functions
|
|
122
|
+
*/
|
|
123
|
+
/**
|
|
124
|
+
* Creates a state helpers from provider.
|
|
125
|
+
* @param provider - The provider implementation.
|
|
126
|
+
* @returns The created result.
|
|
127
|
+
*/
|
|
128
|
+
export declare function createStateHelpersFromProvider(provider: StateProvider): {
|
|
129
|
+
createStore: <T extends object>(config: StoreConfig<T>) => Store<T>;
|
|
130
|
+
};
|
|
131
|
+
export {};
|
|
132
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/primitives/state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAyC,MAAM,UAAU,CAAA;AAE/E,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAI5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAG9E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,CAAC,EAC9C,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GACzB,QAAQ,CAAC,CAAC,CAAC,CAab;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,OAAO,EAAE,CAAC,GACT,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAGtD;AAED;;GAEG;AACH,UAAU,cAAc;IACtB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACnC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,CAAC,EACV,OAAO,EAAE,cAAc,GACtB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAwBtD;AAED;;;;GAIG;AAEH;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,WAAW,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAA;CACpE,CAMA;AAED;;;;;GAKG;AAEH;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,aAAa,GAAG;IACvE,WAAW,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAA;CACpE,CAIA"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitives for state management.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { createEffect, createSignal, onCleanup } from 'solid-js';
|
|
7
|
+
import { getStateProvider } from '../context.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create a reactive store using Solid signals.
|
|
10
|
+
*
|
|
11
|
+
* @param config - Store configuration
|
|
12
|
+
* @returns Store instance
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* import { createStore } from '@molecule/app-solid'
|
|
17
|
+
*
|
|
18
|
+
* interface CounterState {
|
|
19
|
+
* count: number
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* const counterStore = createStore<CounterState>({
|
|
23
|
+
* initial: { count: 0 },
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* function Counter() {
|
|
27
|
+
* const count = useStore(counterStore, (s) => s.count)
|
|
28
|
+
*
|
|
29
|
+
* return (
|
|
30
|
+
* <button onClick={() => counterStore.setState({ count: count() + 1 })}>
|
|
31
|
+
* Count: {count()}
|
|
32
|
+
* </button>
|
|
33
|
+
* )
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function createStore(config) {
|
|
38
|
+
const provider = getStateProvider();
|
|
39
|
+
return provider.createStore(config);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Use a store with optional selector, returning an accessor.
|
|
43
|
+
*
|
|
44
|
+
* @param store - Store to subscribe to
|
|
45
|
+
* @param selector - Optional selector function
|
|
46
|
+
* @returns Accessor for selected state
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```tsx
|
|
50
|
+
* function UserName() {
|
|
51
|
+
* const name = useStore(userStore, (s) => s.name)
|
|
52
|
+
* return <span>{name()}</span>
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export function useStore(store, selector) {
|
|
57
|
+
const select = selector ?? ((s) => s);
|
|
58
|
+
const [state, setState] = createSignal(select(store.getState()));
|
|
59
|
+
createEffect(() => {
|
|
60
|
+
const unsubscribe = store.subscribe((newState) => {
|
|
61
|
+
setState(() => select(newState));
|
|
62
|
+
});
|
|
63
|
+
onCleanup(unsubscribe);
|
|
64
|
+
});
|
|
65
|
+
return state;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create a simple signal-based store without provider.
|
|
69
|
+
*
|
|
70
|
+
* @param initial - Initial state
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```tsx
|
|
74
|
+
* const [count, setCount] = createSignalStore(0)
|
|
75
|
+
*
|
|
76
|
+
* function Counter() {
|
|
77
|
+
* return (
|
|
78
|
+
* <button onClick={() => setCount((c) => c + 1)}>
|
|
79
|
+
* Count: {count()}
|
|
80
|
+
* </button>
|
|
81
|
+
* )
|
|
82
|
+
* }
|
|
83
|
+
* ```
|
|
84
|
+
* @returns The created instance.
|
|
85
|
+
*/
|
|
86
|
+
export function createSignalStore(initial) {
|
|
87
|
+
const [state, setState] = createSignal(initial);
|
|
88
|
+
return [state, setState];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a persisted signal store.
|
|
92
|
+
*
|
|
93
|
+
* @param key - Storage key
|
|
94
|
+
* @param initial - Initial value
|
|
95
|
+
* @param storage - Storage adapter (required - use localStorage, sessionStorage, or `@molecule/app-storage`)
|
|
96
|
+
* @returns Tuple of accessor and setter
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```tsx
|
|
100
|
+
* // Use with localStorage
|
|
101
|
+
* const [theme, setTheme] = createPersistedStore('theme', 'light', localStorage)
|
|
102
|
+
*
|
|
103
|
+
* // Use with a custom storage provider
|
|
104
|
+
* import { getProvider } from '@molecule/app-storage'
|
|
105
|
+
* const storageProvider = getProvider()
|
|
106
|
+
* const [user, setUser] = createPersistedStore('user', null, {
|
|
107
|
+
* getItem: (key) => storageProvider.get(key),
|
|
108
|
+
* setItem: (key, value) => storageProvider.set(key, value),
|
|
109
|
+
* })
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export function createPersistedStore(key, initial, storage) {
|
|
113
|
+
// Try to load from storage
|
|
114
|
+
let initialValue = initial;
|
|
115
|
+
try {
|
|
116
|
+
const stored = storage.getItem(key);
|
|
117
|
+
if (stored) {
|
|
118
|
+
initialValue = JSON.parse(stored);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (_error) {
|
|
122
|
+
// Safe to ignore: corrupt/stale storage data; initial value is the correct fallback
|
|
123
|
+
}
|
|
124
|
+
const [state, setState] = createSignal(initialValue);
|
|
125
|
+
// Persist on change
|
|
126
|
+
createEffect(() => {
|
|
127
|
+
try {
|
|
128
|
+
storage.setItem(key, JSON.stringify(state()));
|
|
129
|
+
}
|
|
130
|
+
catch (_error) {
|
|
131
|
+
// Safe to ignore: persistence is best-effort; in-memory signal still works correctly
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
return [state, setState];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create state helpers from context.
|
|
138
|
+
*
|
|
139
|
+
* @returns State helper functions
|
|
140
|
+
*/
|
|
141
|
+
/**
|
|
142
|
+
* Creates a state helpers.
|
|
143
|
+
* @returns The created result.
|
|
144
|
+
*/
|
|
145
|
+
export function createStateHelpers() {
|
|
146
|
+
const provider = getStateProvider();
|
|
147
|
+
return {
|
|
148
|
+
createStore: (config) => provider.createStore(config),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Create state helpers from a specific provider.
|
|
153
|
+
*
|
|
154
|
+
* @param provider - State provider
|
|
155
|
+
* @returns State helper functions
|
|
156
|
+
*/
|
|
157
|
+
/**
|
|
158
|
+
* Creates a state helpers from provider.
|
|
159
|
+
* @param provider - The provider implementation.
|
|
160
|
+
* @returns The created result.
|
|
161
|
+
*/
|
|
162
|
+
export function createStateHelpersFromProvider(provider) {
|
|
163
|
+
return {
|
|
164
|
+
createStore: (config) => provider.createStore(config),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/primitives/state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAiB,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAI/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,WAAW,CAAmB,MAAsB;IAClE,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAA;IACnC,OAAO,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;AACrC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAe,EACf,QAA0B;IAE1B,MAAM,MAAM,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAI,EAAE,EAAE,CAAC,CAAiB,CAAC,CAAA;IACxD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IAEnE,YAAY,CAAC,GAAG,EAAE;QAChB,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC/C,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,WAAW,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAU;IAEV,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAI,OAAO,CAAC,CAAA;IAClD,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AAC1B,CAAC;AAWD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,OAAU,EACV,OAAuB;IAEvB,2BAA2B;IAC3B,IAAI,YAAY,GAAG,OAAO,CAAA;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,MAAM,EAAE,CAAC;YACX,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,oFAAoF;IACtF,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAI,YAAY,CAAC,CAAA;IAEvD,oBAAoB;IACpB,YAAY,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC;YACH,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QAC/C,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,qFAAqF;QACvF,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AAC1B,CAAC;AAED;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAGhC,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAA;IAEnC,OAAO;QACL,WAAW,EAAE,CAAmB,MAAsB,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;KACxF,CAAA;AACH,CAAC;AAED;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAAC,QAAuB;IAGpE,OAAO;QACL,WAAW,EAAE,CAAmB,MAAsB,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;KACxF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitives for storage.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { type Accessor } from 'solid-js';
|
|
7
|
+
import type { StorageProvider } from '@molecule/app-storage';
|
|
8
|
+
/**
|
|
9
|
+
* Create a storage value primitive.
|
|
10
|
+
*
|
|
11
|
+
* @param key - Storage key
|
|
12
|
+
* @param defaultValue - Default value if not found
|
|
13
|
+
* @returns Storage value accessor and actions
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* import { createStorageValue } from '@molecule/app-solid'
|
|
18
|
+
*
|
|
19
|
+
* function ThemeSelector() {
|
|
20
|
+
* const { value, set, loading } = createStorageValue<string>('theme', 'light')
|
|
21
|
+
*
|
|
22
|
+
* return (
|
|
23
|
+
* <Show when={!loading()} fallback={<Loading />}>
|
|
24
|
+
* <select
|
|
25
|
+
* value={value()}
|
|
26
|
+
* onChange={(e) => set(e.target.value)}
|
|
27
|
+
* >
|
|
28
|
+
* <option value="light">Light</option>
|
|
29
|
+
* <option value="dark">Dark</option>
|
|
30
|
+
* </select>
|
|
31
|
+
* </Show>
|
|
32
|
+
* )
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function createStorageValue<T>(key: string, defaultValue?: T): {
|
|
37
|
+
value: () => T | undefined;
|
|
38
|
+
loading: () => boolean;
|
|
39
|
+
error: () => Error | null;
|
|
40
|
+
set: (value: T) => Promise<void>;
|
|
41
|
+
remove: () => Promise<void>;
|
|
42
|
+
refresh: () => Promise<T | undefined>;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Create storage primitives.
|
|
46
|
+
*
|
|
47
|
+
* @returns Storage methods
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```tsx
|
|
51
|
+
* function SettingsManager() {
|
|
52
|
+
* const storage = createStorage()
|
|
53
|
+
*
|
|
54
|
+
* const saveSettings = async (settings: Settings) => {
|
|
55
|
+
* await storage.set('settings', settings)
|
|
56
|
+
* }
|
|
57
|
+
*
|
|
58
|
+
* const loadSettings = async () => {
|
|
59
|
+
* return await storage.get<Settings>('settings')
|
|
60
|
+
* }
|
|
61
|
+
* }
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare function createStorage(): {
|
|
65
|
+
get: <T>(key: string) => Promise<T | null>;
|
|
66
|
+
set: <T>(key: string, value: T) => Promise<void>;
|
|
67
|
+
remove: (key: string) => Promise<void>;
|
|
68
|
+
clear: () => Promise<void>;
|
|
69
|
+
keys: () => Promise<string[]>;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Create a persisted signal that syncs with storage.
|
|
73
|
+
*
|
|
74
|
+
* @param key - Storage key
|
|
75
|
+
* @param defaultValue - Default value
|
|
76
|
+
* @returns Tuple of accessor and setter
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```tsx
|
|
80
|
+
* function Counter() {
|
|
81
|
+
* const [count, setCount] = usePersistedSignal('counter', 0)
|
|
82
|
+
*
|
|
83
|
+
* return (
|
|
84
|
+
* <button onClick={() => setCount((c) => (c ?? 0) + 1)}>
|
|
85
|
+
* Count: {count() ?? 0}
|
|
86
|
+
* </button>
|
|
87
|
+
* )
|
|
88
|
+
* }
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export declare function usePersistedSignal<T>(key: string, defaultValue: T): [Accessor<T | undefined>, (value: T | ((prev: T | undefined) => T)) => void];
|
|
92
|
+
/**
|
|
93
|
+
* Create storage helpers from context.
|
|
94
|
+
*
|
|
95
|
+
* @returns Storage helper functions
|
|
96
|
+
*/
|
|
97
|
+
export declare function createStorageHelpers(): {
|
|
98
|
+
get: <T>(key: string) => Promise<T | null>;
|
|
99
|
+
set: <T>(key: string, value: T) => Promise<void>;
|
|
100
|
+
remove: (key: string) => Promise<void>;
|
|
101
|
+
clear: () => Promise<void>;
|
|
102
|
+
keys: () => Promise<string[]>;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Create storage primitives from a specific provider.
|
|
106
|
+
*
|
|
107
|
+
* @param storage - Storage provider
|
|
108
|
+
* @returns Storage methods
|
|
109
|
+
*/
|
|
110
|
+
export declare function createStorageFromProvider(storage: StorageProvider): {
|
|
111
|
+
get: <T>(key: string) => Promise<T | null>;
|
|
112
|
+
set: <T>(key: string, value: T) => Promise<void>;
|
|
113
|
+
remove: (key: string) => Promise<void>;
|
|
114
|
+
clear: () => Promise<void>;
|
|
115
|
+
keys: () => Promise<string[]>;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Create storage value primitive from a specific provider.
|
|
119
|
+
*
|
|
120
|
+
* @param storage - Storage provider
|
|
121
|
+
* @param key - Storage key
|
|
122
|
+
* @param defaultValue - Default value
|
|
123
|
+
* @returns Storage value accessor and actions
|
|
124
|
+
*/
|
|
125
|
+
export declare function createStorageValueFromProvider<T>(storage: StorageProvider, key: string, defaultValue?: T): {
|
|
126
|
+
value: () => T | undefined;
|
|
127
|
+
loading: () => boolean;
|
|
128
|
+
error: () => Error | null;
|
|
129
|
+
set: (value: T) => Promise<void>;
|
|
130
|
+
remove: () => Promise<void>;
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/primitives/storage.ts"],"names":[],"mappings":"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"}
|