@hamak/ui-store-impl 0.1.0

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 (48) hide show
  1. package/.turbo/turbo-build.log +1 -0
  2. package/dist/core/index.d.ts +4 -0
  3. package/dist/core/index.d.ts.map +1 -0
  4. package/dist/core/index.js +3 -0
  5. package/dist/core/middleware-registry.d.ts +21 -0
  6. package/dist/core/middleware-registry.d.ts.map +1 -0
  7. package/dist/core/middleware-registry.js +50 -0
  8. package/dist/core/reducer-registry.d.ts +18 -0
  9. package/dist/core/reducer-registry.d.ts.map +1 -0
  10. package/dist/core/reducer-registry.js +54 -0
  11. package/dist/core/store-manager.d.ts +26 -0
  12. package/dist/core/store-manager.d.ts.map +1 -0
  13. package/dist/core/store-manager.js +91 -0
  14. package/dist/index.d.ts +8 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +7 -0
  17. package/dist/middleware/event-bridge-middleware.d.ts +7 -0
  18. package/dist/middleware/event-bridge-middleware.d.ts.map +1 -0
  19. package/dist/middleware/event-bridge-middleware.js +19 -0
  20. package/dist/middleware/index.d.ts +6 -0
  21. package/dist/middleware/index.d.ts.map +1 -0
  22. package/dist/middleware/index.js +5 -0
  23. package/dist/middleware/logger-middleware.d.ts +7 -0
  24. package/dist/middleware/logger-middleware.d.ts.map +1 -0
  25. package/dist/middleware/logger-middleware.js +18 -0
  26. package/dist/plugin/index.d.ts +5 -0
  27. package/dist/plugin/index.d.ts.map +1 -0
  28. package/dist/plugin/index.js +4 -0
  29. package/dist/plugin/store-plugin-factory.d.ts +22 -0
  30. package/dist/plugin/store-plugin-factory.d.ts.map +1 -0
  31. package/dist/plugin/store-plugin-factory.js +81 -0
  32. package/package.json +43 -0
  33. package/src/core/index.ts +3 -0
  34. package/src/core/middleware-registry.test.ts +247 -0
  35. package/src/core/middleware-registry.ts +64 -0
  36. package/src/core/reducer-registry.test.ts +215 -0
  37. package/src/core/reducer-registry.ts +71 -0
  38. package/src/core/store-manager.test.ts +288 -0
  39. package/src/core/store-manager.ts +125 -0
  40. package/src/index.ts +8 -0
  41. package/src/middleware/event-bridge-middleware.test.ts +131 -0
  42. package/src/middleware/event-bridge-middleware.ts +26 -0
  43. package/src/middleware/index.ts +6 -0
  44. package/src/middleware/logger-middleware.test.ts +129 -0
  45. package/src/middleware/logger-middleware.ts +25 -0
  46. package/src/plugin/index.ts +5 -0
  47. package/src/plugin/store-plugin-factory.ts +124 -0
  48. package/tsconfig.json +19 -0
@@ -0,0 +1 @@
1
+ $ tsc -p tsconfig.json
@@ -0,0 +1,4 @@
1
+ export * from './store-manager';
2
+ export * from './middleware-registry';
3
+ export * from './reducer-registry';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './store-manager';
2
+ export * from './middleware-registry';
3
+ export * from './reducer-registry';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Middleware Registry Implementation
3
+ */
4
+ import type { Middleware } from 'redux';
5
+ import type { IMiddlewareRegistry, MiddlewareRegistration } from '@amk/ui-store-api';
6
+ export declare class MiddlewareRegistry implements IMiddlewareRegistry {
7
+ private registrations;
8
+ private locked;
9
+ register(registration: MiddlewareRegistration): void;
10
+ unregister(id: string): void;
11
+ getAll(): Middleware[];
12
+ has(id: string): boolean;
13
+ getInfo(id: string): MiddlewareRegistration | undefined;
14
+ getAllRegistrations(): MiddlewareRegistration[];
15
+ /**
16
+ * Lock the registry (called when store is created)
17
+ * @internal
18
+ */
19
+ lock(): void;
20
+ }
21
+ //# sourceMappingURL=middleware-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware-registry.d.ts","sourceRoot":"","sources":["../../src/core/middleware-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAErF,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,OAAO,CAAC,aAAa,CAA6C;IAClE,OAAO,CAAC,MAAM,CAAS;IAEvB,QAAQ,CAAC,YAAY,EAAE,sBAAsB,GAAG,IAAI;IAkBpD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO5B,MAAM,IAAI,UAAU,EAAE;IAOtB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS;IAIvD,mBAAmB,IAAI,sBAAsB,EAAE;IAK/C;;;OAGG;IACH,IAAI,IAAI,IAAI;CAGb"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Middleware Registry Implementation
3
+ */
4
+ export class MiddlewareRegistry {
5
+ constructor() {
6
+ this.registrations = new Map();
7
+ this.locked = false;
8
+ }
9
+ register(registration) {
10
+ if (this.locked) {
11
+ throw new Error(`Cannot register middleware "${registration.id}" - store already created. ` +
12
+ `Register middleware during plugin initialization phase.`);
13
+ }
14
+ if (this.registrations.has(registration.id)) {
15
+ console.warn(`[MiddlewareRegistry] Middleware "${registration.id}" already registered, overwriting.`);
16
+ }
17
+ this.registrations.set(registration.id, {
18
+ priority: 0,
19
+ ...registration,
20
+ });
21
+ }
22
+ unregister(id) {
23
+ if (this.locked) {
24
+ throw new Error(`Cannot unregister middleware after store creation`);
25
+ }
26
+ this.registrations.delete(id);
27
+ }
28
+ getAll() {
29
+ const sorted = Array.from(this.registrations.values())
30
+ .sort((a, b) => (b.priority || 0) - (a.priority || 0));
31
+ return sorted.map(reg => reg.middleware);
32
+ }
33
+ has(id) {
34
+ return this.registrations.has(id);
35
+ }
36
+ getInfo(id) {
37
+ return this.registrations.get(id);
38
+ }
39
+ getAllRegistrations() {
40
+ return Array.from(this.registrations.values())
41
+ .sort((a, b) => (b.priority || 0) - (a.priority || 0));
42
+ }
43
+ /**
44
+ * Lock the registry (called when store is created)
45
+ * @internal
46
+ */
47
+ lock() {
48
+ this.locked = true;
49
+ }
50
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Reducer Registry Implementation
3
+ */
4
+ import { type Reducer } from 'redux';
5
+ import type { IReducerRegistry, ReducerMap, ReducerRegistration } from '@amk/ui-store-api';
6
+ export declare class ReducerRegistry implements IReducerRegistry {
7
+ private reducers;
8
+ private onReducerChange?;
9
+ constructor(onReducerChange?: (rootReducer: Reducer) => void);
10
+ register(key: string, reducer: Reducer, replace?: boolean): void;
11
+ unregister(key: string): void;
12
+ getAll(): ReducerMap;
13
+ getCombinedReducer(): Reducer;
14
+ has(key: string): boolean;
15
+ getInfo(key: string): ReducerRegistration | undefined;
16
+ getAllRegistrations(): ReducerRegistration[];
17
+ }
18
+ //# sourceMappingURL=reducer-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reducer-registry.d.ts","sourceRoot":"","sources":["../../src/core/reducer-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE3F,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,eAAe,CAAC,CAAiC;gBAE7C,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI;IAI5D,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,UAAQ,GAAG,IAAI;IAkB9D,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ7B,MAAM,IAAI,UAAU;IAQpB,kBAAkB,IAAI,OAAO;IAU7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IAIrD,mBAAmB,IAAI,mBAAmB,EAAE;CAG7C"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Reducer Registry Implementation
3
+ */
4
+ import { combineReducers } from 'redux';
5
+ export class ReducerRegistry {
6
+ constructor(onReducerChange) {
7
+ this.reducers = new Map();
8
+ this.onReducerChange = onReducerChange;
9
+ }
10
+ register(key, reducer, replace = false) {
11
+ if (!replace && this.reducers.has(key)) {
12
+ console.warn(`[ReducerRegistry] Reducer "${key}" already registered. Use replace=true to override.`);
13
+ return;
14
+ }
15
+ this.reducers.set(key, {
16
+ key,
17
+ reducer,
18
+ registeredAt: new Date(),
19
+ });
20
+ // Notify about reducer change for hot replacement
21
+ if (this.onReducerChange) {
22
+ this.onReducerChange(this.getCombinedReducer());
23
+ }
24
+ }
25
+ unregister(key) {
26
+ this.reducers.delete(key);
27
+ if (this.onReducerChange) {
28
+ this.onReducerChange(this.getCombinedReducer());
29
+ }
30
+ }
31
+ getAll() {
32
+ const map = {};
33
+ this.reducers.forEach((registration, key) => {
34
+ map[key] = registration.reducer;
35
+ });
36
+ return map;
37
+ }
38
+ getCombinedReducer() {
39
+ const reducerMap = this.getAll();
40
+ if (Object.keys(reducerMap).length === 0) {
41
+ return (state = {}) => state;
42
+ }
43
+ return combineReducers(reducerMap);
44
+ }
45
+ has(key) {
46
+ return this.reducers.has(key);
47
+ }
48
+ getInfo(key) {
49
+ return this.reducers.get(key);
50
+ }
51
+ getAllRegistrations() {
52
+ return Array.from(this.reducers.values());
53
+ }
54
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Store Manager Implementation
3
+ */
4
+ import { type Store, type Reducer } from 'redux';
5
+ import type { IStoreManager, StoreConfig, RootState, AppAction } from '@amk/ui-store-api';
6
+ import { MiddlewareRegistry } from './middleware-registry';
7
+ import { ReducerRegistry } from './reducer-registry';
8
+ export declare class StoreManager implements IStoreManager {
9
+ private store;
10
+ private middlewareRegistry;
11
+ private reducerRegistry;
12
+ private initialized;
13
+ private config;
14
+ constructor();
15
+ getMiddlewareRegistry(): MiddlewareRegistry;
16
+ getReducerRegistry(): ReducerRegistry;
17
+ isInitialized(): boolean;
18
+ initialize(config?: StoreConfig): Store<RootState, AppAction>;
19
+ getStore(): Store<RootState, AppAction>;
20
+ dispatch<A extends AppAction>(action: A): A;
21
+ getState<S = RootState>(): S;
22
+ subscribe(listener: () => void): () => void;
23
+ replaceReducer(nextReducer: Reducer<RootState, AppAction>): void;
24
+ destroy(): void;
25
+ }
26
+ //# sourceMappingURL=store-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-manager.d.ts","sourceRoot":"","sources":["../../src/core/store-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAyC,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAA4B;;IAY1C,qBAAqB;IAIrB,kBAAkB;IAIlB,aAAa,IAAI,OAAO;IAIxB,UAAU,CAAC,MAAM,GAAE,WAAgB,GAAG,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC;IA0DjE,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC;IAOvC,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC;IAI3C,QAAQ,CAAC,CAAC,GAAG,SAAS,KAAK,CAAC;IAI5B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAI3C,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI;IAIhE,OAAO,IAAI,IAAI;CAKhB"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Store Manager Implementation
3
+ */
4
+ import { createStore, applyMiddleware, compose } from 'redux';
5
+ import { MiddlewareRegistry } from './middleware-registry';
6
+ import { ReducerRegistry } from './reducer-registry';
7
+ export class StoreManager {
8
+ constructor() {
9
+ this.store = null;
10
+ this.initialized = false;
11
+ this.config = null;
12
+ this.middlewareRegistry = new MiddlewareRegistry();
13
+ this.reducerRegistry = new ReducerRegistry((rootReducer) => {
14
+ // Hot replacement callback
15
+ if (this.store) {
16
+ this.store.replaceReducer(rootReducer);
17
+ }
18
+ });
19
+ }
20
+ getMiddlewareRegistry() {
21
+ return this.middlewareRegistry;
22
+ }
23
+ getReducerRegistry() {
24
+ return this.reducerRegistry;
25
+ }
26
+ isInitialized() {
27
+ return this.initialized;
28
+ }
29
+ initialize(config = {}) {
30
+ if (this.initialized) {
31
+ throw new Error('[StoreManager] Store already initialized');
32
+ }
33
+ this.config = config;
34
+ // Get all middleware in priority order
35
+ const middleware = this.middlewareRegistry.getAll();
36
+ // Lock the middleware registry
37
+ this.middlewareRegistry.lock();
38
+ // Get combined reducer
39
+ const rootReducer = this.reducerRegistry.getCombinedReducer();
40
+ // Create enhancers
41
+ const enhancers = config.enhancers || [];
42
+ // Setup Redux DevTools
43
+ let composeEnhancers = compose;
44
+ if (config.devTools !== false && typeof window !== 'undefined') {
45
+ const devToolsExtension = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__;
46
+ if (devToolsExtension) {
47
+ composeEnhancers = devToolsExtension({
48
+ trace: true,
49
+ traceLimit: 25,
50
+ });
51
+ }
52
+ }
53
+ // Create store
54
+ const enhancer = composeEnhancers(applyMiddleware(...middleware), ...enhancers);
55
+ this.store = createStore(rootReducer, config.preloadedState, enhancer);
56
+ this.initialized = true;
57
+ console.log('[StoreManager] Store initialized with:', {
58
+ reducers: this.reducerRegistry.getAllRegistrations().map(r => r.key),
59
+ middleware: this.middlewareRegistry.getAllRegistrations().map(m => ({
60
+ id: m.id,
61
+ priority: m.priority,
62
+ plugin: m.plugin,
63
+ })),
64
+ devTools: config.devTools !== false,
65
+ });
66
+ return this.store;
67
+ }
68
+ getStore() {
69
+ if (!this.store) {
70
+ throw new Error('[StoreManager] Store not initialized. Call initialize() first.');
71
+ }
72
+ return this.store;
73
+ }
74
+ dispatch(action) {
75
+ return this.getStore().dispatch(action);
76
+ }
77
+ getState() {
78
+ return this.getStore().getState();
79
+ }
80
+ subscribe(listener) {
81
+ return this.getStore().subscribe(listener);
82
+ }
83
+ replaceReducer(nextReducer) {
84
+ this.getStore().replaceReducer(nextReducer);
85
+ }
86
+ destroy() {
87
+ this.store = null;
88
+ this.initialized = false;
89
+ console.log('[StoreManager] Store destroyed');
90
+ }
91
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * UI Store Implementation
3
+ * Concrete implementations of Redux store management
4
+ */
5
+ export * from './core';
6
+ export * from './middleware';
7
+ export * from './plugin';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * UI Store Implementation
3
+ * Concrete implementations of Redux store management
4
+ */
5
+ export * from './core';
6
+ export * from './middleware';
7
+ export * from './plugin';
@@ -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/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/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/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/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,22 @@
1
+ /**
2
+ * Store Plugin Factory
3
+ * Creates a microkernel plugin for Redux store management
4
+ */
5
+ import type { PluginModule } from '@amk/microkernel-spi';
6
+ import type { Reducer } from 'redux';
7
+ export interface StorePluginConfig {
8
+ /** Enable Redux DevTools integration */
9
+ devTools?: boolean;
10
+ /** Enable logger middleware in development */
11
+ logger?: boolean;
12
+ /** Initial middleware to register */
13
+ middleware?: Array<{
14
+ id: string;
15
+ middleware: any;
16
+ priority?: number;
17
+ }>;
18
+ /** Initial reducers to register */
19
+ reducers?: Record<string, Reducer>;
20
+ }
21
+ export declare function createStorePlugin(config?: StorePluginConfig): PluginModule;
22
+ //# sourceMappingURL=store-plugin-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-plugin-factory.d.ts","sourceRoot":"","sources":["../../src/plugin/store-plugin-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAYrC,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,qCAAqC;IACrC,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,GAAG,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IAEH,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,GAAE,iBAAsB,GAC7B,YAAY,CAqFd"}
@@ -0,0 +1,81 @@
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, } from '@amk/ui-store-api';
6
+ import { StoreManager } from '../core/store-manager';
7
+ import { createEventBridgeMiddleware, createLoggerMiddleware, } from '../middleware';
8
+ export function createStorePlugin(config = {}) {
9
+ const storeManager = new StoreManager();
10
+ const middlewareRegistry = storeManager.getMiddlewareRegistry();
11
+ const reducerRegistry = storeManager.getReducerRegistry();
12
+ return {
13
+ async initialize(ctx) {
14
+ // Register services via DI
15
+ ctx.provide({ provide: STORE_MANAGER_TOKEN, useValue: storeManager });
16
+ ctx.provide({
17
+ provide: MIDDLEWARE_REGISTRY_TOKEN,
18
+ useValue: middlewareRegistry,
19
+ });
20
+ ctx.provide({
21
+ provide: REDUCER_REGISTRY_TOKEN,
22
+ useValue: reducerRegistry,
23
+ });
24
+ // Register event bridge middleware (high priority)
25
+ middlewareRegistry.register({
26
+ id: 'event-bridge',
27
+ middleware: createEventBridgeMiddleware(ctx.hooks),
28
+ priority: 1000,
29
+ plugin: 'ui-store',
30
+ description: 'Bridges Redux actions to microkernel events',
31
+ });
32
+ // Register logger middleware in development (low priority - runs last)
33
+ if (config.logger !== false &&
34
+ process.env.NODE_ENV === 'development') {
35
+ middlewareRegistry.register({
36
+ id: 'logger',
37
+ middleware: createLoggerMiddleware(),
38
+ priority: -1000,
39
+ plugin: 'ui-store',
40
+ description: 'Development logger',
41
+ });
42
+ }
43
+ // Register user-provided middleware
44
+ config.middleware?.forEach((mw) => {
45
+ middlewareRegistry.register({
46
+ ...mw,
47
+ plugin: 'ui-store-config',
48
+ });
49
+ });
50
+ // Register user-provided reducers
51
+ if (config.reducers) {
52
+ console.log('[ui-store] Registering reducers:', Object.keys(config.reducers));
53
+ Object.entries(config.reducers).forEach(([key, reducer]) => {
54
+ reducerRegistry.register(key, reducer);
55
+ console.log('[ui-store] Registered reducer:', key);
56
+ });
57
+ }
58
+ else {
59
+ console.log('[ui-store] No reducers provided in config');
60
+ }
61
+ console.log('[ui-store] Plugin initialized');
62
+ },
63
+ async activate(ctx) {
64
+ // Initialize the store after all plugins have registered middleware/reducers
65
+ const store = storeManager.initialize({
66
+ devTools: config.devTools,
67
+ });
68
+ // Bridge Redux state changes to microkernel events
69
+ store.subscribe(() => {
70
+ ctx.hooks.emit('redux:state-changed', store.getState());
71
+ });
72
+ // Emit ready event
73
+ ctx.hooks.emit('ui-store:ready', { store });
74
+ console.log('[ui-store] Plugin activated');
75
+ },
76
+ async deactivate() {
77
+ storeManager.destroy();
78
+ console.log('[ui-store] Plugin deactivated');
79
+ },
80
+ };
81
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@hamak/ui-store-impl",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "UI Store Implementation - Redux store implementation with middleware",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "sideEffects": false,
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/amah/app-framework.git",
13
+ "directory": "packages/ui-store/ui-store-impl"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "clean": "rm -rf dist",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest"
23
+ },
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js"
28
+ }
29
+ },
30
+ "dependencies": {
31
+ "@hamak/ui-store-api": "0.1.0",
32
+ "@hamak/ui-store-spi": "0.1.0",
33
+ "@hamak/microkernel-api": "0.1.0",
34
+ "@hamak/microkernel-spi": "0.1.0",
35
+ "redux": "^5.0.1",
36
+ "redux-thunk": "^3.1.0"
37
+ },
38
+ "devDependencies": {
39
+ "typescript": "~5.4.0",
40
+ "vitest": "^2.0.0",
41
+ "@types/node": "^20.0.0"
42
+ }
43
+ }
@@ -0,0 +1,3 @@
1
+ export * from './store-manager';
2
+ export * from './middleware-registry';
3
+ export * from './reducer-registry';