@omnitron-dev/prism 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +44 -0
- package/bin/prism.js +13 -0
- package/dist/accessibility/index.d.ts +157 -0
- package/dist/accessibility/index.js +186 -0
- package/dist/accessibility/index.js.map +1 -0
- package/dist/blocks/index.d.ts +1239 -0
- package/dist/blocks/index.js +1712 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/chunk-77KIJLPP.js +37 -0
- package/dist/chunk-77KIJLPP.js.map +1 -0
- package/dist/chunk-BTIT7WYH.js +339 -0
- package/dist/chunk-BTIT7WYH.js.map +1 -0
- package/dist/chunk-BV32OJ2A.js +1409 -0
- package/dist/chunk-BV32OJ2A.js.map +1 -0
- package/dist/chunk-DDY7TLUI.js +139 -0
- package/dist/chunk-DDY7TLUI.js.map +1 -0
- package/dist/chunk-DXXZ3ITR.js +4227 -0
- package/dist/chunk-DXXZ3ITR.js.map +1 -0
- package/dist/chunk-E3XANPTO.js +2319 -0
- package/dist/chunk-E3XANPTO.js.map +1 -0
- package/dist/chunk-FU52GL2E.js +3 -0
- package/dist/chunk-FU52GL2E.js.map +1 -0
- package/dist/chunk-GYDT5EKX.js +16505 -0
- package/dist/chunk-GYDT5EKX.js.map +1 -0
- package/dist/chunk-HO2GKTWJ.js +28 -0
- package/dist/chunk-HO2GKTWJ.js.map +1 -0
- package/dist/chunk-JDTC2SBY.js +140 -0
- package/dist/chunk-JDTC2SBY.js.map +1 -0
- package/dist/chunk-JNU4QHJK.js +6 -0
- package/dist/chunk-JNU4QHJK.js.map +1 -0
- package/dist/chunk-LAEY5USO.js +2621 -0
- package/dist/chunk-LAEY5USO.js.map +1 -0
- package/dist/chunk-UR6X3W5I.js +530 -0
- package/dist/chunk-UR6X3W5I.js.map +1 -0
- package/dist/chunk-WC2WM2JD.js +883 -0
- package/dist/chunk-WC2WM2JD.js.map +1 -0
- package/dist/chunk-XWL6J6IO.js +40 -0
- package/dist/chunk-XWL6J6IO.js.map +1 -0
- package/dist/cli/index.js +2695 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config-BA6IeTq9.d.ts +100 -0
- package/dist/core/index.d.ts +454 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/forms/index.d.ts +562 -0
- package/dist/forms/index.js +545 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/http/index.d.ts +233 -0
- package/dist/http/index.js +282 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index-odhPSv9I.d.ts +2491 -0
- package/dist/index.css +131 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +9109 -0
- package/dist/index.js +13280 -0
- package/dist/index.js.map +1 -0
- package/dist/layouts/index.d.ts +854 -0
- package/dist/layouts/index.js +6 -0
- package/dist/layouts/index.js.map +1 -0
- package/dist/netron/index.d.ts +4 -0
- package/dist/netron/index.js +4 -0
- package/dist/netron/index.js.map +1 -0
- package/dist/registry/index.d.ts +352 -0
- package/dist/registry/index.js +4 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry-BrDNftd5.d.ts +574 -0
- package/dist/settings-plpR26Xk.d.ts +455 -0
- package/dist/state/index.d.ts +981 -0
- package/dist/state/index.js +5 -0
- package/dist/state/index.js.map +1 -0
- package/dist/theme/index.d.ts +1049 -0
- package/dist/theme/index.js +5 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme-CrXLfP1c.d.ts +389 -0
- package/dist/types/index.d.ts +146 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/use-timeout-D7U3EAtH.d.ts +808 -0
- package/package.json +194 -0
|
@@ -0,0 +1,981 @@
|
|
|
1
|
+
import * as immer from 'immer';
|
|
2
|
+
import * as zustand from 'zustand';
|
|
3
|
+
import { StateCreator, UseBoundStore, StoreApi } from 'zustand';
|
|
4
|
+
import { PersistOptions, StateStorage } from 'zustand/middleware';
|
|
5
|
+
import { a as ThemeMode, c as ThemeDirection } from '../theme-CrXLfP1c.js';
|
|
6
|
+
export { N as NavColor, b as NavLayout, a as SettingsState, S as SettingsValues, g as getDefaultSettings, s as settingsStore, u as useSettingsStore } from '../settings-plpR26Xk.js';
|
|
7
|
+
import '@mui/material/styles';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Options for creating a Prism store.
|
|
11
|
+
*/
|
|
12
|
+
interface CreateStoreOptions<T> {
|
|
13
|
+
/** Store name for DevTools and persistence */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Enable persistence to localStorage */
|
|
16
|
+
persist?: boolean | Partial<PersistOptions<T>>;
|
|
17
|
+
/** Enable Redux DevTools (default: true in development) */
|
|
18
|
+
devtools?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Middleware type helpers for proper typing.
|
|
22
|
+
*/
|
|
23
|
+
type ImmerMiddleware = ['zustand/immer', never];
|
|
24
|
+
/**
|
|
25
|
+
* Creates a Zustand store with Prism defaults.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* interface CounterState {
|
|
30
|
+
* count: number;
|
|
31
|
+
* increment: () => void;
|
|
32
|
+
* decrement: () => void;
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* export const useCounterStore = createPrismStore<CounterState>(
|
|
36
|
+
* (set) => ({
|
|
37
|
+
* count: 0,
|
|
38
|
+
* increment: () => set((state) => { state.count += 1; }),
|
|
39
|
+
* decrement: () => set((state) => { state.count -= 1; }),
|
|
40
|
+
* }),
|
|
41
|
+
* { name: 'counter', persist: true }
|
|
42
|
+
* );
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
declare function createPrismStore<T extends object>(initializer: StateCreator<T, [ImmerMiddleware], []>, options: CreateStoreOptions<T>): UseBoundStore<Omit<Omit<StoreApi<T>, "devtools" | "setState"> & {
|
|
46
|
+
setState(partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: false | undefined, action?: (string | {
|
|
47
|
+
[x: string]: unknown;
|
|
48
|
+
[x: number]: unknown;
|
|
49
|
+
[x: symbol]: unknown;
|
|
50
|
+
type: string;
|
|
51
|
+
}) | undefined): void;
|
|
52
|
+
setState(state: T | ((state: T) => T), replace: true, action?: (string | {
|
|
53
|
+
[x: string]: unknown;
|
|
54
|
+
[x: number]: unknown;
|
|
55
|
+
[x: symbol]: unknown;
|
|
56
|
+
type: string;
|
|
57
|
+
}) | undefined): void;
|
|
58
|
+
devtools: {
|
|
59
|
+
cleanup: () => void;
|
|
60
|
+
};
|
|
61
|
+
}, "setState"> & {
|
|
62
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | Partial<Exclude<T, (...args: any[]) => any>> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace?: false, action?: (string | {
|
|
63
|
+
[x: string]: unknown;
|
|
64
|
+
[x: number]: unknown;
|
|
65
|
+
[x: symbol]: unknown;
|
|
66
|
+
type: string;
|
|
67
|
+
}) | undefined): void;
|
|
68
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace: true, action?: (string | {
|
|
69
|
+
[x: string]: unknown;
|
|
70
|
+
[x: number]: unknown;
|
|
71
|
+
[x: symbol]: unknown;
|
|
72
|
+
type: string;
|
|
73
|
+
}) | undefined): void;
|
|
74
|
+
}> | UseBoundStore<Omit<StoreApi<T>, "setState"> & {
|
|
75
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | Partial<Exclude<T, (...args: any[]) => any>> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace?: false): void;
|
|
76
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace: true): void;
|
|
77
|
+
}>;
|
|
78
|
+
/**
|
|
79
|
+
* Creates a simple store without persistence (for UI-only state).
|
|
80
|
+
*/
|
|
81
|
+
declare function createUIStore<T extends object>(initializer: StateCreator<T, [ImmerMiddleware], []>, name: string): UseBoundStore<Omit<Omit<StoreApi<T>, "devtools" | "setState"> & {
|
|
82
|
+
setState(partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: false | undefined, action?: (string | {
|
|
83
|
+
[x: string]: unknown;
|
|
84
|
+
[x: number]: unknown;
|
|
85
|
+
[x: symbol]: unknown;
|
|
86
|
+
type: string;
|
|
87
|
+
}) | undefined): void;
|
|
88
|
+
setState(state: T | ((state: T) => T), replace: true, action?: (string | {
|
|
89
|
+
[x: string]: unknown;
|
|
90
|
+
[x: number]: unknown;
|
|
91
|
+
[x: symbol]: unknown;
|
|
92
|
+
type: string;
|
|
93
|
+
}) | undefined): void;
|
|
94
|
+
devtools: {
|
|
95
|
+
cleanup: () => void;
|
|
96
|
+
};
|
|
97
|
+
}, "setState"> & {
|
|
98
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | Partial<Exclude<T, (...args: any[]) => any>> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace?: false, action?: (string | {
|
|
99
|
+
[x: string]: unknown;
|
|
100
|
+
[x: number]: unknown;
|
|
101
|
+
[x: symbol]: unknown;
|
|
102
|
+
type: string;
|
|
103
|
+
}) | undefined): void;
|
|
104
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace: true, action?: (string | {
|
|
105
|
+
[x: string]: unknown;
|
|
106
|
+
[x: number]: unknown;
|
|
107
|
+
[x: symbol]: unknown;
|
|
108
|
+
type: string;
|
|
109
|
+
}) | undefined): void;
|
|
110
|
+
}> | UseBoundStore<Omit<StoreApi<T>, "setState"> & {
|
|
111
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | Partial<Exclude<T, (...args: any[]) => any>> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace?: false): void;
|
|
112
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace: true): void;
|
|
113
|
+
}>;
|
|
114
|
+
/**
|
|
115
|
+
* Creates a persisted store (for settings, preferences).
|
|
116
|
+
*
|
|
117
|
+
* Includes a storage wrapper that catches errors from localStorage
|
|
118
|
+
* (e.g., private browsing, quota exceeded) and falls back gracefully.
|
|
119
|
+
*/
|
|
120
|
+
declare function createPersistedStore<T extends object>(initializer: StateCreator<T, [ImmerMiddleware], []>, name: string, persistOptions?: Partial<PersistOptions<T>>): UseBoundStore<Omit<Omit<StoreApi<T>, "devtools" | "setState"> & {
|
|
121
|
+
setState(partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: false | undefined, action?: (string | {
|
|
122
|
+
[x: string]: unknown;
|
|
123
|
+
[x: number]: unknown;
|
|
124
|
+
[x: symbol]: unknown;
|
|
125
|
+
type: string;
|
|
126
|
+
}) | undefined): void;
|
|
127
|
+
setState(state: T | ((state: T) => T), replace: true, action?: (string | {
|
|
128
|
+
[x: string]: unknown;
|
|
129
|
+
[x: number]: unknown;
|
|
130
|
+
[x: symbol]: unknown;
|
|
131
|
+
type: string;
|
|
132
|
+
}) | undefined): void;
|
|
133
|
+
devtools: {
|
|
134
|
+
cleanup: () => void;
|
|
135
|
+
};
|
|
136
|
+
}, "setState"> & {
|
|
137
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | Partial<Exclude<T, (...args: any[]) => any>> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace?: false, action?: (string | {
|
|
138
|
+
[x: string]: unknown;
|
|
139
|
+
[x: number]: unknown;
|
|
140
|
+
[x: symbol]: unknown;
|
|
141
|
+
type: string;
|
|
142
|
+
}) | undefined): void;
|
|
143
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace: true, action?: (string | {
|
|
144
|
+
[x: string]: unknown;
|
|
145
|
+
[x: number]: unknown;
|
|
146
|
+
[x: symbol]: unknown;
|
|
147
|
+
type: string;
|
|
148
|
+
}) | undefined): void;
|
|
149
|
+
}> | UseBoundStore<Omit<StoreApi<T>, "setState"> & {
|
|
150
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | Partial<Exclude<T, (...args: any[]) => any>> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace?: false): void;
|
|
151
|
+
setState(nextStateOrUpdater: Exclude<T, (...args: any[]) => any> | ((state: immer.Draft<Exclude<T, (...args: any[]) => any>>) => void), shouldReplace: true): void;
|
|
152
|
+
}>;
|
|
153
|
+
/**
|
|
154
|
+
* Selector type for store state.
|
|
155
|
+
*/
|
|
156
|
+
type StoreSelector<T, U> = (state: T) => U;
|
|
157
|
+
/**
|
|
158
|
+
* Helper to create typed selectors for a store.
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```typescript
|
|
162
|
+
* const selectors = createSelectors(useUserStore);
|
|
163
|
+
* const userName = selectors.use.name();
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
declare function createSelectors<T extends object>(store: UseBoundStore<StoreApi<T>>): {
|
|
167
|
+
(): T;
|
|
168
|
+
<U>(selector: (state: T) => U): U;
|
|
169
|
+
} & StoreApi<T> & {
|
|
170
|
+
use: { [K in keyof T]: () => T[K]; };
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Theme store state and actions.
|
|
175
|
+
*/
|
|
176
|
+
interface ThemeState {
|
|
177
|
+
/** Current theme mode */
|
|
178
|
+
mode: ThemeMode;
|
|
179
|
+
/** Text direction */
|
|
180
|
+
direction: ThemeDirection;
|
|
181
|
+
/** Current preset name */
|
|
182
|
+
preset: string;
|
|
183
|
+
/** Compact layout mode */
|
|
184
|
+
compactLayout: boolean;
|
|
185
|
+
/** High contrast mode */
|
|
186
|
+
contrast: 'default' | 'high';
|
|
187
|
+
/** Primary color override */
|
|
188
|
+
primaryColor: string | null;
|
|
189
|
+
setMode: (mode: ThemeMode) => void;
|
|
190
|
+
toggleMode: () => void;
|
|
191
|
+
setDirection: (direction: ThemeDirection) => void;
|
|
192
|
+
setPreset: (preset: string) => void;
|
|
193
|
+
setCompactLayout: (compact: boolean) => void;
|
|
194
|
+
setContrast: (contrast: 'default' | 'high') => void;
|
|
195
|
+
setPrimaryColor: (color: string | null) => void;
|
|
196
|
+
reset: () => void;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Theme store with persistence.
|
|
200
|
+
*
|
|
201
|
+
* @example
|
|
202
|
+
* ```tsx
|
|
203
|
+
* function ThemeToggle() {
|
|
204
|
+
* const { mode, toggleMode } = useThemeStore();
|
|
205
|
+
* return <button onClick={toggleMode}>{mode}</button>;
|
|
206
|
+
* }
|
|
207
|
+
* ```
|
|
208
|
+
*/
|
|
209
|
+
declare const useThemeStore: zustand.UseBoundStore<Omit<Omit<zustand.StoreApi<ThemeState>, "devtools" | "setState"> & {
|
|
210
|
+
setState(partial: ThemeState | Partial<ThemeState> | ((state: ThemeState) => ThemeState | Partial<ThemeState>), replace?: false | undefined, action?: (string | {
|
|
211
|
+
[x: string]: unknown;
|
|
212
|
+
[x: number]: unknown;
|
|
213
|
+
[x: symbol]: unknown;
|
|
214
|
+
type: string;
|
|
215
|
+
}) | undefined): void;
|
|
216
|
+
setState(state: ThemeState | ((state: ThemeState) => ThemeState), replace: true, action?: (string | {
|
|
217
|
+
[x: string]: unknown;
|
|
218
|
+
[x: number]: unknown;
|
|
219
|
+
[x: symbol]: unknown;
|
|
220
|
+
type: string;
|
|
221
|
+
}) | undefined): void;
|
|
222
|
+
devtools: {
|
|
223
|
+
cleanup: () => void;
|
|
224
|
+
};
|
|
225
|
+
}, "setState"> & {
|
|
226
|
+
setState(nextStateOrUpdater: ThemeState | Partial<ThemeState> | ((state: {
|
|
227
|
+
mode: ThemeMode;
|
|
228
|
+
direction: ThemeDirection;
|
|
229
|
+
preset: string;
|
|
230
|
+
compactLayout: boolean;
|
|
231
|
+
contrast: "default" | "high";
|
|
232
|
+
primaryColor: string | null;
|
|
233
|
+
setMode: (mode: ThemeMode) => void;
|
|
234
|
+
toggleMode: () => void;
|
|
235
|
+
setDirection: (direction: ThemeDirection) => void;
|
|
236
|
+
setPreset: (preset: string) => void;
|
|
237
|
+
setCompactLayout: (compact: boolean) => void;
|
|
238
|
+
setContrast: (contrast: "default" | "high") => void;
|
|
239
|
+
setPrimaryColor: (color: string | null) => void;
|
|
240
|
+
reset: () => void;
|
|
241
|
+
}) => void), shouldReplace?: false, action?: (string | {
|
|
242
|
+
[x: string]: unknown;
|
|
243
|
+
[x: number]: unknown;
|
|
244
|
+
[x: symbol]: unknown;
|
|
245
|
+
type: string;
|
|
246
|
+
}) | undefined): void;
|
|
247
|
+
setState(nextStateOrUpdater: ThemeState | ((state: {
|
|
248
|
+
mode: ThemeMode;
|
|
249
|
+
direction: ThemeDirection;
|
|
250
|
+
preset: string;
|
|
251
|
+
compactLayout: boolean;
|
|
252
|
+
contrast: "default" | "high";
|
|
253
|
+
primaryColor: string | null;
|
|
254
|
+
setMode: (mode: ThemeMode) => void;
|
|
255
|
+
toggleMode: () => void;
|
|
256
|
+
setDirection: (direction: ThemeDirection) => void;
|
|
257
|
+
setPreset: (preset: string) => void;
|
|
258
|
+
setCompactLayout: (compact: boolean) => void;
|
|
259
|
+
setContrast: (contrast: "default" | "high") => void;
|
|
260
|
+
setPrimaryColor: (color: string | null) => void;
|
|
261
|
+
reset: () => void;
|
|
262
|
+
}) => void), shouldReplace: true, action?: (string | {
|
|
263
|
+
[x: string]: unknown;
|
|
264
|
+
[x: number]: unknown;
|
|
265
|
+
[x: symbol]: unknown;
|
|
266
|
+
type: string;
|
|
267
|
+
}) | undefined): void;
|
|
268
|
+
}> | zustand.UseBoundStore<Omit<zustand.StoreApi<ThemeState>, "setState"> & {
|
|
269
|
+
setState(nextStateOrUpdater: ThemeState | Partial<ThemeState> | ((state: {
|
|
270
|
+
mode: ThemeMode;
|
|
271
|
+
direction: ThemeDirection;
|
|
272
|
+
preset: string;
|
|
273
|
+
compactLayout: boolean;
|
|
274
|
+
contrast: "default" | "high";
|
|
275
|
+
primaryColor: string | null;
|
|
276
|
+
setMode: (mode: ThemeMode) => void;
|
|
277
|
+
toggleMode: () => void;
|
|
278
|
+
setDirection: (direction: ThemeDirection) => void;
|
|
279
|
+
setPreset: (preset: string) => void;
|
|
280
|
+
setCompactLayout: (compact: boolean) => void;
|
|
281
|
+
setContrast: (contrast: "default" | "high") => void;
|
|
282
|
+
setPrimaryColor: (color: string | null) => void;
|
|
283
|
+
reset: () => void;
|
|
284
|
+
}) => void), shouldReplace?: false): void;
|
|
285
|
+
setState(nextStateOrUpdater: ThemeState | ((state: {
|
|
286
|
+
mode: ThemeMode;
|
|
287
|
+
direction: ThemeDirection;
|
|
288
|
+
preset: string;
|
|
289
|
+
compactLayout: boolean;
|
|
290
|
+
contrast: "default" | "high";
|
|
291
|
+
primaryColor: string | null;
|
|
292
|
+
setMode: (mode: ThemeMode) => void;
|
|
293
|
+
toggleMode: () => void;
|
|
294
|
+
setDirection: (direction: ThemeDirection) => void;
|
|
295
|
+
setPreset: (preset: string) => void;
|
|
296
|
+
setCompactLayout: (compact: boolean) => void;
|
|
297
|
+
setContrast: (contrast: "default" | "high") => void;
|
|
298
|
+
setPrimaryColor: (color: string | null) => void;
|
|
299
|
+
reset: () => void;
|
|
300
|
+
}) => void), shouldReplace: true): void;
|
|
301
|
+
}>;
|
|
302
|
+
/**
|
|
303
|
+
* Theme store with auto-generated selectors.
|
|
304
|
+
*
|
|
305
|
+
* @example
|
|
306
|
+
* ```tsx
|
|
307
|
+
* const mode = themeStore.use.mode();
|
|
308
|
+
* ```
|
|
309
|
+
*/
|
|
310
|
+
declare const themeStore: {
|
|
311
|
+
(): {
|
|
312
|
+
mode: ThemeMode;
|
|
313
|
+
direction: ThemeDirection;
|
|
314
|
+
preset: string;
|
|
315
|
+
compactLayout: boolean;
|
|
316
|
+
contrast: "default" | "high";
|
|
317
|
+
primaryColor: string | null;
|
|
318
|
+
setMode: (mode: ThemeMode) => void;
|
|
319
|
+
toggleMode: () => void;
|
|
320
|
+
setDirection: (direction: ThemeDirection) => void;
|
|
321
|
+
setPreset: (preset: string) => void;
|
|
322
|
+
setCompactLayout: (compact: boolean) => void;
|
|
323
|
+
setContrast: (contrast: "default" | "high") => void;
|
|
324
|
+
setPrimaryColor: (color: string | null) => void;
|
|
325
|
+
reset: () => void;
|
|
326
|
+
};
|
|
327
|
+
<U>(selector: (state: {
|
|
328
|
+
mode: ThemeMode;
|
|
329
|
+
direction: ThemeDirection;
|
|
330
|
+
preset: string;
|
|
331
|
+
compactLayout: boolean;
|
|
332
|
+
contrast: "default" | "high";
|
|
333
|
+
primaryColor: string | null;
|
|
334
|
+
setMode: (mode: ThemeMode) => void;
|
|
335
|
+
toggleMode: () => void;
|
|
336
|
+
setDirection: (direction: ThemeDirection) => void;
|
|
337
|
+
setPreset: (preset: string) => void;
|
|
338
|
+
setCompactLayout: (compact: boolean) => void;
|
|
339
|
+
setContrast: (contrast: "default" | "high") => void;
|
|
340
|
+
setPrimaryColor: (color: string | null) => void;
|
|
341
|
+
reset: () => void;
|
|
342
|
+
}) => U): U;
|
|
343
|
+
} & zustand.StoreApi<{
|
|
344
|
+
mode: ThemeMode;
|
|
345
|
+
direction: ThemeDirection;
|
|
346
|
+
preset: string;
|
|
347
|
+
compactLayout: boolean;
|
|
348
|
+
contrast: "default" | "high";
|
|
349
|
+
primaryColor: string | null;
|
|
350
|
+
setMode: (mode: ThemeMode) => void;
|
|
351
|
+
toggleMode: () => void;
|
|
352
|
+
setDirection: (direction: ThemeDirection) => void;
|
|
353
|
+
setPreset: (preset: string) => void;
|
|
354
|
+
setCompactLayout: (compact: boolean) => void;
|
|
355
|
+
setContrast: (contrast: "default" | "high") => void;
|
|
356
|
+
setPrimaryColor: (color: string | null) => void;
|
|
357
|
+
reset: () => void;
|
|
358
|
+
}> & {
|
|
359
|
+
use: {
|
|
360
|
+
mode: () => ThemeMode;
|
|
361
|
+
direction: () => ThemeDirection;
|
|
362
|
+
preset: () => string;
|
|
363
|
+
compactLayout: () => boolean;
|
|
364
|
+
contrast: () => "default" | "high";
|
|
365
|
+
primaryColor: () => string | null;
|
|
366
|
+
setMode: () => (mode: ThemeMode) => void;
|
|
367
|
+
toggleMode: () => () => void;
|
|
368
|
+
setDirection: () => (direction: ThemeDirection) => void;
|
|
369
|
+
setPreset: () => (preset: string) => void;
|
|
370
|
+
setCompactLayout: () => (compact: boolean) => void;
|
|
371
|
+
setContrast: () => (contrast: "default" | "high") => void;
|
|
372
|
+
setPrimaryColor: () => (color: string | null) => void;
|
|
373
|
+
reset: () => () => void;
|
|
374
|
+
};
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Auth Store
|
|
379
|
+
*
|
|
380
|
+
* Manages authentication state (UI-side).
|
|
381
|
+
* Server-side token validation should use Netron auth.
|
|
382
|
+
*
|
|
383
|
+
* SECURITY NOTE: Tokens are stored in session storage (not localStorage)
|
|
384
|
+
* and are NOT persisted across browser sessions. Only the auth status
|
|
385
|
+
* is persisted to allow checking login state on page load.
|
|
386
|
+
*
|
|
387
|
+
* @module @omnitron-dev/prism/state/stores
|
|
388
|
+
*/
|
|
389
|
+
/**
|
|
390
|
+
* Authentication status.
|
|
391
|
+
*/
|
|
392
|
+
type AuthStatus = 'loading' | 'authenticated' | 'unauthenticated';
|
|
393
|
+
/**
|
|
394
|
+
* Auth store state (persisted - only status).
|
|
395
|
+
*/
|
|
396
|
+
interface AuthStoreState {
|
|
397
|
+
/** Current auth status */
|
|
398
|
+
status: AuthStatus;
|
|
399
|
+
/** Session ID (non-sensitive) */
|
|
400
|
+
sessionId: string | null;
|
|
401
|
+
setStatus: (status: AuthStatus) => void;
|
|
402
|
+
setAuthenticated: (sessionId?: string) => void;
|
|
403
|
+
setUnauthenticated: () => void;
|
|
404
|
+
clearSession: () => void;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Auth store with partial persistence.
|
|
408
|
+
* Only status and sessionId are persisted, NOT the token.
|
|
409
|
+
*
|
|
410
|
+
* @example
|
|
411
|
+
* ```tsx
|
|
412
|
+
* function AuthGuard({ children }) {
|
|
413
|
+
* const status = useAuthStore((s) => s.status);
|
|
414
|
+
* const isAuthenticated = selectIsAuthenticated(useAuthStore.getState());
|
|
415
|
+
*
|
|
416
|
+
* if (status === 'loading') return <Spinner />;
|
|
417
|
+
* if (!isAuthenticated) return <Navigate to="/login" />;
|
|
418
|
+
*
|
|
419
|
+
* return children;
|
|
420
|
+
* }
|
|
421
|
+
* ```
|
|
422
|
+
*/
|
|
423
|
+
declare const useAuthStore: zustand.UseBoundStore<Omit<Omit<zustand.StoreApi<AuthStoreState>, "devtools" | "setState"> & {
|
|
424
|
+
setState(partial: AuthStoreState | Partial<AuthStoreState> | ((state: AuthStoreState) => AuthStoreState | Partial<AuthStoreState>), replace?: false | undefined, action?: (string | {
|
|
425
|
+
[x: string]: unknown;
|
|
426
|
+
[x: number]: unknown;
|
|
427
|
+
[x: symbol]: unknown;
|
|
428
|
+
type: string;
|
|
429
|
+
}) | undefined): void;
|
|
430
|
+
setState(state: AuthStoreState | ((state: AuthStoreState) => AuthStoreState), replace: true, action?: (string | {
|
|
431
|
+
[x: string]: unknown;
|
|
432
|
+
[x: number]: unknown;
|
|
433
|
+
[x: symbol]: unknown;
|
|
434
|
+
type: string;
|
|
435
|
+
}) | undefined): void;
|
|
436
|
+
devtools: {
|
|
437
|
+
cleanup: () => void;
|
|
438
|
+
};
|
|
439
|
+
}, "setState"> & {
|
|
440
|
+
setState(nextStateOrUpdater: AuthStoreState | Partial<AuthStoreState> | ((state: {
|
|
441
|
+
status: AuthStatus;
|
|
442
|
+
sessionId: string | null;
|
|
443
|
+
setStatus: (status: AuthStatus) => void;
|
|
444
|
+
setAuthenticated: (sessionId?: string) => void;
|
|
445
|
+
setUnauthenticated: () => void;
|
|
446
|
+
clearSession: () => void;
|
|
447
|
+
}) => void), shouldReplace?: false, action?: (string | {
|
|
448
|
+
[x: string]: unknown;
|
|
449
|
+
[x: number]: unknown;
|
|
450
|
+
[x: symbol]: unknown;
|
|
451
|
+
type: string;
|
|
452
|
+
}) | undefined): void;
|
|
453
|
+
setState(nextStateOrUpdater: AuthStoreState | ((state: {
|
|
454
|
+
status: AuthStatus;
|
|
455
|
+
sessionId: string | null;
|
|
456
|
+
setStatus: (status: AuthStatus) => void;
|
|
457
|
+
setAuthenticated: (sessionId?: string) => void;
|
|
458
|
+
setUnauthenticated: () => void;
|
|
459
|
+
clearSession: () => void;
|
|
460
|
+
}) => void), shouldReplace: true, action?: (string | {
|
|
461
|
+
[x: string]: unknown;
|
|
462
|
+
[x: number]: unknown;
|
|
463
|
+
[x: symbol]: unknown;
|
|
464
|
+
type: string;
|
|
465
|
+
}) | undefined): void;
|
|
466
|
+
}> | zustand.UseBoundStore<Omit<zustand.StoreApi<AuthStoreState>, "setState"> & {
|
|
467
|
+
setState(nextStateOrUpdater: AuthStoreState | Partial<AuthStoreState> | ((state: {
|
|
468
|
+
status: AuthStatus;
|
|
469
|
+
sessionId: string | null;
|
|
470
|
+
setStatus: (status: AuthStatus) => void;
|
|
471
|
+
setAuthenticated: (sessionId?: string) => void;
|
|
472
|
+
setUnauthenticated: () => void;
|
|
473
|
+
clearSession: () => void;
|
|
474
|
+
}) => void), shouldReplace?: false): void;
|
|
475
|
+
setState(nextStateOrUpdater: AuthStoreState | ((state: {
|
|
476
|
+
status: AuthStatus;
|
|
477
|
+
sessionId: string | null;
|
|
478
|
+
setStatus: (status: AuthStatus) => void;
|
|
479
|
+
setAuthenticated: (sessionId?: string) => void;
|
|
480
|
+
setUnauthenticated: () => void;
|
|
481
|
+
clearSession: () => void;
|
|
482
|
+
}) => void), shouldReplace: true): void;
|
|
483
|
+
}>;
|
|
484
|
+
/**
|
|
485
|
+
* Auth store with auto-generated selectors.
|
|
486
|
+
*/
|
|
487
|
+
declare const authStore: {
|
|
488
|
+
(): {
|
|
489
|
+
status: AuthStatus;
|
|
490
|
+
sessionId: string | null;
|
|
491
|
+
setStatus: (status: AuthStatus) => void;
|
|
492
|
+
setAuthenticated: (sessionId?: string) => void;
|
|
493
|
+
setUnauthenticated: () => void;
|
|
494
|
+
clearSession: () => void;
|
|
495
|
+
};
|
|
496
|
+
<U>(selector: (state: {
|
|
497
|
+
status: AuthStatus;
|
|
498
|
+
sessionId: string | null;
|
|
499
|
+
setStatus: (status: AuthStatus) => void;
|
|
500
|
+
setAuthenticated: (sessionId?: string) => void;
|
|
501
|
+
setUnauthenticated: () => void;
|
|
502
|
+
clearSession: () => void;
|
|
503
|
+
}) => U): U;
|
|
504
|
+
} & zustand.StoreApi<{
|
|
505
|
+
status: AuthStatus;
|
|
506
|
+
sessionId: string | null;
|
|
507
|
+
setStatus: (status: AuthStatus) => void;
|
|
508
|
+
setAuthenticated: (sessionId?: string) => void;
|
|
509
|
+
setUnauthenticated: () => void;
|
|
510
|
+
clearSession: () => void;
|
|
511
|
+
}> & {
|
|
512
|
+
use: {
|
|
513
|
+
status: () => AuthStatus;
|
|
514
|
+
sessionId: () => string | null;
|
|
515
|
+
setStatus: () => (status: AuthStatus) => void;
|
|
516
|
+
setAuthenticated: () => (sessionId?: string) => void;
|
|
517
|
+
setUnauthenticated: () => () => void;
|
|
518
|
+
clearSession: () => () => void;
|
|
519
|
+
};
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* UI Store
|
|
524
|
+
*
|
|
525
|
+
* Manages transient UI state (not persisted).
|
|
526
|
+
*
|
|
527
|
+
* @module @omnitron-dev/prism/state/stores
|
|
528
|
+
*/
|
|
529
|
+
/**
|
|
530
|
+
* UI store state and actions.
|
|
531
|
+
*/
|
|
532
|
+
interface UIState {
|
|
533
|
+
/** Sidebar open state */
|
|
534
|
+
sidebarOpen: boolean;
|
|
535
|
+
/** Sidebar collapsed state (mini mode) */
|
|
536
|
+
sidebarCollapsed: boolean;
|
|
537
|
+
/** Active dialog ID */
|
|
538
|
+
activeDialog: string | null;
|
|
539
|
+
/** Global loading overlay */
|
|
540
|
+
globalLoading: boolean;
|
|
541
|
+
/** Search modal open */
|
|
542
|
+
searchOpen: boolean;
|
|
543
|
+
toggleSidebar: () => void;
|
|
544
|
+
setSidebarOpen: (open: boolean) => void;
|
|
545
|
+
setSidebarCollapsed: (collapsed: boolean) => void;
|
|
546
|
+
openDialog: (dialogId: string) => void;
|
|
547
|
+
closeDialog: () => void;
|
|
548
|
+
setGlobalLoading: (loading: boolean) => void;
|
|
549
|
+
toggleSearch: () => void;
|
|
550
|
+
setSearchOpen: (open: boolean) => void;
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* UI store for transient state.
|
|
554
|
+
*
|
|
555
|
+
* @example
|
|
556
|
+
* ```tsx
|
|
557
|
+
* function Sidebar() {
|
|
558
|
+
* const { sidebarOpen, sidebarCollapsed, toggleSidebar } = useUIStore();
|
|
559
|
+
*
|
|
560
|
+
* return (
|
|
561
|
+
* <Drawer
|
|
562
|
+
* open={sidebarOpen}
|
|
563
|
+
* variant={sidebarCollapsed ? 'mini' : 'permanent'}
|
|
564
|
+
* >
|
|
565
|
+
* <SidebarContent />
|
|
566
|
+
* </Drawer>
|
|
567
|
+
* );
|
|
568
|
+
* }
|
|
569
|
+
* ```
|
|
570
|
+
*/
|
|
571
|
+
declare const useUIStore: zustand.UseBoundStore<Omit<Omit<zustand.StoreApi<UIState>, "devtools" | "setState"> & {
|
|
572
|
+
setState(partial: UIState | Partial<UIState> | ((state: UIState) => UIState | Partial<UIState>), replace?: false | undefined, action?: (string | {
|
|
573
|
+
[x: string]: unknown;
|
|
574
|
+
[x: number]: unknown;
|
|
575
|
+
[x: symbol]: unknown;
|
|
576
|
+
type: string;
|
|
577
|
+
}) | undefined): void;
|
|
578
|
+
setState(state: UIState | ((state: UIState) => UIState), replace: true, action?: (string | {
|
|
579
|
+
[x: string]: unknown;
|
|
580
|
+
[x: number]: unknown;
|
|
581
|
+
[x: symbol]: unknown;
|
|
582
|
+
type: string;
|
|
583
|
+
}) | undefined): void;
|
|
584
|
+
devtools: {
|
|
585
|
+
cleanup: () => void;
|
|
586
|
+
};
|
|
587
|
+
}, "setState"> & {
|
|
588
|
+
setState(nextStateOrUpdater: UIState | Partial<UIState> | ((state: {
|
|
589
|
+
sidebarOpen: boolean;
|
|
590
|
+
sidebarCollapsed: boolean;
|
|
591
|
+
activeDialog: string | null;
|
|
592
|
+
globalLoading: boolean;
|
|
593
|
+
searchOpen: boolean;
|
|
594
|
+
toggleSidebar: () => void;
|
|
595
|
+
setSidebarOpen: (open: boolean) => void;
|
|
596
|
+
setSidebarCollapsed: (collapsed: boolean) => void;
|
|
597
|
+
openDialog: (dialogId: string) => void;
|
|
598
|
+
closeDialog: () => void;
|
|
599
|
+
setGlobalLoading: (loading: boolean) => void;
|
|
600
|
+
toggleSearch: () => void;
|
|
601
|
+
setSearchOpen: (open: boolean) => void;
|
|
602
|
+
}) => void), shouldReplace?: false, action?: (string | {
|
|
603
|
+
[x: string]: unknown;
|
|
604
|
+
[x: number]: unknown;
|
|
605
|
+
[x: symbol]: unknown;
|
|
606
|
+
type: string;
|
|
607
|
+
}) | undefined): void;
|
|
608
|
+
setState(nextStateOrUpdater: UIState | ((state: {
|
|
609
|
+
sidebarOpen: boolean;
|
|
610
|
+
sidebarCollapsed: boolean;
|
|
611
|
+
activeDialog: string | null;
|
|
612
|
+
globalLoading: boolean;
|
|
613
|
+
searchOpen: boolean;
|
|
614
|
+
toggleSidebar: () => void;
|
|
615
|
+
setSidebarOpen: (open: boolean) => void;
|
|
616
|
+
setSidebarCollapsed: (collapsed: boolean) => void;
|
|
617
|
+
openDialog: (dialogId: string) => void;
|
|
618
|
+
closeDialog: () => void;
|
|
619
|
+
setGlobalLoading: (loading: boolean) => void;
|
|
620
|
+
toggleSearch: () => void;
|
|
621
|
+
setSearchOpen: (open: boolean) => void;
|
|
622
|
+
}) => void), shouldReplace: true, action?: (string | {
|
|
623
|
+
[x: string]: unknown;
|
|
624
|
+
[x: number]: unknown;
|
|
625
|
+
[x: symbol]: unknown;
|
|
626
|
+
type: string;
|
|
627
|
+
}) | undefined): void;
|
|
628
|
+
}> | zustand.UseBoundStore<Omit<zustand.StoreApi<UIState>, "setState"> & {
|
|
629
|
+
setState(nextStateOrUpdater: UIState | Partial<UIState> | ((state: {
|
|
630
|
+
sidebarOpen: boolean;
|
|
631
|
+
sidebarCollapsed: boolean;
|
|
632
|
+
activeDialog: string | null;
|
|
633
|
+
globalLoading: boolean;
|
|
634
|
+
searchOpen: boolean;
|
|
635
|
+
toggleSidebar: () => void;
|
|
636
|
+
setSidebarOpen: (open: boolean) => void;
|
|
637
|
+
setSidebarCollapsed: (collapsed: boolean) => void;
|
|
638
|
+
openDialog: (dialogId: string) => void;
|
|
639
|
+
closeDialog: () => void;
|
|
640
|
+
setGlobalLoading: (loading: boolean) => void;
|
|
641
|
+
toggleSearch: () => void;
|
|
642
|
+
setSearchOpen: (open: boolean) => void;
|
|
643
|
+
}) => void), shouldReplace?: false): void;
|
|
644
|
+
setState(nextStateOrUpdater: UIState | ((state: {
|
|
645
|
+
sidebarOpen: boolean;
|
|
646
|
+
sidebarCollapsed: boolean;
|
|
647
|
+
activeDialog: string | null;
|
|
648
|
+
globalLoading: boolean;
|
|
649
|
+
searchOpen: boolean;
|
|
650
|
+
toggleSidebar: () => void;
|
|
651
|
+
setSidebarOpen: (open: boolean) => void;
|
|
652
|
+
setSidebarCollapsed: (collapsed: boolean) => void;
|
|
653
|
+
openDialog: (dialogId: string) => void;
|
|
654
|
+
closeDialog: () => void;
|
|
655
|
+
setGlobalLoading: (loading: boolean) => void;
|
|
656
|
+
toggleSearch: () => void;
|
|
657
|
+
setSearchOpen: (open: boolean) => void;
|
|
658
|
+
}) => void), shouldReplace: true): void;
|
|
659
|
+
}>;
|
|
660
|
+
/**
|
|
661
|
+
* UI store with auto-generated selectors.
|
|
662
|
+
*/
|
|
663
|
+
declare const uiStore: {
|
|
664
|
+
(): {
|
|
665
|
+
sidebarOpen: boolean;
|
|
666
|
+
sidebarCollapsed: boolean;
|
|
667
|
+
activeDialog: string | null;
|
|
668
|
+
globalLoading: boolean;
|
|
669
|
+
searchOpen: boolean;
|
|
670
|
+
toggleSidebar: () => void;
|
|
671
|
+
setSidebarOpen: (open: boolean) => void;
|
|
672
|
+
setSidebarCollapsed: (collapsed: boolean) => void;
|
|
673
|
+
openDialog: (dialogId: string) => void;
|
|
674
|
+
closeDialog: () => void;
|
|
675
|
+
setGlobalLoading: (loading: boolean) => void;
|
|
676
|
+
toggleSearch: () => void;
|
|
677
|
+
setSearchOpen: (open: boolean) => void;
|
|
678
|
+
};
|
|
679
|
+
<U>(selector: (state: {
|
|
680
|
+
sidebarOpen: boolean;
|
|
681
|
+
sidebarCollapsed: boolean;
|
|
682
|
+
activeDialog: string | null;
|
|
683
|
+
globalLoading: boolean;
|
|
684
|
+
searchOpen: boolean;
|
|
685
|
+
toggleSidebar: () => void;
|
|
686
|
+
setSidebarOpen: (open: boolean) => void;
|
|
687
|
+
setSidebarCollapsed: (collapsed: boolean) => void;
|
|
688
|
+
openDialog: (dialogId: string) => void;
|
|
689
|
+
closeDialog: () => void;
|
|
690
|
+
setGlobalLoading: (loading: boolean) => void;
|
|
691
|
+
toggleSearch: () => void;
|
|
692
|
+
setSearchOpen: (open: boolean) => void;
|
|
693
|
+
}) => U): U;
|
|
694
|
+
} & zustand.StoreApi<{
|
|
695
|
+
sidebarOpen: boolean;
|
|
696
|
+
sidebarCollapsed: boolean;
|
|
697
|
+
activeDialog: string | null;
|
|
698
|
+
globalLoading: boolean;
|
|
699
|
+
searchOpen: boolean;
|
|
700
|
+
toggleSidebar: () => void;
|
|
701
|
+
setSidebarOpen: (open: boolean) => void;
|
|
702
|
+
setSidebarCollapsed: (collapsed: boolean) => void;
|
|
703
|
+
openDialog: (dialogId: string) => void;
|
|
704
|
+
closeDialog: () => void;
|
|
705
|
+
setGlobalLoading: (loading: boolean) => void;
|
|
706
|
+
toggleSearch: () => void;
|
|
707
|
+
setSearchOpen: (open: boolean) => void;
|
|
708
|
+
}> & {
|
|
709
|
+
use: {
|
|
710
|
+
sidebarOpen: () => boolean;
|
|
711
|
+
sidebarCollapsed: () => boolean;
|
|
712
|
+
activeDialog: () => string | null;
|
|
713
|
+
globalLoading: () => boolean;
|
|
714
|
+
searchOpen: () => boolean;
|
|
715
|
+
toggleSidebar: () => () => void;
|
|
716
|
+
setSidebarOpen: () => (open: boolean) => void;
|
|
717
|
+
setSidebarCollapsed: () => (collapsed: boolean) => void;
|
|
718
|
+
openDialog: () => (dialogId: string) => void;
|
|
719
|
+
closeDialog: () => () => void;
|
|
720
|
+
setGlobalLoading: () => (loading: boolean) => void;
|
|
721
|
+
toggleSearch: () => () => void;
|
|
722
|
+
setSearchOpen: () => (open: boolean) => void;
|
|
723
|
+
};
|
|
724
|
+
};
|
|
725
|
+
|
|
726
|
+
/**
|
|
727
|
+
* Settings Version Management
|
|
728
|
+
*
|
|
729
|
+
* Utilities for managing versioned settings with safe migrations.
|
|
730
|
+
* Enables breaking changes to settings structure while preserving user data.
|
|
731
|
+
*
|
|
732
|
+
* @module @omnitron-dev/prism/state
|
|
733
|
+
*/
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* Migration function signature.
|
|
737
|
+
* Transforms settings from one version to the next.
|
|
738
|
+
*/
|
|
739
|
+
type MigrationFn<TPrev = unknown, TNext = unknown> = (prevState: TPrev) => TNext;
|
|
740
|
+
/**
|
|
741
|
+
* Version-specific migration configuration.
|
|
742
|
+
*/
|
|
743
|
+
interface VersionMigration<TPrev = unknown, TNext = unknown> {
|
|
744
|
+
/** Target version number */
|
|
745
|
+
version: number;
|
|
746
|
+
/** Migration function */
|
|
747
|
+
migrate: MigrationFn<TPrev, TNext>;
|
|
748
|
+
}
|
|
749
|
+
/**
|
|
750
|
+
* Versioned settings configuration.
|
|
751
|
+
*/
|
|
752
|
+
interface VersionedSettingsConfig<TState> {
|
|
753
|
+
/** Current version number (increment when structure changes) */
|
|
754
|
+
version: number;
|
|
755
|
+
/** Storage key prefix */
|
|
756
|
+
name: string;
|
|
757
|
+
/** Ordered list of migrations (version -> next version) */
|
|
758
|
+
migrations: VersionMigration[];
|
|
759
|
+
/** Validation function (optional) */
|
|
760
|
+
validate?: (state: unknown) => state is TState;
|
|
761
|
+
/** Called when migration fails */
|
|
762
|
+
onMigrationError?: (error: unknown, fromVersion: number, toVersion: number) => void;
|
|
763
|
+
/** Called when stored data is corrupt/invalid */
|
|
764
|
+
onCorruptData?: (error: unknown, rawData: unknown) => void;
|
|
765
|
+
/** Default state (used when migration fails or data is corrupt) */
|
|
766
|
+
defaultState: TState;
|
|
767
|
+
}
|
|
768
|
+
/**
|
|
769
|
+
* Persisted settings with version metadata.
|
|
770
|
+
*/
|
|
771
|
+
interface VersionedPersistedState<TState> {
|
|
772
|
+
state: TState;
|
|
773
|
+
version: number;
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Run migrations from one version to another.
|
|
777
|
+
*
|
|
778
|
+
* @param state - Current state
|
|
779
|
+
* @param fromVersion - Starting version
|
|
780
|
+
* @param toVersion - Target version
|
|
781
|
+
* @param migrations - Available migrations
|
|
782
|
+
* @returns Migrated state or null if migration failed
|
|
783
|
+
*/
|
|
784
|
+
declare function runMigrations<TState>(state: unknown, fromVersion: number, toVersion: number, migrations: VersionMigration[]): TState | null;
|
|
785
|
+
/**
|
|
786
|
+
* Create a versioned storage adapter for Zustand persist.
|
|
787
|
+
*
|
|
788
|
+
* This adapter handles:
|
|
789
|
+
* - Version tracking in stored data
|
|
790
|
+
* - Automatic migrations when version changes
|
|
791
|
+
* - Safe fallback to defaults on corrupt data
|
|
792
|
+
*
|
|
793
|
+
* @example
|
|
794
|
+
* ```tsx
|
|
795
|
+
* interface AppSettings {
|
|
796
|
+
* theme: 'light' | 'dark';
|
|
797
|
+
* language: string;
|
|
798
|
+
* notifications: { email: boolean; push: boolean };
|
|
799
|
+
* }
|
|
800
|
+
*
|
|
801
|
+
* const versionedStorage = createVersionedStorage<AppSettings>({
|
|
802
|
+
* version: 3,
|
|
803
|
+
* name: 'app-settings',
|
|
804
|
+
* defaultState: {
|
|
805
|
+
* theme: 'light',
|
|
806
|
+
* language: 'en',
|
|
807
|
+
* notifications: { email: true, push: true },
|
|
808
|
+
* },
|
|
809
|
+
* migrations: [
|
|
810
|
+
* {
|
|
811
|
+
* version: 2,
|
|
812
|
+
* migrate: (prev: { theme: string }) => ({
|
|
813
|
+
* ...prev,
|
|
814
|
+
* language: 'en', // Added in v2
|
|
815
|
+
* }),
|
|
816
|
+
* },
|
|
817
|
+
* {
|
|
818
|
+
* version: 3,
|
|
819
|
+
* migrate: (prev: { theme: string; language: string }) => ({
|
|
820
|
+
* ...prev,
|
|
821
|
+
* notifications: { email: true, push: true }, // Added in v3
|
|
822
|
+
* }),
|
|
823
|
+
* },
|
|
824
|
+
* ],
|
|
825
|
+
* });
|
|
826
|
+
*
|
|
827
|
+
* // Use with createPrismStore
|
|
828
|
+
* const useSettings = createPrismStore<AppSettings>(
|
|
829
|
+
* (set) => ({
|
|
830
|
+
* ...versionedStorage.defaultState,
|
|
831
|
+
* setTheme: (theme) => set({ theme }),
|
|
832
|
+
* }),
|
|
833
|
+
* {
|
|
834
|
+
* name: 'settings',
|
|
835
|
+
* persist: {
|
|
836
|
+
* storage: versionedStorage.storage,
|
|
837
|
+
* version: versionedStorage.version,
|
|
838
|
+
* migrate: versionedStorage.migrate,
|
|
839
|
+
* },
|
|
840
|
+
* }
|
|
841
|
+
* );
|
|
842
|
+
* ```
|
|
843
|
+
*/
|
|
844
|
+
declare function createVersionedStorage<TState>(config: VersionedSettingsConfig<TState>): {
|
|
845
|
+
storage: StateStorage;
|
|
846
|
+
version: number;
|
|
847
|
+
migrate: (persistedState: unknown, version: number) => TState;
|
|
848
|
+
defaultState: TState;
|
|
849
|
+
};
|
|
850
|
+
/**
|
|
851
|
+
* Create persist options for versioned settings.
|
|
852
|
+
* Convenience function that returns properly typed PersistOptions.
|
|
853
|
+
*
|
|
854
|
+
* @example
|
|
855
|
+
* ```tsx
|
|
856
|
+
* const persistOptions = createVersionedPersistOptions<MySettings>({
|
|
857
|
+
* version: 2,
|
|
858
|
+
* name: 'my-settings',
|
|
859
|
+
* defaultState: { /* ... *\/ },
|
|
860
|
+
* migrations: [{ version: 2, migrate: (prev) => ({ ...prev, newField: 'default' }) }],
|
|
861
|
+
* });
|
|
862
|
+
*
|
|
863
|
+
* const useStore = createPrismStore(initializer, {
|
|
864
|
+
* name: 'my-settings',
|
|
865
|
+
* persist: persistOptions,
|
|
866
|
+
* });
|
|
867
|
+
* ```
|
|
868
|
+
*/
|
|
869
|
+
declare function createVersionedPersistOptions<TState>(config: VersionedSettingsConfig<TState>): Partial<PersistOptions<TState>>;
|
|
870
|
+
/**
|
|
871
|
+
* Check if settings need migration.
|
|
872
|
+
*
|
|
873
|
+
* @param name - Settings name
|
|
874
|
+
* @param currentVersion - Current app settings version
|
|
875
|
+
* @returns Object with migration status
|
|
876
|
+
*/
|
|
877
|
+
declare function checkSettingsVersion(name: string, currentVersion: number): {
|
|
878
|
+
needsMigration: boolean;
|
|
879
|
+
storedVersion: number | null;
|
|
880
|
+
currentVersion: number;
|
|
881
|
+
};
|
|
882
|
+
/**
|
|
883
|
+
* Clear stored settings (useful for testing or reset).
|
|
884
|
+
*/
|
|
885
|
+
declare function clearSettings(name: string): void;
|
|
886
|
+
/**
|
|
887
|
+
* Export settings to JSON.
|
|
888
|
+
*/
|
|
889
|
+
declare function exportSettings<TState>(name: string, currentVersion: number): VersionedPersistedState<TState> | null;
|
|
890
|
+
/**
|
|
891
|
+
* Import settings from JSON.
|
|
892
|
+
* Will trigger migration if version differs.
|
|
893
|
+
*/
|
|
894
|
+
declare function importSettings<TState>(name: string, data: VersionedPersistedState<TState>): void;
|
|
895
|
+
/**
|
|
896
|
+
* Create a type guard for settings validation.
|
|
897
|
+
*
|
|
898
|
+
* @example
|
|
899
|
+
* ```tsx
|
|
900
|
+
* const isValidSettings = createSettingsValidator<MySettings>({
|
|
901
|
+
* requiredKeys: ['theme', 'language'],
|
|
902
|
+
* typeChecks: {
|
|
903
|
+
* theme: (v) => v === 'light' || v === 'dark',
|
|
904
|
+
* language: (v) => typeof v === 'string',
|
|
905
|
+
* },
|
|
906
|
+
* });
|
|
907
|
+
* ```
|
|
908
|
+
*/
|
|
909
|
+
declare function createSettingsValidator<TState extends Record<string, unknown>>(config: {
|
|
910
|
+
requiredKeys?: (keyof TState)[];
|
|
911
|
+
typeChecks?: Partial<{
|
|
912
|
+
[K in keyof TState]: (value: unknown) => boolean;
|
|
913
|
+
}>;
|
|
914
|
+
}): (state: unknown) => state is TState;
|
|
915
|
+
/**
|
|
916
|
+
* Creates a simple migration from one version to the next.
|
|
917
|
+
*
|
|
918
|
+
* @example
|
|
919
|
+
* ```typescript
|
|
920
|
+
* const v2Migration = createMigration(2, (state) => ({
|
|
921
|
+
* ...state,
|
|
922
|
+
* navLayout: 'vertical',
|
|
923
|
+
* }));
|
|
924
|
+
* ```
|
|
925
|
+
*/
|
|
926
|
+
declare function createMigration<TPrev = unknown, TNext = unknown>(version: number, migrate: MigrationFn<TPrev, TNext>): VersionMigration<TPrev, TNext>;
|
|
927
|
+
/**
|
|
928
|
+
* Creates a migration that renames a field.
|
|
929
|
+
*
|
|
930
|
+
* @example
|
|
931
|
+
* ```typescript
|
|
932
|
+
* const renameMigration = createRenameMigration(3, 'theme', 'mode', 'light');
|
|
933
|
+
* ```
|
|
934
|
+
*/
|
|
935
|
+
declare function createRenameMigration<TNext>(version: number, oldKey: string, newKey: string, defaultValue: unknown): VersionMigration;
|
|
936
|
+
/**
|
|
937
|
+
* Creates a migration that adds a new field with a default value.
|
|
938
|
+
*
|
|
939
|
+
* @example
|
|
940
|
+
* ```typescript
|
|
941
|
+
* const addFieldMigration = createAddFieldMigration(4, 'stretch', false);
|
|
942
|
+
* ```
|
|
943
|
+
*/
|
|
944
|
+
declare function createAddFieldMigration<TNext>(version: number, key: string, defaultValue: unknown): VersionMigration;
|
|
945
|
+
/**
|
|
946
|
+
* Creates a migration that removes a field.
|
|
947
|
+
*
|
|
948
|
+
* @example
|
|
949
|
+
* ```typescript
|
|
950
|
+
* const removeFieldMigration = createRemoveFieldMigration(5, 'legacyOption');
|
|
951
|
+
* ```
|
|
952
|
+
*/
|
|
953
|
+
declare function createRemoveFieldMigration<TNext>(version: number, key: string): VersionMigration;
|
|
954
|
+
/**
|
|
955
|
+
* Creates a migration that transforms a field's value.
|
|
956
|
+
*
|
|
957
|
+
* @example
|
|
958
|
+
* ```typescript
|
|
959
|
+
* const transformMigration = createTransformMigration(
|
|
960
|
+
* 6,
|
|
961
|
+
* 'fontSize',
|
|
962
|
+
* (value) => typeof value === 'string' ? parseInt(value, 10) : value,
|
|
963
|
+
* 16
|
|
964
|
+
* );
|
|
965
|
+
* ```
|
|
966
|
+
*/
|
|
967
|
+
declare function createTransformMigration<TNext>(version: number, key: string, transform: (value: unknown) => unknown, defaultValue: unknown): VersionMigration;
|
|
968
|
+
/**
|
|
969
|
+
* Validates that migrations are in correct sequential order.
|
|
970
|
+
*
|
|
971
|
+
* @throws If migrations have duplicate versions
|
|
972
|
+
*/
|
|
973
|
+
declare function validateMigrations(migrations: VersionMigration[]): void;
|
|
974
|
+
/**
|
|
975
|
+
* Gets migration info for debugging.
|
|
976
|
+
*/
|
|
977
|
+
declare function getMigrationInfo(migrations: VersionMigration[]): Array<{
|
|
978
|
+
version: number;
|
|
979
|
+
}>;
|
|
980
|
+
|
|
981
|
+
export { type AuthStatus, type AuthStoreState, type CreateStoreOptions, type MigrationFn, type StoreSelector, type ThemeState, type UIState, type VersionMigration, type VersionedPersistedState, type VersionedSettingsConfig, authStore, checkSettingsVersion, clearSettings, createAddFieldMigration, createMigration, createPersistedStore, createPrismStore, createRemoveFieldMigration, createRenameMigration, createSelectors, createSettingsValidator, createTransformMigration, createUIStore, createVersionedPersistOptions, createVersionedStorage, exportSettings, getMigrationInfo, importSettings, runMigrations, themeStore, uiStore, useAuthStore, useThemeStore, useUIStore, validateMigrations };
|