@engjts/nexus 0.1.8 → 0.1.9

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 (205) hide show
  1. package/package.json +1 -1
  2. package/BENCHMARK_REPORT.md +0 -343
  3. package/documentation/01-getting-started.md +0 -240
  4. package/documentation/02-context.md +0 -335
  5. package/documentation/03-routing.md +0 -397
  6. package/documentation/04-middleware.md +0 -483
  7. package/documentation/05-validation.md +0 -514
  8. package/documentation/06-error-handling.md +0 -465
  9. package/documentation/07-performance.md +0 -364
  10. package/documentation/08-adapters.md +0 -470
  11. package/documentation/09-api-reference.md +0 -548
  12. package/documentation/10-examples.md +0 -582
  13. package/documentation/11-deployment.md +0 -477
  14. package/documentation/12-sentry.md +0 -620
  15. package/documentation/13-sentry-data-storage.md +0 -996
  16. package/documentation/14-sentry-data-reference.md +0 -457
  17. package/documentation/15-sentry-summary.md +0 -409
  18. package/documentation/16-alerts-system.md +0 -745
  19. package/documentation/17-alert-adapters.md +0 -696
  20. package/documentation/18-alerts-implementation-summary.md +0 -385
  21. package/documentation/19-class-based-routing.md +0 -840
  22. package/documentation/20-websocket-realtime.md +0 -813
  23. package/documentation/21-cache-system.md +0 -510
  24. package/documentation/22-job-queue.md +0 -772
  25. package/documentation/23-sentry-plugin.md +0 -551
  26. package/documentation/24-testing-utilities.md +0 -1287
  27. package/documentation/25-api-versioning.md +0 -533
  28. package/documentation/26-context-store.md +0 -607
  29. package/documentation/27-dependency-injection.md +0 -329
  30. package/documentation/28-lifecycle-hooks.md +0 -521
  31. package/documentation/29-package-structure.md +0 -196
  32. package/documentation/30-plugin-system.md +0 -414
  33. package/documentation/31-jwt-authentication.md +0 -597
  34. package/documentation/32-cli.md +0 -268
  35. package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
  36. package/documentation/ALERTS-INDEX.md +0 -330
  37. package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
  38. package/documentation/README.md +0 -178
  39. package/documentation/index.html +0 -34
  40. package/modern_framework_paper.md +0 -1870
  41. package/public/css/style.css +0 -87
  42. package/public/index.html +0 -34
  43. package/public/js/app.js +0 -27
  44. package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
  45. package/src/advanced/cache/MultiTierCache.ts +0 -194
  46. package/src/advanced/cache/RedisCacheStore.ts +0 -341
  47. package/src/advanced/cache/index.ts +0 -5
  48. package/src/advanced/cache/types.ts +0 -40
  49. package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
  50. package/src/advanced/graphql/index.ts +0 -22
  51. package/src/advanced/graphql/server.ts +0 -252
  52. package/src/advanced/graphql/types.ts +0 -42
  53. package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
  54. package/src/advanced/jobs/JobQueue.ts +0 -556
  55. package/src/advanced/jobs/RedisQueueStore.ts +0 -367
  56. package/src/advanced/jobs/index.ts +0 -5
  57. package/src/advanced/jobs/types.ts +0 -70
  58. package/src/advanced/observability/APMManager.ts +0 -163
  59. package/src/advanced/observability/AlertManager.ts +0 -109
  60. package/src/advanced/observability/MetricRegistry.ts +0 -151
  61. package/src/advanced/observability/ObservabilityCenter.ts +0 -304
  62. package/src/advanced/observability/StructuredLogger.ts +0 -154
  63. package/src/advanced/observability/TracingManager.ts +0 -117
  64. package/src/advanced/observability/adapters.ts +0 -304
  65. package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
  66. package/src/advanced/observability/index.ts +0 -11
  67. package/src/advanced/observability/types.ts +0 -174
  68. package/src/advanced/playground/extractPathParams.ts +0 -6
  69. package/src/advanced/playground/generateFieldExample.ts +0 -31
  70. package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1956
  71. package/src/advanced/playground/generateSummary.ts +0 -19
  72. package/src/advanced/playground/getTagFromPath.ts +0 -9
  73. package/src/advanced/playground/index.ts +0 -8
  74. package/src/advanced/playground/playground.ts +0 -250
  75. package/src/advanced/playground/types.ts +0 -49
  76. package/src/advanced/playground/zodToExample.ts +0 -16
  77. package/src/advanced/playground/zodToParams.ts +0 -15
  78. package/src/advanced/postman/buildAuth.ts +0 -31
  79. package/src/advanced/postman/buildBody.ts +0 -15
  80. package/src/advanced/postman/buildQueryParams.ts +0 -27
  81. package/src/advanced/postman/buildRequestItem.ts +0 -36
  82. package/src/advanced/postman/buildResponses.ts +0 -11
  83. package/src/advanced/postman/buildUrl.ts +0 -33
  84. package/src/advanced/postman/capitalize.ts +0 -4
  85. package/src/advanced/postman/generateCollection.ts +0 -59
  86. package/src/advanced/postman/generateEnvironment.ts +0 -34
  87. package/src/advanced/postman/generateExampleFromZod.ts +0 -21
  88. package/src/advanced/postman/generateFieldExample.ts +0 -45
  89. package/src/advanced/postman/generateName.ts +0 -20
  90. package/src/advanced/postman/generateUUID.ts +0 -11
  91. package/src/advanced/postman/getTagFromPath.ts +0 -10
  92. package/src/advanced/postman/index.ts +0 -28
  93. package/src/advanced/postman/postman.ts +0 -156
  94. package/src/advanced/postman/slugify.ts +0 -7
  95. package/src/advanced/postman/types.ts +0 -140
  96. package/src/advanced/realtime/index.ts +0 -18
  97. package/src/advanced/realtime/websocket.ts +0 -231
  98. package/src/advanced/sentry/index.ts +0 -1236
  99. package/src/advanced/sentry/types.ts +0 -355
  100. package/src/advanced/static/generateDirectoryListing.ts +0 -47
  101. package/src/advanced/static/generateETag.ts +0 -7
  102. package/src/advanced/static/getMimeType.ts +0 -9
  103. package/src/advanced/static/index.ts +0 -32
  104. package/src/advanced/static/isSafePath.ts +0 -13
  105. package/src/advanced/static/publicDir.ts +0 -21
  106. package/src/advanced/static/serveStatic.ts +0 -225
  107. package/src/advanced/static/spa.ts +0 -24
  108. package/src/advanced/static/types.ts +0 -159
  109. package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
  110. package/src/advanced/swagger/buildOperation.ts +0 -61
  111. package/src/advanced/swagger/buildParameters.ts +0 -61
  112. package/src/advanced/swagger/buildRequestBody.ts +0 -21
  113. package/src/advanced/swagger/buildResponses.ts +0 -54
  114. package/src/advanced/swagger/capitalize.ts +0 -5
  115. package/src/advanced/swagger/convertPath.ts +0 -9
  116. package/src/advanced/swagger/createSwagger.ts +0 -12
  117. package/src/advanced/swagger/generateOperationId.ts +0 -21
  118. package/src/advanced/swagger/generateSpec.ts +0 -105
  119. package/src/advanced/swagger/generateSummary.ts +0 -24
  120. package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
  121. package/src/advanced/swagger/generateThemeCss.ts +0 -53
  122. package/src/advanced/swagger/index.ts +0 -25
  123. package/src/advanced/swagger/swagger.ts +0 -237
  124. package/src/advanced/swagger/types.ts +0 -206
  125. package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
  126. package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
  127. package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
  128. package/src/advanced/testing/factory.ts +0 -509
  129. package/src/advanced/testing/harness.ts +0 -612
  130. package/src/advanced/testing/index.ts +0 -430
  131. package/src/advanced/testing/load-test.ts +0 -618
  132. package/src/advanced/testing/mock-server.ts +0 -498
  133. package/src/advanced/testing/mock.ts +0 -670
  134. package/src/cli/bin.ts +0 -9
  135. package/src/cli/cli.ts +0 -158
  136. package/src/cli/commands/add.ts +0 -178
  137. package/src/cli/commands/build.ts +0 -73
  138. package/src/cli/commands/create.ts +0 -166
  139. package/src/cli/commands/dev.ts +0 -85
  140. package/src/cli/commands/generate.ts +0 -99
  141. package/src/cli/commands/help.ts +0 -95
  142. package/src/cli/commands/init.ts +0 -91
  143. package/src/cli/commands/version.ts +0 -38
  144. package/src/cli/index.ts +0 -6
  145. package/src/cli/templates/generators.ts +0 -359
  146. package/src/cli/templates/index.ts +0 -680
  147. package/src/cli/utils/exec.ts +0 -52
  148. package/src/cli/utils/file-system.ts +0 -78
  149. package/src/cli/utils/logger.ts +0 -111
  150. package/src/core/adapter.ts +0 -88
  151. package/src/core/application.ts +0 -1453
  152. package/src/core/context-pool.ts +0 -79
  153. package/src/core/context.ts +0 -856
  154. package/src/core/index.ts +0 -94
  155. package/src/core/middleware.ts +0 -272
  156. package/src/core/performance/buffer-pool.ts +0 -108
  157. package/src/core/performance/middleware-optimizer.ts +0 -162
  158. package/src/core/plugin/PluginManager.ts +0 -435
  159. package/src/core/plugin/builder.ts +0 -358
  160. package/src/core/plugin/index.ts +0 -50
  161. package/src/core/plugin/types.ts +0 -214
  162. package/src/core/router/file-router.ts +0 -623
  163. package/src/core/router/index.ts +0 -260
  164. package/src/core/router/radix-tree.ts +0 -242
  165. package/src/core/serializer.ts +0 -397
  166. package/src/core/store/index.ts +0 -30
  167. package/src/core/store/registry.ts +0 -178
  168. package/src/core/store/request-store.ts +0 -240
  169. package/src/core/store/types.ts +0 -233
  170. package/src/core/types.ts +0 -616
  171. package/src/database/adapter.ts +0 -35
  172. package/src/database/adapters/index.ts +0 -1
  173. package/src/database/adapters/mysql.ts +0 -669
  174. package/src/database/database.ts +0 -70
  175. package/src/database/dialect.ts +0 -388
  176. package/src/database/index.ts +0 -12
  177. package/src/database/migrations.ts +0 -86
  178. package/src/database/optimizer.ts +0 -125
  179. package/src/database/query-builder.ts +0 -404
  180. package/src/database/realtime.ts +0 -53
  181. package/src/database/schema.ts +0 -71
  182. package/src/database/transactions.ts +0 -56
  183. package/src/database/types.ts +0 -87
  184. package/src/deployment/cluster.ts +0 -471
  185. package/src/deployment/config.ts +0 -454
  186. package/src/deployment/docker.ts +0 -599
  187. package/src/deployment/graceful-shutdown.ts +0 -373
  188. package/src/deployment/index.ts +0 -56
  189. package/src/index.ts +0 -281
  190. package/src/security/adapter.ts +0 -318
  191. package/src/security/auth/JWTPlugin.ts +0 -234
  192. package/src/security/auth/JWTProvider.ts +0 -316
  193. package/src/security/auth/adapter.ts +0 -12
  194. package/src/security/auth/jwt.ts +0 -234
  195. package/src/security/auth/middleware.ts +0 -188
  196. package/src/security/csrf.ts +0 -220
  197. package/src/security/headers.ts +0 -108
  198. package/src/security/index.ts +0 -60
  199. package/src/security/rate-limit/adapter.ts +0 -7
  200. package/src/security/rate-limit/memory.ts +0 -108
  201. package/src/security/rate-limit/middleware.ts +0 -181
  202. package/src/security/sanitization.ts +0 -75
  203. package/src/security/types.ts +0 -240
  204. package/src/security/utils.ts +0 -52
  205. package/tsconfig.json +0 -39
@@ -1,240 +0,0 @@
1
- /**
2
- * RequestStore - Per-request state management
3
- * State hanya bertahan selama satu request lifecycle
4
- *
5
- * Berbeda dengan ContextStore (global/singleton),
6
- * RequestStore di-create fresh untuk setiap request
7
- */
8
-
9
- import { StoreListener, DisposeCallback, StoreOptions } from './types';
10
-
11
- /**
12
- * RequestStore constructor type
13
- */
14
- export type RequestStoreConstructor<T extends RequestStore<any>> = new (...args: any[]) => T;
15
-
16
- /**
17
- * Extract state type from RequestStore
18
- */
19
- export type RequestStateOf<T> = T extends RequestStore<infer S> ? S : never;
20
-
21
- /**
22
- * RequestStore - Per-request scoped state
23
- *
24
- * State hanya berlaku untuk satu request.
25
- * Setiap request baru akan mendapat instance baru.
26
- *
27
- * @example
28
- * ```typescript
29
- * interface CheckoutState {
30
- * items: CartItem[];
31
- * total: number;
32
- * discount: number;
33
- * validated: boolean;
34
- * }
35
- *
36
- * class CheckoutStore extends RequestStore<CheckoutState> {
37
- * protected initial(): CheckoutState {
38
- * return { items: [], total: 0, discount: 0, validated: false };
39
- * }
40
- *
41
- * addItem(item: CartItem) {
42
- * const items = [...this.state.items, item];
43
- * const total = items.reduce((sum, i) => sum + i.price, 0);
44
- * this.set({ ...this.state, items, total });
45
- * }
46
- *
47
- * applyDiscount(percent: number) {
48
- * const discount = this.state.total * (percent / 100);
49
- * this.update({ discount });
50
- * }
51
- *
52
- * validate() {
53
- * this.update({ validated: true });
54
- * }
55
- * }
56
- * ```
57
- */
58
- export abstract class RequestStore<T = any> {
59
- private _state: T;
60
- private _listeners: Set<StoreListener<T>> = new Set();
61
- private _options: StoreOptions;
62
- private _requestId: string;
63
-
64
- constructor(options: StoreOptions = {}) {
65
- this._options = options;
66
- this._state = this.initial();
67
- this._requestId = this.generateRequestId();
68
- }
69
-
70
- /**
71
- * Generate unique request ID
72
- */
73
- private generateRequestId(): string {
74
- return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
75
- }
76
-
77
- /**
78
- * Define initial state (wajib implement)
79
- */
80
- protected abstract initial(): T;
81
-
82
- /**
83
- * Get current state (readonly)
84
- */
85
- get state(): Readonly<T> {
86
- return this._state;
87
- }
88
-
89
- /**
90
- * Get store name
91
- */
92
- get name(): string {
93
- return this._options.name || this.constructor.name;
94
- }
95
-
96
- /**
97
- * Get request ID (unique per request)
98
- */
99
- get requestId(): string {
100
- return this._requestId;
101
- }
102
-
103
- /**
104
- * Get listener count
105
- */
106
- get listenerCount(): number {
107
- return this._listeners.size;
108
- }
109
-
110
- /**
111
- * Set state (replace entirely)
112
- */
113
- protected set(newState: T): void {
114
- const prevState = this._state;
115
- this._state = newState;
116
-
117
- if (this._options.debug) {
118
- console.log(`[RequestStore:${this.name}:${this._requestId}] State updated:`, {
119
- prev: prevState,
120
- next: newState
121
- });
122
- }
123
-
124
- // Notify listeners
125
- this._listeners.forEach(listener => {
126
- try {
127
- listener(this._state, prevState);
128
- } catch (error) {
129
- console.error(`[RequestStore:${this.name}] Listener error:`, error);
130
- }
131
- });
132
- }
133
-
134
- /**
135
- * Update state partially (merge)
136
- */
137
- protected update(partial: Partial<T>): void {
138
- if (typeof this._state === 'object' && this._state !== null) {
139
- this.set({ ...this._state, ...partial } as T);
140
- } else {
141
- throw new Error(`[RequestStore:${this.name}] update() only works with object state`);
142
- }
143
- }
144
-
145
- /**
146
- * Listen to state changes
147
- */
148
- listen(listener: StoreListener<T>): DisposeCallback {
149
- this._listeners.add(listener);
150
- return () => this._listeners.delete(listener);
151
- }
152
-
153
- /**
154
- * Reset to initial state
155
- */
156
- reset(): void {
157
- this.set(this.initial());
158
- }
159
-
160
- /**
161
- * Dispose store (cleanup)
162
- */
163
- dispose(): void {
164
- if (this._options.debug) {
165
- console.log(`[RequestStore:${this.name}:${this._requestId}] Disposed`);
166
- }
167
- this._listeners.clear();
168
- this.onDispose();
169
- }
170
-
171
- /**
172
- * Lifecycle: called on dispose
173
- */
174
- protected onDispose(): void {
175
- // Override if needed
176
- }
177
- }
178
-
179
- /**
180
- * RequestStoreRegistry - Manages stores for a single request
181
- * Created fresh for each request, disposed after response
182
- */
183
- export class RequestStoreRegistry {
184
- private stores: Map<RequestStoreConstructor<any>, RequestStore<any>> = new Map();
185
- private debug: boolean;
186
-
187
- constructor(debug: boolean = false) {
188
- this.debug = debug;
189
- }
190
-
191
- /**
192
- * Get or create a RequestStore for this request
193
- */
194
- get<T extends RequestStore<any>>(StoreClass: RequestStoreConstructor<T>): T {
195
- if (!this.stores.has(StoreClass)) {
196
- const instance = new StoreClass({ debug: this.debug });
197
- this.stores.set(StoreClass, instance);
198
-
199
- if (this.debug) {
200
- console.log(`[RequestStoreRegistry] Created: ${StoreClass.name}`);
201
- }
202
- }
203
- return this.stores.get(StoreClass) as T;
204
- }
205
-
206
- /**
207
- * Check if store exists
208
- */
209
- has<T extends RequestStore<any>>(StoreClass: RequestStoreConstructor<T>): boolean {
210
- return this.stores.has(StoreClass);
211
- }
212
-
213
- /**
214
- * Get all stores
215
- */
216
- getAll(): RequestStore<any>[] {
217
- return Array.from(this.stores.values());
218
- }
219
-
220
- /**
221
- * Dispose all stores (call at end of request)
222
- */
223
- dispose(): void {
224
- this.stores.forEach((store) => {
225
- try {
226
- store.dispose();
227
- } catch (error) {
228
- console.error(`[RequestStoreRegistry] Dispose error:`, error);
229
- }
230
- });
231
- this.stores.clear();
232
- }
233
-
234
- /**
235
- * Get store count
236
- */
237
- get size(): number {
238
- return this.stores.size;
239
- }
240
- }
@@ -1,233 +0,0 @@
1
- /**
2
- * ContextStore Types
3
- * State management system inspired by Flutter's Provider pattern
4
- */
5
-
6
- /**
7
- * Listener callback type
8
- */
9
- export type StoreListener<T> = (state: T, prevState: T) => void;
10
-
11
- /**
12
- * Dispose callback for cleanup
13
- */
14
- export type DisposeCallback = () => void;
15
-
16
- /**
17
- * Store constructor type for type-safe store access
18
- */
19
- export type StoreConstructor<T extends ContextStore<any>> = new (...args: any[]) => T;
20
-
21
- /**
22
- * Extract state type from store
23
- */
24
- export type StateOf<T> = T extends ContextStore<infer S> ? S : never;
25
-
26
- /**
27
- * Store options
28
- */
29
- export interface StoreOptions {
30
- /** Enable debug logging */
31
- debug?: boolean;
32
- /** Store name for debugging */
33
- name?: string;
34
- }
35
-
36
- /**
37
- * Store registry options
38
- */
39
- export interface StoreRegistryOptions {
40
- /** Enable debug logging */
41
- debug?: boolean;
42
- }
43
-
44
- /**
45
- * Base abstract class for ContextStore
46
- * Extend this class to create your own stores
47
- *
48
- * @example
49
- * ```typescript
50
- * interface UserState {
51
- * users: User[];
52
- * loading: boolean;
53
- * }
54
- *
55
- * class UserStore extends ContextStore<UserState> {
56
- * protected initial(): UserState {
57
- * return { users: [], loading: false };
58
- * }
59
- *
60
- * async fetchUsers() {
61
- * this.set({ ...this.state, loading: true });
62
- * const users = await api.getUsers();
63
- * this.set({ users, loading: false });
64
- * }
65
- * }
66
- * ```
67
- */
68
- export abstract class ContextStore<T = any> {
69
- private _state: T;
70
- private _listeners: Set<StoreListener<T>> = new Set();
71
- private _disposeCallbacks: DisposeCallback[] = [];
72
- private _options: StoreOptions;
73
- private _initialized: boolean = false;
74
-
75
- constructor(options: StoreOptions = {}) {
76
- this._options = options;
77
- this._state = this.initial();
78
- this._initialized = true;
79
- }
80
-
81
- /**
82
- * Define the initial state
83
- * Must be implemented by subclasses
84
- */
85
- protected abstract initial(): T;
86
-
87
- /**
88
- * Get current state (readonly)
89
- */
90
- get state(): Readonly<T> {
91
- return this._state;
92
- }
93
-
94
- /**
95
- * Get store name for debugging
96
- */
97
- get name(): string {
98
- return this._options.name || this.constructor.name;
99
- }
100
-
101
- /**
102
- * Update state and notify all listeners
103
- *
104
- * @param newState - New state or partial state update
105
- */
106
- protected set(newState: T): void {
107
- const prevState = this._state;
108
- this._state = newState;
109
-
110
- if (this._options.debug) {
111
- console.log(`[ContextStore:${this.name}] State updated:`, {
112
- prev: prevState,
113
- next: newState
114
- });
115
- }
116
-
117
- // Notify all listeners
118
- this._listeners.forEach(listener => {
119
- try {
120
- listener(this._state, prevState);
121
- } catch (error) {
122
- console.error(`[ContextStore:${this.name}] Listener error:`, error);
123
- }
124
- });
125
- }
126
-
127
- /**
128
- * Update state partially (merge with current state)
129
- * Only works if state is an object
130
- *
131
- * @param partial - Partial state to merge
132
- */
133
- protected update(partial: Partial<T>): void {
134
- if (typeof this._state === 'object' && this._state !== null) {
135
- this.set({ ...this._state, ...partial } as T);
136
- } else {
137
- throw new Error(`[ContextStore:${this.name}] update() only works with object state`);
138
- }
139
- }
140
-
141
- /**
142
- * Listen to state changes
143
- * Returns unsubscribe function
144
- *
145
- * @param listener - Callback function called on state change
146
- * @returns Unsubscribe function
147
- *
148
- * @example
149
- * ```typescript
150
- * const unsubscribe = store.listen((state, prevState) => {
151
- * console.log('State changed:', state);
152
- * });
153
- *
154
- * // Later: cleanup
155
- * unsubscribe();
156
- * ```
157
- */
158
- listen(listener: StoreListener<T>): DisposeCallback {
159
- this._listeners.add(listener);
160
-
161
- const unsubscribe = () => {
162
- this._listeners.delete(listener);
163
- };
164
-
165
- // Track for auto-dispose
166
- this._disposeCallbacks.push(unsubscribe);
167
-
168
- return unsubscribe;
169
- }
170
-
171
- /**
172
- * Get listener count (useful for debugging)
173
- */
174
- get listenerCount(): number {
175
- return this._listeners.size;
176
- }
177
-
178
- /**
179
- * Check if store is initialized
180
- */
181
- get isInitialized(): boolean {
182
- return this._initialized;
183
- }
184
-
185
- /**
186
- * Reset state to initial value
187
- */
188
- reset(): void {
189
- this.set(this.initial());
190
- }
191
-
192
- /**
193
- * Dispose store and cleanup all listeners
194
- * Called automatically when store is removed from registry
195
- */
196
- dispose(): void {
197
- if (this._options.debug) {
198
- console.log(`[ContextStore:${this.name}] Disposing...`);
199
- }
200
-
201
- // Clear all listeners
202
- this._listeners.clear();
203
-
204
- // Call all dispose callbacks
205
- this._disposeCallbacks.forEach(cb => {
206
- try {
207
- cb();
208
- } catch (error) {
209
- console.error(`[ContextStore:${this.name}] Dispose callback error:`, error);
210
- }
211
- });
212
- this._disposeCallbacks = [];
213
-
214
- // Call lifecycle hook
215
- this.onDispose();
216
- }
217
-
218
- /**
219
- * Lifecycle hook: called when store is disposed
220
- * Override to add custom cleanup logic
221
- */
222
- protected onDispose(): void {
223
- // Override in subclass if needed
224
- }
225
-
226
- /**
227
- * Lifecycle hook: called when store is first accessed
228
- * Override to add initialization logic (e.g., fetch initial data)
229
- */
230
- onInit(): void | Promise<void> {
231
- // Override in subclass if needed
232
- }
233
- }