@hamak/ui-store 0.5.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.
Files changed (155) hide show
  1. package/README.md +143 -0
  2. package/dist/api/api/index.d.ts +7 -0
  3. package/dist/api/api/index.d.ts.map +1 -0
  4. package/dist/api/api/index.js +6 -0
  5. package/dist/api/api/middleware-registry.d.ts +33 -0
  6. package/dist/api/api/middleware-registry.d.ts.map +1 -0
  7. package/dist/api/api/middleware-registry.js +5 -0
  8. package/dist/api/api/reducer-registry.d.ts +41 -0
  9. package/dist/api/api/reducer-registry.d.ts.map +1 -0
  10. package/dist/api/api/reducer-registry.js +5 -0
  11. package/dist/api/api/store-manager.d.ts +55 -0
  12. package/dist/api/api/store-manager.d.ts.map +1 -0
  13. package/dist/api/api/store-manager.js +5 -0
  14. package/dist/api/autosave/autosave-action-factory.d.ts +69 -0
  15. package/dist/api/autosave/autosave-action-factory.d.ts.map +1 -0
  16. package/dist/api/autosave/autosave-action-factory.js +135 -0
  17. package/dist/api/autosave/autosave-action-types.d.ts +134 -0
  18. package/dist/api/autosave/autosave-action-types.d.ts.map +1 -0
  19. package/dist/api/autosave/autosave-action-types.js +44 -0
  20. package/dist/api/autosave/autosave-types.d.ts +86 -0
  21. package/dist/api/autosave/autosave-types.d.ts.map +1 -0
  22. package/dist/api/autosave/autosave-types.js +35 -0
  23. package/dist/api/autosave/index.d.ts +9 -0
  24. package/dist/api/autosave/index.d.ts.map +1 -0
  25. package/dist/api/autosave/index.js +8 -0
  26. package/dist/api/fs/contracts/filesystem-facade.contract.d.ts +57 -0
  27. package/dist/api/fs/contracts/filesystem-facade.contract.d.ts.map +1 -0
  28. package/dist/api/fs/contracts/filesystem-facade.contract.js +1 -0
  29. package/dist/api/fs/contracts/filesystem-manager.contract.d.ts +42 -0
  30. package/dist/api/fs/contracts/filesystem-manager.contract.d.ts.map +1 -0
  31. package/dist/api/fs/contracts/filesystem-manager.contract.js +1 -0
  32. package/dist/api/fs/index.d.ts +5 -0
  33. package/dist/api/fs/index.d.ts.map +1 -0
  34. package/dist/api/fs/index.js +4 -0
  35. package/dist/api/index.d.ts +10 -0
  36. package/dist/api/index.d.ts.map +1 -0
  37. package/dist/api/index.js +9 -0
  38. package/dist/api/tokens/index.d.ts +5 -0
  39. package/dist/api/tokens/index.d.ts.map +1 -0
  40. package/dist/api/tokens/index.js +4 -0
  41. package/dist/api/tokens/service-tokens.d.ts +10 -0
  42. package/dist/api/tokens/service-tokens.d.ts.map +1 -0
  43. package/dist/api/tokens/service-tokens.js +10 -0
  44. package/dist/api/types/extension-types.d.ts +32 -0
  45. package/dist/api/types/extension-types.d.ts.map +1 -0
  46. package/dist/api/types/extension-types.js +4 -0
  47. package/dist/api/types/index.d.ts +8 -0
  48. package/dist/api/types/index.d.ts.map +1 -0
  49. package/dist/api/types/index.js +7 -0
  50. package/dist/api/types/middleware-types.d.ts +31 -0
  51. package/dist/api/types/middleware-types.d.ts.map +1 -0
  52. package/dist/api/types/middleware-types.js +4 -0
  53. package/dist/api/types/reducer-types.d.ts +22 -0
  54. package/dist/api/types/reducer-types.d.ts.map +1 -0
  55. package/dist/api/types/reducer-types.js +4 -0
  56. package/dist/api/types/store-types.d.ts +49 -0
  57. package/dist/api/types/store-types.d.ts.map +1 -0
  58. package/dist/api/types/store-types.js +4 -0
  59. package/dist/impl/autosave/autosave-config-resolver.d.ts +45 -0
  60. package/dist/impl/autosave/autosave-config-resolver.d.ts.map +1 -0
  61. package/dist/impl/autosave/autosave-config-resolver.js +107 -0
  62. package/dist/impl/autosave/autosave-middleware.d.ts +37 -0
  63. package/dist/impl/autosave/autosave-middleware.d.ts.map +1 -0
  64. package/dist/impl/autosave/autosave-middleware.js +297 -0
  65. package/dist/impl/autosave/autosave-registry.d.ts +15 -0
  66. package/dist/impl/autosave/autosave-registry.d.ts.map +1 -0
  67. package/dist/impl/autosave/autosave-registry.js +38 -0
  68. package/dist/impl/autosave/autosave-sync-middleware.d.ts +24 -0
  69. package/dist/impl/autosave/autosave-sync-middleware.d.ts.map +1 -0
  70. package/dist/impl/autosave/autosave-sync-middleware.js +98 -0
  71. package/dist/impl/autosave/index.d.ts +8 -0
  72. package/dist/impl/autosave/index.d.ts.map +1 -0
  73. package/dist/impl/autosave/index.js +7 -0
  74. package/dist/impl/core/index.d.ts +4 -0
  75. package/dist/impl/core/index.d.ts.map +1 -0
  76. package/dist/impl/core/index.js +3 -0
  77. package/dist/impl/core/middleware-registry.d.ts +21 -0
  78. package/dist/impl/core/middleware-registry.d.ts.map +1 -0
  79. package/dist/impl/core/middleware-registry.js +60 -0
  80. package/dist/impl/core/reducer-registry.d.ts +18 -0
  81. package/dist/impl/core/reducer-registry.d.ts.map +1 -0
  82. package/dist/impl/core/reducer-registry.js +65 -0
  83. package/dist/impl/core/store-manager.d.ts +28 -0
  84. package/dist/impl/core/store-manager.d.ts.map +1 -0
  85. package/dist/impl/core/store-manager.js +129 -0
  86. package/dist/impl/extensions/store-extensions.d.ts +23 -0
  87. package/dist/impl/extensions/store-extensions.d.ts.map +1 -0
  88. package/dist/impl/extensions/store-extensions.js +66 -0
  89. package/dist/impl/fs/commands/fs-commands.d.ts +100 -0
  90. package/dist/impl/fs/commands/fs-commands.d.ts.map +1 -0
  91. package/dist/impl/fs/commands/fs-commands.js +338 -0
  92. package/dist/impl/fs/commands/structure-commands.d.ts +76 -0
  93. package/dist/impl/fs/commands/structure-commands.d.ts.map +1 -0
  94. package/dist/impl/fs/commands/structure-commands.js +21 -0
  95. package/dist/impl/fs/core/fs-adapter.d.ts +54 -0
  96. package/dist/impl/fs/core/fs-adapter.d.ts.map +1 -0
  97. package/dist/impl/fs/core/fs-adapter.js +204 -0
  98. package/dist/impl/fs/core/fs-facade.d.ts +37 -0
  99. package/dist/impl/fs/core/fs-facade.d.ts.map +1 -0
  100. package/dist/impl/fs/core/fs-facade.js +98 -0
  101. package/dist/impl/fs/index.d.ts +8 -0
  102. package/dist/impl/fs/index.d.ts.map +1 -0
  103. package/dist/impl/fs/index.js +11 -0
  104. package/dist/impl/fs/utils/data-updater.d.ts +36 -0
  105. package/dist/impl/fs/utils/data-updater.d.ts.map +1 -0
  106. package/dist/impl/fs/utils/data-updater.js +248 -0
  107. package/dist/impl/fs/utils/deep-equal.d.ts +5 -0
  108. package/dist/impl/fs/utils/deep-equal.d.ts.map +1 -0
  109. package/dist/impl/fs/utils/deep-equal.js +28 -0
  110. package/dist/impl/index.d.ts +12 -0
  111. package/dist/impl/index.d.ts.map +1 -0
  112. package/dist/impl/index.js +12 -0
  113. package/dist/impl/middleware/event-bridge-middleware.d.ts +7 -0
  114. package/dist/impl/middleware/event-bridge-middleware.d.ts.map +1 -0
  115. package/dist/impl/middleware/event-bridge-middleware.js +19 -0
  116. package/dist/impl/middleware/index.d.ts +6 -0
  117. package/dist/impl/middleware/index.d.ts.map +1 -0
  118. package/dist/impl/middleware/index.js +5 -0
  119. package/dist/impl/middleware/logger-middleware.d.ts +7 -0
  120. package/dist/impl/middleware/logger-middleware.d.ts.map +1 -0
  121. package/dist/impl/middleware/logger-middleware.js +18 -0
  122. package/dist/impl/plugin/index.d.ts +5 -0
  123. package/dist/impl/plugin/index.d.ts.map +1 -0
  124. package/dist/impl/plugin/index.js +4 -0
  125. package/dist/impl/plugin/store-plugin-factory.d.ts +15 -0
  126. package/dist/impl/plugin/store-plugin-factory.d.ts.map +1 -0
  127. package/dist/impl/plugin/store-plugin-factory.js +121 -0
  128. package/dist/index.d.ts +16 -0
  129. package/dist/index.d.ts.map +1 -0
  130. package/dist/index.js +15 -0
  131. package/dist/spi/autosave/i-autosave-provider.d.ts +98 -0
  132. package/dist/spi/autosave/i-autosave-provider.d.ts.map +1 -0
  133. package/dist/spi/autosave/i-autosave-provider.js +8 -0
  134. package/dist/spi/autosave/i-autosave-registry.d.ts +59 -0
  135. package/dist/spi/autosave/i-autosave-registry.d.ts.map +1 -0
  136. package/dist/spi/autosave/i-autosave-registry.js +8 -0
  137. package/dist/spi/autosave/index.d.ts +8 -0
  138. package/dist/spi/autosave/index.d.ts.map +1 -0
  139. package/dist/spi/autosave/index.js +7 -0
  140. package/dist/spi/index.d.ts +9 -0
  141. package/dist/spi/index.d.ts.map +1 -0
  142. package/dist/spi/index.js +9 -0
  143. package/dist/spi/middleware/index.d.ts +2 -0
  144. package/dist/spi/middleware/index.d.ts.map +1 -0
  145. package/dist/spi/middleware/index.js +1 -0
  146. package/dist/spi/middleware/middleware-provider.d.ts +9 -0
  147. package/dist/spi/middleware/middleware-provider.d.ts.map +1 -0
  148. package/dist/spi/middleware/middleware-provider.js +1 -0
  149. package/dist/spi/persistence/index.d.ts +2 -0
  150. package/dist/spi/persistence/index.d.ts.map +1 -0
  151. package/dist/spi/persistence/index.js +1 -0
  152. package/dist/spi/persistence/persistence-provider.d.ts +8 -0
  153. package/dist/spi/persistence/persistence-provider.d.ts.map +1 -0
  154. package/dist/spi/persistence/persistence-provider.js +1 -0
  155. package/package.json +68 -0
package/README.md ADDED
@@ -0,0 +1,143 @@
1
+ # UI Store
2
+
3
+ Redux-based state management framework for microkernel applications with extensible middleware and dynamic reducer registration.
4
+
5
+ ## Package Structure
6
+
7
+ This is a monorepo package containing four sub-packages following the API-SPI-IMPL pattern:
8
+
9
+ - **[@hamak/ui-store-api](./ui-store-api)** - Type definitions, interfaces, and service tokens
10
+ - **[@hamak/ui-store-spi](./ui-store-spi)** - Service Provider Interfaces for extensibility
11
+ - **[@hamak/ui-store-impl](./ui-store-impl)** - Concrete implementations with Redux integration
12
+ - **[@hamak/ui-store-templates](./ui-store-templates)** - React hooks and components
13
+
14
+ ## Features
15
+
16
+ ### Extensible Middleware System
17
+ - **Plugin contributions** - Any plugin can register middleware
18
+ - **Priority-based ordering** - Control middleware execution order
19
+ - **Type-safe** - Full TypeScript support
20
+ - **Built-in middleware** - Logger, thunk, event bridge, crash reporter
21
+
22
+ ### Dynamic Reducer Registry
23
+ - **Hot replacement** - Add/remove reducers at runtime
24
+ - **Plugin isolation** - Each plugin manages its own slice
25
+ - **Type-safe** - Strongly typed state access
26
+
27
+ ### Microkernel Integration
28
+ - **Event bridge** - Bidirectional Redux ↔ Microkernel events
29
+ - **DI integration** - Services via dependency injection
30
+ - **Plugin lifecycle** - Initialize during plugin setup
31
+
32
+ ### React Integration
33
+ - **Standard Redux hooks** - useSelector, useDispatch, useStore
34
+ - **Framework hooks** - Access store manager, registries, events
35
+ - **DevTools support** - Redux DevTools integration
36
+
37
+ ## Installation
38
+
39
+ ```bash
40
+ bun add @hamak/ui-store-api @hamak/ui-store-impl @hamak/ui-store-templates
41
+ ```
42
+
43
+ ## Quick Start
44
+
45
+ ```typescript
46
+ import { Host } from '@hamak/microkernel-impl';
47
+ import { createStorePlugin } from '@hamak/ui-store-impl';
48
+ import { thunk } from 'redux-thunk';
49
+
50
+ const host = new Host();
51
+
52
+ // Register store plugin
53
+ host.registerPlugin(
54
+ 'ui-store',
55
+ { name: 'ui-store', version: '1.0.0', entry: '' },
56
+ createStorePlugin({
57
+ devTools: true,
58
+ middleware: [
59
+ { id: 'redux-thunk', middleware: thunk, priority: 500 }
60
+ ]
61
+ })
62
+ );
63
+
64
+ await host.bootstrapAllAtRoot();
65
+ ```
66
+
67
+ ## Usage
68
+
69
+ ### Plugin Contributing Middleware
70
+
71
+ ```typescript
72
+ import { MIDDLEWARE_REGISTRY_TOKEN } from '@hamak/ui-store-api';
73
+
74
+ export const myPlugin: PluginModule = {
75
+ async initialize(ctx) {
76
+ const registry = ctx.resolve(MIDDLEWARE_REGISTRY_TOKEN);
77
+
78
+ registry.register({
79
+ id: 'my-middleware',
80
+ middleware: (store) => (next) => (action) => {
81
+ console.log('Action:', action.type);
82
+ return next(action);
83
+ },
84
+ priority: 100,
85
+ plugin: 'my-plugin'
86
+ });
87
+ }
88
+ };
89
+ ```
90
+
91
+ ### Plugin Contributing Reducer
92
+
93
+ ```typescript
94
+ import { REDUCER_REGISTRY_TOKEN } from '@hamak/ui-store-api';
95
+
96
+ export const myPlugin: PluginModule = {
97
+ async initialize(ctx) {
98
+ const registry = ctx.resolve(REDUCER_REGISTRY_TOKEN);
99
+
100
+ registry.register('mySlice', (state = {}, action) => {
101
+ switch (action.type) {
102
+ case 'MY_ACTION':
103
+ return { ...state, ...action.payload };
104
+ default:
105
+ return state;
106
+ }
107
+ });
108
+ }
109
+ };
110
+ ```
111
+
112
+ ### React Components
113
+
114
+ ```typescript
115
+ import { useSelector, useDispatch } from '@hamak/ui-store-templates';
116
+
117
+ function MyComponent() {
118
+ const data = useSelector(state => state.mySlice.data);
119
+ const dispatch = useDispatch();
120
+
121
+ return (
122
+ <button onClick={() => dispatch({ type: 'MY_ACTION', payload: {} })}>
123
+ Click Me
124
+ </button>
125
+ );
126
+ }
127
+ ```
128
+
129
+ ## Architecture
130
+
131
+ ```
132
+ Plugins → DI Container → Store Manager
133
+ ↓ ↓ ↓
134
+ Middleware Registry Reducer Registry
135
+ ↓ ↓ ↓
136
+ Redux Store ↔ Event Bridge ↔ Microkernel
137
+
138
+ React (useSelector, useDispatch)
139
+ ```
140
+
141
+ ## License
142
+
143
+ MIT
@@ -0,0 +1,7 @@
1
+ /**
2
+ * API Interfaces Export
3
+ */
4
+ export * from './store-manager';
5
+ export * from './middleware-registry';
6
+ export * from './reducer-registry';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * API Interfaces Export
3
+ */
4
+ export * from './store-manager';
5
+ export * from './middleware-registry';
6
+ export * from './reducer-registry';
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Middleware Registry Interface
3
+ * Extension point for plugins to contribute middleware
4
+ */
5
+ import type { Middleware } from 'redux';
6
+ import type { MiddlewareRegistration } from '../types';
7
+ export interface IMiddlewareRegistry {
8
+ /**
9
+ * Register a middleware
10
+ */
11
+ register(registration: MiddlewareRegistration): void;
12
+ /**
13
+ * Unregister a middleware by ID
14
+ */
15
+ unregister(id: string): void;
16
+ /**
17
+ * Get all middleware in priority order
18
+ */
19
+ getAll(): Middleware[];
20
+ /**
21
+ * Check if middleware is registered
22
+ */
23
+ has(id: string): boolean;
24
+ /**
25
+ * Get middleware registration info
26
+ */
27
+ getInfo(id: string): MiddlewareRegistration | undefined;
28
+ /**
29
+ * Get all registrations with metadata
30
+ */
31
+ getAllRegistrations(): MiddlewareRegistration[];
32
+ }
33
+ //# sourceMappingURL=middleware-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware-registry.d.ts","sourceRoot":"","sources":["../../../src/api/api/middleware-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAErD;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B;;OAEG;IACH,MAAM,IAAI,UAAU,EAAE,CAAC;IAEvB;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAEzB;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAAC;IAExD;;OAEG;IACH,mBAAmB,IAAI,sBAAsB,EAAE,CAAC;CACjD"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Middleware Registry Interface
3
+ * Extension point for plugins to contribute middleware
4
+ */
5
+ export {};
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Reducer Registry Interface
3
+ * Allows dynamic reducer registration and hot replacement
4
+ */
5
+ import type { Reducer } from 'redux';
6
+ import type { ReducerMap, ReducerRegistration } from '../types';
7
+ export interface IReducerRegistry {
8
+ /**
9
+ * Register a reducer for a state slice key
10
+ * @param key - State slice key
11
+ * @param reducer - Reducer function
12
+ * @param replace - Whether to replace existing reducer (default: false)
13
+ */
14
+ register(key: string, reducer: Reducer, replace?: boolean): void;
15
+ /**
16
+ * Unregister a reducer
17
+ * @param key - State slice key
18
+ */
19
+ unregister(key: string): void;
20
+ /**
21
+ * Get all registered reducers
22
+ */
23
+ getAll(): ReducerMap;
24
+ /**
25
+ * Get combined root reducer
26
+ */
27
+ getCombinedReducer(): Reducer;
28
+ /**
29
+ * Check if reducer is registered
30
+ */
31
+ has(key: string): boolean;
32
+ /**
33
+ * Get reducer registration info
34
+ */
35
+ getInfo(key: string): ReducerRegistration | undefined;
36
+ /**
37
+ * Get all registrations with metadata
38
+ */
39
+ getAllRegistrations(): ReducerRegistration[];
40
+ }
41
+ //# sourceMappingURL=reducer-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reducer-registry.d.ts","sourceRoot":"","sources":["../../../src/api/api/reducer-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAEjE;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B;;OAEG;IACH,MAAM,IAAI,UAAU,CAAC;IAErB;;OAEG;IACH,kBAAkB,IAAI,OAAO,CAAC;IAE9B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE1B;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAAC;IAEtD;;OAEG;IACH,mBAAmB,IAAI,mBAAmB,EAAE,CAAC;CAC9C"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Reducer Registry Interface
3
+ * Allows dynamic reducer registration and hot replacement
4
+ */
5
+ export {};
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Store Manager Interface
3
+ * Main orchestrator for Redux store management
4
+ */
5
+ import type { Store, Reducer, Action } from 'redux';
6
+ import type { StoreConfig, RootState, AppAction } from '../types';
7
+ import type { IMiddlewareRegistry } from './middleware-registry';
8
+ import type { IReducerRegistry } from './reducer-registry';
9
+ export interface IStoreManager {
10
+ /**
11
+ * Get the Redux store instance
12
+ * @throws Error if store is not initialized
13
+ */
14
+ getStore(): Store<RootState, AppAction>;
15
+ /**
16
+ * Check if store is initialized
17
+ */
18
+ isInitialized(): boolean;
19
+ /**
20
+ * Initialize the store
21
+ * Should be called after all plugins have registered middleware/reducers
22
+ * @internal - Called by plugin framework during activation
23
+ */
24
+ initialize(config?: StoreConfig): Store<RootState, AppAction>;
25
+ /**
26
+ * Get middleware registry (for plugin contributions)
27
+ */
28
+ getMiddlewareRegistry(): IMiddlewareRegistry;
29
+ /**
30
+ * Get reducer registry (for dynamic reducers)
31
+ */
32
+ getReducerRegistry(): IReducerRegistry;
33
+ /**
34
+ * Dispatch an action
35
+ */
36
+ dispatch<A extends Action>(action: A): A;
37
+ /**
38
+ * Get current state
39
+ */
40
+ getState<S = RootState>(): S;
41
+ /**
42
+ * Subscribe to state changes
43
+ * @returns Unsubscribe function
44
+ */
45
+ subscribe(listener: () => void): () => void;
46
+ /**
47
+ * Replace the root reducer (for hot module replacement)
48
+ */
49
+ replaceReducer(nextReducer: Reducer<RootState, AppAction>): void;
50
+ /**
51
+ * Destroy the store and clean up resources
52
+ */
53
+ destroy(): void;
54
+ }
55
+ //# sourceMappingURL=store-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-manager.d.ts","sourceRoot":"","sources":["../../../src/api/api/store-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAExC;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC;IAEzB;;;;OAIG;IACH,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE9D;;OAEG;IACH,qBAAqB,IAAI,mBAAmB,CAAC;IAE7C;;OAEG;IACH,kBAAkB,IAAI,gBAAgB,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAEzC;;OAEG;IACH,QAAQ,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC,CAAC;IAE7B;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAE5C;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;IAEjE;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Store Manager Interface
3
+ * Main orchestrator for Redux store management
4
+ */
5
+ export {};
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Autosave Action Factory
3
+ *
4
+ * Factory for creating autosave actions.
5
+ */
6
+ import type { AnyAction } from 'redux';
7
+ import type { AutosaveConfig } from './autosave-types';
8
+ import { type SetAutosaveConfigAction, type ClearAutosaveConfigAction, type ChangeDetectedAction, type DebounceExpiredAction, type SaveStartedAction, type SaveSucceededAction, type SaveFailedAction, type RetryScheduledAction, type FlushPendingAction, type FlushAllPendingAction, type CancelPendingAction, type AutosaveAction } from './autosave-action-types';
9
+ /**
10
+ * Factory class for creating autosave actions
11
+ */
12
+ export declare class AutosaveActionFactory {
13
+ /**
14
+ * Set autosave configuration for a path
15
+ */
16
+ setConfig(path: string[], config: AutosaveConfig): SetAutosaveConfigAction;
17
+ /**
18
+ * Clear autosave configuration for a path (revert to inherited)
19
+ */
20
+ clearConfig(path: string[]): ClearAutosaveConfigAction;
21
+ /**
22
+ * Content change detected, debounce timer started
23
+ */
24
+ changeDetected(path: string[], detectedAt: number, scheduledFor: number, providerId: string): ChangeDetectedAction;
25
+ /**
26
+ * Debounce timer expired, ready to save
27
+ */
28
+ debounceExpired(path: string[]): DebounceExpiredAction;
29
+ /**
30
+ * Save operation started
31
+ */
32
+ saveStarted(path: string[], providerId: string): SaveStartedAction;
33
+ /**
34
+ * Save completed successfully
35
+ */
36
+ saveSucceeded(path: string[], timestamp?: number): SaveSucceededAction;
37
+ /**
38
+ * Save failed
39
+ */
40
+ saveFailed(path: string[], error: {
41
+ code: string;
42
+ message: string;
43
+ }, attempt?: number): SaveFailedAction;
44
+ /**
45
+ * Retry scheduled
46
+ */
47
+ retryScheduled(path: string[], retryAt: number, attempt: number): RetryScheduledAction;
48
+ /**
49
+ * Flush pending save immediately (cancels debounce)
50
+ */
51
+ flushPending(path: string[]): FlushPendingAction;
52
+ /**
53
+ * Flush all pending saves
54
+ */
55
+ flushAllPending(): FlushAllPendingAction;
56
+ /**
57
+ * Cancel pending save
58
+ */
59
+ cancelPending(path: string[]): CancelPendingAction;
60
+ /**
61
+ * Check if an action is an autosave action
62
+ */
63
+ isAutosaveAction(action: AnyAction): action is AutosaveAction;
64
+ }
65
+ /**
66
+ * Singleton instance of the autosave action factory
67
+ */
68
+ export declare const autosaveActions: AutosaveActionFactory;
69
+ //# sourceMappingURL=autosave-action-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autosave-action-factory.d.ts","sourceRoot":"","sources":["../../../src/api/autosave/autosave-action-factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAEjC;;GAEG;AACH,qBAAa,qBAAqB;IAKhC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,GAAG,uBAAuB;IAO1E;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,yBAAyB;IAWtD;;OAEG;IACH,cAAc,CACZ,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,oBAAoB;IAOvB;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,qBAAqB;IAOtD;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,iBAAiB;IAOlE;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAOtE;;OAEG;IACH,UAAU,CACR,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EACxC,OAAO,GAAE,MAAU,GAClB,gBAAgB;IAUnB;;OAEG;IACH,cAAc,CACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,oBAAoB;IAWvB;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,kBAAkB;IAOhD;;OAEG;IACH,eAAe,IAAI,qBAAqB;IAMxC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,mBAAmB;IAWlD;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,cAAc;CAM9D;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,uBAA8B,CAAC"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Autosave Action Factory
3
+ *
4
+ * Factory for creating autosave actions.
5
+ */
6
+ import { AutosaveActionTypes, } from './autosave-action-types';
7
+ /**
8
+ * Factory class for creating autosave actions
9
+ */
10
+ export class AutosaveActionFactory {
11
+ // ─────────────────────────────────────────────────────────────────
12
+ // Configuration Actions
13
+ // ─────────────────────────────────────────────────────────────────
14
+ /**
15
+ * Set autosave configuration for a path
16
+ */
17
+ setConfig(path, config) {
18
+ return {
19
+ type: AutosaveActionTypes.SET_CONFIG,
20
+ payload: { path, config },
21
+ };
22
+ }
23
+ /**
24
+ * Clear autosave configuration for a path (revert to inherited)
25
+ */
26
+ clearConfig(path) {
27
+ return {
28
+ type: AutosaveActionTypes.CLEAR_CONFIG,
29
+ payload: { path },
30
+ };
31
+ }
32
+ // ─────────────────────────────────────────────────────────────────
33
+ // Lifecycle Actions (used internally by middleware)
34
+ // ─────────────────────────────────────────────────────────────────
35
+ /**
36
+ * Content change detected, debounce timer started
37
+ */
38
+ changeDetected(path, detectedAt, scheduledFor, providerId) {
39
+ return {
40
+ type: AutosaveActionTypes.CHANGE_DETECTED,
41
+ payload: { path, detectedAt, scheduledFor, providerId },
42
+ };
43
+ }
44
+ /**
45
+ * Debounce timer expired, ready to save
46
+ */
47
+ debounceExpired(path) {
48
+ return {
49
+ type: AutosaveActionTypes.DEBOUNCE_EXPIRED,
50
+ payload: { path },
51
+ };
52
+ }
53
+ /**
54
+ * Save operation started
55
+ */
56
+ saveStarted(path, providerId) {
57
+ return {
58
+ type: AutosaveActionTypes.SAVE_STARTED,
59
+ payload: { path, providerId },
60
+ };
61
+ }
62
+ /**
63
+ * Save completed successfully
64
+ */
65
+ saveSucceeded(path, timestamp) {
66
+ return {
67
+ type: AutosaveActionTypes.SAVE_SUCCEEDED,
68
+ payload: { path, timestamp: timestamp ?? Date.now() },
69
+ };
70
+ }
71
+ /**
72
+ * Save failed
73
+ */
74
+ saveFailed(path, error, attempt = 1) {
75
+ return {
76
+ type: AutosaveActionTypes.SAVE_FAILED,
77
+ payload: {
78
+ path,
79
+ error: { ...error, attempt },
80
+ },
81
+ };
82
+ }
83
+ /**
84
+ * Retry scheduled
85
+ */
86
+ retryScheduled(path, retryAt, attempt) {
87
+ return {
88
+ type: AutosaveActionTypes.RETRY_SCHEDULED,
89
+ payload: { path, retryAt, attempt },
90
+ };
91
+ }
92
+ // ─────────────────────────────────────────────────────────────────
93
+ // Manual Trigger Actions
94
+ // ─────────────────────────────────────────────────────────────────
95
+ /**
96
+ * Flush pending save immediately (cancels debounce)
97
+ */
98
+ flushPending(path) {
99
+ return {
100
+ type: AutosaveActionTypes.FLUSH_PENDING,
101
+ payload: { path },
102
+ };
103
+ }
104
+ /**
105
+ * Flush all pending saves
106
+ */
107
+ flushAllPending() {
108
+ return {
109
+ type: AutosaveActionTypes.FLUSH_ALL_PENDING,
110
+ };
111
+ }
112
+ /**
113
+ * Cancel pending save
114
+ */
115
+ cancelPending(path) {
116
+ return {
117
+ type: AutosaveActionTypes.CANCEL_PENDING,
118
+ payload: { path },
119
+ };
120
+ }
121
+ // ─────────────────────────────────────────────────────────────────
122
+ // Type Guards
123
+ // ─────────────────────────────────────────────────────────────────
124
+ /**
125
+ * Check if an action is an autosave action
126
+ */
127
+ isAutosaveAction(action) {
128
+ return (typeof action.type === 'string' &&
129
+ action.type.startsWith('@@autosave/'));
130
+ }
131
+ }
132
+ /**
133
+ * Singleton instance of the autosave action factory
134
+ */
135
+ export const autosaveActions = new AutosaveActionFactory();
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Autosave Action Types
3
+ *
4
+ * These actions orchestrate the autosave lifecycle but do NOT execute saves.
5
+ * Actual saves are performed by plugin providers using their own actions
6
+ * (e.g., PUT_REQUEST for remote-fs, UPDATE_ENTITY for remote-resource).
7
+ */
8
+ import type { AutosaveConfig, AutosaveError } from './autosave-types';
9
+ /**
10
+ * Autosave action type constants
11
+ */
12
+ export declare enum AutosaveActionTypes {
13
+ /** Set autosave configuration for a path */
14
+ SET_CONFIG = "@@autosave/SET_CONFIG",
15
+ /** Clear autosave configuration (revert to inherited) */
16
+ CLEAR_CONFIG = "@@autosave/CLEAR_CONFIG",
17
+ /** Content change detected, debounce timer started */
18
+ CHANGE_DETECTED = "@@autosave/CHANGE_DETECTED",
19
+ /** Debounce timer expired, save will be triggered */
20
+ DEBOUNCE_EXPIRED = "@@autosave/DEBOUNCE_EXPIRED",
21
+ /** Save operation started */
22
+ SAVE_STARTED = "@@autosave/SAVE_STARTED",
23
+ /** Save completed successfully */
24
+ SAVE_SUCCEEDED = "@@autosave/SAVE_SUCCEEDED",
25
+ /** Save failed */
26
+ SAVE_FAILED = "@@autosave/SAVE_FAILED",
27
+ /** Retry scheduled */
28
+ RETRY_SCHEDULED = "@@autosave/RETRY_SCHEDULED",
29
+ /** Flush pending save immediately (cancels debounce) */
30
+ FLUSH_PENDING = "@@autosave/FLUSH_PENDING",
31
+ /** Flush all pending saves */
32
+ FLUSH_ALL_PENDING = "@@autosave/FLUSH_ALL_PENDING",
33
+ /** Cancel pending save */
34
+ CANCEL_PENDING = "@@autosave/CANCEL_PENDING"
35
+ }
36
+ /** Set autosave configuration for a path */
37
+ export interface SetAutosaveConfigAction {
38
+ type: AutosaveActionTypes.SET_CONFIG;
39
+ payload: {
40
+ path: string[];
41
+ config: AutosaveConfig;
42
+ };
43
+ [key: string]: unknown;
44
+ }
45
+ /** Clear autosave configuration for a path */
46
+ export interface ClearAutosaveConfigAction {
47
+ type: AutosaveActionTypes.CLEAR_CONFIG;
48
+ payload: {
49
+ path: string[];
50
+ };
51
+ [key: string]: unknown;
52
+ }
53
+ /** Content change detected */
54
+ export interface ChangeDetectedAction {
55
+ type: AutosaveActionTypes.CHANGE_DETECTED;
56
+ payload: {
57
+ path: string[];
58
+ detectedAt: number;
59
+ scheduledFor: number;
60
+ providerId: string;
61
+ };
62
+ [key: string]: unknown;
63
+ }
64
+ /** Debounce timer expired */
65
+ export interface DebounceExpiredAction {
66
+ type: AutosaveActionTypes.DEBOUNCE_EXPIRED;
67
+ payload: {
68
+ path: string[];
69
+ };
70
+ [key: string]: unknown;
71
+ }
72
+ /** Save started */
73
+ export interface SaveStartedAction {
74
+ type: AutosaveActionTypes.SAVE_STARTED;
75
+ payload: {
76
+ path: string[];
77
+ providerId: string;
78
+ };
79
+ [key: string]: unknown;
80
+ }
81
+ /** Save succeeded */
82
+ export interface SaveSucceededAction {
83
+ type: AutosaveActionTypes.SAVE_SUCCEEDED;
84
+ payload: {
85
+ path: string[];
86
+ timestamp: number;
87
+ };
88
+ [key: string]: unknown;
89
+ }
90
+ /** Save failed */
91
+ export interface SaveFailedAction {
92
+ type: AutosaveActionTypes.SAVE_FAILED;
93
+ payload: {
94
+ path: string[];
95
+ error: AutosaveError;
96
+ };
97
+ [key: string]: unknown;
98
+ }
99
+ /** Retry scheduled */
100
+ export interface RetryScheduledAction {
101
+ type: AutosaveActionTypes.RETRY_SCHEDULED;
102
+ payload: {
103
+ path: string[];
104
+ retryAt: number;
105
+ attempt: number;
106
+ };
107
+ [key: string]: unknown;
108
+ }
109
+ /** Flush pending save */
110
+ export interface FlushPendingAction {
111
+ type: AutosaveActionTypes.FLUSH_PENDING;
112
+ payload: {
113
+ path: string[];
114
+ };
115
+ [key: string]: unknown;
116
+ }
117
+ /** Flush all pending saves */
118
+ export interface FlushAllPendingAction {
119
+ type: AutosaveActionTypes.FLUSH_ALL_PENDING;
120
+ [key: string]: unknown;
121
+ }
122
+ /** Cancel pending save */
123
+ export interface CancelPendingAction {
124
+ type: AutosaveActionTypes.CANCEL_PENDING;
125
+ payload: {
126
+ path: string[];
127
+ };
128
+ [key: string]: unknown;
129
+ }
130
+ /**
131
+ * Union type of all autosave actions
132
+ */
133
+ export type AutosaveAction = SetAutosaveConfigAction | ClearAutosaveConfigAction | ChangeDetectedAction | DebounceExpiredAction | SaveStartedAction | SaveSucceededAction | SaveFailedAction | RetryScheduledAction | FlushPendingAction | FlushAllPendingAction | CancelPendingAction;
134
+ //# sourceMappingURL=autosave-action-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autosave-action-types.d.ts","sourceRoot":"","sources":["../../../src/api/autosave/autosave-action-types.ts"],"names":[],"mappings":"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"}