@miurajs/miura-data-flow 0.0.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +187 -16
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/src/global-state.d.ts +79 -0
- package/dist/src/global-state.d.ts.map +1 -0
- package/dist/src/global-state.js +111 -0
- package/dist/src/global-state.js.map +1 -0
- package/dist/src/middleware.d.ts +38 -0
- package/dist/src/middleware.d.ts.map +1 -0
- package/dist/src/middleware.js +143 -0
- package/dist/src/middleware.js.map +1 -0
- package/{src/miura-data-flow.ts → dist/src/miura-data-flow.d.ts} +38 -67
- package/dist/src/miura-data-flow.d.ts.map +1 -0
- package/dist/src/miura-data-flow.js +96 -0
- package/dist/src/miura-data-flow.js.map +1 -0
- package/{src/providers/index.ts → dist/src/providers/index.d.ts} +1 -5
- package/dist/src/providers/index.d.ts.map +1 -0
- package/dist/src/providers/index.js +11 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/providers/indexed-db-provider.d.ts +9 -0
- package/dist/src/providers/indexed-db-provider.d.ts.map +1 -0
- package/dist/src/providers/indexed-db-provider.js +35 -0
- package/dist/src/providers/indexed-db-provider.js.map +1 -0
- package/dist/src/providers/local-storage-provider.d.ts +7 -0
- package/dist/src/providers/local-storage-provider.d.ts.map +1 -0
- package/dist/src/providers/local-storage-provider.js +29 -0
- package/dist/src/providers/local-storage-provider.js.map +1 -0
- package/dist/src/providers/provider-manager.d.ts +4 -0
- package/dist/src/providers/provider-manager.d.ts.map +1 -0
- package/dist/src/providers/provider-manager.js +15 -0
- package/dist/src/providers/provider-manager.js.map +1 -0
- package/dist/src/providers/provider.d.ts +12 -0
- package/dist/src/providers/provider.d.ts.map +1 -0
- package/dist/src/providers/provider.js +2 -0
- package/dist/src/providers/provider.js.map +1 -0
- package/dist/src/providers/rest-provider.d.ts +86 -0
- package/dist/src/providers/rest-provider.d.ts.map +1 -0
- package/dist/src/providers/rest-provider.js +210 -0
- package/dist/src/providers/rest-provider.js.map +1 -0
- package/dist/src/providers/websockets-provider.d.ts +9 -0
- package/dist/src/providers/websockets-provider.d.ts.map +1 -0
- package/dist/src/providers/websockets-provider.js +43 -0
- package/dist/src/providers/websockets-provider.js.map +1 -0
- package/dist/src/store.d.ts +94 -0
- package/dist/src/store.d.ts.map +1 -0
- package/dist/src/store.js +169 -0
- package/dist/src/store.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +34 -7
- package/src/providers/graphql-provider.ts +13 -7
- package/index.ts +0 -1
- package/src/global-state.ts +0 -158
- package/src/middleware.ts +0 -162
- package/src/providers/indexed-db-provider.ts +0 -48
- package/src/providers/local-storage-provider.ts +0 -36
- package/src/providers/provider-manager.ts +0 -21
- package/src/providers/provider.ts +0 -23
- package/src/providers/rest-provider.ts +0 -351
- package/src/providers/websockets-provider.ts +0 -54
- package/src/store.ts +0 -237
- package/stories/data-flow-demo.stories.ts +0 -640
- package/tsconfig.json +0 -17
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# miura Data Flow
|
|
2
2
|
|
|
3
|
-
Modern, reactive state management for miura applications. Combines the best of Redux, Zustand, and modern patterns with zero boilerplate and maximum performance.
|
|
3
|
+
Modern, reactive state management for miura applications. Combines the best of Redux, Zustand, and modern patterns with zero boilerplate and maximum performance. **Now with optional dependencies for optimal bundle size!**
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
@@ -12,11 +12,26 @@ Modern, reactive state management for miura applications. Combines the best of R
|
|
|
12
12
|
- **🛠️ DevTools Support** - Redux DevTools integration
|
|
13
13
|
- **📝 TypeScript First** - Full type safety and IntelliSense
|
|
14
14
|
- **⚡ Performance Optimized** - Efficient subscriptions and updates
|
|
15
|
+
- **📦 Optional Dependencies** - Only install what you need for optimal bundle size
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Core package (includes built-in providers)
|
|
21
|
+
npm install @miurajs/miura-data-flow
|
|
22
|
+
|
|
23
|
+
# Optional providers (install as needed)
|
|
24
|
+
npm install graphql-request # For GraphQL provider
|
|
25
|
+
npm install @aws-sdk/client-s3 # For AWS S3 provider
|
|
26
|
+
npm install firebase # For Firebase provider
|
|
27
|
+
npm install @supabase/supabase-js # For Supabase provider
|
|
28
|
+
npm install grpc-web # For gRPC-Web provider
|
|
29
|
+
```
|
|
15
30
|
|
|
16
31
|
## Quick Start
|
|
17
32
|
|
|
18
33
|
```typescript
|
|
19
|
-
import { Store, globalState, createLoggerMiddleware } from '@
|
|
34
|
+
import { Store, globalState, createLoggerMiddleware } from '@miurajs/miura-data-flow';
|
|
20
35
|
|
|
21
36
|
// Create a store
|
|
22
37
|
const store = new Store({ count: 0, user: null });
|
|
@@ -47,7 +62,7 @@ await store.dispatch('setUser', { id: '1', name: 'John' });
|
|
|
47
62
|
The main state container that manages your application state.
|
|
48
63
|
|
|
49
64
|
```typescript
|
|
50
|
-
import { Store } from '@
|
|
65
|
+
import { Store } from '@miurajs/miura-data-flow';
|
|
51
66
|
|
|
52
67
|
interface AppState {
|
|
53
68
|
count: number;
|
|
@@ -118,7 +133,7 @@ const unsubscribeUser = store.subscribe(
|
|
|
118
133
|
#### Logger Middleware
|
|
119
134
|
|
|
120
135
|
```typescript
|
|
121
|
-
import { createLoggerMiddleware } from '@
|
|
136
|
+
import { createLoggerMiddleware } from '@miurajs/miura-data-flow';
|
|
122
137
|
|
|
123
138
|
store.use(createLoggerMiddleware());
|
|
124
139
|
// Logs all actions and state changes to console
|
|
@@ -127,7 +142,7 @@ store.use(createLoggerMiddleware());
|
|
|
127
142
|
#### Persistence Middleware
|
|
128
143
|
|
|
129
144
|
```typescript
|
|
130
|
-
import { createPersistenceMiddleware } from '@
|
|
145
|
+
import { createPersistenceMiddleware } from '@miurajs/miura-data-flow';
|
|
131
146
|
|
|
132
147
|
store.use(createPersistenceMiddleware(['user', 'settings']));
|
|
133
148
|
// Automatically saves/loads specified properties to localStorage
|
|
@@ -136,7 +151,7 @@ store.use(createPersistenceMiddleware(['user', 'settings']));
|
|
|
136
151
|
#### API Middleware
|
|
137
152
|
|
|
138
153
|
```typescript
|
|
139
|
-
import { createApiMiddleware } from '@
|
|
154
|
+
import { createApiMiddleware } from '@miurajs/miura-data-flow';
|
|
140
155
|
|
|
141
156
|
store.use(createApiMiddleware({
|
|
142
157
|
baseURL: 'https://api.example.com',
|
|
@@ -159,7 +174,7 @@ await store.dispatch('api_createUser', { method: 'POST', data: userData });
|
|
|
159
174
|
#### Cache Middleware
|
|
160
175
|
|
|
161
176
|
```typescript
|
|
162
|
-
import { createCacheMiddleware } from '@
|
|
177
|
+
import { createCacheMiddleware } from '@miurajs/miura-data-flow';
|
|
163
178
|
|
|
164
179
|
store.use(createCacheMiddleware(5 * 60 * 1000)); // 5 minutes TTL
|
|
165
180
|
// Caches API responses for 5 minutes
|
|
@@ -168,7 +183,7 @@ store.use(createCacheMiddleware(5 * 60 * 1000)); // 5 minutes TTL
|
|
|
168
183
|
#### DevTools Middleware
|
|
169
184
|
|
|
170
185
|
```typescript
|
|
171
|
-
import { createDevToolsMiddleware } from '@
|
|
186
|
+
import { createDevToolsMiddleware } from '@miurajs/miura-data-flow';
|
|
172
187
|
|
|
173
188
|
store.use(createDevToolsMiddleware('MyApp'));
|
|
174
189
|
// Enables Redux DevTools integration
|
|
@@ -194,7 +209,7 @@ Redux DevTools is a powerful browser extension that provides real-time debugging
|
|
|
194
209
|
|
|
195
210
|
2. **Enable in Your Code:**
|
|
196
211
|
```typescript
|
|
197
|
-
import { createDevToolsMiddleware } from '@
|
|
212
|
+
import { createDevToolsMiddleware } from '@miurajs/miura-data-flow';
|
|
198
213
|
|
|
199
214
|
store.use(createDevToolsMiddleware('MyApp'));
|
|
200
215
|
```
|
|
@@ -222,7 +237,7 @@ State After: { count: 1, user: { id: '1', name: 'John' } }
|
|
|
222
237
|
#### Complete Example:
|
|
223
238
|
|
|
224
239
|
```typescript
|
|
225
|
-
import { Store, createDevToolsMiddleware } from '@
|
|
240
|
+
import { Store, createDevToolsMiddleware } from '@miurajs/miura-data-flow';
|
|
226
241
|
|
|
227
242
|
// Create store
|
|
228
243
|
const store = new Store({
|
|
@@ -339,7 +354,7 @@ See the [examples directory](./examples) for complete working examples.
|
|
|
339
354
|
### Custom Middleware
|
|
340
355
|
|
|
341
356
|
```typescript
|
|
342
|
-
import { StoreMiddleware } from '@
|
|
357
|
+
import { StoreMiddleware } from '@miurajs/miura-data-flow';
|
|
343
358
|
|
|
344
359
|
const analyticsMiddleware: StoreMiddleware = {
|
|
345
360
|
name: 'analytics',
|
|
@@ -365,7 +380,7 @@ store.use(analyticsMiddleware);
|
|
|
365
380
|
### Using Global State
|
|
366
381
|
|
|
367
382
|
```typescript
|
|
368
|
-
import { globalState } from '@
|
|
383
|
+
import { globalState } from '@miurajs/miura-data-flow';
|
|
369
384
|
|
|
370
385
|
// Set global properties
|
|
371
386
|
globalState.set('theme', 'dark');
|
|
@@ -384,8 +399,8 @@ const unsubscribe = globalState.subscribeTo('my-component', 'theme', (theme) =>
|
|
|
384
399
|
### Global State in Components
|
|
385
400
|
|
|
386
401
|
```typescript
|
|
387
|
-
import { MiuraElement, html } from '@
|
|
388
|
-
import { globalState } from '@
|
|
402
|
+
import { MiuraElement, html } from '@miurajs/miura-element';
|
|
403
|
+
import { globalState } from '@miurajs/miura-data-flow';
|
|
389
404
|
|
|
390
405
|
class ThemeToggle extends MiuraElement {
|
|
391
406
|
static properties = {
|
|
@@ -426,12 +441,168 @@ class ThemeToggle extends MiuraElement {
|
|
|
426
441
|
}
|
|
427
442
|
```
|
|
428
443
|
|
|
444
|
+
## Data Providers
|
|
445
|
+
|
|
446
|
+
miura Data Flow includes a flexible provider system for connecting to various data sources.
|
|
447
|
+
|
|
448
|
+
### Built-in Providers (Always Available)
|
|
449
|
+
|
|
450
|
+
These providers are included by default and have no external dependencies:
|
|
451
|
+
|
|
452
|
+
```typescript
|
|
453
|
+
import {
|
|
454
|
+
RestProviderFactory,
|
|
455
|
+
LocalStorageProviderFactory,
|
|
456
|
+
IndexedDBProviderFactory,
|
|
457
|
+
WebSocketProviderFactory
|
|
458
|
+
} from '@miurajs/miura-data-flow';
|
|
459
|
+
|
|
460
|
+
// Register and use built-in providers
|
|
461
|
+
import { registerProvider, createProvider } from '@miurajs/miura-data-flow';
|
|
462
|
+
|
|
463
|
+
// Register REST API provider
|
|
464
|
+
registerProvider('api', new RestProviderFactory());
|
|
465
|
+
|
|
466
|
+
// Create provider instance
|
|
467
|
+
const apiProvider = createProvider('api', {
|
|
468
|
+
baseUrl: 'https://api.example.com'
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
// Use the provider
|
|
472
|
+
const users = await apiProvider.get('users');
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
### Optional Providers (Require Additional Dependencies)
|
|
476
|
+
|
|
477
|
+
These providers are available as separate imports to keep the core package lightweight:
|
|
478
|
+
|
|
479
|
+
#### GraphQL Provider
|
|
480
|
+
|
|
481
|
+
```bash
|
|
482
|
+
# Install the optional dependency
|
|
483
|
+
npm install graphql-request
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
```typescript
|
|
487
|
+
// Import the GraphQL provider separately
|
|
488
|
+
import { GraphQLProviderFactory } from '@miurajs/miura-data-flow/providers/graphql';
|
|
489
|
+
|
|
490
|
+
// Register and use
|
|
491
|
+
registerProvider('graphql', new GraphQLProviderFactory());
|
|
492
|
+
const graphqlProvider = createProvider('graphql', {
|
|
493
|
+
endpoint: 'https://api.example.com/graphql'
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
const result = await graphqlProvider.query({
|
|
497
|
+
query: 'query { users { id name } }'
|
|
498
|
+
});
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
#### AWS S3 Provider
|
|
502
|
+
|
|
503
|
+
```bash
|
|
504
|
+
# Install the optional dependency
|
|
505
|
+
npm install @aws-sdk/client-s3
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
```typescript
|
|
509
|
+
// Import the S3 provider separately
|
|
510
|
+
import { S3ProviderFactory } from '@miurajs/miura-data-flow/providers/s3';
|
|
511
|
+
|
|
512
|
+
// Register and use
|
|
513
|
+
registerProvider('s3', new S3ProviderFactory());
|
|
514
|
+
const s3Provider = createProvider('s3', {
|
|
515
|
+
region: 'us-east-1',
|
|
516
|
+
bucket: 'my-bucket'
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
const data = await s3Provider.get('file.json');
|
|
520
|
+
await s3Provider.put('file.json', jsonData);
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
#### Firebase Provider
|
|
524
|
+
|
|
525
|
+
```bash
|
|
526
|
+
# Install the optional dependency
|
|
527
|
+
npm install firebase
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
```typescript
|
|
531
|
+
// Import the Firebase provider separately
|
|
532
|
+
import { FirebaseProviderFactory } from '@miurajs/miura-data-flow/providers/firebase';
|
|
533
|
+
|
|
534
|
+
// Register and use
|
|
535
|
+
registerProvider('firebase', new FirebaseProviderFactory());
|
|
536
|
+
const firebaseProvider = createProvider('firebase', {
|
|
537
|
+
apiKey: 'your-api-key',
|
|
538
|
+
authDomain: 'your-project.firebaseapp.com',
|
|
539
|
+
projectId: 'your-project-id'
|
|
540
|
+
});
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
#### Supabase Provider
|
|
544
|
+
|
|
545
|
+
```bash
|
|
546
|
+
# Install the optional dependency
|
|
547
|
+
npm install @supabase/supabase-js
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
```typescript
|
|
551
|
+
// Import the Supabase provider separately
|
|
552
|
+
import { SupabaseProviderFactory } from '@miurajs/miura-data-flow/providers/supabase';
|
|
553
|
+
|
|
554
|
+
// Register and use
|
|
555
|
+
registerProvider('supabase', new SupabaseProviderFactory());
|
|
556
|
+
const supabaseProvider = createProvider('supabase', {
|
|
557
|
+
url: 'https://your-project.supabase.co',
|
|
558
|
+
anonKey: 'your-anon-key'
|
|
559
|
+
});
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
#### gRPC-Web Provider
|
|
563
|
+
|
|
564
|
+
```bash
|
|
565
|
+
# Install the optional dependency
|
|
566
|
+
npm install grpc-web
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
```typescript
|
|
570
|
+
// Import the gRPC-Web provider separately
|
|
571
|
+
import { GrpcWebProviderFactory } from '@miurajs/miura-data-flow/providers/grpc-web';
|
|
572
|
+
|
|
573
|
+
// Register and use
|
|
574
|
+
registerProvider('grpc', new GrpcWebProviderFactory());
|
|
575
|
+
const grpcProvider = createProvider('grpc', {
|
|
576
|
+
host: 'localhost:8080',
|
|
577
|
+
protoPath: './service.proto'
|
|
578
|
+
});
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
### Why This Structure?
|
|
582
|
+
|
|
583
|
+
1. **Bundle Size Optimization** - Only include providers you actually use
|
|
584
|
+
2. **Dependency Management** - Avoid forcing installation of large libraries
|
|
585
|
+
3. **Tree Shaking** - Better optimization for production builds
|
|
586
|
+
4. **Flexibility** - Use only what you need, when you need it
|
|
587
|
+
|
|
588
|
+
### Provider Usage in Middleware
|
|
589
|
+
|
|
590
|
+
```typescript
|
|
591
|
+
import { createApiMiddleware } from '@miurajs/miura-data-flow';
|
|
592
|
+
|
|
593
|
+
// Use any registered provider in middleware
|
|
594
|
+
store.use(createApiMiddleware({
|
|
595
|
+
provider: 's3', // Use the S3 provider we registered
|
|
596
|
+
bucket: 'my-app-data'
|
|
597
|
+
}));
|
|
598
|
+
```
|
|
599
|
+
|
|
429
600
|
## Integration with miura Framework
|
|
430
601
|
|
|
431
602
|
### Framework Setup
|
|
432
603
|
|
|
433
604
|
```typescript
|
|
434
|
-
import { Store, createApiMiddleware, createCacheMiddleware } from '@
|
|
605
|
+
import { Store, createApiMiddleware, createCacheMiddleware } from '@miurajs/miura-data-flow';
|
|
435
606
|
|
|
436
607
|
class miuraFramework {
|
|
437
608
|
private store: Store;
|
|
@@ -548,7 +719,7 @@ class MyComponent {
|
|
|
548
719
|
### Enable Debug Logging
|
|
549
720
|
|
|
550
721
|
```typescript
|
|
551
|
-
import { enableDebug } from '@
|
|
722
|
+
import { enableDebug } from '@miurajs/miura-render';
|
|
552
723
|
|
|
553
724
|
enableDebug({
|
|
554
725
|
element: true, // Shows data flow logs
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Store, StoreState, StoreActions } from './store';
|
|
2
|
+
/**
|
|
3
|
+
* Global state interface
|
|
4
|
+
*/
|
|
5
|
+
export interface GlobalState extends StoreState {
|
|
6
|
+
user?: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
email: string;
|
|
10
|
+
};
|
|
11
|
+
theme?: 'light' | 'dark';
|
|
12
|
+
language?: string;
|
|
13
|
+
notifications?: Array<{
|
|
14
|
+
id: string;
|
|
15
|
+
message: string;
|
|
16
|
+
type: 'info' | 'success' | 'warning' | 'error';
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Global State Manager
|
|
21
|
+
* Manages application-wide state using the Store system
|
|
22
|
+
*/
|
|
23
|
+
export declare class GlobalStateManager {
|
|
24
|
+
private static instance;
|
|
25
|
+
private store;
|
|
26
|
+
private componentSubscriptions;
|
|
27
|
+
private constructor();
|
|
28
|
+
static getInstance(): GlobalStateManager;
|
|
29
|
+
/**
|
|
30
|
+
* Get the global store
|
|
31
|
+
*/
|
|
32
|
+
getStore(): Store<GlobalState>;
|
|
33
|
+
/**
|
|
34
|
+
* Get a global property
|
|
35
|
+
*/
|
|
36
|
+
get<K extends keyof GlobalState>(key: K): GlobalState[K];
|
|
37
|
+
/**
|
|
38
|
+
* Set a global property
|
|
39
|
+
*/
|
|
40
|
+
set<K extends keyof GlobalState>(key: K, value: GlobalState[K]): void;
|
|
41
|
+
/**
|
|
42
|
+
* Subscribe to global state changes
|
|
43
|
+
*/
|
|
44
|
+
subscribe(componentId: string, properties: (keyof GlobalState)[], callback: (state: GlobalState, prevState: GlobalState) => void): () => void;
|
|
45
|
+
/**
|
|
46
|
+
* Subscribe to a specific global property
|
|
47
|
+
*/
|
|
48
|
+
subscribeTo<K extends keyof GlobalState>(componentId: string, key: K, callback: (value: GlobalState[K], prevValue: GlobalState[K]) => void): () => void;
|
|
49
|
+
/**
|
|
50
|
+
* Unsubscribe component from all global state
|
|
51
|
+
*/
|
|
52
|
+
unsubscribe(componentId: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Define global actions
|
|
55
|
+
*/
|
|
56
|
+
defineActions(actions: StoreActions<GlobalState>): void;
|
|
57
|
+
/**
|
|
58
|
+
* Dispatch a global action
|
|
59
|
+
*/
|
|
60
|
+
dispatch(action: string, ...args: unknown[]): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Add middleware to global store
|
|
63
|
+
*/
|
|
64
|
+
use(middleware: any): void;
|
|
65
|
+
/**
|
|
66
|
+
* Get debug information
|
|
67
|
+
*/
|
|
68
|
+
getDebugInfo(): {
|
|
69
|
+
componentSubscriptions: {
|
|
70
|
+
[k: string]: string[];
|
|
71
|
+
};
|
|
72
|
+
state: GlobalState;
|
|
73
|
+
actions: string[];
|
|
74
|
+
subscribers: number;
|
|
75
|
+
middlewares: string[];
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export declare const globalState: GlobalStateManager;
|
|
79
|
+
//# sourceMappingURL=global-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-state.d.ts","sourceRoot":"","sources":["../../src/global-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG1D;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,UAAU;IAE7C,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,KAAK,CAAC;QACpB,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;KAChD,CAAC,CAAC;CACJ;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,sBAAsB,CAAkC;IAEhE,OAAO;IAQP,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAOxC;;OAEG;IACH,QAAQ,IAAI,KAAK,CAAC,WAAW,CAAC;IAI9B;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAIxD;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAIrE;;OAEG;IACH,SAAS,CACP,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,CAAC,MAAM,WAAW,CAAC,EAAE,EACjC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,KAAK,IAAI,GAC7D,MAAM,IAAI;IAsBb;;OAEG;IACH,WAAW,CAAC,CAAC,SAAS,MAAM,WAAW,EACrC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,CAAC,EACN,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GACnE,MAAM,IAAI;IAQb;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAKtC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,IAAI;IAIvD;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjE;;OAEG;IACH,GAAG,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI;IAI1B;;OAEG;IACH,YAAY;;;;;;;;;CAWb;AAGD,eAAO,MAAM,WAAW,oBAAmC,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Store } from './store';
|
|
2
|
+
import { debugLog } from '@miurajs/miura-debugger';
|
|
3
|
+
/**
|
|
4
|
+
* Global State Manager
|
|
5
|
+
* Manages application-wide state using the Store system
|
|
6
|
+
*/
|
|
7
|
+
export class GlobalStateManager {
|
|
8
|
+
static instance;
|
|
9
|
+
store;
|
|
10
|
+
componentSubscriptions = new Map();
|
|
11
|
+
constructor() {
|
|
12
|
+
this.store = new Store({
|
|
13
|
+
theme: 'light',
|
|
14
|
+
language: 'en',
|
|
15
|
+
notifications: []
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
static getInstance() {
|
|
19
|
+
if (!GlobalStateManager.instance) {
|
|
20
|
+
GlobalStateManager.instance = new GlobalStateManager();
|
|
21
|
+
}
|
|
22
|
+
return GlobalStateManager.instance;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get the global store
|
|
26
|
+
*/
|
|
27
|
+
getStore() {
|
|
28
|
+
return this.store;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get a global property
|
|
32
|
+
*/
|
|
33
|
+
get(key) {
|
|
34
|
+
return this.store.get(key);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Set a global property
|
|
38
|
+
*/
|
|
39
|
+
set(key, value) {
|
|
40
|
+
this.store.setState({ [key]: value });
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Subscribe to global state changes
|
|
44
|
+
*/
|
|
45
|
+
subscribe(componentId, properties, callback) {
|
|
46
|
+
// Track component subscriptions
|
|
47
|
+
if (!this.componentSubscriptions.has(componentId)) {
|
|
48
|
+
this.componentSubscriptions.set(componentId, new Set());
|
|
49
|
+
}
|
|
50
|
+
this.componentSubscriptions.get(componentId).add(properties.join(','));
|
|
51
|
+
debugLog('element', 'Subscribed to global state', { componentId, properties });
|
|
52
|
+
// Subscribe to store with selector
|
|
53
|
+
return this.store.subscribe(callback, (state) => {
|
|
54
|
+
const selected = {};
|
|
55
|
+
properties.forEach(prop => {
|
|
56
|
+
selected[prop] = state[prop];
|
|
57
|
+
});
|
|
58
|
+
return selected;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Subscribe to a specific global property
|
|
63
|
+
*/
|
|
64
|
+
subscribeTo(componentId, key, callback) {
|
|
65
|
+
return this.subscribe(componentId, [key], (state, prevState) => {
|
|
66
|
+
if (state[key] !== prevState[key]) {
|
|
67
|
+
callback(state[key], prevState[key]);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Unsubscribe component from all global state
|
|
73
|
+
*/
|
|
74
|
+
unsubscribe(componentId) {
|
|
75
|
+
this.componentSubscriptions.delete(componentId);
|
|
76
|
+
debugLog('element', 'Unsubscribed from global state', { componentId });
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Define global actions
|
|
80
|
+
*/
|
|
81
|
+
defineActions(actions) {
|
|
82
|
+
this.store.defineActions(actions);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Dispatch a global action
|
|
86
|
+
*/
|
|
87
|
+
async dispatch(action, ...args) {
|
|
88
|
+
await this.store.dispatch(action, ...args);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Add middleware to global store
|
|
92
|
+
*/
|
|
93
|
+
use(middleware) {
|
|
94
|
+
this.store.use(middleware);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get debug information
|
|
98
|
+
*/
|
|
99
|
+
getDebugInfo() {
|
|
100
|
+
return {
|
|
101
|
+
...this.store.getDebugInfo(),
|
|
102
|
+
componentSubscriptions: Object.fromEntries(Array.from(this.componentSubscriptions.entries()).map(([id, props]) => [
|
|
103
|
+
id,
|
|
104
|
+
Array.from(props)
|
|
105
|
+
]))
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Export singleton instance
|
|
110
|
+
export const globalState = GlobalStateManager.getInstance();
|
|
111
|
+
//# sourceMappingURL=global-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-state.js","sourceRoot":"","sources":["../../src/global-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { StoreMiddleware, StoreState } from './store';
|
|
2
|
+
/**
|
|
3
|
+
* Logger middleware for debugging
|
|
4
|
+
*/
|
|
5
|
+
export declare function createLoggerMiddleware(): StoreMiddleware;
|
|
6
|
+
/**
|
|
7
|
+
* Persistence middleware for localStorage
|
|
8
|
+
*/
|
|
9
|
+
export declare function createPersistenceMiddleware(keys: string[], storageKey?: string): StoreMiddleware;
|
|
10
|
+
/**
|
|
11
|
+
* Loads persisted state from localStorage.
|
|
12
|
+
* Call this to get initial state when creating a store:
|
|
13
|
+
* const persisted = loadPersistedState(['user', 'theme']);
|
|
14
|
+
* const store = new Store({ ...defaults, ...persisted });
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadPersistedState(keys: string[], storageKey?: string): Partial<StoreState>;
|
|
17
|
+
/**
|
|
18
|
+
* API middleware for automatic API calls
|
|
19
|
+
*/
|
|
20
|
+
export declare function createApiMiddleware(apiConfig: {
|
|
21
|
+
baseURL: string;
|
|
22
|
+
headers?: Record<string, string>;
|
|
23
|
+
timeout?: number;
|
|
24
|
+
}): StoreMiddleware & {
|
|
25
|
+
fetch: (endpoint: string, options?: {
|
|
26
|
+
method?: string;
|
|
27
|
+
data?: unknown;
|
|
28
|
+
}) => Promise<unknown>;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Cache middleware for API responses
|
|
32
|
+
*/
|
|
33
|
+
export declare function createCacheMiddleware(ttl?: number): StoreMiddleware;
|
|
34
|
+
/**
|
|
35
|
+
* DevTools middleware for Redux DevTools integration
|
|
36
|
+
*/
|
|
37
|
+
export declare function createDevToolsMiddleware(storeName?: string): StoreMiddleware;
|
|
38
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEtD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,eAAe,CAkBxD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,SAAgB,GAAG,eAAe,CAkBvG;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,SAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAiBlG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,eAAe,GAAG;IAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CA0BrH;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,SAAgB,GAAG,eAAe,CAgC1E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,SAAe,GAAG,eAAe,CAalF"}
|