@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.
- package/README.md +143 -0
- package/dist/api/api/index.d.ts +7 -0
- package/dist/api/api/index.d.ts.map +1 -0
- package/dist/api/api/index.js +6 -0
- package/dist/api/api/middleware-registry.d.ts +33 -0
- package/dist/api/api/middleware-registry.d.ts.map +1 -0
- package/dist/api/api/middleware-registry.js +5 -0
- package/dist/api/api/reducer-registry.d.ts +41 -0
- package/dist/api/api/reducer-registry.d.ts.map +1 -0
- package/dist/api/api/reducer-registry.js +5 -0
- package/dist/api/api/store-manager.d.ts +55 -0
- package/dist/api/api/store-manager.d.ts.map +1 -0
- package/dist/api/api/store-manager.js +5 -0
- package/dist/api/autosave/autosave-action-factory.d.ts +69 -0
- package/dist/api/autosave/autosave-action-factory.d.ts.map +1 -0
- package/dist/api/autosave/autosave-action-factory.js +135 -0
- package/dist/api/autosave/autosave-action-types.d.ts +134 -0
- package/dist/api/autosave/autosave-action-types.d.ts.map +1 -0
- package/dist/api/autosave/autosave-action-types.js +44 -0
- package/dist/api/autosave/autosave-types.d.ts +86 -0
- package/dist/api/autosave/autosave-types.d.ts.map +1 -0
- package/dist/api/autosave/autosave-types.js +35 -0
- package/dist/api/autosave/index.d.ts +9 -0
- package/dist/api/autosave/index.d.ts.map +1 -0
- package/dist/api/autosave/index.js +8 -0
- package/dist/api/fs/contracts/filesystem-facade.contract.d.ts +57 -0
- package/dist/api/fs/contracts/filesystem-facade.contract.d.ts.map +1 -0
- package/dist/api/fs/contracts/filesystem-facade.contract.js +1 -0
- package/dist/api/fs/contracts/filesystem-manager.contract.d.ts +42 -0
- package/dist/api/fs/contracts/filesystem-manager.contract.d.ts.map +1 -0
- package/dist/api/fs/contracts/filesystem-manager.contract.js +1 -0
- package/dist/api/fs/index.d.ts +5 -0
- package/dist/api/fs/index.d.ts.map +1 -0
- package/dist/api/fs/index.js +4 -0
- package/dist/api/index.d.ts +10 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +9 -0
- package/dist/api/tokens/index.d.ts +5 -0
- package/dist/api/tokens/index.d.ts.map +1 -0
- package/dist/api/tokens/index.js +4 -0
- package/dist/api/tokens/service-tokens.d.ts +10 -0
- package/dist/api/tokens/service-tokens.d.ts.map +1 -0
- package/dist/api/tokens/service-tokens.js +10 -0
- package/dist/api/types/extension-types.d.ts +32 -0
- package/dist/api/types/extension-types.d.ts.map +1 -0
- package/dist/api/types/extension-types.js +4 -0
- package/dist/api/types/index.d.ts +8 -0
- package/dist/api/types/index.d.ts.map +1 -0
- package/dist/api/types/index.js +7 -0
- package/dist/api/types/middleware-types.d.ts +31 -0
- package/dist/api/types/middleware-types.d.ts.map +1 -0
- package/dist/api/types/middleware-types.js +4 -0
- package/dist/api/types/reducer-types.d.ts +22 -0
- package/dist/api/types/reducer-types.d.ts.map +1 -0
- package/dist/api/types/reducer-types.js +4 -0
- package/dist/api/types/store-types.d.ts +49 -0
- package/dist/api/types/store-types.d.ts.map +1 -0
- package/dist/api/types/store-types.js +4 -0
- package/dist/impl/autosave/autosave-config-resolver.d.ts +45 -0
- package/dist/impl/autosave/autosave-config-resolver.d.ts.map +1 -0
- package/dist/impl/autosave/autosave-config-resolver.js +107 -0
- package/dist/impl/autosave/autosave-middleware.d.ts +37 -0
- package/dist/impl/autosave/autosave-middleware.d.ts.map +1 -0
- package/dist/impl/autosave/autosave-middleware.js +297 -0
- package/dist/impl/autosave/autosave-registry.d.ts +15 -0
- package/dist/impl/autosave/autosave-registry.d.ts.map +1 -0
- package/dist/impl/autosave/autosave-registry.js +38 -0
- package/dist/impl/autosave/autosave-sync-middleware.d.ts +24 -0
- package/dist/impl/autosave/autosave-sync-middleware.d.ts.map +1 -0
- package/dist/impl/autosave/autosave-sync-middleware.js +98 -0
- package/dist/impl/autosave/index.d.ts +8 -0
- package/dist/impl/autosave/index.d.ts.map +1 -0
- package/dist/impl/autosave/index.js +7 -0
- package/dist/impl/core/index.d.ts +4 -0
- package/dist/impl/core/index.d.ts.map +1 -0
- package/dist/impl/core/index.js +3 -0
- package/dist/impl/core/middleware-registry.d.ts +21 -0
- package/dist/impl/core/middleware-registry.d.ts.map +1 -0
- package/dist/impl/core/middleware-registry.js +60 -0
- package/dist/impl/core/reducer-registry.d.ts +18 -0
- package/dist/impl/core/reducer-registry.d.ts.map +1 -0
- package/dist/impl/core/reducer-registry.js +65 -0
- package/dist/impl/core/store-manager.d.ts +28 -0
- package/dist/impl/core/store-manager.d.ts.map +1 -0
- package/dist/impl/core/store-manager.js +129 -0
- package/dist/impl/extensions/store-extensions.d.ts +23 -0
- package/dist/impl/extensions/store-extensions.d.ts.map +1 -0
- package/dist/impl/extensions/store-extensions.js +66 -0
- package/dist/impl/fs/commands/fs-commands.d.ts +100 -0
- package/dist/impl/fs/commands/fs-commands.d.ts.map +1 -0
- package/dist/impl/fs/commands/fs-commands.js +338 -0
- package/dist/impl/fs/commands/structure-commands.d.ts +76 -0
- package/dist/impl/fs/commands/structure-commands.d.ts.map +1 -0
- package/dist/impl/fs/commands/structure-commands.js +21 -0
- package/dist/impl/fs/core/fs-adapter.d.ts +54 -0
- package/dist/impl/fs/core/fs-adapter.d.ts.map +1 -0
- package/dist/impl/fs/core/fs-adapter.js +204 -0
- package/dist/impl/fs/core/fs-facade.d.ts +37 -0
- package/dist/impl/fs/core/fs-facade.d.ts.map +1 -0
- package/dist/impl/fs/core/fs-facade.js +98 -0
- package/dist/impl/fs/index.d.ts +8 -0
- package/dist/impl/fs/index.d.ts.map +1 -0
- package/dist/impl/fs/index.js +11 -0
- package/dist/impl/fs/utils/data-updater.d.ts +36 -0
- package/dist/impl/fs/utils/data-updater.d.ts.map +1 -0
- package/dist/impl/fs/utils/data-updater.js +248 -0
- package/dist/impl/fs/utils/deep-equal.d.ts +5 -0
- package/dist/impl/fs/utils/deep-equal.d.ts.map +1 -0
- package/dist/impl/fs/utils/deep-equal.js +28 -0
- package/dist/impl/index.d.ts +12 -0
- package/dist/impl/index.d.ts.map +1 -0
- package/dist/impl/index.js +12 -0
- package/dist/impl/middleware/event-bridge-middleware.d.ts +7 -0
- package/dist/impl/middleware/event-bridge-middleware.d.ts.map +1 -0
- package/dist/impl/middleware/event-bridge-middleware.js +19 -0
- package/dist/impl/middleware/index.d.ts +6 -0
- package/dist/impl/middleware/index.d.ts.map +1 -0
- package/dist/impl/middleware/index.js +5 -0
- package/dist/impl/middleware/logger-middleware.d.ts +7 -0
- package/dist/impl/middleware/logger-middleware.d.ts.map +1 -0
- package/dist/impl/middleware/logger-middleware.js +18 -0
- package/dist/impl/plugin/index.d.ts +5 -0
- package/dist/impl/plugin/index.d.ts.map +1 -0
- package/dist/impl/plugin/index.js +4 -0
- package/dist/impl/plugin/store-plugin-factory.d.ts +15 -0
- package/dist/impl/plugin/store-plugin-factory.d.ts.map +1 -0
- package/dist/impl/plugin/store-plugin-factory.js +121 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/spi/autosave/i-autosave-provider.d.ts +98 -0
- package/dist/spi/autosave/i-autosave-provider.d.ts.map +1 -0
- package/dist/spi/autosave/i-autosave-provider.js +8 -0
- package/dist/spi/autosave/i-autosave-registry.d.ts +59 -0
- package/dist/spi/autosave/i-autosave-registry.d.ts.map +1 -0
- package/dist/spi/autosave/i-autosave-registry.js +8 -0
- package/dist/spi/autosave/index.d.ts +8 -0
- package/dist/spi/autosave/index.d.ts.map +1 -0
- package/dist/spi/autosave/index.js +7 -0
- package/dist/spi/index.d.ts +9 -0
- package/dist/spi/index.d.ts.map +1 -0
- package/dist/spi/index.js +9 -0
- package/dist/spi/middleware/index.d.ts +2 -0
- package/dist/spi/middleware/index.d.ts.map +1 -0
- package/dist/spi/middleware/index.js +1 -0
- package/dist/spi/middleware/middleware-provider.d.ts +9 -0
- package/dist/spi/middleware/middleware-provider.d.ts.map +1 -0
- package/dist/spi/middleware/middleware-provider.js +1 -0
- package/dist/spi/persistence/index.d.ts +2 -0
- package/dist/spi/persistence/index.d.ts.map +1 -0
- package/dist/spi/persistence/index.js +1 -0
- package/dist/spi/persistence/persistence-provider.d.ts +8 -0
- package/dist/spi/persistence/persistence-provider.d.ts.map +1 -0
- package/dist/spi/persistence/persistence-provider.js +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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,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
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 {};
|