@orchestr-sh/orchestr 1.6.0 → 1.7.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 (227) hide show
  1. package/README.md +289 -22
  2. package/dist/Console/Commands/EventCacheCommand.d.ts +15 -0
  3. package/dist/Console/Commands/EventCacheCommand.d.ts.map +1 -0
  4. package/dist/Console/Commands/EventCacheCommand.js +99 -0
  5. package/dist/Console/Commands/EventCacheCommand.js.map +1 -0
  6. package/dist/Console/Commands/EventClearCommand.d.ts +15 -0
  7. package/dist/Console/Commands/EventClearCommand.d.ts.map +1 -0
  8. package/dist/Console/Commands/EventClearCommand.js +71 -0
  9. package/dist/Console/Commands/EventClearCommand.js.map +1 -0
  10. package/dist/Console/Commands/EventListCommand.d.ts +19 -0
  11. package/dist/Console/Commands/EventListCommand.d.ts.map +1 -0
  12. package/dist/Console/Commands/EventListCommand.js +106 -0
  13. package/dist/Console/Commands/EventListCommand.js.map +1 -0
  14. package/dist/Console/Commands/MakeEventCommand.d.ts +27 -0
  15. package/dist/Console/Commands/MakeEventCommand.d.ts.map +1 -0
  16. package/dist/Console/Commands/MakeEventCommand.js +117 -0
  17. package/dist/Console/Commands/MakeEventCommand.js.map +1 -0
  18. package/dist/Console/Commands/MakeListenerCommand.d.ts +27 -0
  19. package/dist/Console/Commands/MakeListenerCommand.d.ts.map +1 -0
  20. package/dist/Console/Commands/MakeListenerCommand.js +157 -0
  21. package/dist/Console/Commands/MakeListenerCommand.js.map +1 -0
  22. package/dist/Console/Commands/MigrateStatusCommand.d.ts.map +1 -1
  23. package/dist/Console/Commands/MigrateStatusCommand.js.map +1 -1
  24. package/dist/Console/orchestr.js +10 -0
  25. package/dist/Console/orchestr.js.map +1 -1
  26. package/dist/Container/Container.js.map +1 -1
  27. package/dist/Contracts/Events/Dispatcher.d.ts +94 -0
  28. package/dist/Contracts/Events/Dispatcher.d.ts.map +1 -0
  29. package/dist/Contracts/Events/Dispatcher.js +9 -0
  30. package/dist/Contracts/Events/Dispatcher.js.map +1 -0
  31. package/dist/Contracts/Events/index.d.ts +7 -0
  32. package/dist/Contracts/Events/index.d.ts.map +1 -0
  33. package/dist/Contracts/Events/index.js +8 -0
  34. package/dist/Contracts/Events/index.js.map +1 -0
  35. package/dist/Database/Connection.d.ts.map +1 -1
  36. package/dist/Database/Connection.js.map +1 -1
  37. package/dist/Database/Ensemble/Concerns/HasDynamicRelations.d.ts.map +1 -1
  38. package/dist/Database/Ensemble/Concerns/HasDynamicRelations.js +43 -12
  39. package/dist/Database/Ensemble/Concerns/HasDynamicRelations.js.map +1 -1
  40. package/dist/Database/Ensemble/Concerns/HasRelationships.d.ts.map +1 -1
  41. package/dist/Database/Ensemble/Concerns/HasRelationships.js +2 -5
  42. package/dist/Database/Ensemble/Concerns/HasRelationships.js.map +1 -1
  43. package/dist/Database/Ensemble/Ensemble.d.ts +7 -0
  44. package/dist/Database/Ensemble/Ensemble.d.ts.map +1 -1
  45. package/dist/Database/Ensemble/Ensemble.js +134 -11
  46. package/dist/Database/Ensemble/Ensemble.js.map +1 -1
  47. package/dist/Database/Ensemble/EnsembleBuilder.d.ts.map +1 -1
  48. package/dist/Database/Ensemble/EnsembleBuilder.js +7 -0
  49. package/dist/Database/Ensemble/EnsembleBuilder.js.map +1 -1
  50. package/dist/Database/Ensemble/Events/ModelCreated.d.ts +11 -0
  51. package/dist/Database/Ensemble/Events/ModelCreated.d.ts.map +1 -0
  52. package/dist/Database/Ensemble/Events/ModelCreated.js +16 -0
  53. package/dist/Database/Ensemble/Events/ModelCreated.js.map +1 -0
  54. package/dist/Database/Ensemble/Events/ModelCreating.d.ts +12 -0
  55. package/dist/Database/Ensemble/Events/ModelCreating.d.ts.map +1 -0
  56. package/dist/Database/Ensemble/Events/ModelCreating.js +17 -0
  57. package/dist/Database/Ensemble/Events/ModelCreating.js.map +1 -0
  58. package/dist/Database/Ensemble/Events/ModelDeleted.d.ts +11 -0
  59. package/dist/Database/Ensemble/Events/ModelDeleted.d.ts.map +1 -0
  60. package/dist/Database/Ensemble/Events/ModelDeleted.js +16 -0
  61. package/dist/Database/Ensemble/Events/ModelDeleted.js.map +1 -0
  62. package/dist/Database/Ensemble/Events/ModelDeleting.d.ts +12 -0
  63. package/dist/Database/Ensemble/Events/ModelDeleting.d.ts.map +1 -0
  64. package/dist/Database/Ensemble/Events/ModelDeleting.js +17 -0
  65. package/dist/Database/Ensemble/Events/ModelDeleting.js.map +1 -0
  66. package/dist/Database/Ensemble/Events/ModelEvent.d.ts +17 -0
  67. package/dist/Database/Ensemble/Events/ModelEvent.d.ts.map +1 -0
  68. package/dist/Database/Ensemble/Events/ModelEvent.js +22 -0
  69. package/dist/Database/Ensemble/Events/ModelEvent.js.map +1 -0
  70. package/dist/Database/Ensemble/Events/ModelRetrieved.d.ts +11 -0
  71. package/dist/Database/Ensemble/Events/ModelRetrieved.d.ts.map +1 -0
  72. package/dist/Database/Ensemble/Events/ModelRetrieved.js +16 -0
  73. package/dist/Database/Ensemble/Events/ModelRetrieved.js.map +1 -0
  74. package/dist/Database/Ensemble/Events/ModelSaved.d.ts +11 -0
  75. package/dist/Database/Ensemble/Events/ModelSaved.d.ts.map +1 -0
  76. package/dist/Database/Ensemble/Events/ModelSaved.js +16 -0
  77. package/dist/Database/Ensemble/Events/ModelSaved.js.map +1 -0
  78. package/dist/Database/Ensemble/Events/ModelSaving.d.ts +12 -0
  79. package/dist/Database/Ensemble/Events/ModelSaving.d.ts.map +1 -0
  80. package/dist/Database/Ensemble/Events/ModelSaving.js +17 -0
  81. package/dist/Database/Ensemble/Events/ModelSaving.js.map +1 -0
  82. package/dist/Database/Ensemble/Events/ModelUpdated.d.ts +11 -0
  83. package/dist/Database/Ensemble/Events/ModelUpdated.d.ts.map +1 -0
  84. package/dist/Database/Ensemble/Events/ModelUpdated.js +16 -0
  85. package/dist/Database/Ensemble/Events/ModelUpdated.js.map +1 -0
  86. package/dist/Database/Ensemble/Events/ModelUpdating.d.ts +12 -0
  87. package/dist/Database/Ensemble/Events/ModelUpdating.d.ts.map +1 -0
  88. package/dist/Database/Ensemble/Events/ModelUpdating.js +17 -0
  89. package/dist/Database/Ensemble/Events/ModelUpdating.js.map +1 -0
  90. package/dist/Database/Ensemble/Events/index.d.ts +16 -0
  91. package/dist/Database/Ensemble/Events/index.d.ts.map +1 -0
  92. package/dist/Database/Ensemble/Events/index.js +29 -0
  93. package/dist/Database/Ensemble/Events/index.js.map +1 -0
  94. package/dist/Database/Ensemble/Relations/BelongsTo.d.ts.map +1 -1
  95. package/dist/Database/Ensemble/Relations/BelongsTo.js.map +1 -1
  96. package/dist/Database/Ensemble/Relations/BelongsToMany.d.ts.map +1 -1
  97. package/dist/Database/Ensemble/Relations/BelongsToMany.js +1 -4
  98. package/dist/Database/Ensemble/Relations/BelongsToMany.js.map +1 -1
  99. package/dist/Database/Ensemble/Relations/HasMany.d.ts.map +1 -1
  100. package/dist/Database/Ensemble/Relations/HasMany.js.map +1 -1
  101. package/dist/Database/Ensemble/Relations/HasOne.d.ts.map +1 -1
  102. package/dist/Database/Ensemble/Relations/HasOne.js.map +1 -1
  103. package/dist/Database/Ensemble/Relations/MorphMany.d.ts.map +1 -1
  104. package/dist/Database/Ensemble/Relations/MorphMany.js +2 -6
  105. package/dist/Database/Ensemble/Relations/MorphMany.js.map +1 -1
  106. package/dist/Database/Ensemble/Relations/MorphOne.d.ts.map +1 -1
  107. package/dist/Database/Ensemble/Relations/MorphOne.js +2 -6
  108. package/dist/Database/Ensemble/Relations/MorphOne.js.map +1 -1
  109. package/dist/Database/Ensemble/Relations/MorphTo.d.ts.map +1 -1
  110. package/dist/Database/Ensemble/Relations/MorphTo.js +5 -11
  111. package/dist/Database/Ensemble/Relations/MorphTo.js.map +1 -1
  112. package/dist/Database/Ensemble/Relations/MorphToMany.d.ts.map +1 -1
  113. package/dist/Database/Ensemble/Relations/MorphToMany.js +1 -3
  114. package/dist/Database/Ensemble/Relations/MorphToMany.js.map +1 -1
  115. package/dist/Database/Ensemble/Relations/MorphedByMany.d.ts.map +1 -1
  116. package/dist/Database/Ensemble/Relations/MorphedByMany.js.map +1 -1
  117. package/dist/Database/Ensemble/Relations/Relation.d.ts.map +1 -1
  118. package/dist/Database/Ensemble/Relations/Relation.js +4 -2
  119. package/dist/Database/Ensemble/Relations/Relation.js.map +1 -1
  120. package/dist/Database/Migrations/MigrationRepository.d.ts.map +1 -1
  121. package/dist/Database/Migrations/MigrationRepository.js +4 -19
  122. package/dist/Database/Migrations/MigrationRepository.js.map +1 -1
  123. package/dist/Database/Migrations/SchemaBuilder.d.ts.map +1 -1
  124. package/dist/Database/Migrations/SchemaBuilder.js +5 -15
  125. package/dist/Database/Migrations/SchemaBuilder.js.map +1 -1
  126. package/dist/Database/Query/Builder.d.ts.map +1 -1
  127. package/dist/Database/Query/Builder.js +5 -4
  128. package/dist/Database/Query/Builder.js.map +1 -1
  129. package/dist/Events/Concerns/Dispatchable.d.ts +121 -0
  130. package/dist/Events/Concerns/Dispatchable.d.ts.map +1 -0
  131. package/dist/Events/Concerns/Dispatchable.js +165 -0
  132. package/dist/Events/Concerns/Dispatchable.js.map +1 -0
  133. package/dist/Events/Contracts/Dispatcher.d.ts +144 -0
  134. package/dist/Events/Contracts/Dispatcher.d.ts.map +1 -0
  135. package/dist/Events/Contracts/Dispatcher.js +3 -0
  136. package/dist/Events/Contracts/Dispatcher.js.map +1 -0
  137. package/dist/Events/Contracts/ShouldDispatchAfterCommit.d.ts +21 -0
  138. package/dist/Events/Contracts/ShouldDispatchAfterCommit.d.ts.map +1 -0
  139. package/dist/Events/Contracts/ShouldDispatchAfterCommit.js +3 -0
  140. package/dist/Events/Contracts/ShouldDispatchAfterCommit.js.map +1 -0
  141. package/dist/Events/Decorators/HandlesEvents.d.ts +83 -0
  142. package/dist/Events/Decorators/HandlesEvents.d.ts.map +1 -0
  143. package/dist/Events/Decorators/HandlesEvents.js +105 -0
  144. package/dist/Events/Decorators/HandlesEvents.js.map +1 -0
  145. package/dist/Events/Dispatcher.d.ts +201 -0
  146. package/dist/Events/Dispatcher.d.ts.map +1 -0
  147. package/dist/Events/Dispatcher.js +359 -0
  148. package/dist/Events/Dispatcher.js.map +1 -0
  149. package/dist/Events/Event.d.ts +140 -0
  150. package/dist/Events/Event.d.ts.map +1 -0
  151. package/dist/Events/Event.js +266 -0
  152. package/dist/Events/Event.js.map +1 -0
  153. package/dist/Events/EventDiscoveryCache.d.ts +205 -0
  154. package/dist/Events/EventDiscoveryCache.d.ts.map +1 -0
  155. package/dist/Events/EventDiscoveryCache.js +310 -0
  156. package/dist/Events/EventDiscoveryCache.js.map +1 -0
  157. package/dist/Events/EventServiceProvider.d.ts +148 -0
  158. package/dist/Events/EventServiceProvider.d.ts.map +1 -0
  159. package/dist/Events/EventServiceProvider.js +258 -0
  160. package/dist/Events/EventServiceProvider.js.map +1 -0
  161. package/dist/Events/NullDispatcher.d.ts +97 -0
  162. package/dist/Events/NullDispatcher.d.ts.map +1 -0
  163. package/dist/Events/NullDispatcher.js +118 -0
  164. package/dist/Events/NullDispatcher.js.map +1 -0
  165. package/dist/Events/PendingDispatch.d.ts +119 -0
  166. package/dist/Events/PendingDispatch.d.ts.map +1 -0
  167. package/dist/Events/PendingDispatch.js +162 -0
  168. package/dist/Events/PendingDispatch.js.map +1 -0
  169. package/dist/Events/index.d.ts +12 -0
  170. package/dist/Events/index.d.ts.map +1 -0
  171. package/dist/Events/index.js +20 -0
  172. package/dist/Events/index.js.map +1 -0
  173. package/dist/Events/types.d.ts +77 -0
  174. package/dist/Events/types.d.ts.map +1 -0
  175. package/dist/Events/types.js +3 -0
  176. package/dist/Events/types.js.map +1 -0
  177. package/dist/Facades/DB.d.ts.map +1 -1
  178. package/dist/Facades/DB.js.map +1 -1
  179. package/dist/Facades/Event.d.ts +200 -0
  180. package/dist/Facades/Event.d.ts.map +1 -0
  181. package/dist/Facades/Event.js +331 -0
  182. package/dist/Facades/Event.js.map +1 -0
  183. package/dist/Facades/Route.js +1 -1
  184. package/dist/Foundation/Application.d.ts +33 -0
  185. package/dist/Foundation/Application.d.ts.map +1 -1
  186. package/dist/Foundation/Application.js +43 -3
  187. package/dist/Foundation/Application.js.map +1 -1
  188. package/dist/Foundation/Config/Config.js +1 -1
  189. package/dist/Foundation/Config/Config.js.map +1 -1
  190. package/dist/Foundation/Http/FormRequest.d.ts.map +1 -1
  191. package/dist/Foundation/Http/FormRequest.js +2 -2
  192. package/dist/Foundation/Http/FormRequest.js.map +1 -1
  193. package/dist/Foundation/Http/Kernel.d.ts.map +1 -1
  194. package/dist/Foundation/Http/Kernel.js +1 -1
  195. package/dist/Foundation/Http/Kernel.js.map +1 -1
  196. package/dist/Foundation/Http/Validator.d.ts.map +1 -1
  197. package/dist/Foundation/Http/Validator.js +27 -22
  198. package/dist/Foundation/Http/Validator.js.map +1 -1
  199. package/dist/Listeners/Contracts/ShouldQueue.d.ts +142 -0
  200. package/dist/Listeners/Contracts/ShouldQueue.d.ts.map +1 -0
  201. package/dist/Listeners/Contracts/ShouldQueue.js +20 -0
  202. package/dist/Listeners/Contracts/ShouldQueue.js.map +1 -0
  203. package/dist/Listeners/Contracts/ShouldQueueAfterCommit.d.ts +24 -0
  204. package/dist/Listeners/Contracts/ShouldQueueAfterCommit.d.ts.map +1 -0
  205. package/dist/Listeners/Contracts/ShouldQueueAfterCommit.js +3 -0
  206. package/dist/Listeners/Contracts/ShouldQueueAfterCommit.js.map +1 -0
  207. package/dist/Routing/Request.js +1 -1
  208. package/dist/Routing/Request.js.map +1 -1
  209. package/dist/Routing/Route.js +1 -1
  210. package/dist/Routing/Route.js.map +1 -1
  211. package/dist/Routing/Router.d.ts.map +1 -1
  212. package/dist/Routing/Router.js +5 -6
  213. package/dist/Routing/Router.js.map +1 -1
  214. package/dist/Support/EventDiscovery.d.ts +142 -0
  215. package/dist/Support/EventDiscovery.d.ts.map +1 -0
  216. package/dist/Support/EventDiscovery.js +302 -0
  217. package/dist/Support/EventDiscovery.js.map +1 -0
  218. package/dist/Support/Facade.js +2 -2
  219. package/dist/Support/Testing/Fakes/EventFake.d.ts +291 -0
  220. package/dist/Support/Testing/Fakes/EventFake.d.ts.map +1 -0
  221. package/dist/Support/Testing/Fakes/EventFake.js +444 -0
  222. package/dist/Support/Testing/Fakes/EventFake.js.map +1 -0
  223. package/dist/index.d.ts +10 -4
  224. package/dist/index.d.ts.map +1 -1
  225. package/dist/index.js +11 -1
  226. package/dist/index.js.map +1 -1
  227. package/package.json +33 -12
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventDiscoveryCache = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ /**
7
+ * EventDiscoveryCache
8
+ *
9
+ * Manages caching of discovered event-listener mappings to improve performance.
10
+ * Cache is stored as JSON in the storage/framework directory.
11
+ *
12
+ * This prevents the need to scan and parse TypeScript files on every application
13
+ * boot in production environments.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const cache = new EventDiscoveryCache(app)
18
+ *
19
+ * // Check if cache exists
20
+ * if (cache.exists()) {
21
+ * const listeners = cache.load()
22
+ * }
23
+ *
24
+ * // Store discovered listeners
25
+ * cache.store(discoveredListeners)
26
+ *
27
+ * // Clear cache
28
+ * cache.clear()
29
+ * ```
30
+ */
31
+ class EventDiscoveryCache {
32
+ app;
33
+ /**
34
+ * Current cache format version
35
+ */
36
+ static CACHE_VERSION = '1.0';
37
+ /**
38
+ * Default cache file path relative to storage directory
39
+ */
40
+ static CACHE_PATH = 'framework/events.json';
41
+ constructor(app) {
42
+ this.app = app;
43
+ }
44
+ /**
45
+ * Get the full path to the cache file
46
+ *
47
+ * @returns Absolute path to the events cache file
48
+ */
49
+ getCachePath() {
50
+ return this.app.storagePath(EventDiscoveryCache.CACHE_PATH);
51
+ }
52
+ /**
53
+ * Determine if the events cache file exists
54
+ *
55
+ * @returns True if cache file exists and is readable
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * if (cache.exists()) {
60
+ * // Use cached events
61
+ * } else {
62
+ * // Discover events
63
+ * }
64
+ * ```
65
+ */
66
+ exists() {
67
+ try {
68
+ return (0, fs_1.existsSync)(this.getCachePath());
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ /**
75
+ * Load cached event-listener mappings
76
+ *
77
+ * Reads the cache file and returns a Map of event names to listener paths.
78
+ * If the cache file doesn't exist or is invalid, returns an empty Map.
79
+ *
80
+ * @returns Map of event names to array of listener class paths
81
+ *
82
+ * @example
83
+ * ```typescript
84
+ * const listeners = cache.load()
85
+ * // Returns: Map {
86
+ * // 'UserRegistered' => ['Listeners/SendWelcomeEmail', 'Listeners/CreateUserProfile'],
87
+ * // 'OrderPlaced' => ['Listeners/SendOrderConfirmation']
88
+ * // }
89
+ * ```
90
+ */
91
+ load() {
92
+ if (!this.exists()) {
93
+ return new Map();
94
+ }
95
+ try {
96
+ const cachePath = this.getCachePath();
97
+ const contents = (0, fs_1.readFileSync)(cachePath, 'utf-8');
98
+ const data = JSON.parse(contents);
99
+ // Validate cache version
100
+ if (data.version !== EventDiscoveryCache.CACHE_VERSION) {
101
+ if (this.app.isDebug()) {
102
+ console.warn(`Event cache version mismatch. Expected ${EventDiscoveryCache.CACHE_VERSION}, got ${data.version}`);
103
+ }
104
+ return new Map();
105
+ }
106
+ // Convert cache format to Map
107
+ const listeners = new Map();
108
+ for (const [eventName, entry] of Object.entries(data.events)) {
109
+ listeners.set(eventName, entry.listeners);
110
+ }
111
+ return listeners;
112
+ }
113
+ catch (error) {
114
+ if (this.app.isDebug()) {
115
+ console.warn('Failed to load event cache:', error);
116
+ }
117
+ return new Map();
118
+ }
119
+ }
120
+ /**
121
+ * Store event-listener mappings in cache
122
+ *
123
+ * Writes the discovered listeners to the cache file in JSON format.
124
+ * Creates the cache directory if it doesn't exist.
125
+ *
126
+ * @param listeners Map of event names to listener class paths
127
+ * @returns True if cache was successfully written, false otherwise
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * const discovery = new EventDiscovery(app)
132
+ * const listeners = await discovery.discover([app.path('Listeners')])
133
+ * cache.store(listeners)
134
+ * ```
135
+ */
136
+ store(listeners) {
137
+ try {
138
+ const cachePath = this.getCachePath();
139
+ const cacheDir = (0, path_1.dirname)(cachePath);
140
+ // Create cache directory if it doesn't exist
141
+ if (!(0, fs_1.existsSync)(cacheDir)) {
142
+ (0, fs_1.mkdirSync)(cacheDir, { recursive: true });
143
+ }
144
+ // Build cache structure
145
+ const cache = {
146
+ version: EventDiscoveryCache.CACHE_VERSION,
147
+ generatedAt: Date.now(),
148
+ events: {}
149
+ };
150
+ const now = Date.now();
151
+ for (const [eventName, listenerList] of listeners) {
152
+ cache.events[eventName] = {
153
+ event: eventName,
154
+ listeners: listenerList,
155
+ cachedAt: now
156
+ };
157
+ }
158
+ // Write cache file with pretty formatting for readability
159
+ (0, fs_1.writeFileSync)(cachePath, JSON.stringify(cache, null, 2), 'utf-8');
160
+ return true;
161
+ }
162
+ catch (error) {
163
+ if (this.app.isDebug()) {
164
+ console.error('Failed to write event cache:', error);
165
+ }
166
+ return false;
167
+ }
168
+ }
169
+ /**
170
+ * Clear the events cache
171
+ *
172
+ * Deletes the cache file. This is typically called by the event:clear command
173
+ * or when the cache needs to be invalidated.
174
+ *
175
+ * @returns True if cache was successfully cleared or didn't exist, false on error
176
+ *
177
+ * @example
178
+ * ```typescript
179
+ * cache.clear()
180
+ * // Cache file deleted, discovery will run on next boot
181
+ * ```
182
+ */
183
+ clear() {
184
+ try {
185
+ const cachePath = this.getCachePath();
186
+ if (!(0, fs_1.existsSync)(cachePath)) {
187
+ return true; // Already cleared
188
+ }
189
+ const fs = require('fs');
190
+ fs.unlinkSync(cachePath);
191
+ return true;
192
+ }
193
+ catch (error) {
194
+ if (this.app.isDebug()) {
195
+ console.error('Failed to clear event cache:', error);
196
+ }
197
+ return false;
198
+ }
199
+ }
200
+ /**
201
+ * Get cache metadata
202
+ *
203
+ * Returns information about the cache without loading all entries.
204
+ * Useful for displaying cache status.
205
+ *
206
+ * @returns Cache metadata or null if cache doesn't exist
207
+ *
208
+ * @example
209
+ * ```typescript
210
+ * const metadata = cache.getMetadata()
211
+ * console.log(`Cache generated at: ${new Date(metadata.generatedAt)}`)
212
+ * console.log(`Total events: ${Object.keys(metadata.events).length}`)
213
+ * ```
214
+ */
215
+ getMetadata() {
216
+ if (!this.exists()) {
217
+ return null;
218
+ }
219
+ try {
220
+ const cachePath = this.getCachePath();
221
+ const contents = (0, fs_1.readFileSync)(cachePath, 'utf-8');
222
+ const data = JSON.parse(contents);
223
+ return {
224
+ version: data.version,
225
+ generatedAt: data.generatedAt,
226
+ eventCount: Object.keys(data.events).length
227
+ };
228
+ }
229
+ catch (error) {
230
+ if (this.app.isDebug()) {
231
+ console.warn('Failed to read event cache metadata:', error);
232
+ }
233
+ return null;
234
+ }
235
+ }
236
+ /**
237
+ * Check if cache is stale based on a timestamp
238
+ *
239
+ * Useful for invalidating cache based on file modification times
240
+ * or other external factors.
241
+ *
242
+ * @param threshold Timestamp in milliseconds. Cache is stale if older than this.
243
+ * @returns True if cache exists and is older than threshold
244
+ *
245
+ * @example
246
+ * ```typescript
247
+ * // Check if cache is older than 1 hour
248
+ * const oneHourAgo = Date.now() - (60 * 60 * 1000)
249
+ * if (cache.isStale(oneHourAgo)) {
250
+ * cache.clear()
251
+ * // Re-discover events
252
+ * }
253
+ * ```
254
+ */
255
+ isStale(threshold) {
256
+ const metadata = this.getMetadata();
257
+ if (!metadata) {
258
+ return true; // No cache = stale
259
+ }
260
+ return metadata.generatedAt < threshold;
261
+ }
262
+ /**
263
+ * Get statistics about the cache
264
+ *
265
+ * Returns detailed statistics about cached events and listeners.
266
+ *
267
+ * @returns Cache statistics or null if cache doesn't exist
268
+ *
269
+ * @example
270
+ * ```typescript
271
+ * const stats = cache.getStatistics()
272
+ * console.log(`Total events: ${stats.totalEvents}`)
273
+ * console.log(`Total listeners: ${stats.totalListeners}`)
274
+ * ```
275
+ */
276
+ getStatistics() {
277
+ if (!this.exists()) {
278
+ return null;
279
+ }
280
+ try {
281
+ const cachePath = this.getCachePath();
282
+ const contents = (0, fs_1.readFileSync)(cachePath, 'utf-8');
283
+ const data = JSON.parse(contents);
284
+ let totalListeners = 0;
285
+ let largestEvent = null;
286
+ for (const [eventName, entry] of Object.entries(data.events)) {
287
+ const listenerCount = entry.listeners.length;
288
+ totalListeners += listenerCount;
289
+ if (!largestEvent || listenerCount > largestEvent.listenerCount) {
290
+ largestEvent = { name: eventName, listenerCount };
291
+ }
292
+ }
293
+ const totalEvents = Object.keys(data.events).length;
294
+ return {
295
+ totalEvents,
296
+ totalListeners,
297
+ averageListenersPerEvent: totalEvents > 0 ? totalListeners / totalEvents : 0,
298
+ largestEvent
299
+ };
300
+ }
301
+ catch (error) {
302
+ if (this.app.isDebug()) {
303
+ console.warn('Failed to calculate cache statistics:', error);
304
+ }
305
+ return null;
306
+ }
307
+ }
308
+ }
309
+ exports.EventDiscoveryCache = EventDiscoveryCache;
310
+ //# sourceMappingURL=EventDiscoveryCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventDiscoveryCache.js","sourceRoot":"","sources":["../../src/Events/EventDiscoveryCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ import { ServiceProvider } from '../Foundation/ServiceProvider';
2
+ import { Dispatcher } from './Dispatcher';
3
+ /**
4
+ * Event Service Provider
5
+ *
6
+ * Provides event registration and discovery services following Laravel's
7
+ * EventServiceProvider pattern. Supports both manual registration and
8
+ * automatic listener discovery.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * export class AppEventServiceProvider extends EventServiceProvider {
13
+ * protected listen = {
14
+ * 'UserRegistered': [
15
+ * 'SendWelcomeEmail',
16
+ * 'CreateUserProfile'
17
+ * ],
18
+ * 'OrderPlaced': 'SendOrderConfirmation'
19
+ * }
20
+ *
21
+ * protected subscribe = [
22
+ * 'UserEventSubscriber'
23
+ * ]
24
+ * }
25
+ * ```
26
+ */
27
+ export declare abstract class EventServiceProvider extends ServiceProvider {
28
+ /**
29
+ * The event listener mappings for the application
30
+ *
31
+ * Maps event names to listener class names (string) or arrays of listener names.
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * protected listen = {
36
+ * 'UserRegistered': ['SendWelcomeEmail', 'LogRegistration'],
37
+ * 'OrderPlaced': 'ProcessOrder'
38
+ * }
39
+ * ```
40
+ */
41
+ protected listen: Record<string, string | string[]>;
42
+ /**
43
+ * The subscriber classes to register
44
+ *
45
+ * Subscribers provide their own event-to-listener mappings via a subscribe() method.
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * protected subscribe = [
50
+ * 'UserEventSubscriber',
51
+ * 'OrderEventSubscriber'
52
+ * ]
53
+ * ```
54
+ */
55
+ protected subscribe: string[];
56
+ /**
57
+ * Register the application's event listeners
58
+ *
59
+ * Binds the event dispatcher as a singleton in the container.
60
+ */
61
+ register(): void;
62
+ /**
63
+ * Bootstrap the application events
64
+ *
65
+ * Performs three key operations:
66
+ * 1. Registers manual event-listener mappings from the `listen` property
67
+ * 2. Registers event subscribers from the `subscribe` property
68
+ * 3. Performs automatic event discovery if enabled
69
+ *
70
+ * @throws {Error} If the dispatcher cannot be resolved from the container
71
+ */
72
+ boot(): Promise<void>;
73
+ /**
74
+ * Determine if events and listeners should be automatically discovered
75
+ *
76
+ * By default, discovery is enabled unless events are cached.
77
+ * Override this method to customize discovery behavior.
78
+ *
79
+ * @returns {boolean} True if event discovery should run
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * protected shouldDiscoverEvents(): boolean {
84
+ * // Disable discovery in production
85
+ * return this.app.environment() !== 'production'
86
+ * }
87
+ * ```
88
+ */
89
+ protected shouldDiscoverEvents(): boolean;
90
+ /**
91
+ * Discover the events and listeners for the application
92
+ *
93
+ * Uses EventDiscovery to scan specified directories for listener classes
94
+ * and automatically registers them with their corresponding events.
95
+ *
96
+ * @param {Dispatcher} events - The event dispatcher instance
97
+ *
98
+ * @throws {Error} If EventDiscovery is not available (Task 6 dependency)
99
+ */
100
+ protected discoverEvents(events: Dispatcher): Promise<void>;
101
+ /**
102
+ * Get the directories to discover events within
103
+ *
104
+ * By default, uses the paths configured via Application.withEvents()
105
+ * or falls back to the standard 'Listeners' directory.
106
+ *
107
+ * Override this method to customize discovery paths.
108
+ *
109
+ * @returns {string[]} Array of absolute directory paths to scan
110
+ *
111
+ * @example
112
+ * ```typescript
113
+ * protected discoverEventsWithin(): string[] {
114
+ * return [
115
+ * this.app.path('Listeners'),
116
+ * this.app.path('Domain/Listeners')
117
+ * ]
118
+ * }
119
+ * ```
120
+ */
121
+ protected discoverEventsWithin(): string[];
122
+ /**
123
+ * Determine if events are cached
124
+ *
125
+ * Checks for the existence of the cached events file.
126
+ *
127
+ * @returns {boolean} True if cached events file exists
128
+ */
129
+ protected eventsAreCached(): boolean;
130
+ /**
131
+ * Get the events and handlers from the cached file
132
+ *
133
+ * Loads and parses the cached events JSON file.
134
+ *
135
+ * @returns {Map<string, string[]>} Map of event names to listener class names
136
+ */
137
+ protected getCachedEvents(): Map<string, string[]>;
138
+ /**
139
+ * Get all registered event-listener mappings
140
+ *
141
+ * Returns the complete mapping of events to listeners for inspection.
142
+ * Useful for debugging and console commands.
143
+ *
144
+ * @returns {Record<string, string | string[]>} The listen property mappings
145
+ */
146
+ listens(): Record<string, string | string[]>;
147
+ }
148
+ //# sourceMappingURL=EventServiceProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventServiceProvider.d.ts","sourceRoot":"","sources":["../../src/Events/EventServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,8BAAsB,oBAAqB,SAAQ,eAAe;IAChE;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAM;IAEzD;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAM;IAEnC;;;;OAIG;IACH,QAAQ,IAAI,IAAI;IAShB;;;;;;;;;OASG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,oBAAoB,IAAI,OAAO;IAKzC;;;;;;;;;OASG;cACa,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBjE;;;;;;;;;;;;;;;;;;;OAmBG;IACH,SAAS,CAAC,oBAAoB,IAAI,MAAM,EAAE;IAI1C;;;;;;OAMG;IACH,SAAS,CAAC,eAAe,IAAI,OAAO;IAUpC;;;;;;OAMG;IACH,SAAS,CAAC,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAgBlD;;;;;;;OAOG;IACH,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAG7C"}