@idealyst/mcp-server 1.2.16 → 1.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data/components/Button.d.ts.map +1 -1
- package/dist/data/components/Button.js +14 -5
- package/dist/data/components/Button.js.map +1 -1
- package/dist/data/components/Dialog.js +1 -1
- package/dist/data/components/Progress.js +4 -4
- package/dist/data/components/RadioButton.js +1 -1
- package/dist/data/components/Select.js +1 -1
- package/dist/data/framework-guides.d.ts.map +1 -1
- package/dist/data/framework-guides.js +31 -19
- package/dist/data/framework-guides.js.map +1 -1
- package/dist/data/navigation-guides.d.ts.map +1 -1
- package/dist/data/navigation-guides.js +115 -48
- package/dist/data/navigation-guides.js.map +1 -1
- package/dist/data/packages.d.ts +39 -0
- package/dist/data/packages.d.ts.map +1 -0
- package/dist/data/packages.js +550 -0
- package/dist/data/packages.js.map +1 -0
- package/dist/data/storage-guides.d.ts +2 -0
- package/dist/data/storage-guides.d.ts.map +1 -0
- package/dist/data/storage-guides.js +418 -0
- package/dist/data/storage-guides.js.map +1 -0
- package/dist/index.js +314 -2
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
export const storageGuides = {
|
|
2
|
+
"idealyst://storage/overview": `# @idealyst/storage Overview
|
|
3
|
+
|
|
4
|
+
Cross-platform storage solution for React and React Native applications. Provides a consistent async API for persistent data storage.
|
|
5
|
+
|
|
6
|
+
## Features
|
|
7
|
+
|
|
8
|
+
- **Cross-Platform** - Works seamlessly on React Native and Web
|
|
9
|
+
- **Simple API** - Async/await based with consistent interface
|
|
10
|
+
- **React Native** - Uses MMKV for high-performance storage
|
|
11
|
+
- **Web** - Uses localStorage with proper error handling
|
|
12
|
+
- **TypeScript** - Full type safety and IntelliSense support
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
\`\`\`bash
|
|
17
|
+
yarn add @idealyst/storage
|
|
18
|
+
|
|
19
|
+
# React Native also needs:
|
|
20
|
+
yarn add react-native-mmkv
|
|
21
|
+
cd ios && pod install
|
|
22
|
+
\`\`\`
|
|
23
|
+
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
\`\`\`tsx
|
|
27
|
+
import { storage } from '@idealyst/storage';
|
|
28
|
+
|
|
29
|
+
// Store string data
|
|
30
|
+
await storage.setItem('token', 'abc123');
|
|
31
|
+
|
|
32
|
+
// Store objects (use JSON.stringify)
|
|
33
|
+
await storage.setItem('user', JSON.stringify({ name: 'John', id: 123 }));
|
|
34
|
+
|
|
35
|
+
// Retrieve string data
|
|
36
|
+
const token = await storage.getItem('token');
|
|
37
|
+
|
|
38
|
+
// Retrieve and parse objects
|
|
39
|
+
const userData = await storage.getItem('user');
|
|
40
|
+
const user = userData ? JSON.parse(userData) : null;
|
|
41
|
+
|
|
42
|
+
// Remove data
|
|
43
|
+
await storage.removeItem('token');
|
|
44
|
+
|
|
45
|
+
// Clear all data
|
|
46
|
+
await storage.clear();
|
|
47
|
+
|
|
48
|
+
// Get all keys
|
|
49
|
+
const keys = await storage.getAllKeys();
|
|
50
|
+
\`\`\`
|
|
51
|
+
|
|
52
|
+
## Import Options
|
|
53
|
+
|
|
54
|
+
\`\`\`tsx
|
|
55
|
+
// Named import (recommended)
|
|
56
|
+
import { storage } from '@idealyst/storage';
|
|
57
|
+
|
|
58
|
+
// Default import
|
|
59
|
+
import storage from '@idealyst/storage';
|
|
60
|
+
\`\`\`
|
|
61
|
+
|
|
62
|
+
## Platform Details
|
|
63
|
+
|
|
64
|
+
- **React Native**: Uses \`react-native-mmkv\` for high-performance storage
|
|
65
|
+
- **Web**: Uses browser \`localStorage\`
|
|
66
|
+
`,
|
|
67
|
+
"idealyst://storage/api": `# Storage API Reference
|
|
68
|
+
|
|
69
|
+
Complete API reference for @idealyst/storage.
|
|
70
|
+
|
|
71
|
+
## setItem
|
|
72
|
+
|
|
73
|
+
Store a string value with the given key.
|
|
74
|
+
|
|
75
|
+
\`\`\`tsx
|
|
76
|
+
await storage.setItem(key: string, value: string): Promise<void>
|
|
77
|
+
|
|
78
|
+
// Examples
|
|
79
|
+
await storage.setItem('token', 'abc123');
|
|
80
|
+
await storage.setItem('userId', '42');
|
|
81
|
+
|
|
82
|
+
// For objects, use JSON.stringify
|
|
83
|
+
await storage.setItem('user', JSON.stringify({ name: 'John', age: 30 }));
|
|
84
|
+
await storage.setItem('tags', JSON.stringify(['react', 'native']));
|
|
85
|
+
await storage.setItem('settings', JSON.stringify({ theme: 'dark', notifications: true }));
|
|
86
|
+
\`\`\`
|
|
87
|
+
|
|
88
|
+
## getItem
|
|
89
|
+
|
|
90
|
+
Retrieve a string value by key. Returns \`null\` if the key doesn't exist.
|
|
91
|
+
|
|
92
|
+
\`\`\`tsx
|
|
93
|
+
await storage.getItem(key: string): Promise<string | null>
|
|
94
|
+
|
|
95
|
+
// Examples
|
|
96
|
+
const token = await storage.getItem('token');
|
|
97
|
+
const userId = await storage.getItem('userId');
|
|
98
|
+
|
|
99
|
+
// For objects, parse the JSON
|
|
100
|
+
const userData = await storage.getItem('user');
|
|
101
|
+
const user = userData ? JSON.parse(userData) as User : null;
|
|
102
|
+
|
|
103
|
+
const tagsData = await storage.getItem('tags');
|
|
104
|
+
const tags = tagsData ? JSON.parse(tagsData) as string[] : [];
|
|
105
|
+
|
|
106
|
+
if (user) {
|
|
107
|
+
console.log(user.name);
|
|
108
|
+
}
|
|
109
|
+
\`\`\`
|
|
110
|
+
|
|
111
|
+
## removeItem
|
|
112
|
+
|
|
113
|
+
Remove a specific item from storage.
|
|
114
|
+
|
|
115
|
+
\`\`\`tsx
|
|
116
|
+
await storage.removeItem(key: string): Promise<void>
|
|
117
|
+
|
|
118
|
+
// Examples
|
|
119
|
+
await storage.removeItem('user');
|
|
120
|
+
await storage.removeItem('temporaryData');
|
|
121
|
+
\`\`\`
|
|
122
|
+
|
|
123
|
+
## clear
|
|
124
|
+
|
|
125
|
+
Remove all items from storage.
|
|
126
|
+
|
|
127
|
+
\`\`\`tsx
|
|
128
|
+
await storage.clear(): Promise<void>
|
|
129
|
+
\`\`\`
|
|
130
|
+
|
|
131
|
+
## getAllKeys
|
|
132
|
+
|
|
133
|
+
Returns all keys currently in storage.
|
|
134
|
+
|
|
135
|
+
\`\`\`tsx
|
|
136
|
+
await storage.getAllKeys(): Promise<string[]>
|
|
137
|
+
|
|
138
|
+
// Example
|
|
139
|
+
const keys = await storage.getAllKeys();
|
|
140
|
+
console.log('Stored keys:', keys); // ['user', 'settings', 'token']
|
|
141
|
+
\`\`\`
|
|
142
|
+
|
|
143
|
+
## Helper Pattern for Typed Storage
|
|
144
|
+
|
|
145
|
+
Create a typed wrapper for cleaner code:
|
|
146
|
+
|
|
147
|
+
\`\`\`tsx
|
|
148
|
+
import { storage } from '@idealyst/storage';
|
|
149
|
+
|
|
150
|
+
// Helper functions for typed storage
|
|
151
|
+
async function setObject<T>(key: string, value: T): Promise<void> {
|
|
152
|
+
await storage.setItem(key, JSON.stringify(value));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async function getObject<T>(key: string): Promise<T | null> {
|
|
156
|
+
const data = await storage.getItem(key);
|
|
157
|
+
return data ? JSON.parse(data) as T : null;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Usage
|
|
161
|
+
interface User {
|
|
162
|
+
id: number;
|
|
163
|
+
name: string;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
await setObject<User>('user', { id: 1, name: 'John' });
|
|
167
|
+
const user = await getObject<User>('user');
|
|
168
|
+
\`\`\`
|
|
169
|
+
`,
|
|
170
|
+
"idealyst://storage/examples": `# Storage Examples
|
|
171
|
+
|
|
172
|
+
Complete code examples for common @idealyst/storage patterns.
|
|
173
|
+
|
|
174
|
+
## User Session Management
|
|
175
|
+
|
|
176
|
+
\`\`\`tsx
|
|
177
|
+
import { storage } from '@idealyst/storage';
|
|
178
|
+
|
|
179
|
+
interface User {
|
|
180
|
+
id: number;
|
|
181
|
+
name: string;
|
|
182
|
+
email: string;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
class AuthService {
|
|
186
|
+
static async saveUserSession(user: User, token: string) {
|
|
187
|
+
await Promise.all([
|
|
188
|
+
storage.setItem('currentUser', JSON.stringify(user)),
|
|
189
|
+
storage.setItem('authToken', token),
|
|
190
|
+
storage.setItem('loginTime', new Date().toISOString()),
|
|
191
|
+
]);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
static async getUserSession() {
|
|
195
|
+
const userData = await storage.getItem('currentUser');
|
|
196
|
+
const token = await storage.getItem('authToken');
|
|
197
|
+
|
|
198
|
+
const user = userData ? JSON.parse(userData) as User : null;
|
|
199
|
+
return user && token ? { user, token } : null;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
static async clearSession() {
|
|
203
|
+
await Promise.all([
|
|
204
|
+
storage.removeItem('currentUser'),
|
|
205
|
+
storage.removeItem('authToken'),
|
|
206
|
+
storage.removeItem('loginTime'),
|
|
207
|
+
]);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
\`\`\`
|
|
211
|
+
|
|
212
|
+
## Settings Management
|
|
213
|
+
|
|
214
|
+
\`\`\`tsx
|
|
215
|
+
import { storage } from '@idealyst/storage';
|
|
216
|
+
|
|
217
|
+
interface AppSettings {
|
|
218
|
+
theme: 'light' | 'dark';
|
|
219
|
+
notifications: boolean;
|
|
220
|
+
language: string;
|
|
221
|
+
fontSize: number;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const defaultSettings: AppSettings = {
|
|
225
|
+
theme: 'light',
|
|
226
|
+
notifications: true,
|
|
227
|
+
language: 'en',
|
|
228
|
+
fontSize: 16,
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
class SettingsService {
|
|
232
|
+
static async getSettings(): Promise<AppSettings> {
|
|
233
|
+
const data = await storage.getItem('appSettings');
|
|
234
|
+
const stored = data ? JSON.parse(data) as AppSettings : null;
|
|
235
|
+
return stored ? { ...defaultSettings, ...stored } : defaultSettings;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
static async updateSettings(newSettings: Partial<AppSettings>) {
|
|
239
|
+
const current = await this.getSettings();
|
|
240
|
+
const updated = { ...current, ...newSettings };
|
|
241
|
+
await storage.setItem('appSettings', JSON.stringify(updated));
|
|
242
|
+
return updated;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
static async resetSettings() {
|
|
246
|
+
await storage.setItem('appSettings', JSON.stringify(defaultSettings));
|
|
247
|
+
return defaultSettings;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
\`\`\`
|
|
251
|
+
|
|
252
|
+
## Cache with Expiration
|
|
253
|
+
|
|
254
|
+
\`\`\`tsx
|
|
255
|
+
import { storage } from '@idealyst/storage';
|
|
256
|
+
|
|
257
|
+
interface CacheItem<T> {
|
|
258
|
+
data: T;
|
|
259
|
+
timestamp: number;
|
|
260
|
+
expiresIn: number; // milliseconds
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
class CacheService {
|
|
264
|
+
static async setCache<T>(key: string, data: T, expiresIn: number = 3600000) {
|
|
265
|
+
const cacheItem: CacheItem<T> = {
|
|
266
|
+
data,
|
|
267
|
+
timestamp: Date.now(),
|
|
268
|
+
expiresIn,
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
await storage.setItem(\`cache_\${key}\`, JSON.stringify(cacheItem));
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
static async getCache<T>(key: string): Promise<T | null> {
|
|
275
|
+
const data = await storage.getItem(\`cache_\${key}\`);
|
|
276
|
+
if (!data) return null;
|
|
277
|
+
|
|
278
|
+
const cacheItem = JSON.parse(data) as CacheItem<T>;
|
|
279
|
+
const isExpired = Date.now() - cacheItem.timestamp > cacheItem.expiresIn;
|
|
280
|
+
|
|
281
|
+
if (isExpired) {
|
|
282
|
+
await storage.removeItem(\`cache_\${key}\`);
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return cacheItem.data;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
static async clearExpiredCache() {
|
|
290
|
+
const keys = await storage.getAllKeys();
|
|
291
|
+
const cacheKeys = keys.filter(key => key.startsWith('cache_'));
|
|
292
|
+
|
|
293
|
+
for (const key of cacheKeys) {
|
|
294
|
+
const data = await storage.getItem(key);
|
|
295
|
+
if (data) {
|
|
296
|
+
const cacheItem = JSON.parse(data) as CacheItem<unknown>;
|
|
297
|
+
const isExpired = Date.now() - cacheItem.timestamp > cacheItem.expiresIn;
|
|
298
|
+
if (isExpired) {
|
|
299
|
+
await storage.removeItem(key);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
\`\`\`
|
|
306
|
+
|
|
307
|
+
## Persisting Language Preference
|
|
308
|
+
|
|
309
|
+
\`\`\`tsx
|
|
310
|
+
import { storage } from '@idealyst/storage';
|
|
311
|
+
import { useLanguage } from '@idealyst/translate';
|
|
312
|
+
import { useEffect } from 'react';
|
|
313
|
+
|
|
314
|
+
const LANGUAGE_KEY = 'app_language';
|
|
315
|
+
|
|
316
|
+
export function usePersistedLanguage() {
|
|
317
|
+
const { language, setLanguage } = useLanguage();
|
|
318
|
+
|
|
319
|
+
// Load saved language on mount
|
|
320
|
+
useEffect(() => {
|
|
321
|
+
storage.getItem(LANGUAGE_KEY).then((saved) => {
|
|
322
|
+
if (saved) setLanguage(saved);
|
|
323
|
+
});
|
|
324
|
+
}, []);
|
|
325
|
+
|
|
326
|
+
// Save language when changed
|
|
327
|
+
useEffect(() => {
|
|
328
|
+
storage.setItem(LANGUAGE_KEY, language);
|
|
329
|
+
}, [language]);
|
|
330
|
+
|
|
331
|
+
return { language, setLanguage };
|
|
332
|
+
}
|
|
333
|
+
\`\`\`
|
|
334
|
+
|
|
335
|
+
## React Hook for Storage
|
|
336
|
+
|
|
337
|
+
\`\`\`tsx
|
|
338
|
+
import { storage } from '@idealyst/storage';
|
|
339
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
340
|
+
|
|
341
|
+
export function useStorage<T>(key: string, initialValue: T) {
|
|
342
|
+
const [value, setValue] = useState<T>(initialValue);
|
|
343
|
+
const [loading, setLoading] = useState(true);
|
|
344
|
+
|
|
345
|
+
// Load value on mount
|
|
346
|
+
useEffect(() => {
|
|
347
|
+
storage.getItem(key).then((stored) => {
|
|
348
|
+
if (stored !== null) {
|
|
349
|
+
setValue(JSON.parse(stored) as T);
|
|
350
|
+
}
|
|
351
|
+
setLoading(false);
|
|
352
|
+
});
|
|
353
|
+
}, [key]);
|
|
354
|
+
|
|
355
|
+
// Update storage when value changes
|
|
356
|
+
const updateValue = useCallback(async (newValue: T) => {
|
|
357
|
+
setValue(newValue);
|
|
358
|
+
await storage.setItem(key, JSON.stringify(newValue));
|
|
359
|
+
}, [key]);
|
|
360
|
+
|
|
361
|
+
// Remove from storage
|
|
362
|
+
const removeValue = useCallback(async () => {
|
|
363
|
+
setValue(initialValue);
|
|
364
|
+
await storage.removeItem(key);
|
|
365
|
+
}, [key, initialValue]);
|
|
366
|
+
|
|
367
|
+
return { value, setValue: updateValue, removeValue, loading };
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Usage
|
|
371
|
+
function MyComponent() {
|
|
372
|
+
const { value: theme, setValue: setTheme, loading } = useStorage('theme', 'light');
|
|
373
|
+
|
|
374
|
+
if (loading) return <ActivityIndicator />;
|
|
375
|
+
|
|
376
|
+
return (
|
|
377
|
+
<Button onPress={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
|
|
378
|
+
Toggle Theme
|
|
379
|
+
</Button>
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
\`\`\`
|
|
383
|
+
|
|
384
|
+
## Error Handling
|
|
385
|
+
|
|
386
|
+
\`\`\`tsx
|
|
387
|
+
import { storage } from '@idealyst/storage';
|
|
388
|
+
|
|
389
|
+
async function safeStorageOperation() {
|
|
390
|
+
try {
|
|
391
|
+
await storage.setItem('data', JSON.stringify(largeObject));
|
|
392
|
+
} catch (error) {
|
|
393
|
+
console.error('Storage failed:', error);
|
|
394
|
+
// Handle storage quota exceeded or other errors
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Or with null checking
|
|
398
|
+
const result = await storage.getItem('data');
|
|
399
|
+
if (result === null) {
|
|
400
|
+
// Key doesn't exist or retrieval failed
|
|
401
|
+
console.log('No data found');
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
\`\`\`
|
|
405
|
+
|
|
406
|
+
## Best Practices
|
|
407
|
+
|
|
408
|
+
1. **Use JSON.stringify/parse** - Storage only accepts strings, so serialize objects
|
|
409
|
+
2. **Handle Nulls** - Always check for null returns from \`getItem\`
|
|
410
|
+
3. **Batch Operations** - Use \`Promise.all\` for multiple storage operations
|
|
411
|
+
4. **Error Handling** - Wrap storage operations in try-catch blocks for critical data
|
|
412
|
+
5. **Key Naming** - Use consistent, descriptive key names
|
|
413
|
+
6. **Data Size** - Keep stored objects reasonably sized
|
|
414
|
+
7. **Cleanup** - Periodically clean up unused data
|
|
415
|
+
8. **Type Safety** - Create typed wrapper functions for better TypeScript support
|
|
416
|
+
`,
|
|
417
|
+
};
|
|
418
|
+
//# sourceMappingURL=storage-guides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-guides.js","sourceRoot":"","sources":["../../src/data/storage-guides.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,6BAA6B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEhC;IAEC,wBAAwB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsG3B;IAEC,6BAA6B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsPhC;CACA,CAAC"}
|