@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
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Deep equality check for objects and arrays
3
+ */
4
+ export function deepEqual(obj1, obj2) {
5
+ if (obj1 === obj2) {
6
+ return true;
7
+ }
8
+ if (obj1 === null || obj2 === null || typeof obj1 !== 'object' || typeof obj2 !== 'object') {
9
+ return false;
10
+ }
11
+ if (Array.isArray(obj1) !== Array.isArray(obj2)) {
12
+ return false;
13
+ }
14
+ const keys1 = Object.keys(obj1);
15
+ const keys2 = Object.keys(obj2);
16
+ if (keys1.length !== keys2.length) {
17
+ return false;
18
+ }
19
+ for (const key of keys1) {
20
+ if (!keys2.includes(key)) {
21
+ return false;
22
+ }
23
+ if (!deepEqual(obj1[key], obj2[key])) {
24
+ return false;
25
+ }
26
+ }
27
+ return true;
28
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * UI Store Implementation
3
+ * Concrete implementations of Redux store management
4
+ */
5
+ export * from '../api';
6
+ export * from '../spi';
7
+ export * from './core';
8
+ export * from './middleware';
9
+ export * from './plugin';
10
+ export * from './fs';
11
+ export * from './autosave';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/impl/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AAEvB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * UI Store Implementation
3
+ * Concrete implementations of Redux store management
4
+ */
5
+ // Re-export API and SPI for convenience
6
+ export * from '../api';
7
+ export * from '../spi';
8
+ export * from './core';
9
+ export * from './middleware';
10
+ export * from './plugin';
11
+ export * from './fs';
12
+ export * from './autosave';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Event Bridge Middleware
3
+ * Bridges Redux actions to microkernel event bus
4
+ */
5
+ import type { Middleware } from 'redux';
6
+ export declare function createEventBridgeMiddleware(hooks: any): Middleware;
7
+ //# sourceMappingURL=event-bridge-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bridge-middleware.d.ts","sourceRoot":"","sources":["../../../src/impl/middleware/event-bridge-middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,GAAG,GAAG,UAAU,CAkBlE"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Event Bridge Middleware
3
+ * Bridges Redux actions to microkernel event bus
4
+ */
5
+ export function createEventBridgeMiddleware(hooks) {
6
+ return (store) => (next) => (action) => {
7
+ // Emit before action
8
+ hooks?.emit('redux:action:before', { action, state: store.getState() });
9
+ // Execute action
10
+ const result = next(action);
11
+ // Emit after action
12
+ hooks?.emit('redux:action:after', { action, state: store.getState() });
13
+ // Emit specific action type event
14
+ if (action?.type) {
15
+ hooks?.emit(`redux:action:${action.type}`, action);
16
+ }
17
+ return result;
18
+ };
19
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Middleware Export
3
+ */
4
+ export * from './event-bridge-middleware';
5
+ export * from './logger-middleware';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/impl/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Middleware Export
3
+ */
4
+ export * from './event-bridge-middleware';
5
+ export * from './logger-middleware';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Logger Middleware
3
+ * Development logger for Redux actions
4
+ */
5
+ import type { Middleware } from 'redux';
6
+ export declare function createLoggerMiddleware(): Middleware;
7
+ //# sourceMappingURL=logger-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-middleware.d.ts","sourceRoot":"","sources":["../../../src/impl/middleware/logger-middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,wBAAgB,sBAAsB,IAAI,UAAU,CAiBnD"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Logger Middleware
3
+ * Development logger for Redux actions
4
+ */
5
+ export function createLoggerMiddleware() {
6
+ return (store) => (next) => (action) => {
7
+ if (typeof action?.type === 'string') {
8
+ console.group(`[Redux] ${action.type}`);
9
+ console.log('Prev State:', store.getState());
10
+ console.log('Action:', action);
11
+ const result = next(action);
12
+ console.log('Next State:', store.getState());
13
+ console.groupEnd();
14
+ return result;
15
+ }
16
+ return next(action);
17
+ };
18
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Plugin Export
3
+ */
4
+ export * from './store-plugin-factory';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/impl/plugin/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Plugin Export
3
+ */
4
+ export * from './store-plugin-factory';
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Store Plugin Factory
3
+ * Creates a microkernel plugin for Redux store management
4
+ */
5
+ import type { PluginModule } from '@hamak/microkernel-spi';
6
+ import { type StorePluginExtensions } from '../../api';
7
+ export declare const FILESYSTEM_ADAPTER_TOKEN = "FILESYSTEM_ADAPTER";
8
+ export interface StorePluginConfig extends StorePluginExtensions {
9
+ /** Enable Redux DevTools integration */
10
+ devTools?: boolean;
11
+ /** Enable logger middleware in development */
12
+ logger?: boolean;
13
+ }
14
+ export declare function createStorePlugin(config?: StorePluginConfig): PluginModule;
15
+ //# sourceMappingURL=store-plugin-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-plugin-factory.d.ts","sourceRoot":"","sources":["../../../src/impl/plugin/store-plugin-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAML,KAAK,qBAAqB,EAC3B,MAAM,WAAW,CAAC;AAanB,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB;IAC9D,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,GAAE,iBAAsB,GAC7B,YAAY,CAqId"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Store Plugin Factory
3
+ * Creates a microkernel plugin for Redux store management
4
+ */
5
+ import { STORE_MANAGER_TOKEN, MIDDLEWARE_REGISTRY_TOKEN, REDUCER_REGISTRY_TOKEN, STORE_EXTENSIONS_TOKEN, } from '../../api';
6
+ import { StoreManager } from '../core/store-manager';
7
+ import { createEventBridgeMiddleware, createLoggerMiddleware, } from '../middleware';
8
+ import { applyStoreExtensions, createStoreExtensionsCollector, } from '../extensions/store-extensions';
9
+ import { createFileSystemAdapter } from '../fs/core/fs-adapter';
10
+ // DI token for filesystem adapter
11
+ export const FILESYSTEM_ADAPTER_TOKEN = 'FILESYSTEM_ADAPTER';
12
+ export function createStorePlugin(config = {}) {
13
+ const storeManager = new StoreManager();
14
+ const middlewareRegistry = storeManager.getMiddlewareRegistry();
15
+ const reducerRegistry = storeManager.getReducerRegistry();
16
+ const extensionsCollector = createStoreExtensionsCollector();
17
+ // Create filesystem adapter with 'fs' slice name
18
+ const fileSystemAdapter = createFileSystemAdapter('fs');
19
+ const registerDefaultMiddleware = (hooks) => {
20
+ extensionsCollector.register('ui-store:event-bridge', {
21
+ middleware: [
22
+ {
23
+ id: 'event-bridge',
24
+ middleware: createEventBridgeMiddleware(hooks),
25
+ priority: 1000,
26
+ plugin: 'ui-store',
27
+ description: 'Bridges Redux actions to microkernel events',
28
+ },
29
+ ],
30
+ });
31
+ if (config.logger !== false &&
32
+ process.env.NODE_ENV === 'development') {
33
+ extensionsCollector.register('ui-store:logger', {
34
+ middleware: [
35
+ {
36
+ id: 'logger',
37
+ middleware: createLoggerMiddleware(),
38
+ priority: -1000,
39
+ plugin: 'ui-store',
40
+ description: 'Development logger',
41
+ },
42
+ ],
43
+ });
44
+ }
45
+ };
46
+ const registerConfigExtensions = () => {
47
+ if (config.middleware?.length) {
48
+ const middleware = config.middleware.map((mw) => ({
49
+ ...mw,
50
+ plugin: mw.plugin ?? 'ui-store-config',
51
+ }));
52
+ extensionsCollector.register('ui-store-config:middleware', {
53
+ middleware,
54
+ });
55
+ }
56
+ // Call middlewareFactory if provided, passing the fileSystemAdapter
57
+ if (config.middlewareFactory) {
58
+ const factoryMiddleware = config.middlewareFactory(fileSystemAdapter);
59
+ if (factoryMiddleware?.length) {
60
+ extensionsCollector.register('ui-store-config:middleware-factory', {
61
+ middleware: factoryMiddleware.map((mw) => ({
62
+ ...mw,
63
+ plugin: mw.plugin ?? 'ui-store-config',
64
+ })),
65
+ });
66
+ }
67
+ }
68
+ if (config.reducers && Object.keys(config.reducers).length) {
69
+ extensionsCollector.register('ui-store-config:reducers', {
70
+ reducers: config.reducers,
71
+ });
72
+ }
73
+ };
74
+ return {
75
+ async initialize(ctx) {
76
+ // Set filesystem adapter on store manager
77
+ storeManager.setFileSystemAdapter(fileSystemAdapter);
78
+ // Register filesystem reducer
79
+ reducerRegistry.register('fs', fileSystemAdapter.getReducer());
80
+ // Register services via DI
81
+ ctx.provide({ provide: STORE_MANAGER_TOKEN, useValue: storeManager });
82
+ ctx.provide({
83
+ provide: MIDDLEWARE_REGISTRY_TOKEN,
84
+ useValue: middlewareRegistry,
85
+ });
86
+ ctx.provide({
87
+ provide: REDUCER_REGISTRY_TOKEN,
88
+ useValue: reducerRegistry,
89
+ });
90
+ ctx.provide({
91
+ provide: STORE_EXTENSIONS_TOKEN,
92
+ useValue: extensionsCollector,
93
+ });
94
+ ctx.provide({
95
+ provide: FILESYSTEM_ADAPTER_TOKEN,
96
+ useValue: fileSystemAdapter,
97
+ });
98
+ registerDefaultMiddleware(ctx.hooks);
99
+ registerConfigExtensions();
100
+ console.log('[ui-store] Plugin initialized with filesystem support');
101
+ },
102
+ async activate(ctx) {
103
+ applyStoreExtensions(extensionsCollector, middlewareRegistry, reducerRegistry);
104
+ // Initialize the store after all plugins have registered middleware/reducers
105
+ const store = storeManager.initialize({
106
+ devTools: config.devTools,
107
+ });
108
+ // Bridge Redux state changes to microkernel events
109
+ store.subscribe(() => {
110
+ ctx.hooks.emit('redux:state-changed', store.getState());
111
+ });
112
+ // Emit ready event
113
+ ctx.hooks.emit('ui-store:ready', { store });
114
+ console.log('[ui-store] Plugin activated');
115
+ },
116
+ async deactivate() {
117
+ storeManager.destroy();
118
+ console.log('[ui-store] Plugin deactivated');
119
+ },
120
+ };
121
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @hamak/ui-store
3
+ * Redux store management for microkernel-based applications
4
+ *
5
+ * @example
6
+ * // Full implementation (includes all API, SPI, and impl exports)
7
+ * import { createStorePlugin, StoreManager } from '@hamak/ui-store';
8
+ *
9
+ * // API only (types and interfaces)
10
+ * import { IStoreManager, RootState } from '@hamak/ui-store/api';
11
+ *
12
+ * // SPI (extension points)
13
+ * import { IMiddlewareProvider, IAutosaveProvider } from '@hamak/ui-store/spi';
14
+ */
15
+ export * from './impl';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,cAAc,QAAQ,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @hamak/ui-store
3
+ * Redux store management for microkernel-based applications
4
+ *
5
+ * @example
6
+ * // Full implementation (includes all API, SPI, and impl exports)
7
+ * import { createStorePlugin, StoreManager } from '@hamak/ui-store';
8
+ *
9
+ * // API only (types and interfaces)
10
+ * import { IStoreManager, RootState } from '@hamak/ui-store/api';
11
+ *
12
+ * // SPI (extension points)
13
+ * import { IMiddlewareProvider, IAutosaveProvider } from '@hamak/ui-store/spi';
14
+ */
15
+ export * from './impl';
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Autosave Provider Interface
3
+ *
4
+ * Each filesystem plugin (remote-fs, remote-resource, git) implements this interface
5
+ * to handle actual save operations. The core autosave middleware handles debouncing
6
+ * and orchestration, then delegates to the appropriate provider for execution.
7
+ */
8
+ import type { FileSystemNode } from '@hamak/shared-utils';
9
+ import type { Dispatch, AnyAction } from 'redux';
10
+ /**
11
+ * Result of a save operation
12
+ */
13
+ export interface AutosaveResult {
14
+ /** Whether the save succeeded */
15
+ success: boolean;
16
+ /** Error information if failed */
17
+ error?: {
18
+ code: string;
19
+ message: string;
20
+ };
21
+ /** Timestamp of the save */
22
+ timestamp?: number;
23
+ /** Additional metadata from the save operation */
24
+ metadata?: Record<string, unknown>;
25
+ }
26
+ /**
27
+ * Autosave provider interface
28
+ *
29
+ * Implement this interface to add autosave support for a filesystem plugin.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * class RemoteFsAutosaveProvider implements IAutosaveProvider {
34
+ * readonly id = 'remote-fs';
35
+ * readonly priority = 10;
36
+ *
37
+ * supports(path: string[], node: FileSystemNode): boolean {
38
+ * return node.state?.extensionStates?.['remoteFs'] !== undefined;
39
+ * }
40
+ *
41
+ * async save(path, content, node, dispatch): Promise<AutosaveResult> {
42
+ * dispatch(rfsActions.ofPutRequest(path, content));
43
+ * return { success: true, timestamp: Date.now() };
44
+ * }
45
+ * }
46
+ * ```
47
+ */
48
+ export interface IAutosaveProvider {
49
+ /**
50
+ * Unique provider identifier
51
+ * Examples: 'remote-fs', 'remote-resource', 'git'
52
+ */
53
+ readonly id: string;
54
+ /**
55
+ * Priority for provider selection when multiple providers support a path.
56
+ * Higher priority = preferred. Default: 0
57
+ */
58
+ readonly priority?: number;
59
+ /**
60
+ * Check if this provider can handle autosave for a given path.
61
+ *
62
+ * Provider should check if the node has the required extension state.
63
+ * For example, remote-fs checks for 'remoteFs' extension state,
64
+ * remote-resource checks for 'ui-remote-resource' extension state.
65
+ *
66
+ * @param path - File path segments
67
+ * @param node - The filesystem node
68
+ * @returns true if this provider can handle the path
69
+ */
70
+ supports(path: string[], node: FileSystemNode): boolean;
71
+ /**
72
+ * Execute the save operation.
73
+ *
74
+ * Provider should dispatch its own save actions (e.g., PUT_REQUEST, UPDATE_ENTITY)
75
+ * and return the result. The autosave middleware will track the save status.
76
+ *
77
+ * @param path - File path segments
78
+ * @param content - File content to save
79
+ * @param node - The filesystem node
80
+ * @param dispatch - Redux dispatch function
81
+ * @returns Promise resolving to the save result
82
+ */
83
+ save(path: string[], content: unknown, node: FileSystemNode, dispatch: Dispatch<AnyAction>): Promise<AutosaveResult>;
84
+ /**
85
+ * Cancel any in-progress save for a path (optional).
86
+ *
87
+ * @param path - File path segments
88
+ */
89
+ cancel?(path: string[]): void;
90
+ /**
91
+ * Clean up resources for a path (optional).
92
+ * Called when autosave is disabled or node is removed.
93
+ *
94
+ * @param path - File path segments
95
+ */
96
+ cleanup?(path: string[]): void;
97
+ }
98
+ //# sourceMappingURL=i-autosave-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-autosave-provider.d.ts","sourceRoot":"","sources":["../../../src/spi/autosave/i-autosave-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;IAEjB,kCAAkC;IAClC,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC;IAExD;;;;;;;;;;;OAWG;IACH,IAAI,CACF,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC5B,OAAO,CAAC,cAAc,CAAC,CAAC;IAE3B;;;;OAIG;IACH,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE9B;;;;;OAKG;IACH,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAChC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Autosave Provider Interface
3
+ *
4
+ * Each filesystem plugin (remote-fs, remote-resource, git) implements this interface
5
+ * to handle actual save operations. The core autosave middleware handles debouncing
6
+ * and orchestration, then delegates to the appropriate provider for execution.
7
+ */
8
+ export {};
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Autosave Provider Registry Interface
3
+ *
4
+ * Registry for managing autosave providers. Plugins register their providers
5
+ * during activation, and the autosave middleware uses the registry to find
6
+ * the appropriate provider for each file.
7
+ */
8
+ import type { FileSystemNode } from '@hamak/shared-utils';
9
+ import type { IAutosaveProvider } from './i-autosave-provider';
10
+ /**
11
+ * Registry for autosave providers
12
+ */
13
+ export interface IAutosaveProviderRegistry {
14
+ /**
15
+ * Register an autosave provider
16
+ *
17
+ * @param provider - The provider to register
18
+ * @throws Error if a provider with the same ID is already registered
19
+ */
20
+ register(provider: IAutosaveProvider): void;
21
+ /**
22
+ * Unregister an autosave provider
23
+ *
24
+ * @param providerId - The ID of the provider to unregister
25
+ */
26
+ unregister(providerId: string): void;
27
+ /**
28
+ * Get a provider by ID
29
+ *
30
+ * @param providerId - The provider ID
31
+ * @returns The provider or undefined if not found
32
+ */
33
+ get(providerId: string): IAutosaveProvider | undefined;
34
+ /**
35
+ * Find the best provider for a path
36
+ *
37
+ * Checks all registered providers and returns the one with the highest
38
+ * priority that supports the given path.
39
+ *
40
+ * @param path - File path segments
41
+ * @param node - The filesystem node
42
+ * @returns The best matching provider or undefined if none found
43
+ */
44
+ findProvider(path: string[], node: FileSystemNode): IAutosaveProvider | undefined;
45
+ /**
46
+ * Get all registered providers
47
+ *
48
+ * @returns Array of all registered providers
49
+ */
50
+ getAll(): IAutosaveProvider[];
51
+ /**
52
+ * Check if a provider is registered
53
+ *
54
+ * @param providerId - The provider ID
55
+ * @returns true if the provider is registered
56
+ */
57
+ has(providerId: string): boolean;
58
+ }
59
+ //# sourceMappingURL=i-autosave-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-autosave-registry.d.ts","sourceRoot":"","sources":["../../../src/spi/autosave/i-autosave-registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAE5C;;;;OAIG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAErC;;;;;OAKG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAEvD;;;;;;;;;OASG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAElF;;;;OAIG;IACH,MAAM,IAAI,iBAAiB,EAAE,CAAC;IAE9B;;;;;OAKG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Autosave Provider Registry Interface
3
+ *
4
+ * Registry for managing autosave providers. Plugins register their providers
5
+ * during activation, and the autosave middleware uses the registry to find
6
+ * the appropriate provider for each file.
7
+ */
8
+ export {};
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Autosave SPI
3
+ *
4
+ * Service Provider Interfaces for autosave functionality.
5
+ */
6
+ export * from './i-autosave-provider';
7
+ export * from './i-autosave-registry';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spi/autosave/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Autosave SPI
3
+ *
4
+ * Service Provider Interfaces for autosave functionality.
5
+ */
6
+ export * from './i-autosave-provider';
7
+ export * from './i-autosave-registry';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * UI Store SPI
3
+ * Service Provider Interfaces for Redux store extensions
4
+ */
5
+ export * from '../api';
6
+ export * from './middleware';
7
+ export * from './persistence';
8
+ export * from './autosave';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spi/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,QAAQ,CAAC;AAEvB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * UI Store SPI
3
+ * Service Provider Interfaces for Redux store extensions
4
+ */
5
+ // Re-export API for convenience
6
+ export * from '../api';
7
+ export * from './middleware';
8
+ export * from './persistence';
9
+ export * from './autosave';
@@ -0,0 +1,2 @@
1
+ export * from './middleware-provider';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spi/middleware/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './middleware-provider';
@@ -0,0 +1,9 @@
1
+ import type { Middleware } from 'redux';
2
+ import type { MiddlewareRegistration } from '../../api';
3
+ export interface IMiddlewareProvider {
4
+ readonly id: string;
5
+ create(config?: any): Middleware;
6
+ getRegistration(config?: any): MiddlewareRegistration;
7
+ validateConfig?(config: any): boolean;
8
+ }
9
+ //# sourceMappingURL=middleware-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware-provider.d.ts","sourceRoot":"","sources":["../../../src/spi/middleware/middleware-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,UAAU,CAAC;IACjC,eAAe,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,sBAAsB,CAAC;IACtD,cAAc,CAAC,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC;CACvC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './persistence-provider';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spi/persistence/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './persistence-provider';
@@ -0,0 +1,8 @@
1
+ export interface IPersistenceProvider {
2
+ save(key: string, state: any): Promise<void>;
3
+ load(key: string): Promise<any | null>;
4
+ remove(key: string): Promise<void>;
5
+ clear(): Promise<void>;
6
+ isAvailable(): boolean;
7
+ }
8
+ //# sourceMappingURL=persistence-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence-provider.d.ts","sourceRoot":"","sources":["../../../src/spi/persistence/persistence-provider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,IAAI,OAAO,CAAC;CACxB"}
@@ -0,0 +1 @@
1
+ export {};