@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.
Files changed (64) hide show
  1. package/README.md +187 -16
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/global-state.d.ts +79 -0
  7. package/dist/src/global-state.d.ts.map +1 -0
  8. package/dist/src/global-state.js +111 -0
  9. package/dist/src/global-state.js.map +1 -0
  10. package/dist/src/middleware.d.ts +38 -0
  11. package/dist/src/middleware.d.ts.map +1 -0
  12. package/dist/src/middleware.js +143 -0
  13. package/dist/src/middleware.js.map +1 -0
  14. package/{src/miura-data-flow.ts → dist/src/miura-data-flow.d.ts} +38 -67
  15. package/dist/src/miura-data-flow.d.ts.map +1 -0
  16. package/dist/src/miura-data-flow.js +96 -0
  17. package/dist/src/miura-data-flow.js.map +1 -0
  18. package/{src/providers/index.ts → dist/src/providers/index.d.ts} +1 -5
  19. package/dist/src/providers/index.d.ts.map +1 -0
  20. package/dist/src/providers/index.js +11 -0
  21. package/dist/src/providers/index.js.map +1 -0
  22. package/dist/src/providers/indexed-db-provider.d.ts +9 -0
  23. package/dist/src/providers/indexed-db-provider.d.ts.map +1 -0
  24. package/dist/src/providers/indexed-db-provider.js +35 -0
  25. package/dist/src/providers/indexed-db-provider.js.map +1 -0
  26. package/dist/src/providers/local-storage-provider.d.ts +7 -0
  27. package/dist/src/providers/local-storage-provider.d.ts.map +1 -0
  28. package/dist/src/providers/local-storage-provider.js +29 -0
  29. package/dist/src/providers/local-storage-provider.js.map +1 -0
  30. package/dist/src/providers/provider-manager.d.ts +4 -0
  31. package/dist/src/providers/provider-manager.d.ts.map +1 -0
  32. package/dist/src/providers/provider-manager.js +15 -0
  33. package/dist/src/providers/provider-manager.js.map +1 -0
  34. package/dist/src/providers/provider.d.ts +12 -0
  35. package/dist/src/providers/provider.d.ts.map +1 -0
  36. package/dist/src/providers/provider.js +2 -0
  37. package/dist/src/providers/provider.js.map +1 -0
  38. package/dist/src/providers/rest-provider.d.ts +86 -0
  39. package/dist/src/providers/rest-provider.d.ts.map +1 -0
  40. package/dist/src/providers/rest-provider.js +210 -0
  41. package/dist/src/providers/rest-provider.js.map +1 -0
  42. package/dist/src/providers/websockets-provider.d.ts +9 -0
  43. package/dist/src/providers/websockets-provider.d.ts.map +1 -0
  44. package/dist/src/providers/websockets-provider.js +43 -0
  45. package/dist/src/providers/websockets-provider.js.map +1 -0
  46. package/dist/src/store.d.ts +94 -0
  47. package/dist/src/store.d.ts.map +1 -0
  48. package/dist/src/store.js +169 -0
  49. package/dist/src/store.js.map +1 -0
  50. package/dist/tsconfig.tsbuildinfo +1 -0
  51. package/package.json +34 -7
  52. package/src/providers/graphql-provider.ts +13 -7
  53. package/index.ts +0 -1
  54. package/src/global-state.ts +0 -158
  55. package/src/middleware.ts +0 -162
  56. package/src/providers/indexed-db-provider.ts +0 -48
  57. package/src/providers/local-storage-provider.ts +0 -36
  58. package/src/providers/provider-manager.ts +0 -21
  59. package/src/providers/provider.ts +0 -23
  60. package/src/providers/rest-provider.ts +0 -351
  61. package/src/providers/websockets-provider.ts +0 -54
  62. package/src/store.ts +0 -237
  63. package/stories/data-flow-demo.stories.ts +0 -640
  64. 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 '@miura/miura-data-flow';
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 '@miura/miura-data-flow';
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 '@miura/miura-data-flow';
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 '@miura/miura-data-flow';
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 '@miura/miura-data-flow';
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 '@miura/miura-data-flow';
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 '@miura/miura-data-flow';
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 '@miura/miura-data-flow';
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 '@miura/miura-data-flow';
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 '@miura/miura-data-flow';
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 '@miura/miura-data-flow';
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 '@miura/miura-element';
388
- import { globalState } from '@miura/miura-data-flow';
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 '@miura/miura-data-flow';
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 '@miura/miura-render';
722
+ import { enableDebug } from '@miurajs/miura-render';
552
723
 
553
724
  enableDebug({
554
725
  element: true, // Shows data flow logs
@@ -0,0 +1,2 @@
1
+ export * from './src/miura-data-flow';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export * from './src/miura-data-flow';
2
+ //# sourceMappingURL=index.js.map
@@ -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"}